sensorium-mcp 3.0.102 → 3.1.0-refactor.0
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 +30 -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} +152 -31
- 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/playwright.default.md +6 -6
- package/templates/sensorium-repair.default.md +4 -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
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API — thread creation route handlers: raw registration, root
|
|
3
|
+
* creation (owns Telegram topic creation), and branch creation (with memory
|
|
4
|
+
* fork from the parent root).
|
|
5
|
+
*/
|
|
6
|
+
import { registerThread, getThread, } from "../../data/memory/thread-registry.js";
|
|
7
|
+
import { forkMemory } from "../../data/memory/synthesis.js";
|
|
8
|
+
import { config, getAgentType } from "../../config/index.js";
|
|
9
|
+
import { readBody, safeParseJSON } from "./types.js";
|
|
10
|
+
import { VALID_CLIENTS } 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 { createManagedTopic } from "../../services/topic.service.js";
|
|
15
|
+
import { TelegramClient } from "../../services/telegram.js";
|
|
16
|
+
// ─── POST /api/threads — create/register a thread ──────────────────────────
|
|
17
|
+
export const handleCreateThread = ({ req, json, db }) => {
|
|
18
|
+
void (async () => {
|
|
19
|
+
try {
|
|
20
|
+
const raw = await readBody(req);
|
|
21
|
+
const body = safeParseJSON(raw);
|
|
22
|
+
if (!body || typeof body !== "object") {
|
|
23
|
+
json({ error: "Invalid request body" }, 400);
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
const threadId = body.threadId;
|
|
27
|
+
if (typeof threadId !== "number" ||
|
|
28
|
+
!Number.isFinite(threadId) ||
|
|
29
|
+
!Number.isInteger(threadId) ||
|
|
30
|
+
threadId <= 0) {
|
|
31
|
+
json({ error: "threadId must be a positive integer" }, 400);
|
|
32
|
+
return;
|
|
33
|
+
}
|
|
34
|
+
const name = body.name;
|
|
35
|
+
if (typeof name !== "string" || !name.trim()) {
|
|
36
|
+
json({ error: "name is required" }, 400);
|
|
37
|
+
return;
|
|
38
|
+
}
|
|
39
|
+
const validTypes = ["root", "daily", "branch", "worker"];
|
|
40
|
+
const type = body.type;
|
|
41
|
+
if (typeof type !== "string" || !validTypes.includes(type)) {
|
|
42
|
+
json({ error: `type must be one of: ${validTypes.join(", ")}` }, 400);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const client = typeof body.client === "string" &&
|
|
46
|
+
VALID_CLIENTS.includes(body.client)
|
|
47
|
+
? body.client
|
|
48
|
+
: undefined;
|
|
49
|
+
const keepAlive = typeof body.keepAlive === "boolean" ? body.keepAlive : undefined;
|
|
50
|
+
const workingDirectory = typeof body.workingDirectory === "string" && body.workingDirectory.trim()
|
|
51
|
+
? body.workingDirectory.trim()
|
|
52
|
+
: undefined;
|
|
53
|
+
// Check for duplicate
|
|
54
|
+
const existing = getThread(db, threadId);
|
|
55
|
+
if (existing) {
|
|
56
|
+
json({ error: `Thread ${threadId} already exists` }, 409);
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
const entry = registerThread(db, {
|
|
60
|
+
threadId,
|
|
61
|
+
name: name.trim(),
|
|
62
|
+
type: type,
|
|
63
|
+
rootThreadId: typeof body.rootThreadId === "number" ? body.rootThreadId : undefined,
|
|
64
|
+
badge: typeof body.badge === "string" ? body.badge : undefined,
|
|
65
|
+
client,
|
|
66
|
+
keepAlive,
|
|
67
|
+
workingDirectory,
|
|
68
|
+
});
|
|
69
|
+
json(entry, 201);
|
|
70
|
+
// Sync keepAlive to settings.json for watcher backward compatibility
|
|
71
|
+
if (entry.keepAlive) {
|
|
72
|
+
syncKeepAliveToSettings(db);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
json({ error: errorMessage(err) }, 500);
|
|
77
|
+
}
|
|
78
|
+
})();
|
|
79
|
+
return true;
|
|
80
|
+
};
|
|
81
|
+
// ─── POST /api/threads/create-root — create a fresh topic + root thread ─────
|
|
82
|
+
/**
|
|
83
|
+
* Create a brand-new root thread: opens a Telegram forum topic and registers
|
|
84
|
+
* the thread. Unlike POST /api/threads (which only registers a caller-supplied
|
|
85
|
+
* topic id), this owns topic creation so callers without Telegram access (e.g.
|
|
86
|
+
* the supervisor) can spin up threads. keepAlive + dailyRotation default on for
|
|
87
|
+
* root threads via registerThread.
|
|
88
|
+
*/
|
|
89
|
+
export const handleCreateRoot = ({ req, json, db, ctx }) => {
|
|
90
|
+
void (async () => {
|
|
91
|
+
try {
|
|
92
|
+
const raw = await readBody(req);
|
|
93
|
+
const body = safeParseJSON(raw);
|
|
94
|
+
if (!body || typeof body !== "object") {
|
|
95
|
+
json({ error: "Invalid request body" }, 400);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
const name = typeof body.name === "string" ? body.name.trim() : "";
|
|
99
|
+
if (!name) {
|
|
100
|
+
json({ error: "name is required" }, 400);
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const agentType = resolveAgentType(body.agentType);
|
|
104
|
+
if (agentType === INVALID_AGENT) {
|
|
105
|
+
json({ error: `agentType must be one of: ${VALID_CLIENTS.join(", ")}` }, 400);
|
|
106
|
+
return;
|
|
107
|
+
}
|
|
108
|
+
const workingDirectory = typeof body.workingDirectory === "string" ? body.workingDirectory.trim() : "";
|
|
109
|
+
if (!workingDirectory) {
|
|
110
|
+
json({ error: "workingDirectory is required" }, 400);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
const { TELEGRAM_TOKEN, TELEGRAM_CHAT_ID } = config;
|
|
114
|
+
if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID) {
|
|
115
|
+
json({ error: "Telegram is not configured" }, 500);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const telegram = new TelegramClient(TELEGRAM_TOKEN);
|
|
119
|
+
const threadId = await createManagedTopic(telegram, TELEGRAM_CHAT_ID, name);
|
|
120
|
+
const thread = ctx.threadLifecycle.registerThread(db, {
|
|
121
|
+
threadId,
|
|
122
|
+
name,
|
|
123
|
+
type: "root",
|
|
124
|
+
client: agentType ?? getAgentType(),
|
|
125
|
+
workingDirectory,
|
|
126
|
+
chatId: TELEGRAM_CHAT_ID,
|
|
127
|
+
telegramTopicId: threadId,
|
|
128
|
+
});
|
|
129
|
+
json({ ok: true, threadId, thread }, 201);
|
|
130
|
+
syncKeepAliveToSettings(db);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
json({ error: errorMessage(err) }, 500);
|
|
134
|
+
}
|
|
135
|
+
})();
|
|
136
|
+
return true;
|
|
137
|
+
};
|
|
138
|
+
// ─── POST /api/threads/create-branch — create a fresh topic + branch thread ──
|
|
139
|
+
/**
|
|
140
|
+
* Create a branch thread under an existing root: opens a Telegram forum topic
|
|
141
|
+
* and registers it with type=branch. Working directory and agent type are
|
|
142
|
+
* inherited from the parent root unless overridden.
|
|
143
|
+
*/
|
|
144
|
+
export const handleCreateBranch = ({ req, json, db, ctx }) => {
|
|
145
|
+
void (async () => {
|
|
146
|
+
try {
|
|
147
|
+
const raw = await readBody(req);
|
|
148
|
+
const body = safeParseJSON(raw);
|
|
149
|
+
if (!body || typeof body !== "object") {
|
|
150
|
+
json({ error: "Invalid request body" }, 400);
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
const rootThreadId = body.rootThreadId;
|
|
154
|
+
if (typeof rootThreadId !== "number" ||
|
|
155
|
+
!Number.isInteger(rootThreadId) ||
|
|
156
|
+
rootThreadId <= 0) {
|
|
157
|
+
json({ error: "rootThreadId must be a positive integer" }, 400);
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
const name = typeof body.name === "string" ? body.name.trim() : "";
|
|
161
|
+
if (!name) {
|
|
162
|
+
json({ error: "name is required" }, 400);
|
|
163
|
+
return;
|
|
164
|
+
}
|
|
165
|
+
const parent = getThread(db, rootThreadId);
|
|
166
|
+
if (!parent) {
|
|
167
|
+
json({ error: `Root thread ${rootThreadId} not found` }, 404);
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
if (parent.type === "worker") {
|
|
171
|
+
json({ error: "Cannot branch from a worker thread" }, 400);
|
|
172
|
+
return;
|
|
173
|
+
}
|
|
174
|
+
const agentType = resolveAgentType(body.agentType);
|
|
175
|
+
if (agentType === INVALID_AGENT) {
|
|
176
|
+
json({ error: `agentType must be one of: ${VALID_CLIENTS.join(", ")}` }, 400);
|
|
177
|
+
return;
|
|
178
|
+
}
|
|
179
|
+
const workingDirectoryOverride = typeof body.workingDirectory === "string" && body.workingDirectory.trim()
|
|
180
|
+
? body.workingDirectory.trim()
|
|
181
|
+
: undefined;
|
|
182
|
+
const { TELEGRAM_TOKEN, TELEGRAM_CHAT_ID } = config;
|
|
183
|
+
if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID) {
|
|
184
|
+
json({ error: "Telegram is not configured" }, 500);
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
const telegram = new TelegramClient(TELEGRAM_TOKEN);
|
|
188
|
+
const threadId = await createManagedTopic(telegram, TELEGRAM_CHAT_ID, name);
|
|
189
|
+
const thread = ctx.threadLifecycle.registerThread(db, {
|
|
190
|
+
threadId,
|
|
191
|
+
name,
|
|
192
|
+
type: "branch",
|
|
193
|
+
rootThreadId,
|
|
194
|
+
client: agentType ?? parent.client ?? getAgentType(),
|
|
195
|
+
workingDirectory: workingDirectoryOverride ?? parent.workingDirectory ?? undefined,
|
|
196
|
+
chatId: TELEGRAM_CHAT_ID,
|
|
197
|
+
telegramTopicId: threadId,
|
|
198
|
+
});
|
|
199
|
+
try {
|
|
200
|
+
const fork = forkMemory(db, rootThreadId, threadId);
|
|
201
|
+
log.info(`[create-branch] Forked memory ${rootThreadId} → ${threadId}: ${fork.notesCopied} notes, ${fork.narrativesCopied} narratives, ${fork.episodesCopied} episodes`);
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
log.warn(`[create-branch] Memory fork failed (non-fatal): ${errorMessage(err)}`);
|
|
205
|
+
}
|
|
206
|
+
json({ ok: true, threadId, thread }, 201);
|
|
207
|
+
syncKeepAliveToSettings(db);
|
|
208
|
+
}
|
|
209
|
+
catch (err) {
|
|
210
|
+
json({ error: errorMessage(err) }, 500);
|
|
211
|
+
}
|
|
212
|
+
})();
|
|
213
|
+
return true;
|
|
214
|
+
};
|
|
215
|
+
/** Sentinel returned by resolveAgentType when an explicit agentType is invalid. */
|
|
216
|
+
const INVALID_AGENT = Symbol("invalid-agent");
|
|
217
|
+
/** Validate an optional agentType field: undefined → undefined, valid → the value, invalid → INVALID_AGENT. */
|
|
218
|
+
function resolveAgentType(value) {
|
|
219
|
+
if (value === undefined)
|
|
220
|
+
return undefined;
|
|
221
|
+
if (typeof value === "string" && VALID_CLIENTS.includes(value))
|
|
222
|
+
return value;
|
|
223
|
+
return INVALID_AGENT;
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=threads-create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads-create.js","sourceRoot":"","sources":["../../../src/dashboard/routes/threads-create.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API — shared helpers for the thread route handlers: update-body
|
|
3
|
+
* validation, thread-name enrichment, per-thread MCP server attachment/parsing.
|
|
4
|
+
*/
|
|
5
|
+
import type { ThreadRegistryEntry } from "../../data/memory/thread-registry.js";
|
|
6
|
+
import type { Database } from "../../data/memory/schema.js";
|
|
7
|
+
import { maskThreadMcpServers, type ThreadMcpServer } from "../../config/index.js";
|
|
8
|
+
export declare const VALID_CLIENTS: readonly ["claude", "copilot", "codex", "openai_codex"];
|
|
9
|
+
/** Extract valid update fields from a request body. Returns an error string on validation failure. */
|
|
10
|
+
export declare function buildThreadUpdates(body: Record<string, unknown>): Partial<Pick<ThreadRegistryEntry, "name" | "status" | "keepAlive" | "dailyRotation" | "autonomousMode" | "client" | "maxRetries" | "cooldownMs" | "badge" | "identityPrompt" | "telegramTopicId" | "workingDirectory">> | string;
|
|
11
|
+
/**
|
|
12
|
+
* Enrich thread entries with topic names from topic_registry
|
|
13
|
+
* when the thread name is generic (e.g. "Thread 1234").
|
|
14
|
+
*/
|
|
15
|
+
export declare function enrichThreadNames(db: Database, threads: ThreadRegistryEntry[]): ThreadRegistryEntry[];
|
|
16
|
+
export type ThreadEntryOut = ThreadRegistryEntry & {
|
|
17
|
+
mcpServers: ReturnType<typeof maskThreadMcpServers> | null;
|
|
18
|
+
};
|
|
19
|
+
/** Attach each thread's custom MCP servers (settings.json, not the DB), header values masked. */
|
|
20
|
+
export declare function withThreadMcpServers(threads: ThreadRegistryEntry[]): ThreadEntryOut[];
|
|
21
|
+
/**
|
|
22
|
+
* Coerce a PATCH `mcpServers` body into a validated server map (or null to clear).
|
|
23
|
+
* Shape-checks http-only transport and rejects the header mask sentinel so a
|
|
24
|
+
* round-tripped masked value can never be persisted. Returns an error string on
|
|
25
|
+
* malformed input; deeper rules (reserved names) are enforced by setThreadMcpServers.
|
|
26
|
+
*/
|
|
27
|
+
export declare function parseThreadMcpServersBody(raw: unknown): Record<string, ThreadMcpServer> | null | string;
|
|
28
|
+
//# sourceMappingURL=threads-helpers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads-helpers.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/threads-helpers.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,sCAAsC,CAAC;AAChF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,EAEL,oBAAoB,EAEpB,KAAK,eAAe,EACrB,MAAM,uBAAuB,CAAC;AAG/B,eAAO,MAAM,aAAa,yDAA0D,CAAC;AAErF,sGAAsG;AACtG,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAE3B,OAAO,CACL,IAAI,CACF,mBAAmB,EACjB,MAAM,GACN,QAAQ,GACR,WAAW,GACX,eAAe,GACf,gBAAgB,GAChB,QAAQ,GACR,YAAY,GACZ,YAAY,GACZ,OAAO,GACP,gBAAgB,GAChB,iBAAiB,GACjB,kBAAkB,CACrB,CACF,GACD,MAAM,CAgET;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,QAAQ,EACZ,OAAO,EAAE,mBAAmB,EAAE,GAC7B,mBAAmB,EAAE,CAwBvB;AAED,MAAM,MAAM,cAAc,GAAG,mBAAmB,GAAG;IACjD,UAAU,EAAE,UAAU,CAAC,OAAO,oBAAoB,CAAC,GAAG,IAAI,CAAC;CAC5D,CAAC;AAEF,iGAAiG;AACjG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,mBAAmB,EAAE,GAAG,cAAc,EAAE,CAMrF;AAED;;;;;GAKG;AACH,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,OAAO,GACX,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,GAAG,IAAI,GAAG,MAAM,CA0BjD"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API — shared helpers for the thread route handlers: update-body
|
|
3
|
+
* validation, thread-name enrichment, per-thread MCP server attachment/parsing.
|
|
4
|
+
*/
|
|
5
|
+
import { getAllThreadMcpServers, maskThreadMcpServers, MASK_SENTINEL, } from "../../config/index.js";
|
|
6
|
+
const VALID_STATUSES = ["active", "archived", "expired", "exited"];
|
|
7
|
+
export const VALID_CLIENTS = ["claude", "copilot", "codex", "openai_codex"];
|
|
8
|
+
/** Extract valid update fields from a request body. Returns an error string on validation failure. */
|
|
9
|
+
export function buildThreadUpdates(body) {
|
|
10
|
+
const updates = {};
|
|
11
|
+
if (typeof body.name === "string" && body.name.trim())
|
|
12
|
+
updates.name = body.name.trim();
|
|
13
|
+
if (typeof body.status === "string") {
|
|
14
|
+
if (!VALID_STATUSES.includes(body.status)) {
|
|
15
|
+
return `status must be one of: ${VALID_STATUSES.join(", ")}`;
|
|
16
|
+
}
|
|
17
|
+
updates.status = body.status;
|
|
18
|
+
}
|
|
19
|
+
if (typeof body.keepAlive === "boolean")
|
|
20
|
+
updates.keepAlive = body.keepAlive;
|
|
21
|
+
if (typeof body.dailyRotation === "boolean")
|
|
22
|
+
updates.dailyRotation = body.dailyRotation;
|
|
23
|
+
if (typeof body.autonomousMode === "boolean")
|
|
24
|
+
updates.autonomousMode = body.autonomousMode;
|
|
25
|
+
if (typeof body.client === "string") {
|
|
26
|
+
if (!VALID_CLIENTS.includes(body.client)) {
|
|
27
|
+
return `client must be one of: ${VALID_CLIENTS.join(", ")}`;
|
|
28
|
+
}
|
|
29
|
+
updates.client = body.client;
|
|
30
|
+
}
|
|
31
|
+
if (typeof body.maxRetries === "number") {
|
|
32
|
+
if (!Number.isFinite(body.maxRetries) ||
|
|
33
|
+
!Number.isInteger(body.maxRetries) ||
|
|
34
|
+
body.maxRetries < 0) {
|
|
35
|
+
return "maxRetries must be a non-negative integer";
|
|
36
|
+
}
|
|
37
|
+
updates.maxRetries = body.maxRetries;
|
|
38
|
+
}
|
|
39
|
+
if (typeof body.cooldownMs === "number") {
|
|
40
|
+
if (!Number.isFinite(body.cooldownMs) ||
|
|
41
|
+
!Number.isInteger(body.cooldownMs) ||
|
|
42
|
+
body.cooldownMs < 0) {
|
|
43
|
+
return "cooldownMs must be a non-negative integer";
|
|
44
|
+
}
|
|
45
|
+
updates.cooldownMs = body.cooldownMs;
|
|
46
|
+
}
|
|
47
|
+
if (typeof body.badge === "string")
|
|
48
|
+
updates.badge = body.badge;
|
|
49
|
+
if (typeof body.identityPrompt === "string")
|
|
50
|
+
updates.identityPrompt = body.identityPrompt;
|
|
51
|
+
if (body.identityPrompt === null)
|
|
52
|
+
updates.identityPrompt = null;
|
|
53
|
+
if (typeof body.telegramTopicId === "number" && Number.isFinite(body.telegramTopicId))
|
|
54
|
+
updates.telegramTopicId = body.telegramTopicId;
|
|
55
|
+
if (body.telegramTopicId === null)
|
|
56
|
+
updates.telegramTopicId = null;
|
|
57
|
+
if (typeof body.workingDirectory === "string" && body.workingDirectory.trim())
|
|
58
|
+
updates.workingDirectory = body.workingDirectory.trim();
|
|
59
|
+
if (body.workingDirectory === null)
|
|
60
|
+
updates.workingDirectory = null;
|
|
61
|
+
return updates;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Enrich thread entries with topic names from topic_registry
|
|
65
|
+
* when the thread name is generic (e.g. "Thread 1234").
|
|
66
|
+
*/
|
|
67
|
+
export function enrichThreadNames(db, threads) {
|
|
68
|
+
const genericPattern = /^Thread \d+$/i;
|
|
69
|
+
const needsEnrichment = threads.filter((t) => genericPattern.test(t.name));
|
|
70
|
+
if (needsEnrichment.length === 0)
|
|
71
|
+
return threads;
|
|
72
|
+
try {
|
|
73
|
+
const topicNames = new Map();
|
|
74
|
+
const rows = db.prepare(`SELECT thread_id, name FROM topic_registry`).all();
|
|
75
|
+
for (const r of rows)
|
|
76
|
+
topicNames.set(r.thread_id, r.name);
|
|
77
|
+
return threads.map((t) => {
|
|
78
|
+
if (!genericPattern.test(t.name))
|
|
79
|
+
return t;
|
|
80
|
+
// Check topic_registry by thread_id or telegramTopicId
|
|
81
|
+
const topicName = topicNames.get(t.telegramTopicId ?? t.threadId) ?? topicNames.get(t.threadId);
|
|
82
|
+
if (topicName)
|
|
83
|
+
return { ...t, name: topicName };
|
|
84
|
+
return t;
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return threads; // topic_registry might not exist
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
/** Attach each thread's custom MCP servers (settings.json, not the DB), header values masked. */
|
|
92
|
+
export function withThreadMcpServers(threads) {
|
|
93
|
+
const all = getAllThreadMcpServers();
|
|
94
|
+
return threads.map((t) => {
|
|
95
|
+
const s = all[String(t.threadId)];
|
|
96
|
+
return { ...t, mcpServers: s ? maskThreadMcpServers(s) : null };
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Coerce a PATCH `mcpServers` body into a validated server map (or null to clear).
|
|
101
|
+
* Shape-checks http-only transport and rejects the header mask sentinel so a
|
|
102
|
+
* round-tripped masked value can never be persisted. Returns an error string on
|
|
103
|
+
* malformed input; deeper rules (reserved names) are enforced by setThreadMcpServers.
|
|
104
|
+
*/
|
|
105
|
+
export function parseThreadMcpServersBody(raw) {
|
|
106
|
+
if (raw === null || raw === undefined)
|
|
107
|
+
return null;
|
|
108
|
+
if (typeof raw !== "object" || Array.isArray(raw))
|
|
109
|
+
return "mcpServers must be an object or null";
|
|
110
|
+
const out = {};
|
|
111
|
+
for (const [name, val] of Object.entries(raw)) {
|
|
112
|
+
if (!val || typeof val !== "object" || Array.isArray(val))
|
|
113
|
+
return `mcpServers["${name}"] must be an object`;
|
|
114
|
+
const o = val;
|
|
115
|
+
if (o.type !== "http")
|
|
116
|
+
return `mcpServers["${name}"] must have type "http"`;
|
|
117
|
+
if (typeof o.url !== "string" || !o.url.trim())
|
|
118
|
+
return `mcpServers["${name}"] requires a url`;
|
|
119
|
+
const entry = { type: "http", url: o.url.trim() };
|
|
120
|
+
if (o.headers !== undefined && o.headers !== null) {
|
|
121
|
+
if (typeof o.headers !== "object" || Array.isArray(o.headers))
|
|
122
|
+
return `mcpServers["${name}"].headers must be an object`;
|
|
123
|
+
const headers = {};
|
|
124
|
+
for (const [k, v] of Object.entries(o.headers)) {
|
|
125
|
+
if (typeof v !== "string")
|
|
126
|
+
return `mcpServers["${name}"].headers["${k}"] must be a string`;
|
|
127
|
+
if (v.includes(MASK_SENTINEL))
|
|
128
|
+
return `mcpServers["${name}"].headers["${k}"] still masked — re-enter the value`;
|
|
129
|
+
headers[k] = v;
|
|
130
|
+
}
|
|
131
|
+
if (Object.keys(headers).length > 0)
|
|
132
|
+
entry.headers = headers;
|
|
133
|
+
}
|
|
134
|
+
out[name] = entry;
|
|
135
|
+
}
|
|
136
|
+
return out;
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=threads-helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads-helpers.js","sourceRoot":"","sources":["../../../src/dashboard/routes/threads-helpers.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API — read-only thread route handlers: listing endpoints, single
|
|
3
|
+
* thread lookup, running/heartbeat probes, log digests, and children.
|
|
4
|
+
*/
|
|
5
|
+
import { type RouteHandler, type RouteArgs } from "./types.js";
|
|
6
|
+
export declare const handleGetThreads: RouteHandler;
|
|
7
|
+
export declare const handleGetRootThreads: RouteHandler;
|
|
8
|
+
export declare const handleGetKeepAliveThreads: RouteHandler;
|
|
9
|
+
export declare const handleGetArchivedThreads: RouteHandler;
|
|
10
|
+
/** GET /api/threads/:threadId — get single thread */
|
|
11
|
+
export declare function handleGetThread(args: RouteArgs, threadId: number): boolean;
|
|
12
|
+
/** GET /api/threads/:threadId/running — check if an agent process is alive for this thread */
|
|
13
|
+
export declare function handleGetThreadRunning(args: RouteArgs, threadId: number): boolean;
|
|
14
|
+
/** GET /api/threads/:threadId/heartbeat — last MCP activity timestamp for stuck-process detection */
|
|
15
|
+
export declare function handleGetThreadHeartbeat(args: RouteArgs, threadId: number): boolean;
|
|
16
|
+
/**
|
|
17
|
+
* GET /api/threads/:threadId/logs — a readable digest of the agent's raw stdout.
|
|
18
|
+
*
|
|
19
|
+
* Parses the newest stream-json log file into tail-first turns, then returns a
|
|
20
|
+
* single character window (default 4000, Telegram-sized). Callers page deeper
|
|
21
|
+
* into history with ?offset=; nextOffset/hasMore drive a "next chunk" button.
|
|
22
|
+
*/
|
|
23
|
+
export declare function handleGetThreadLogs(args: RouteArgs, threadId: number): boolean;
|
|
24
|
+
/** GET /api/threads/:threadId/children — get children of a root */
|
|
25
|
+
export declare function handleGetThreadChildren(args: RouteArgs, rootThreadId: number): boolean;
|
|
26
|
+
//# sourceMappingURL=threads-read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads-read.d.ts","sourceRoot":"","sources":["../../../src/dashboard/routes/threads-read.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAUH,OAAO,EAAE,KAAK,YAAY,EAAE,KAAK,SAAS,EAAE,MAAM,YAAY,CAAC;AAW/D,eAAO,MAAM,gBAAgB,EAAE,YAI9B,CAAC;AAIF,eAAO,MAAM,oBAAoB,EAAE,YAGlC,CAAC;AAIF,eAAO,MAAM,yBAAyB,EAAE,YAGvC,CAAC;AAIF,eAAO,MAAM,wBAAwB,EAAE,YAItC,CAAC;AAIF,qDAAqD;AACrD,wBAAgB,eAAe,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAQ1E;AAED,8FAA8F;AAC9F,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAIjF;AAED,qGAAqG;AACrG,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAInF;AA0BD;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CA0B9E;AAED,mEAAmE;AACnE,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,GAAG,OAAO,CAItF"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dashboard API — read-only thread route handlers: listing endpoints, single
|
|
3
|
+
* thread lookup, running/heartbeat probes, log digests, and children.
|
|
4
|
+
*/
|
|
5
|
+
import { getThread, getRootThreads, getKeepAliveThreads, getArchivedThreads, getDashboardThreads, getThreadsByRoot, } from "../../data/memory/thread-registry.js";
|
|
6
|
+
import { enrichThreadNames, withThreadMcpServers } from "./threads-helpers.js";
|
|
7
|
+
import { errorMessage } from "../../lib/utils.js";
|
|
8
|
+
import { isThreadRunning, THREAD_LOGS_DIR } from "../../services/process.service.js";
|
|
9
|
+
import { readThreadHeartbeat } from "../../data/file-storage.js";
|
|
10
|
+
import { parseClaudeStreamLog, renderThreadLog, sliceLogWindow } from "../log-parser.js";
|
|
11
|
+
import { readdirSync, statSync, readFileSync } from "node:fs";
|
|
12
|
+
import { join } from "node:path";
|
|
13
|
+
// ─── GET /api/threads — list all active threads grouped ─────────────────────
|
|
14
|
+
export const handleGetThreads = ({ json, db }) => {
|
|
15
|
+
const threads = withThreadMcpServers(enrichThreadNames(db, getDashboardThreads(db)));
|
|
16
|
+
json({ threads });
|
|
17
|
+
return true;
|
|
18
|
+
};
|
|
19
|
+
// ─── GET /api/threads/roots — list root threads only ────────────────────────
|
|
20
|
+
export const handleGetRootThreads = ({ json, db }) => {
|
|
21
|
+
json({ threads: withThreadMcpServers(enrichThreadNames(db, getRootThreads(db))) });
|
|
22
|
+
return true;
|
|
23
|
+
};
|
|
24
|
+
// ─── GET /api/threads/keepalive — list all threads with keepAlive=true (excl. workers) ─
|
|
25
|
+
export const handleGetKeepAliveThreads = ({ json, db }) => {
|
|
26
|
+
json({ threads: withThreadMcpServers(enrichThreadNames(db, getKeepAliveThreads(db))) });
|
|
27
|
+
return true;
|
|
28
|
+
};
|
|
29
|
+
// ─── GET /api/threads/archived — list archived threads ──────────────────────
|
|
30
|
+
export const handleGetArchivedThreads = ({ json, db }) => {
|
|
31
|
+
const threads = withThreadMcpServers(enrichThreadNames(db, getArchivedThreads(db)));
|
|
32
|
+
json({ threads });
|
|
33
|
+
return true;
|
|
34
|
+
};
|
|
35
|
+
// ─── Dynamic handlers (threadId extracted by caller) ────────────────────────
|
|
36
|
+
/** GET /api/threads/:threadId — get single thread */
|
|
37
|
+
export function handleGetThread(args, threadId) {
|
|
38
|
+
const thread = getThread(args.db, threadId);
|
|
39
|
+
if (thread) {
|
|
40
|
+
args.json(thread);
|
|
41
|
+
}
|
|
42
|
+
else {
|
|
43
|
+
args.json({ error: `Thread ${threadId} not found` }, 404);
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
/** GET /api/threads/:threadId/running — check if an agent process is alive for this thread */
|
|
48
|
+
export function handleGetThreadRunning(args, threadId) {
|
|
49
|
+
const running = isThreadRunning(threadId);
|
|
50
|
+
args.json({ threadId, running });
|
|
51
|
+
return true;
|
|
52
|
+
}
|
|
53
|
+
/** GET /api/threads/:threadId/heartbeat — last MCP activity timestamp for stuck-process detection */
|
|
54
|
+
export function handleGetThreadHeartbeat(args, threadId) {
|
|
55
|
+
const lastActivityMs = readThreadHeartbeat(threadId);
|
|
56
|
+
args.json({ threadId, lastActivityMs });
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
/** Locate the most-recently-modified log file for a thread, or null if none exist. */
|
|
60
|
+
function findLatestThreadLogFile(threadId) {
|
|
61
|
+
let files;
|
|
62
|
+
try {
|
|
63
|
+
files = readdirSync(THREAD_LOGS_DIR);
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
const suffixRe = new RegExp(`_${threadId}_\\d{4}-\\d{2}-\\d{2}\\.jsonl?$`);
|
|
69
|
+
let best = null;
|
|
70
|
+
for (const file of files) {
|
|
71
|
+
if (!suffixRe.test(file))
|
|
72
|
+
continue;
|
|
73
|
+
const full = join(THREAD_LOGS_DIR, file);
|
|
74
|
+
try {
|
|
75
|
+
const mtimeMs = statSync(full).mtimeMs;
|
|
76
|
+
if (!best || mtimeMs > best.mtimeMs)
|
|
77
|
+
best = { path: full, mtimeMs };
|
|
78
|
+
}
|
|
79
|
+
catch {
|
|
80
|
+
/* file vanished between readdir and stat */
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return best?.path ?? null;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* GET /api/threads/:threadId/logs — a readable digest of the agent's raw stdout.
|
|
87
|
+
*
|
|
88
|
+
* Parses the newest stream-json log file into tail-first turns, then returns a
|
|
89
|
+
* single character window (default 4000, Telegram-sized). Callers page deeper
|
|
90
|
+
* into history with ?offset=; nextOffset/hasMore drive a "next chunk" button.
|
|
91
|
+
*/
|
|
92
|
+
export function handleGetThreadLogs(args, threadId) {
|
|
93
|
+
const { json, url } = args;
|
|
94
|
+
const logFile = findLatestThreadLogFile(threadId);
|
|
95
|
+
if (!logFile) {
|
|
96
|
+
json({ threadId, text: "", offset: 0, nextOffset: 0, hasMore: false, totalLength: 0 });
|
|
97
|
+
return true;
|
|
98
|
+
}
|
|
99
|
+
let raw;
|
|
100
|
+
try {
|
|
101
|
+
raw = readFileSync(logFile, "utf-8");
|
|
102
|
+
}
|
|
103
|
+
catch (err) {
|
|
104
|
+
json({ error: errorMessage(err) }, 500);
|
|
105
|
+
return true;
|
|
106
|
+
}
|
|
107
|
+
const rendered = renderThreadLog(parseClaudeStreamLog(raw), true);
|
|
108
|
+
const page = sliceLogWindow(rendered, Number(url.searchParams.get("offset")), Number(url.searchParams.get("limit")));
|
|
109
|
+
json({ threadId, ...page });
|
|
110
|
+
return true;
|
|
111
|
+
}
|
|
112
|
+
/** GET /api/threads/:threadId/children — get children of a root */
|
|
113
|
+
export function handleGetThreadChildren(args, rootThreadId) {
|
|
114
|
+
const children = withThreadMcpServers(getThreadsByRoot(args.db, rootThreadId));
|
|
115
|
+
args.json({ threads: children });
|
|
116
|
+
return true;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=threads-read.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threads-read.js","sourceRoot":"","sources":["../../../src/dashboard/routes/threads-read.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,46 +1,12 @@
|
|
|
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 type
|
|
6
|
-
import { type RouteHandler, type RouteArgs } from "./types.js";
|
|
7
|
-
export declare const handleGetThreads: RouteHandler;
|
|
8
|
-
export declare const handleGetRootThreads: RouteHandler;
|
|
9
|
-
export declare const handleGetKeepAliveThreads: RouteHandler;
|
|
10
|
-
export declare const handleGetArchivedThreads: RouteHandler;
|
|
7
|
+
import { type RouteArgs } from "./types.js";
|
|
11
8
|
export declare function handleUnarchiveThread(args: RouteArgs, threadId: number): boolean;
|
|
12
9
|
export declare function handleGenerateSummary(args: RouteArgs, threadId: number): boolean;
|
|
13
|
-
export declare const handleCreateThread: RouteHandler;
|
|
14
|
-
/**
|
|
15
|
-
* Create a brand-new root thread: opens a Telegram forum topic and registers
|
|
16
|
-
* the thread. Unlike POST /api/threads (which only registers a caller-supplied
|
|
17
|
-
* topic id), this owns topic creation so callers without Telegram access (e.g.
|
|
18
|
-
* the supervisor) can spin up threads. keepAlive + dailyRotation default on for
|
|
19
|
-
* root threads via registerThread.
|
|
20
|
-
*/
|
|
21
|
-
export declare const handleCreateRoot: RouteHandler;
|
|
22
|
-
/**
|
|
23
|
-
* Create a branch thread under an existing root: opens a Telegram forum topic
|
|
24
|
-
* and registers it with type=branch. Working directory and agent type are
|
|
25
|
-
* inherited from the parent root unless overridden.
|
|
26
|
-
*/
|
|
27
|
-
export declare const handleCreateBranch: RouteHandler;
|
|
28
|
-
/** GET /api/threads/:threadId — get single thread */
|
|
29
|
-
export declare function handleGetThread(args: RouteArgs, threadId: number): boolean;
|
|
30
|
-
/** GET /api/threads/:threadId/running — check if an agent process is alive for this thread */
|
|
31
|
-
export declare function handleGetThreadRunning(args: RouteArgs, threadId: number): boolean;
|
|
32
|
-
/** GET /api/threads/:threadId/heartbeat — last MCP activity timestamp for stuck-process detection */
|
|
33
|
-
export declare function handleGetThreadHeartbeat(args: RouteArgs, threadId: number): boolean;
|
|
34
|
-
/**
|
|
35
|
-
* GET /api/threads/:threadId/logs — a readable digest of the agent's raw stdout.
|
|
36
|
-
*
|
|
37
|
-
* Parses the newest stream-json log file into tail-first turns, then returns a
|
|
38
|
-
* single character window (default 4000, Telegram-sized). Callers page deeper
|
|
39
|
-
* into history with ?offset=; nextOffset/hasMore drive a "next chunk" button.
|
|
40
|
-
*/
|
|
41
|
-
export declare function handleGetThreadLogs(args: RouteArgs, threadId: number): boolean;
|
|
42
|
-
/** GET /api/threads/:threadId/children — get children of a root */
|
|
43
|
-
export declare function handleGetThreadChildren(args: RouteArgs, rootThreadId: number): boolean;
|
|
44
10
|
/** PATCH /api/threads/:threadId — update a thread */
|
|
45
11
|
export declare function handleUpdateThread(args: RouteArgs, threadId: number): boolean;
|
|
46
12
|
/** DELETE /api/threads/:threadId — archive or delete a thread */
|
|
@@ -49,9 +15,4 @@ export declare function handleDeleteThread(args: RouteArgs, threadId: number): b
|
|
|
49
15
|
export declare function handleStartThread(args: RouteArgs, threadId: number): boolean;
|
|
50
16
|
/** POST /api/threads/:threadId/convert-to-root — convert a branch thread to a root thread */
|
|
51
17
|
export declare function handleConvertToRoot(args: RouteArgs, threadId: number): boolean;
|
|
52
|
-
/**
|
|
53
|
-
* Sync thread_registry keepAlive settings to settings.json for watcher backward compatibility.
|
|
54
|
-
* The watcher's readKeeperSettingsFromFile() reads settings.json during startup before the MCP server is ready.
|
|
55
|
-
*/
|
|
56
|
-
export declare function syncKeepAliveToSettings(db: Database): void;
|
|
57
18
|
//# sourceMappingURL=threads.d.ts.map
|