sensorium-mcp 3.0.103 → 3.1.0-refactor.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/config/agent-settings.d.ts +69 -0
- package/dist/config/agent-settings.d.ts.map +1 -0
- package/dist/config/agent-settings.js +225 -0
- package/dist/config/agent-settings.js.map +1 -0
- package/dist/config/agent-templates.d.ts +39 -0
- package/dist/config/agent-templates.d.ts.map +1 -0
- package/dist/config/agent-templates.js +105 -0
- package/dist/config/agent-templates.js.map +1 -0
- package/dist/config/index.d.ts +16 -0
- package/dist/config/index.d.ts.map +1 -0
- package/dist/config/index.js +58 -0
- package/dist/config/index.js.map +1 -0
- package/dist/config/keep-alive-settings.d.ts +29 -0
- package/dist/config/keep-alive-settings.d.ts.map +1 -0
- package/dist/config/keep-alive-settings.js +100 -0
- package/dist/config/keep-alive-settings.js.map +1 -0
- package/dist/config/mcp-settings.d.ts +59 -0
- package/dist/config/mcp-settings.d.ts.map +1 -0
- package/dist/config/mcp-settings.js +196 -0
- package/dist/config/mcp-settings.js.map +1 -0
- package/dist/config/misc-settings.d.ts +46 -0
- package/dist/config/misc-settings.d.ts.map +1 -0
- package/dist/config/misc-settings.js +146 -0
- package/dist/config/misc-settings.js.map +1 -0
- package/dist/config/settings-store.d.ts +10 -0
- package/dist/config/settings-store.d.ts.map +1 -0
- package/dist/config/settings-store.js +65 -0
- package/dist/config/settings-store.js.map +1 -0
- package/dist/dashboard/log-parser.d.ts.map +1 -1
- package/dist/dashboard/log-parser.js +12 -2
- package/dist/dashboard/log-parser.js.map +1 -1
- package/dist/dashboard/presets.d.ts +1 -1
- package/dist/dashboard/presets.d.ts.map +1 -1
- package/dist/dashboard/presets.js +1 -1
- package/dist/dashboard/presets.js.map +1 -1
- package/dist/dashboard/routes/agent-templates.d.ts.map +1 -1
- package/dist/dashboard/routes/agent-templates.js +13 -8
- package/dist/dashboard/routes/agent-templates.js.map +1 -1
- package/dist/dashboard/routes/claude.d.ts.map +1 -1
- package/dist/dashboard/routes/claude.js +6 -3
- package/dist/dashboard/routes/claude.js.map +1 -1
- package/dist/dashboard/routes/copilot.d.ts.map +1 -1
- package/dist/dashboard/routes/copilot.js +16 -7
- package/dist/dashboard/routes/copilot.js.map +1 -1
- package/dist/dashboard/routes/data.d.ts.map +1 -1
- package/dist/dashboard/routes/data.js +43 -15
- package/dist/dashboard/routes/data.js.map +1 -1
- package/dist/dashboard/routes/env-vars.d.ts.map +1 -1
- package/dist/dashboard/routes/env-vars.js.map +1 -1
- package/dist/dashboard/routes/mcp-servers.d.ts.map +1 -1
- package/dist/dashboard/routes/mcp-servers.js +11 -5
- package/dist/dashboard/routes/mcp-servers.js.map +1 -1
- package/dist/dashboard/routes/prompts.d.ts.map +1 -1
- package/dist/dashboard/routes/prompts.js +2 -2
- package/dist/dashboard/routes/prompts.js.map +1 -1
- package/dist/dashboard/routes/settings.d.ts.map +1 -1
- package/dist/dashboard/routes/settings.js +5 -3
- package/dist/dashboard/routes/settings.js.map +1 -1
- package/dist/dashboard/routes/skills.d.ts.map +1 -1
- package/dist/dashboard/routes/skills.js +4 -4
- package/dist/dashboard/routes/skills.js.map +1 -1
- package/dist/dashboard/routes/snapshots.d.ts.map +1 -1
- package/dist/dashboard/routes/snapshots.js +18 -11
- package/dist/dashboard/routes/snapshots.js.map +1 -1
- package/dist/dashboard/routes/templates.d.ts.map +1 -1
- package/dist/dashboard/routes/templates.js +6 -3
- package/dist/dashboard/routes/templates.js.map +1 -1
- package/dist/dashboard/routes/threads-create.d.ts +22 -0
- package/dist/dashboard/routes/threads-create.d.ts.map +1 -0
- package/dist/dashboard/routes/threads-create.js +225 -0
- package/dist/dashboard/routes/threads-create.js.map +1 -0
- package/dist/dashboard/routes/threads-helpers.d.ts +28 -0
- package/dist/dashboard/routes/threads-helpers.d.ts.map +1 -0
- package/dist/dashboard/routes/threads-helpers.js +138 -0
- package/dist/dashboard/routes/threads-helpers.js.map +1 -0
- package/dist/dashboard/routes/threads-read.d.ts +26 -0
- package/dist/dashboard/routes/threads-read.d.ts.map +1 -0
- package/dist/dashboard/routes/threads-read.js +118 -0
- package/dist/dashboard/routes/threads-read.js.map +1 -0
- package/dist/dashboard/routes/threads.d.ts +5 -44
- package/dist/dashboard/routes/threads.d.ts.map +1 -1
- package/dist/dashboard/routes/threads.js +40 -496
- package/dist/dashboard/routes/threads.js.map +1 -1
- package/dist/dashboard/routes/types.d.ts.map +1 -1
- package/dist/dashboard/routes/types.js.map +1 -1
- package/dist/dashboard/routes.d.ts.map +1 -1
- package/dist/dashboard/routes.js +9 -5
- package/dist/dashboard/routes.js.map +1 -1
- package/dist/data/daily-marker.d.ts.map +1 -1
- package/dist/data/daily-marker.js +1 -1
- package/dist/data/daily-marker.js.map +1 -1
- package/dist/data/file-storage.d.ts.map +1 -1
- package/dist/data/file-storage.js +40 -16
- package/dist/data/file-storage.js.map +1 -1
- package/dist/data/interfaces.d.ts +23 -2
- package/dist/data/interfaces.d.ts.map +1 -1
- package/dist/data/memory/bootstrap.d.ts +1 -1
- package/dist/data/memory/bootstrap.d.ts.map +1 -1
- package/dist/data/memory/bootstrap.js +32 -13
- package/dist/data/memory/bootstrap.js.map +1 -1
- package/dist/data/memory/consolidation.d.ts.map +1 -1
- package/dist/data/memory/consolidation.js +17 -8
- package/dist/data/memory/consolidation.js.map +1 -1
- package/dist/data/memory/db-types.d.ts +4 -0
- package/dist/data/memory/db-types.d.ts.map +1 -0
- package/dist/data/memory/db-types.js +2 -0
- package/dist/data/memory/db-types.js.map +1 -0
- package/dist/data/memory/episodes.d.ts.map +1 -1
- package/dist/data/memory/episodes.js +3 -5
- package/dist/data/memory/episodes.js.map +1 -1
- package/dist/data/memory/index.d.ts +28 -14
- package/dist/data/memory/index.d.ts.map +1 -1
- package/dist/data/memory/index.js +28 -14
- package/dist/data/memory/index.js.map +1 -1
- package/dist/data/memory/migration-runner.d.ts +1 -1
- package/dist/data/memory/migration-runner.d.ts.map +1 -1
- package/dist/data/memory/migration-runner.js +23 -15
- package/dist/data/memory/migration-runner.js.map +1 -1
- package/dist/data/memory/narrative-lint.d.ts +12 -0
- package/dist/data/memory/narrative-lint.d.ts.map +1 -0
- package/dist/data/memory/narrative-lint.js +117 -0
- package/dist/data/memory/narrative-lint.js.map +1 -0
- package/dist/data/memory/narrative-resolutions.d.ts +26 -0
- package/dist/data/memory/narrative-resolutions.d.ts.map +1 -0
- package/dist/data/memory/narrative-resolutions.js +81 -0
- package/dist/data/memory/narrative-resolutions.js.map +1 -0
- package/dist/data/memory/narrative-sources.d.ts +19 -0
- package/dist/data/memory/narrative-sources.d.ts.map +1 -0
- package/dist/data/memory/narrative-sources.js +150 -0
- package/dist/data/memory/narrative-sources.js.map +1 -0
- package/dist/data/memory/narrative-store.d.ts +11 -0
- package/dist/data/memory/narrative-store.d.ts.map +1 -0
- package/dist/data/memory/narrative-store.js +80 -0
- package/dist/data/memory/narrative-store.js.map +1 -0
- package/dist/data/memory/narrative-types.d.ts +15 -0
- package/dist/data/memory/narrative-types.d.ts.map +1 -0
- package/dist/data/memory/narrative-types.js +3 -0
- package/dist/data/memory/narrative-types.js.map +1 -0
- package/dist/data/memory/narrative.d.ts +5 -2
- package/dist/data/memory/narrative.d.ts.map +1 -1
- package/dist/data/memory/narrative.js +31 -521
- package/dist/data/memory/narrative.js.map +1 -1
- package/dist/data/memory/note-archival.d.ts +17 -0
- package/dist/data/memory/note-archival.d.ts.map +1 -0
- package/dist/data/memory/note-archival.js +48 -0
- package/dist/data/memory/note-archival.js.map +1 -0
- package/dist/data/memory/note-embeddings.d.ts +27 -0
- package/dist/data/memory/note-embeddings.d.ts.map +1 -0
- package/dist/data/memory/note-embeddings.js +98 -0
- package/dist/data/memory/note-embeddings.js.map +1 -0
- package/dist/data/memory/reflection-dedup.d.ts +17 -0
- package/dist/data/memory/reflection-dedup.d.ts.map +1 -0
- package/dist/data/memory/reflection-dedup.js +55 -0
- package/dist/data/memory/reflection-dedup.js.map +1 -0
- package/dist/data/memory/reflection-gates.d.ts +40 -0
- package/dist/data/memory/reflection-gates.d.ts.map +1 -0
- package/dist/data/memory/reflection-gates.js +220 -0
- package/dist/data/memory/reflection-gates.js.map +1 -0
- package/dist/data/memory/reflection-sources.d.ts +13 -0
- package/dist/data/memory/reflection-sources.d.ts.map +1 -0
- package/dist/data/memory/reflection-sources.js +115 -0
- package/dist/data/memory/reflection-sources.js.map +1 -0
- package/dist/data/memory/reflection.d.ts +5 -35
- package/dist/data/memory/reflection.d.ts.map +1 -1
- package/dist/data/memory/reflection.js +25 -329
- package/dist/data/memory/reflection.js.map +1 -1
- package/dist/data/memory/schema-ddl.d.ts +1 -1
- package/dist/data/memory/schema-ddl.d.ts.map +1 -1
- package/dist/data/memory/schema-ddl.js +5 -3
- package/dist/data/memory/schema-ddl.js.map +1 -1
- package/dist/data/memory/schema-guard.d.ts +1 -1
- package/dist/data/memory/schema-guard.d.ts.map +1 -1
- package/dist/data/memory/schema-guard.js +5 -4
- package/dist/data/memory/schema-guard.js.map +1 -1
- package/dist/data/memory/schema.d.ts +2 -2
- package/dist/data/memory/schema.d.ts.map +1 -1
- package/dist/data/memory/schema.js +4 -2
- package/dist/data/memory/schema.js.map +1 -1
- package/dist/data/memory/{semantic.d.ts → semantic-notes.d.ts} +6 -72
- package/dist/data/memory/semantic-notes.d.ts.map +1 -0
- package/dist/data/memory/semantic-notes.js +249 -0
- package/dist/data/memory/semantic-notes.js.map +1 -0
- package/dist/data/memory/semantic-search.d.ts +29 -0
- package/dist/data/memory/semantic-search.d.ts.map +1 -0
- package/dist/data/memory/semantic-search.js +156 -0
- package/dist/data/memory/semantic-search.js.map +1 -0
- package/dist/data/memory/synthesis.d.ts.map +1 -1
- package/dist/data/memory/synthesis.js +15 -7
- package/dist/data/memory/synthesis.js.map +1 -1
- package/dist/data/memory/thread-registry.d.ts +2 -2
- package/dist/data/memory/thread-registry.d.ts.map +1 -1
- package/dist/data/memory/thread-registry.js +74 -36
- package/dist/data/memory/thread-registry.js.map +1 -1
- package/dist/data/memory/topic-index.d.ts +20 -0
- package/dist/data/memory/topic-index.d.ts.map +1 -0
- package/dist/data/memory/topic-index.js +91 -0
- package/dist/data/memory/topic-index.js.map +1 -0
- package/dist/data/memory/topic-shift.js +1 -1
- package/dist/data/memory/topic-shift.js.map +1 -1
- package/dist/data/memory/utils.d.ts +0 -5
- package/dist/data/memory/utils.d.ts.map +1 -1
- package/dist/data/memory/utils.js +0 -94
- package/dist/data/memory/utils.js.map +1 -1
- package/dist/data/sent-message.repository.js +2 -2
- package/dist/data/sent-message.repository.js.map +1 -1
- package/dist/data/templates.js +2 -2
- package/dist/data/templates.js.map +1 -1
- package/dist/index.js +21 -19
- package/dist/index.js.map +1 -1
- package/dist/integrations/openai/chat.d.ts.map +1 -1
- package/dist/integrations/openai/chat.js +5 -5
- package/dist/integrations/openai/chat.js.map +1 -1
- package/dist/integrations/openai/speech.d.ts +1 -1
- package/dist/integrations/openai/speech.d.ts.map +1 -1
- package/dist/integrations/openai/speech.js +1 -3
- package/dist/integrations/openai/speech.js.map +1 -1
- package/dist/integrations/openai/video.d.ts.map +1 -1
- package/dist/integrations/openai/video.js +21 -10
- package/dist/integrations/openai/video.js.map +1 -1
- package/dist/integrations/openai/vision.d.ts.map +1 -1
- package/dist/integrations/openai/vision.js.map +1 -1
- package/dist/integrations/openai/voice-emotion.d.ts.map +1 -1
- package/dist/integrations/openai/voice-emotion.js +2 -2
- package/dist/integrations/openai/voice-emotion.js.map +1 -1
- package/dist/lib/logger.d.ts.map +1 -0
- package/dist/{logger.js → lib/logger.js} +77 -50
- package/dist/lib/logger.js.map +1 -0
- package/dist/lib/markdown.d.ts.map +1 -0
- package/dist/{markdown.js → lib/markdown.js} +13 -5
- package/dist/lib/markdown.js.map +1 -0
- package/dist/{types.d.ts → lib/types.d.ts} +0 -1
- package/dist/lib/types.d.ts.map +1 -0
- package/dist/lib/types.js.map +1 -0
- package/dist/lib/utils.d.ts.map +1 -0
- package/dist/{utils.js → lib/utils.js} +29 -9
- package/dist/lib/utils.js.map +1 -0
- package/dist/llm/json.d.ts +14 -0
- package/dist/llm/json.d.ts.map +1 -0
- package/dist/llm/json.js +112 -0
- package/dist/llm/json.js.map +1 -0
- package/dist/llm/prompts/narrative.d.ts +7 -0
- package/dist/llm/prompts/narrative.d.ts.map +1 -0
- package/dist/llm/prompts/narrative.js +124 -0
- package/dist/llm/prompts/narrative.js.map +1 -0
- package/dist/llm/prompts/reflection.d.ts +6 -0
- package/dist/llm/prompts/reflection.d.ts.map +1 -0
- package/dist/llm/prompts/reflection.js +77 -0
- package/dist/llm/prompts/reflection.js.map +1 -0
- package/dist/server/factory.d.ts +2 -2
- package/dist/server/factory.d.ts.map +1 -1
- package/dist/server/factory.js +152 -73
- package/dist/server/factory.js.map +1 -1
- package/dist/{http-server.d.ts → server/http-server.d.ts} +2 -2
- package/dist/server/http-server.d.ts.map +1 -0
- package/dist/{http-server.js → server/http-server.js} +38 -17
- package/dist/server/http-server.js.map +1 -0
- package/dist/{stdio-server.d.ts → server/stdio-server.d.ts} +1 -1
- package/dist/server/stdio-server.d.ts.map +1 -0
- package/dist/{stdio-server.js → server/stdio-server.js} +25 -11
- package/dist/server/stdio-server.js.map +1 -0
- package/dist/services/agent-spawn.service.d.ts +1 -1
- package/dist/services/agent-spawn.service.d.ts.map +1 -1
- package/dist/services/agent-spawn.service.js +17 -7
- package/dist/services/agent-spawn.service.js.map +1 -1
- package/dist/services/background-runner.d.ts +2 -2
- package/dist/services/background-runner.d.ts.map +1 -1
- package/dist/services/background-runner.js +8 -3
- package/dist/services/background-runner.js.map +1 -1
- package/dist/services/claude-spawn.service.d.ts.map +1 -1
- package/dist/services/claude-spawn.service.js +61 -52
- package/dist/services/claude-spawn.service.js.map +1 -1
- package/dist/services/codex-spawn.service.d.ts.map +1 -1
- package/dist/services/codex-spawn.service.js +52 -40
- package/dist/services/codex-spawn.service.js.map +1 -1
- package/dist/services/consolidation-prompts.d.ts +26 -0
- package/dist/services/consolidation-prompts.d.ts.map +1 -0
- package/dist/services/consolidation-prompts.js +144 -0
- package/dist/services/consolidation-prompts.js.map +1 -0
- package/dist/services/consolidation.service.d.ts +1 -5
- package/dist/services/consolidation.service.d.ts.map +1 -1
- package/dist/services/consolidation.service.js +53 -322
- package/dist/services/consolidation.service.js.map +1 -1
- package/dist/services/copilot-spawn.service.d.ts.map +1 -1
- package/dist/services/copilot-spawn.service.js +47 -57
- package/dist/services/copilot-spawn.service.js.map +1 -1
- package/dist/{daily-session.d.ts → services/daily-session.d.ts} +1 -1
- package/dist/services/daily-session.d.ts.map +1 -0
- package/dist/{daily-session.js → services/daily-session.js} +15 -14
- package/dist/services/daily-session.js.map +1 -0
- package/dist/services/dispatcher/broker.d.ts +0 -6
- package/dist/services/dispatcher/broker.d.ts.map +1 -1
- package/dist/services/dispatcher/broker.js +46 -38
- package/dist/services/dispatcher/broker.js.map +1 -1
- package/dist/services/dispatcher/index.d.ts +1 -1
- package/dist/services/dispatcher/index.d.ts.map +1 -1
- package/dist/services/dispatcher/index.js +1 -1
- package/dist/services/dispatcher/index.js.map +1 -1
- package/dist/services/dispatcher/lock.d.ts.map +1 -1
- package/dist/services/dispatcher/lock.js +24 -9
- package/dist/services/dispatcher/lock.js.map +1 -1
- package/dist/services/dispatcher/poller.d.ts +1 -1
- package/dist/services/dispatcher/poller.d.ts.map +1 -1
- package/dist/services/dispatcher/poller.js +74 -49
- package/dist/services/dispatcher/poller.js.map +1 -1
- package/dist/services/drive.d.ts.map +1 -0
- package/dist/{drive.js → services/drive.js} +1 -1
- package/dist/services/drive.js.map +1 -0
- package/dist/services/intent.d.ts.map +1 -0
- package/dist/{intent.js → services/intent.js} +78 -23
- package/dist/services/intent.js.map +1 -0
- package/dist/services/keep-alive-sync.service.d.ts +11 -0
- package/dist/services/keep-alive-sync.service.d.ts.map +1 -0
- package/dist/services/keep-alive-sync.service.js +47 -0
- package/dist/services/keep-alive-sync.service.js.map +1 -0
- package/dist/services/keeper.service.d.ts +1 -1
- package/dist/services/keeper.service.d.ts.map +1 -1
- package/dist/services/keeper.service.js +31 -18
- package/dist/services/keeper.service.js.map +1 -1
- package/dist/services/maintenance-signal.js +1 -1
- package/dist/services/maintenance-signal.js.map +1 -1
- package/dist/services/mcp-config.service.d.ts.map +1 -1
- package/dist/services/mcp-config.service.js +19 -6
- package/dist/services/mcp-config.service.js.map +1 -1
- package/dist/services/memory-briefing.service.d.ts.map +1 -1
- package/dist/services/memory-briefing.service.js +13 -7
- package/dist/services/memory-briefing.service.js.map +1 -1
- package/dist/services/memory-pruning.service.d.ts +12 -0
- package/dist/services/memory-pruning.service.d.ts.map +1 -0
- package/dist/services/memory-pruning.service.js +177 -0
- package/dist/services/memory-pruning.service.js.map +1 -0
- package/dist/services/process.service.d.ts +7 -2
- package/dist/services/process.service.d.ts.map +1 -1
- package/dist/services/process.service.js +233 -103
- package/dist/services/process.service.js.map +1 -1
- package/dist/services/reconnect-snapshot.service.d.ts.map +1 -1
- package/dist/services/reconnect-snapshot.service.js +3 -3
- package/dist/services/reconnect-snapshot.service.js.map +1 -1
- package/dist/{scheduler.d.ts → services/scheduler.d.ts} +1 -23
- package/dist/services/scheduler.d.ts.map +1 -0
- package/dist/{scheduler.js → services/scheduler.js} +6 -8
- package/dist/services/scheduler.js.map +1 -0
- package/dist/services/self-update.service.d.ts +15 -5
- package/dist/services/self-update.service.d.ts.map +1 -1
- package/dist/services/self-update.service.js +85 -41
- package/dist/services/self-update.service.js.map +1 -1
- package/dist/services/spawn-common.d.ts +40 -16
- package/dist/services/spawn-common.d.ts.map +1 -1
- package/dist/services/spawn-common.js +163 -36
- package/dist/services/spawn-common.js.map +1 -1
- package/dist/{telegram.d.ts → services/telegram.d.ts} +3 -3
- package/dist/services/telegram.d.ts.map +1 -0
- package/dist/{telegram.js → services/telegram.js} +16 -8
- package/dist/services/telegram.js.map +1 -0
- package/dist/services/thread-config.service.d.ts +25 -0
- package/dist/services/thread-config.service.d.ts.map +1 -0
- package/dist/services/thread-config.service.js +73 -0
- package/dist/services/thread-config.service.js.map +1 -0
- package/dist/services/thread-health.service.d.ts.map +1 -1
- package/dist/services/thread-health.service.js +23 -9
- package/dist/services/thread-health.service.js.map +1 -1
- package/dist/services/thread-lifecycle.service.d.ts.map +1 -1
- package/dist/services/thread-lifecycle.service.js +21 -7
- package/dist/services/thread-lifecycle.service.js.map +1 -1
- package/dist/services/topic.service.d.ts.map +1 -1
- package/dist/services/topic.service.js +17 -6
- package/dist/services/topic.service.js.map +1 -1
- package/dist/services/worker-cleanup.service.d.ts +3 -2
- package/dist/services/worker-cleanup.service.d.ts.map +1 -1
- package/dist/services/worker-cleanup.service.js +31 -19
- package/dist/services/worker-cleanup.service.js.map +1 -1
- package/dist/sessions/dashboard-registry.d.ts +38 -0
- package/dist/sessions/dashboard-registry.d.ts.map +1 -0
- package/dist/sessions/dashboard-registry.js +84 -0
- package/dist/sessions/dashboard-registry.js.map +1 -0
- package/dist/{sessions.d.ts → sessions/mcp-registry.d.ts} +3 -60
- package/dist/sessions/mcp-registry.d.ts.map +1 -0
- package/dist/{sessions.js → sessions/mcp-registry.js} +5 -214
- package/dist/sessions/mcp-registry.js.map +1 -0
- package/dist/sessions/session-store.d.ts +17 -0
- package/dist/sessions/session-store.d.ts.map +1 -0
- package/dist/sessions/session-store.js +69 -0
- package/dist/sessions/session-store.js.map +1 -0
- package/dist/sessions/topic-registry.d.ts +14 -0
- package/dist/sessions/topic-registry.d.ts.map +1 -0
- package/dist/sessions/topic-registry.js +67 -0
- package/dist/sessions/topic-registry.js.map +1 -0
- package/dist/tools/definitions.d.ts +1 -9
- package/dist/tools/definitions.d.ts.map +1 -1
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/defs/memory-defs.d.ts +1 -1
- package/dist/tools/defs/memory-defs.d.ts.map +1 -1
- package/dist/tools/defs/memory-defs.js +1 -1
- package/dist/tools/defs/memory-defs.js.map +1 -1
- package/dist/tools/defs/session-defs.d.ts +1 -1
- package/dist/tools/defs/session-defs.d.ts.map +1 -1
- package/dist/tools/defs/session-defs.js +3 -14
- package/dist/tools/defs/session-defs.js.map +1 -1
- package/dist/tools/defs/skill-defs.d.ts +1 -1
- package/dist/tools/defs/skill-defs.d.ts.map +1 -1
- package/dist/tools/defs/types.d.ts +11 -0
- package/dist/tools/defs/types.d.ts.map +1 -0
- package/dist/{chat-ui/src → tools/defs}/types.js.map +1 -1
- package/dist/tools/defs/utility-defs.d.ts +1 -1
- package/dist/tools/defs/utility-defs.d.ts.map +1 -1
- package/dist/tools/defs/utility-defs.js.map +1 -1
- package/dist/tools/defs/wait-defs.d.ts +1 -1
- package/dist/tools/defs/wait-defs.d.ts.map +1 -1
- package/dist/tools/delegate-tool.d.ts +2 -2
- package/dist/tools/delegate-tool.d.ts.map +1 -1
- package/dist/tools/delegate-tool.js +57 -37
- package/dist/tools/delegate-tool.js.map +1 -1
- package/dist/tools/memory-tools.d.ts +2 -2
- package/dist/tools/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory-tools.js +108 -37
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/{response-builders.d.ts → tools/response-builders.d.ts} +2 -2
- package/dist/tools/response-builders.d.ts.map +1 -0
- package/dist/{response-builders.js → tools/response-builders.js} +151 -30
- package/dist/tools/response-builders.js.map +1 -0
- package/dist/tools/session-tools.d.ts +5 -14
- package/dist/tools/session-tools.d.ts.map +1 -1
- package/dist/tools/session-tools.js +17 -12
- package/dist/tools/session-tools.js.map +1 -1
- package/dist/tools/shared-agent-utils.d.ts +1 -1
- package/dist/tools/shared-agent-utils.d.ts.map +1 -1
- package/dist/tools/shared-agent-utils.js +2 -4
- package/dist/tools/shared-agent-utils.js.map +1 -1
- package/dist/tools/skill-tools.d.ts +1 -1
- package/dist/tools/skill-tools.d.ts.map +1 -1
- package/dist/tools/skill-tools.js +12 -7
- package/dist/tools/skill-tools.js.map +1 -1
- package/dist/tools/start-session-tool.d.ts +3 -3
- package/dist/tools/start-session-tool.d.ts.map +1 -1
- package/dist/tools/start-session-tool.js +35 -25
- package/dist/tools/start-session-tool.js.map +1 -1
- package/dist/tools/utility-tools.d.ts +3 -3
- package/dist/tools/utility-tools.d.ts.map +1 -1
- package/dist/tools/utility-tools.js +46 -28
- package/dist/tools/utility-tools.js.map +1 -1
- package/dist/tools/wait/auto-forward.d.ts +1 -1
- package/dist/tools/wait/auto-forward.d.ts.map +1 -1
- package/dist/tools/wait/auto-forward.js +6 -4
- package/dist/tools/wait/auto-forward.js.map +1 -1
- package/dist/tools/wait/context.d.ts +45 -0
- package/dist/tools/wait/context.d.ts.map +1 -0
- package/dist/tools/wait/context.js +5 -0
- package/dist/tools/wait/context.js.map +1 -0
- package/dist/tools/wait/drive-handler.d.ts +2 -2
- package/dist/tools/wait/drive-handler.d.ts.map +1 -1
- package/dist/tools/wait/drive-handler.js +24 -12
- package/dist/tools/wait/drive-handler.js.map +1 -1
- package/dist/tools/wait/index.d.ts +2 -1
- package/dist/tools/wait/index.d.ts.map +1 -1
- package/dist/tools/wait/index.js.map +1 -1
- package/dist/tools/wait/media-processor.d.ts +4 -4
- package/dist/tools/wait/media-processor.d.ts.map +1 -1
- package/dist/tools/wait/media-processor.js +17 -8
- package/dist/tools/wait/media-processor.js.map +1 -1
- package/dist/tools/wait/message-delivery.d.ts +5 -5
- package/dist/tools/wait/message-delivery.d.ts.map +1 -1
- package/dist/tools/wait/message-delivery.js +78 -37
- package/dist/tools/wait/message-delivery.js.map +1 -1
- package/dist/tools/wait/message-processing.d.ts +2 -2
- package/dist/tools/wait/message-processing.d.ts.map +1 -1
- package/dist/tools/wait/message-processing.js +95 -37
- package/dist/tools/wait/message-processing.js.map +1 -1
- package/dist/tools/wait/poll-loop.d.ts +2 -41
- package/dist/tools/wait/poll-loop.d.ts.map +1 -1
- package/dist/tools/wait/poll-loop.js +75 -23
- package/dist/tools/wait/poll-loop.js.map +1 -1
- package/dist/tools/wait/reaction-handler.d.ts +3 -3
- package/dist/tools/wait/reaction-handler.d.ts.map +1 -1
- package/dist/tools/wait/reaction-handler.js +6 -6
- package/dist/tools/wait/reaction-handler.js.map +1 -1
- package/dist/tools/wait/task-handler.d.ts +1 -1
- package/dist/tools/wait/task-handler.d.ts.map +1 -1
- package/dist/tools/wait/task-handler.js +5 -4
- package/dist/tools/wait/task-handler.js.map +1 -1
- package/package.json +11 -2
- package/templates/code-review.default.md +1 -1
- package/templates/fire-and-forget.default.md +1 -1
- package/templates/handoff.default.md +1 -1
- package/templates/sensorium-repair.default.md +1 -1
- package/templates/sleep.default.md +1 -1
- package/dist/chat-ui/src/main.d.ts +0 -2
- package/dist/chat-ui/src/main.d.ts.map +0 -1
- package/dist/chat-ui/src/main.js +0 -4
- package/dist/chat-ui/src/main.js.map +0 -1
- package/dist/chat-ui/src/markdown.d.ts +0 -2
- package/dist/chat-ui/src/markdown.d.ts.map +0 -1
- package/dist/chat-ui/src/markdown.js +0 -39
- package/dist/chat-ui/src/markdown.js.map +0 -1
- package/dist/chat-ui/src/mock-data.d.ts +0 -4
- package/dist/chat-ui/src/mock-data.d.ts.map +0 -1
- package/dist/chat-ui/src/mock-data.js +0 -230
- package/dist/chat-ui/src/mock-data.js.map +0 -1
- package/dist/chat-ui/src/types.d.ts +0 -47
- package/dist/chat-ui/src/types.d.ts.map +0 -1
- package/dist/chat-ui/vite.config.d.ts +0 -3
- package/dist/chat-ui/vite.config.d.ts.map +0 -1
- package/dist/chat-ui/vite.config.js +0 -14
- package/dist/chat-ui/vite.config.js.map +0 -1
- package/dist/config.d.ts +0 -228
- package/dist/config.d.ts.map +0 -1
- package/dist/config.js +0 -841
- package/dist/config.js.map +0 -1
- package/dist/daily-session.d.ts.map +0 -1
- package/dist/daily-session.js.map +0 -1
- package/dist/dashboard.d.ts +0 -10
- package/dist/dashboard.d.ts.map +0 -1
- package/dist/dashboard.js +0 -10
- package/dist/dashboard.js.map +0 -1
- package/dist/data/memory/semantic.d.ts.map +0 -1
- package/dist/data/memory/semantic.js +0 -588
- package/dist/data/memory/semantic.js.map +0 -1
- package/dist/dispatcher.d.ts +0 -9
- package/dist/dispatcher.d.ts.map +0 -1
- package/dist/dispatcher.js +0 -9
- package/dist/dispatcher.js.map +0 -1
- package/dist/drive.d.ts.map +0 -1
- package/dist/drive.js.map +0 -1
- package/dist/http-server.d.ts.map +0 -1
- package/dist/http-server.js.map +0 -1
- package/dist/intent.d.ts.map +0 -1
- package/dist/intent.js.map +0 -1
- package/dist/logger.d.ts.map +0 -1
- package/dist/logger.js.map +0 -1
- package/dist/markdown.d.ts.map +0 -1
- package/dist/markdown.js.map +0 -1
- package/dist/memory.d.ts +0 -9
- package/dist/memory.d.ts.map +0 -1
- package/dist/memory.js +0 -9
- package/dist/memory.js.map +0 -1
- package/dist/openai.d.ts +0 -13
- package/dist/openai.d.ts.map +0 -1
- package/dist/openai.js +0 -17
- package/dist/openai.js.map +0 -1
- package/dist/response-builders.d.ts.map +0 -1
- package/dist/response-builders.js.map +0 -1
- package/dist/scheduler.d.ts.map +0 -1
- package/dist/scheduler.js.map +0 -1
- package/dist/sessions.d.ts.map +0 -1
- package/dist/sessions.js.map +0 -1
- package/dist/stdio-server.d.ts.map +0 -1
- package/dist/stdio-server.js.map +0 -1
- package/dist/telegram.d.ts.map +0 -1
- package/dist/telegram.js.map +0 -1
- package/dist/tool-definitions.d.ts +0 -2
- package/dist/tool-definitions.d.ts.map +0 -1
- package/dist/tool-definitions.js +0 -2
- package/dist/tool-definitions.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/utils.d.ts.map +0 -1
- package/dist/utils.js.map +0 -1
- /package/dist/{logger.d.ts → lib/logger.d.ts} +0 -0
- /package/dist/{markdown.d.ts → lib/markdown.d.ts} +0 -0
- /package/dist/{types.js → lib/types.js} +0 -0
- /package/dist/{utils.d.ts → lib/utils.d.ts} +0 -0
- /package/dist/{drive.d.ts → services/drive.d.ts} +0 -0
- /package/dist/{intent.d.ts → services/intent.d.ts} +0 -0
- /package/dist/{chat-ui/src → tools/defs}/types.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/threads.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"threads.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/threads.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAoBH,OAAO,EAA2B,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAmBrE,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA4ChF;AAID,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAiEhF;AAED,qDAAqD;AACrD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAqE7E;AAED,iEAAiE;AACjE,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA0C7E;AAcD,oFAAoF;AACpF,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAuC5E;AAID,6FAA6F;AAC7F,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA+C9E"}
|
|
@@ -1,172 +1,20 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Dashboard API — thread
|
|
3
|
-
*
|
|
2
|
+
* Dashboard API — thread lifecycle route handlers: unarchive, summary
|
|
3
|
+
* generation, update, delete/archive, start, and branch→root conversion.
|
|
4
|
+
* Read handlers live in threads-read.ts, creation in threads-create.ts,
|
|
5
|
+
* shared validation/enrichment in threads-helpers.ts.
|
|
4
6
|
*/
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { config, getAgentType, setKeepAliveEnabled, setKeepAliveThreadId, setKeepAliveClient, setKeepAliveMaxRetries, setKeepAliveCooldownMs, setThreadKeepAlive, removeThreadKeepAlive, isValidKeeperClient, setThreadMcpServers, deleteThreadMcpServers, getAllThreadMcpServers, maskThreadMcpServers, MASK_SENTINEL, } from "../../config.js";
|
|
7
|
+
import { getThread, getThreadsByRoot, updateThread, archiveThread, unarchiveThread, deleteThread, getExplicitTelegramTopicId, resolveTelegramTopicId, } from "../../data/memory/thread-registry.js";
|
|
8
|
+
import { config, setThreadMcpServers, deleteThreadMcpServers, } from "../../config/index.js";
|
|
8
9
|
import { readBody, safeParseJSON } from "./types.js";
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import { join } from "node:path";
|
|
16
|
-
import { createManagedTopic, deleteTelegramTopicByBotApi, remapThreadToNewTopic } from "../../services/topic.service.js";
|
|
10
|
+
import { buildThreadUpdates, parseThreadMcpServersBody, withThreadMcpServers, } from "./threads-helpers.js";
|
|
11
|
+
import { syncKeepAliveToSettings } from "../../services/keep-alive-sync.service.js";
|
|
12
|
+
import { errorMessage } from "../../lib/utils.js";
|
|
13
|
+
import { log } from "../../lib/logger.js";
|
|
14
|
+
import { isThreadRunning } from "../../services/process.service.js";
|
|
15
|
+
import { deleteTelegramTopicByBotApi, remapThreadToNewTopic, } from "../../services/topic.service.js";
|
|
17
16
|
import { dispatchSpawn } from "../../services/agent-spawn.service.js";
|
|
18
|
-
import { TelegramClient } from "../../telegram.js";
|
|
19
|
-
// ─── Helpers ────────────────────────────────────────────────────────────────
|
|
20
|
-
const VALID_STATUSES = ["active", "archived", "expired", "exited"];
|
|
21
|
-
const VALID_CLIENTS = ["claude", "copilot", "codex", "openai_codex"];
|
|
22
|
-
/** Extract valid update fields from a request body. Returns an error string on validation failure. */
|
|
23
|
-
function buildThreadUpdates(body) {
|
|
24
|
-
const updates = {};
|
|
25
|
-
if (typeof body.name === "string" && body.name.trim())
|
|
26
|
-
updates.name = body.name.trim();
|
|
27
|
-
if (typeof body.status === "string") {
|
|
28
|
-
if (!VALID_STATUSES.includes(body.status)) {
|
|
29
|
-
return `status must be one of: ${VALID_STATUSES.join(", ")}`;
|
|
30
|
-
}
|
|
31
|
-
updates.status = body.status;
|
|
32
|
-
}
|
|
33
|
-
if (typeof body.keepAlive === "boolean")
|
|
34
|
-
updates.keepAlive = body.keepAlive;
|
|
35
|
-
if (typeof body.dailyRotation === "boolean")
|
|
36
|
-
updates.dailyRotation = body.dailyRotation;
|
|
37
|
-
if (typeof body.autonomousMode === "boolean")
|
|
38
|
-
updates.autonomousMode = body.autonomousMode;
|
|
39
|
-
if (typeof body.client === "string") {
|
|
40
|
-
if (!VALID_CLIENTS.includes(body.client)) {
|
|
41
|
-
return `client must be one of: ${VALID_CLIENTS.join(", ")}`;
|
|
42
|
-
}
|
|
43
|
-
updates.client = body.client;
|
|
44
|
-
}
|
|
45
|
-
if (typeof body.maxRetries === "number") {
|
|
46
|
-
if (!Number.isFinite(body.maxRetries) || !Number.isInteger(body.maxRetries) || body.maxRetries < 0) {
|
|
47
|
-
return "maxRetries must be a non-negative integer";
|
|
48
|
-
}
|
|
49
|
-
updates.maxRetries = body.maxRetries;
|
|
50
|
-
}
|
|
51
|
-
if (typeof body.cooldownMs === "number") {
|
|
52
|
-
if (!Number.isFinite(body.cooldownMs) || !Number.isInteger(body.cooldownMs) || body.cooldownMs < 0) {
|
|
53
|
-
return "cooldownMs must be a non-negative integer";
|
|
54
|
-
}
|
|
55
|
-
updates.cooldownMs = body.cooldownMs;
|
|
56
|
-
}
|
|
57
|
-
if (typeof body.badge === "string")
|
|
58
|
-
updates.badge = body.badge;
|
|
59
|
-
if (typeof body.identityPrompt === "string")
|
|
60
|
-
updates.identityPrompt = body.identityPrompt;
|
|
61
|
-
if (body.identityPrompt === null)
|
|
62
|
-
updates.identityPrompt = null;
|
|
63
|
-
if (typeof body.telegramTopicId === "number" && Number.isFinite(body.telegramTopicId))
|
|
64
|
-
updates.telegramTopicId = body.telegramTopicId;
|
|
65
|
-
if (body.telegramTopicId === null)
|
|
66
|
-
updates.telegramTopicId = null;
|
|
67
|
-
if (typeof body.workingDirectory === "string" && body.workingDirectory.trim())
|
|
68
|
-
updates.workingDirectory = body.workingDirectory.trim();
|
|
69
|
-
if (body.workingDirectory === null)
|
|
70
|
-
updates.workingDirectory = null;
|
|
71
|
-
return updates;
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* Enrich thread entries with topic names from topic_registry
|
|
75
|
-
* when the thread name is generic (e.g. "Thread 1234").
|
|
76
|
-
*/
|
|
77
|
-
function enrichThreadNames(db, threads) {
|
|
78
|
-
const genericPattern = /^Thread \d+$/i;
|
|
79
|
-
const needsEnrichment = threads.filter(t => genericPattern.test(t.name));
|
|
80
|
-
if (needsEnrichment.length === 0)
|
|
81
|
-
return threads;
|
|
82
|
-
try {
|
|
83
|
-
const topicNames = new Map();
|
|
84
|
-
const rows = db.prepare(`SELECT thread_id, name FROM topic_registry`).all();
|
|
85
|
-
for (const r of rows)
|
|
86
|
-
topicNames.set(r.thread_id, r.name);
|
|
87
|
-
return threads.map(t => {
|
|
88
|
-
if (!genericPattern.test(t.name))
|
|
89
|
-
return t;
|
|
90
|
-
// Check topic_registry by thread_id or telegramTopicId
|
|
91
|
-
const topicName = topicNames.get(t.telegramTopicId ?? t.threadId) ?? topicNames.get(t.threadId);
|
|
92
|
-
if (topicName)
|
|
93
|
-
return { ...t, name: topicName };
|
|
94
|
-
return t;
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
catch {
|
|
98
|
-
return threads; // topic_registry might not exist
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
/** Attach each thread's custom MCP servers (settings.json, not the DB), header values masked. */
|
|
102
|
-
function withThreadMcpServers(threads) {
|
|
103
|
-
const all = getAllThreadMcpServers();
|
|
104
|
-
return threads.map(t => {
|
|
105
|
-
const s = all[String(t.threadId)];
|
|
106
|
-
return { ...t, mcpServers: s ? maskThreadMcpServers(s) : null };
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
/**
|
|
110
|
-
* Coerce a PATCH `mcpServers` body into a validated server map (or null to clear).
|
|
111
|
-
* Shape-checks http-only transport and rejects the header mask sentinel so a
|
|
112
|
-
* round-tripped masked value can never be persisted. Returns an error string on
|
|
113
|
-
* malformed input; deeper rules (reserved names) are enforced by setThreadMcpServers.
|
|
114
|
-
*/
|
|
115
|
-
function parseThreadMcpServersBody(raw) {
|
|
116
|
-
if (raw === null || raw === undefined)
|
|
117
|
-
return null;
|
|
118
|
-
if (typeof raw !== "object" || Array.isArray(raw))
|
|
119
|
-
return "mcpServers must be an object or null";
|
|
120
|
-
const out = {};
|
|
121
|
-
for (const [name, val] of Object.entries(raw)) {
|
|
122
|
-
if (!val || typeof val !== "object" || Array.isArray(val))
|
|
123
|
-
return `mcpServers["${name}"] must be an object`;
|
|
124
|
-
const o = val;
|
|
125
|
-
if (o.type !== "http")
|
|
126
|
-
return `mcpServers["${name}"] must have type "http"`;
|
|
127
|
-
if (typeof o.url !== "string" || !o.url.trim())
|
|
128
|
-
return `mcpServers["${name}"] requires a url`;
|
|
129
|
-
const entry = { type: "http", url: o.url.trim() };
|
|
130
|
-
if (o.headers !== undefined && o.headers !== null) {
|
|
131
|
-
if (typeof o.headers !== "object" || Array.isArray(o.headers))
|
|
132
|
-
return `mcpServers["${name}"].headers must be an object`;
|
|
133
|
-
const headers = {};
|
|
134
|
-
for (const [k, v] of Object.entries(o.headers)) {
|
|
135
|
-
if (typeof v !== "string")
|
|
136
|
-
return `mcpServers["${name}"].headers["${k}"] must be a string`;
|
|
137
|
-
if (v.includes(MASK_SENTINEL))
|
|
138
|
-
return `mcpServers["${name}"].headers["${k}"] still masked — re-enter the value`;
|
|
139
|
-
headers[k] = v;
|
|
140
|
-
}
|
|
141
|
-
if (Object.keys(headers).length > 0)
|
|
142
|
-
entry.headers = headers;
|
|
143
|
-
}
|
|
144
|
-
out[name] = entry;
|
|
145
|
-
}
|
|
146
|
-
return out;
|
|
147
|
-
}
|
|
148
|
-
// ─── GET /api/threads — list all active threads grouped ─────────────────────
|
|
149
|
-
export const handleGetThreads = ({ json, db }) => {
|
|
150
|
-
const threads = withThreadMcpServers(enrichThreadNames(db, getDashboardThreads(db)));
|
|
151
|
-
json({ threads });
|
|
152
|
-
return true;
|
|
153
|
-
};
|
|
154
|
-
// ─── GET /api/threads/roots — list root threads only ────────────────────────
|
|
155
|
-
export const handleGetRootThreads = ({ json, db }) => {
|
|
156
|
-
json({ threads: withThreadMcpServers(enrichThreadNames(db, getRootThreads(db))) });
|
|
157
|
-
return true;
|
|
158
|
-
};
|
|
159
|
-
// ─── GET /api/threads/keepalive — list all threads with keepAlive=true (excl. workers) ─
|
|
160
|
-
export const handleGetKeepAliveThreads = ({ json, db }) => {
|
|
161
|
-
json({ threads: withThreadMcpServers(enrichThreadNames(db, getKeepAliveThreads(db))) });
|
|
162
|
-
return true;
|
|
163
|
-
};
|
|
164
|
-
// ─── GET /api/threads/archived — list archived threads ──────────────────────
|
|
165
|
-
export const handleGetArchivedThreads = ({ json, db }) => {
|
|
166
|
-
const threads = withThreadMcpServers(enrichThreadNames(db, getArchivedThreads(db)));
|
|
167
|
-
json({ threads });
|
|
168
|
-
return true;
|
|
169
|
-
};
|
|
17
|
+
import { TelegramClient } from "../../services/telegram.js";
|
|
170
18
|
// ─── POST /api/threads/:threadId/unarchive — restore an archived thread ────
|
|
171
19
|
export function handleUnarchiveThread(args, threadId) {
|
|
172
20
|
const { json, db, ctx } = args;
|
|
@@ -226,17 +74,31 @@ export function handleGenerateSummary(args, threadId) {
|
|
|
226
74
|
return;
|
|
227
75
|
}
|
|
228
76
|
// Gather recent episodes for context
|
|
229
|
-
const episodes = db
|
|
230
|
-
|
|
77
|
+
const episodes = db
|
|
78
|
+
.prepare(`SELECT content, type, modality, timestamp FROM episodes
|
|
79
|
+
WHERE thread_id = ? ORDER BY timestamp DESC LIMIT 30`)
|
|
80
|
+
.all(threadId);
|
|
231
81
|
if (episodes.length === 0) {
|
|
232
|
-
json({
|
|
82
|
+
json({
|
|
83
|
+
ok: true,
|
|
84
|
+
summary: `Thread "${thread.name}" (${thread.type}) — no episodes recorded.`,
|
|
85
|
+
});
|
|
233
86
|
return;
|
|
234
87
|
}
|
|
235
|
-
const episodeText = episodes
|
|
88
|
+
const episodeText = episodes
|
|
89
|
+
.reverse()
|
|
90
|
+
.map((e) => `[${e.timestamp}] (${e.type}) ${e.content.slice(0, 200)}`)
|
|
91
|
+
.join("\n");
|
|
236
92
|
const { chatCompletion } = await import("../../integrations/openai/chat.js");
|
|
237
93
|
const summary = await chatCompletion([
|
|
238
|
-
{
|
|
239
|
-
|
|
94
|
+
{
|
|
95
|
+
role: "system",
|
|
96
|
+
content: "You are a concise summarizer. Given a thread's conversation episodes, produce a 1-2 sentence summary of what was discussed/accomplished. Be specific about the topic and outcome. No filler.",
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
role: "user",
|
|
100
|
+
content: `Thread: "${thread.name}" (type: ${thread.type})\n\nEpisodes:\n${episodeText}`,
|
|
101
|
+
},
|
|
240
102
|
], apiKey, { maxTokens: 150, temperature: 0.3 });
|
|
241
103
|
const trimmed = summary.trim();
|
|
242
104
|
if (!trimmed) {
|
|
@@ -251,290 +113,6 @@ export function handleGenerateSummary(args, threadId) {
|
|
|
251
113
|
})();
|
|
252
114
|
return true;
|
|
253
115
|
}
|
|
254
|
-
// ─── POST /api/threads — create/register a thread ──────────────────────────
|
|
255
|
-
export const handleCreateThread = ({ req, json, db }) => {
|
|
256
|
-
void (async () => {
|
|
257
|
-
try {
|
|
258
|
-
const raw = await readBody(req);
|
|
259
|
-
const body = safeParseJSON(raw);
|
|
260
|
-
if (!body || typeof body !== "object") {
|
|
261
|
-
json({ error: "Invalid request body" }, 400);
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
const threadId = body.threadId;
|
|
265
|
-
if (typeof threadId !== "number" || !Number.isFinite(threadId) || !Number.isInteger(threadId) || threadId <= 0) {
|
|
266
|
-
json({ error: "threadId must be a positive integer" }, 400);
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
const name = body.name;
|
|
270
|
-
if (typeof name !== "string" || !name.trim()) {
|
|
271
|
-
json({ error: "name is required" }, 400);
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
const validTypes = ["root", "daily", "branch", "worker"];
|
|
275
|
-
const type = body.type;
|
|
276
|
-
if (typeof type !== "string" || !validTypes.includes(type)) {
|
|
277
|
-
json({ error: `type must be one of: ${validTypes.join(", ")}` }, 400);
|
|
278
|
-
return;
|
|
279
|
-
}
|
|
280
|
-
const client = typeof body.client === "string" && VALID_CLIENTS.includes(body.client)
|
|
281
|
-
? body.client
|
|
282
|
-
: undefined;
|
|
283
|
-
const keepAlive = typeof body.keepAlive === "boolean" ? body.keepAlive : undefined;
|
|
284
|
-
const workingDirectory = typeof body.workingDirectory === "string" && body.workingDirectory.trim()
|
|
285
|
-
? body.workingDirectory.trim()
|
|
286
|
-
: undefined;
|
|
287
|
-
// Check for duplicate
|
|
288
|
-
const existing = getThread(db, threadId);
|
|
289
|
-
if (existing) {
|
|
290
|
-
json({ error: `Thread ${threadId} already exists` }, 409);
|
|
291
|
-
return;
|
|
292
|
-
}
|
|
293
|
-
const entry = registerThread(db, {
|
|
294
|
-
threadId,
|
|
295
|
-
name: name.trim(),
|
|
296
|
-
type: type,
|
|
297
|
-
rootThreadId: typeof body.rootThreadId === "number" ? body.rootThreadId : undefined,
|
|
298
|
-
badge: typeof body.badge === "string" ? body.badge : undefined,
|
|
299
|
-
client,
|
|
300
|
-
keepAlive,
|
|
301
|
-
workingDirectory,
|
|
302
|
-
});
|
|
303
|
-
json(entry, 201);
|
|
304
|
-
// Sync keepAlive to settings.json for watcher backward compatibility
|
|
305
|
-
if (entry.keepAlive) {
|
|
306
|
-
syncKeepAliveToSettings(db);
|
|
307
|
-
}
|
|
308
|
-
}
|
|
309
|
-
catch (err) {
|
|
310
|
-
json({ error: errorMessage(err) }, 500);
|
|
311
|
-
}
|
|
312
|
-
})();
|
|
313
|
-
return true;
|
|
314
|
-
};
|
|
315
|
-
// ─── POST /api/threads/create-root — create a fresh topic + root thread ─────
|
|
316
|
-
/**
|
|
317
|
-
* Create a brand-new root thread: opens a Telegram forum topic and registers
|
|
318
|
-
* the thread. Unlike POST /api/threads (which only registers a caller-supplied
|
|
319
|
-
* topic id), this owns topic creation so callers without Telegram access (e.g.
|
|
320
|
-
* the supervisor) can spin up threads. keepAlive + dailyRotation default on for
|
|
321
|
-
* root threads via registerThread.
|
|
322
|
-
*/
|
|
323
|
-
export const handleCreateRoot = ({ req, json, db, ctx }) => {
|
|
324
|
-
void (async () => {
|
|
325
|
-
try {
|
|
326
|
-
const raw = await readBody(req);
|
|
327
|
-
const body = safeParseJSON(raw);
|
|
328
|
-
if (!body || typeof body !== "object") {
|
|
329
|
-
json({ error: "Invalid request body" }, 400);
|
|
330
|
-
return;
|
|
331
|
-
}
|
|
332
|
-
const name = typeof body.name === "string" ? body.name.trim() : "";
|
|
333
|
-
if (!name) {
|
|
334
|
-
json({ error: "name is required" }, 400);
|
|
335
|
-
return;
|
|
336
|
-
}
|
|
337
|
-
const agentType = resolveAgentType(body.agentType);
|
|
338
|
-
if (agentType === INVALID_AGENT) {
|
|
339
|
-
json({ error: `agentType must be one of: ${VALID_CLIENTS.join(", ")}` }, 400);
|
|
340
|
-
return;
|
|
341
|
-
}
|
|
342
|
-
const workingDirectory = typeof body.workingDirectory === "string" ? body.workingDirectory.trim() : "";
|
|
343
|
-
if (!workingDirectory) {
|
|
344
|
-
json({ error: "workingDirectory is required" }, 400);
|
|
345
|
-
return;
|
|
346
|
-
}
|
|
347
|
-
const { TELEGRAM_TOKEN, TELEGRAM_CHAT_ID } = config;
|
|
348
|
-
if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID) {
|
|
349
|
-
json({ error: "Telegram is not configured" }, 500);
|
|
350
|
-
return;
|
|
351
|
-
}
|
|
352
|
-
const telegram = new TelegramClient(TELEGRAM_TOKEN);
|
|
353
|
-
const threadId = await createManagedTopic(telegram, TELEGRAM_CHAT_ID, name);
|
|
354
|
-
const thread = ctx.threadLifecycle.registerThread(db, {
|
|
355
|
-
threadId,
|
|
356
|
-
name,
|
|
357
|
-
type: "root",
|
|
358
|
-
client: agentType ?? getAgentType(),
|
|
359
|
-
workingDirectory,
|
|
360
|
-
chatId: TELEGRAM_CHAT_ID,
|
|
361
|
-
telegramTopicId: threadId,
|
|
362
|
-
});
|
|
363
|
-
json({ ok: true, threadId, thread }, 201);
|
|
364
|
-
syncKeepAliveToSettings(db);
|
|
365
|
-
}
|
|
366
|
-
catch (err) {
|
|
367
|
-
json({ error: errorMessage(err) }, 500);
|
|
368
|
-
}
|
|
369
|
-
})();
|
|
370
|
-
return true;
|
|
371
|
-
};
|
|
372
|
-
// ─── POST /api/threads/create-branch — create a fresh topic + branch thread ──
|
|
373
|
-
/**
|
|
374
|
-
* Create a branch thread under an existing root: opens a Telegram forum topic
|
|
375
|
-
* and registers it with type=branch. Working directory and agent type are
|
|
376
|
-
* inherited from the parent root unless overridden.
|
|
377
|
-
*/
|
|
378
|
-
export const handleCreateBranch = ({ req, json, db, ctx }) => {
|
|
379
|
-
void (async () => {
|
|
380
|
-
try {
|
|
381
|
-
const raw = await readBody(req);
|
|
382
|
-
const body = safeParseJSON(raw);
|
|
383
|
-
if (!body || typeof body !== "object") {
|
|
384
|
-
json({ error: "Invalid request body" }, 400);
|
|
385
|
-
return;
|
|
386
|
-
}
|
|
387
|
-
const rootThreadId = body.rootThreadId;
|
|
388
|
-
if (typeof rootThreadId !== "number" || !Number.isInteger(rootThreadId) || rootThreadId <= 0) {
|
|
389
|
-
json({ error: "rootThreadId must be a positive integer" }, 400);
|
|
390
|
-
return;
|
|
391
|
-
}
|
|
392
|
-
const name = typeof body.name === "string" ? body.name.trim() : "";
|
|
393
|
-
if (!name) {
|
|
394
|
-
json({ error: "name is required" }, 400);
|
|
395
|
-
return;
|
|
396
|
-
}
|
|
397
|
-
const parent = getThread(db, rootThreadId);
|
|
398
|
-
if (!parent) {
|
|
399
|
-
json({ error: `Root thread ${rootThreadId} not found` }, 404);
|
|
400
|
-
return;
|
|
401
|
-
}
|
|
402
|
-
if (parent.type === "worker") {
|
|
403
|
-
json({ error: "Cannot branch from a worker thread" }, 400);
|
|
404
|
-
return;
|
|
405
|
-
}
|
|
406
|
-
const agentType = resolveAgentType(body.agentType);
|
|
407
|
-
if (agentType === INVALID_AGENT) {
|
|
408
|
-
json({ error: `agentType must be one of: ${VALID_CLIENTS.join(", ")}` }, 400);
|
|
409
|
-
return;
|
|
410
|
-
}
|
|
411
|
-
const workingDirectoryOverride = typeof body.workingDirectory === "string" && body.workingDirectory.trim()
|
|
412
|
-
? body.workingDirectory.trim()
|
|
413
|
-
: undefined;
|
|
414
|
-
const { TELEGRAM_TOKEN, TELEGRAM_CHAT_ID } = config;
|
|
415
|
-
if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID) {
|
|
416
|
-
json({ error: "Telegram is not configured" }, 500);
|
|
417
|
-
return;
|
|
418
|
-
}
|
|
419
|
-
const telegram = new TelegramClient(TELEGRAM_TOKEN);
|
|
420
|
-
const threadId = await createManagedTopic(telegram, TELEGRAM_CHAT_ID, name);
|
|
421
|
-
const thread = ctx.threadLifecycle.registerThread(db, {
|
|
422
|
-
threadId,
|
|
423
|
-
name,
|
|
424
|
-
type: "branch",
|
|
425
|
-
rootThreadId,
|
|
426
|
-
client: agentType ?? parent.client ?? getAgentType(),
|
|
427
|
-
workingDirectory: workingDirectoryOverride ?? parent.workingDirectory ?? undefined,
|
|
428
|
-
chatId: TELEGRAM_CHAT_ID,
|
|
429
|
-
telegramTopicId: threadId,
|
|
430
|
-
});
|
|
431
|
-
try {
|
|
432
|
-
const fork = forkMemory(db, rootThreadId, threadId);
|
|
433
|
-
log.info(`[create-branch] Forked memory ${rootThreadId} → ${threadId}: ${fork.notesCopied} notes, ${fork.narrativesCopied} narratives, ${fork.episodesCopied} episodes`);
|
|
434
|
-
}
|
|
435
|
-
catch (err) {
|
|
436
|
-
log.warn(`[create-branch] Memory fork failed (non-fatal): ${errorMessage(err)}`);
|
|
437
|
-
}
|
|
438
|
-
json({ ok: true, threadId, thread }, 201);
|
|
439
|
-
syncKeepAliveToSettings(db);
|
|
440
|
-
}
|
|
441
|
-
catch (err) {
|
|
442
|
-
json({ error: errorMessage(err) }, 500);
|
|
443
|
-
}
|
|
444
|
-
})();
|
|
445
|
-
return true;
|
|
446
|
-
};
|
|
447
|
-
/** Sentinel returned by resolveAgentType when an explicit agentType is invalid. */
|
|
448
|
-
const INVALID_AGENT = Symbol("invalid-agent");
|
|
449
|
-
/** Validate an optional agentType field: undefined → undefined, valid → the value, invalid → INVALID_AGENT. */
|
|
450
|
-
function resolveAgentType(value) {
|
|
451
|
-
if (value === undefined)
|
|
452
|
-
return undefined;
|
|
453
|
-
if (typeof value === "string" && VALID_CLIENTS.includes(value))
|
|
454
|
-
return value;
|
|
455
|
-
return INVALID_AGENT;
|
|
456
|
-
}
|
|
457
|
-
// ─── Dynamic handlers (threadId extracted by caller) ────────────────────────
|
|
458
|
-
/** GET /api/threads/:threadId — get single thread */
|
|
459
|
-
export function handleGetThread(args, threadId) {
|
|
460
|
-
const thread = getThread(args.db, threadId);
|
|
461
|
-
if (thread) {
|
|
462
|
-
args.json(thread);
|
|
463
|
-
}
|
|
464
|
-
else {
|
|
465
|
-
args.json({ error: `Thread ${threadId} not found` }, 404);
|
|
466
|
-
}
|
|
467
|
-
return true;
|
|
468
|
-
}
|
|
469
|
-
/** GET /api/threads/:threadId/running — check if an agent process is alive for this thread */
|
|
470
|
-
export function handleGetThreadRunning(args, threadId) {
|
|
471
|
-
const running = isThreadRunning(threadId);
|
|
472
|
-
args.json({ threadId, running });
|
|
473
|
-
return true;
|
|
474
|
-
}
|
|
475
|
-
/** GET /api/threads/:threadId/heartbeat — last MCP activity timestamp for stuck-process detection */
|
|
476
|
-
export function handleGetThreadHeartbeat(args, threadId) {
|
|
477
|
-
const lastActivityMs = readThreadHeartbeat(threadId);
|
|
478
|
-
args.json({ threadId, lastActivityMs });
|
|
479
|
-
return true;
|
|
480
|
-
}
|
|
481
|
-
/** Locate the most-recently-modified log file for a thread, or null if none exist. */
|
|
482
|
-
function findLatestThreadLogFile(threadId) {
|
|
483
|
-
let files;
|
|
484
|
-
try {
|
|
485
|
-
files = readdirSync(THREAD_LOGS_DIR);
|
|
486
|
-
}
|
|
487
|
-
catch {
|
|
488
|
-
return null;
|
|
489
|
-
}
|
|
490
|
-
const suffixRe = new RegExp(`_${threadId}_\\d{4}-\\d{2}-\\d{2}\\.jsonl?$`);
|
|
491
|
-
let best = null;
|
|
492
|
-
for (const file of files) {
|
|
493
|
-
if (!suffixRe.test(file))
|
|
494
|
-
continue;
|
|
495
|
-
const full = join(THREAD_LOGS_DIR, file);
|
|
496
|
-
try {
|
|
497
|
-
const mtimeMs = statSync(full).mtimeMs;
|
|
498
|
-
if (!best || mtimeMs > best.mtimeMs)
|
|
499
|
-
best = { path: full, mtimeMs };
|
|
500
|
-
}
|
|
501
|
-
catch { /* file vanished between readdir and stat */ }
|
|
502
|
-
}
|
|
503
|
-
return best?.path ?? null;
|
|
504
|
-
}
|
|
505
|
-
/**
|
|
506
|
-
* GET /api/threads/:threadId/logs — a readable digest of the agent's raw stdout.
|
|
507
|
-
*
|
|
508
|
-
* Parses the newest stream-json log file into tail-first turns, then returns a
|
|
509
|
-
* single character window (default 4000, Telegram-sized). Callers page deeper
|
|
510
|
-
* into history with ?offset=; nextOffset/hasMore drive a "next chunk" button.
|
|
511
|
-
*/
|
|
512
|
-
export function handleGetThreadLogs(args, threadId) {
|
|
513
|
-
const { json, url } = args;
|
|
514
|
-
const logFile = findLatestThreadLogFile(threadId);
|
|
515
|
-
if (!logFile) {
|
|
516
|
-
json({ threadId, text: "", offset: 0, nextOffset: 0, hasMore: false, totalLength: 0 });
|
|
517
|
-
return true;
|
|
518
|
-
}
|
|
519
|
-
let raw;
|
|
520
|
-
try {
|
|
521
|
-
raw = readFileSync(logFile, "utf-8");
|
|
522
|
-
}
|
|
523
|
-
catch (err) {
|
|
524
|
-
json({ error: errorMessage(err) }, 500);
|
|
525
|
-
return true;
|
|
526
|
-
}
|
|
527
|
-
const rendered = renderThreadLog(parseClaudeStreamLog(raw), true);
|
|
528
|
-
const page = sliceLogWindow(rendered, Number(url.searchParams.get("offset")), Number(url.searchParams.get("limit")));
|
|
529
|
-
json({ threadId, ...page });
|
|
530
|
-
return true;
|
|
531
|
-
}
|
|
532
|
-
/** GET /api/threads/:threadId/children — get children of a root */
|
|
533
|
-
export function handleGetThreadChildren(args, rootThreadId) {
|
|
534
|
-
const children = withThreadMcpServers(getThreadsByRoot(args.db, rootThreadId));
|
|
535
|
-
args.json({ threads: children });
|
|
536
|
-
return true;
|
|
537
|
-
}
|
|
538
116
|
/** PATCH /api/threads/:threadId — update a thread */
|
|
539
117
|
export function handleUpdateThread(args, threadId) {
|
|
540
118
|
const { req, json, db } = args;
|
|
@@ -587,7 +165,10 @@ export function handleUpdateThread(args, threadId) {
|
|
|
587
165
|
}
|
|
588
166
|
json(withThreadMcpServers([getThread(db, threadId)])[0]);
|
|
589
167
|
// Sync keepAlive to settings.json for watcher backward compatibility
|
|
590
|
-
if ("keepAlive" in updates ||
|
|
168
|
+
if ("keepAlive" in updates ||
|
|
169
|
+
"client" in updates ||
|
|
170
|
+
"maxRetries" in updates ||
|
|
171
|
+
"cooldownMs" in updates) {
|
|
591
172
|
syncKeepAliveToSettings(db);
|
|
592
173
|
}
|
|
593
174
|
}
|
|
@@ -642,7 +223,9 @@ function deleteTelegramTopic(topicId) {
|
|
|
642
223
|
const { TELEGRAM_TOKEN, TELEGRAM_CHAT_ID } = config;
|
|
643
224
|
if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID)
|
|
644
225
|
return;
|
|
645
|
-
void deleteTelegramTopicByBotApi(TELEGRAM_TOKEN, TELEGRAM_CHAT_ID, topicId).catch(() => {
|
|
226
|
+
void deleteTelegramTopicByBotApi(TELEGRAM_TOKEN, TELEGRAM_CHAT_ID, topicId).catch(() => {
|
|
227
|
+
/* topic might not exist or already deleted */
|
|
228
|
+
});
|
|
646
229
|
}
|
|
647
230
|
// ─── POST /api/threads/:threadId/start — manually start a thread ────────────
|
|
648
231
|
/** POST /api/threads/:threadId/start — spawn a thread process from the dashboard */
|
|
@@ -718,43 +301,4 @@ export function handleConvertToRoot(args, threadId) {
|
|
|
718
301
|
})();
|
|
719
302
|
return true;
|
|
720
303
|
}
|
|
721
|
-
// ─── Settings.json sync for watcher backward compatibility ──────────────────
|
|
722
|
-
/**
|
|
723
|
-
* Sync thread_registry keepAlive settings to settings.json for watcher backward compatibility.
|
|
724
|
-
* The watcher's readKeeperSettingsFromFile() reads settings.json during startup before the MCP server is ready.
|
|
725
|
-
*/
|
|
726
|
-
export function syncKeepAliveToSettings(db) {
|
|
727
|
-
try {
|
|
728
|
-
const allThreads = getActiveThreads(db);
|
|
729
|
-
const activeKeepAlive = allThreads.find(r => r.keepAlive);
|
|
730
|
-
if (activeKeepAlive) {
|
|
731
|
-
setKeepAliveEnabled(true);
|
|
732
|
-
setKeepAliveThreadId(activeKeepAlive.threadId);
|
|
733
|
-
if (isValidKeeperClient(activeKeepAlive.client))
|
|
734
|
-
setKeepAliveClient(activeKeepAlive.client);
|
|
735
|
-
setKeepAliveMaxRetries(activeKeepAlive.maxRetries);
|
|
736
|
-
setKeepAliveCooldownMs(activeKeepAlive.cooldownMs);
|
|
737
|
-
}
|
|
738
|
-
else {
|
|
739
|
-
setKeepAliveEnabled(false);
|
|
740
|
-
}
|
|
741
|
-
// Sync per-thread overrides
|
|
742
|
-
for (const t of allThreads) {
|
|
743
|
-
if (t.keepAlive) {
|
|
744
|
-
setThreadKeepAlive(t.threadId, {
|
|
745
|
-
enabled: true,
|
|
746
|
-
client: t.client,
|
|
747
|
-
maxRetries: t.maxRetries,
|
|
748
|
-
cooldownMs: t.cooldownMs,
|
|
749
|
-
});
|
|
750
|
-
}
|
|
751
|
-
else {
|
|
752
|
-
removeThreadKeepAlive(t.threadId);
|
|
753
|
-
}
|
|
754
|
-
}
|
|
755
|
-
}
|
|
756
|
-
catch (err) {
|
|
757
|
-
log.warn(`[threads] Keep-alive sync failed: ${errorMessage(err)}`);
|
|
758
|
-
}
|
|
759
|
-
}
|
|
760
304
|
//# sourceMappingURL=threads.js.map
|