sensorium-mcp 3.1.3-board.2 → 3.1.3-board.20
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 +206 -53
- package/README.md +4 -1
- package/dist/board/api/api.js +37 -14
- package/dist/board/api/api.test.ts +24 -0
- package/dist/board/api/client.js +33 -16
- package/dist/board/components/Card.js +41 -7
- package/dist/board/components/Combobox.js +79 -0
- package/dist/board/components/CommentComposer.js +4 -1
- package/dist/board/components/CommentList.js +4 -1
- package/dist/board/components/DirTreePicker.js +128 -0
- package/dist/board/components/Dropdown.js +2 -1
- package/dist/board/components/Lane.js +10 -3
- package/dist/board/components/PriorityChip.js +5 -2
- package/dist/board/components/ProfileSummary.js +72 -22
- package/dist/board/components/StateBanner.js +5 -3
- package/dist/board/components/StatusChip.js +7 -2
- package/dist/board/components/rateLimit.js +32 -0
- package/dist/board/components/rateLimit.test.ts +17 -0
- package/dist/board/components/time.js +14 -0
- package/dist/board/config.js +3 -3
- package/dist/board/mock/api.mock.js +455 -158
- package/dist/board/mock/api.mock.test.ts +460 -0
- package/dist/board/mock/fixtures.js +392 -45
- package/dist/board/schema/policy.js +155 -86
- package/dist/board/state/recur.js +24 -0
- package/dist/board/state/recur.test.ts +25 -0
- package/dist/board/state/useBoard.js +39 -27
- package/dist/board/state/useBuilder.js +284 -25
- package/dist/board/state/useBuilder.test.ts +469 -0
- package/dist/board/state/useCard.js +157 -31
- package/dist/board/state/useCard.test.ts +435 -0
- package/dist/board/state/useDirBrowser.js +23 -0
- package/dist/board/styles/board.css +1148 -23
- package/dist/board/styles/tokens.css +2 -1
- package/dist/board/views/App.js +17 -21
- package/dist/board/views/BoardView.js +78 -9
- package/dist/board/views/BuilderView.js +356 -77
- package/dist/board/views/CardView.js +247 -110
- package/dist/board/views/SettingsView.js +84 -77
- package/dist/cli/board/bin.d.ts +4 -0
- package/dist/cli/board/bin.d.ts.map +1 -0
- package/dist/cli/board/bin.js +12 -0
- package/dist/cli/board/bin.js.map +1 -0
- package/dist/cli/board/client.d.ts +46 -0
- package/dist/cli/board/client.d.ts.map +1 -0
- package/dist/cli/board/client.js +72 -0
- package/dist/cli/board/client.js.map +1 -0
- package/dist/cli/board/format.d.ts +16 -0
- package/dist/cli/board/format.d.ts.map +1 -0
- package/dist/cli/board/format.js +92 -0
- package/dist/cli/board/format.js.map +1 -0
- package/dist/cli/board/locate.d.ts +10 -0
- package/dist/cli/board/locate.d.ts.map +1 -0
- package/dist/cli/board/locate.js +16 -0
- package/dist/cli/board/locate.js.map +1 -0
- package/dist/cli/board/run.d.ts +25 -0
- package/dist/cli/board/run.d.ts.map +1 -0
- package/dist/cli/board/run.js +187 -0
- package/dist/cli/board/run.js.map +1 -0
- package/dist/config/agent-settings.d.ts +97 -60
- package/dist/config/agent-settings.d.ts.map +1 -1
- package/dist/config/agent-settings.js +316 -205
- package/dist/config/agent-settings.js.map +1 -1
- package/dist/config/agent-templates.d.ts +23 -18
- package/dist/config/agent-templates.d.ts.map +1 -1
- package/dist/config/agent-templates.js +74 -73
- package/dist/config/agent-templates.js.map +1 -1
- package/dist/config/agent-types.d.ts +8 -0
- package/dist/config/agent-types.d.ts.map +1 -0
- package/dist/config/agent-types.js +9 -0
- package/dist/config/agent-types.js.map +1 -0
- 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 +1 -1
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +5 -1
- package/dist/config/index.js.map +1 -1
- package/dist/config/mcp-settings.d.ts +14 -15
- package/dist/config/mcp-settings.d.ts.map +1 -1
- package/dist/config/mcp-settings.js +96 -73
- package/dist/config/mcp-settings.js.map +1 -1
- package/dist/config/misc-settings.d.ts +33 -41
- package/dist/config/misc-settings.d.ts.map +1 -1
- package/dist/config/misc-settings.js +214 -145
- 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/settings-store.d.ts +49 -39
- package/dist/config/settings-store.d.ts.map +1 -1
- package/dist/config/settings-store.js +80 -120
- package/dist/config/settings-store.js.map +1 -1
- 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 +2 -3
- package/dist/dashboard/board-static.d.ts.map +1 -1
- package/dist/dashboard/board-static.js +2 -3
- package/dist/dashboard/board-static.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 +5 -4
- 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 +15 -16
- 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 +349 -0
- package/dist/dashboard/routes/board-profile-parse.js.map +1 -0
- package/dist/dashboard/routes/board.d.ts +51 -26
- package/dist/dashboard/routes/board.d.ts.map +1 -1
- package/dist/dashboard/routes/board.js +454 -339
- package/dist/dashboard/routes/board.js.map +1 -1
- package/dist/dashboard/routes/claude.d.ts +6 -2
- package/dist/dashboard/routes/claude.d.ts.map +1 -1
- package/dist/dashboard/routes/claude.js +111 -87
- package/dist/dashboard/routes/claude.js.map +1 -1
- package/dist/dashboard/routes/cli-path-validation.d.ts +25 -0
- package/dist/dashboard/routes/cli-path-validation.d.ts.map +1 -0
- package/dist/dashboard/routes/cli-path-validation.js +55 -0
- package/dist/dashboard/routes/cli-path-validation.js.map +1 -0
- package/dist/dashboard/routes/codex.d.ts +18 -0
- package/dist/dashboard/routes/codex.d.ts.map +1 -0
- package/dist/dashboard/routes/codex.js +119 -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 +9 -3
- package/dist/dashboard/routes/prompts.js.map +1 -1
- package/dist/dashboard/routes/settings.d.ts +3 -6
- package/dist/dashboard/routes/settings.d.ts.map +1 -1
- package/dist/dashboard/routes/settings.js +35 -132
- 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.d.ts.map +1 -1
- package/dist/dashboard/routes/templates.js +6 -7
- 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 +37 -25
- package/dist/dashboard/routes/threads-create.js.map +1 -1
- package/dist/dashboard/routes/threads-helpers.d.ts +11 -3
- package/dist/dashboard/routes/threads-helpers.d.ts.map +1 -1
- package/dist/dashboard/routes/threads-helpers.js +23 -7
- package/dist/dashboard/routes/threads-helpers.js.map +1 -1
- package/dist/dashboard/routes/threads-read.d.ts +16 -8
- package/dist/dashboard/routes/threads-read.d.ts.map +1 -1
- package/dist/dashboard/routes/threads-read.js +66 -76
- package/dist/dashboard/routes/threads-read.js.map +1 -1
- package/dist/dashboard/routes/threads.d.ts +8 -4
- package/dist/dashboard/routes/threads.d.ts.map +1 -1
- package/dist/dashboard/routes/threads.js +153 -75
- package/dist/dashboard/routes/threads.js.map +1 -1
- package/dist/dashboard/routes/types.d.ts +0 -6
- 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 +67 -26
- package/dist/dashboard/routes.js.map +1 -1
- package/dist/dashboard/spa.html +14 -11
- package/dist/data/board/board-schema.d.ts +8 -1
- package/dist/data/board/board-schema.d.ts.map +1 -1
- package/dist/data/board/board-schema.js +204 -49
- package/dist/data/board/board-schema.js.map +1 -1
- package/dist/data/board/board-types.d.ts +75 -15
- package/dist/data/board/board-types.d.ts.map +1 -1
- package/dist/data/board/board-types.js +9 -1
- package/dist/data/board/board-types.js.map +1 -1
- package/dist/data/board/card.repository.d.ts +54 -17
- package/dist/data/board/card.repository.d.ts.map +1 -1
- package/dist/data/board/card.repository.js +193 -57
- package/dist/data/board/card.repository.js.map +1 -1
- package/dist/data/board/journal.repository.d.ts +38 -0
- package/dist/data/board/journal.repository.d.ts.map +1 -0
- package/dist/data/board/journal.repository.js +38 -0
- package/dist/data/board/journal.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 +16 -18
- package/dist/data/board/profile-defaults.d.ts.map +1 -1
- package/dist/data/board/profile-defaults.js +94 -105
- package/dist/data/board/profile-defaults.js.map +1 -1
- package/dist/data/file-storage.d.ts +12 -13
- package/dist/data/file-storage.d.ts.map +1 -1
- package/dist/data/file-storage.js +43 -133
- package/dist/data/file-storage.js.map +1 -1
- package/dist/data/interfaces.d.ts +1 -0
- package/dist/data/interfaces.d.ts.map +1 -1
- package/dist/data/json.d.ts +6 -0
- package/dist/data/json.d.ts.map +1 -0
- package/dist/data/json.js +14 -0
- package/dist/data/json.js.map +1 -0
- 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 +419 -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 +10 -0
- package/dist/data/memory/narrative-store.d.ts.map +1 -1
- package/dist/data/memory/narrative-store.js +37 -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 +34 -28
- 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 +117 -1
- package/dist/data/memory/schema-ddl.d.ts.map +1 -1
- package/dist/data/memory/schema-ddl.js +171 -5
- 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 -46
- package/dist/data/memory/schema-guard.js.map +1 -1
- package/dist/data/memory/schema.d.ts +5 -1
- package/dist/data/memory/schema.d.ts.map +1 -1
- package/dist/data/memory/schema.js +15 -38
- 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 +304 -25
- package/dist/data/memory/thread-registry.d.ts.map +1 -1
- package/dist/data/memory/thread-registry.js +471 -88
- 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 +242 -0
- package/dist/data/memory/worker-lifecycle.repository.d.ts.map +1 -0
- package/dist/data/memory/worker-lifecycle.repository.js +322 -0
- package/dist/data/memory/worker-lifecycle.repository.js.map +1 -0
- package/dist/data/optional.d.ts +3 -0
- package/dist/data/optional.d.ts.map +1 -0
- package/dist/data/optional.js +3 -0
- package/dist/data/optional.js.map +1 -0
- package/dist/index.js +107 -92
- package/dist/index.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/json.d.ts +7 -0
- package/dist/lib/json.d.ts.map +1 -0
- package/dist/lib/json.js +2 -0
- package/dist/lib/json.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/optional.d.ts +16 -0
- package/dist/lib/optional.d.ts.map +1 -0
- package/dist/lib/optional.js +47 -0
- package/dist/lib/optional.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/resume-fact.d.ts +15 -0
- package/dist/lib/resume-fact.d.ts.map +1 -0
- package/dist/lib/resume-fact.js +30 -0
- package/dist/lib/resume-fact.js.map +1 -0
- package/dist/lib/types.d.ts +2 -0
- package/dist/lib/types.d.ts.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 +26 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +38 -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/factory.d.ts.map +1 -1
- package/dist/server/factory.js +23 -4
- package/dist/server/factory.js.map +1 -1
- package/dist/server/http-server.d.ts +3 -4
- package/dist/server/http-server.d.ts.map +1 -1
- package/dist/server/http-server.js +25 -90
- package/dist/server/http-server.js.map +1 -1
- package/dist/services/admission/admission.d.ts +95 -0
- package/dist/services/admission/admission.d.ts.map +1 -0
- package/dist/services/admission/admission.js +122 -0
- package/dist/services/admission/admission.js.map +1 -0
- package/dist/services/admission/backoff.d.ts +4 -0
- package/dist/services/admission/backoff.d.ts.map +1 -0
- package/dist/services/admission/backoff.js +9 -0
- package/dist/services/admission/backoff.js.map +1 -0
- package/dist/services/admission/card-attempt.d.ts +18 -0
- package/dist/services/admission/card-attempt.d.ts.map +1 -0
- package/dist/services/admission/card-attempt.js +32 -0
- package/dist/services/admission/card-attempt.js.map +1 -0
- package/dist/services/admission/connectivity.d.ts +18 -0
- package/dist/services/admission/connectivity.d.ts.map +1 -0
- package/dist/services/admission/connectivity.js +21 -0
- package/dist/services/admission/connectivity.js.map +1 -0
- package/dist/services/admission/index.d.ts +24 -0
- package/dist/services/admission/index.d.ts.map +1 -0
- package/dist/services/admission/index.js +81 -0
- package/dist/services/admission/index.js.map +1 -0
- package/dist/services/admission/limits-settings.d.ts +17 -0
- package/dist/services/admission/limits-settings.d.ts.map +1 -0
- package/dist/services/admission/limits-settings.js +35 -0
- package/dist/services/admission/limits-settings.js.map +1 -0
- package/dist/services/admission/notifier.d.ts +32 -0
- package/dist/services/admission/notifier.d.ts.map +1 -0
- package/dist/services/admission/notifier.js +50 -0
- package/dist/services/admission/notifier.js.map +1 -0
- package/dist/services/admission/provider-level.d.ts +27 -0
- package/dist/services/admission/provider-level.d.ts.map +1 -0
- package/dist/services/admission/provider-level.js +53 -0
- package/dist/services/admission/provider-level.js.map +1 -0
- package/dist/services/admission/provider-of.d.ts +12 -0
- package/dist/services/admission/provider-of.d.ts.map +1 -0
- package/dist/services/admission/provider-of.js +20 -0
- package/dist/services/admission/provider-of.js.map +1 -0
- package/dist/services/agent-spawn.service.d.ts +88 -9
- package/dist/services/agent-spawn.service.d.ts.map +1 -1
- package/dist/services/agent-spawn.service.js +111 -99
- package/dist/services/agent-spawn.service.js.map +1 -1
- package/dist/services/background-runner.d.ts +9 -1
- package/dist/services/background-runner.d.ts.map +1 -1
- package/dist/services/background-runner.js +1 -59
- package/dist/services/background-runner.js.map +1 -1
- package/dist/services/board/board-signals.d.ts +30 -10
- package/dist/services/board/board-signals.d.ts.map +1 -1
- package/dist/services/board/board-signals.js +109 -25
- package/dist/services/board/board-signals.js.map +1 -1
- package/dist/services/board/card-briefing.d.ts +11 -4
- package/dist/services/board/card-briefing.d.ts.map +1 -1
- package/dist/services/board/card-briefing.js +57 -11
- package/dist/services/board/card-briefing.js.map +1 -1
- 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/card-journal.d.ts +36 -0
- package/dist/services/board/card-journal.d.ts.map +1 -0
- package/dist/services/board/card-journal.js +38 -0
- package/dist/services/board/card-journal.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 +47 -6
- package/dist/services/board/orchestrator.service.d.ts.map +1 -1
- package/dist/services/board/orchestrator.service.js +191 -63
- package/dist/services/board/orchestrator.service.js.map +1 -1
- package/dist/services/board/release-worker.d.ts +10 -27
- package/dist/services/board/release-worker.d.ts.map +1 -1
- package/dist/services/board/release-worker.js +15 -42
- package/dist/services/board/release-worker.js.map +1 -1
- package/dist/services/board/report-capture.d.ts +52 -20
- package/dist/services/board/report-capture.d.ts.map +1 -1
- package/dist/services/board/report-capture.js +205 -96
- package/dist/services/board/report-capture.js.map +1 -1
- package/dist/services/board/worker-spawn.d.ts +66 -7
- package/dist/services/board/worker-spawn.d.ts.map +1 -1
- package/dist/services/board/worker-spawn.js +147 -73
- package/dist/services/board/worker-spawn.js.map +1 -1
- 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 +71 -84
- package/dist/services/broker-client.d.ts.map +1 -1
- package/dist/services/broker-client.js +87 -101
- package/dist/services/broker-client.js.map +1 -1
- package/dist/services/claude-spawn.service.d.ts +16 -1
- package/dist/services/claude-spawn.service.d.ts.map +1 -1
- package/dist/services/claude-spawn.service.js +106 -97
- package/dist/services/claude-spawn.service.js.map +1 -1
- package/dist/services/codex-spawn.service.d.ts +18 -4
- package/dist/services/codex-spawn.service.d.ts.map +1 -1
- package/dist/services/codex-spawn.service.js +44 -78
- 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 +4 -2
- package/dist/services/copilot-spawn.service.d.ts.map +1 -1
- package/dist/services/copilot-spawn.service.js +49 -37
- package/dist/services/copilot-spawn.service.js.map +1 -1
- package/dist/services/daily-session.d.ts +22 -11
- package/dist/services/daily-session.d.ts.map +1 -1
- package/dist/services/daily-session.js +101 -33
- package/dist/services/daily-session.js.map +1 -1
- package/dist/services/death-alert.service.d.ts +53 -0
- package/dist/services/death-alert.service.d.ts.map +1 -0
- package/dist/services/death-alert.service.js +62 -0
- package/dist/services/death-alert.service.js.map +1 -0
- package/dist/services/dispatcher/broker.d.ts +68 -1
- package/dist/services/dispatcher/broker.d.ts.map +1 -1
- package/dist/services/dispatcher/broker.js +60 -53
- package/dist/services/dispatcher/broker.js.map +1 -1
- package/dist/services/dispatcher/poller.d.ts +10 -1
- package/dist/services/dispatcher/poller.d.ts.map +1 -1
- package/dist/services/dispatcher/poller.js +66 -31
- package/dist/services/dispatcher/poller.js.map +1 -1
- package/dist/services/flight-recorder.service.d.ts +7 -2
- package/dist/services/flight-recorder.service.d.ts.map +1 -1
- package/dist/services/flight-recorder.service.js +27 -5
- package/dist/services/flight-recorder.service.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 +38 -14
- package/dist/services/keeper.service.d.ts.map +1 -1
- package/dist/services/keeper.service.js +110 -251
- package/dist/services/keeper.service.js.map +1 -1
- package/dist/services/mcp-config.service.d.ts +4 -3
- package/dist/services/mcp-config.service.d.ts.map +1 -1
- package/dist/services/mcp-config.service.js +21 -19
- 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/npx-prewarm.d.ts +54 -0
- package/dist/services/npx-prewarm.d.ts.map +1 -0
- package/dist/services/npx-prewarm.js +113 -0
- package/dist/services/npx-prewarm.js.map +1 -0
- package/dist/services/passive-notice.service.d.ts +37 -20
- package/dist/services/passive-notice.service.d.ts.map +1 -1
- package/dist/services/passive-notice.service.js +50 -232
- package/dist/services/passive-notice.service.js.map +1 -1
- 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 +127 -90
- package/dist/services/process.service.d.ts.map +1 -1
- package/dist/services/process.service.js +273 -372
- package/dist/services/process.service.js.map +1 -1
- package/dist/services/reconnect-snapshot.service.d.ts +16 -15
- package/dist/services/reconnect-snapshot.service.d.ts.map +1 -1
- package/dist/services/reconnect-snapshot.service.js +44 -63
- package/dist/services/reconnect-snapshot.service.js.map +1 -1
- package/dist/services/self-update.service.d.ts +57 -55
- package/dist/services/self-update.service.d.ts.map +1 -1
- package/dist/services/self-update.service.js +78 -231
- package/dist/services/self-update.service.js.map +1 -1
- package/dist/services/spawn-common.d.ts +296 -68
- package/dist/services/spawn-common.d.ts.map +1 -1
- package/dist/services/spawn-common.js +888 -445
- package/dist/services/spawn-common.js.map +1 -1
- package/dist/services/spawn-exit-watcher.d.ts +43 -35
- package/dist/services/spawn-exit-watcher.d.ts.map +1 -1
- package/dist/services/spawn-exit-watcher.js +107 -100
- package/dist/services/spawn-exit-watcher.js.map +1 -1
- package/dist/services/telegram.d.ts +24 -3
- package/dist/services/telegram.d.ts.map +1 -1
- package/dist/services/telegram.js +40 -13
- 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 +16 -13
- package/dist/services/thread-health.service.js.map +1 -1
- package/dist/services/thread-lifecycle.service.d.ts +12 -3
- package/dist/services/thread-lifecycle.service.d.ts.map +1 -1
- package/dist/services/thread-lifecycle.service.js +41 -12
- 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 +143 -0
- package/dist/services/thread-log-reader.js.map +1 -0
- package/dist/services/thread-purge.service.d.ts +198 -0
- package/dist/services/thread-purge.service.d.ts.map +1 -0
- package/dist/services/thread-purge.service.js +642 -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 +72 -13
- package/dist/services/topic.service.js.map +1 -1
- package/dist/services/usage/usage-poller.service.d.ts +16 -4
- package/dist/services/usage/usage-poller.service.d.ts.map +1 -1
- package/dist/services/usage/usage-poller.service.js +18 -10
- package/dist/services/usage/usage-poller.service.js.map +1 -1
- package/dist/services/usage/usage-snapshot-provider.d.ts +5 -0
- package/dist/services/usage/usage-snapshot-provider.d.ts.map +1 -1
- package/dist/services/usage/usage-snapshot-provider.js +8 -0
- package/dist/services/usage/usage-snapshot-provider.js.map +1 -1
- package/dist/services/usage/usage-types.d.ts +6 -3
- package/dist/services/usage/usage-types.d.ts.map +1 -1
- package/dist/services/usage/usage-types.js +2 -2
- package/dist/services/worker-birth.d.ts +158 -0
- package/dist/services/worker-birth.d.ts.map +1 -0
- package/dist/services/worker-birth.js +249 -0
- package/dist/services/worker-birth.js.map +1 -0
- package/dist/services/worker-cleanup.service.d.ts +126 -25
- package/dist/services/worker-cleanup.service.d.ts.map +1 -1
- package/dist/services/worker-cleanup.service.js +561 -458
- package/dist/services/worker-cleanup.service.js.map +1 -1
- package/dist/services/worker-single-use.d.ts +91 -0
- package/dist/services/worker-single-use.d.ts.map +1 -0
- package/dist/services/worker-single-use.js +154 -0
- package/dist/services/worker-single-use.js.map +1 -0
- package/dist/sessions/mcp-registry.d.ts +34 -3
- package/dist/sessions/mcp-registry.d.ts.map +1 -1
- package/dist/sessions/mcp-registry.js +154 -31
- package/dist/sessions/mcp-registry.js.map +1 -1
- package/dist/test-bootstrap.d.ts +29 -19
- package/dist/test-bootstrap.d.ts.map +1 -1
- package/dist/test-bootstrap.js +89 -28
- package/dist/test-bootstrap.js.map +1 -1
- package/dist/test-tripwire.test-support.d.ts +69 -0
- package/dist/test-tripwire.test-support.d.ts.map +1 -0
- package/dist/test-tripwire.test-support.js +342 -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 +1 -1
- package/dist/tools/defs/session-defs.d.ts.map +1 -1
- package/dist/tools/defs/session-defs.js +48 -15
- package/dist/tools/defs/session-defs.js.map +1 -1
- package/dist/tools/defs/skill-defs.js +1 -1
- package/dist/tools/defs/skill-defs.js.map +1 -1
- package/dist/tools/defs/types.d.ts +2 -1
- package/dist/tools/defs/types.d.ts.map +1 -1
- package/dist/tools/defs/utility-defs.d.ts.map +1 -1
- package/dist/tools/defs/utility-defs.js +4 -2
- package/dist/tools/defs/utility-defs.js.map +1 -1
- package/dist/tools/defs/wait-defs.d.ts.map +1 -1
- package/dist/tools/defs/wait-defs.js +4 -1
- package/dist/tools/defs/wait-defs.js.map +1 -1
- package/dist/tools/delegate-tool.d.ts +110 -2
- package/dist/tools/delegate-tool.d.ts.map +1 -1
- package/dist/tools/delegate-tool.js +848 -255
- 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 +3 -0
- package/dist/tools/session-tools.d.ts.map +1 -1
- package/dist/tools/session-tools.js +8 -34
- 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 +3 -0
- package/dist/tools/start-session-tool.d.ts.map +1 -1
- package/dist/tools/start-session-tool.js +78 -23
- 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 +33 -2
- 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/context.d.ts +3 -0
- package/dist/tools/wait/context.d.ts.map +1 -1
- package/dist/tools/wait/drive-handler.d.ts.map +1 -1
- package/dist/tools/wait/drive-handler.js +18 -14
- 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 +72 -66
- 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 +363 -246
- package/dist/tools/wait/poll-loop.js.map +1 -1
- package/package.json +3 -2
- package/templates/azure-devops-securevault.default.md +20 -6
- package/templates/board-increment-flow.default.md +51 -0
- package/templates/board-quality-checklist.default.md +121 -0
- package/templates/board-smoke-test.default.md +81 -0
- package/templates/handoff.default.md +43 -18
- package/templates/reminders.default.md +1 -0
- package/templates/worker-autonomous.default.md +2 -1
- package/templates/worker-delegate.default.md +3 -1
- package/dist/board/components/TokenEntry.js +0 -42
- package/dist/board/state/auth.js +0 -55
- package/dist/config/keep-alive-settings.d.ts +0 -29
- package/dist/config/keep-alive-settings.d.ts.map +0 -1
- package/dist/config/keep-alive-settings.js +0 -100
- package/dist/config/keep-alive-settings.js.map +0 -1
- 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/board/lane.repository.d.ts +0 -18
- package/dist/data/board/lane.repository.d.ts.map +0 -1
- package/dist/data/board/lane.repository.js +0 -44
- package/dist/data/board/lane.repository.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/keep-alive-sync.service.d.ts +0 -11
- package/dist/services/keep-alive-sync.service.d.ts.map +0 -1
- package/dist/services/keep-alive-sync.service.js +0 -47
- package/dist/services/keep-alive-sync.service.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/dist/services/usage/usage-inbox-notifier.d.ts +0 -50
- package/dist/services/usage/usage-inbox-notifier.d.ts.map +0 -1
- package/dist/services/usage/usage-inbox-notifier.js +0 -118
- package/dist/services/usage/usage-inbox-notifier.js.map +0 -1
- package/templates/atomic-build-spec.default.md +0 -57
- package/templates/buildless-vue-preview.default.md +0 -47
- package/templates/clean-code.default.md +0 -30
- package/templates/code-review.default.md +0 -70
- 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/phased-build.default.md +0 -59
- package/templates/playwright.default.md +0 -114
- package/templates/sensorium-repair.default.md +0 -114
- package/templates/sleep.default.md +0 -14
- package/templates/swarm.default.md +0 -44
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.
|
|
@@ -95,12 +96,13 @@ $EffectiveMCPStartCommand = $Config["MCPStartCommand"]
|
|
|
95
96
|
$IsolateMcpRuntime = $Config["IsolateMcpRuntime"] -eq "true"
|
|
96
97
|
|
|
97
98
|
# Resolve the supervisor release channel from the same tag the node server
|
|
98
|
-
# follows: the "@<tag>" in MCPStartCommand. Only @
|
|
99
|
-
#
|
|
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
|
|
100
102
|
# on the stable supervisor-latest release. This keeps the stable rollback path
|
|
101
103
|
# intact — pointing the config back at @latest restores the main supervisor.
|
|
102
104
|
$mcpTag = if ($EffectiveMCPStartCommand -match 'sensorium-mcp@([A-Za-z0-9._-]+)') { $Matches[1] } else { "latest" }
|
|
103
|
-
$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" }
|
|
104
106
|
Write-Host "Supervisor channel: $ReleaseTag (from MCP tag '$mcpTag')" -ForegroundColor Cyan
|
|
105
107
|
|
|
106
108
|
# Validate config values
|
|
@@ -117,8 +119,27 @@ Save-Config $Config
|
|
|
117
119
|
function Stop-SupervisorProcess {
|
|
118
120
|
$procs = Get-Process -Name "sensorium-supervisor" -ErrorAction SilentlyContinue
|
|
119
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)
|
|
120
125
|
Write-Host "Stopping background sensorium-supervisor process(es)..."
|
|
121
|
-
$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
|
+
}
|
|
122
143
|
Write-Host "Process(es) stopped." -ForegroundColor Yellow
|
|
123
144
|
}
|
|
124
145
|
}
|
|
@@ -227,7 +248,45 @@ function Save-BinaryMetadata {
|
|
|
227
248
|
InstalledAt = (Get-Date).ToString("o")
|
|
228
249
|
}
|
|
229
250
|
|
|
230
|
-
|
|
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
|
+
}
|
|
231
290
|
}
|
|
232
291
|
|
|
233
292
|
function Get-BinaryAsset {
|
|
@@ -244,7 +303,13 @@ function Get-BinaryAsset {
|
|
|
244
303
|
$headers = Get-GithubAuthHeaders -Accept "application/octet-stream"
|
|
245
304
|
Write-Host "Downloading $($AssetInfo.AssetName) ..."
|
|
246
305
|
|
|
247
|
-
$
|
|
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
|
|
248
313
|
try {
|
|
249
314
|
Invoke-WebRequest -Uri $downloadUrl -Headers $headers -OutFile $tmpFile -UseBasicParsing -ErrorAction Stop
|
|
250
315
|
}
|
|
@@ -256,15 +321,74 @@ function Get-BinaryAsset {
|
|
|
256
321
|
throw "Download failed: $_"
|
|
257
322
|
}
|
|
258
323
|
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
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
|
+
}
|
|
263
391
|
}
|
|
264
|
-
Move-Item $tmpFile $Destination -Force
|
|
265
|
-
Unblock-File -Path $Destination -ErrorAction SilentlyContinue
|
|
266
|
-
Save-BinaryMetadata -MetadataPath $MetadataPath -AssetInfo $AssetInfo
|
|
267
|
-
Write-Host "Binary placed at: $Destination" -ForegroundColor Green
|
|
268
392
|
}
|
|
269
393
|
|
|
270
394
|
function Install-StartupLauncher {
|
|
@@ -439,7 +563,7 @@ function Sync-ReleaseBinary {
|
|
|
439
563
|
Write-Host "Fetching release via SecureVault (profile: $SecureVaultProfile)..."
|
|
440
564
|
securevault run pwsh -NoProfile -File "`"$PSCommandPath`"" -SyncReleaseOnly --profile $SecureVaultProfile
|
|
441
565
|
if ($LASTEXITCODE -ne 0) {
|
|
442
|
-
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)."
|
|
443
567
|
}
|
|
444
568
|
}
|
|
445
569
|
|
|
@@ -451,47 +575,76 @@ if ($SyncReleaseOnly) {
|
|
|
451
575
|
}
|
|
452
576
|
|
|
453
577
|
# ── Main ─────────────────────────────────────────────────────────────────────
|
|
454
|
-
|
|
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
|
+
}
|
|
455
597
|
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
}
|
|
460
|
-
else {
|
|
461
|
-
Write-Host "=== Sensorium Supervisor INSTALL ===" -ForegroundColor Cyan
|
|
462
|
-
}
|
|
463
|
-
Write-Host "SecureVault profile: $(if ([string]::IsNullOrWhiteSpace($SecureVaultProfile)) { '<disabled>' } else { $SecureVaultProfile })"
|
|
464
|
-
Write-Host "Watcher mode: $UpdateMode"
|
|
465
|
-
Write-Host "MCP start command: $EffectiveMCPStartCommand"
|
|
466
|
-
Write-Host "MCP runtime isolation: $(if ($IsolateMcpRuntime) { 'ENABLED' } else { 'disabled (legacy npx)' })"
|
|
467
|
-
Write-Host "Binary : $Binary"
|
|
468
|
-
Write-Host ""
|
|
469
|
-
|
|
470
|
-
# Step 1 — stop existing instance
|
|
471
|
-
if ($alreadyExists) {
|
|
472
|
-
Stop-SupervisorProcess
|
|
473
|
-
}
|
|
598
|
+
if (-not $mutexHeld) {
|
|
599
|
+
throw "Another Sensorium install/update is still running for this user. Timed out waiting for it to finish."
|
|
600
|
+
}
|
|
474
601
|
|
|
475
|
-
|
|
476
|
-
New-Item -ItemType Directory -Path $BinDir -Force | Out-Null
|
|
602
|
+
$alreadyExists = Test-Path $Binary
|
|
477
603
|
|
|
478
|
-
|
|
479
|
-
|
|
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 ""
|
|
480
617
|
|
|
481
|
-
# Step
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
# so the install degrades safely to legacy behaviour.
|
|
485
|
-
if ($IsolateMcpRuntime) {
|
|
486
|
-
if (-not (Initialize-IsolatedMcpRuntime)) {
|
|
487
|
-
$IsolateMcpRuntime = $false
|
|
488
|
-
Write-Host "[WARN] Isolation disabled for this run — using the shared npm cache / inherited cwd." -ForegroundColor Yellow
|
|
618
|
+
# Step 1 — stop existing instance
|
|
619
|
+
if ($alreadyExists) {
|
|
620
|
+
Stop-SupervisorProcess
|
|
489
621
|
}
|
|
490
|
-
}
|
|
491
622
|
|
|
492
|
-
# Step
|
|
493
|
-
|
|
494
|
-
|
|
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
|
|
495
628
|
|
|
496
|
-
# Step
|
|
497
|
-
|
|
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
|
+
}
|
|
639
|
+
|
|
640
|
+
# Step 4 — install launcher and start
|
|
641
|
+
Install-StartupLauncher
|
|
642
|
+
Start-Supervisor
|
|
643
|
+
|
|
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.
|
|
@@ -157,6 +159,7 @@ Customizable prompt templates that agents can discover and load on demand.
|
|
|
157
159
|
| `send_sticker` | Send a Telegram sticker |
|
|
158
160
|
| `send_message_to_thread` | Send a message to another thread's agent |
|
|
159
161
|
| `start_thread` | Spawn a worker, branch, daily, or root thread |
|
|
162
|
+
| `stop_thread` | Stop a worker whose parent link is this thread |
|
|
160
163
|
| `get_threads_health` | Show thread status, PIDs, last activity |
|
|
161
164
|
| `schedule_wake_up` | Schedule a one-shot, cron, or idle-triggered task |
|
|
162
165
|
| `memory_search` | Search episodic/semantic memory by query |
|
|
@@ -238,7 +241,7 @@ lib → config → integrations → data, llm → sessions → services → tool
|
|
|
238
241
|
```
|
|
239
242
|
~/.remote-copilot-mcp/
|
|
240
243
|
memory.db <- SQLite: episodes, semantic notes, voice signatures, thread registry
|
|
241
|
-
settings.json <-
|
|
244
|
+
settings.json <- Dashboard settings, MCP servers, conversation modes (read at start; hand edits apply at restart)
|
|
242
245
|
install.config.json <- Installer configuration (SecureVault profile, update mode)
|
|
243
246
|
poller.lock <- PID + timestamp; first instance becomes the poller
|
|
244
247
|
offset <- Shared getUpdates offset
|
package/dist/board/api/api.js
CHANGED
|
@@ -19,10 +19,11 @@ let implPromise = null;
|
|
|
19
19
|
/** @returns {Promise<BoardApi>} */
|
|
20
20
|
function load() {
|
|
21
21
|
if (!implPromise) {
|
|
22
|
-
implPromise =
|
|
22
|
+
implPromise = (
|
|
23
23
|
MODE === "preview"
|
|
24
24
|
? import("../mock/api.mock.js").then((m) => m.mockApi)
|
|
25
|
-
: import("./client.js").then((m) => m.client)
|
|
25
|
+
: import("./client.js").then((m) => m.client)
|
|
26
|
+
).then(assertAdapterComplete);
|
|
26
27
|
}
|
|
27
28
|
return implPromise;
|
|
28
29
|
}
|
|
@@ -31,31 +32,53 @@ const METHODS = [
|
|
|
31
32
|
"listCards",
|
|
32
33
|
"getCard",
|
|
33
34
|
"createCard",
|
|
35
|
+
"previewBriefing",
|
|
34
36
|
"updateCard",
|
|
35
37
|
"deleteCard",
|
|
36
38
|
"stopCard",
|
|
37
39
|
"addComment",
|
|
38
|
-
"
|
|
40
|
+
"postDecision",
|
|
41
|
+
"listLaneGroups",
|
|
39
42
|
"getProfiles",
|
|
43
|
+
"saveProfile",
|
|
40
44
|
"threadRunning",
|
|
41
|
-
|
|
42
|
-
//
|
|
43
|
-
// getPolicySchema()/getPresets() against the real board API before production
|
|
44
|
-
// uses the schema-driven builder; until then production calls reject and
|
|
45
|
-
// useBuilder() degrades to a schema-less builder (no crash).
|
|
45
|
+
"threadLogs",
|
|
46
|
+
// Card-builder "How" schema + presets.
|
|
46
47
|
"getPolicySchema",
|
|
47
48
|
"getPresets",
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
"
|
|
51
|
-
|
|
52
|
-
"
|
|
49
|
+
"createLaneGroup",
|
|
50
|
+
"updateLaneGroup",
|
|
51
|
+
"deleteLaneGroup",
|
|
52
|
+
// Working-directory picker: one filesystem level per call (lazy browse).
|
|
53
|
+
"listDir",
|
|
53
54
|
];
|
|
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
|
+
|
|
55
78
|
/** @type {BoardApi} */
|
|
56
79
|
const api = /** @type {any} */ ({});
|
|
57
80
|
for (const name of METHODS) {
|
|
58
81
|
api[name] = (...args) => load().then((impl) => impl[name](...args));
|
|
59
82
|
}
|
|
60
83
|
|
|
61
|
-
export { api };
|
|
84
|
+
export { api, assertAdapterComplete };
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import "../../test-bootstrap.js";
|
|
2
|
+
import assert from "node:assert/strict";
|
|
3
|
+
import { test } from "node:test";
|
|
4
|
+
import { assertAdapterComplete } from "./api.js";
|
|
5
|
+
import { client } from "./client.js";
|
|
6
|
+
import type { BoardApi } from "./contract.js";
|
|
7
|
+
|
|
8
|
+
test("the adapter completeness guard passes for the production client", () => {
|
|
9
|
+
// Arrange
|
|
10
|
+
const impl = client;
|
|
11
|
+
|
|
12
|
+
// Act & Assert — every contract/registry method is now implemented in client.js.
|
|
13
|
+
assert.doesNotThrow(() => assertAdapterComplete(impl));
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
test("the adapter completeness guard throws naming a method missing from the adapter", () => {
|
|
17
|
+
// Arrange — a client with one contract method dropped (the exact drift that
|
|
18
|
+
// shipped lane CRUD as a late `undefined is not a function`).
|
|
19
|
+
const incomplete: Partial<BoardApi> = { ...client };
|
|
20
|
+
delete incomplete.createLaneGroup;
|
|
21
|
+
|
|
22
|
+
// Act & Assert
|
|
23
|
+
assert.throws(() => assertAdapterComplete(incomplete), /createLaneGroup/);
|
|
24
|
+
});
|
package/dist/board/api/client.js
CHANGED
|
@@ -2,15 +2,14 @@
|
|
|
2
2
|
* Production data adapter. ❌ FROZEN SEAM.
|
|
3
3
|
*
|
|
4
4
|
* Real `fetch` to the board API. Root-relative `/api/...` paths (never a host or
|
|
5
|
-
* port) so the app works unchanged behind the
|
|
6
|
-
*
|
|
5
|
+
* port) so the app works unchanged behind the Dev Tunnel. This is the ONLY module
|
|
6
|
+
* that talks to the network.
|
|
7
7
|
*
|
|
8
8
|
* @typedef {import('./contract.js').BoardApi} BoardApi
|
|
9
9
|
* @typedef {import('./contract.js').BoardCard} BoardCard
|
|
10
10
|
*/
|
|
11
11
|
|
|
12
12
|
import { API_BASE } from "../config.js";
|
|
13
|
-
import { getToken } from "../state/auth.js";
|
|
14
13
|
|
|
15
14
|
/**
|
|
16
15
|
* @param {string} method
|
|
@@ -19,8 +18,6 @@ import { getToken } from "../state/auth.js";
|
|
|
19
18
|
*/
|
|
20
19
|
async function req(method, path, body) {
|
|
21
20
|
const headers = {};
|
|
22
|
-
const token = getToken();
|
|
23
|
-
if (token) headers.Authorization = `Bearer ${token}`;
|
|
24
21
|
if (body !== undefined) headers["Content-Type"] = "application/json";
|
|
25
22
|
|
|
26
23
|
const res = await fetch(`${API_BASE}${path}`, {
|
|
@@ -49,12 +46,11 @@ async function req(method, path, body) {
|
|
|
49
46
|
|
|
50
47
|
/** @type {BoardApi} */
|
|
51
48
|
export const client = {
|
|
52
|
-
listCards({ includeArchived = false
|
|
49
|
+
listCards({ includeArchived = false } = {}) {
|
|
53
50
|
const p = new URLSearchParams();
|
|
54
51
|
if (includeArchived) p.set("includeArchived", "1");
|
|
55
|
-
if (lane != null) p.set("lane", String(lane));
|
|
56
52
|
const qs = p.toString();
|
|
57
|
-
return req("GET", `/api/board/cards${qs ? `?${qs}` : ""}`)
|
|
53
|
+
return req("GET", `/api/board/cards${qs ? `?${qs}` : ""}`);
|
|
58
54
|
},
|
|
59
55
|
getCard(id) {
|
|
60
56
|
return req("GET", `/api/board/cards/${id}`);
|
|
@@ -62,6 +58,9 @@ export const client = {
|
|
|
62
58
|
createCard(card) {
|
|
63
59
|
return req("POST", "/api/board/cards", card).then((d) => d.card);
|
|
64
60
|
},
|
|
61
|
+
previewBriefing(draft) {
|
|
62
|
+
return req("POST", "/api/board/cards/preview", draft).then((d) => d.briefing);
|
|
63
|
+
},
|
|
65
64
|
updateCard(id, patch) {
|
|
66
65
|
return req("PATCH", `/api/board/cards/${id}`, patch).then((d) => d.card);
|
|
67
66
|
},
|
|
@@ -74,23 +73,41 @@ export const client = {
|
|
|
74
73
|
addComment(id, content) {
|
|
75
74
|
return req("POST", `/api/board/cards/${id}/comments`, { content }).then((d) => d.comment);
|
|
76
75
|
},
|
|
77
|
-
|
|
78
|
-
return req("
|
|
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);
|
|
79
90
|
},
|
|
80
91
|
getProfiles() {
|
|
81
92
|
return req("GET", "/api/board/profiles").then((d) => d.profiles);
|
|
82
93
|
},
|
|
94
|
+
saveProfile(input) {
|
|
95
|
+
return req("POST", "/api/board/profiles", input).then((d) => d.profile);
|
|
96
|
+
},
|
|
83
97
|
threadRunning(threadId) {
|
|
84
98
|
return req("GET", `/api/threads/${threadId}/running`).then((d) => !!d.running);
|
|
85
99
|
},
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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
|
+
},
|
|
90
104
|
getPolicySchema() {
|
|
91
|
-
return
|
|
105
|
+
return req("GET", "/api/board/policy").then((d) => d.schema);
|
|
92
106
|
},
|
|
93
107
|
getPresets() {
|
|
94
|
-
return
|
|
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 || "")}`);
|
|
95
112
|
},
|
|
96
113
|
};
|
|
@@ -1,43 +1,77 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Card tile — ✅ EDITABLE. Pure: `card` + `laneName` in, `open` out.
|
|
3
3
|
* Dispatch design: floating dark card — title, then chip row with priority,
|
|
4
|
-
*
|
|
4
|
+
* live worker pulse / blocked / archived. A decision_needed card gets a distinct
|
|
5
|
+
* badge plus a waiting-age cue so a stalled decision is obvious at a glance.
|
|
5
6
|
*/
|
|
6
7
|
|
|
7
8
|
import StatusChip from "./StatusChip.js";
|
|
8
9
|
import PriorityChip from "./PriorityChip.js";
|
|
10
|
+
import { proactiveLimitKind, providerLabel, retryLabel } from "./rateLimit.js";
|
|
11
|
+
import { humanMins, minsSince } from "./time.js";
|
|
9
12
|
|
|
10
13
|
export default {
|
|
11
14
|
name: "Card",
|
|
12
15
|
components: { StatusChip, PriorityChip },
|
|
13
16
|
props: {
|
|
14
17
|
card: { type: Object, required: true },
|
|
15
|
-
laneName: { type: Function, default: (
|
|
18
|
+
laneName: { type: Function, default: () => "Ungrouped" },
|
|
19
|
+
limitedProviders: { type: Array, default: () => [] },
|
|
16
20
|
},
|
|
17
21
|
emits: ["open"],
|
|
18
22
|
setup(props, { emit }) {
|
|
19
23
|
function elapsed() {
|
|
20
24
|
if (!props.card.startedAt) return "";
|
|
21
|
-
|
|
22
|
-
return mins >= 60 ? Math.floor(mins / 60) + "h " + (mins % 60) + "m" : mins + "m";
|
|
25
|
+
return humanMins(minsSince(props.card.startedAt));
|
|
23
26
|
}
|
|
24
|
-
|
|
27
|
+
function rlText() {
|
|
28
|
+
const p = providerLabel(props.card.rateLimitProvider);
|
|
29
|
+
return (p ? p + " · " : "") + retryLabel(props.card);
|
|
30
|
+
}
|
|
31
|
+
function proactiveProvider() {
|
|
32
|
+
return providerLabel(props.card.profile?.agentType);
|
|
33
|
+
}
|
|
34
|
+
function proactiveKind() {
|
|
35
|
+
return proactiveLimitKind(props.card, props.limitedProviders);
|
|
36
|
+
}
|
|
37
|
+
/** How long this card has been waiting on the operator. */
|
|
38
|
+
function waiting() {
|
|
39
|
+
const c = props.card;
|
|
40
|
+
if (c.status !== "decision_needed") return null;
|
|
41
|
+
const mins = minsSince(c.updatedAt || c.finishedAt || c.startedAt || c.createdAt);
|
|
42
|
+
return { text: humanMins(mins), stale: mins >= 480 };
|
|
43
|
+
}
|
|
44
|
+
return { emit, elapsed, proactiveKind, proactiveProvider, rlText, waiting };
|
|
25
45
|
},
|
|
26
46
|
template: `
|
|
27
47
|
<article class="card" role="listitem" tabindex="0"
|
|
48
|
+
:class="{ 'card--decision': card.status === 'decision_needed' }"
|
|
28
49
|
@click="emit('open', card)"
|
|
29
50
|
@keydown.enter="emit('open', card)">
|
|
51
|
+
<div v-if="waiting()" class="card__decision" :class="{ 'is-stale': waiting().stale }">
|
|
52
|
+
<span class="card__decision-label">
|
|
53
|
+
<span class="dot dot--pulse"></span>NEEDS YOU
|
|
54
|
+
</span>
|
|
55
|
+
<span class="card__decision-age">waiting {{ waiting().text }}</span>
|
|
56
|
+
</div>
|
|
30
57
|
<h3 class="card__title">{{ card.title }}</h3>
|
|
31
58
|
<p v-if="card.description" class="card__desc">{{ card.description }}</p>
|
|
59
|
+
<div v-if="card.status === 'rate_limited'" class="card__rl">
|
|
60
|
+
<svg viewBox="0 0 12 12" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" aria-hidden="true"><circle cx="6" cy="6" r="4.6"></circle><path d="M6 3.6V6l1.8 1.2"></path></svg>
|
|
61
|
+
<span>rate limited · {{ rlText() }}</span>
|
|
62
|
+
</div>
|
|
63
|
+
<div v-if="proactiveKind()" class="card__rl">
|
|
64
|
+
<StatusChip status="rate_limited" :kind="proactiveKind()" />
|
|
65
|
+
<span v-if="proactiveProvider()">{{ proactiveProvider() }}</span>
|
|
66
|
+
</div>
|
|
32
67
|
<div class="card__foot">
|
|
33
68
|
<PriorityChip :priority="card.priority" />
|
|
34
|
-
<span class="chip chip--muted">{{ card.type }}</span>
|
|
35
69
|
<span v-if="card.status === 'in_progress'" class="chip chip--live">
|
|
36
70
|
<span class="dot dot--pulse"></span>working<template v-if="card.startedAt"> · {{ elapsed() }}</template>
|
|
37
71
|
</span>
|
|
38
72
|
<span v-else-if="card.blockedReason" class="chip chip--warn">blocked</span>
|
|
39
73
|
<span v-if="card.archivedAt" class="chip chip--muted">archived</span>
|
|
40
|
-
<span class="card__lane">{{ laneName(card.
|
|
74
|
+
<span class="card__lane">{{ laneName(card.laneGroupId) }}</span>
|
|
41
75
|
</div>
|
|
42
76
|
</article>
|
|
43
77
|
`,
|