sensorium-mcp 3.1.2 → 3.1.3-board.10
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/Install-Sensorium.ps1 +257 -43
- package/README.md +2 -0
- package/dist/board/api/api.js +84 -0
- package/dist/board/api/api.test.ts +23 -0
- package/dist/board/api/client.js +113 -0
- package/dist/board/components/BottomNav.js +32 -0
- package/dist/board/components/Card.js +78 -0
- package/dist/board/components/Combobox.js +79 -0
- package/dist/board/components/CommentComposer.js +29 -0
- package/dist/board/components/CommentList.js +42 -0
- package/dist/board/components/DirTreePicker.js +128 -0
- package/dist/board/components/Dropdown.js +67 -0
- package/dist/board/components/Lane.js +47 -0
- package/dist/board/components/PriorityChip.js +20 -0
- package/dist/board/components/ProfileSummary.js +89 -0
- package/dist/board/components/StateBanner.js +24 -0
- package/dist/board/components/StatusChip.js +26 -0
- package/dist/board/components/rateLimit.js +32 -0
- package/dist/board/components/rateLimit.test.ts +16 -0
- package/dist/board/components/time.js +14 -0
- package/dist/board/config.js +56 -0
- package/dist/board/index.html +18 -0
- package/dist/board/main.js +37 -0
- package/dist/board/mock/api.mock.js +491 -0
- package/dist/board/mock/api.mock.test.ts +460 -0
- package/dist/board/mock/fixtures.js +512 -0
- package/dist/board/schema/policy.js +261 -0
- package/dist/board/state/recur.js +24 -0
- package/dist/board/state/recur.test.ts +24 -0
- package/dist/board/state/useBoard.js +161 -0
- package/dist/board/state/useBuilder.js +357 -0
- package/dist/board/state/useBuilder.test.ts +468 -0
- package/dist/board/state/useCard.js +193 -0
- package/dist/board/state/useCard.test.ts +435 -0
- package/dist/board/state/useDirBrowser.js +23 -0
- package/dist/board/styles/board.css +2885 -0
- package/dist/board/styles/tokens.css +72 -0
- package/dist/board/vendor/vue.esm-browser.js +9 -0
- package/dist/board/views/App.js +61 -0
- package/dist/board/views/BoardView.js +153 -0
- package/dist/board/views/BuilderView.js +582 -0
- package/dist/board/views/CardView.js +382 -0
- package/dist/board/views/SettingsView.js +152 -0
- package/dist/config/agent-settings.d.ts +11 -0
- package/dist/config/agent-settings.d.ts.map +1 -1
- package/dist/config/agent-settings.js +79 -0
- package/dist/config/agent-settings.js.map +1 -1
- package/dist/config/detail-grant.d.ts +7 -16
- package/dist/config/detail-grant.d.ts.map +1 -1
- package/dist/config/detail-grant.js +12 -35
- package/dist/config/detail-grant.js.map +1 -1
- package/dist/config/index.d.ts +2 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +17 -0
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-settings.d.ts +7 -1
- package/dist/config/mcp-settings.d.ts.map +1 -1
- package/dist/config/mcp-settings.js +9 -0
- package/dist/config/mcp-settings.js.map +1 -1
- package/dist/config/misc-settings.d.ts +22 -1
- package/dist/config/misc-settings.d.ts.map +1 -1
- package/dist/config/misc-settings.js +93 -3
- package/dist/config/misc-settings.js.map +1 -1
- package/dist/config/operator-grant.d.ts +9 -0
- package/dist/config/operator-grant.d.ts.map +1 -0
- package/dist/config/operator-grant.js +24 -0
- package/dist/config/operator-grant.js.map +1 -0
- package/dist/config/voice-grant.d.ts +10 -0
- package/dist/config/voice-grant.d.ts.map +1 -0
- package/dist/config/voice-grant.js +18 -0
- package/dist/config/voice-grant.js.map +1 -0
- package/dist/dashboard/board-static.d.ts +22 -0
- package/dist/dashboard/board-static.d.ts.map +1 -0
- package/dist/dashboard/board-static.js +130 -0
- package/dist/dashboard/board-static.js.map +1 -0
- 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 +6 -9
- package/dist/dashboard/routes/agent-templates.js.map +1 -1
- package/dist/dashboard/routes/board-body.d.ts +8 -0
- package/dist/dashboard/routes/board-body.d.ts.map +1 -0
- package/dist/dashboard/routes/board-body.js +20 -0
- package/dist/dashboard/routes/board-body.js.map +1 -0
- package/dist/dashboard/routes/board-dir-listing.d.ts +70 -0
- package/dist/dashboard/routes/board-dir-listing.d.ts.map +1 -0
- package/dist/dashboard/routes/board-dir-listing.js +192 -0
- package/dist/dashboard/routes/board-dir-listing.js.map +1 -0
- package/dist/dashboard/routes/board-lane-groups.d.ts +6 -0
- package/dist/dashboard/routes/board-lane-groups.d.ts.map +1 -0
- package/dist/dashboard/routes/board-lane-groups.js +52 -0
- package/dist/dashboard/routes/board-lane-groups.js.map +1 -0
- package/dist/dashboard/routes/board-policy.d.ts +224 -0
- package/dist/dashboard/routes/board-policy.d.ts.map +1 -0
- package/dist/dashboard/routes/board-policy.js +214 -0
- package/dist/dashboard/routes/board-policy.js.map +1 -0
- package/dist/dashboard/routes/board-profile-parse.d.ts +32 -0
- package/dist/dashboard/routes/board-profile-parse.d.ts.map +1 -0
- package/dist/dashboard/routes/board-profile-parse.js +338 -0
- package/dist/dashboard/routes/board-profile-parse.js.map +1 -0
- package/dist/dashboard/routes/board.d.ts +90 -0
- package/dist/dashboard/routes/board.d.ts.map +1 -0
- package/dist/dashboard/routes/board.js +721 -0
- package/dist/dashboard/routes/board.js.map +1 -0
- package/dist/dashboard/routes/codex.d.ts +14 -0
- package/dist/dashboard/routes/codex.d.ts.map +1 -0
- package/dist/dashboard/routes/codex.js +92 -0
- package/dist/dashboard/routes/codex.js.map +1 -0
- package/dist/dashboard/routes/prompts.d.ts +2 -2
- 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 +2 -0
- package/dist/dashboard/routes/settings.d.ts.map +1 -1
- package/dist/dashboard/routes/settings.js +24 -1
- package/dist/dashboard/routes/settings.js.map +1 -1
- package/dist/dashboard/routes/skills.d.ts +7 -1
- package/dist/dashboard/routes/skills.d.ts.map +1 -1
- package/dist/dashboard/routes/skills.js +6 -6
- package/dist/dashboard/routes/skills.js.map +1 -1
- package/dist/dashboard/routes/snapshots.d.ts +2 -1
- package/dist/dashboard/routes/snapshots.d.ts.map +1 -1
- package/dist/dashboard/routes/snapshots.js +24 -18
- package/dist/dashboard/routes/snapshots.js.map +1 -1
- package/dist/dashboard/routes/templates.js +5 -5
- package/dist/dashboard/routes/templates.js.map +1 -1
- package/dist/dashboard/routes/threads-create.d.ts +17 -0
- package/dist/dashboard/routes/threads-create.d.ts.map +1 -1
- package/dist/dashboard/routes/threads-create.js +32 -10
- package/dist/dashboard/routes/threads-create.js.map +1 -1
- package/dist/dashboard/routes/threads-helpers.d.ts +11 -2
- package/dist/dashboard/routes/threads-helpers.d.ts.map +1 -1
- package/dist/dashboard/routes/threads-helpers.js +20 -3
- package/dist/dashboard/routes/threads-helpers.js.map +1 -1
- package/dist/dashboard/routes/threads-read.d.ts +16 -4
- package/dist/dashboard/routes/threads-read.d.ts.map +1 -1
- package/dist/dashboard/routes/threads-read.js +61 -55
- package/dist/dashboard/routes/threads-read.js.map +1 -1
- package/dist/dashboard/routes/threads.d.ts +2 -2
- package/dist/dashboard/routes/threads.d.ts.map +1 -1
- package/dist/dashboard/routes/threads.js +143 -29
- package/dist/dashboard/routes/threads.js.map +1 -1
- package/dist/dashboard/routes/types.d.ts +6 -0
- 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 +2 -2
- package/dist/dashboard/routes.d.ts.map +1 -1
- package/dist/dashboard/routes.js +85 -7
- package/dist/dashboard/routes.js.map +1 -1
- package/dist/dashboard/spa.html +15 -12
- package/dist/data/board/board-schema.d.ts +29 -0
- package/dist/data/board/board-schema.d.ts.map +1 -0
- package/dist/data/board/board-schema.js +202 -0
- package/dist/data/board/board-schema.js.map +1 -0
- package/dist/data/board/board-types.d.ts +175 -0
- package/dist/data/board/board-types.d.ts.map +1 -0
- package/dist/data/board/board-types.js +9 -0
- package/dist/data/board/board-types.js.map +1 -0
- package/dist/data/board/card.repository.d.ts +137 -0
- package/dist/data/board/card.repository.d.ts.map +1 -0
- package/dist/data/board/card.repository.js +470 -0
- package/dist/data/board/card.repository.js.map +1 -0
- package/dist/data/board/comment.repository.d.ts +14 -0
- package/dist/data/board/comment.repository.d.ts.map +1 -0
- package/dist/data/board/comment.repository.js +42 -0
- package/dist/data/board/comment.repository.js.map +1 -0
- package/dist/data/board/lane-group.repository.d.ts +19 -0
- package/dist/data/board/lane-group.repository.d.ts.map +1 -0
- package/dist/data/board/lane-group.repository.js +66 -0
- package/dist/data/board/lane-group.repository.js.map +1 -0
- package/dist/data/board/profile-defaults.d.ts +17 -0
- package/dist/data/board/profile-defaults.d.ts.map +1 -0
- package/dist/data/board/profile-defaults.js +107 -0
- package/dist/data/board/profile-defaults.js.map +1 -0
- package/dist/data/interfaces.d.ts +1 -0
- package/dist/data/interfaces.d.ts.map +1 -1
- package/dist/data/memory/bootstrap.d.ts +1 -8
- package/dist/data/memory/bootstrap.d.ts.map +1 -1
- package/dist/data/memory/bootstrap.js +27 -37
- package/dist/data/memory/bootstrap.js.map +1 -1
- package/dist/data/memory/consolidation.d.ts +9 -31
- package/dist/data/memory/consolidation.d.ts.map +1 -1
- package/dist/data/memory/consolidation.js +22 -32
- package/dist/data/memory/consolidation.js.map +1 -1
- package/dist/data/memory/db-maintenance.d.ts +54 -0
- package/dist/data/memory/db-maintenance.d.ts.map +1 -0
- package/dist/data/memory/db-maintenance.js +81 -0
- package/dist/data/memory/db-maintenance.js.map +1 -0
- package/dist/data/memory/episodes.d.ts +2 -1
- package/dist/data/memory/episodes.d.ts.map +1 -1
- package/dist/data/memory/episodes.js +5 -1
- package/dist/data/memory/episodes.js.map +1 -1
- package/dist/data/memory/index.d.ts +0 -4
- package/dist/data/memory/index.d.ts.map +1 -1
- package/dist/data/memory/index.js +0 -4
- package/dist/data/memory/index.js.map +1 -1
- package/dist/data/memory/key-knowledge.d.ts +51 -0
- package/dist/data/memory/key-knowledge.d.ts.map +1 -0
- package/dist/data/memory/key-knowledge.js +128 -0
- package/dist/data/memory/key-knowledge.js.map +1 -0
- 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 +407 -1
- package/dist/data/memory/migration-runner.js.map +1 -1
- package/dist/data/memory/narrative-lint.d.ts +2 -2
- package/dist/data/memory/narrative-lint.d.ts.map +1 -1
- package/dist/data/memory/narrative-lint.js +23 -13
- package/dist/data/memory/narrative-lint.js.map +1 -1
- package/dist/data/memory/narrative-resolutions.d.ts +9 -2
- package/dist/data/memory/narrative-resolutions.d.ts.map +1 -1
- package/dist/data/memory/narrative-resolutions.js +9 -8
- package/dist/data/memory/narrative-resolutions.js.map +1 -1
- package/dist/data/memory/narrative-sources.d.ts +1 -1
- package/dist/data/memory/narrative-sources.d.ts.map +1 -1
- package/dist/data/memory/narrative-sources.js +8 -3
- package/dist/data/memory/narrative-sources.js.map +1 -1
- package/dist/data/memory/narrative-store.d.ts +24 -0
- package/dist/data/memory/narrative-store.d.ts.map +1 -1
- package/dist/data/memory/narrative-store.js +73 -35
- package/dist/data/memory/narrative-store.js.map +1 -1
- package/dist/data/memory/narrative.d.ts.map +1 -1
- package/dist/data/memory/narrative.js +47 -29
- package/dist/data/memory/narrative.js.map +1 -1
- package/dist/data/memory/note-archival.d.ts +1 -1
- package/dist/data/memory/note-archival.d.ts.map +1 -1
- package/dist/data/memory/note-archival.js +7 -3
- package/dist/data/memory/note-archival.js.map +1 -1
- package/dist/data/memory/note-embeddings.d.ts +7 -0
- package/dist/data/memory/note-embeddings.d.ts.map +1 -1
- package/dist/data/memory/note-embeddings.js +6 -2
- package/dist/data/memory/note-embeddings.js.map +1 -1
- package/dist/data/memory/passive-notice.repository.d.ts +70 -0
- package/dist/data/memory/passive-notice.repository.d.ts.map +1 -0
- package/dist/data/memory/passive-notice.repository.js +85 -0
- package/dist/data/memory/passive-notice.repository.js.map +1 -0
- package/dist/data/memory/schema-ddl.d.ts +120 -1
- package/dist/data/memory/schema-ddl.d.ts.map +1 -1
- package/dist/data/memory/schema-ddl.js +171 -4
- package/dist/data/memory/schema-ddl.js.map +1 -1
- package/dist/data/memory/schema-guard.d.ts.map +1 -1
- package/dist/data/memory/schema-guard.js +5 -41
- package/dist/data/memory/schema-guard.js.map +1 -1
- package/dist/data/memory/schema.d.ts.map +1 -1
- package/dist/data/memory/schema.js +10 -34
- package/dist/data/memory/schema.js.map +1 -1
- package/dist/data/memory/semantic-notes.d.ts +13 -8
- package/dist/data/memory/semantic-notes.d.ts.map +1 -1
- package/dist/data/memory/semantic-notes.js +12 -17
- package/dist/data/memory/semantic-notes.js.map +1 -1
- package/dist/data/memory/thread-registry.d.ts +330 -15
- package/dist/data/memory/thread-registry.d.ts.map +1 -1
- package/dist/data/memory/thread-registry.js +523 -67
- package/dist/data/memory/thread-registry.js.map +1 -1
- package/dist/data/memory/utils.d.ts +6 -0
- package/dist/data/memory/utils.d.ts.map +1 -1
- package/dist/data/memory/utils.js +13 -0
- package/dist/data/memory/utils.js.map +1 -1
- package/dist/data/memory/worker-lifecycle.repository.d.ts +308 -0
- package/dist/data/memory/worker-lifecycle.repository.d.ts.map +1 -0
- package/dist/data/memory/worker-lifecycle.repository.js +428 -0
- package/dist/data/memory/worker-lifecycle.repository.js.map +1 -0
- package/dist/data/optional.d.ts +16 -0
- package/dist/data/optional.d.ts.map +1 -0
- package/dist/data/optional.js +47 -0
- package/dist/data/optional.js.map +1 -0
- package/dist/index.js +156 -24
- package/dist/index.js.map +1 -1
- package/dist/integrations/openai/speech.d.ts.map +1 -1
- package/dist/integrations/openai/speech.js +52 -19
- package/dist/integrations/openai/speech.js.map +1 -1
- package/dist/integrations/openai/video.d.ts +1 -1
- package/dist/integrations/openai/video.d.ts.map +1 -1
- package/dist/integrations/openai/video.js +13 -8
- package/dist/integrations/openai/video.js.map +1 -1
- package/dist/integrations/telegram/types.d.ts +11 -0
- package/dist/integrations/telegram/types.d.ts.map +1 -1
- package/dist/lib/http-retry.d.ts +91 -0
- package/dist/lib/http-retry.d.ts.map +1 -0
- package/dist/lib/http-retry.js +177 -0
- package/dist/lib/http-retry.js.map +1 -0
- package/dist/lib/mcp-http-port.d.ts +12 -0
- package/dist/lib/mcp-http-port.d.ts.map +1 -0
- package/dist/lib/mcp-http-port.js +19 -0
- package/dist/lib/mcp-http-port.js.map +1 -0
- package/dist/lib/paths.d.ts +29 -4
- package/dist/lib/paths.d.ts.map +1 -1
- package/dist/lib/paths.js +31 -4
- package/dist/lib/paths.js.map +1 -1
- package/dist/lib/types.d.ts +2 -0
- package/dist/lib/types.d.ts.map +1 -1
- package/dist/lib/usage-metering/pricing.js +1 -1
- package/dist/lib/usage-metering/pricing.js.map +1 -1
- package/dist/lib/usage-metering/sink.d.ts +4 -0
- package/dist/lib/usage-metering/sink.d.ts.map +1 -1
- package/dist/lib/usage-metering/sink.js +6 -4
- package/dist/lib/usage-metering/sink.js.map +1 -1
- package/dist/lib/utils.d.ts +31 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +49 -0
- package/dist/lib/utils.js.map +1 -1
- package/dist/llm/prompts/narrative.d.ts.map +1 -1
- package/dist/llm/prompts/narrative.js +27 -86
- package/dist/llm/prompts/narrative.js.map +1 -1
- package/dist/log-parsing/log-events.d.ts +38 -0
- package/dist/log-parsing/log-events.d.ts.map +1 -0
- package/dist/log-parsing/log-events.js +2 -0
- package/dist/log-parsing/log-events.js.map +1 -0
- package/dist/log-parsing/parser-registry.d.ts +4 -0
- package/dist/log-parsing/parser-registry.d.ts.map +1 -0
- package/dist/log-parsing/parser-registry.js +18 -0
- package/dist/log-parsing/parser-registry.js.map +1 -0
- package/dist/log-parsing/parsers/claude.d.ts +6 -0
- package/dist/log-parsing/parsers/claude.d.ts.map +1 -0
- package/dist/log-parsing/parsers/claude.js +100 -0
- package/dist/log-parsing/parsers/claude.js.map +1 -0
- package/dist/log-parsing/parsers/codex.d.ts +6 -0
- package/dist/log-parsing/parsers/codex.d.ts.map +1 -0
- package/dist/log-parsing/parsers/codex.js +116 -0
- package/dist/log-parsing/parsers/codex.js.map +1 -0
- package/dist/log-parsing/parsers/copilot.d.ts +6 -0
- package/dist/log-parsing/parsers/copilot.d.ts.map +1 -0
- package/dist/log-parsing/parsers/copilot.js +65 -0
- package/dist/log-parsing/parsers/copilot.js.map +1 -0
- package/dist/log-parsing/parsers/json-lines.d.ts +9 -0
- package/dist/log-parsing/parsers/json-lines.d.ts.map +1 -0
- package/dist/log-parsing/parsers/json-lines.js +25 -0
- package/dist/log-parsing/parsers/json-lines.js.map +1 -0
- package/dist/log-parsing/render.d.ts +33 -0
- package/dist/log-parsing/render.d.ts.map +1 -0
- package/dist/log-parsing/render.js +113 -0
- package/dist/log-parsing/render.js.map +1 -0
- package/dist/log-parsing/text.d.ts +8 -0
- package/dist/log-parsing/text.d.ts.map +1 -0
- package/dist/log-parsing/text.js +20 -0
- package/dist/log-parsing/text.js.map +1 -0
- package/dist/server/http-server.d.ts +8 -1
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +41 -19
- package/dist/server/http-server.js.map +1 -1
- package/dist/server/port-holder.d.ts +94 -0
- package/dist/server/port-holder.d.ts.map +1 -0
- package/dist/server/port-holder.js +122 -0
- package/dist/server/port-holder.js.map +1 -0
- package/dist/services/agent-spawn.service.d.ts +50 -5
- package/dist/services/agent-spawn.service.d.ts.map +1 -1
- package/dist/services/agent-spawn.service.js +59 -66
- package/dist/services/agent-spawn.service.js.map +1 -1
- package/dist/services/background-runner.d.ts +0 -1
- package/dist/services/background-runner.d.ts.map +1 -1
- package/dist/services/background-runner.js +0 -58
- package/dist/services/background-runner.js.map +1 -1
- package/dist/services/board/board-signals.d.ts +45 -0
- package/dist/services/board/board-signals.d.ts.map +1 -0
- package/dist/services/board/board-signals.js +170 -0
- package/dist/services/board/board-signals.js.map +1 -0
- package/dist/services/board/card-briefing.d.ts +24 -0
- package/dist/services/board/card-briefing.d.ts.map +1 -0
- package/dist/services/board/card-briefing.js +132 -0
- package/dist/services/board/card-briefing.js.map +1 -0
- package/dist/services/board/card-diagnostics.d.ts +25 -0
- package/dist/services/board/card-diagnostics.d.ts.map +1 -0
- package/dist/services/board/card-diagnostics.js +50 -0
- package/dist/services/board/card-diagnostics.js.map +1 -0
- package/dist/services/board/live-root-thread.d.ts +8 -0
- package/dist/services/board/live-root-thread.d.ts.map +1 -0
- package/dist/services/board/live-root-thread.js +2 -0
- package/dist/services/board/live-root-thread.js.map +1 -0
- package/dist/services/board/orchestrator.service.d.ts +119 -0
- package/dist/services/board/orchestrator.service.d.ts.map +1 -0
- package/dist/services/board/orchestrator.service.js +387 -0
- package/dist/services/board/orchestrator.service.js.map +1 -0
- package/dist/services/board/release-worker.d.ts +43 -0
- package/dist/services/board/release-worker.d.ts.map +1 -0
- package/dist/services/board/release-worker.js +96 -0
- package/dist/services/board/release-worker.js.map +1 -0
- package/dist/services/board/report-capture.d.ts +94 -0
- package/dist/services/board/report-capture.d.ts.map +1 -0
- package/dist/services/board/report-capture.js +398 -0
- package/dist/services/board/report-capture.js.map +1 -0
- package/dist/services/board/worker-spawn.d.ts +89 -0
- package/dist/services/board/worker-spawn.d.ts.map +1 -0
- package/dist/services/board/worker-spawn.js +177 -0
- package/dist/services/board/worker-spawn.js.map +1 -0
- package/dist/services/board/worktree.d.ts +45 -0
- package/dist/services/board/worktree.d.ts.map +1 -0
- package/dist/services/board/worktree.js +183 -0
- package/dist/services/board/worktree.js.map +1 -0
- package/dist/services/broker-client.d.ts +84 -2
- package/dist/services/broker-client.d.ts.map +1 -1
- package/dist/services/broker-client.js +72 -6
- package/dist/services/broker-client.js.map +1 -1
- package/dist/services/claude-spawn.service.d.ts +5 -0
- package/dist/services/claude-spawn.service.d.ts.map +1 -1
- package/dist/services/claude-spawn.service.js +37 -21
- package/dist/services/claude-spawn.service.js.map +1 -1
- package/dist/services/codex-spawn.service.d.ts +8 -3
- package/dist/services/codex-spawn.service.d.ts.map +1 -1
- package/dist/services/codex-spawn.service.js +84 -67
- package/dist/services/codex-spawn.service.js.map +1 -1
- package/dist/services/consolidation.service.d.ts.map +1 -1
- package/dist/services/consolidation.service.js +5 -49
- package/dist/services/consolidation.service.js.map +1 -1
- package/dist/services/copilot-spawn.service.d.ts +1 -1
- package/dist/services/copilot-spawn.service.d.ts.map +1 -1
- package/dist/services/copilot-spawn.service.js +10 -5
- package/dist/services/copilot-spawn.service.js.map +1 -1
- package/dist/services/daily-session.d.ts +24 -11
- package/dist/services/daily-session.d.ts.map +1 -1
- package/dist/services/daily-session.js +113 -33
- package/dist/services/daily-session.js.map +1 -1
- package/dist/services/death-alert.service.d.ts +55 -0
- package/dist/services/death-alert.service.d.ts.map +1 -0
- package/dist/services/death-alert.service.js +64 -0
- package/dist/services/death-alert.service.js.map +1 -0
- package/dist/services/dispatcher/broker.d.ts +66 -0
- package/dist/services/dispatcher/broker.d.ts.map +1 -1
- package/dist/services/dispatcher/broker.js +60 -52
- package/dist/services/dispatcher/broker.js.map +1 -1
- package/dist/services/dispatcher/poller.d.ts.map +1 -1
- package/dist/services/dispatcher/poller.js +31 -24
- package/dist/services/dispatcher/poller.js.map +1 -1
- package/dist/services/http-retry.d.ts +1 -90
- package/dist/services/http-retry.d.ts.map +1 -1
- package/dist/services/http-retry.js +1 -176
- package/dist/services/http-retry.js.map +1 -1
- package/dist/services/intent.d.ts +15 -1
- package/dist/services/intent.d.ts.map +1 -1
- package/dist/services/intent.js +39 -27
- package/dist/services/intent.js.map +1 -1
- package/dist/services/keeper.service.d.ts +76 -3
- package/dist/services/keeper.service.d.ts.map +1 -1
- package/dist/services/keeper.service.js +112 -35
- package/dist/services/keeper.service.js.map +1 -1
- package/dist/services/mcp-config.service.d.ts.map +1 -1
- package/dist/services/mcp-config.service.js +14 -1
- package/dist/services/mcp-config.service.js.map +1 -1
- package/dist/services/memory-briefing.service.d.ts +1 -1
- package/dist/services/memory-briefing.service.d.ts.map +1 -1
- package/dist/services/memory-briefing.service.js +28 -73
- package/dist/services/memory-briefing.service.js.map +1 -1
- package/dist/services/passive-notice.service.d.ts +56 -0
- package/dist/services/passive-notice.service.d.ts.map +1 -0
- package/dist/services/passive-notice.service.js +92 -0
- package/dist/services/passive-notice.service.js.map +1 -0
- package/dist/services/predefined-prompts.d.ts +11 -0
- package/dist/services/predefined-prompts.d.ts.map +1 -0
- package/dist/services/predefined-prompts.js +25 -0
- package/dist/services/predefined-prompts.js.map +1 -0
- package/dist/services/process.service.d.ts +111 -27
- package/dist/services/process.service.d.ts.map +1 -1
- package/dist/services/process.service.js +245 -173
- package/dist/services/process.service.js.map +1 -1
- package/dist/services/spawn-common.d.ts +281 -5
- package/dist/services/spawn-common.d.ts.map +1 -1
- package/dist/services/spawn-common.js +884 -188
- package/dist/services/spawn-common.js.map +1 -1
- package/dist/services/spawn-exit-watcher.d.ts +45 -35
- package/dist/services/spawn-exit-watcher.d.ts.map +1 -1
- package/dist/services/spawn-exit-watcher.js +120 -100
- package/dist/services/spawn-exit-watcher.js.map +1 -1
- package/dist/services/telegram.d.ts +31 -8
- package/dist/services/telegram.d.ts.map +1 -1
- package/dist/services/telegram.js +58 -26
- package/dist/services/telegram.js.map +1 -1
- package/dist/services/thread-health.service.d.ts +8 -0
- package/dist/services/thread-health.service.d.ts.map +1 -1
- package/dist/services/thread-health.service.js +14 -10
- package/dist/services/thread-health.service.js.map +1 -1
- package/dist/services/thread-lifecycle.service.d.ts +17 -1
- package/dist/services/thread-lifecycle.service.d.ts.map +1 -1
- package/dist/services/thread-lifecycle.service.js +47 -6
- package/dist/services/thread-lifecycle.service.js.map +1 -1
- package/dist/services/thread-log-reader.d.ts +81 -0
- package/dist/services/thread-log-reader.d.ts.map +1 -0
- package/dist/services/thread-log-reader.js +141 -0
- package/dist/services/thread-log-reader.js.map +1 -0
- package/dist/services/thread-purge.service.d.ts +200 -0
- package/dist/services/thread-purge.service.d.ts.map +1 -0
- package/dist/services/thread-purge.service.js +644 -0
- package/dist/services/thread-purge.service.js.map +1 -0
- package/dist/services/topic.service.d.ts +44 -2
- package/dist/services/topic.service.d.ts.map +1 -1
- package/dist/services/topic.service.js +74 -13
- package/dist/services/topic.service.js.map +1 -1
- package/dist/services/usage/usage-inbox-notifier.d.ts +50 -0
- package/dist/services/usage/usage-inbox-notifier.d.ts.map +1 -0
- package/dist/services/usage/usage-inbox-notifier.js +118 -0
- package/dist/services/usage/usage-inbox-notifier.js.map +1 -0
- package/dist/services/usage/usage-poller.service.d.ts +41 -0
- package/dist/services/usage/usage-poller.service.d.ts.map +1 -0
- package/dist/services/usage/usage-poller.service.js +67 -0
- package/dist/services/usage/usage-poller.service.js.map +1 -0
- package/dist/services/usage/usage-snapshot-provider.d.ts +40 -0
- package/dist/services/usage/usage-snapshot-provider.d.ts.map +1 -0
- package/dist/services/usage/usage-snapshot-provider.js +89 -0
- package/dist/services/usage/usage-snapshot-provider.js.map +1 -0
- package/dist/services/usage/usage-types.d.ts +28 -0
- package/dist/services/usage/usage-types.d.ts.map +1 -0
- package/dist/services/usage/usage-types.js +14 -0
- package/dist/services/usage/usage-types.js.map +1 -0
- package/dist/services/worker-birth.d.ts +154 -0
- package/dist/services/worker-birth.d.ts.map +1 -0
- package/dist/services/worker-birth.js +274 -0
- package/dist/services/worker-birth.js.map +1 -0
- package/dist/services/worker-cleanup.service.d.ts +242 -19
- package/dist/services/worker-cleanup.service.d.ts.map +1 -1
- package/dist/services/worker-cleanup.service.js +893 -355
- package/dist/services/worker-cleanup.service.js.map +1 -1
- package/dist/services/worker-lifecycle-executor.d.ts +42 -0
- package/dist/services/worker-lifecycle-executor.d.ts.map +1 -0
- package/dist/services/worker-lifecycle-executor.js +63 -0
- package/dist/services/worker-lifecycle-executor.js.map +1 -0
- package/dist/services/worker-single-use.d.ts +92 -0
- package/dist/services/worker-single-use.d.ts.map +1 -0
- package/dist/services/worker-single-use.js +155 -0
- package/dist/services/worker-single-use.js.map +1 -0
- package/dist/sessions/mcp-registry.d.ts +33 -2
- package/dist/sessions/mcp-registry.d.ts.map +1 -1
- package/dist/sessions/mcp-registry.js +153 -30
- package/dist/sessions/mcp-registry.js.map +1 -1
- package/dist/test-bootstrap.d.ts +19 -12
- package/dist/test-bootstrap.d.ts.map +1 -1
- package/dist/test-bootstrap.js +69 -21
- package/dist/test-bootstrap.js.map +1 -1
- package/dist/test-tripwire.test-support.d.ts +75 -0
- package/dist/test-tripwire.test-support.d.ts.map +1 -0
- package/dist/test-tripwire.test-support.js +353 -0
- package/dist/test-tripwire.test-support.js.map +1 -0
- package/dist/tools/defs/memory-defs.d.ts.map +1 -1
- package/dist/tools/defs/memory-defs.js +12 -4
- package/dist/tools/defs/memory-defs.js.map +1 -1
- package/dist/tools/defs/session-defs.d.ts.map +1 -1
- package/dist/tools/defs/session-defs.js +26 -10
- package/dist/tools/defs/session-defs.js.map +1 -1
- package/dist/tools/defs/utility-defs.js +1 -1
- package/dist/tools/defs/utility-defs.js.map +1 -1
- package/dist/tools/delegate-tool.d.ts +81 -1
- package/dist/tools/delegate-tool.d.ts.map +1 -1
- package/dist/tools/delegate-tool.js +840 -219
- package/dist/tools/delegate-tool.js.map +1 -1
- package/dist/tools/memory-tools.d.ts.map +1 -1
- package/dist/tools/memory-tools.js +66 -9
- package/dist/tools/memory-tools.js.map +1 -1
- package/dist/tools/response-builders.d.ts.map +1 -1
- package/dist/tools/response-builders.js +12 -8
- package/dist/tools/response-builders.js.map +1 -1
- package/dist/tools/session-tools.d.ts.map +1 -1
- package/dist/tools/session-tools.js +3 -32
- package/dist/tools/session-tools.js.map +1 -1
- package/dist/tools/skill-tools.js +1 -1
- package/dist/tools/skill-tools.js.map +1 -1
- package/dist/tools/start-session-tool.d.ts.map +1 -1
- package/dist/tools/start-session-tool.js +66 -20
- package/dist/tools/start-session-tool.js.map +1 -1
- package/dist/tools/utility-tools.d.ts.map +1 -1
- package/dist/tools/utility-tools.js +38 -3
- package/dist/tools/utility-tools.js.map +1 -1
- package/dist/tools/wait/auto-forward.d.ts.map +1 -1
- package/dist/tools/wait/auto-forward.js +8 -3
- package/dist/tools/wait/auto-forward.js.map +1 -1
- package/dist/tools/wait/consolidation-strategy.d.ts +42 -0
- package/dist/tools/wait/consolidation-strategy.d.ts.map +1 -0
- package/dist/tools/wait/consolidation-strategy.js +50 -0
- package/dist/tools/wait/consolidation-strategy.js.map +1 -0
- package/dist/tools/wait/drive-handler.d.ts +5 -7
- package/dist/tools/wait/drive-handler.d.ts.map +1 -1
- package/dist/tools/wait/drive-handler.js +45 -59
- package/dist/tools/wait/drive-handler.js.map +1 -1
- package/dist/tools/wait/media-processor.d.ts.map +1 -1
- package/dist/tools/wait/media-processor.js +8 -4
- package/dist/tools/wait/media-processor.js.map +1 -1
- package/dist/tools/wait/message-delivery.d.ts +9 -6
- package/dist/tools/wait/message-delivery.d.ts.map +1 -1
- package/dist/tools/wait/message-delivery.js +77 -58
- package/dist/tools/wait/message-delivery.js.map +1 -1
- package/dist/tools/wait/message-processing.d.ts.map +1 -1
- package/dist/tools/wait/message-processing.js +2 -1
- package/dist/tools/wait/message-processing.js.map +1 -1
- package/dist/tools/wait/poll-loop.d.ts.map +1 -1
- package/dist/tools/wait/poll-loop.js +339 -239
- package/dist/tools/wait/poll-loop.js.map +1 -1
- package/package.json +4 -3
- package/templates/azure-devops-securevault.default.md +20 -6
- package/templates/board-quality-checklist.default.md +121 -0
- package/templates/buildless-vue-preview.default.md +47 -0
- package/templates/expert-code-review.default.md +12 -0
- package/templates/handoff.default.md +41 -18
- package/templates/increment-pr-pipeline.default.md +79 -0
- package/templates/swarm.default.md +1 -0
- package/templates/worker-autonomous.default.md +1 -0
- package/templates/worker-delegate.default.md +1 -0
- package/dist/dashboard/log-parser.d.ts +0 -65
- package/dist/dashboard/log-parser.d.ts.map +0 -1
- package/dist/dashboard/log-parser.js +0 -219
- package/dist/dashboard/log-parser.js.map +0 -1
- package/dist/data/memory/reflection-dedup.d.ts +0 -17
- package/dist/data/memory/reflection-dedup.d.ts.map +0 -1
- package/dist/data/memory/reflection-dedup.js +0 -55
- package/dist/data/memory/reflection-dedup.js.map +0 -1
- package/dist/data/memory/reflection-gates.d.ts +0 -40
- package/dist/data/memory/reflection-gates.d.ts.map +0 -1
- package/dist/data/memory/reflection-gates.js +0 -220
- package/dist/data/memory/reflection-gates.js.map +0 -1
- package/dist/data/memory/reflection-sources.d.ts +0 -13
- package/dist/data/memory/reflection-sources.d.ts.map +0 -1
- package/dist/data/memory/reflection-sources.js +0 -115
- package/dist/data/memory/reflection-sources.js.map +0 -1
- package/dist/data/memory/reflection.d.ts +0 -43
- package/dist/data/memory/reflection.d.ts.map +0 -1
- package/dist/data/memory/reflection.js +0 -329
- package/dist/data/memory/reflection.js.map +0 -1
- package/dist/llm/prompts/reflection.d.ts +0 -6
- package/dist/llm/prompts/reflection.d.ts.map +0 -1
- package/dist/llm/prompts/reflection.js +0 -77
- package/dist/llm/prompts/reflection.js.map +0 -1
- package/dist/services/memory-pruning.service.d.ts +0 -12
- package/dist/services/memory-pruning.service.d.ts.map +0 -1
- package/dist/services/memory-pruning.service.js +0 -179
- package/dist/services/memory-pruning.service.js.map +0 -1
- package/templates/daily-review.default.md +0 -26
- package/templates/fire-and-forget.default.md +0 -76
- package/templates/offload.default.md +0 -33
- package/templates/sensorium-repair.default.md +0 -114
package/Install-Sensorium.ps1
CHANGED
|
@@ -9,7 +9,8 @@
|
|
|
9
9
|
|
|
10
10
|
The release channel follows the SAME switch as the MCP server: the tag in
|
|
11
11
|
MCPStartCommand ("npx -y sensorium-mcp@<tag>"). @latest -> supervisor-latest
|
|
12
|
-
(stable, built from main); @
|
|
12
|
+
(stable, built from main); @board -> supervisor-board (built from
|
|
13
|
+
feature/agent-task-board); @refactor -> supervisor-refactor (built from the
|
|
13
14
|
refactor branch). One edit to install.config.json flips both node + supervisor.
|
|
14
15
|
|
|
15
16
|
All configuration is read from ~/.remote-copilot-mcp/install.config.json.
|
|
@@ -41,11 +42,25 @@ $ConfigFile = Join-Path $DataDir "install.config.json"
|
|
|
41
42
|
$StartupDir = [Environment]::GetFolderPath("Startup")
|
|
42
43
|
$StartupLauncher = Join-Path $StartupDir "SensoriumSupervisor.cmd"
|
|
43
44
|
|
|
45
|
+
# Isolated MCP runtime: a PRIVATE npm cache + a repo-independent cwd for the MCP,
|
|
46
|
+
# both living under $DataDir (never a dev checkout). This severs the shared-cache /
|
|
47
|
+
# shared-cwd coupling that lets a worker's `npm ci`/build in a dev repo interfere
|
|
48
|
+
# with (and kill) the live MCP — WITHOUT pinning the version, so `npx ...@latest`
|
|
49
|
+
# still auto-updates the MCP on each restart. npx also stages its packages in
|
|
50
|
+
# <cache>/_npx, so a private npm cache isolates npx resolution too.
|
|
51
|
+
$McpRuntimeRoot = Join-Path $DataDir "mcp-runtime"
|
|
52
|
+
$McpRuntimeCache = Join-Path $McpRuntimeRoot "npm-cache"
|
|
53
|
+
|
|
44
54
|
# ── Config File ──────────────────────────────────────────────────────────────
|
|
45
55
|
$Defaults = @{
|
|
46
56
|
SecureVaultProfile = "SENSORIUM"
|
|
47
57
|
UpdateMode = "production"
|
|
48
58
|
MCPStartCommand = "npx -y sensorium-mcp@latest"
|
|
59
|
+
# Opt-in runtime isolation. When "true", the MCP keeps its `npx ...@latest`
|
|
60
|
+
# start command (so auto-update still works) but is given its OWN npm cache
|
|
61
|
+
# ($McpRuntimeCache) and a repo-independent cwd ($McpRuntimeRoot), decoupled
|
|
62
|
+
# from any dev checkout's shared npm cache / cwd. "false" = legacy behaviour.
|
|
63
|
+
IsolateMcpRuntime = "false"
|
|
49
64
|
}
|
|
50
65
|
|
|
51
66
|
function Load-Config {
|
|
@@ -78,14 +93,16 @@ $Config = Load-Config
|
|
|
78
93
|
$SecureVaultProfile = $Config["SecureVaultProfile"]
|
|
79
94
|
$UpdateMode = $Config["UpdateMode"]
|
|
80
95
|
$EffectiveMCPStartCommand = $Config["MCPStartCommand"]
|
|
96
|
+
$IsolateMcpRuntime = $Config["IsolateMcpRuntime"] -eq "true"
|
|
81
97
|
|
|
82
98
|
# Resolve the supervisor release channel from the same tag the node server
|
|
83
|
-
# follows: the "@<tag>" in MCPStartCommand. Only @
|
|
84
|
-
#
|
|
99
|
+
# follows: the "@<tag>" in MCPStartCommand. Only @board (supervisor-board, built
|
|
100
|
+
# from feature/agent-task-board) and @refactor (supervisor-refactor) use branch
|
|
101
|
+
# builds; everything else (incl. @latest, a bare version pin, or no tag) stays
|
|
85
102
|
# on the stable supervisor-latest release. This keeps the stable rollback path
|
|
86
103
|
# intact — pointing the config back at @latest restores the main supervisor.
|
|
87
104
|
$mcpTag = if ($EffectiveMCPStartCommand -match 'sensorium-mcp@([A-Za-z0-9._-]+)') { $Matches[1] } else { "latest" }
|
|
88
|
-
$ReleaseTag = if ($mcpTag -eq "refactor") { "supervisor-refactor" } else { "supervisor-latest" }
|
|
105
|
+
$ReleaseTag = if ($mcpTag -eq "board") { "supervisor-board" } elseif ($mcpTag -eq "refactor") { "supervisor-refactor" } else { "supervisor-latest" }
|
|
89
106
|
Write-Host "Supervisor channel: $ReleaseTag (from MCP tag '$mcpTag')" -ForegroundColor Cyan
|
|
90
107
|
|
|
91
108
|
# Validate config values
|
|
@@ -102,8 +119,27 @@ Save-Config $Config
|
|
|
102
119
|
function Stop-SupervisorProcess {
|
|
103
120
|
$procs = Get-Process -Name "sensorium-supervisor" -ErrorAction SilentlyContinue
|
|
104
121
|
if ($procs) {
|
|
122
|
+
# Keep the original PID set. A name-only lookup after stopping can confuse a
|
|
123
|
+
# newly launched process with the instance we were asked to stop.
|
|
124
|
+
$targetPids = @($procs | Select-Object -ExpandProperty Id)
|
|
105
125
|
Write-Host "Stopping background sensorium-supervisor process(es)..."
|
|
106
|
-
$procs | Stop-Process -Force
|
|
126
|
+
$procs | Stop-Process -Force -ErrorAction Stop
|
|
127
|
+
|
|
128
|
+
# Stop-Process returns once a signal has been sent, not once all image/file
|
|
129
|
+
# handles are released. Do not attempt an in-place replacement until every
|
|
130
|
+
# PID we targeted is gone; a continuing process makes the update unsafe.
|
|
131
|
+
$deadline = (Get-Date).AddSeconds(10)
|
|
132
|
+
do {
|
|
133
|
+
$remainingPids = @($targetPids | Where-Object {
|
|
134
|
+
Get-Process -Id $_ -ErrorAction SilentlyContinue
|
|
135
|
+
})
|
|
136
|
+
if ($remainingPids.Count -eq 0) { break }
|
|
137
|
+
Start-Sleep -Milliseconds 250
|
|
138
|
+
} while ((Get-Date) -lt $deadline)
|
|
139
|
+
|
|
140
|
+
if ($remainingPids.Count -gt 0) {
|
|
141
|
+
throw "Refusing to update: sensorium-supervisor PID(s) $($remainingPids -join ', ') did not stop within 10 seconds."
|
|
142
|
+
}
|
|
107
143
|
Write-Host "Process(es) stopped." -ForegroundColor Yellow
|
|
108
144
|
}
|
|
109
145
|
}
|
|
@@ -212,7 +248,45 @@ function Save-BinaryMetadata {
|
|
|
212
248
|
InstalledAt = (Get-Date).ToString("o")
|
|
213
249
|
}
|
|
214
250
|
|
|
215
|
-
|
|
251
|
+
# Do not write metadata in place: a failure halfway through a write would make a
|
|
252
|
+
# good binary look stale on the next run. The temp name is unique so concurrent
|
|
253
|
+
# or previously interrupted installs cannot collide with it.
|
|
254
|
+
$metadataTempPath = "$MetadataPath.tmp.$PID.$([guid]::NewGuid().ToString('N'))"
|
|
255
|
+
try {
|
|
256
|
+
$metadata | ConvertTo-Json | Set-Content -LiteralPath $metadataTempPath -Encoding ASCII
|
|
257
|
+
Move-FileWithRetry -Source $metadataTempPath -Destination $MetadataPath -Operation "update release metadata"
|
|
258
|
+
}
|
|
259
|
+
finally {
|
|
260
|
+
if (Test-Path -LiteralPath $metadataTempPath) {
|
|
261
|
+
Remove-Item -LiteralPath $metadataTempPath -Force -ErrorAction SilentlyContinue
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
function Move-FileWithRetry {
|
|
267
|
+
param(
|
|
268
|
+
[string]$Source,
|
|
269
|
+
[string]$Destination,
|
|
270
|
+
[string]$Operation = "replace file",
|
|
271
|
+
[int]$MaxAttempts = 20,
|
|
272
|
+
[int]$RetryDelayMs = 1500
|
|
273
|
+
)
|
|
274
|
+
|
|
275
|
+
for ($attempt = 1; $attempt -le $MaxAttempts; $attempt++) {
|
|
276
|
+
try {
|
|
277
|
+
Move-Item -LiteralPath $Source -Destination $Destination -Force -ErrorAction Stop
|
|
278
|
+
return
|
|
279
|
+
}
|
|
280
|
+
catch {
|
|
281
|
+
if ($attempt -eq $MaxAttempts) {
|
|
282
|
+
throw "Failed to $Operation at $Destination after $MaxAttempts attempts (~$([math]::Round($MaxAttempts * $RetryDelayMs / 1000))s). Original error: $_"
|
|
283
|
+
}
|
|
284
|
+
if ($attempt % 4 -eq 0) {
|
|
285
|
+
Write-Host " ... waiting to $Operation (attempt $attempt/$MaxAttempts)..." -ForegroundColor Yellow
|
|
286
|
+
}
|
|
287
|
+
Start-Sleep -Milliseconds $RetryDelayMs
|
|
288
|
+
}
|
|
289
|
+
}
|
|
216
290
|
}
|
|
217
291
|
|
|
218
292
|
function Get-BinaryAsset {
|
|
@@ -229,7 +303,13 @@ function Get-BinaryAsset {
|
|
|
229
303
|
$headers = Get-GithubAuthHeaders -Accept "application/octet-stream"
|
|
230
304
|
Write-Host "Downloading $($AssetInfo.AssetName) ..."
|
|
231
305
|
|
|
232
|
-
$
|
|
306
|
+
$operationId = "$PID.$([guid]::NewGuid().ToString('N'))"
|
|
307
|
+
$tmpFile = "$Destination.tmp.$operationId"
|
|
308
|
+
$backupPath = "$Destination.bak.$operationId"
|
|
309
|
+
$metadataBackupPath = "$MetadataPath.bak.$operationId"
|
|
310
|
+
$hadBinary = Test-Path -LiteralPath $Destination
|
|
311
|
+
$hadMetadata = Test-Path -LiteralPath $MetadataPath
|
|
312
|
+
$swapped = $false
|
|
233
313
|
try {
|
|
234
314
|
Invoke-WebRequest -Uri $downloadUrl -Headers $headers -OutFile $tmpFile -UseBasicParsing -ErrorAction Stop
|
|
235
315
|
}
|
|
@@ -241,15 +321,74 @@ function Get-BinaryAsset {
|
|
|
241
321
|
throw "Download failed: $_"
|
|
242
322
|
}
|
|
243
323
|
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
Copy-Item $Destination $backupPath -Force
|
|
324
|
+
try {
|
|
325
|
+
# Preserve both halves of the installed state. If anything after the
|
|
326
|
+
# executable swap fails (notably metadata persistence), restore the pair.
|
|
327
|
+
if ($hadBinary) { Copy-Item -LiteralPath $Destination -Destination $backupPath -Force -ErrorAction Stop }
|
|
328
|
+
if ($hadMetadata) { Copy-Item -LiteralPath $MetadataPath -Destination $metadataBackupPath -Force -ErrorAction Stop }
|
|
329
|
+
|
|
330
|
+
# The old exe can still be locked for a while after Stop-Process — AV/EDR
|
|
331
|
+
# may retain its image-section handle during a post-exit scan.
|
|
332
|
+
Move-FileWithRetry -Source $tmpFile -Destination $Destination -Operation "replace supervisor binary"
|
|
333
|
+
$swapped = $true
|
|
334
|
+
|
|
335
|
+
try {
|
|
336
|
+
Unblock-File -Path $Destination -ErrorAction Stop
|
|
337
|
+
}
|
|
338
|
+
catch {
|
|
339
|
+
Write-Host "[WARN] Could not unblock ${Destination}: $($_.Exception.Message)" -ForegroundColor Yellow
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
Save-BinaryMetadata -MetadataPath $MetadataPath -AssetInfo $AssetInfo
|
|
343
|
+
Write-Host "Binary placed at: $Destination" -ForegroundColor Green
|
|
344
|
+
}
|
|
345
|
+
catch {
|
|
346
|
+
$updateError = $_
|
|
347
|
+
if ($swapped) {
|
|
348
|
+
Write-Host "[WARN] Update failed after binary replacement; restoring the previous binary and metadata..." -ForegroundColor Yellow
|
|
349
|
+
$restoreErrors = @()
|
|
350
|
+
try {
|
|
351
|
+
if ($hadBinary) {
|
|
352
|
+
$restoreFile = "$Destination.restore.$operationId"
|
|
353
|
+
Copy-Item -LiteralPath $backupPath -Destination $restoreFile -Force -ErrorAction Stop
|
|
354
|
+
Move-FileWithRetry -Source $restoreFile -Destination $Destination -Operation "restore previous supervisor binary"
|
|
355
|
+
}
|
|
356
|
+
elseif (Test-Path -LiteralPath $Destination) {
|
|
357
|
+
Remove-Item -LiteralPath $Destination -Force -ErrorAction Stop
|
|
358
|
+
}
|
|
359
|
+
}
|
|
360
|
+
catch { $restoreErrors += "binary: $($_.Exception.Message)" }
|
|
361
|
+
|
|
362
|
+
try {
|
|
363
|
+
if ($hadMetadata) {
|
|
364
|
+
# Stage the backup under a unique name, then use the same
|
|
365
|
+
# retrying replacement path as the binary. Copy-Item directly
|
|
366
|
+
# to $MetadataPath could leave metadata restoration vulnerable
|
|
367
|
+
# to a locked destination and bypass the retry policy.
|
|
368
|
+
$metadataRestoreFile = "$MetadataPath.restore.$operationId"
|
|
369
|
+
Copy-Item -LiteralPath $metadataBackupPath -Destination $metadataRestoreFile -Force -ErrorAction Stop
|
|
370
|
+
Move-FileWithRetry -Source $metadataRestoreFile -Destination $MetadataPath -Operation "restore previous release metadata"
|
|
371
|
+
}
|
|
372
|
+
elseif (Test-Path -LiteralPath $MetadataPath) {
|
|
373
|
+
Remove-Item -LiteralPath $MetadataPath -Force -ErrorAction Stop
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
catch { $restoreErrors += "metadata: $($_.Exception.Message)" }
|
|
377
|
+
|
|
378
|
+
if ($restoreErrors.Count -gt 0) {
|
|
379
|
+
throw "Update failed and recovery was incomplete ($($restoreErrors -join '; ')). Original error: $($updateError.Exception.Message)"
|
|
380
|
+
}
|
|
381
|
+
throw "Update failed after replacement; the previous binary and metadata were restored. Original error: $($updateError.Exception.Message)"
|
|
382
|
+
}
|
|
383
|
+
throw
|
|
384
|
+
}
|
|
385
|
+
finally {
|
|
386
|
+
foreach ($path in @($tmpFile, $backupPath, $metadataBackupPath, "$Destination.restore.$operationId", "$MetadataPath.restore.$operationId")) {
|
|
387
|
+
if (Test-Path -LiteralPath $path) {
|
|
388
|
+
Remove-Item -LiteralPath $path -Force -ErrorAction SilentlyContinue
|
|
389
|
+
}
|
|
390
|
+
}
|
|
248
391
|
}
|
|
249
|
-
Move-Item $tmpFile $Destination -Force
|
|
250
|
-
Unblock-File -Path $Destination -ErrorAction SilentlyContinue
|
|
251
|
-
Save-BinaryMetadata -MetadataPath $MetadataPath -AssetInfo $AssetInfo
|
|
252
|
-
Write-Host "Binary placed at: $Destination" -ForegroundColor Green
|
|
253
392
|
}
|
|
254
393
|
|
|
255
394
|
function Install-StartupLauncher {
|
|
@@ -306,10 +445,44 @@ function Test-SecureVaultAvailable {
|
|
|
306
445
|
catch { return $false }
|
|
307
446
|
}
|
|
308
447
|
|
|
448
|
+
function Initialize-IsolatedMcpRuntime {
|
|
449
|
+
<#
|
|
450
|
+
Prepares the PRIVATE MCP runtime area: a dedicated npm cache and a
|
|
451
|
+
repo-independent cwd, both under $McpRuntimeRoot. It does NOT install or pin
|
|
452
|
+
any package — the MCP keeps its `npx ...@latest` start command so auto-update
|
|
453
|
+
still works; isolation comes purely from the private cache + cwd handed to the
|
|
454
|
+
supervisor (and thus to npx) via Start-Supervisor. Idempotent; only creates dirs.
|
|
455
|
+
#>
|
|
456
|
+
Write-Host "Isolated MCP runtime enabled — preparing private cache + cwd..." -ForegroundColor Cyan
|
|
457
|
+
Write-Host " Runtime cwd : $McpRuntimeRoot"
|
|
458
|
+
Write-Host " npm cache : $McpRuntimeCache (npx stages under $McpRuntimeCache\_npx)"
|
|
459
|
+
|
|
460
|
+
try {
|
|
461
|
+
New-Item -ItemType Directory -Path $McpRuntimeRoot -Force | Out-Null
|
|
462
|
+
New-Item -ItemType Directory -Path $McpRuntimeCache -Force | Out-Null
|
|
463
|
+
}
|
|
464
|
+
catch {
|
|
465
|
+
Write-Host "[WARN] Could not create isolated runtime dirs: $($_.Exception.Message) — keeping legacy behaviour." -ForegroundColor Yellow
|
|
466
|
+
return $false
|
|
467
|
+
}
|
|
468
|
+
return $true
|
|
469
|
+
}
|
|
470
|
+
|
|
309
471
|
function Start-Supervisor {
|
|
310
472
|
$env:SUPERVISOR_UPDATE_MODE = $UpdateMode
|
|
311
473
|
$env:MCP_START_COMMAND = $EffectiveMCPStartCommand
|
|
312
474
|
|
|
475
|
+
# In isolated mode, hand the supervisor a private npm cache and a repo-independent
|
|
476
|
+
# cwd. The supervisor inherits its whole environment and passes it to the MCP, so
|
|
477
|
+
# NPM_CONFIG_CACHE reaches the `npx ...@latest` child automatically (isolating both
|
|
478
|
+
# the npm cache and npx's <cache>\_npx staging); MCP_WORKING_DIR is consumed by the
|
|
479
|
+
# supervisor to set the MCP's spawn cwd. The `@latest` command is unchanged, so
|
|
480
|
+
# auto-update keeps working — only WHERE npx resolves/caches changes.
|
|
481
|
+
if ($IsolateMcpRuntime) {
|
|
482
|
+
$env:NPM_CONFIG_CACHE = $McpRuntimeCache
|
|
483
|
+
$env:MCP_WORKING_DIR = $McpRuntimeRoot
|
|
484
|
+
}
|
|
485
|
+
|
|
313
486
|
$useSecureVault = (-not [string]::IsNullOrWhiteSpace($SecureVaultProfile)) -and (Test-SecureVaultAvailable)
|
|
314
487
|
|
|
315
488
|
if ($useSecureVault) {
|
|
@@ -390,7 +563,7 @@ function Sync-ReleaseBinary {
|
|
|
390
563
|
Write-Host "Fetching release via SecureVault (profile: $SecureVaultProfile)..."
|
|
391
564
|
securevault run pwsh -NoProfile -File "`"$PSCommandPath`"" -SyncReleaseOnly --profile $SecureVaultProfile
|
|
392
565
|
if ($LASTEXITCODE -ne 0) {
|
|
393
|
-
throw "SecureVault-driven release sync failed (exit $LASTEXITCODE).
|
|
566
|
+
throw "SecureVault-driven release sync failed (exit $LASTEXITCODE). See the error above for the actual cause (e.g. a locked binary, network failure, or a missing GitHub PAT for profile '$SecureVaultProfile' -> `$env:SENSORIUM_GH_TOKEN)."
|
|
394
567
|
}
|
|
395
568
|
}
|
|
396
569
|
|
|
@@ -402,35 +575,76 @@ if ($SyncReleaseOnly) {
|
|
|
402
575
|
}
|
|
403
576
|
|
|
404
577
|
# ── Main ─────────────────────────────────────────────────────────────────────
|
|
405
|
-
|
|
578
|
+
# Serialize only full installer invocations for this Windows user. The
|
|
579
|
+
# SecureVault child above deliberately returns before this point, so it can do
|
|
580
|
+
# the authenticated release sync without waiting on (and deadlocking with) its
|
|
581
|
+
# parent installer process.
|
|
582
|
+
$currentUserSid = [Security.Principal.WindowsIdentity]::GetCurrent().User.Value
|
|
583
|
+
$installMutexName = "Local\SensoriumSupervisor.Install.$($currentUserSid -replace '[^A-Za-z0-9_.-]', '_')"
|
|
584
|
+
$installMutex = [System.Threading.Mutex]::new($false, $installMutexName)
|
|
585
|
+
$mutexHeld = $false
|
|
586
|
+
|
|
587
|
+
try {
|
|
588
|
+
try {
|
|
589
|
+
$mutexHeld = $installMutex.WaitOne([TimeSpan]::FromMinutes(5))
|
|
590
|
+
}
|
|
591
|
+
catch [System.Threading.AbandonedMutexException] {
|
|
592
|
+
# The prior installer died without releasing the mutex; Windows has given
|
|
593
|
+
# us ownership, so continue while making that state visible to the user.
|
|
594
|
+
$mutexHeld = $true
|
|
595
|
+
Write-Host "[WARN] Recovered an abandoned installer mutex; continuing." -ForegroundColor Yellow
|
|
596
|
+
}
|
|
406
597
|
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
}
|
|
411
|
-
else {
|
|
412
|
-
Write-Host "=== Sensorium Supervisor INSTALL ===" -ForegroundColor Cyan
|
|
413
|
-
}
|
|
414
|
-
Write-Host "SecureVault profile: $(if ([string]::IsNullOrWhiteSpace($SecureVaultProfile)) { '<disabled>' } else { $SecureVaultProfile })"
|
|
415
|
-
Write-Host "Watcher mode: $UpdateMode"
|
|
416
|
-
Write-Host "MCP start command: $EffectiveMCPStartCommand"
|
|
417
|
-
Write-Host "Binary : $Binary"
|
|
418
|
-
Write-Host ""
|
|
419
|
-
|
|
420
|
-
# Step 1 — stop existing instance
|
|
421
|
-
if ($alreadyExists) {
|
|
422
|
-
Stop-SupervisorProcess
|
|
423
|
-
}
|
|
598
|
+
if (-not $mutexHeld) {
|
|
599
|
+
throw "Another Sensorium install/update is still running for this user. Timed out waiting for it to finish."
|
|
600
|
+
}
|
|
424
601
|
|
|
425
|
-
|
|
426
|
-
New-Item -ItemType Directory -Path $BinDir -Force | Out-Null
|
|
602
|
+
$alreadyExists = Test-Path $Binary
|
|
427
603
|
|
|
428
|
-
|
|
429
|
-
|
|
604
|
+
Write-Host ""
|
|
605
|
+
if ($alreadyExists) {
|
|
606
|
+
Write-Host "=== Sensorium Supervisor UPDATE ===" -ForegroundColor Cyan
|
|
607
|
+
}
|
|
608
|
+
else {
|
|
609
|
+
Write-Host "=== Sensorium Supervisor INSTALL ===" -ForegroundColor Cyan
|
|
610
|
+
}
|
|
611
|
+
Write-Host "SecureVault profile: $(if ([string]::IsNullOrWhiteSpace($SecureVaultProfile)) { '<disabled>' } else { $SecureVaultProfile })"
|
|
612
|
+
Write-Host "Watcher mode: $UpdateMode"
|
|
613
|
+
Write-Host "MCP start command: $EffectiveMCPStartCommand"
|
|
614
|
+
Write-Host "MCP runtime isolation: $(if ($IsolateMcpRuntime) { 'ENABLED' } else { 'disabled (legacy npx)' })"
|
|
615
|
+
Write-Host "Binary : $Binary"
|
|
616
|
+
Write-Host ""
|
|
617
|
+
|
|
618
|
+
# Step 1 — stop existing instance
|
|
619
|
+
if ($alreadyExists) {
|
|
620
|
+
Stop-SupervisorProcess
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
# Step 2 — ensure bin dir exists
|
|
624
|
+
New-Item -ItemType Directory -Path $BinDir -Force | Out-Null
|
|
625
|
+
|
|
626
|
+
# Step 3 — fetch release metadata and download only when needed
|
|
627
|
+
Sync-ReleaseBinary
|
|
628
|
+
|
|
629
|
+
# Step 3b — prepare the isolated MCP runtime area (opt-in): a private npm cache +
|
|
630
|
+
# repo-independent cwd. The `npx ...@latest` command is unchanged (auto-update
|
|
631
|
+
# preserved). On any failure this disables the isolation env in Start-Supervisor,
|
|
632
|
+
# so the install degrades safely to legacy behaviour.
|
|
633
|
+
if ($IsolateMcpRuntime) {
|
|
634
|
+
if (-not (Initialize-IsolatedMcpRuntime)) {
|
|
635
|
+
$IsolateMcpRuntime = $false
|
|
636
|
+
Write-Host "[WARN] Isolation disabled for this run — using the shared npm cache / inherited cwd." -ForegroundColor Yellow
|
|
637
|
+
}
|
|
638
|
+
}
|
|
430
639
|
|
|
431
|
-
# Step 4 — install launcher and start
|
|
432
|
-
Install-StartupLauncher
|
|
433
|
-
Start-Supervisor
|
|
640
|
+
# Step 4 — install launcher and start
|
|
641
|
+
Install-StartupLauncher
|
|
642
|
+
Start-Supervisor
|
|
434
643
|
|
|
435
|
-
# Step 5 — verify
|
|
436
|
-
Show-Status
|
|
644
|
+
# Step 5 — verify
|
|
645
|
+
Show-Status
|
|
646
|
+
}
|
|
647
|
+
finally {
|
|
648
|
+
if ($mutexHeld) { $installMutex.ReleaseMutex() }
|
|
649
|
+
if ($installMutex) { $installMutex.Dispose() }
|
|
650
|
+
}
|
package/README.md
CHANGED
|
@@ -5,6 +5,8 @@
|
|
|
5
5
|
|
|
6
6
|
MCP server with multi-layer memory, voice analysis, multi-thread orchestration, and Telegram bridge for AI assistants.
|
|
7
7
|
|
|
8
|
+
Internal TypeScript conventions: [coding guidelines](docs/coding-guidelines.md).
|
|
9
|
+
|
|
8
10
|
## Why?
|
|
9
11
|
|
|
10
12
|
AI assistants forget everything between sessions. Every restart is a blank slate — no memory of your preferences, past decisions, or ongoing projects. Voice messages arrive as opaque audio blobs. And there's no way to talk to your agent when it's running headless in CI or on a remote machine.
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Data-adapter switch. ❌ FROZEN SEAM — the ONLY seam is data.
|
|
3
|
+
*
|
|
4
|
+
* MODE decides the implementation ONCE, lazily:
|
|
5
|
+
* - preview → mock/api.mock.js is DYNAMICALLY imported (so not a single mock
|
|
6
|
+
* byte is loaded in production).
|
|
7
|
+
* - production → api/client.js (real fetch).
|
|
8
|
+
*
|
|
9
|
+
* Every method returns a Promise and forwards to the resolved adapter, so callers
|
|
10
|
+
* (state/ composables) never know or care which one is live.
|
|
11
|
+
*
|
|
12
|
+
* @typedef {import('./contract.js').BoardApi} BoardApi
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import { MODE } from "../config.js";
|
|
16
|
+
|
|
17
|
+
let implPromise = null;
|
|
18
|
+
|
|
19
|
+
/** @returns {Promise<BoardApi>} */
|
|
20
|
+
function load() {
|
|
21
|
+
if (!implPromise) {
|
|
22
|
+
implPromise = (
|
|
23
|
+
MODE === "preview"
|
|
24
|
+
? import("../mock/api.mock.js").then((m) => m.mockApi)
|
|
25
|
+
: import("./client.js").then((m) => m.client)
|
|
26
|
+
).then(assertAdapterComplete);
|
|
27
|
+
}
|
|
28
|
+
return implPromise;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
const METHODS = [
|
|
32
|
+
"listCards",
|
|
33
|
+
"getCard",
|
|
34
|
+
"createCard",
|
|
35
|
+
"previewBriefing",
|
|
36
|
+
"updateCard",
|
|
37
|
+
"deleteCard",
|
|
38
|
+
"stopCard",
|
|
39
|
+
"addComment",
|
|
40
|
+
"postDecision",
|
|
41
|
+
"listLaneGroups",
|
|
42
|
+
"getProfiles",
|
|
43
|
+
"saveProfile",
|
|
44
|
+
"threadRunning",
|
|
45
|
+
"threadLogs",
|
|
46
|
+
// Card-builder "How" schema + presets.
|
|
47
|
+
"getPolicySchema",
|
|
48
|
+
"getPresets",
|
|
49
|
+
"createLaneGroup",
|
|
50
|
+
"updateLaneGroup",
|
|
51
|
+
"deleteLaneGroup",
|
|
52
|
+
// Working-directory picker: one filesystem level per call (lazy browse).
|
|
53
|
+
"listDir",
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Fail LOUD if the resolved adapter is missing any METHODS entry. A method listed
|
|
58
|
+
* in the contract/registry but never implemented in the active adapter used to
|
|
59
|
+
* surface as a late "undefined is not a function" at call time — exactly how
|
|
60
|
+
* lane-group CRUD and previewBriefing broke in production
|
|
61
|
+
* while preview worked. Asserting completeness once, at load, turns that silent
|
|
62
|
+
* drift into an immediate, named error.
|
|
63
|
+
*
|
|
64
|
+
* @param {Partial<BoardApi>} impl
|
|
65
|
+
* @returns {BoardApi}
|
|
66
|
+
*/
|
|
67
|
+
function assertAdapterComplete(impl) {
|
|
68
|
+
const missing = METHODS.filter((name) => typeof impl?.[name] !== "function");
|
|
69
|
+
if (missing.length) {
|
|
70
|
+
throw new Error(
|
|
71
|
+
`Board API adapter is missing method(s): ${missing.join(", ")}. ` +
|
|
72
|
+
`Every METHODS entry must be implemented by the active adapter (api/client.js or mock/api.mock.js).`,
|
|
73
|
+
);
|
|
74
|
+
}
|
|
75
|
+
return /** @type {BoardApi} */ (impl);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** @type {BoardApi} */
|
|
79
|
+
const api = /** @type {any} */ ({});
|
|
80
|
+
for (const name of METHODS) {
|
|
81
|
+
api[name] = (...args) => load().then((impl) => impl[name](...args));
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
export { api, assertAdapterComplete };
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import assert from "node:assert/strict";
|
|
2
|
+
import { test } from "node:test";
|
|
3
|
+
import { assertAdapterComplete } from "./api.js";
|
|
4
|
+
import { client } from "./client.js";
|
|
5
|
+
import type { BoardApi } from "./contract.js";
|
|
6
|
+
|
|
7
|
+
test("the adapter completeness guard passes for the production client", () => {
|
|
8
|
+
// Arrange
|
|
9
|
+
const impl = client;
|
|
10
|
+
|
|
11
|
+
// Act & Assert — every contract/registry method is now implemented in client.js.
|
|
12
|
+
assert.doesNotThrow(() => assertAdapterComplete(impl));
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
test("the adapter completeness guard throws naming a method missing from the adapter", () => {
|
|
16
|
+
// Arrange — a client with one contract method dropped (the exact drift that
|
|
17
|
+
// shipped lane CRUD as a late `undefined is not a function`).
|
|
18
|
+
const incomplete: Partial<BoardApi> = { ...client };
|
|
19
|
+
delete incomplete.createLaneGroup;
|
|
20
|
+
|
|
21
|
+
// Act & Assert
|
|
22
|
+
assert.throws(() => assertAdapterComplete(incomplete), /createLaneGroup/);
|
|
23
|
+
});
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Production data adapter. ❌ FROZEN SEAM.
|
|
3
|
+
*
|
|
4
|
+
* Real `fetch` to the board API. Root-relative `/api/...` paths (never a host or
|
|
5
|
+
* port) so the app works unchanged behind the Dev Tunnel. This is the ONLY module
|
|
6
|
+
* that talks to the network.
|
|
7
|
+
*
|
|
8
|
+
* @typedef {import('./contract.js').BoardApi} BoardApi
|
|
9
|
+
* @typedef {import('./contract.js').BoardCard} BoardCard
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { API_BASE } from "../config.js";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @param {string} method
|
|
16
|
+
* @param {string} path
|
|
17
|
+
* @param {unknown} [body]
|
|
18
|
+
*/
|
|
19
|
+
async function req(method, path, body) {
|
|
20
|
+
const headers = {};
|
|
21
|
+
if (body !== undefined) headers["Content-Type"] = "application/json";
|
|
22
|
+
|
|
23
|
+
const res = await fetch(`${API_BASE}${path}`, {
|
|
24
|
+
method,
|
|
25
|
+
headers,
|
|
26
|
+
...(body !== undefined ? { body: JSON.stringify(body) } : {}),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
const text = await res.text();
|
|
30
|
+
let data = null;
|
|
31
|
+
if (text) {
|
|
32
|
+
try {
|
|
33
|
+
data = JSON.parse(text);
|
|
34
|
+
} catch {
|
|
35
|
+
data = { error: text };
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
if (!res.ok) {
|
|
39
|
+
const msg = (data && data.error) || `${res.status} ${res.statusText}`;
|
|
40
|
+
const err = new Error(msg);
|
|
41
|
+
err.status = res.status;
|
|
42
|
+
throw err;
|
|
43
|
+
}
|
|
44
|
+
return data;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** @type {BoardApi} */
|
|
48
|
+
export const client = {
|
|
49
|
+
listCards({ includeArchived = false } = {}) {
|
|
50
|
+
const p = new URLSearchParams();
|
|
51
|
+
if (includeArchived) p.set("includeArchived", "1");
|
|
52
|
+
const qs = p.toString();
|
|
53
|
+
return req("GET", `/api/board/cards${qs ? `?${qs}` : ""}`);
|
|
54
|
+
},
|
|
55
|
+
getCard(id) {
|
|
56
|
+
return req("GET", `/api/board/cards/${id}`);
|
|
57
|
+
},
|
|
58
|
+
createCard(card) {
|
|
59
|
+
return req("POST", "/api/board/cards", card).then((d) => d.card);
|
|
60
|
+
},
|
|
61
|
+
previewBriefing(draft) {
|
|
62
|
+
return req("POST", "/api/board/cards/preview", draft).then((d) => d.briefing);
|
|
63
|
+
},
|
|
64
|
+
updateCard(id, patch) {
|
|
65
|
+
return req("PATCH", `/api/board/cards/${id}`, patch).then((d) => d.card);
|
|
66
|
+
},
|
|
67
|
+
deleteCard(id) {
|
|
68
|
+
return req("DELETE", `/api/board/cards/${id}`).then(() => undefined);
|
|
69
|
+
},
|
|
70
|
+
stopCard(id) {
|
|
71
|
+
return req("POST", `/api/board/cards/${id}/stop`, {}).then((d) => d.card);
|
|
72
|
+
},
|
|
73
|
+
addComment(id, content) {
|
|
74
|
+
return req("POST", `/api/board/cards/${id}/comments`, { content }).then((d) => d.comment);
|
|
75
|
+
},
|
|
76
|
+
postDecision(id, answer) {
|
|
77
|
+
return req("POST", `/api/board/cards/${id}/decision`, { answer }).then((d) => d.card);
|
|
78
|
+
},
|
|
79
|
+
listLaneGroups() {
|
|
80
|
+
return req("GET", "/api/board/lane-groups").then((d) => d.laneGroups);
|
|
81
|
+
},
|
|
82
|
+
createLaneGroup(name) {
|
|
83
|
+
return req("POST", "/api/board/lane-groups", { name }).then((d) => d.laneGroup);
|
|
84
|
+
},
|
|
85
|
+
updateLaneGroup(id, patch) {
|
|
86
|
+
return req("PATCH", `/api/board/lane-groups/${id}`, patch).then((d) => d.laneGroup);
|
|
87
|
+
},
|
|
88
|
+
deleteLaneGroup(id) {
|
|
89
|
+
return req("DELETE", `/api/board/lane-groups/${id}`).then(() => undefined);
|
|
90
|
+
},
|
|
91
|
+
getProfiles() {
|
|
92
|
+
return req("GET", "/api/board/profiles").then((d) => d.profiles);
|
|
93
|
+
},
|
|
94
|
+
saveProfile(input) {
|
|
95
|
+
return req("POST", "/api/board/profiles", input).then((d) => d.profile);
|
|
96
|
+
},
|
|
97
|
+
threadRunning(threadId) {
|
|
98
|
+
return req("GET", `/api/threads/${threadId}/running`).then((d) => !!d.running);
|
|
99
|
+
},
|
|
100
|
+
threadLogs(threadId, { view = "assistant", offset = 0, limit = 4000 } = {}) {
|
|
101
|
+
const params = new URLSearchParams({ view, offset: String(offset), limit: String(limit) });
|
|
102
|
+
return req("GET", `/api/threads/${threadId}/logs?${params}`);
|
|
103
|
+
},
|
|
104
|
+
getPolicySchema() {
|
|
105
|
+
return req("GET", "/api/board/policy").then((d) => d.schema);
|
|
106
|
+
},
|
|
107
|
+
getPresets() {
|
|
108
|
+
return req("GET", "/api/board/policy").then((d) => d.presets);
|
|
109
|
+
},
|
|
110
|
+
listDir(path) {
|
|
111
|
+
return req("GET", `/api/board/dir-listing?path=${encodeURIComponent(path || "")}`);
|
|
112
|
+
},
|
|
113
|
+
};
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bottom navigation — ✅ EDITABLE. Pure: `active` in, `navigate` out.
|
|
3
|
+
* Thumb-reach primary nav (board / new / settings).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export default {
|
|
7
|
+
name: "BottomNav",
|
|
8
|
+
props: { active: { type: String, default: "board" } },
|
|
9
|
+
emits: ["navigate"],
|
|
10
|
+
setup(props, { emit }) {
|
|
11
|
+
const items = [
|
|
12
|
+
{ name: "board", to: "/board", label: "Board", icon: "▦" },
|
|
13
|
+
{ name: "settings", to: "/settings", label: "Settings", icon: "⚙" },
|
|
14
|
+
];
|
|
15
|
+
return { items, emit };
|
|
16
|
+
},
|
|
17
|
+
template: `
|
|
18
|
+
<nav class="bottom-nav">
|
|
19
|
+
<button
|
|
20
|
+
v-for="it in items"
|
|
21
|
+
:key="it.name"
|
|
22
|
+
type="button"
|
|
23
|
+
class="bottom-nav__item"
|
|
24
|
+
:class="{ 'is-active': active === it.name }"
|
|
25
|
+
@click="emit('navigate', it.to)"
|
|
26
|
+
>
|
|
27
|
+
<span class="bottom-nav__icon" aria-hidden="true">{{ it.icon }}</span>
|
|
28
|
+
<span class="bottom-nav__label">{{ it.label }}</span>
|
|
29
|
+
</button>
|
|
30
|
+
</nav>
|
|
31
|
+
`,
|
|
32
|
+
};
|