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
package/dist/config.js
DELETED
|
@@ -1,841 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Centralized configuration — reads environment variables at startup
|
|
3
|
-
* and exports validated values used throughout the codebase.
|
|
4
|
-
*/
|
|
5
|
-
import { createRequire } from "node:module";
|
|
6
|
-
import { randomUUID } from "node:crypto";
|
|
7
|
-
import { chmodSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
8
|
-
import { homedir } from "node:os";
|
|
9
|
-
import { join } from "node:path";
|
|
10
|
-
import { log } from "./logger.js";
|
|
11
|
-
import { FILES_DIR } from "./data/file-storage.js";
|
|
12
|
-
import { getThread, getAllThreads, updateThread } from "./data/memory/thread-registry.js";
|
|
13
|
-
const esmRequire = createRequire(import.meta.url);
|
|
14
|
-
const { version: PKG_VERSION } = esmRequire("../package.json");
|
|
15
|
-
// ─── Environment variables ──────────────────────────────────────────────────
|
|
16
|
-
const TELEGRAM_TOKEN = process.env.TELEGRAM_TOKEN ?? "";
|
|
17
|
-
const TELEGRAM_CHAT_ID = process.env.TELEGRAM_CHAT_ID ?? "";
|
|
18
|
-
const OPENAI_API_KEY = process.env.OPENAI_API_KEY ?? "";
|
|
19
|
-
const VOICE_ANALYSIS_URL = process.env.VOICE_ANALYSIS_URL ?? "";
|
|
20
|
-
const AUTONOMOUS_MODE = process.env.AUTONOMOUS_MODE === "true";
|
|
21
|
-
const DEFAULT_WAIT_TIMEOUT_MINUTES = 1440;
|
|
22
|
-
const envWaitTimeoutMinutes = parseInt(process.env.WAIT_TIMEOUT_MINUTES ?? "", 10);
|
|
23
|
-
const ENV_WAIT_TIMEOUT = Number.isFinite(envWaitTimeoutMinutes) ? envWaitTimeoutMinutes : undefined;
|
|
24
|
-
const rawDmnActivationHours = parseFloat(process.env.DMN_ACTIVATION_HOURS ?? "");
|
|
25
|
-
const DMN_ACTIVATION_HOURS = Math.max(0.5, Number.isFinite(rawDmnActivationHours) ? rawDmnActivationHours : 4);
|
|
26
|
-
// ─── Validation ─────────────────────────────────────────────────────────────
|
|
27
|
-
if (!TELEGRAM_TOKEN || !TELEGRAM_CHAT_ID) {
|
|
28
|
-
log.error("TELEGRAM_TOKEN and TELEGRAM_CHAT_ID environment variables are required.");
|
|
29
|
-
process.exit(1);
|
|
30
|
-
}
|
|
31
|
-
if (!OPENAI_API_KEY) {
|
|
32
|
-
log.warn("OPENAI_API_KEY not set — voice messages will not be transcribed.");
|
|
33
|
-
}
|
|
34
|
-
if (VOICE_ANALYSIS_URL) {
|
|
35
|
-
log.info(`Voice analysis service configured: ${VOICE_ANALYSIS_URL}`);
|
|
36
|
-
}
|
|
37
|
-
if (process.env.TRANSCRIPTION_BASE_URL) {
|
|
38
|
-
const model = process.env.TRANSCRIPTION_MODEL || "whisper-1";
|
|
39
|
-
log.info(`Transcription provider configured: ${process.env.TRANSCRIPTION_BASE_URL} (model: ${model})`);
|
|
40
|
-
}
|
|
41
|
-
// ─── Templates directory ────────────────────────────────────────────────────
|
|
42
|
-
export const TEMPLATES_DIR = join(homedir(), ".remote-copilot-mcp", "templates");
|
|
43
|
-
mkdirSync(TEMPLATES_DIR, { recursive: true });
|
|
44
|
-
/** The single source of truth for the default agent type when none is configured. */
|
|
45
|
-
export const DEFAULT_AGENT_TYPE = "claude";
|
|
46
|
-
export const VALID_AGENT_TYPES = [
|
|
47
|
-
"copilot",
|
|
48
|
-
"claude",
|
|
49
|
-
"codex", "openai_codex",
|
|
50
|
-
"fable",
|
|
51
|
-
];
|
|
52
|
-
export function isValidAgentType(v) {
|
|
53
|
-
return typeof v === "string" && VALID_AGENT_TYPES.includes(v);
|
|
54
|
-
}
|
|
55
|
-
const SETTINGS_PATH = join(homedir(), ".remote-copilot-mcp", "settings.json");
|
|
56
|
-
const SETTINGS_TMP_PATH = SETTINGS_PATH + ".tmp";
|
|
57
|
-
/** Atomically persist settings: write to .tmp then rename over the original. */
|
|
58
|
-
function atomicWriteSettings(settings) {
|
|
59
|
-
writeFileSync(SETTINGS_TMP_PATH, JSON.stringify(settings, null, 2), "utf-8");
|
|
60
|
-
renameSync(SETTINGS_TMP_PATH, SETTINGS_PATH);
|
|
61
|
-
// settings.json holds MCP auth headers/tokens — restrict to owner (no-op on
|
|
62
|
-
// Windows NTFS, effective on POSIX where the server may also run).
|
|
63
|
-
try {
|
|
64
|
-
chmodSync(SETTINGS_PATH, 0o600);
|
|
65
|
-
}
|
|
66
|
-
catch { /* best-effort */ }
|
|
67
|
-
}
|
|
68
|
-
/** Read and parse the settings file, returning an empty object on any failure. */
|
|
69
|
-
function readSettings() {
|
|
70
|
-
try {
|
|
71
|
-
return JSON.parse(readFileSync(SETTINGS_PATH, "utf-8"));
|
|
72
|
-
}
|
|
73
|
-
catch (err) {
|
|
74
|
-
if (err?.code !== "ENOENT")
|
|
75
|
-
log.warn(`[config] Failed to read settings: ${err}`);
|
|
76
|
-
return {};
|
|
77
|
-
}
|
|
78
|
-
}
|
|
79
|
-
/** Read settings, apply a mutator, and atomically persist the result. */
|
|
80
|
-
function updateSettings(mutator) {
|
|
81
|
-
const settings = readSettings();
|
|
82
|
-
mutator(settings);
|
|
83
|
-
atomicWriteSettings(settings);
|
|
84
|
-
}
|
|
85
|
-
export function getAgentType() {
|
|
86
|
-
const t = readSettings().agentType;
|
|
87
|
-
return isValidAgentType(t) ? t : DEFAULT_AGENT_TYPE;
|
|
88
|
-
}
|
|
89
|
-
export function setAgentType(type) {
|
|
90
|
-
updateSettings(s => { s.agentType = type; });
|
|
91
|
-
}
|
|
92
|
-
// ─── Imported (external) skills ─────────────────────────────────────────────
|
|
93
|
-
// Skills that live OUTSIDE Sensorium (e.g. a separate git repo of sensitive
|
|
94
|
-
// skills) are registered here by absolute path + format, never copied. The
|
|
95
|
-
// skill loader reads them in place, so a `git pull` in the source repo updates
|
|
96
|
-
// them with no re-import.
|
|
97
|
-
export const SKILL_TYPES = ["sensorium", "claude", "copilot"];
|
|
98
|
-
export function isValidSkillType(v) {
|
|
99
|
-
return typeof v === "string" && SKILL_TYPES.includes(v);
|
|
100
|
-
}
|
|
101
|
-
/** All registered external skills. Malformed entries are dropped. */
|
|
102
|
-
export function getImportedSkills() {
|
|
103
|
-
const raw = readSettings().importedSkills;
|
|
104
|
-
if (!Array.isArray(raw))
|
|
105
|
-
return [];
|
|
106
|
-
return raw.filter((e) => !!e && typeof e.path === "string" && isValidSkillType(e.type));
|
|
107
|
-
}
|
|
108
|
-
/** Register an external skill by path+type. Idempotent on path (updates type). */
|
|
109
|
-
export function addImportedSkill(skill) {
|
|
110
|
-
updateSettings(s => {
|
|
111
|
-
const list = getImportedSkills().filter(e => e.path !== skill.path);
|
|
112
|
-
list.push(skill);
|
|
113
|
-
s.importedSkills = list;
|
|
114
|
-
});
|
|
115
|
-
}
|
|
116
|
-
/** Unregister an external skill by path. */
|
|
117
|
-
export function removeImportedSkill(path) {
|
|
118
|
-
updateSettings(s => {
|
|
119
|
-
s.importedSkills = getImportedSkills().filter(e => e.path !== path);
|
|
120
|
-
});
|
|
121
|
-
}
|
|
122
|
-
let _threadDbGetter = null;
|
|
123
|
-
/** Wire up the memory DB accessor so per-thread lookups (agent type, autonomous mode) work. */
|
|
124
|
-
export function setThreadDb(getter) {
|
|
125
|
-
_threadDbGetter = getter;
|
|
126
|
-
}
|
|
127
|
-
// ─── Per-thread agent-type overrides ────────────────────────────────────────
|
|
128
|
-
/**
|
|
129
|
-
* Persists a per-thread agent-type override into thread_registry.client.
|
|
130
|
-
* Returns true if the row was updated, false if no thread exists or the DB
|
|
131
|
-
* accessor is not yet wired up.
|
|
132
|
-
*/
|
|
133
|
-
export function setThreadAgentType(threadId, agentType) {
|
|
134
|
-
if (!_threadDbGetter) {
|
|
135
|
-
log.warn(`[config] setThreadAgentType(${threadId}, ${agentType}): DB not initialized — skipping`);
|
|
136
|
-
return false;
|
|
137
|
-
}
|
|
138
|
-
try {
|
|
139
|
-
return updateThread(_threadDbGetter(), threadId, { client: agentType });
|
|
140
|
-
}
|
|
141
|
-
catch (err) {
|
|
142
|
-
log.warn(`[config] setThreadAgentType DB write failed: ${err}`);
|
|
143
|
-
return false;
|
|
144
|
-
}
|
|
145
|
-
}
|
|
146
|
-
/** Returns the conversation mode for a thread, defaulting to "concise". */
|
|
147
|
-
export function getThreadConversationMode(threadId) {
|
|
148
|
-
const map = readSettings().threadConversationModes;
|
|
149
|
-
if (map) {
|
|
150
|
-
const m = map[String(threadId)];
|
|
151
|
-
if (m === "concise" || m === "voice")
|
|
152
|
-
return m;
|
|
153
|
-
}
|
|
154
|
-
return "concise"; // concise is the default
|
|
155
|
-
}
|
|
156
|
-
/** Persists a per-thread conversation mode. */
|
|
157
|
-
export function setThreadConversationMode(threadId, mode) {
|
|
158
|
-
updateSettings(s => {
|
|
159
|
-
const map = (s.threadConversationModes ?? {});
|
|
160
|
-
map[String(threadId)] = mode;
|
|
161
|
-
s.threadConversationModes = map;
|
|
162
|
-
});
|
|
163
|
-
}
|
|
164
|
-
/** Returns all per-thread agent-type overrides from thread_registry.client. */
|
|
165
|
-
export function getAllThreadAgentTypes() {
|
|
166
|
-
if (!_threadDbGetter)
|
|
167
|
-
return {};
|
|
168
|
-
try {
|
|
169
|
-
const result = {};
|
|
170
|
-
for (const t of getAllThreads(_threadDbGetter())) {
|
|
171
|
-
if (isValidAgentType(t.client))
|
|
172
|
-
result[String(t.threadId)] = t.client;
|
|
173
|
-
}
|
|
174
|
-
return result;
|
|
175
|
-
}
|
|
176
|
-
catch (err) {
|
|
177
|
-
log.debug(`[config] getAllThreadAgentTypes DB lookup failed: ${err}`);
|
|
178
|
-
return {};
|
|
179
|
-
}
|
|
180
|
-
}
|
|
181
|
-
/**
|
|
182
|
-
* Returns the effective agent type for a given thread.
|
|
183
|
-
* Per-thread thread_registry.client takes precedence over the global default.
|
|
184
|
-
*/
|
|
185
|
-
export function getEffectiveAgentType(threadId) {
|
|
186
|
-
if (threadId !== undefined && _threadDbGetter) {
|
|
187
|
-
try {
|
|
188
|
-
const entry = getThread(_threadDbGetter(), threadId);
|
|
189
|
-
if (entry && isValidAgentType(entry.client))
|
|
190
|
-
return entry.client;
|
|
191
|
-
}
|
|
192
|
-
catch (err) {
|
|
193
|
-
log.debug(`[config] getEffectiveAgentType DB lookup failed: ${err}`);
|
|
194
|
-
}
|
|
195
|
-
}
|
|
196
|
-
return getAgentType();
|
|
197
|
-
}
|
|
198
|
-
// ─── Per-thread autonomous mode ──────────────────────────────────────────────
|
|
199
|
-
/**
|
|
200
|
-
* Returns the effective autonomous mode for a given thread.
|
|
201
|
-
* Per-thread DB value takes precedence over the global AUTONOMOUS_MODE env var.
|
|
202
|
-
*/
|
|
203
|
-
export function getEffectiveAutonomousMode(threadId) {
|
|
204
|
-
if (threadId !== undefined && _threadDbGetter) {
|
|
205
|
-
try {
|
|
206
|
-
const threadEntry = getThread(_threadDbGetter(), threadId);
|
|
207
|
-
if (threadEntry != null)
|
|
208
|
-
return threadEntry.autonomousMode ?? AUTONOMOUS_MODE;
|
|
209
|
-
}
|
|
210
|
-
catch (err) {
|
|
211
|
-
log.debug(`[config] getEffectiveAutonomousMode DB lookup failed: ${err}`);
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
return AUTONOMOUS_MODE;
|
|
215
|
-
}
|
|
216
|
-
function parseMcpServers(raw) {
|
|
217
|
-
return (raw && typeof raw === "object" && !Array.isArray(raw))
|
|
218
|
-
? raw : {};
|
|
219
|
-
}
|
|
220
|
-
/** Returns all user-configured MCP servers (excludes auto-injected sensorium). */
|
|
221
|
-
export function getMcpServers() {
|
|
222
|
-
return parseMcpServers(readSettings().mcpServers);
|
|
223
|
-
}
|
|
224
|
-
/** Overwrites the entire MCP servers map. */
|
|
225
|
-
export function setMcpServers(servers) {
|
|
226
|
-
updateSettings(s => { s.mcpServers = servers; });
|
|
227
|
-
}
|
|
228
|
-
/** Add or update a single MCP server by name. */
|
|
229
|
-
export function addMcpServer(name, config) {
|
|
230
|
-
if (!name || name === "sensorium-mcp")
|
|
231
|
-
throw new Error(`Invalid MCP server name: "${name}"`);
|
|
232
|
-
if (config.type === "stdio" && !config.command)
|
|
233
|
-
throw new Error("Stdio MCP server requires a command");
|
|
234
|
-
if (config.type === "http" && !config.url)
|
|
235
|
-
throw new Error("HTTP MCP server requires a url");
|
|
236
|
-
updateSettings(s => {
|
|
237
|
-
const existing = parseMcpServers(s.mcpServers);
|
|
238
|
-
existing[name] = config;
|
|
239
|
-
s.mcpServers = existing;
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
/** Remove an MCP server by name. Returns true if it existed. */
|
|
243
|
-
export function removeMcpServer(name) {
|
|
244
|
-
let existed = false;
|
|
245
|
-
updateSettings(s => {
|
|
246
|
-
const servers = parseMcpServers(s.mcpServers);
|
|
247
|
-
if (name in servers) {
|
|
248
|
-
delete servers[name];
|
|
249
|
-
existed = true;
|
|
250
|
-
}
|
|
251
|
-
s.mcpServers = servers;
|
|
252
|
-
});
|
|
253
|
-
return existed;
|
|
254
|
-
}
|
|
255
|
-
// ─── Per-thread custom MCP servers (universal, agent-agnostic) ──────────────
|
|
256
|
-
//
|
|
257
|
-
// The operator can attach arbitrary MCP servers to a single thread via the
|
|
258
|
-
// dashboard. Stored in settings.json keyed by threadId (same pattern as
|
|
259
|
-
// threadConversationModes / threadKeepAlive — no DB schema change), then merged
|
|
260
|
-
// on top of the global mcpServers map at spawn. Sensorium knows nothing about
|
|
261
|
-
// what any server does (RAG, search, whatever) — it's just an { type: "http",
|
|
262
|
-
// url, headers } entry, e.g. an Authorization: Bearer <token> that selects a
|
|
263
|
-
// corpus on some external host.
|
|
264
|
-
//
|
|
265
|
-
// HARD INVARIANTS (security):
|
|
266
|
-
// • HTTP-ONLY. A per-thread `stdio` entry would spawn an operator-supplied
|
|
267
|
-
// binary at agent-spawn time = arbitrary code execution, so stdio is
|
|
268
|
-
// rejected on write and never parsed back out.
|
|
269
|
-
// • RESERVED names can't be overridden — `sensorium-mcp` is the agent's own
|
|
270
|
-
// control channel (clobbering it severs the orchestrator link).
|
|
271
|
-
/** MCP server names a per-thread entry may never use. */
|
|
272
|
-
export const RESERVED_MCP_NAMES = ["sensorium-mcp", "rag"];
|
|
273
|
-
/**
|
|
274
|
-
* Header names must be plain HTTP tokens. This is a hard security boundary, not
|
|
275
|
-
* cosmetics: Codex renders headers as dotted TOML `-c mcp_servers.X.http_headers.<key>`
|
|
276
|
-
* overrides, so a key containing `.`, `"`, `=`, `[` or whitespace could break out
|
|
277
|
-
* of the header path and inject arbitrary config (e.g. re-point sensorium-mcp or
|
|
278
|
-
* add an stdio server), defeating the reserved-name and http-only invariants.
|
|
279
|
-
*/
|
|
280
|
-
const SAFE_HEADER_NAME = /^[A-Za-z0-9-]+$/;
|
|
281
|
-
/** Parse one raw entry into a validated http-only ThreadMcpServer, or null if invalid. */
|
|
282
|
-
function parseThreadMcpServer(raw) {
|
|
283
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
284
|
-
return null;
|
|
285
|
-
const o = raw;
|
|
286
|
-
if (o.type !== "http" || typeof o.url !== "string" || o.url.length === 0)
|
|
287
|
-
return null;
|
|
288
|
-
const entry = { type: "http", url: o.url };
|
|
289
|
-
if (o.headers && typeof o.headers === "object" && !Array.isArray(o.headers)) {
|
|
290
|
-
const headers = {};
|
|
291
|
-
for (const [k, v] of Object.entries(o.headers)) {
|
|
292
|
-
if (typeof v === "string" && SAFE_HEADER_NAME.test(k))
|
|
293
|
-
headers[k] = v;
|
|
294
|
-
}
|
|
295
|
-
if (Object.keys(headers).length > 0)
|
|
296
|
-
entry.headers = headers;
|
|
297
|
-
}
|
|
298
|
-
return entry;
|
|
299
|
-
}
|
|
300
|
-
/** Parse a per-thread server map, dropping reserved names and non-http/invalid entries. */
|
|
301
|
-
function parseThreadMcpServers(raw) {
|
|
302
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
303
|
-
return {};
|
|
304
|
-
const result = {};
|
|
305
|
-
for (const [name, val] of Object.entries(raw)) {
|
|
306
|
-
if (!name || RESERVED_MCP_NAMES.includes(name))
|
|
307
|
-
continue;
|
|
308
|
-
const parsed = parseThreadMcpServer(val);
|
|
309
|
-
if (parsed)
|
|
310
|
-
result[name] = parsed;
|
|
311
|
-
}
|
|
312
|
-
return result;
|
|
313
|
-
}
|
|
314
|
-
/** Returns a thread's custom MCP servers (http-only, reserved names excluded). */
|
|
315
|
-
export function getThreadMcpServers(threadId) {
|
|
316
|
-
const map = readSettings().threadMcpServers;
|
|
317
|
-
return parseThreadMcpServers(map?.[String(threadId)]);
|
|
318
|
-
}
|
|
319
|
-
/**
|
|
320
|
-
* Replace a thread's custom MCP servers. Pass null/empty to clear.
|
|
321
|
-
* Validates http-only transport and rejects reserved names; throws on violation
|
|
322
|
-
* so the dashboard can surface a 400.
|
|
323
|
-
*/
|
|
324
|
-
/**
|
|
325
|
-
* Validate a caller-supplied server map against the per-thread invariants
|
|
326
|
-
* (http-only, non-reserved name, safe header names). Throws on any violation so
|
|
327
|
-
* the dashboard can surface a 400. Shared by per-thread MCP writes and agent
|
|
328
|
-
* templates (which carry the same kind of map).
|
|
329
|
-
*/
|
|
330
|
-
function sanitizeThreadMcpServers(servers) {
|
|
331
|
-
const clean = {};
|
|
332
|
-
if (servers) {
|
|
333
|
-
for (const [name, cfg] of Object.entries(servers)) {
|
|
334
|
-
if (!name)
|
|
335
|
-
throw new Error("MCP server name is required");
|
|
336
|
-
if (RESERVED_MCP_NAMES.includes(name))
|
|
337
|
-
throw new Error(`MCP server name "${name}" is reserved`);
|
|
338
|
-
if (!cfg || cfg.type !== "http")
|
|
339
|
-
throw new Error(`MCP server "${name}" must be http (stdio is not allowed per-thread)`);
|
|
340
|
-
if (!cfg.url)
|
|
341
|
-
throw new Error(`MCP server "${name}" requires a url`);
|
|
342
|
-
const entry = { type: "http", url: cfg.url };
|
|
343
|
-
if (cfg.headers && Object.keys(cfg.headers).length > 0) {
|
|
344
|
-
for (const [k, v] of Object.entries(cfg.headers)) {
|
|
345
|
-
if (!SAFE_HEADER_NAME.test(k))
|
|
346
|
-
throw new Error(`MCP server "${name}" header name "${k}" is invalid (letters, digits, hyphen only)`);
|
|
347
|
-
if (typeof v === "string" && v.includes(MASK_SENTINEL))
|
|
348
|
-
throw new Error(`MCP server "${name}" header "${k}" is still masked — re-enter the value`);
|
|
349
|
-
}
|
|
350
|
-
entry.headers = cfg.headers;
|
|
351
|
-
}
|
|
352
|
-
clean[name] = entry;
|
|
353
|
-
}
|
|
354
|
-
}
|
|
355
|
-
return clean;
|
|
356
|
-
}
|
|
357
|
-
/** Header value the dashboard shows in place of a stored secret; must never be persisted back. */
|
|
358
|
-
export const MASK_SENTINEL = "••••";
|
|
359
|
-
/** Mask header values so the dashboard shows which headers exist without leaking the secret. */
|
|
360
|
-
export function maskThreadMcpServers(servers) {
|
|
361
|
-
const out = {};
|
|
362
|
-
for (const [name, cfg] of Object.entries(servers)) {
|
|
363
|
-
const masked = { type: "http", url: cfg.url };
|
|
364
|
-
if (cfg.headers && Object.keys(cfg.headers).length > 0) {
|
|
365
|
-
masked.headers = {};
|
|
366
|
-
for (const k of Object.keys(cfg.headers))
|
|
367
|
-
masked.headers[k] = MASK_SENTINEL;
|
|
368
|
-
}
|
|
369
|
-
out[name] = masked;
|
|
370
|
-
}
|
|
371
|
-
return out;
|
|
372
|
-
}
|
|
373
|
-
export function setThreadMcpServers(threadId, servers) {
|
|
374
|
-
const clean = sanitizeThreadMcpServers(servers);
|
|
375
|
-
updateSettings(s => {
|
|
376
|
-
const map = (s.threadMcpServers ?? {});
|
|
377
|
-
if (Object.keys(clean).length > 0)
|
|
378
|
-
map[String(threadId)] = clean;
|
|
379
|
-
else
|
|
380
|
-
delete map[String(threadId)];
|
|
381
|
-
s.threadMcpServers = map;
|
|
382
|
-
});
|
|
383
|
-
}
|
|
384
|
-
/** Remove a thread's custom MCP servers entirely (called on hard-delete). */
|
|
385
|
-
export function deleteThreadMcpServers(threadId) {
|
|
386
|
-
updateSettings(s => {
|
|
387
|
-
const map = (s.threadMcpServers ?? {});
|
|
388
|
-
if (String(threadId) in map) {
|
|
389
|
-
delete map[String(threadId)];
|
|
390
|
-
s.threadMcpServers = map;
|
|
391
|
-
}
|
|
392
|
-
});
|
|
393
|
-
}
|
|
394
|
-
/** All per-thread MCP servers (for dashboard enrichment), reserved/invalid excluded. */
|
|
395
|
-
export function getAllThreadMcpServers() {
|
|
396
|
-
const map = readSettings().threadMcpServers;
|
|
397
|
-
if (!map || typeof map !== "object")
|
|
398
|
-
return {};
|
|
399
|
-
const result = {};
|
|
400
|
-
for (const [tid, val] of Object.entries(map)) {
|
|
401
|
-
const parsed = parseThreadMcpServers(val);
|
|
402
|
-
if (Object.keys(parsed).length > 0)
|
|
403
|
-
result[tid] = parsed;
|
|
404
|
-
}
|
|
405
|
-
return result;
|
|
406
|
-
}
|
|
407
|
-
/** Parse+validate one stored template, or null if malformed. */
|
|
408
|
-
function parseAgentTemplate(raw) {
|
|
409
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
410
|
-
return null;
|
|
411
|
-
const o = raw;
|
|
412
|
-
if (typeof o.id !== "string" || !o.id)
|
|
413
|
-
return null;
|
|
414
|
-
if (typeof o.name !== "string" || !o.name)
|
|
415
|
-
return null;
|
|
416
|
-
if (!isValidAgentType(o.client))
|
|
417
|
-
return null;
|
|
418
|
-
if (typeof o.workingDirectory !== "string" || !o.workingDirectory)
|
|
419
|
-
return null;
|
|
420
|
-
const tpl = { id: o.id, name: o.name, client: o.client, workingDirectory: o.workingDirectory };
|
|
421
|
-
if (typeof o.systemPrompt === "string" && o.systemPrompt.length > 0)
|
|
422
|
-
tpl.systemPrompt = o.systemPrompt;
|
|
423
|
-
const mcp = parseThreadMcpServers(o.mcpServers);
|
|
424
|
-
if (Object.keys(mcp).length > 0)
|
|
425
|
-
tpl.mcpServers = mcp;
|
|
426
|
-
return tpl;
|
|
427
|
-
}
|
|
428
|
-
/** All stored agent templates (malformed entries dropped). */
|
|
429
|
-
export function getAgentTemplates() {
|
|
430
|
-
const raw = readSettings().agentTemplates;
|
|
431
|
-
if (!Array.isArray(raw))
|
|
432
|
-
return [];
|
|
433
|
-
const result = [];
|
|
434
|
-
for (const item of raw) {
|
|
435
|
-
const parsed = parseAgentTemplate(item);
|
|
436
|
-
if (parsed)
|
|
437
|
-
result.push(parsed);
|
|
438
|
-
}
|
|
439
|
-
return result;
|
|
440
|
-
}
|
|
441
|
-
/** Single template by id, or null. */
|
|
442
|
-
export function getAgentTemplate(id) {
|
|
443
|
-
return getAgentTemplates().find(t => t.id === id) ?? null;
|
|
444
|
-
}
|
|
445
|
-
/**
|
|
446
|
-
* Upsert a template. A blank id creates a new one (server-assigned id); an
|
|
447
|
-
* existing id replaces in place. Validates required fields and the MCP map;
|
|
448
|
-
* throws on violation so the dashboard can surface a 400.
|
|
449
|
-
*/
|
|
450
|
-
export function saveAgentTemplate(input) {
|
|
451
|
-
const name = input.name?.trim();
|
|
452
|
-
if (!name)
|
|
453
|
-
throw new Error("name is required");
|
|
454
|
-
if (!isValidAgentType(input.client))
|
|
455
|
-
throw new Error(`client must be one of: ${VALID_AGENT_TYPES.join(", ")}`);
|
|
456
|
-
const workingDirectory = input.workingDirectory?.trim();
|
|
457
|
-
if (!workingDirectory)
|
|
458
|
-
throw new Error("workingDirectory is required");
|
|
459
|
-
const mcpServers = sanitizeThreadMcpServers(input.mcpServers ?? undefined);
|
|
460
|
-
const tpl = {
|
|
461
|
-
id: input.id?.trim() ? input.id.trim() : `tpl_${randomUUID().replace(/-/g, "").slice(0, 12)}`,
|
|
462
|
-
name,
|
|
463
|
-
client: input.client,
|
|
464
|
-
workingDirectory,
|
|
465
|
-
};
|
|
466
|
-
const systemPrompt = typeof input.systemPrompt === "string" ? input.systemPrompt.trim() : "";
|
|
467
|
-
if (systemPrompt)
|
|
468
|
-
tpl.systemPrompt = systemPrompt;
|
|
469
|
-
if (Object.keys(mcpServers).length > 0)
|
|
470
|
-
tpl.mcpServers = mcpServers;
|
|
471
|
-
updateSettings(s => {
|
|
472
|
-
const list = getAgentTemplates();
|
|
473
|
-
const idx = list.findIndex(t => t.id === tpl.id);
|
|
474
|
-
if (idx >= 0)
|
|
475
|
-
list[idx] = tpl;
|
|
476
|
-
else
|
|
477
|
-
list.push(tpl);
|
|
478
|
-
s.agentTemplates = list;
|
|
479
|
-
});
|
|
480
|
-
return tpl;
|
|
481
|
-
}
|
|
482
|
-
/** Remove a template by id. Returns true if one was removed. */
|
|
483
|
-
export function deleteAgentTemplate(id) {
|
|
484
|
-
const before = getAgentTemplates();
|
|
485
|
-
const after = before.filter(t => t.id !== id);
|
|
486
|
-
if (after.length === before.length)
|
|
487
|
-
return false;
|
|
488
|
-
updateSettings(s => { s.agentTemplates = after; });
|
|
489
|
-
return true;
|
|
490
|
-
}
|
|
491
|
-
// ─── Bootstrap message count setting ────────────────────────────────────────
|
|
492
|
-
/** Default number of episodes for the bootstrap "Recent Conversation" section. */
|
|
493
|
-
const DEFAULT_BOOTSTRAP_MESSAGE_COUNT = 50;
|
|
494
|
-
/** Number of recent episodes injected into the bootstrap as "Recent Conversation". */
|
|
495
|
-
export function getBootstrapMessageCount() {
|
|
496
|
-
const v = readSettings().bootstrapMessageCount;
|
|
497
|
-
if (typeof v === "number" && Number.isFinite(v) && v >= 0)
|
|
498
|
-
return v;
|
|
499
|
-
return DEFAULT_BOOTSTRAP_MESSAGE_COUNT;
|
|
500
|
-
}
|
|
501
|
-
export function setBootstrapMessageCount(count) {
|
|
502
|
-
const clamped = Math.max(0, Math.round(count));
|
|
503
|
-
if (!Number.isFinite(clamped))
|
|
504
|
-
return;
|
|
505
|
-
updateSettings(s => { s.bootstrapMessageCount = clamped; });
|
|
506
|
-
}
|
|
507
|
-
// ——— Wait timeout setting ———————————————————————————————————————————
|
|
508
|
-
export function getWaitTimeoutMinutes() {
|
|
509
|
-
const v = readSettings().waitTimeoutMinutes;
|
|
510
|
-
if (typeof v === "number" && Number.isFinite(v) && v >= 1)
|
|
511
|
-
return v;
|
|
512
|
-
return ENV_WAIT_TIMEOUT ?? DEFAULT_WAIT_TIMEOUT_MINUTES;
|
|
513
|
-
}
|
|
514
|
-
export function setWaitTimeoutMinutes(minutes) {
|
|
515
|
-
const clamped = Math.max(1, Math.round(minutes));
|
|
516
|
-
if (!Number.isFinite(clamped))
|
|
517
|
-
return;
|
|
518
|
-
updateSettings(s => { s.waitTimeoutMinutes = clamped; });
|
|
519
|
-
}
|
|
520
|
-
// ─── Default model settings ──────────────────────────────────────────────────
|
|
521
|
-
const DEFAULT_THREAD_MODEL = "claude-opus-4-6";
|
|
522
|
-
const DEFAULT_WORKER_MODEL = "claude-sonnet-4-6";
|
|
523
|
-
// Model for the experimental "fable" agent type — a Claude-CLI thread pinned to
|
|
524
|
-
// a distinct (premium) model. Overridable via settings.fableModel.
|
|
525
|
-
const DEFAULT_FABLE_MODEL = "claude-fable-5";
|
|
526
|
-
export function getFableModel() {
|
|
527
|
-
const v = readSettings().fableModel;
|
|
528
|
-
return typeof v === "string" && v.length > 0 ? v : DEFAULT_FABLE_MODEL;
|
|
529
|
-
}
|
|
530
|
-
export function getDefaultThreadModel() {
|
|
531
|
-
const v = readSettings().defaultThreadModel;
|
|
532
|
-
return typeof v === "string" && v.length > 0 ? v : DEFAULT_THREAD_MODEL;
|
|
533
|
-
}
|
|
534
|
-
export function getDefaultWorkerModel() {
|
|
535
|
-
const v = readSettings().defaultWorkerModel;
|
|
536
|
-
return typeof v === "string" && v.length > 0 ? v : DEFAULT_WORKER_MODEL;
|
|
537
|
-
}
|
|
538
|
-
export function updateDefaultThreadModel(model) {
|
|
539
|
-
updateSettings(s => { s.defaultThreadModel = model; });
|
|
540
|
-
}
|
|
541
|
-
export function updateDefaultWorkerModel(model) {
|
|
542
|
-
updateSettings(s => { s.defaultWorkerModel = model; });
|
|
543
|
-
}
|
|
544
|
-
// ─── Copilot provider (BYOK / OpenRouter) settings ──────────────────────────
|
|
545
|
-
const DEFAULT_COPILOT_MODEL = "claude-opus-4-6";
|
|
546
|
-
const DEFAULT_COPILOT_BYOK = {
|
|
547
|
-
enabled: false,
|
|
548
|
-
providerType: "openai",
|
|
549
|
-
baseUrl: "",
|
|
550
|
-
apiKey: "",
|
|
551
|
-
modelId: "",
|
|
552
|
-
wireModel: "",
|
|
553
|
-
};
|
|
554
|
-
export function isValidCopilotProviderType(v) {
|
|
555
|
-
return v === "openai" || v === "azure" || v === "anthropic";
|
|
556
|
-
}
|
|
557
|
-
/** Model passed to the Copilot CLI via --model / COPILOT_MODEL (native or BYOK). */
|
|
558
|
-
export function getCopilotModel() {
|
|
559
|
-
const v = readSettings().copilotModel;
|
|
560
|
-
return typeof v === "string" && v.length > 0 ? v : DEFAULT_COPILOT_MODEL;
|
|
561
|
-
}
|
|
562
|
-
export function setCopilotModel(model) {
|
|
563
|
-
updateSettings(s => { s.copilotModel = model; });
|
|
564
|
-
}
|
|
565
|
-
/** Coerce an untrusted value into a fully-valid CopilotByokConfig, filling defaults. */
|
|
566
|
-
function normalizeByokConfig(raw) {
|
|
567
|
-
if (!raw || typeof raw !== "object")
|
|
568
|
-
return { ...DEFAULT_COPILOT_BYOK };
|
|
569
|
-
const e = raw;
|
|
570
|
-
return {
|
|
571
|
-
enabled: typeof e.enabled === "boolean" ? e.enabled : false,
|
|
572
|
-
providerType: isValidCopilotProviderType(e.providerType) ? e.providerType : "openai",
|
|
573
|
-
baseUrl: typeof e.baseUrl === "string" ? e.baseUrl : "",
|
|
574
|
-
apiKey: typeof e.apiKey === "string" ? e.apiKey : "",
|
|
575
|
-
modelId: typeof e.modelId === "string" ? e.modelId : "",
|
|
576
|
-
wireModel: typeof e.wireModel === "string" ? e.wireModel : "",
|
|
577
|
-
};
|
|
578
|
-
}
|
|
579
|
-
export function getCopilotByokConfig() {
|
|
580
|
-
return normalizeByokConfig(readSettings().copilotByok);
|
|
581
|
-
}
|
|
582
|
-
/**
|
|
583
|
-
* Merge a partial patch into the stored BYOK config and persist. The merged
|
|
584
|
-
* result is re-validated through normalizeByokConfig so the settings file can
|
|
585
|
-
* never hold an invalid providerType or non-string field, even though the input
|
|
586
|
-
* originates from the dashboard.
|
|
587
|
-
*/
|
|
588
|
-
export function setCopilotByokConfig(patch) {
|
|
589
|
-
const next = normalizeByokConfig({ ...getCopilotByokConfig(), ...patch });
|
|
590
|
-
updateSettings(s => { s.copilotByok = next; });
|
|
591
|
-
return next;
|
|
592
|
-
}
|
|
593
|
-
/**
|
|
594
|
-
* Assemble the environment variables that configure the Copilot CLI's model and
|
|
595
|
-
* (optionally) a custom BYOK provider. Values here are meant to override any
|
|
596
|
-
* inherited process.env at spawn time.
|
|
597
|
-
*/
|
|
598
|
-
export function getCopilotSpawnEnv() {
|
|
599
|
-
const model = getCopilotModel();
|
|
600
|
-
const env = { COPILOT_MODEL: model };
|
|
601
|
-
const byok = getCopilotByokConfig();
|
|
602
|
-
if (byok.enabled && byok.baseUrl && byok.apiKey) {
|
|
603
|
-
env.COPILOT_PROVIDER_BASE_URL = byok.baseUrl;
|
|
604
|
-
env.COPILOT_PROVIDER_TYPE = byok.providerType;
|
|
605
|
-
env.COPILOT_PROVIDER_API_KEY = byok.apiKey;
|
|
606
|
-
env.COPILOT_PROVIDER_MODEL_ID = byok.modelId || model;
|
|
607
|
-
env.COPILOT_PROVIDER_WIRE_MODEL = byok.wireModel || model;
|
|
608
|
-
}
|
|
609
|
-
return env;
|
|
610
|
-
}
|
|
611
|
-
// ─── Custom spawn env vars (per agent) ──────────────────────────────────────
|
|
612
|
-
//
|
|
613
|
-
// Operator-supplied env vars merged into the respective agent's spawn env. They
|
|
614
|
-
// are stored per agent so a var set for Claude is never injected into Copilot
|
|
615
|
-
// (and vice-versa). Locked built-ins always win over these, and the spawn path
|
|
616
|
-
// strips any ENV_DENYLIST key so a custom var can't smuggle a secret/cross-agent
|
|
617
|
-
// value past the denylist.
|
|
618
|
-
/** Coerce untrusted input into a clean string→string map (trimmed non-empty keys). */
|
|
619
|
-
function normalizeCustomEnvVars(raw) {
|
|
620
|
-
if (!raw || typeof raw !== "object" || Array.isArray(raw))
|
|
621
|
-
return {};
|
|
622
|
-
const out = {};
|
|
623
|
-
for (const [k, v] of Object.entries(raw)) {
|
|
624
|
-
const key = typeof k === "string" ? k.trim() : "";
|
|
625
|
-
if (key && typeof v === "string")
|
|
626
|
-
out[key] = v;
|
|
627
|
-
}
|
|
628
|
-
return out;
|
|
629
|
-
}
|
|
630
|
-
export function getClaudeCustomEnvVars() {
|
|
631
|
-
return normalizeCustomEnvVars(readSettings().claudeCustomEnvVars);
|
|
632
|
-
}
|
|
633
|
-
export function setClaudeCustomEnvVars(vars) {
|
|
634
|
-
updateSettings(s => { s.claudeCustomEnvVars = normalizeCustomEnvVars(vars); });
|
|
635
|
-
}
|
|
636
|
-
export function getCopilotCustomEnvVars() {
|
|
637
|
-
return normalizeCustomEnvVars(readSettings().copilotCustomEnvVars);
|
|
638
|
-
}
|
|
639
|
-
export function setCopilotCustomEnvVars(vars) {
|
|
640
|
-
updateSettings(s => { s.copilotCustomEnvVars = normalizeCustomEnvVars(vars); });
|
|
641
|
-
}
|
|
642
|
-
const PROMPT_LABEL_MAX = 64;
|
|
643
|
-
const PROMPT_TEXT_MAX = 4000;
|
|
644
|
-
/** Coerce untrusted input into a clean list of {label, text} prompts. */
|
|
645
|
-
export function normalizePredefinedPrompts(raw) {
|
|
646
|
-
if (!Array.isArray(raw))
|
|
647
|
-
return [];
|
|
648
|
-
const out = [];
|
|
649
|
-
for (const item of raw) {
|
|
650
|
-
if (!item || typeof item !== "object")
|
|
651
|
-
continue;
|
|
652
|
-
const rec = item;
|
|
653
|
-
const label = typeof rec.label === "string" ? rec.label.trim() : "";
|
|
654
|
-
const text = typeof rec.text === "string" ? rec.text.trim() : "";
|
|
655
|
-
if (!label || !text)
|
|
656
|
-
continue;
|
|
657
|
-
out.push({ label: label.slice(0, PROMPT_LABEL_MAX), text: text.slice(0, PROMPT_TEXT_MAX) });
|
|
658
|
-
}
|
|
659
|
-
return out;
|
|
660
|
-
}
|
|
661
|
-
export function getPredefinedPrompts() {
|
|
662
|
-
return normalizePredefinedPrompts(readSettings().predefinedPrompts);
|
|
663
|
-
}
|
|
664
|
-
export function setPredefinedPrompts(list) {
|
|
665
|
-
updateSettings(s => { s.predefinedPrompts = normalizePredefinedPrompts(list); });
|
|
666
|
-
}
|
|
667
|
-
// ─── Claude spawn settings ──────────────────────────────────────────────────
|
|
668
|
-
//
|
|
669
|
-
// Overrides for values previously only discoverable from the environment or via
|
|
670
|
-
// auto-detection. Precedence is always env var → dashboard setting → autodetect,
|
|
671
|
-
// so setting an env var keeps the exact prior behavior and an unset setting is a
|
|
672
|
-
// no-op. Returns undefined when neither env nor setting supplies a value, letting
|
|
673
|
-
// the caller fall back to its existing auto-detection logic.
|
|
674
|
-
const DEFAULT_MAX_CONCURRENT_THREADS = 20;
|
|
675
|
-
function readStringSetting(key) {
|
|
676
|
-
const v = readSettings()[key];
|
|
677
|
-
return typeof v === "string" && v.length > 0 ? v : undefined;
|
|
678
|
-
}
|
|
679
|
-
/** Explicit path to the Claude CLI binary (settings only — env is read at the call site). */
|
|
680
|
-
export function getClaudeCliPath() {
|
|
681
|
-
return readStringSetting("claudeCliPath");
|
|
682
|
-
}
|
|
683
|
-
export function setClaudeCliPath(path) {
|
|
684
|
-
updateSettings(s => { if (path)
|
|
685
|
-
s.claudeCliPath = path;
|
|
686
|
-
else
|
|
687
|
-
delete s.claudeCliPath; });
|
|
688
|
-
}
|
|
689
|
-
/** Long-lived Claude setup token used in place of the broken OAuth refresh flow. */
|
|
690
|
-
export function getClaudeOauthToken() {
|
|
691
|
-
return readStringSetting("claudeOauthToken");
|
|
692
|
-
}
|
|
693
|
-
export function setClaudeOauthToken(token) {
|
|
694
|
-
updateSettings(s => { if (token)
|
|
695
|
-
s.claudeOauthToken = token;
|
|
696
|
-
else
|
|
697
|
-
delete s.claudeOauthToken; });
|
|
698
|
-
}
|
|
699
|
-
/** Path to git-bash (Windows) passed to Claude via CLAUDE_CODE_GIT_BASH_PATH. */
|
|
700
|
-
export function getClaudeGitBashPath() {
|
|
701
|
-
return readStringSetting("claudeGitBashPath");
|
|
702
|
-
}
|
|
703
|
-
export function setClaudeGitBashPath(path) {
|
|
704
|
-
updateSettings(s => { if (path)
|
|
705
|
-
s.claudeGitBashPath = path;
|
|
706
|
-
else
|
|
707
|
-
delete s.claudeGitBashPath; });
|
|
708
|
-
}
|
|
709
|
-
/** Maximum number of concurrent spawned threads. */
|
|
710
|
-
export function getMaxConcurrentThreads() {
|
|
711
|
-
const v = readSettings().maxConcurrentThreads;
|
|
712
|
-
if (typeof v === "number" && Number.isFinite(v) && v >= 1)
|
|
713
|
-
return Math.round(v);
|
|
714
|
-
return DEFAULT_MAX_CONCURRENT_THREADS;
|
|
715
|
-
}
|
|
716
|
-
export function setMaxConcurrentThreads(count) {
|
|
717
|
-
const clamped = Math.max(1, Math.round(count));
|
|
718
|
-
if (!Number.isFinite(clamped))
|
|
719
|
-
return;
|
|
720
|
-
updateSettings(s => { s.maxConcurrentThreads = clamped; });
|
|
721
|
-
}
|
|
722
|
-
// ─── Guardrails setting ─────────────────────────────────────────────────────
|
|
723
|
-
/** Whether guardrail (Active Decisions) notes are injected into memory briefings. */
|
|
724
|
-
export function getGuardrailsEnabled() {
|
|
725
|
-
const v = readSettings().guardrailsEnabled;
|
|
726
|
-
if (typeof v === "boolean")
|
|
727
|
-
return v;
|
|
728
|
-
return true; // default: enabled
|
|
729
|
-
}
|
|
730
|
-
export function setGuardrailsEnabled(enabled) {
|
|
731
|
-
updateSettings(s => { s.guardrailsEnabled = enabled; });
|
|
732
|
-
}
|
|
733
|
-
// ─── Keep-alive settings ─────────────────────────────────────────────────────
|
|
734
|
-
const DEFAULT_KEEP_ALIVE_MAX_RETRIES = 5;
|
|
735
|
-
const DEFAULT_KEEP_ALIVE_COOLDOWN_MS = 300_000;
|
|
736
|
-
export function getKeepAliveEnabled() {
|
|
737
|
-
const v = readSettings().keepAliveEnabled;
|
|
738
|
-
if (typeof v === "boolean")
|
|
739
|
-
return v;
|
|
740
|
-
return false; // default: disabled
|
|
741
|
-
}
|
|
742
|
-
export function setKeepAliveEnabled(enabled) {
|
|
743
|
-
updateSettings(s => { s.keepAliveEnabled = enabled; });
|
|
744
|
-
}
|
|
745
|
-
export function getKeepAliveThreadId() {
|
|
746
|
-
const v = readSettings().keepAliveThreadId;
|
|
747
|
-
if (typeof v === "number" && Number.isFinite(v) && v > 0)
|
|
748
|
-
return v;
|
|
749
|
-
return 0;
|
|
750
|
-
}
|
|
751
|
-
export function setKeepAliveThreadId(threadId) {
|
|
752
|
-
updateSettings(s => { s.keepAliveThreadId = threadId; });
|
|
753
|
-
}
|
|
754
|
-
export function getKeepAliveMaxRetries() {
|
|
755
|
-
const v = readSettings().keepAliveMaxRetries;
|
|
756
|
-
if (typeof v === "number" && Number.isFinite(v) && v > 0)
|
|
757
|
-
return v;
|
|
758
|
-
return DEFAULT_KEEP_ALIVE_MAX_RETRIES;
|
|
759
|
-
}
|
|
760
|
-
export function setKeepAliveMaxRetries(retries) {
|
|
761
|
-
updateSettings(s => { s.keepAliveMaxRetries = retries; });
|
|
762
|
-
}
|
|
763
|
-
export function getKeepAliveCooldownMs() {
|
|
764
|
-
const v = readSettings().keepAliveCooldownMs;
|
|
765
|
-
if (typeof v === "number" && Number.isFinite(v) && v > 0)
|
|
766
|
-
return v;
|
|
767
|
-
return DEFAULT_KEEP_ALIVE_COOLDOWN_MS;
|
|
768
|
-
}
|
|
769
|
-
export function setKeepAliveCooldownMs(ms) {
|
|
770
|
-
updateSettings(s => { s.keepAliveCooldownMs = ms; });
|
|
771
|
-
}
|
|
772
|
-
export function isValidKeeperClient(v) {
|
|
773
|
-
return v === "claude" || v === "copilot";
|
|
774
|
-
}
|
|
775
|
-
export function getKeepAliveClient() {
|
|
776
|
-
const v = readSettings().keepAliveClient;
|
|
777
|
-
return isValidKeeperClient(v) ? v : "claude";
|
|
778
|
-
}
|
|
779
|
-
export function setKeepAliveClient(client) {
|
|
780
|
-
updateSettings(s => { s.keepAliveClient = client; });
|
|
781
|
-
}
|
|
782
|
-
/** Sets keep-alive settings for a specific thread. */
|
|
783
|
-
export function setThreadKeepAlive(threadId, settings) {
|
|
784
|
-
updateSettings(s => {
|
|
785
|
-
const map = (s.threadKeepAlive ?? {});
|
|
786
|
-
map[String(threadId)] = settings;
|
|
787
|
-
s.threadKeepAlive = map;
|
|
788
|
-
});
|
|
789
|
-
}
|
|
790
|
-
/** Removes per-thread keep-alive settings. */
|
|
791
|
-
export function removeThreadKeepAlive(threadId) {
|
|
792
|
-
updateSettings(s => {
|
|
793
|
-
const map = (s.threadKeepAlive ?? {});
|
|
794
|
-
delete map[String(threadId)];
|
|
795
|
-
s.threadKeepAlive = map;
|
|
796
|
-
});
|
|
797
|
-
}
|
|
798
|
-
/** Returns all per-thread keep-alive overrides. */
|
|
799
|
-
export function getAllThreadKeepAlive() {
|
|
800
|
-
const map = readSettings().threadKeepAlive;
|
|
801
|
-
if (!map || typeof map !== "object")
|
|
802
|
-
return {};
|
|
803
|
-
const result = {};
|
|
804
|
-
for (const [k, v] of Object.entries(map)) {
|
|
805
|
-
if (v && typeof v === "object") {
|
|
806
|
-
const e = v;
|
|
807
|
-
result[k] = {
|
|
808
|
-
enabled: typeof e.enabled === "boolean" ? e.enabled : false,
|
|
809
|
-
client: isValidKeeperClient(e.client) ? e.client : undefined,
|
|
810
|
-
cooldownMs: typeof e.cooldownMs === "number" && e.cooldownMs >= 1000 ? e.cooldownMs : undefined,
|
|
811
|
-
maxRetries: typeof e.maxRetries === "number" && e.maxRetries > 0 ? e.maxRetries : undefined,
|
|
812
|
-
};
|
|
813
|
-
}
|
|
814
|
-
}
|
|
815
|
-
return result;
|
|
816
|
-
}
|
|
817
|
-
// ─── Child thread memory source ───────────────────────────────────────────
|
|
818
|
-
/**
|
|
819
|
-
* Read the MEMORY_SOURCE_THREAD_ID env var set by the parent process
|
|
820
|
-
* when spawning a child thread (worker/branch). Returns the parent
|
|
821
|
-
* thread ID for memory briefing, or undefined if not a child thread.
|
|
822
|
-
*/
|
|
823
|
-
export function getMemorySourceThreadId() {
|
|
824
|
-
const val = process.env.MEMORY_SOURCE_THREAD_ID;
|
|
825
|
-
if (!val)
|
|
826
|
-
return undefined;
|
|
827
|
-
const n = Number(val);
|
|
828
|
-
return Number.isFinite(n) ? n : undefined;
|
|
829
|
-
}
|
|
830
|
-
// ─── Exported config object ─────────────────────────────────────────────────
|
|
831
|
-
export const config = {
|
|
832
|
-
TELEGRAM_TOKEN,
|
|
833
|
-
TELEGRAM_CHAT_ID,
|
|
834
|
-
OPENAI_API_KEY,
|
|
835
|
-
VOICE_ANALYSIS_URL,
|
|
836
|
-
get WAIT_TIMEOUT_MINUTES() { return getWaitTimeoutMinutes(); },
|
|
837
|
-
DMN_ACTIVATION_HOURS,
|
|
838
|
-
FILES_DIR,
|
|
839
|
-
PKG_VERSION,
|
|
840
|
-
};
|
|
841
|
-
//# sourceMappingURL=config.js.map
|