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,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The port holder's end of life (inc68). "The HTTP port is the lock" (inc66 M1):
|
|
3
|
+
* the exit watcher, the background runner, the keeper, the board orchestrator and the keepAlive
|
|
4
|
+
* spawn run only in the process that bound the port. This module is what makes
|
|
5
|
+
* that process let go cleanly, on both of its exits — a signal shutdown and a
|
|
6
|
+
* legacy self-update hand-over:
|
|
7
|
+
*
|
|
8
|
+
* - {@link PortHolderJobs} starts every port-holder job through ONE gate, and
|
|
9
|
+
* {@link PortHolderJobs.release} closes it for good. A start that arrives late
|
|
10
|
+
* (after the port was handed over) starts nothing, so the old process cannot
|
|
11
|
+
* run a second nightly purge or a second keeper next to the new holder.
|
|
12
|
+
* - {@link createPortHolderStop} is the one stop step both exits run: close
|
|
13
|
+
* the gate, stop the exit watcher, the runner, the keeper and the board orchestrator, and
|
|
14
|
+
* settle once the board tick and the nightly pass in flight are done. A
|
|
15
|
+
* keepAlive spawn already running is fire-and-forget and is NOT waited for
|
|
16
|
+
* (pre-existing, carded).
|
|
17
|
+
* - {@link createShutdown} finishes that in-flight work (a board tick
|
|
18
|
+
* mid-spawn, a nightly pass mid-purge) before the teardown frees the port,
|
|
19
|
+
* with a bounded wait.
|
|
20
|
+
*/
|
|
21
|
+
/** How long a signal shutdown waits for in-flight port-holder work before it
|
|
22
|
+
* frees the port anyway. A board tick can be mid-spawn, and the broker gives a
|
|
23
|
+
* spawn 30 s (SPAWN_TIMEOUT_MS in broker-client.ts), so ONE healthy spawn
|
|
24
|
+
* settles inside this bound and gets bound to its card. A tick dispatches up
|
|
25
|
+
* to globalCap cards one after another, though, so a multi-card tick can be
|
|
26
|
+
* cut after its first spawn — that residual is accepted: the next holder's
|
|
27
|
+
* reconcile deals with it, a longer Ctrl+C hang would be worse, and the Unix
|
|
28
|
+
* supervisor SIGKILLs after 5 s regardless. A nightly pass that outlasts the
|
|
29
|
+
* bound is cut the same way and dies with this process. Cutting the wait is
|
|
30
|
+
* logged. */
|
|
31
|
+
export const SHUTDOWN_DRAIN_BOUND_MS = 30_000;
|
|
32
|
+
/** One start gate for every job that may run only in the port holder. */
|
|
33
|
+
export class PortHolderJobs {
|
|
34
|
+
jobs;
|
|
35
|
+
log;
|
|
36
|
+
released = false;
|
|
37
|
+
constructor(jobs, log) {
|
|
38
|
+
this.jobs = jobs;
|
|
39
|
+
this.log = log;
|
|
40
|
+
}
|
|
41
|
+
/** Start every job, unless the port has already been released. Checked once,
|
|
42
|
+
* here, so a job added to the list later is covered without its own latch. */
|
|
43
|
+
startAll() {
|
|
44
|
+
if (this.released) {
|
|
45
|
+
this.log.info("[startup] port already released — port-holder jobs not started");
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
for (const job of this.jobs)
|
|
49
|
+
job.start();
|
|
50
|
+
}
|
|
51
|
+
/** The process is giving the port up (shutdown or hand-over). End-of-life: a
|
|
52
|
+
* later startAll() is ignored. Stopping jobs that already run stays with the
|
|
53
|
+
* caller, which knows what each one has to finish. */
|
|
54
|
+
release() {
|
|
55
|
+
this.released = true;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Build the step both ways of giving the port up run (the signal drain and the
|
|
60
|
+
* self-update hand-over), so neither can skip a job it stops. It closes the
|
|
61
|
+
* gate, stops the exit watcher, the runner and the keeper (the keeper would otherwise respawn a
|
|
62
|
+
* thread that exits during the wait), and stops the board — all synchronously,
|
|
63
|
+
* on the call. Its promise settles once the work in flight has finished: the
|
|
64
|
+
* board tick (a spawn bound to its card) and the nightly pass (the next holder
|
|
65
|
+
* starts its own runner, and two purges must not share a thread — inc66 M1).
|
|
66
|
+
* Each caller awaits it before it frees the port.
|
|
67
|
+
*
|
|
68
|
+
* Not every job: a keepAlive spawn already running is fire-and-forget and is
|
|
69
|
+
* not awaited here — a residual that predates inc68 and is carded.
|
|
70
|
+
*/
|
|
71
|
+
export function createPortHolderStop(deps) {
|
|
72
|
+
return async () => {
|
|
73
|
+
deps.gate.release();
|
|
74
|
+
deps.exitWatcher.stop();
|
|
75
|
+
deps.backgroundRunner.stop();
|
|
76
|
+
deps.keeper.stop();
|
|
77
|
+
await Promise.all([
|
|
78
|
+
deps.boardOrchestrator.stop(),
|
|
79
|
+
deps.dailyRotationSettled(),
|
|
80
|
+
deps.exitWatcher.settled(),
|
|
81
|
+
]);
|
|
82
|
+
};
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Build the signal-shutdown sequence: wait for every drain (bounded by
|
|
86
|
+
* `boundMs`), then run `teardown`, which frees the port and exits. Returns a
|
|
87
|
+
* function that runs the sequence ONCE — a second signal while it runs is a
|
|
88
|
+
* no-op, so each drain is started exactly once.
|
|
89
|
+
*/
|
|
90
|
+
export function createShutdown(deps) {
|
|
91
|
+
let started = false;
|
|
92
|
+
return async (reason) => {
|
|
93
|
+
if (started)
|
|
94
|
+
return;
|
|
95
|
+
started = true;
|
|
96
|
+
deps.log.info(`[shutdown] Graceful shutdown initiated (${reason})…`);
|
|
97
|
+
await drainWithin(deps.drains, deps.boundMs, deps.log);
|
|
98
|
+
await deps.teardown();
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
async function drainWithin(drains, boundMs, log) {
|
|
102
|
+
const settled = await new Promise((resolve) => {
|
|
103
|
+
const bound = setTimeout(() => resolve(false), boundMs);
|
|
104
|
+
// Each drain is invoked inside a promise, so one that throws synchronously
|
|
105
|
+
// settles as a rejection instead of escaping — and allSettled never rejects:
|
|
106
|
+
// a drain that fails must not keep the teardown from running.
|
|
107
|
+
const outcomes = drains.map((drain) => Promise.resolve().then(drain));
|
|
108
|
+
void Promise.allSettled(outcomes).then((results) => {
|
|
109
|
+
clearTimeout(bound);
|
|
110
|
+
for (const result of results) {
|
|
111
|
+
if (result.status === "rejected") {
|
|
112
|
+
log.warn(`[shutdown] a drain failed: ${result.reason} — tearing down anyway`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
resolve(true);
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
if (!settled) {
|
|
119
|
+
log.warn(`[shutdown] in-flight work did not settle within ${boundMs} ms — freeing the port anyway`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=port-holder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"port-holder.js","sourceRoot":"","sources":["../../src/server/port-holder.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;;;;;cASc;AACd,MAAM,CAAC,MAAM,uBAAuB,GAAG,MAAM,CAAC;AAe9C,yEAAyE;AACzE,MAAM,OAAO,cAAc;IAIN;IACA;IAJX,QAAQ,GAAG,KAAK,CAAC;IAEzB,YACmB,IAA8B,EAC9B,GAAgB;QADhB,SAAI,GAAJ,IAAI,CAA0B;QAC9B,QAAG,GAAH,GAAG,CAAa;IAChC,CAAC;IAEJ;mFAC+E;IAC/E,QAAQ;QACN,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,gEAAgE,CAAC,CAAC;YAChF,OAAO;QACT,CAAC;QACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,IAAI;YAAE,GAAG,CAAC,KAAK,EAAE,CAAC;IAC3C,CAAC;IAED;;2DAEuD;IACvD,OAAO;QACL,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;IACvB,CAAC;CACF;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAOpC;IACC,OAAO,KAAK,IAAI,EAAE;QAChB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;QACpB,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QACnB,MAAM,OAAO,CAAC,GAAG,CAAC;YAChB,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE;YAC7B,IAAI,CAAC,oBAAoB,EAAE;YAC3B,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAK9B;IACC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,OAAO,KAAK,EAAE,MAAM,EAAE,EAAE;QACtB,IAAI,OAAO;YAAE,OAAO;QACpB,OAAO,GAAG,IAAI,CAAC;QACf,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,2CAA2C,MAAM,IAAI,CAAC,CAAC;QACrE,MAAM,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,IAAI,CAAC,QAAQ,EAAE,CAAC;IACxB,CAAC,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,WAAW,CACxB,MAA0C,EAC1C,OAAe,EACf,GAAgB;IAEhB,MAAM,OAAO,GAAG,MAAM,IAAI,OAAO,CAAU,CAAC,OAAO,EAAE,EAAE;QACrD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC,CAAC;QACxD,2EAA2E;QAC3E,6EAA6E;QAC7E,8DAA8D;QAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,KAAK,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,EAAE;YACjD,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,MAAM,KAAK,UAAU,EAAE,CAAC;oBACjC,GAAG,CAAC,IAAI,CAAC,8BAA8B,MAAM,CAAC,MAAM,wBAAwB,CAAC,CAAC;gBAChF,CAAC;YACH,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IACH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,GAAG,CAAC,IAAI,CACN,mDAAmD,OAAO,+BAA+B,CAC1F,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
* importers keep a single entry point.
|
|
8
8
|
*/
|
|
9
9
|
import { type AgentType } from "../config/index.js";
|
|
10
|
+
import { type ThreadRegistryEntry } from "../data/memory/thread-registry.js";
|
|
10
11
|
import { type Database } from "../data/memory/schema.js";
|
|
11
12
|
import { type ThreadLifecycleService } from "./thread-lifecycle.service.js";
|
|
12
13
|
import { type SpawnResult } from "./spawn-common.js";
|
|
@@ -17,12 +18,56 @@ export { resolveCodexPath, spawnCodexProcess } from "./codex-spawn.service.js";
|
|
|
17
18
|
* Resolve the right spawn function for `agentType` and call it.
|
|
18
19
|
* Handles CLI path resolution and error reporting internally.
|
|
19
20
|
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
21
|
+
* The one place a process is born, and therefore the one place the worker single-use
|
|
22
|
+
* rule is stated: {@link claimWorkerBirth} runs FIRST, above the state machine and
|
|
23
|
+
* above every CLI resolution, so a refused birth transitions nothing and starts
|
|
24
|
+
* nothing. It is a CLAIM and not a question — admitting a worker spends its one launch
|
|
25
|
+
* window — so this call happens exactly once per dispatch, and a caller that merely
|
|
26
|
+
* wants to know whether a birth is possible must not route through here. Read
|
|
27
|
+
* `worker-single-use.ts` before adding a caller — it names the re-exported per-agent
|
|
28
|
+
* spawn functions as forbidden entry points, because they would bypass this.
|
|
29
|
+
*
|
|
30
|
+
* `db` is REQUIRED, which is why the three trailing optionals moved into `opts` with
|
|
31
|
+
* it: TypeScript cannot put a required parameter after an optional one, so leaving
|
|
32
|
+
* `opts` eighth would have meant a default — and a refusal that fails open on an
|
|
33
|
+
* absent handle reopens the hole at the three call sites that used to omit it. Every
|
|
34
|
+
* caller holds a handle already. Requiring it also makes the two state transitions
|
|
35
|
+
* below unconditional: the silent no-state-transition mode this function used to have
|
|
36
|
+
* is gone.
|
|
37
|
+
*
|
|
38
|
+
* A thread in `Created` state transitions Created → Spawning before the process
|
|
39
|
+
* starts, then Spawning → Active on success. This implements the explicit state
|
|
40
|
+
* machine for newly registered threads without affecting existing restart flows
|
|
41
|
+
* (Exited/Active → Active).
|
|
42
|
+
*/
|
|
43
|
+
export interface SpawnDispatch {
|
|
44
|
+
db: Database;
|
|
45
|
+
workingDirectory?: string;
|
|
46
|
+
memorySourceThreadId?: number;
|
|
47
|
+
runtimeThreadType?: "worker" | "branch";
|
|
48
|
+
modelOverride?: string;
|
|
49
|
+
/**
|
|
50
|
+
* The ONE exception to the single-use rule: the born-dead net relaunching a process
|
|
51
|
+
* that died before it ever read its task. Set at exactly one call site
|
|
52
|
+
* (`runBirthDeathNet`), and AUDITED rather than trusted — see
|
|
53
|
+
* `worker-single-use.ts`, which re-derives the net's verdict from state this flag
|
|
54
|
+
* cannot forge.
|
|
55
|
+
*/
|
|
56
|
+
relaunchBornDead?: boolean;
|
|
57
|
+
}
|
|
58
|
+
export declare function dispatchSpawn(agentType: AgentType, name: string, threadId: number, threadLifecycle: ThreadLifecycleService, opts: SpawnDispatch): Promise<SpawnResult>;
|
|
59
|
+
/**
|
|
60
|
+
* Whether boot may put a process back on this thread's id.
|
|
61
|
+
*
|
|
62
|
+
* `type !== 'worker'` is the term the keeper's own SQL already carries
|
|
63
|
+
* (getKeepAliveThreads, thread-registry.ts:256-263) and this filter lacked. A worker
|
|
64
|
+
* is single-use, so boot must never respawn one on its old id — however its
|
|
65
|
+
* keep_alive flag came to be set.
|
|
66
|
+
*
|
|
67
|
+
* Extracted so the rule is reachable without starting processes; the call site is
|
|
68
|
+
* the single `filter` in spawnKeepAliveThreads below.
|
|
24
69
|
*/
|
|
25
|
-
export declare function
|
|
70
|
+
export declare function isKeepAliveSpawnCandidate(thread: ThreadRegistryEntry): boolean;
|
|
26
71
|
export declare function spawnKeepAliveThreads(threadLifecycle: ThreadLifecycleService): Promise<{
|
|
27
72
|
spawned: number;
|
|
28
73
|
errors: string[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-spawn.service.d.ts","sourceRoot":"","sources":["../../src/services/agent-spawn.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"agent-spawn.service.d.ts","sourceRoot":"","sources":["../../src/services/agent-spawn.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAA+B,KAAK,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEjF,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AAC5F,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AAKvE,OAAO,EAAe,KAAK,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACzF,OAAO,EAA+B,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAMlF,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACjF,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAE/E;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,QAAQ,CAAC;IACb,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iBAAiB,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,wBAAsB,aAAa,CACjC,SAAS,EAAE,SAAS,EACpB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,EAChB,eAAe,EAAE,sBAAsB,EACvC,IAAI,EAAE,aAAa,GAClB,OAAO,CAAC,WAAW,CAAC,CAoGtB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,yBAAyB,CAAC,MAAM,EAAE,mBAAmB,GAAG,OAAO,CAM9E;AAED,wBAAsB,qBAAqB,CAAC,eAAe,EAAE,sBAAsB,GAAG,OAAO,CAAC;IAC5F,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CAAC,CAgED"}
|
|
@@ -6,32 +6,29 @@
|
|
|
6
6
|
* The per-agent CLI resolvers and spawn functions are re-exported so existing
|
|
7
7
|
* importers keep a single entry point.
|
|
8
8
|
*/
|
|
9
|
-
import { unlinkSync } from "node:fs";
|
|
10
9
|
import { getAgentType, getFableModel } from "../config/index.js";
|
|
11
10
|
import { log } from "../lib/logger.js";
|
|
12
11
|
import { getAllThreads } from "../data/memory/thread-registry.js";
|
|
13
12
|
import { initMemoryDb } from "../data/memory/schema.js";
|
|
14
13
|
import { errorMessage } from "../lib/utils.js";
|
|
15
|
-
import { ensureDirs, isThreadAlive, readPidFiles
|
|
14
|
+
import { ensureDirs, isThreadAlive, readPidFiles } from "./process.service.js";
|
|
16
15
|
import { brokerAdopt } from "./broker-client.js";
|
|
17
16
|
import { ThreadState } from "./thread-lifecycle.service.js";
|
|
18
17
|
import { setStartupCleanupInProgress } from "./spawn-common.js";
|
|
19
18
|
import { resolveClaudePath, spawnAgentProcess } from "./claude-spawn.service.js";
|
|
20
19
|
import { resolveCopilotPath, spawnCopilotProcess } from "./copilot-spawn.service.js";
|
|
21
20
|
import { resolveCodexPath, spawnCodexProcess } from "./codex-spawn.service.js";
|
|
21
|
+
import { claimWorkerBirth } from "./worker-single-use.js";
|
|
22
22
|
export { resolveClaudePath, spawnAgentProcess } from "./claude-spawn.service.js";
|
|
23
23
|
export { resolveCopilotPath, spawnCopilotProcess } from "./copilot-spawn.service.js";
|
|
24
24
|
export { resolveCodexPath, spawnCodexProcess } from "./codex-spawn.service.js";
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
* threads without affecting existing restart flows (Exited/Active → Active).
|
|
33
|
-
*/
|
|
34
|
-
export async function dispatchSpawn(agentType, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType, db) {
|
|
25
|
+
export async function dispatchSpawn(agentType, name, threadId, threadLifecycle, opts) {
|
|
26
|
+
const { db, workingDirectory, memorySourceThreadId, runtimeThreadType, modelOverride, relaunchBornDead = false, } = opts;
|
|
27
|
+
const refusal = claimWorkerBirth(db, threadId, relaunchBornDead);
|
|
28
|
+
if (refusal.has()) {
|
|
29
|
+
log.warn(`[spawn] refusing to start a process on thread ${threadId}: ${refusal.get()}`);
|
|
30
|
+
return { error: refusal.get() };
|
|
31
|
+
}
|
|
35
32
|
// Legacy agent types (copilot_claude / copilot_codex) were removed, but threads
|
|
36
33
|
// persisted before the removal may still carry them. Without this, they fall
|
|
37
34
|
// through to the Claude branch below and get relaunched as a different agent on
|
|
@@ -41,52 +38,66 @@ export async function dispatchSpawn(agentType, name, threadId, threadLifecycle,
|
|
|
41
38
|
agentType = "copilot";
|
|
42
39
|
}
|
|
43
40
|
// Created → Spawning when a pre-registered thread is about to start
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
log.warn(`[start_thread] Created→Spawning transition failed for ${threadId}: ${errorMessage(err)}`);
|
|
52
|
-
}
|
|
41
|
+
const currentState = threadLifecycle.getThreadState(db, threadId);
|
|
42
|
+
if (currentState === ThreadState.Created) {
|
|
43
|
+
try {
|
|
44
|
+
threadLifecycle.transitionThread(db, threadId, ThreadState.Spawning);
|
|
45
|
+
}
|
|
46
|
+
catch (err) {
|
|
47
|
+
log.warn(`[start_thread] Created→Spawning transition failed for ${threadId}: ${errorMessage(err)}`);
|
|
53
48
|
}
|
|
54
49
|
}
|
|
55
50
|
let result;
|
|
51
|
+
const trimmedModelOverride = modelOverride?.trim() || undefined;
|
|
56
52
|
if (agentType === "copilot") {
|
|
57
53
|
const cliPath = resolveCopilotPath();
|
|
58
54
|
result = cliPath
|
|
59
|
-
? await spawnCopilotProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType)
|
|
55
|
+
? await spawnCopilotProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType, trimmedModelOverride)
|
|
60
56
|
: { error: `Thread ${threadId} (${name}): copilot CLI not found` };
|
|
61
57
|
}
|
|
62
58
|
else if (agentType === "codex" || agentType === "openai_codex") {
|
|
63
59
|
const cliPath = resolveCodexPath();
|
|
64
60
|
result = cliPath
|
|
65
|
-
? await spawnCodexProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType)
|
|
61
|
+
? await spawnCodexProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType, trimmedModelOverride)
|
|
66
62
|
: { error: `Thread ${threadId} (${name}): codex CLI not found` };
|
|
67
63
|
}
|
|
68
64
|
else {
|
|
69
65
|
// "fable" is a Claude-CLI thread pinned to a distinct (premium) model.
|
|
70
66
|
const cliPath = resolveClaudePath();
|
|
71
|
-
|
|
67
|
+
// Fable is intentionally pinned to its configured premium model; card-level
|
|
68
|
+
// overrides apply only to ordinary Claude workers.
|
|
69
|
+
const providerModelOverride = agentType === "fable" ? getFableModel() : trimmedModelOverride;
|
|
72
70
|
result = cliPath
|
|
73
|
-
? await spawnAgentProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType,
|
|
71
|
+
? await spawnAgentProcess(cliPath, name, threadId, threadLifecycle, workingDirectory, memorySourceThreadId, runtimeThreadType, providerModelOverride)
|
|
74
72
|
: { error: `Thread ${threadId} (${name}): claude CLI not found` };
|
|
75
73
|
}
|
|
76
74
|
// Spawning → Active on successful process start
|
|
77
|
-
if (
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
}
|
|
83
|
-
catch (err) {
|
|
84
|
-
log.warn(`[start_thread] Spawning→Active transition failed for ${threadId}: ${errorMessage(err)}`);
|
|
85
|
-
}
|
|
75
|
+
if ("pid" in result && threadLifecycle.getThreadState(db, threadId) === ThreadState.Spawning) {
|
|
76
|
+
try {
|
|
77
|
+
threadLifecycle.transitionThread(db, threadId, ThreadState.Active);
|
|
78
|
+
}
|
|
79
|
+
catch (err) {
|
|
80
|
+
log.warn(`[start_thread] Spawning→Active transition failed for ${threadId}: ${errorMessage(err)}`);
|
|
86
81
|
}
|
|
87
82
|
}
|
|
88
83
|
return result;
|
|
89
84
|
}
|
|
85
|
+
/**
|
|
86
|
+
* Whether boot may put a process back on this thread's id.
|
|
87
|
+
*
|
|
88
|
+
* `type !== 'worker'` is the term the keeper's own SQL already carries
|
|
89
|
+
* (getKeepAliveThreads, thread-registry.ts:256-263) and this filter lacked. A worker
|
|
90
|
+
* is single-use, so boot must never respawn one on its old id — however its
|
|
91
|
+
* keep_alive flag came to be set.
|
|
92
|
+
*
|
|
93
|
+
* Extracted so the rule is reachable without starting processes; the call site is
|
|
94
|
+
* the single `filter` in spawnKeepAliveThreads below.
|
|
95
|
+
*/
|
|
96
|
+
export function isKeepAliveSpawnCandidate(thread) {
|
|
97
|
+
return (thread.keepAlive &&
|
|
98
|
+
thread.type !== "worker" &&
|
|
99
|
+
(thread.status === "active" || thread.status === "exited"));
|
|
100
|
+
}
|
|
90
101
|
export async function spawnKeepAliveThreads(threadLifecycle) {
|
|
91
102
|
const result = { spawned: 0, errors: [] };
|
|
92
103
|
setStartupCleanupInProgress(true);
|
|
@@ -100,39 +111,22 @@ export async function spawnKeepAliveThreads(threadLifecycle) {
|
|
|
100
111
|
}
|
|
101
112
|
let threads;
|
|
102
113
|
try {
|
|
103
|
-
for (const
|
|
104
|
-
|
|
105
|
-
continue;
|
|
114
|
+
for (const pidEntry of await readPidFiles()) {
|
|
115
|
+
const { pid, threadId, threadType, startedAt } = pidEntry;
|
|
106
116
|
// THREAD-scoped (mirror reconcileState): a keepAlive agent that survived a
|
|
107
117
|
// server self-update has a dead launcher pid but a live forked child in its
|
|
108
|
-
// job. A pid-first isProcessAlive() would read it dead and
|
|
109
|
-
//
|
|
110
|
-
//
|
|
111
|
-
//
|
|
118
|
+
// job. A pid-first isProcessAlive() would read it dead and skip brokerAdopt.
|
|
119
|
+
// Treat-alive on unreachable; known:false falls back to the pid check (dev
|
|
120
|
+
// mode / pre-broker process). A dead one's PID file is left to the exit
|
|
121
|
+
// watcher, which resolves it through the exit path with its exit code.
|
|
112
122
|
if (await isThreadAlive(threadId, pid, startedAt)) {
|
|
113
|
-
spawnedThreads.push({
|
|
114
|
-
pid,
|
|
115
|
-
threadId,
|
|
116
|
-
name: name ?? `thread-${threadId}`,
|
|
117
|
-
startedAt: startedAt ?? Date.now(),
|
|
118
|
-
createdAt: startedAt ?? Date.now(),
|
|
119
|
-
logFile: "",
|
|
120
|
-
...(threadType ? { threadType } : {}),
|
|
121
|
-
});
|
|
122
123
|
// Safe cutover (Phase 3): a process that predates broker-owned spawning
|
|
123
124
|
// is invisible to jobs/registry — ask the broker to adopt it now instead
|
|
124
125
|
// of waiting for the next supervisor restart. Idempotent; best-effort.
|
|
125
126
|
void brokerAdopt(threadId, pid, startedAt, threadType ?? "agent");
|
|
126
127
|
}
|
|
127
|
-
else
|
|
128
|
-
try {
|
|
129
|
-
unlinkSync(filePath);
|
|
130
|
-
}
|
|
131
|
-
catch {
|
|
132
|
-
/* stale PID file locked or already gone */
|
|
133
|
-
}
|
|
134
128
|
}
|
|
135
|
-
threads = getAllThreads(db).filter(
|
|
129
|
+
threads = getAllThreads(db).filter(isKeepAliveSpawnCandidate);
|
|
136
130
|
}
|
|
137
131
|
finally {
|
|
138
132
|
setStartupCleanupInProgress(false);
|
|
@@ -143,17 +137,16 @@ export async function spawnKeepAliveThreads(threadLifecycle) {
|
|
|
143
137
|
for (const thread of threads) {
|
|
144
138
|
// THREAD-scoped: findAliveThread is pid-first and would re-declare a surviving
|
|
145
139
|
// keepAlive agent (dead launcher pid) dead, re-spawning a duplicate onto the
|
|
146
|
-
// live thread every boot. Source the anchor pid from the pid file
|
|
147
|
-
// entry and ask the broker by threadId; treat-alive on unreachable so we never
|
|
140
|
+
// live thread every boot. Source the anchor pid from the pid file and ask the broker by threadId; treat-alive on unreachable so we never
|
|
148
141
|
// duplicate-spawn on unknown (broker spawn idempotency remains the backstop).
|
|
149
|
-
const alivePidEntry = readPidFiles().find((e) => e.threadId === thread.threadId);
|
|
150
|
-
|
|
151
|
-
const aliveFallbackPid = alivePidEntry?.pid ?? aliveInMem?.pid;
|
|
152
|
-
const aliveStartedAt = alivePidEntry?.startedAt ?? aliveInMem?.startedAt;
|
|
153
|
-
if (await isThreadAlive(thread.threadId, aliveFallbackPid, aliveStartedAt))
|
|
142
|
+
const alivePidEntry = (await readPidFiles()).find((e) => e.threadId === thread.threadId);
|
|
143
|
+
if (await isThreadAlive(thread.threadId, alivePidEntry?.pid, alivePidEntry?.startedAt))
|
|
154
144
|
continue;
|
|
155
145
|
const client = thread.client ?? getAgentType();
|
|
156
|
-
const spawnResult = await dispatchSpawn(client, thread.name, thread.threadId, threadLifecycle,
|
|
146
|
+
const spawnResult = await dispatchSpawn(client, thread.name, thread.threadId, threadLifecycle, {
|
|
147
|
+
db,
|
|
148
|
+
...(thread.workingDirectory ? { workingDirectory: thread.workingDirectory } : {}),
|
|
149
|
+
});
|
|
157
150
|
if ("error" in spawnResult) {
|
|
158
151
|
result.errors.push(spawnResult.error);
|
|
159
152
|
continue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-spawn.service.js","sourceRoot":"","sources":["../../src/services/agent-spawn.service.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"agent-spawn.service.js","sourceRoot":"","sources":["../../src/services/agent-spawn.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background-runner.d.ts","sourceRoot":"","sources":["../../src/services/background-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"background-runner.d.ts","sourceRoot":"","sources":["../../src/services/background-runner.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAGpD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AAQ5E,UAAU,oBAAoB;IAC5B,WAAW,EAAE,MAAM,UAAU,CAAC,OAAO,YAAY,CAAC,CAAC;IACnD,QAAQ,EAAE,cAAc,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,sBAAsB,CAAC;IACxC,GAAG,EAAE;QACH,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;KAC9B,CAAC;CACH;AAED,qBAAa,mBAAmB;IAIlB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAHjC,OAAO,CAAC,SAAS,CAAwC;IACzD,OAAO,CAAC,oBAAoB,CAAuB;gBAEtB,IAAI,EAAE,oBAAoB;IAEvD,KAAK,IAAI,IAAI;IAmBb,IAAI,IAAI,IAAI;YAOE,gBAAgB;YAuBhB,qBAAqB;CAqCpC"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
import { rotateAllDailySessions } from "./daily-session.js";
|
|
2
2
|
import { cleanupExpiredWorkers } from "./worker-cleanup.service.js";
|
|
3
3
|
import { errorMessage } from "../lib/utils.js";
|
|
4
|
-
import { getAllThreads } from "../data/memory/thread-registry.js";
|
|
5
|
-
import { isThreadAlive, readPidFiles, spawnedThreads } from "./process.service.js";
|
|
6
|
-
import { decommissionWorker } from "./worker-cleanup.service.js";
|
|
7
4
|
import { hasRunToday } from "../data/daily-marker.js";
|
|
8
5
|
const DAILY_ROTATION_INTERVAL_MS = 5 * 60_000;
|
|
9
6
|
const DAILY_ROTATION_HOUR = 4;
|
|
@@ -20,16 +17,12 @@ export class BackgroundJobRunner {
|
|
|
20
17
|
return;
|
|
21
18
|
void this.runWorkerCleanup();
|
|
22
19
|
void this.runDailyRotationCheck();
|
|
23
|
-
void this.runDeadWorkerSweep();
|
|
24
20
|
this.intervals.push(setInterval(() => {
|
|
25
21
|
void this.runWorkerCleanup();
|
|
26
22
|
}, WORKER_CLEANUP_INTERVAL_MS));
|
|
27
23
|
this.intervals.push(setInterval(() => {
|
|
28
24
|
void this.runDailyRotationCheck();
|
|
29
25
|
}, DAILY_ROTATION_INTERVAL_MS));
|
|
30
|
-
this.intervals.push(setInterval(() => {
|
|
31
|
-
void this.runDeadWorkerSweep();
|
|
32
|
-
}, WORKER_CLEANUP_INTERVAL_MS));
|
|
33
26
|
}
|
|
34
27
|
stop() {
|
|
35
28
|
for (const interval of this.intervals) {
|
|
@@ -55,57 +48,6 @@ export class BackgroundJobRunner {
|
|
|
55
48
|
// Phase 2). Its replacement is job-membership reconciliation in the broker
|
|
56
49
|
// once Phase 3 spawns agents into named job objects.
|
|
57
50
|
}
|
|
58
|
-
async runDeadWorkerSweep() {
|
|
59
|
-
try {
|
|
60
|
-
const db = this.deps.getMemoryDb();
|
|
61
|
-
const workers = getAllThreads(db).filter((t) => t.type === "worker" && (t.status === "active" || t.status === "exited"));
|
|
62
|
-
const pidEntries = readPidFiles();
|
|
63
|
-
for (const w of workers) {
|
|
64
|
-
// THREAD-scoped liveness (mirror cleanupExpiredWorkers): a broker-spawned
|
|
65
|
-
// worker's launcher pid reads dead ~20s after spawn while its forked child
|
|
66
|
-
// lives on in the job. A pid-first isThreadRunning()/findAliveThread here
|
|
67
|
-
// would BOTH mis-declare that live worker dead AND splice it out of
|
|
68
|
-
// spawnedThreads — so the inMemory branch below would fall through to a full
|
|
69
|
-
// decommissionWorker (job-kill + topic delete + note/DB archive) of a running
|
|
70
|
-
// worker every sweep. Source the fallback pid + startedAt exactly where
|
|
71
|
-
// cleanupExpiredWorkers does, then ask the broker by threadId; the broker's
|
|
72
|
-
// job/registry verdict (or treat-alive-on-unreachable) gates the sweep, and
|
|
73
|
-
// isThreadAlive never mutates spawnedThreads so the inMemory branch stays
|
|
74
|
-
// correct for a genuinely-dead worker still tracked in memory.
|
|
75
|
-
const pidEntry = pidEntries.find((e) => e.threadId === w.threadId);
|
|
76
|
-
const inMemEntry = spawnedThreads.find((t) => t.threadId === w.threadId);
|
|
77
|
-
const fallbackPid = pidEntry?.pid ?? inMemEntry?.pid;
|
|
78
|
-
const startedAt = pidEntry?.startedAt ?? inMemEntry?.startedAt;
|
|
79
|
-
if (!(await isThreadAlive(w.threadId, fallbackPid, startedAt))) {
|
|
80
|
-
const inMemory = spawnedThreads.some((t) => t.threadId === w.threadId);
|
|
81
|
-
try {
|
|
82
|
-
if (inMemory) {
|
|
83
|
-
// Still tracked in spawnedThreads: archive DB record now for dashboard accuracy.
|
|
84
|
-
// Full decommission (topic deletion, memory synthesis) happens via TTL cleanup.
|
|
85
|
-
this.deps.threadLifecycle.archiveThread(db, w.threadId);
|
|
86
|
-
}
|
|
87
|
-
else {
|
|
88
|
-
// Not in spawnedThreads: the TTL cleanup's SQL path won't reach an already-archived
|
|
89
|
-
// thread, so the Telegram topic would leak. Do a full decommission now.
|
|
90
|
-
await decommissionWorker({ threadId: w.threadId, name: w.name }, {
|
|
91
|
-
db,
|
|
92
|
-
telegram: this.deps.telegram,
|
|
93
|
-
chatId: this.deps.chatId,
|
|
94
|
-
threadLifecycle: this.deps.threadLifecycle,
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
this.deps.log.info(`[dead-worker-sweep] Archived dead worker ${w.threadId} (${w.name})`);
|
|
98
|
-
}
|
|
99
|
-
catch (err) {
|
|
100
|
-
this.deps.log.warn(`[dead-worker-sweep] Failed to archive ${w.threadId}: ${errorMessage(err)}`);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
catch (err) {
|
|
106
|
-
this.deps.log.error(`Dead worker sweep error: ${errorMessage(err)}`);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
51
|
async runDailyRotationCheck() {
|
|
110
52
|
const now = new Date();
|
|
111
53
|
// Fire once we're at/past the rotation hour for the day, not only inside a
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"background-runner.js","sourceRoot":"","sources":["../../src/services/background-runner.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAC;AAEpE,OAAO,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAC/C,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"background-runner.js","sourceRoot":"","sources":["../../src/services/background-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,45 @@
|
|
|
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 { TelegramClient } from "../telegram.js";
|
|
15
|
+
import type { BoardCard } from "../../data/board/board-types.js";
|
|
16
|
+
import type { Database } from "../../data/memory/db-types.js";
|
|
17
|
+
import { Optional } from "../../data/optional.js";
|
|
18
|
+
export type BoardSignalKind = "STARTED" | "DONE" | "BLOCKED" | "DECISION_NEEDED";
|
|
19
|
+
type BoardBot = Pick<TelegramClient, "sendMessage">;
|
|
20
|
+
type BoardWarningSink = (message: string) => void;
|
|
21
|
+
export interface BoardSignalDelivery {
|
|
22
|
+
boardBot: Optional<BoardBot>;
|
|
23
|
+
boardBotToken: Optional<string>;
|
|
24
|
+
boardChatId: Optional<string>;
|
|
25
|
+
warningSink: Optional<BoardWarningSink>;
|
|
26
|
+
mainThreadId: Optional<number>;
|
|
27
|
+
}
|
|
28
|
+
/** Production delivery: the configured board bot, else the main thread from the environment. */
|
|
29
|
+
export declare const DEFAULT_BOARD_SIGNAL_DELIVERY: BoardSignalDelivery;
|
|
30
|
+
/** One-line, FYI-framed state transition. `detail` is used for BLOCKED and
|
|
31
|
+
* DECISION_NEEDED, where it makes the ping actionable for the operator. */
|
|
32
|
+
export declare function sendBoardSignal(db: Database, card: BoardCard, kind: BoardSignalKind, detail?: string, delivery?: BoardSignalDelivery): void;
|
|
33
|
+
/** Resolve the optional operator main thread from the process boundary. */
|
|
34
|
+
export declare function resolveBoardMainThreadId(): Optional<number>;
|
|
35
|
+
/**
|
|
36
|
+
* Selective escalation (invariant #4): a card the operator hand-flagged
|
|
37
|
+
* "important to me" mirrors its notable updates (worker reports, block
|
|
38
|
+
* reasons) into the main thread as passive notices — aware, not commanded.
|
|
39
|
+
* Deterministic: no agent judges importance; the flag decides, always.
|
|
40
|
+
*/
|
|
41
|
+
export declare function mirrorEscalatedUpdate(db: Database, card: BoardCard, text: string, delivery?: BoardSignalDelivery): void;
|
|
42
|
+
/** A decision cannot proceed without the operator, regardless of card priority. */
|
|
43
|
+
export declare function sendDecisionPing(db: Database, card: BoardCard, question: string, delivery?: BoardSignalDelivery): void;
|
|
44
|
+
export {};
|
|
45
|
+
//# sourceMappingURL=board-signals.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"board-signals.d.ts","sourceRoot":"","sources":["../../../src/services/board/board-signals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,iCAAiC,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,+BAA+B,CAAC;AAC9D,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAElD,MAAM,MAAM,eAAe,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,GAAG,iBAAiB,CAAC;AAMjF,KAAK,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;AACpD,KAAK,gBAAgB,GAAG,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;AAElD,MAAM,WAAW,mBAAmB;IAClC,QAAQ,EAAE,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9B,WAAW,EAAE,QAAQ,CAAC,gBAAgB,CAAC,CAAC;IACxC,YAAY,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;CAChC;AAED,gGAAgG;AAChG,eAAO,MAAM,6BAA6B,EAAE,mBAM3C,CAAC;AAkDF;4EAC4E;AAC5E,wBAAgB,eAAe,CAC7B,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,eAAe,EACrB,MAAM,CAAC,EAAE,MAAM,EACf,QAAQ,GAAE,mBAAmD,GAC5D,IAAI,CAmCN;AAED,2EAA2E;AAC3E,wBAAgB,wBAAwB,IAAI,QAAQ,CAAC,MAAM,CAAC,CAG3D;AAOD;;;;;GAKG;AACH,wBAAgB,qBAAqB,CACnC,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,SAAS,EACf,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,mBAAmD,GAC5D,IAAI,CAkBN;AAED,mFAAmF;AACnF,wBAAgB,gBAAgB,CAC9B,EAAE,EAAE,QAAQ,EACZ,IAAI,EAAE,SAAS,EACf,QAAQ,EAAE,MAAM,EAChB,QAAQ,GAAE,mBAAmD,GAC5D,IAAI,CAaN"}
|