n1kt4r bae171d6b4 P3-P5: SubAgent SDK, Telegram Channel, SQLite persistence, full pipeline
P3 - SubAgent SDK:
  - src/subagent.ts: researcher, coder, analyst, content-writer
  - Mind.runSubAgent() → SubAgentFactory.create() → execute()
  - Результаты сохраняются в long-term memory
  - Heartbeat.notify(subagent-complete) после завершения

P4 - SQLite persistence (5 таблиц, WAL):
  - src/database.ts: thoughts, notepads, self_observations, long_term, embeddings
  - memory.ts → Database (полная замена in-memory)
  - index.ts: dbPath → ~/.local/share/spark-mind/spark-mind.db

P5 - Telegram Channel Layer:
  - src/telegram.ts: https module (SNI fix), MAX Messenger API
  - mind.ts: sendReply() → Telegram + console fallback
  - index.ts: TelegramMessenger(config) → Mind

Fixes:
  - FK constraint: long_term INSERT → long_term_embeddings INSERT
  - JSON parse: nested objects, markdown fences
  - P5 telegram: graceful degradation on SSL error
2026-09-15 12:49:33 +05:00

spark-mind

Self-hosted автономный агент (MVP). Концепт позаимствован из Animus (Craigtut): heartbeat, 4 слоя памяти, persona в 8 слоёв. Движок — Ornith-1.5-9B (локально, self-hosted, Ollama).

Почему Ornith-1.5-9B

  • Локальный inference (Ollama), никаких облачных ключей
  • Нативная поддержка tool-calling (саб-агенты) + thinking
  • 262K контекст (для heartbeat держим 4K-16K + внешняя память)
  • ~40-60 t/s на Q6_K

⚠️ Spark X2.5-4B не грузится в Ollama (unknown architecture 'spark2_5'). Ornith-9B — рабочая замена: thinking + tools, дефицитный ресурс.

Архитектура

heartbeat.ts  — ядро: 5 триггеров тика, состояния Cold/Warm
memory.ts     — 4 слоя памяти (short/working/core self/long-term) + SQLite
persona.ts    — 8 слоёв → системный промпт
mind.ts       — оркестратор: heartbeat + memory + persona + LLM
subagent.ts   — SubAgent SDK: researcher, coder, analyst, content-writer
embedding.ts  — bge-m3 embeddings (dim=1024), cosine similarity
database.ts   — SQLite репозиторий: 5 таблиц, WAL-режим
telegram.ts   — Telegram Channel Layer: MAX Messenger API

Heartbeat (5 триггеров)

  1. Interval — idle-мысли по таймеру (default 5 мин)
  2. Message — сообщение от known-контакта
  3. Task — scheduled-задача (cron)
  4. SubAgent-Complete — завершение саб-агента
  5. Plugin — внешний триггер (HomeKit, сенсор и т.д.)

Таймер сбрасывается после любого тика. Warmth-окно 15 мин — сессия переиспользуется, иначе cold-start.

Memory (4 слоя)

Слой Хранение Что держит
short-term SQLite (thoughts) последние ~10 мыслей/опыт/сообщений
working SQLite (notepads) notepad по контактам
core self SQLite (self_observations) самосознательность
long-term SQLite (long_term + embeddings) факты/опыт/процедуры + bge-m3 векторы

Sub-Agents

Поддерживаемые агенты:

  • researcher — сбор и анализ информации (web_search, file_read, web_extract)
  • coder — написание и ревью кода (file_write, terminal, code_review)
  • analyst — анализ данных и ситуаций (data_query, spreadsheet, chart_generator)
  • content-writer — создание веб-контента (template_search, seo_check, grammar_check)

Запуск

npm install
npm run build   # tsc -p tsconfig.json (проверка типов)
npm start       # node dist/index.js

Ornith-1.5-9B должен быть доступен по OpenAI-совместимому API (Ollama):

  • Ollama: http://localhost:11434 (модель ornith-1.5-9b:latest)

Настройка Telegram

Для отправки ответов в Telegram добавьте в index.ts:

import { TelegramMessenger } from './src/telegram.js';

const telegram = new TelegramMessenger({
  botUrl: 'https://bot.qw4.ru/bot/nik_bot',
  userId: '140245519',
});

⚠️ Примечание: если bot.qw4.ru недоступен (SSL-ошибка 'unrecognized name'), агент работает в console-only режиме.

Статус P0–P5

Priority Компонент Статус
P0 heartbeat → mind wiring ✅
P1 structured JSON output (parseSparkOutput) ✅
P2 bge-m3 embeddings + cosine search ✅
P3 SubAgent SDK (researcher, coder, analyst, content-writer) ✅
P4 SQLite persistence (5 таблиц, WAL) ✅
P5 Telegram Channel Layer (MAX API + fallback) ✅

Roadmap (P6+)

  • Sleep & energy (циркадный ритм)
  • Web UI (persona setup)
  • Sleep & energy (циркадный ритм)
  • Web UI (persona setup)

License

MIT — концепт вдохновлён Animus (MIT, Craig Tuttle).

S
Description
Self-hosted autonomous agent (heartbeat + memory + persona) on Spark X2.5-4B
Readme
117 KiB
0 Stars 1 Watchers 0 Forks
Languages
TypeScript 100%