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,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Card tile — ✅ EDITABLE. Pure: `card` + `laneName` in, `open` out.
|
|
3
|
+
* Dispatch design: floating dark card — title, then chip row with priority,
|
|
4
|
+
* live worker pulse / blocked / archived. A decision_needed card gets a distinct
|
|
5
|
+
* badge plus a waiting-age cue so a stalled decision is obvious at a glance.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import StatusChip from "./StatusChip.js";
|
|
9
|
+
import PriorityChip from "./PriorityChip.js";
|
|
10
|
+
import { proactiveLimitKind, providerLabel, retryLabel } from "./rateLimit.js";
|
|
11
|
+
import { humanMins, minsSince } from "./time.js";
|
|
12
|
+
|
|
13
|
+
export default {
|
|
14
|
+
name: "Card",
|
|
15
|
+
components: { StatusChip, PriorityChip },
|
|
16
|
+
props: {
|
|
17
|
+
card: { type: Object, required: true },
|
|
18
|
+
laneName: { type: Function, default: () => "Ungrouped" },
|
|
19
|
+
limitedProviders: { type: Array, default: () => [] },
|
|
20
|
+
},
|
|
21
|
+
emits: ["open"],
|
|
22
|
+
setup(props, { emit }) {
|
|
23
|
+
function elapsed() {
|
|
24
|
+
if (!props.card.startedAt) return "";
|
|
25
|
+
return humanMins(minsSince(props.card.startedAt));
|
|
26
|
+
}
|
|
27
|
+
function rlText() {
|
|
28
|
+
const p = providerLabel(props.card.rateLimitProvider);
|
|
29
|
+
return (p ? p + " · " : "") + retryLabel(props.card);
|
|
30
|
+
}
|
|
31
|
+
function proactiveProvider() {
|
|
32
|
+
return providerLabel(props.card.profile?.agentType);
|
|
33
|
+
}
|
|
34
|
+
function proactiveKind() {
|
|
35
|
+
return proactiveLimitKind(props.card, props.limitedProviders);
|
|
36
|
+
}
|
|
37
|
+
/** How long this card has been waiting on the operator. */
|
|
38
|
+
function waiting() {
|
|
39
|
+
const c = props.card;
|
|
40
|
+
if (c.status !== "decision_needed") return null;
|
|
41
|
+
const mins = minsSince(c.updatedAt || c.finishedAt || c.startedAt || c.createdAt);
|
|
42
|
+
return { text: humanMins(mins), stale: mins >= 480 };
|
|
43
|
+
}
|
|
44
|
+
return { emit, elapsed, proactiveKind, proactiveProvider, rlText, waiting };
|
|
45
|
+
},
|
|
46
|
+
template: `
|
|
47
|
+
<article class="card" role="listitem" tabindex="0"
|
|
48
|
+
:class="{ 'card--decision': card.status === 'decision_needed' }"
|
|
49
|
+
@click="emit('open', card)"
|
|
50
|
+
@keydown.enter="emit('open', card)">
|
|
51
|
+
<div v-if="waiting()" class="card__decision" :class="{ 'is-stale': waiting().stale }">
|
|
52
|
+
<span class="card__decision-label">
|
|
53
|
+
<span class="dot dot--pulse"></span>NEEDS YOU
|
|
54
|
+
</span>
|
|
55
|
+
<span class="card__decision-age">waiting {{ waiting().text }}</span>
|
|
56
|
+
</div>
|
|
57
|
+
<h3 class="card__title">{{ card.title }}</h3>
|
|
58
|
+
<p v-if="card.description" class="card__desc">{{ card.description }}</p>
|
|
59
|
+
<div v-if="card.status === 'rate_limited'" class="card__rl">
|
|
60
|
+
<svg viewBox="0 0 12 12" width="11" height="11" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" aria-hidden="true"><circle cx="6" cy="6" r="4.6"></circle><path d="M6 3.6V6l1.8 1.2"></path></svg>
|
|
61
|
+
<span>rate limited · {{ rlText() }}</span>
|
|
62
|
+
</div>
|
|
63
|
+
<div v-if="proactiveKind()" class="card__rl">
|
|
64
|
+
<StatusChip status="rate_limited" :kind="proactiveKind()" />
|
|
65
|
+
<span v-if="proactiveProvider()">{{ proactiveProvider() }}</span>
|
|
66
|
+
</div>
|
|
67
|
+
<div class="card__foot">
|
|
68
|
+
<PriorityChip :priority="card.priority" />
|
|
69
|
+
<span v-if="card.status === 'in_progress'" class="chip chip--live">
|
|
70
|
+
<span class="dot dot--pulse"></span>working<template v-if="card.startedAt"> · {{ elapsed() }}</template>
|
|
71
|
+
</span>
|
|
72
|
+
<span v-else-if="card.blockedReason" class="chip chip--warn">blocked</span>
|
|
73
|
+
<span v-if="card.archivedAt" class="chip chip--muted">archived</span>
|
|
74
|
+
<span class="card__lane">{{ laneName(card.laneGroupId) }}</span>
|
|
75
|
+
</div>
|
|
76
|
+
</article>
|
|
77
|
+
`,
|
|
78
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Combobox — ✅ EDITABLE. Editable dropdown: free-text input + curated
|
|
3
|
+
* suggestions (optionally grouped). Pure: modelValue in, update:modelValue out.
|
|
4
|
+
* `groups`: [{ label|null, options: string[] }] — label null renders flat.
|
|
5
|
+
* The user may pick a suggestion OR type any value.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { computed, onMounted, onUnmounted, ref } from "../vendor/vue.esm-browser.js";
|
|
9
|
+
|
|
10
|
+
export default {
|
|
11
|
+
name: "Combobox",
|
|
12
|
+
props: {
|
|
13
|
+
modelValue: { type: String, default: "" },
|
|
14
|
+
groups: { type: Array, default: () => [] },
|
|
15
|
+
placeholder: { type: String, default: "" },
|
|
16
|
+
disabled: { type: Boolean, default: false },
|
|
17
|
+
},
|
|
18
|
+
emits: ["update:modelValue"],
|
|
19
|
+
setup(props, { emit }) {
|
|
20
|
+
const open = ref(false);
|
|
21
|
+
const rootEl = ref(null);
|
|
22
|
+
const filtered = computed(() => {
|
|
23
|
+
const q = (props.modelValue || "").trim().toLowerCase();
|
|
24
|
+
const out = [];
|
|
25
|
+
for (const g of props.groups) {
|
|
26
|
+
const opts = q ? g.options.filter((o) => o.toLowerCase().includes(q)) : g.options;
|
|
27
|
+
if (opts.length) out.push({ label: g.label || null, options: opts });
|
|
28
|
+
}
|
|
29
|
+
return out;
|
|
30
|
+
});
|
|
31
|
+
function onInput(e) {
|
|
32
|
+
emit("update:modelValue", e.target.value);
|
|
33
|
+
open.value = true;
|
|
34
|
+
}
|
|
35
|
+
function pick(o) {
|
|
36
|
+
emit("update:modelValue", o);
|
|
37
|
+
open.value = false;
|
|
38
|
+
}
|
|
39
|
+
function onDoc(e) {
|
|
40
|
+
if (rootEl.value && !rootEl.value.contains(e.target)) open.value = false;
|
|
41
|
+
}
|
|
42
|
+
function onKey(e) {
|
|
43
|
+
if (e.key === "Escape") open.value = false;
|
|
44
|
+
}
|
|
45
|
+
onMounted(() => {
|
|
46
|
+
document.addEventListener("click", onDoc, true);
|
|
47
|
+
document.addEventListener("keydown", onKey);
|
|
48
|
+
});
|
|
49
|
+
onUnmounted(() => {
|
|
50
|
+
document.removeEventListener("click", onDoc, true);
|
|
51
|
+
document.removeEventListener("keydown", onKey);
|
|
52
|
+
});
|
|
53
|
+
return { open, rootEl, filtered, onInput, pick };
|
|
54
|
+
},
|
|
55
|
+
template: `
|
|
56
|
+
<div class="dropdown combobox" ref="rootEl">
|
|
57
|
+
<div class="combobox__wrap">
|
|
58
|
+
<input class="input combobox__input" :value="modelValue" :placeholder="placeholder"
|
|
59
|
+
role="combobox" :aria-expanded="open" aria-autocomplete="list" :disabled="disabled"
|
|
60
|
+
@input="onInput" @focus="open = true" />
|
|
61
|
+
<button type="button" class="combobox__toggle" :class="{ 'is-open': open }" :disabled="disabled"
|
|
62
|
+
aria-label="Show suggestions" tabindex="-1" @click="open = !open">▾</button>
|
|
63
|
+
</div>
|
|
64
|
+
<ul v-if="open && filtered.length" class="dropdown__menu" role="listbox">
|
|
65
|
+
<template v-for="g in filtered" :key="g.label || '_'">
|
|
66
|
+
<li v-if="g.label" class="combobox__group" role="presentation">{{ g.label }}</li>
|
|
67
|
+
<li v-for="o in g.options" :key="o">
|
|
68
|
+
<button type="button" class="dropdown__opt" role="option"
|
|
69
|
+
:aria-selected="o === modelValue" :class="{ 'is-selected': o === modelValue }"
|
|
70
|
+
@click="pick(o)">
|
|
71
|
+
<span class="dropdown__optlabel">{{ o }}</span>
|
|
72
|
+
<span v-if="o === modelValue" class="dropdown__check">✓</span>
|
|
73
|
+
</button>
|
|
74
|
+
</li>
|
|
75
|
+
</template>
|
|
76
|
+
</ul>
|
|
77
|
+
</div>
|
|
78
|
+
`,
|
|
79
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comment composer — ✅ EDITABLE. Pure: emits `submit(text)`; clears on send.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
import { ref } from "../vendor/vue.esm-browser.js";
|
|
6
|
+
|
|
7
|
+
export default {
|
|
8
|
+
name: "CommentComposer",
|
|
9
|
+
props: {
|
|
10
|
+
busy: { type: Boolean, default: false },
|
|
11
|
+
},
|
|
12
|
+
emits: ["submit"],
|
|
13
|
+
setup(props, { emit }) {
|
|
14
|
+
const text = ref("");
|
|
15
|
+
function send() {
|
|
16
|
+
const t = text.value.trim();
|
|
17
|
+
if (!t) return;
|
|
18
|
+
emit("submit", t);
|
|
19
|
+
text.value = "";
|
|
20
|
+
}
|
|
21
|
+
return { text, send };
|
|
22
|
+
},
|
|
23
|
+
template: `
|
|
24
|
+
<form class="composer" @submit.prevent="send">
|
|
25
|
+
<textarea class="input input--area" v-model="text" rows="2" placeholder="Add a comment…"></textarea>
|
|
26
|
+
<button class="btn btn--primary" type="submit" :disabled="!text.trim() || busy">{{ busy ? 'Sending…' : 'Comment' }}</button>
|
|
27
|
+
</form>
|
|
28
|
+
`,
|
|
29
|
+
};
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Comment history — ✅ EDITABLE. Pure: `comments` in.
|
|
3
|
+
* Dispatch design: activity feed — avatar tile + floating bubble per entry.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const AVATARS = { worker: "⚙", operator: "Y", board: "◆" };
|
|
7
|
+
|
|
8
|
+
export default {
|
|
9
|
+
name: "CommentList",
|
|
10
|
+
props: { comments: { type: Array, default: () => [] } },
|
|
11
|
+
setup() {
|
|
12
|
+
function when(iso) {
|
|
13
|
+
try {
|
|
14
|
+
return new Date(iso).toLocaleString();
|
|
15
|
+
} catch {
|
|
16
|
+
return iso;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
function avatar(author) {
|
|
20
|
+
return AVATARS[author] || "•";
|
|
21
|
+
}
|
|
22
|
+
return { when, avatar };
|
|
23
|
+
},
|
|
24
|
+
template: `
|
|
25
|
+
<ul class="comments">
|
|
26
|
+
<li v-for="c in comments" :key="c.id" class="comment" :class="'comment--' + c.author">
|
|
27
|
+
<span class="comment__avatar" aria-hidden="true">{{ avatar(c.author) }}</span>
|
|
28
|
+
<div class="comment__bubble">
|
|
29
|
+
<div class="comment__meta">
|
|
30
|
+
<span class="comment__author">{{ c.author }}</span>
|
|
31
|
+
<time class="comment__time">{{ when(c.createdAt) }}</time>
|
|
32
|
+
</div>
|
|
33
|
+
<p class="comment__body">{{ c.content }}</p>
|
|
34
|
+
</div>
|
|
35
|
+
</li>
|
|
36
|
+
<li v-if="!comments.length" class="comment comment--empty">
|
|
37
|
+
<span class="comment__empty-title">No activity yet</span>
|
|
38
|
+
<span class="comment__empty-note">Worker updates, decisions and your notes all land here.</span>
|
|
39
|
+
</li>
|
|
40
|
+
</ul>
|
|
41
|
+
`,
|
|
42
|
+
};
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DirTreePicker — ✅ EDITABLE. Modal browser for picking an absolute directory
|
|
3
|
+
* on the HOST machine (the browser's own dialog only yields a folder name).
|
|
4
|
+
*
|
|
5
|
+
* Pure presentational: it never fetches. One filesystem level is loaded at a
|
|
6
|
+
* time through the async `load(path)` prop (path "" → volume roots), which the
|
|
7
|
+
* parent wires to the data seam (state/useDirBrowser.js → api.listDir). The
|
|
8
|
+
* chosen absolute path leaves via `select`.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { computed, ref, watch, onMounted, onUnmounted } from "../vendor/vue.esm-browser.js";
|
|
12
|
+
|
|
13
|
+
export default {
|
|
14
|
+
name: "DirTreePicker",
|
|
15
|
+
props: {
|
|
16
|
+
open: { type: Boolean, default: false },
|
|
17
|
+
/** async (path: string) => { path, parent, entries: [{ name, path }] } */
|
|
18
|
+
load: { type: Function, required: true },
|
|
19
|
+
value: { type: String, default: "" },
|
|
20
|
+
recent: { type: Array, default: () => [] },
|
|
21
|
+
},
|
|
22
|
+
emits: ["close", "select"],
|
|
23
|
+
setup(props, { emit }) {
|
|
24
|
+
// Breadcrumb chain of entered folders ([] = roots view).
|
|
25
|
+
const stack = ref([]);
|
|
26
|
+
const items = ref([]); // entries of the current level
|
|
27
|
+
const loading = ref(false);
|
|
28
|
+
const error = ref("");
|
|
29
|
+
|
|
30
|
+
const current = computed(() => stack.value[stack.value.length - 1] || null);
|
|
31
|
+
|
|
32
|
+
// Sequence guard: rapid breadcrumb/row clicks fire overlapping loads; only
|
|
33
|
+
// the newest may write, so a slow earlier response can't overwrite the level.
|
|
34
|
+
let loadSeq = 0;
|
|
35
|
+
async function loadLevel(path) {
|
|
36
|
+
const seq = ++loadSeq;
|
|
37
|
+
loading.value = true;
|
|
38
|
+
error.value = "";
|
|
39
|
+
try {
|
|
40
|
+
const listing = await props.load(path || "");
|
|
41
|
+
if (seq !== loadSeq) return;
|
|
42
|
+
items.value = (listing && listing.entries) || [];
|
|
43
|
+
} catch (e) {
|
|
44
|
+
if (seq !== loadSeq) return;
|
|
45
|
+
error.value = (e && e.message) || String(e);
|
|
46
|
+
items.value = [];
|
|
47
|
+
} finally {
|
|
48
|
+
if (seq === loadSeq) loading.value = false;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
watch(
|
|
53
|
+
() => props.open,
|
|
54
|
+
(open) => {
|
|
55
|
+
if (!open) return;
|
|
56
|
+
stack.value = []; // always reopen at the roots
|
|
57
|
+
loadLevel("");
|
|
58
|
+
},
|
|
59
|
+
);
|
|
60
|
+
|
|
61
|
+
function enter(node) {
|
|
62
|
+
stack.value = [...stack.value, node];
|
|
63
|
+
loadLevel(node.path);
|
|
64
|
+
}
|
|
65
|
+
function jumpTo(i) {
|
|
66
|
+
// i = -1 → roots view; i = index in stack → that folder.
|
|
67
|
+
stack.value = stack.value.slice(0, i + 1);
|
|
68
|
+
loadLevel(i < 0 ? "" : stack.value[i].path);
|
|
69
|
+
}
|
|
70
|
+
function confirm() {
|
|
71
|
+
if (current.value) emit("select", current.value.path);
|
|
72
|
+
}
|
|
73
|
+
function onKey(e) {
|
|
74
|
+
if (e.key === "Escape" && props.open) emit("close");
|
|
75
|
+
}
|
|
76
|
+
onMounted(() => document.addEventListener("keydown", onKey));
|
|
77
|
+
onUnmounted(() => document.removeEventListener("keydown", onKey));
|
|
78
|
+
|
|
79
|
+
return { stack, current, items, loading, error, enter, jumpTo, confirm };
|
|
80
|
+
},
|
|
81
|
+
template: `
|
|
82
|
+
<div v-if="open" class="dtp-overlay" @click.self="$emit('close')">
|
|
83
|
+
<div class="dtp" role="dialog" aria-modal="true" aria-label="Choose working directory">
|
|
84
|
+
<header class="dtp__head">
|
|
85
|
+
<h3 class="dtp__title">Choose working directory</h3>
|
|
86
|
+
<button type="button" class="btn btn--ghost dtp__close" aria-label="Close" @click="$emit('close')">✕</button>
|
|
87
|
+
</header>
|
|
88
|
+
|
|
89
|
+
<nav class="dtp__crumbs" aria-label="Current location">
|
|
90
|
+
<button type="button" class="dtp__crumb dtp__crumb--root" :class="{ 'is-here': !current }" @click="jumpTo(-1)">HOST</button>
|
|
91
|
+
<template v-for="(n, i) in stack" :key="n.path">
|
|
92
|
+
<span class="dtp__crumbsep" aria-hidden="true">›</span>
|
|
93
|
+
<button type="button" class="dtp__crumb" :class="{ 'is-here': i === stack.length - 1 }" @click="jumpTo(i)">{{ n.name }}</button>
|
|
94
|
+
</template>
|
|
95
|
+
</nav>
|
|
96
|
+
|
|
97
|
+
<ul class="dtp__list" role="listbox">
|
|
98
|
+
<li v-if="loading" class="dtp__empty">Loading…</li>
|
|
99
|
+
<li v-else-if="error" class="dtp__empty dtp__empty--error">{{ error }}</li>
|
|
100
|
+
<template v-else>
|
|
101
|
+
<li v-for="n in items" :key="n.path">
|
|
102
|
+
<button type="button" class="dtp__row" @click="enter(n)">
|
|
103
|
+
<svg class="dtp__rowicon" viewBox="0 0 16 16" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M1.8 4.5c0-.7.6-1.3 1.3-1.3h3l1.4 1.5h5.4c.7 0 1.3.6 1.3 1.3v6c0 .7-.6 1.3-1.3 1.3H3.1c-.7 0-1.3-.6-1.3-1.3v-7.5z"/></svg>
|
|
104
|
+
<span class="dtp__rowname">{{ n.name }}</span>
|
|
105
|
+
<span class="dtp__rowchev" aria-hidden="true">›</span>
|
|
106
|
+
</button>
|
|
107
|
+
</li>
|
|
108
|
+
<li v-if="!items.length" class="dtp__empty">No subfolders</li>
|
|
109
|
+
</template>
|
|
110
|
+
</ul>
|
|
111
|
+
|
|
112
|
+
<div v-if="recent.length" class="dtp__recent">
|
|
113
|
+
<span class="dtp__recentlabel mono-label">RECENT</span>
|
|
114
|
+
<button v-for="p in recent" :key="p" type="button" class="dtp__recentchip"
|
|
115
|
+
:class="{ 'is-on': value === p }" @click="$emit('select', p)">{{ p }}</button>
|
|
116
|
+
</div>
|
|
117
|
+
|
|
118
|
+
<footer class="dtp__foot">
|
|
119
|
+
<span class="dtp__path" :class="{ 'is-empty': !current }">{{ current ? current.path : 'Navigate to a folder' }}</span>
|
|
120
|
+
<div class="dtp__actions">
|
|
121
|
+
<button type="button" class="btn btn--ghost" @click="$emit('close')">Cancel</button>
|
|
122
|
+
<button type="button" class="btn btn--primary" :disabled="!current" @click="confirm">Use this folder</button>
|
|
123
|
+
</div>
|
|
124
|
+
</footer>
|
|
125
|
+
</div>
|
|
126
|
+
</div>
|
|
127
|
+
`,
|
|
128
|
+
};
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Custom dropdown — ✅ EDITABLE. Replaces native <select> (default styles are
|
|
3
|
+
* not overridable cross-platform). Pure: modelValue in, update:modelValue out.
|
|
4
|
+
* Options: array of strings or {value,label}.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { computed, onMounted, onUnmounted, ref } from "../vendor/vue.esm-browser.js";
|
|
8
|
+
|
|
9
|
+
export default {
|
|
10
|
+
name: "Dropdown",
|
|
11
|
+
props: {
|
|
12
|
+
modelValue: { default: null },
|
|
13
|
+
options: { type: Array, default: () => [] },
|
|
14
|
+
placeholder: { type: String, default: "Select…" },
|
|
15
|
+
disabled: { type: Boolean, default: false },
|
|
16
|
+
},
|
|
17
|
+
emits: ["update:modelValue"],
|
|
18
|
+
setup(props, { emit }) {
|
|
19
|
+
const open = ref(false);
|
|
20
|
+
const rootEl = ref(null);
|
|
21
|
+
const norm = computed(() =>
|
|
22
|
+
props.options.map((o) => (o && typeof o === "object" ? o : { value: o, label: String(o) }))
|
|
23
|
+
);
|
|
24
|
+
const current = computed(() => norm.value.find((o) => o.value === props.modelValue));
|
|
25
|
+
function pick(o) {
|
|
26
|
+
emit("update:modelValue", o.value);
|
|
27
|
+
open.value = false;
|
|
28
|
+
}
|
|
29
|
+
function onDoc(e) {
|
|
30
|
+
if (rootEl.value && !rootEl.value.contains(e.target)) open.value = false;
|
|
31
|
+
}
|
|
32
|
+
function onKey(e) {
|
|
33
|
+
if (e.key === "Escape") open.value = false;
|
|
34
|
+
}
|
|
35
|
+
onMounted(() => {
|
|
36
|
+
document.addEventListener("click", onDoc, true);
|
|
37
|
+
document.addEventListener("keydown", onKey);
|
|
38
|
+
});
|
|
39
|
+
onUnmounted(() => {
|
|
40
|
+
document.removeEventListener("click", onDoc, true);
|
|
41
|
+
document.removeEventListener("keydown", onKey);
|
|
42
|
+
});
|
|
43
|
+
return { open, rootEl, norm, current, pick };
|
|
44
|
+
},
|
|
45
|
+
template: `
|
|
46
|
+
<div class="dropdown" ref="rootEl">
|
|
47
|
+
<button type="button" class="dropdown__btn" :class="{ 'is-open': open }" :disabled="disabled"
|
|
48
|
+
aria-haspopup="listbox" :aria-expanded="open" @click="open = !open">
|
|
49
|
+
<span class="dropdown__value" :class="{ 'is-placeholder': !current }">
|
|
50
|
+
{{ current ? current.label : placeholder }}
|
|
51
|
+
</span>
|
|
52
|
+
<span class="dropdown__chevron" aria-hidden="true">▾</span>
|
|
53
|
+
</button>
|
|
54
|
+
<ul v-if="open" class="dropdown__menu" role="listbox">
|
|
55
|
+
<li v-for="o in norm" :key="String(o.value)">
|
|
56
|
+
<button type="button" class="dropdown__opt" role="option"
|
|
57
|
+
:aria-selected="o.value === modelValue"
|
|
58
|
+
:class="{ 'is-selected': o.value === modelValue }"
|
|
59
|
+
@click="pick(o)">
|
|
60
|
+
<span class="dropdown__optlabel">{{ o.label }}</span>
|
|
61
|
+
<span v-if="o.value === modelValue" class="dropdown__check">✓</span>
|
|
62
|
+
</button>
|
|
63
|
+
</li>
|
|
64
|
+
</ul>
|
|
65
|
+
</div>
|
|
66
|
+
`,
|
|
67
|
+
};
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Kanban column — ✅ EDITABLE. Pure: title/status/cards/laneName in, `open` out.
|
|
3
|
+
* Dispatch design: transparent column, colored status dot + name + count pill.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import Card from "./Card.js";
|
|
7
|
+
import { computed } from "../vendor/vue.esm-browser.js";
|
|
8
|
+
|
|
9
|
+
export default {
|
|
10
|
+
name: "Lane",
|
|
11
|
+
components: { Card },
|
|
12
|
+
props: {
|
|
13
|
+
title: { type: String, required: true },
|
|
14
|
+
status: { type: String, required: true },
|
|
15
|
+
cards: { type: Array, default: () => [] },
|
|
16
|
+
laneName: { type: Function, default: () => "Ungrouped" },
|
|
17
|
+
limitedProviders: { type: Array, default: () => [] },
|
|
18
|
+
},
|
|
19
|
+
emits: ["open"],
|
|
20
|
+
setup(props, { emit }) {
|
|
21
|
+
const rateLimited = computed(() => props.cards.filter((c) => c.status === "rate_limited").length);
|
|
22
|
+
return { emit, rateLimited };
|
|
23
|
+
},
|
|
24
|
+
template: `
|
|
25
|
+
<section class="lane" :class="'lane--' + status" role="listitem">
|
|
26
|
+
<header class="lane__head">
|
|
27
|
+
<span class="lane__dot"></span>
|
|
28
|
+
<h2 class="lane__title">{{ title }}</h2>
|
|
29
|
+
<span v-if="rateLimited" class="lane__rl" :title="rateLimited + ' card(s) waiting on a provider rate limit'">
|
|
30
|
+
<svg viewBox="0 0 12 12" width="10" height="10" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" aria-hidden="true"><circle cx="6" cy="6" r="4.6"></circle><path d="M6 3.6V6l1.8 1.2"></path></svg>{{ rateLimited }}
|
|
31
|
+
</span>
|
|
32
|
+
<span class="lane__count">{{ cards.length }}</span>
|
|
33
|
+
</header>
|
|
34
|
+
<div class="lane__body">
|
|
35
|
+
<Card
|
|
36
|
+
v-for="c in cards"
|
|
37
|
+
:key="c.cardId"
|
|
38
|
+
:card="c"
|
|
39
|
+
:lane-name="laneName"
|
|
40
|
+
:limited-providers="limitedProviders"
|
|
41
|
+
@open="emit('open', $event)"
|
|
42
|
+
/>
|
|
43
|
+
<div v-if="!cards.length" class="lane__empty" aria-hidden="true"></div>
|
|
44
|
+
</div>
|
|
45
|
+
</section>
|
|
46
|
+
`,
|
|
47
|
+
};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Priority chip — ✅ EDITABLE. Pure: `priority` (int) in.
|
|
3
|
+
* Higher int = higher urgency (matches dispatch ORDER BY priority DESC).
|
|
4
|
+
* Labels are P0–P3 with **P0 = most urgent**, so the label is the INVERSE of the
|
|
5
|
+
* stored integer: int 3 → P0, int 0 → P3. Label + colour only — the integer and
|
|
6
|
+
* every sort/filter path stay untouched.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/** Indexed by the stored integer. */
|
|
10
|
+
const LABELS = ["P3", "P2", "P1", "P0"];
|
|
11
|
+
|
|
12
|
+
export default {
|
|
13
|
+
name: "PriorityChip",
|
|
14
|
+
props: { priority: { type: Number, default: 0 } },
|
|
15
|
+
setup(props) {
|
|
16
|
+
const level = () => Math.max(0, Math.min(3, props.priority));
|
|
17
|
+
return { level, LABELS };
|
|
18
|
+
},
|
|
19
|
+
template: `<span class="chip chip--prio" :class="'chip--prio-' + level()">{{ LABELS[level()] }}</span>`,
|
|
20
|
+
};
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Execution-plan summary — ✅ EDITABLE. Pure: `profile` in.
|
|
3
|
+
*
|
|
4
|
+
* Reads the real seam shape (api/contract.d.ts ExecutionProfile plus the fields
|
|
5
|
+
* state/useBuilder.js writes: model, autonomy, prDraft, prProvider). Renders the
|
|
6
|
+
* plan as labelled rows — only rows with data appear, so the panel never invents
|
|
7
|
+
* a plan the card does not have. Phases are NOT part of ExecutionProfile and are
|
|
8
|
+
* not persisted anywhere yet, so they are deliberately absent.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { computed } from "../vendor/vue.esm-browser.js";
|
|
12
|
+
|
|
13
|
+
const CI_LABELS = { github: "GitHub Actions", azure: "Azure Pipelines", none: "none" };
|
|
14
|
+
|
|
15
|
+
/** "on"/"off" flag pills for a group of booleans. */
|
|
16
|
+
function flags(profile, spec) {
|
|
17
|
+
const out = [];
|
|
18
|
+
for (const [key, label] of spec) {
|
|
19
|
+
if (profile[key] === undefined) continue;
|
|
20
|
+
out.push({ label, on: !!profile[key] });
|
|
21
|
+
}
|
|
22
|
+
return out;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export default {
|
|
26
|
+
name: "ProfileSummary",
|
|
27
|
+
props: { profile: { type: Object, default: () => ({}) } },
|
|
28
|
+
setup(props) {
|
|
29
|
+
const p = computed(() => props.profile || {});
|
|
30
|
+
|
|
31
|
+
const agent = computed(() => {
|
|
32
|
+
const out = [];
|
|
33
|
+
if (p.value.agentType) out.push(p.value.agentType);
|
|
34
|
+
if (p.value.model) out.push(p.value.model);
|
|
35
|
+
return out.join(" · ");
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
const rows = computed(() => {
|
|
39
|
+
const v = p.value;
|
|
40
|
+
const list = [];
|
|
41
|
+
if (agent.value) list.push({ key: "agent", label: "AGENT", text: agent.value, strong: true });
|
|
42
|
+
if (v.autonomy) list.push({ key: "autonomy", label: "AUTONOMY", text: v.autonomy });
|
|
43
|
+
if (v.repository) list.push({ key: "repo", label: "REPOSITORY", text: v.repository, mono: true });
|
|
44
|
+
|
|
45
|
+
const code = flags(v, [["worktree", "worktree"], ["createBranch", "branch"], ["push", "push"]]);
|
|
46
|
+
if (code.length) list.push({ key: "code", label: "CODE", flags: code });
|
|
47
|
+
|
|
48
|
+
const verify = flags(v, [["runTests", "tests"], ["build", "build"]]);
|
|
49
|
+
if (v.ciCheck && v.ciCheck !== "none") verify.push({ label: CI_LABELS[v.ciCheck] || v.ciCheck, on: true });
|
|
50
|
+
if (verify.length) list.push({ key: "verify", label: "VERIFY", flags: verify });
|
|
51
|
+
|
|
52
|
+
const review = flags(v, [["expertReview", "expert review"], ["operatorReview", "operator review"]]);
|
|
53
|
+
if (v.reviewAgentType) review.push({ label: "by " + v.reviewAgentType, on: true });
|
|
54
|
+
if (review.length) list.push({ key: "review", label: "REVIEW", flags: review });
|
|
55
|
+
|
|
56
|
+
if (v.openPr !== undefined) {
|
|
57
|
+
const pr = [{ label: v.openPr ? "open PR" : "no PR", on: !!v.openPr }];
|
|
58
|
+
if (v.openPr) {
|
|
59
|
+
if (v.prDraft !== undefined) pr.push({ label: v.prDraft ? "draft" : "ready for review", on: true });
|
|
60
|
+
if (v.prProvider) pr.push({ label: v.prProvider, on: true });
|
|
61
|
+
}
|
|
62
|
+
list.push({ key: "pr", label: "PULL REQUEST", flags: pr });
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
if (Array.isArray(v.skills) && v.skills.length) {
|
|
66
|
+
list.push({ key: "skills", label: "SKILLS", flags: v.skills.map((s) => ({ label: s, on: true })) });
|
|
67
|
+
}
|
|
68
|
+
return list;
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
return { rows };
|
|
72
|
+
},
|
|
73
|
+
template: `
|
|
74
|
+
<div class="plan">
|
|
75
|
+
<dl v-if="rows.length" class="plan__rows">
|
|
76
|
+
<div v-for="r in rows" :key="r.key" class="plan__row">
|
|
77
|
+
<dt class="plan__label">{{ r.label }}</dt>
|
|
78
|
+
<dd class="plan__value">
|
|
79
|
+
<span v-if="r.text" class="plan__text" :class="{ 'plan__text--strong': r.strong, 'plan__text--mono': r.mono }">{{ r.text }}</span>
|
|
80
|
+
<span v-if="r.flags" class="plan__flags">
|
|
81
|
+
<span v-for="(f, i) in r.flags" :key="i" class="plan__flag" :class="f.on ? 'is-on' : 'is-off'">{{ f.label }}</span>
|
|
82
|
+
</span>
|
|
83
|
+
</dd>
|
|
84
|
+
</div>
|
|
85
|
+
</dl>
|
|
86
|
+
<p v-else class="plan__empty">No execution plan on this card — the worker runs the lane default.</p>
|
|
87
|
+
</div>
|
|
88
|
+
`,
|
|
89
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loading / error banner — ✅ EDITABLE. Pure: `loading`/`error` in, `retry` out.
|
|
3
|
+
*/
|
|
4
|
+
|
|
5
|
+
export default {
|
|
6
|
+
name: "StateBanner",
|
|
7
|
+
props: {
|
|
8
|
+
loading: { type: Boolean, default: false },
|
|
9
|
+
error: { type: [String, null], default: null },
|
|
10
|
+
retryable: { type: Boolean, default: true },
|
|
11
|
+
},
|
|
12
|
+
emits: ["retry"],
|
|
13
|
+
setup(props, { emit }) {
|
|
14
|
+
return { emit };
|
|
15
|
+
},
|
|
16
|
+
template: `
|
|
17
|
+
<div v-if="error" class="notice notice--error">
|
|
18
|
+
<svg viewBox="0 0 16 16" width="15" height="15" fill="none" stroke="currentColor" stroke-width="1.4" stroke-linecap="round" aria-hidden="true" style="flex:none"><circle cx="8" cy="8" r="6.2"></circle><path d="M8 4.8V8.6M8 11.2v.1"></path></svg>
|
|
19
|
+
<span class="notice__msg">{{ error }}</span>
|
|
20
|
+
<button v-if="retryable" class="btn btn--ghost btn--sm" type="button" @click="emit('retry')">Retry</button>
|
|
21
|
+
</div>
|
|
22
|
+
<div v-else-if="loading" class="notice notice--info"><span class="spinner" aria-hidden="true"></span>Loading…</div>
|
|
23
|
+
`,
|
|
24
|
+
};
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Status chip — ✅ EDITABLE. Pure: `status` in.
|
|
3
|
+
* Dispatch design: tinted pill in the status accent color.
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
const LABELS = {
|
|
7
|
+
backlog: "Backlog",
|
|
8
|
+
in_progress: "In progress",
|
|
9
|
+
decision_needed: "Decision needed",
|
|
10
|
+
blocked: "Blocked",
|
|
11
|
+
done: "Done",
|
|
12
|
+
rate_limited: "Rate limited",
|
|
13
|
+
usage_quota_exceeded: "usage quota exceeded",
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export default {
|
|
17
|
+
name: "StatusChip",
|
|
18
|
+
props: {
|
|
19
|
+
status: { type: String, required: true },
|
|
20
|
+
kind: { type: String, default: "" },
|
|
21
|
+
},
|
|
22
|
+
setup(props) {
|
|
23
|
+
return { LABELS };
|
|
24
|
+
},
|
|
25
|
+
template: `<span class="chip chip--status" :class="'chip--status-' + status">{{ LABELS[kind] || LABELS[status] || kind || status }}</span>`,
|
|
26
|
+
};
|