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
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Board awareness signals — exactly four kinds, one line each, no description
|
|
3
|
+
* (invariant #4). STARTED / DONE / BLOCKED / DECISION_NEEDED reach the board bot
|
|
4
|
+
* or the configured operator main thread.
|
|
5
|
+
*
|
|
6
|
+
* Delivery mode is deliberately isolated in this one function while decision
|
|
7
|
+
* #2 is with the operator (thread 1327, 2026-08-01):
|
|
8
|
+
* - "passive" (default, orchestrator's lean): rides the passive-notice
|
|
9
|
+
* channel — seen on the main thread's next delivered turn, never acted on.
|
|
10
|
+
* - "mailbox": appended to the main thread's pending-task mailbox
|
|
11
|
+
* — wakes it with an FYI-framed line.
|
|
12
|
+
* Flip via BOARD_SIGNAL_DELIVERY=mailbox; no other code changes.
|
|
13
|
+
*/
|
|
14
|
+
import { appendFileSync } from "node:fs";
|
|
15
|
+
import { join } from "node:path";
|
|
16
|
+
import { config } from "../../config/index.js";
|
|
17
|
+
import { log } from "../../lib/logger.js";
|
|
18
|
+
import { errorMessage } from "../../lib/utils.js";
|
|
19
|
+
import { ensureDirs, PENDING_TASKS_DIR } from "../process.service.js";
|
|
20
|
+
import { pushPassiveNotice } from "../passive-notice.service.js";
|
|
21
|
+
import { TelegramClient } from "../telegram.js";
|
|
22
|
+
import { Optional } from "../../data/optional.js";
|
|
23
|
+
const CARD_TITLE_EXCERPT_MAX_LENGTH = 80;
|
|
24
|
+
const DECISION_QUESTION_EXCERPT_MAX_LENGTH = 300;
|
|
25
|
+
const ESCALATION_UPDATE_EXCERPT_MAX_LENGTH = 300;
|
|
26
|
+
/** Production delivery: the configured board bot, else the main thread from the environment. */
|
|
27
|
+
export const DEFAULT_BOARD_SIGNAL_DELIVERY = {
|
|
28
|
+
boardBot: Optional.empty(),
|
|
29
|
+
boardBotToken: Optional.empty(),
|
|
30
|
+
boardChatId: Optional.empty(),
|
|
31
|
+
warningSink: Optional.empty(),
|
|
32
|
+
mainThreadId: Optional.empty(),
|
|
33
|
+
};
|
|
34
|
+
function boardBotFor(token, delivery) {
|
|
35
|
+
if (delivery.boardBot.has())
|
|
36
|
+
return delivery.boardBot.get();
|
|
37
|
+
return new TelegramClient(token);
|
|
38
|
+
}
|
|
39
|
+
function boardBotToken(delivery) {
|
|
40
|
+
return delivery.boardBotToken.orElse(config.BOARD_BOT_TOKEN);
|
|
41
|
+
}
|
|
42
|
+
function boardChatId(delivery) {
|
|
43
|
+
return delivery.boardChatId.orElse(config.BOARD_CHAT_ID);
|
|
44
|
+
}
|
|
45
|
+
function usesBoardBot(delivery) {
|
|
46
|
+
return boardBotToken(delivery) !== "" && boardChatId(delivery) !== "";
|
|
47
|
+
}
|
|
48
|
+
function sendToBoardBot(line, delivery, failure) {
|
|
49
|
+
const warn = delivery.warningSink.orElse(log.warn.bind(log));
|
|
50
|
+
try {
|
|
51
|
+
void boardBotFor(boardBotToken(delivery), delivery)
|
|
52
|
+
.sendMessage(boardChatId(delivery), line)
|
|
53
|
+
.catch((err) => warn(`${failure}: ${errorMessage(err)}`));
|
|
54
|
+
}
|
|
55
|
+
catch (err) {
|
|
56
|
+
warn(`${failure}: ${errorMessage(err)}`);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
/** Worker-authored text entering another thread's context block is an
|
|
60
|
+
* instruction-injection surface: strip control chars (no fake newline-framed
|
|
61
|
+
* "directives"), drop backticks, and cap length so the excerpt reads as an
|
|
62
|
+
* inert quoted fragment, never as markup or a fresh instruction line. */
|
|
63
|
+
function sanitizeExcerpt(text, maxLen) {
|
|
64
|
+
return (text
|
|
65
|
+
// eslint-disable-next-line no-control-regex -- stripping control chars is the point
|
|
66
|
+
.replace(/[\x00-\x1f\x7f\u0085\u2028\u2029]+/g, " ")
|
|
67
|
+
.replace(/`/g, "'")
|
|
68
|
+
.replace(/\s+/g, " ")
|
|
69
|
+
.trim()
|
|
70
|
+
.slice(0, maxLen));
|
|
71
|
+
}
|
|
72
|
+
function deliveryMode() {
|
|
73
|
+
return process.env.BOARD_SIGNAL_DELIVERY === "mailbox" ? "mailbox" : "passive";
|
|
74
|
+
}
|
|
75
|
+
/** One-line, FYI-framed state transition. `detail` is used for BLOCKED and
|
|
76
|
+
* DECISION_NEEDED, where it makes the ping actionable for the operator. */
|
|
77
|
+
export function sendBoardSignal(db, card, kind, detail, delivery = DEFAULT_BOARD_SIGNAL_DELIVERY) {
|
|
78
|
+
const suffix = kind === "STARTED" && card.workerThreadId != null
|
|
79
|
+
? ` (worker ${card.workerThreadId})`
|
|
80
|
+
: (kind === "BLOCKED" || kind === "DECISION_NEEDED") && detail
|
|
81
|
+
? ` — "${sanitizeExcerpt(detail.split("\n")[0], 160)}"`
|
|
82
|
+
: "";
|
|
83
|
+
const line = `[Board FYI — no action needed] Card #${card.cardId} "${sanitizeExcerpt(card.title, CARD_TITLE_EXCERPT_MAX_LENGTH)}" ${kind}${suffix}`;
|
|
84
|
+
try {
|
|
85
|
+
if (usesBoardBot(delivery)) {
|
|
86
|
+
sendToBoardBot(line, delivery, `[board] signal delivery failed for card ${card.cardId}`);
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const mainThreadId = mainThreadFor(delivery);
|
|
90
|
+
if (mainThreadId.has() && deliveryMode() === "mailbox") {
|
|
91
|
+
ensureDirs();
|
|
92
|
+
appendFileSync(join(PENDING_TASKS_DIR, `${mainThreadId.get()}.txt`), line + "\n", "utf-8");
|
|
93
|
+
}
|
|
94
|
+
else if (mainThreadId.has()) {
|
|
95
|
+
pushPassiveNotice(db, mainThreadId.get(), line);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
log.warn(`[board] signal ${kind} for card ${card.cardId} dropped: board bot and main thread unset`);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
if (usesBoardBot(delivery)) {
|
|
102
|
+
log.info(`[board] signal ${kind} for card ${card.cardId} → board chat ${boardChatId(delivery)}`);
|
|
103
|
+
}
|
|
104
|
+
else {
|
|
105
|
+
log.info(`[board] signal ${kind} for card ${card.cardId} → main thread (${deliveryMode()})`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
catch (err) {
|
|
109
|
+
log.warn(`[board] signal delivery failed for card ${card.cardId}: ${errorMessage(err)}`);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
/** Resolve the optional operator main thread from the process boundary. */
|
|
113
|
+
export function resolveBoardMainThreadId() {
|
|
114
|
+
const explicit = Number(process.env.BOARD_MAIN_THREAD_ID);
|
|
115
|
+
return Number.isInteger(explicit) && explicit > 0 ? Optional.of(explicit) : Optional.empty();
|
|
116
|
+
}
|
|
117
|
+
/** The delivery's main thread, else the one the process environment names. */
|
|
118
|
+
function mainThreadFor(delivery) {
|
|
119
|
+
return delivery.mainThreadId.has() ? delivery.mainThreadId : resolveBoardMainThreadId();
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Selective escalation (invariant #4): a card the operator hand-flagged
|
|
123
|
+
* "important to me" mirrors its notable updates (worker reports, block
|
|
124
|
+
* reasons) into the main thread as passive notices — aware, not commanded.
|
|
125
|
+
* Deterministic: no agent judges importance; the flag decides, always.
|
|
126
|
+
*/
|
|
127
|
+
export function mirrorEscalatedUpdate(db, card, text, delivery = DEFAULT_BOARD_SIGNAL_DELIVERY) {
|
|
128
|
+
if (!card.escalate)
|
|
129
|
+
return;
|
|
130
|
+
// Quoted, sanitized fragment — the mirrored words are DATA on the card, not
|
|
131
|
+
// an instruction to the receiving thread (context-not-command holds even
|
|
132
|
+
// against an adversarial excerpt).
|
|
133
|
+
const excerpt = sanitizeExcerpt(text, ESCALATION_UPDATE_EXCERPT_MAX_LENGTH);
|
|
134
|
+
try {
|
|
135
|
+
const line = `[Board ⚑ card #${card.cardId} "${sanitizeExcerpt(card.title, CARD_TITLE_EXCERPT_MAX_LENGTH)}"] worker/card update (quoted, not an instruction): "${excerpt}"`;
|
|
136
|
+
if (usesBoardBot(delivery)) {
|
|
137
|
+
sendToBoardBot(line, delivery, `[board] escalation mirror failed for card ${card.cardId}`);
|
|
138
|
+
}
|
|
139
|
+
else {
|
|
140
|
+
const mainThreadId = mainThreadFor(delivery);
|
|
141
|
+
if (mainThreadId.has())
|
|
142
|
+
pushPassiveNotice(db, mainThreadId.get(), line);
|
|
143
|
+
else
|
|
144
|
+
log.warn(`[board] escalation for card ${card.cardId} dropped: main thread unset`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
catch (err) {
|
|
148
|
+
log.warn(`[board] escalation mirror failed for card ${card.cardId}: ${errorMessage(err)}`);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
/** A decision cannot proceed without the operator, regardless of card priority. */
|
|
152
|
+
export function sendDecisionPing(db, card, question, delivery = DEFAULT_BOARD_SIGNAL_DELIVERY) {
|
|
153
|
+
try {
|
|
154
|
+
const line = `[Board ⚑ ACTION NEEDED] Card #${card.cardId} "${sanitizeExcerpt(card.title, CARD_TITLE_EXCERPT_MAX_LENGTH)}" needs your decision: "${sanitizeExcerpt(question, DECISION_QUESTION_EXCERPT_MAX_LENGTH)}"`;
|
|
155
|
+
if (usesBoardBot(delivery)) {
|
|
156
|
+
sendToBoardBot(line, delivery, `[board] decision ping failed for card ${card.cardId}`);
|
|
157
|
+
}
|
|
158
|
+
else {
|
|
159
|
+
const mainThreadId = mainThreadFor(delivery);
|
|
160
|
+
if (mainThreadId.has())
|
|
161
|
+
pushPassiveNotice(db, mainThreadId.get(), line);
|
|
162
|
+
else
|
|
163
|
+
log.warn(`[board] decision ping for card ${card.cardId} dropped: main thread unset`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
log.warn(`[board] decision ping failed for card ${card.cardId}: ${errorMessage(err)}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=board-signals.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board-signals.js","sourceRoot":"","sources":["../../../src/services/board/board-signals.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card-worker briefing renderer (design §3.2).
|
|
3
|
+
*
|
|
4
|
+
* The rendered payload is pre-queued into the worker's pending-task mailbox
|
|
5
|
+
* before spawn, ON TOP of the root-thread briefing the worker already
|
|
6
|
+
* inherits via memorySourceThreadId. Card + comments carry the task's whole
|
|
7
|
+
* world; the profile is rendered as imperative standing orders; the report
|
|
8
|
+
* contract makes the worker's exit path unambiguous (STATUS: DONE / BLOCKED / DECISION,
|
|
9
|
+
* then exit — never wait, never loop on a blocker).
|
|
10
|
+
*/
|
|
11
|
+
import type { BoardCard, BoardComment, ExecutionProfile } from "../../data/board/board-types.js";
|
|
12
|
+
/**
|
|
13
|
+
* The words every report-capture reply that means "exit now" carries, and no
|
|
14
|
+
* other reply does. The brief tells a worker to exit only on these, so a
|
|
15
|
+
* progress reply must never mention exiting.
|
|
16
|
+
*/
|
|
17
|
+
export declare const REPORT_EXIT_SIGNAL = "Now EXIT";
|
|
18
|
+
export declare function renderProfileDirectives(profile: ExecutionProfile, cardId: number): string[];
|
|
19
|
+
/**
|
|
20
|
+
* Render the complete task payload for a fresh card-worker.
|
|
21
|
+
* `workerThreadId` is known before spawn (the dispatch mints it first).
|
|
22
|
+
*/
|
|
23
|
+
export declare function renderCardBriefing(card: BoardCard, comments: BoardComment[], workerThreadId: number): string;
|
|
24
|
+
//# sourceMappingURL=card-briefing.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card-briefing.d.ts","sourceRoot":"","sources":["../../../src/services/board/card-briefing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,gBAAgB,EAAE,MAAM,iCAAiC,CAAC;AAEjG;;;;GAIG;AACH,eAAO,MAAM,kBAAkB,aAAa,CAAC;AAW7C,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,CAkE3F;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,YAAY,EAAE,EACxB,cAAc,EAAE,MAAM,GACrB,MAAM,CA+DR"}
|
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card-worker briefing renderer (design §3.2).
|
|
3
|
+
*
|
|
4
|
+
* The rendered payload is pre-queued into the worker's pending-task mailbox
|
|
5
|
+
* before spawn, ON TOP of the root-thread briefing the worker already
|
|
6
|
+
* inherits via memorySourceThreadId. Card + comments carry the task's whole
|
|
7
|
+
* world; the profile is rendered as imperative standing orders; the report
|
|
8
|
+
* contract makes the worker's exit path unambiguous (STATUS: DONE / BLOCKED / DECISION,
|
|
9
|
+
* then exit — never wait, never loop on a blocker).
|
|
10
|
+
*/
|
|
11
|
+
/**
|
|
12
|
+
* The words every report-capture reply that means "exit now" carries, and no
|
|
13
|
+
* other reply does. The brief tells a worker to exit only on these, so a
|
|
14
|
+
* progress reply must never mention exiting.
|
|
15
|
+
*/
|
|
16
|
+
export const REPORT_EXIT_SIGNAL = "Now EXIT";
|
|
17
|
+
/** Oldest-first truncation cap for the comment history (design §3.2). */
|
|
18
|
+
const MAX_COMMENT_CHARS = 24_000;
|
|
19
|
+
const AUTONOMY_DIRECTIVES = {
|
|
20
|
+
Autonomous: "Work autonomously to completion; only surface blockers or the final result.",
|
|
21
|
+
Checkpoints: "Pause at meaningful checkpoints for operator confirmation before continuing.",
|
|
22
|
+
Collaborative: "Work closely with the operator, confirming each significant step.",
|
|
23
|
+
};
|
|
24
|
+
export function renderProfileDirectives(profile, cardId) {
|
|
25
|
+
const d = [];
|
|
26
|
+
if (profile.repository)
|
|
27
|
+
d.push(`Work in repository: ${profile.repository}.`);
|
|
28
|
+
d.push(profile.createBranch
|
|
29
|
+
? `Create a work branch (suggested: card-${cardId}) before changing anything.`
|
|
30
|
+
: "Do NOT create a new branch unless the current branch is unusable.");
|
|
31
|
+
if (profile.skills?.length)
|
|
32
|
+
d.push(`Load these skills via get_skill first: ${profile.skills.join(", ")}.`);
|
|
33
|
+
if (profile.autonomy)
|
|
34
|
+
d.push(AUTONOMY_DIRECTIVES[profile.autonomy]);
|
|
35
|
+
if (profile.phases?.length) {
|
|
36
|
+
d.push("Execute this task in the following ordered phases:");
|
|
37
|
+
for (const [index, phase] of profile.phases.entries()) {
|
|
38
|
+
const overrides = [];
|
|
39
|
+
if (phase.provider !== "Inherit" && phase.provider.toLowerCase() !== profile.agentType)
|
|
40
|
+
overrides.push(`provider: ${phase.provider}`);
|
|
41
|
+
if (phase.model && phase.model !== profile.model)
|
|
42
|
+
overrides.push(`model: ${phase.model}`);
|
|
43
|
+
d.push(`${index + 1}. ${phase.name}.${overrides.length ? ` Overrides: ${overrides.join(", ")}.` : ""}`);
|
|
44
|
+
if (phase.review)
|
|
45
|
+
d.push(`after the ${phase.name} phase, delegate an expert code review to a SEPARATE worker via the Handoff skill (do not review your own work)`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
d.push(profile.runTests
|
|
49
|
+
? "Run the relevant tests and make them pass."
|
|
50
|
+
: "Do not run test suites unless a change demands it.");
|
|
51
|
+
if (profile.build)
|
|
52
|
+
d.push("Run the build and make it pass.");
|
|
53
|
+
if (profile.verifyDone)
|
|
54
|
+
d.push("Before reporting STATUS: DONE, spawn a fresh, SEPARATE verification worker via start_thread and the Handoff skill to independently check the acceptance criteria; do NOT verify your own work, use the SAME provider and model as yourself, and report DONE only after it confirms the criteria are met.");
|
|
55
|
+
d.push(profile.push ? "Push your commits." : "Do NOT push.");
|
|
56
|
+
if (profile.openPr) {
|
|
57
|
+
d.push("Open a pull request with the changes.");
|
|
58
|
+
d.push(profile.prDraft !== false
|
|
59
|
+
? "Open it as a draft pull request; mark it ready only after review."
|
|
60
|
+
: "Open it as a ready (non-draft) pull request.");
|
|
61
|
+
d.push(profile.prProvider === "GitHub"
|
|
62
|
+
? "Target the pull request at GitHub."
|
|
63
|
+
: profile.prProvider === "Azure DevOps"
|
|
64
|
+
? "Target the pull request at Azure DevOps."
|
|
65
|
+
: "Detect the PR target from the repo remote.");
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
d.push("Do NOT open a pull request.");
|
|
69
|
+
}
|
|
70
|
+
if (profile.expertReview)
|
|
71
|
+
d.push(`Before finishing, delegate an expert code review of your diff to a ${profile.reviewAgentType ?? "claude"} worker and address its findings.`);
|
|
72
|
+
if (profile.ciCheck && profile.ciCheck !== "none")
|
|
73
|
+
d.push(`After pushing, verify CI is green on ${profile.ciCheck === "github" ? "GitHub" : "Azure DevOps"} before reporting DONE.`);
|
|
74
|
+
if (profile.operatorReview)
|
|
75
|
+
d.push("The operator wants to review the result — say so explicitly in your final report.");
|
|
76
|
+
return d;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Render the complete task payload for a fresh card-worker.
|
|
80
|
+
* `workerThreadId` is known before spawn (the dispatch mints it first).
|
|
81
|
+
*/
|
|
82
|
+
export function renderCardBriefing(card, comments, workerThreadId) {
|
|
83
|
+
const lines = [];
|
|
84
|
+
lines.push(`# Task Board card #${card.cardId}: ${card.title}`);
|
|
85
|
+
lines.push(`Correlation ID: ${card.correlationId} (include this in worker log and report lines).`);
|
|
86
|
+
lines.push(`You are a STATELESS card-worker (thread ${workerThreadId}) executing this card. ` +
|
|
87
|
+
`This card plus the history below is the task's complete context on top of your inherited thread briefing.`);
|
|
88
|
+
lines.push("");
|
|
89
|
+
lines.push(`Execution profile: ${card.profileId} | Priority: ${card.priority}`);
|
|
90
|
+
lines.push("");
|
|
91
|
+
lines.push("## Description");
|
|
92
|
+
lines.push(card.description || "(none — the title is the task)");
|
|
93
|
+
if (/implementation_plans[\\/][\w.-]+\.md/.test(card.description)) {
|
|
94
|
+
lines.push("");
|
|
95
|
+
lines.push("The description references an implementation_plans/ file — READ THAT FILE FIRST and in full; it is the task's spec.");
|
|
96
|
+
}
|
|
97
|
+
if (card.acceptance) {
|
|
98
|
+
lines.push("");
|
|
99
|
+
lines.push("## Acceptance criteria");
|
|
100
|
+
lines.push(card.acceptance);
|
|
101
|
+
}
|
|
102
|
+
lines.push("");
|
|
103
|
+
lines.push("## Standing orders (execution profile — do not ask, these ARE the answers)");
|
|
104
|
+
for (const directive of renderProfileDirectives(card.profile, card.cardId))
|
|
105
|
+
lines.push(`- ${directive}`);
|
|
106
|
+
if (comments.length > 0) {
|
|
107
|
+
let history = comments
|
|
108
|
+
.map((c) => `[${c.createdAt}] ${c.author.toUpperCase()}:\n${c.content}`)
|
|
109
|
+
.join("\n---\n");
|
|
110
|
+
if (history.length > MAX_COMMENT_CHARS) {
|
|
111
|
+
history = "[…older history truncated…]\n" + history.slice(history.length - MAX_COMMENT_CHARS);
|
|
112
|
+
}
|
|
113
|
+
lines.push("");
|
|
114
|
+
lines.push("## Card history (oldest first — prior workers' reports and operator guidance)");
|
|
115
|
+
lines.push(history);
|
|
116
|
+
}
|
|
117
|
+
lines.push("");
|
|
118
|
+
lines.push("## Report contract (MANDATORY)");
|
|
119
|
+
lines.push(`When finished, call send_message_to_thread with mode:"reply", targetThreadId:${workerThreadId}, ` +
|
|
120
|
+
`senderThreadId:${workerThreadId}, senderName:"card-${card.cardId}". The message MUST start with its first line being exactly ` +
|
|
121
|
+
`"STATUS: DONE", "STATUS: BLOCKED: <one-line reason>", or "STATUS: DECISION: <question>". For a decision with choices, put an optional next line "OPTIONS: option A | option B | option C". Follow with your real report (what you did, ` +
|
|
122
|
+
`commits/PR links, review results, anything the next worker or the operator needs).`);
|
|
123
|
+
lines.push("Then EXIT: do not call wait_for_instructions again, do not wait for replies, do not loop on a blocker — " +
|
|
124
|
+
"if you need an OPERATOR DECISION to proceed, report STATUS: DECISION: <question> and exit. Reserve " +
|
|
125
|
+
"STATUS: BLOCKED for genuine blockers or errors. A fresh worker will be re-briefed from the card when " +
|
|
126
|
+
"the operator responds.");
|
|
127
|
+
lines.push("Optional progress updates: the same call with a first line that is NOT a STATUS line is kept as a comment " +
|
|
128
|
+
`on the card while it is still yours, and you keep working; exit only if the reply says "${REPORT_EXIT_SIGNAL}". ` +
|
|
129
|
+
"The final report still needs the STATUS first line, then EXIT.");
|
|
130
|
+
return lines.join("\n");
|
|
131
|
+
}
|
|
132
|
+
//# sourceMappingURL=card-briefing.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card-briefing.js","sourceRoot":"","sources":["../../../src/services/board/card-briefing.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-card observability read model. It intentionally derives dispatch history
|
|
3
|
+
* from the card's append-only board comments: dispatch has no separate table.
|
|
4
|
+
*/
|
|
5
|
+
import type { BoardCard, BoardComment } from "../../data/board/board-types.js";
|
|
6
|
+
import type { Database } from "../../data/memory/db-types.js";
|
|
7
|
+
export interface CardDiagnostics {
|
|
8
|
+
card: BoardCard;
|
|
9
|
+
dispatch: {
|
|
10
|
+
correlationId: string;
|
|
11
|
+
workerThreadId: number | null;
|
|
12
|
+
log: BoardComment[];
|
|
13
|
+
};
|
|
14
|
+
workerLog: {
|
|
15
|
+
threadId: number | null;
|
|
16
|
+
tail: string;
|
|
17
|
+
};
|
|
18
|
+
lastError: BoardComment | null;
|
|
19
|
+
}
|
|
20
|
+
export interface CardDiagnosticsDeps {
|
|
21
|
+
readWorkerLogTail?: (threadId: number) => Promise<string>;
|
|
22
|
+
}
|
|
23
|
+
/** Return undefined for an unknown card; callers map that to their own error shape. */
|
|
24
|
+
export declare function getCardDiagnostics(db: Database, cardId: number, deps?: CardDiagnosticsDeps): Promise<CardDiagnostics | undefined>;
|
|
25
|
+
//# sourceMappingURL=card-diagnostics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card-diagnostics.d.ts","sourceRoot":"","sources":["../../../src/services/board/card-diagnostics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAM9D,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE;QACR,aAAa,EAAE,MAAM,CAAC;QACtB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,GAAG,EAAE,YAAY,EAAE,CAAC;KACrB,CAAC;IACF,SAAS,EAAE;QAAE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC;IACrD,SAAS,EAAE,YAAY,GAAG,IAAI,CAAC;CAChC;AAED,MAAM,WAAW,mBAAmB;IAClC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CAC3D;AAED,uFAAuF;AACvF,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,QAAQ,EACZ,MAAM,EAAE,MAAM,EACd,IAAI,GAAE,mBAAwB,GAC7B,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CA0BtC"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Per-card observability read model. It intentionally derives dispatch history
|
|
3
|
+
* from the card's append-only board comments: dispatch has no separate table.
|
|
4
|
+
*/
|
|
5
|
+
import { readFile } from "node:fs/promises";
|
|
6
|
+
import { getCard } from "../../data/board/card.repository.js";
|
|
7
|
+
import { listComments } from "../../data/board/comment.repository.js";
|
|
8
|
+
import { findLatestThreadLogFile } from "../thread-log-reader.js";
|
|
9
|
+
const WORKER_LOG_TAIL_BYTES = 16_384;
|
|
10
|
+
const ERROR_COMMENT_PATTERN = /(?:\berror\b|\bfailed\b|\bexception\b)/i;
|
|
11
|
+
/** Return undefined for an unknown card; callers map that to their own error shape. */
|
|
12
|
+
export async function getCardDiagnostics(db, cardId, deps = {}) {
|
|
13
|
+
const card = getCard(db, cardId);
|
|
14
|
+
if (!card.has())
|
|
15
|
+
return undefined;
|
|
16
|
+
const foundCard = card.get();
|
|
17
|
+
const comments = listComments(db, cardId);
|
|
18
|
+
const dispatchLog = comments.filter((comment) => comment.author === "board");
|
|
19
|
+
const lastError = [...comments]
|
|
20
|
+
.reverse()
|
|
21
|
+
.find((comment) => ERROR_COMMENT_PATTERN.test(comment.content));
|
|
22
|
+
const workerThreadId = foundCard.workerThreadId;
|
|
23
|
+
const readWorkerLogTail = deps.readWorkerLogTail ?? readLatestWorkerLogTail;
|
|
24
|
+
return {
|
|
25
|
+
card: foundCard,
|
|
26
|
+
dispatch: {
|
|
27
|
+
correlationId: foundCard.correlationId,
|
|
28
|
+
workerThreadId,
|
|
29
|
+
log: dispatchLog,
|
|
30
|
+
},
|
|
31
|
+
workerLog: {
|
|
32
|
+
threadId: workerThreadId,
|
|
33
|
+
tail: workerThreadId === null ? "" : await readWorkerLogTail(workerThreadId),
|
|
34
|
+
},
|
|
35
|
+
lastError: lastError ?? null,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
async function readLatestWorkerLogTail(threadId) {
|
|
39
|
+
const logFile = await findLatestThreadLogFile(threadId);
|
|
40
|
+
if (!logFile)
|
|
41
|
+
return "";
|
|
42
|
+
try {
|
|
43
|
+
const contents = await readFile(logFile, "utf-8");
|
|
44
|
+
return contents.slice(-WORKER_LOG_TAIL_BYTES);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
return "";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=card-diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"card-diagnostics.js","sourceRoot":"","sources":["../../../src/services/board/card-diagnostics.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,qCAAqC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,wCAAwC,CAAC;AAGtE,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,qBAAqB,GAAG,yCAAyC,CAAC;AAiBxE,uFAAuF;AACvF,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,EAAY,EACZ,MAAc,EACd,OAA4B,EAAE;IAE9B,MAAM,IAAI,GAAG,OAAO,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACjC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;QAAE,OAAO,SAAS,CAAC;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,QAAQ,GAAG,YAAY,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1C,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;IAC7E,MAAM,SAAS,GAAG,CAAC,GAAG,QAAQ,CAAC;SAC5B,OAAO,EAAE;SACT,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;IAClE,MAAM,cAAc,GAAG,SAAS,CAAC,cAAc,CAAC;IAChD,MAAM,iBAAiB,GAAG,IAAI,CAAC,iBAAiB,IAAI,uBAAuB,CAAC;IAE5E,OAAO;QACL,IAAI,EAAE,SAAS;QACf,QAAQ,EAAE;YACR,aAAa,EAAE,SAAS,CAAC,aAAa;YACtC,cAAc;YACd,GAAG,EAAE,WAAW;SACjB;QACD,SAAS,EAAE;YACT,QAAQ,EAAE,cAAc;YACxB,IAAI,EAAE,cAAc,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,iBAAiB,CAAC,cAAc,CAAC;SAC7E;QACD,SAAS,EAAE,SAAS,IAAI,IAAI;KAC7B,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,QAAgB;IACrD,MAAM,OAAO,GAAG,MAAM,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAClD,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AgentType } from "../../config/index.js";
|
|
2
|
+
/** Parameters required to create a persistent root-agent thread. */
|
|
3
|
+
export interface LiveRootThreadInput {
|
|
4
|
+
name: string;
|
|
5
|
+
agentType: AgentType;
|
|
6
|
+
workingDirectory: string;
|
|
7
|
+
}
|
|
8
|
+
//# sourceMappingURL=live-root-thread.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-root-thread.d.ts","sourceRoot":"","sources":["../../../src/services/board/live-root-thread.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,uBAAuB,CAAC;AAEvD,oEAAoE;AACpE,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,SAAS,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;CAC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"live-root-thread.js","sourceRoot":"","sources":["../../../src/services/board/live-root-thread.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Board orchestrator — the server-side loop that drains the board (design §3).
|
|
3
|
+
*
|
|
4
|
+
* Tick (default 30 s): while the global cap (default 3) is not reached,
|
|
5
|
+
* dispatch top-priority Backlog cards: spawn stateless card-workers, move the
|
|
6
|
+
* cards to In Progress, and emit STARTED signals. Workers are independent
|
|
7
|
+
* processes; no source thread needs to be active for dispatch.
|
|
8
|
+
*
|
|
9
|
+
* Spawn failure is an immediate BLOCKED (reason on the card) — the operator
|
|
10
|
+
* hears about it once, on the card, per the fire-and-forget metric.
|
|
11
|
+
*
|
|
12
|
+
* Report capture / exit reconciliation / recurrence land in Phases 5 and 7.
|
|
13
|
+
*/
|
|
14
|
+
import type { initMemoryDb } from "../../data/memory/index.js";
|
|
15
|
+
import type { ThreadLifecycleService } from "../thread-lifecycle.service.js";
|
|
16
|
+
import { withProcessIdentity } from "../process.service.js";
|
|
17
|
+
import { claimCardForDispatch } from "../../data/board/card.repository.js";
|
|
18
|
+
import { spawnCardWorker } from "./worker-spawn.js";
|
|
19
|
+
import { getUsageSnapshotProvider } from "../usage/usage-snapshot-provider.js";
|
|
20
|
+
import { releaseWorkerForCard } from "./release-worker.js";
|
|
21
|
+
export declare function boardTickMs(): number;
|
|
22
|
+
export declare function boardGlobalMaxConcurrent(): number;
|
|
23
|
+
/** Kill-switch: BOARD_ENABLED=false skips orchestrator start entirely (the
|
|
24
|
+
* board stays a dormant UI/API). Default: enabled. */
|
|
25
|
+
export declare function boardEnabled(): boolean;
|
|
26
|
+
export interface BoardOrchestratorDeps {
|
|
27
|
+
getMemoryDb: () => ReturnType<typeof initMemoryDb>;
|
|
28
|
+
telegram: {
|
|
29
|
+
createForumTopic(chatId: string, name: string): Promise<{
|
|
30
|
+
message_thread_id: number;
|
|
31
|
+
}>;
|
|
32
|
+
sendMessage(chatId: string, text: string, parseMode?: string, threadId?: number): Promise<void>;
|
|
33
|
+
deleteForumTopic(chatId: string, threadId: number): Promise<void>;
|
|
34
|
+
};
|
|
35
|
+
chatId: string;
|
|
36
|
+
threadLifecycle: ThreadLifecycleService;
|
|
37
|
+
/** Test seam — defaults to the real card-worker spawn path. */
|
|
38
|
+
spawnFn?: typeof spawnCardWorker;
|
|
39
|
+
/** Test seam — defaults to the atomic database-backed dispatch claim. */
|
|
40
|
+
claimFn?: typeof claimCardForDispatch;
|
|
41
|
+
/** Test seam — defaults to the process-wide usage read model. */
|
|
42
|
+
usageProvider?: Pick<ReturnType<typeof getUsageSnapshotProvider>, "isProviderLimited">;
|
|
43
|
+
/** Test seam — defaults to the batched pid/startedAt lookup. */
|
|
44
|
+
lookupProcessIdentityFn?: typeof withProcessIdentity;
|
|
45
|
+
/** Test seam — defaults to broker-routed thread liveness. */
|
|
46
|
+
isThreadAliveFn?: (threadId: number, fallbackPid?: number, spawnedAtMs?: number) => Promise<boolean>;
|
|
47
|
+
/** Test seam — defaults to the ordinary operator-release teardown. */
|
|
48
|
+
releaseWorkerFn?: typeof releaseWorkerForCard;
|
|
49
|
+
}
|
|
50
|
+
export declare class BoardOrchestrator {
|
|
51
|
+
private readonly deps;
|
|
52
|
+
private timer;
|
|
53
|
+
private inFlightTick;
|
|
54
|
+
private stopped;
|
|
55
|
+
constructor(deps: BoardOrchestratorDeps);
|
|
56
|
+
/** Begin ticking. A no-op once stop() has run: stop is end-of-life, so a start
|
|
57
|
+
* that arrives late (after a self-update handed the port over) cannot bring a
|
|
58
|
+
* second dispatcher back onto the board. */
|
|
59
|
+
start(): void;
|
|
60
|
+
/** Stop scheduling ticks, for good — a later start() is ignored. Resolves once a
|
|
61
|
+
* tick already in flight has settled, so a caller handing dispatch to another
|
|
62
|
+
* process can wait out its spawn. */
|
|
63
|
+
stop(): Promise<void>;
|
|
64
|
+
tick(): Promise<void>;
|
|
65
|
+
private runTick;
|
|
66
|
+
/**
|
|
67
|
+
* Retire every reported worker whose reply window has closed. The deadline is
|
|
68
|
+
* durable, so this covers a restart inside the window as well as the ordinary
|
|
69
|
+
* case; teardown clears the deadline, so a retirement is executed once. One
|
|
70
|
+
* failure must not strand the rest, hence the per-worker catch.
|
|
71
|
+
*/
|
|
72
|
+
private executeDueRetirements;
|
|
73
|
+
private releaseUnboundBoardWorkers;
|
|
74
|
+
private releaseWorker;
|
|
75
|
+
/**
|
|
76
|
+
* Board-owned recurrence (design §4): a Done recurring card whose delay has
|
|
77
|
+
* elapsed — and whose group has no live instance (enforced in SQL) — puts a
|
|
78
|
+
* fresh identical copy back into Backlog. The original's next_spawn_at is
|
|
79
|
+
* cleared so it never respawns twice; the copy carries the group id forward.
|
|
80
|
+
* schedule_wake_up is untouched — this is a different mechanism by design.
|
|
81
|
+
*/
|
|
82
|
+
private respawnDueRecurrences;
|
|
83
|
+
/** Retry due rate-limited cards in place without freeing their global slot. */
|
|
84
|
+
private respawnDueRateLimited;
|
|
85
|
+
private dispatchDueCards;
|
|
86
|
+
/** Spawn a card already CAS-claimed as in_progress and resolved for dispatch.
|
|
87
|
+
* The card takes the worker inside the spawn path (see bindWorker below), so
|
|
88
|
+
* this returns with the binding already durable. */
|
|
89
|
+
private spawnClaimedCard;
|
|
90
|
+
/**
|
|
91
|
+
* A card must never get a second worker beside a live one (duplicate branch,
|
|
92
|
+
* PR and push). The candidate set is the card's own launch history in
|
|
93
|
+
* `worker_lifecycle` — durable, so unlike the process-local map it replaces it
|
|
94
|
+
* survives a restart, and it covers a shared-checkout card as well as one
|
|
95
|
+
* running in its own worktree, which a scan of worktree paths could not.
|
|
96
|
+
* Liveness is still the probe's verdict, never the stored phase: a worker can
|
|
97
|
+
* die without any actor recording it. A candidate proven dead has its card link
|
|
98
|
+
* dropped here, which is the only place a link is retired — that also collects
|
|
99
|
+
* the link of a dispatch whose agent never came up.
|
|
100
|
+
*/
|
|
101
|
+
private hasLivePriorWorker;
|
|
102
|
+
/**
|
|
103
|
+
* A prior worker with a pending retirement already reported and is finished —
|
|
104
|
+
* it is lingering only so the capture reply can reach it. Retiring it now and
|
|
105
|
+
* then probing is what keeps a promptly answered DECISION from being blocked by
|
|
106
|
+
* its own worker; the window exists for the reply, not for the next dispatch.
|
|
107
|
+
* The probe still decides: a worker that survived its kill is genuinely live.
|
|
108
|
+
*/
|
|
109
|
+
private isPriorWorkerStillLive;
|
|
110
|
+
/**
|
|
111
|
+
* Park a claimed card whose dispatch cannot continue. A dispatch that got as
|
|
112
|
+
* far as binding its worker unbinds through the same CAS a dead bound worker
|
|
113
|
+
* uses — which is also what keeps an operator release that started during the
|
|
114
|
+
* spawn from being overwritten (that CAS requires operator_releasing = 0).
|
|
115
|
+
* A dispatch that failed before the bind is still unbound.
|
|
116
|
+
*/
|
|
117
|
+
private blockClaimedCard;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=orchestrator.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"orchestrator.service.d.ts","sourceRoot":"","sources":["../../../src/services/board/orchestrator.service.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAKH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,gCAAgC,CAAC;AAO7E,OAAO,EAAiB,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAC3E,OAAO,EAKL,oBAAoB,EAUrB,MAAM,qCAAqC,CAAC;AAc7C,OAAO,EAA6C,eAAe,EAAE,MAAM,mBAAmB,CAAC;AAC/F,OAAO,EAAE,wBAAwB,EAAE,MAAM,qCAAqC,CAAC;AAC/E,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAqB3D,wBAAgB,WAAW,IAAI,MAAM,CAGpC;AAED,wBAAgB,wBAAwB,IAAI,MAAM,CAGjD;AAED;uDACuD;AACvD,wBAAgB,YAAY,IAAI,OAAO,CAEtC;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACnD,QAAQ,EAAE;QACR,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;YAAE,iBAAiB,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;QACvF,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAChG,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACnE,CAAC;IACF,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,sBAAsB,CAAC;IACxC,+DAA+D;IAC/D,OAAO,CAAC,EAAE,OAAO,eAAe,CAAC;IACjC,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,oBAAoB,CAAC;IACtC,iEAAiE;IACjE,aAAa,CAAC,EAAE,IAAI,CAAC,UAAU,CAAC,OAAO,wBAAwB,CAAC,EAAE,mBAAmB,CAAC,CAAC;IACvF,gEAAgE;IAChE,uBAAuB,CAAC,EAAE,OAAO,mBAAmB,CAAC;IACrD,6DAA6D;IAC7D,eAAe,CAAC,EAAE,CAChB,QAAQ,EAAE,MAAM,EAChB,WAAW,CAAC,EAAE,MAAM,EACpB,WAAW,CAAC,EAAE,MAAM,KACjB,OAAO,CAAC,OAAO,CAAC,CAAC;IACtB,sEAAsE;IACtE,eAAe,CAAC,EAAE,OAAO,oBAAoB,CAAC;CAC/C;AAED,qBAAa,iBAAiB;IAKhB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,KAAK,CAA+C;IAC5D,OAAO,CAAC,YAAY,CAAmC;IACvD,OAAO,CAAC,OAAO,CAAS;gBAEK,IAAI,EAAE,qBAAqB;IAExD;;iDAE6C;IAC7C,KAAK,IAAI,IAAI;IAmBb;;0CAEsC;IACtC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAOf,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;YAWb,OAAO;IA4BrB;;;;;OAKG;YACW,qBAAqB;YAWrB,0BAA0B;IA8BxC,OAAO,CAAC,aAAa;IAYrB;;;;;;OAMG;IACH,OAAO,CAAC,qBAAqB;IAiD7B,+EAA+E;YACjE,qBAAqB;YAgBrB,gBAAgB;IAwC9B;;yDAEqD;YACvC,gBAAgB;IA6D9B;;;;;;;;;;OAUG;YACW,kBAAkB;IAahC;;;;;;OAMG;YACW,sBAAsB;IAWpC;;;;;;OAMG;IACH,OAAO,CAAC,gBAAgB;CAczB"}
|