agent-tempo 1.0.1
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/CLAUDE.md +213 -0
- package/LICENSE +21 -0
- package/README.md +289 -0
- package/assets/icon-32.png +0 -0
- package/assets/icon-512.png +0 -0
- package/assets/icon-64.png +0 -0
- package/assets/icon-dark-32.png +0 -0
- package/assets/icon-dark-64.png +0 -0
- package/assets/icon-dark.svg +9 -0
- package/assets/icon.svg +9 -0
- package/assets/logo-dark.svg +11 -0
- package/assets/logo-light.svg +11 -0
- package/dashboard/README.md +91 -0
- package/dashboard/dist/assets/index-CB78ToNE.css +2 -0
- package/dashboard/dist/assets/index-_5jV0Znu.js +62 -0
- package/dashboard/dist/assets/index-_5jV0Znu.js.map +1 -0
- package/dashboard/dist/index.html +21 -0
- package/dashboard/package.json +47 -0
- package/dist/activities/hard-terminate.d.ts +32 -0
- package/dist/activities/hard-terminate.js +460 -0
- package/dist/activities/maestro.d.ts +72 -0
- package/dist/activities/maestro.js +254 -0
- package/dist/activities/outbox.d.ts +188 -0
- package/dist/activities/outbox.js +849 -0
- package/dist/activities/resolve.d.ts +64 -0
- package/dist/activities/resolve.js +129 -0
- package/dist/activities/schedule-fire.d.ts +36 -0
- package/dist/activities/schedule-fire.js +147 -0
- package/dist/adapters/base.d.ts +426 -0
- package/dist/adapters/base.js +1270 -0
- package/dist/adapters/claude-api/adapter.d.ts +168 -0
- package/dist/adapters/claude-api/adapter.js +797 -0
- package/dist/adapters/claude-api/api-error.d.ts +96 -0
- package/dist/adapters/claude-api/api-error.js +191 -0
- package/dist/adapters/claude-api/index.d.ts +16 -0
- package/dist/adapters/claude-api/index.js +21 -0
- package/dist/adapters/claude-api/mcp-bridge.d.ts +50 -0
- package/dist/adapters/claude-api/mcp-bridge.js +157 -0
- package/dist/adapters/claude-code/adapter.d.ts +133 -0
- package/dist/adapters/claude-code/adapter.js +274 -0
- package/dist/adapters/claude-code/index.d.ts +15 -0
- package/dist/adapters/claude-code/index.js +20 -0
- package/dist/adapters/claude-code-headless/adapter.d.ts +131 -0
- package/dist/adapters/claude-code-headless/adapter.js +710 -0
- package/dist/adapters/claude-code-headless/error-mapper.d.ts +107 -0
- package/dist/adapters/claude-code-headless/error-mapper.js +281 -0
- package/dist/adapters/claude-code-headless/index.d.ts +17 -0
- package/dist/adapters/claude-code-headless/index.js +26 -0
- package/dist/adapters/claude-code-headless/pre-flight.d.ts +51 -0
- package/dist/adapters/claude-code-headless/pre-flight.js +207 -0
- package/dist/adapters/claude-code-headless/prompt.d.ts +93 -0
- package/dist/adapters/claude-code-headless/prompt.js +79 -0
- package/dist/adapters/claude-code-headless/stream-json.d.ts +242 -0
- package/dist/adapters/claude-code-headless/stream-json.js +208 -0
- package/dist/adapters/claude-code-headless/types.d.ts +28 -0
- package/dist/adapters/claude-code-headless/types.js +36 -0
- package/dist/adapters/copilot/adapter.d.ts +100 -0
- package/dist/adapters/copilot/adapter.js +730 -0
- package/dist/adapters/copilot/index.d.ts +15 -0
- package/dist/adapters/copilot/index.js +20 -0
- package/dist/adapters/index.d.ts +42 -0
- package/dist/adapters/index.js +115 -0
- package/dist/adapters/opencode/adapter.d.ts +82 -0
- package/dist/adapters/opencode/adapter.js +710 -0
- package/dist/adapters/opencode/config.d.ts +90 -0
- package/dist/adapters/opencode/config.js +137 -0
- package/dist/adapters/opencode/helpers.d.ts +40 -0
- package/dist/adapters/opencode/helpers.js +144 -0
- package/dist/adapters/opencode/index.d.ts +12 -0
- package/dist/adapters/opencode/index.js +17 -0
- package/dist/adapters/opencode/server-bridge.d.ts +124 -0
- package/dist/adapters/opencode/server-bridge.js +216 -0
- package/dist/adapters/sdk/base.d.ts +95 -0
- package/dist/adapters/sdk/base.js +134 -0
- package/dist/adapters/sdk/system-prompt.d.ts +64 -0
- package/dist/adapters/sdk/system-prompt.js +78 -0
- package/dist/adapters/terminal-error.d.ts +27 -0
- package/dist/adapters/terminal-error.js +39 -0
- package/dist/channel.d.ts +3 -0
- package/dist/channel.js +48 -0
- package/dist/cli/commands.d.ts +245 -0
- package/dist/cli/commands.js +2438 -0
- package/dist/cli/config-command.d.ts +8 -0
- package/dist/cli/config-command.js +254 -0
- package/dist/cli/daemon-command.d.ts +57 -0
- package/dist/cli/daemon-command.js +493 -0
- package/dist/cli/daemon.d.ts +217 -0
- package/dist/cli/daemon.js +632 -0
- package/dist/cli/dashboard-command.d.ts +20 -0
- package/dist/cli/dashboard-command.js +241 -0
- package/dist/cli/dev-banner.d.ts +107 -0
- package/dist/cli/dev-banner.js +190 -0
- package/dist/cli/dev-mode-bootstrap.d.ts +29 -0
- package/dist/cli/dev-mode-bootstrap.js +36 -0
- package/dist/cli/dev-verbs.d.ts +43 -0
- package/dist/cli/dev-verbs.js +254 -0
- package/dist/cli/help-text.d.ts +1 -0
- package/dist/cli/help-text.js +158 -0
- package/dist/cli/legacy-migration.d.ts +35 -0
- package/dist/cli/legacy-migration.js +335 -0
- package/dist/cli/mcp.d.ts +8 -0
- package/dist/cli/mcp.js +63 -0
- package/dist/cli/output.d.ts +12 -0
- package/dist/cli/output.js +37 -0
- package/dist/cli/preflight.d.ts +9 -0
- package/dist/cli/preflight.js +96 -0
- package/dist/cli/removed-verbs.d.ts +9 -0
- package/dist/cli/removed-verbs.js +78 -0
- package/dist/cli/sa-preflight.d.ts +99 -0
- package/dist/cli/sa-preflight.js +183 -0
- package/dist/cli/scenarios-command.d.ts +6 -0
- package/dist/cli/scenarios-command.js +167 -0
- package/dist/cli/startup.d.ts +112 -0
- package/dist/cli/startup.js +641 -0
- package/dist/cli/upgrade-command.d.ts +5 -0
- package/dist/cli/upgrade-command.js +240 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +680 -0
- package/dist/client/core.d.ts +33 -0
- package/dist/client/core.js +1260 -0
- package/dist/client/ensure-conductor-spawned.d.ts +35 -0
- package/dist/client/ensure-conductor-spawned.js +48 -0
- package/dist/client/index.d.ts +32 -0
- package/dist/client/index.js +22 -0
- package/dist/client/interface.d.ts +461 -0
- package/dist/client/interface.js +2 -0
- package/dist/client/subscribe.d.ts +108 -0
- package/dist/client/subscribe.js +598 -0
- package/dist/client/with-spawn.d.ts +27 -0
- package/dist/client/with-spawn.js +87 -0
- package/dist/config.d.ts +323 -0
- package/dist/config.js +593 -0
- package/dist/connection.d.ts +7 -0
- package/dist/connection.js +46 -0
- package/dist/constants.d.ts +50 -0
- package/dist/constants.js +74 -0
- package/dist/copilot-bridge.d.ts +22 -0
- package/dist/copilot-bridge.js +565 -0
- package/dist/daemon-adapter-versions.d.ts +52 -0
- package/dist/daemon-adapter-versions.js +170 -0
- package/dist/daemon.d.ts +275 -0
- package/dist/daemon.js +989 -0
- package/dist/ensemble/agent-types.d.ts +23 -0
- package/dist/ensemble/agent-types.js +132 -0
- package/dist/ensemble/loader.d.ts +14 -0
- package/dist/ensemble/loader.js +140 -0
- package/dist/ensemble/saver.d.ts +49 -0
- package/dist/ensemble/saver.js +201 -0
- package/dist/ensemble/schema.d.ts +71 -0
- package/dist/ensemble/schema.js +3 -0
- package/dist/git-info.d.ts +4 -0
- package/dist/git-info.js +29 -0
- package/dist/http/aggregate.d.ts +319 -0
- package/dist/http/aggregate.js +684 -0
- package/dist/http/auth.d.ts +67 -0
- package/dist/http/auth.js +177 -0
- package/dist/http/body.d.ts +71 -0
- package/dist/http/body.js +121 -0
- package/dist/http/catalog.d.ts +67 -0
- package/dist/http/catalog.js +209 -0
- package/dist/http/cors.d.ts +42 -0
- package/dist/http/cors.js +111 -0
- package/dist/http/dashboard-pair.d.ts +94 -0
- package/dist/http/dashboard-pair.js +148 -0
- package/dist/http/dashboard.d.ts +20 -0
- package/dist/http/dashboard.js +160 -0
- package/dist/http/event-bus.d.ts +217 -0
- package/dist/http/event-bus.js +365 -0
- package/dist/http/event-id.d.ts +77 -0
- package/dist/http/event-id.js +117 -0
- package/dist/http/event-types.d.ts +348 -0
- package/dist/http/event-types.js +36 -0
- package/dist/http/fixtures/chat-stress.d.ts +8 -0
- package/dist/http/fixtures/chat-stress.js +63 -0
- package/dist/http/fixtures/conductor-leaving.d.ts +8 -0
- package/dist/http/fixtures/conductor-leaving.js +80 -0
- package/dist/http/fixtures/constants.d.ts +10 -0
- package/dist/http/fixtures/constants.js +13 -0
- package/dist/http/fixtures/eight-player-broadcast.d.ts +10 -0
- package/dist/http/fixtures/eight-player-broadcast.js +81 -0
- package/dist/http/fixtures/empty-ensemble.d.ts +6 -0
- package/dist/http/fixtures/empty-ensemble.js +26 -0
- package/dist/http/fixtures/index.d.ts +55 -0
- package/dist/http/fixtures/index.js +110 -0
- package/dist/http/fixtures/single-conductor.d.ts +7 -0
- package/dist/http/fixtures/single-conductor.js +46 -0
- package/dist/http/fixtures/sse-reconnect.d.ts +8 -0
- package/dist/http/fixtures/sse-reconnect.js +77 -0
- package/dist/http/index.d.ts +21 -0
- package/dist/http/index.js +61 -0
- package/dist/http/port-file.d.ts +22 -0
- package/dist/http/port-file.js +132 -0
- package/dist/http/responses.d.ts +27 -0
- package/dist/http/responses.js +40 -0
- package/dist/http/ring-buffer.d.ts +41 -0
- package/dist/http/ring-buffer.js +80 -0
- package/dist/http/server.d.ts +122 -0
- package/dist/http/server.js +459 -0
- package/dist/http/snapshot.d.ts +85 -0
- package/dist/http/snapshot.js +180 -0
- package/dist/http/sse-handler.d.ts +87 -0
- package/dist/http/sse-handler.js +294 -0
- package/dist/http/writes.d.ts +55 -0
- package/dist/http/writes.js +240 -0
- package/dist/palette/index.d.ts +138 -0
- package/dist/palette/index.js +221 -0
- package/dist/reconcile/orphans.d.ts +255 -0
- package/dist/reconcile/orphans.js +340 -0
- package/dist/scripts/258-spotcheck.js +303 -0
- package/dist/scripts/check-components-css-sync.js +199 -0
- package/dist/scripts/run-shard.js +121 -0
- package/dist/scripts/verify-daemon-isolation-guard.js +128 -0
- package/dist/server-tools.d.ts +87 -0
- package/dist/server-tools.js +146 -0
- package/dist/server.d.ts +2 -0
- package/dist/server.js +366 -0
- package/dist/spawn.d.ts +296 -0
- package/dist/spawn.js +747 -0
- package/dist/tools/agent-types.d.ts +2 -0
- package/dist/tools/agent-types.js +21 -0
- package/dist/tools/attachment-info.d.ts +4 -0
- package/dist/tools/attachment-info.js +48 -0
- package/dist/tools/broadcast.d.ts +4 -0
- package/dist/tools/broadcast.js +76 -0
- package/dist/tools/cancel-stage.d.ts +3 -0
- package/dist/tools/cancel-stage.js +20 -0
- package/dist/tools/clear-state.d.ts +3 -0
- package/dist/tools/clear-state.js +37 -0
- package/dist/tools/coat-check-evict.d.ts +4 -0
- package/dist/tools/coat-check-evict.js +43 -0
- package/dist/tools/coat-check-get.d.ts +4 -0
- package/dist/tools/coat-check-get.js +56 -0
- package/dist/tools/coat-check-list.d.ts +4 -0
- package/dist/tools/coat-check-list.js +60 -0
- package/dist/tools/coat-check-put.d.ts +4 -0
- package/dist/tools/coat-check-put.js +53 -0
- package/dist/tools/cue.d.ts +44 -0
- package/dist/tools/cue.js +201 -0
- package/dist/tools/destroy.d.ts +4 -0
- package/dist/tools/destroy.js +188 -0
- package/dist/tools/detach.d.ts +4 -0
- package/dist/tools/detach.js +45 -0
- package/dist/tools/encore.d.ts +4 -0
- package/dist/tools/encore.js +31 -0
- package/dist/tools/ensemble.d.ts +32 -0
- package/dist/tools/ensemble.js +198 -0
- package/dist/tools/evaluate-gate.d.ts +3 -0
- package/dist/tools/evaluate-gate.js +32 -0
- package/dist/tools/fetch-state.d.ts +13 -0
- package/dist/tools/fetch-state.js +78 -0
- package/dist/tools/gates.d.ts +3 -0
- package/dist/tools/gates.js +41 -0
- package/dist/tools/helpers.d.ts +21 -0
- package/dist/tools/helpers.js +25 -0
- package/dist/tools/hosts.d.ts +4 -0
- package/dist/tools/hosts.js +40 -0
- package/dist/tools/listen.d.ts +3 -0
- package/dist/tools/listen.js +22 -0
- package/dist/tools/load-lineup.d.ts +5 -0
- package/dist/tools/load-lineup.js +381 -0
- package/dist/tools/migrate.d.ts +4 -0
- package/dist/tools/migrate.js +60 -0
- package/dist/tools/pause-ensemble.d.ts +4 -0
- package/dist/tools/pause-ensemble.js +58 -0
- package/dist/tools/pause.d.ts +4 -0
- package/dist/tools/pause.js +36 -0
- package/dist/tools/play.d.ts +4 -0
- package/dist/tools/play.js +57 -0
- package/dist/tools/quality-gate.d.ts +3 -0
- package/dist/tools/quality-gate.js +26 -0
- package/dist/tools/recall.d.ts +3 -0
- package/dist/tools/recall.js +32 -0
- package/dist/tools/recruit.d.ts +38 -0
- package/dist/tools/recruit.js +447 -0
- package/dist/tools/release.d.ts +4 -0
- package/dist/tools/release.js +98 -0
- package/dist/tools/report.d.ts +3 -0
- package/dist/tools/report.js +29 -0
- package/dist/tools/resolve.d.ts +1 -0
- package/dist/tools/resolve.js +7 -0
- package/dist/tools/restart.d.ts +35 -0
- package/dist/tools/restart.js +131 -0
- package/dist/tools/restore.d.ts +4 -0
- package/dist/tools/restore.js +107 -0
- package/dist/tools/resume-ensemble.d.ts +4 -0
- package/dist/tools/resume-ensemble.js +79 -0
- package/dist/tools/save-lineup.d.ts +4 -0
- package/dist/tools/save-lineup.js +36 -0
- package/dist/tools/save-state.d.ts +3 -0
- package/dist/tools/save-state.js +57 -0
- package/dist/tools/schedule.d.ts +4 -0
- package/dist/tools/schedule.js +152 -0
- package/dist/tools/schedules.d.ts +4 -0
- package/dist/tools/schedules.js +54 -0
- package/dist/tools/set-ensemble-description.d.ts +4 -0
- package/dist/tools/set-ensemble-description.js +37 -0
- package/dist/tools/set-name.d.ts +4 -0
- package/dist/tools/set-name.js +45 -0
- package/dist/tools/set-part.d.ts +3 -0
- package/dist/tools/set-part.js +20 -0
- package/dist/tools/shutdown.d.ts +4 -0
- package/dist/tools/shutdown.js +54 -0
- package/dist/tools/stage.d.ts +3 -0
- package/dist/tools/stage.js +28 -0
- package/dist/tools/stages.d.ts +3 -0
- package/dist/tools/stages.js +35 -0
- package/dist/tools/stop.d.ts +4 -0
- package/dist/tools/stop.js +29 -0
- package/dist/tools/unschedule.d.ts +4 -0
- package/dist/tools/unschedule.js +35 -0
- package/dist/tools/who-am-i.d.ts +3 -0
- package/dist/tools/who-am-i.js +34 -0
- package/dist/tools/worktree.d.ts +4 -0
- package/dist/tools/worktree.js +181 -0
- package/dist/tui/App.d.ts +85 -0
- package/dist/tui/App.js +1791 -0
- package/dist/tui/bootstrap-types.d.ts +46 -0
- package/dist/tui/bootstrap-types.js +7 -0
- package/dist/tui/client.d.ts +6 -0
- package/dist/tui/client.js +9 -0
- package/dist/tui/commands.d.ts +71 -0
- package/dist/tui/commands.js +1375 -0
- package/dist/tui/components/ActivityLog.d.ts +16 -0
- package/dist/tui/components/ActivityLog.js +36 -0
- package/dist/tui/components/ChatView.d.ts +35 -0
- package/dist/tui/components/ChatView.js +54 -0
- package/dist/tui/components/CommandOverlay.d.ts +15 -0
- package/dist/tui/components/CommandOverlay.js +34 -0
- package/dist/tui/components/CommandPalette.d.ts +21 -0
- package/dist/tui/components/CommandPalette.js +67 -0
- package/dist/tui/components/ConductorChat.d.ts +16 -0
- package/dist/tui/components/ConductorChat.js +32 -0
- package/dist/tui/components/ConversationStream.d.ts +114 -0
- package/dist/tui/components/ConversationStream.js +307 -0
- package/dist/tui/components/CreateEnsembleWizard.d.ts +19 -0
- package/dist/tui/components/CreateEnsembleWizard.js +223 -0
- package/dist/tui/components/DestroyConfirmModal.d.ts +17 -0
- package/dist/tui/components/DestroyConfirmModal.js +62 -0
- package/dist/tui/components/EnsembleListView.d.ts +14 -0
- package/dist/tui/components/EnsembleListView.js +32 -0
- package/dist/tui/components/EnsemblePanel.d.ts +12 -0
- package/dist/tui/components/EnsemblePanel.js +40 -0
- package/dist/tui/components/ErrorView.d.ts +31 -0
- package/dist/tui/components/ErrorView.js +129 -0
- package/dist/tui/components/HomeView.d.ts +54 -0
- package/dist/tui/components/HomeView.js +306 -0
- package/dist/tui/components/InputBar.d.ts +13 -0
- package/dist/tui/components/InputBar.js +58 -0
- package/dist/tui/components/LoadLineupModal.d.ts +18 -0
- package/dist/tui/components/LoadLineupModal.js +79 -0
- package/dist/tui/components/MainView.d.ts +21 -0
- package/dist/tui/components/MainView.js +107 -0
- package/dist/tui/components/NewEnsembleModal.d.ts +9 -0
- package/dist/tui/components/NewEnsembleModal.js +73 -0
- package/dist/tui/components/Picker.d.ts +23 -0
- package/dist/tui/components/Picker.js +70 -0
- package/dist/tui/components/PlayerDetailView.d.ts +26 -0
- package/dist/tui/components/PlayerDetailView.js +118 -0
- package/dist/tui/components/PromptArea.d.ts +50 -0
- package/dist/tui/components/PromptArea.js +303 -0
- package/dist/tui/components/RecruitWizard.d.ts +17 -0
- package/dist/tui/components/RecruitWizard.js +221 -0
- package/dist/tui/components/RestoreConfirmModal.d.ts +18 -0
- package/dist/tui/components/RestoreConfirmModal.js +71 -0
- package/dist/tui/components/ScheduleOverlay.d.ts +13 -0
- package/dist/tui/components/ScheduleOverlay.js +113 -0
- package/dist/tui/components/ScheduleWizard.d.ts +19 -0
- package/dist/tui/components/ScheduleWizard.js +259 -0
- package/dist/tui/components/Splash.d.ts +23 -0
- package/dist/tui/components/Splash.js +221 -0
- package/dist/tui/components/StatusBar.d.ts +48 -0
- package/dist/tui/components/StatusBar.js +128 -0
- package/dist/tui/components/StatusOverlay.d.ts +15 -0
- package/dist/tui/components/StatusOverlay.js +76 -0
- package/dist/tui/components/TitleBar.d.ts +10 -0
- package/dist/tui/components/TitleBar.js +21 -0
- package/dist/tui/components/TopBar.d.ts +12 -0
- package/dist/tui/components/TopBar.js +15 -0
- package/dist/tui/core-api.d.ts +26 -0
- package/dist/tui/core-api.js +67 -0
- package/dist/tui/hooks/useEnsembleDiscovery.d.ts +3 -0
- package/dist/tui/hooks/useEnsembleDiscovery.js +30 -0
- package/dist/tui/hooks/useMaestroPoller.d.ts +3 -0
- package/dist/tui/hooks/useMaestroPoller.js +36 -0
- package/dist/tui/hooks/useSendCommand.d.ts +7 -0
- package/dist/tui/hooks/useSendCommand.js +29 -0
- package/dist/tui/index.d.ts +15 -0
- package/dist/tui/index.js +156 -0
- package/dist/tui/ink-context.d.ts +18 -0
- package/dist/tui/ink-context.js +59 -0
- package/dist/tui/ink-loader.d.ts +26 -0
- package/dist/tui/ink-loader.js +42 -0
- package/dist/tui/removed-commands.d.ts +9 -0
- package/dist/tui/removed-commands.js +22 -0
- package/dist/tui/sse-handler.d.ts +52 -0
- package/dist/tui/sse-handler.js +157 -0
- package/dist/tui/store.d.ts +598 -0
- package/dist/tui/store.js +753 -0
- package/dist/tui/utils/format.d.ts +56 -0
- package/dist/tui/utils/format.js +155 -0
- package/dist/tui/utils/fullscreen.d.ts +23 -0
- package/dist/tui/utils/fullscreen.js +71 -0
- package/dist/tui/utils/history.d.ts +10 -0
- package/dist/tui/utils/history.js +85 -0
- package/dist/tui/utils/platform.d.ts +45 -0
- package/dist/tui/utils/platform.js +258 -0
- package/dist/tui/utils/theme.d.ts +21 -0
- package/dist/tui/utils/theme.js +24 -0
- package/dist/types.d.ts +1020 -0
- package/dist/types.js +39 -0
- package/dist/utils/attachment-format.d.ts +22 -0
- package/dist/utils/attachment-format.js +32 -0
- package/dist/utils/default-part.d.ts +43 -0
- package/dist/utils/default-part.js +104 -0
- package/dist/utils/duration.d.ts +30 -0
- package/dist/utils/duration.js +69 -0
- package/dist/utils/ensemble-ops.d.ts +61 -0
- package/dist/utils/ensemble-ops.js +77 -0
- package/dist/utils/format-hosts.d.ts +21 -0
- package/dist/utils/format-hosts.js +73 -0
- package/dist/utils/hosts.d.ts +113 -0
- package/dist/utils/hosts.js +265 -0
- package/dist/utils/parent-death-watchdog.d.ts +1 -0
- package/dist/utils/parent-death-watchdog.js +47 -0
- package/dist/utils/query-timeout.d.ts +103 -0
- package/dist/utils/query-timeout.js +113 -0
- package/dist/utils/recall-format.d.ts +78 -0
- package/dist/utils/recall-format.js +105 -0
- package/dist/utils/restore-format.d.ts +49 -0
- package/dist/utils/restore-format.js +91 -0
- package/dist/utils/safe-path.d.ts +10 -0
- package/dist/utils/safe-path.js +43 -0
- package/dist/utils/sdk-probe.d.ts +9 -0
- package/dist/utils/sdk-probe.js +45 -0
- package/dist/utils/search-attributes.d.ts +76 -0
- package/dist/utils/search-attributes.js +86 -0
- package/dist/utils/validation.d.ts +113 -0
- package/dist/utils/validation.js +163 -0
- package/dist/utils/visibility-deadline.d.ts +186 -0
- package/dist/utils/visibility-deadline.js +158 -0
- package/dist/utils/worktree.d.ts +103 -0
- package/dist/utils/worktree.js +327 -0
- package/dist/worker.d.ts +14 -0
- package/dist/worker.js +146 -0
- package/dist/workflows/attachment-math.d.ts +56 -0
- package/dist/workflows/attachment-math.js +47 -0
- package/dist/workflows/index.d.ts +3 -0
- package/dist/workflows/index.js +11 -0
- package/dist/workflows/maestro-signals.d.ts +217 -0
- package/dist/workflows/maestro-signals.js +155 -0
- package/dist/workflows/maestro.d.ts +3 -0
- package/dist/workflows/maestro.js +812 -0
- package/dist/workflows/scheduler-signals.d.ts +10 -0
- package/dist/workflows/scheduler-signals.js +14 -0
- package/dist/workflows/scheduler.d.ts +17 -0
- package/dist/workflows/scheduler.js +143 -0
- package/dist/workflows/session.d.ts +2 -0
- package/dist/workflows/session.js +1638 -0
- package/dist/workflows/signals.d.ts +297 -0
- package/dist/workflows/signals.js +239 -0
- package/examples/agents/tempo-composer.md +56 -0
- package/examples/agents/tempo-conductor.md +117 -0
- package/examples/agents/tempo-critic.md +73 -0
- package/examples/agents/tempo-improv.md +74 -0
- package/examples/agents/tempo-liner.md +75 -0
- package/examples/agents/tempo-roadie.md +61 -0
- package/examples/agents/tempo-soloist.md +71 -0
- package/examples/agents/tempo-tuner.md +94 -0
- package/examples/ensembles/tempo-big-band.yaml +146 -0
- package/examples/ensembles/tempo-dev-team.yaml +58 -0
- package/examples/ensembles/tempo-headless-jam.yaml +77 -0
- package/examples/ensembles/tempo-jam-session.yaml +41 -0
- package/examples/ensembles/tempo-mock-jam.yaml +79 -0
- package/examples/ensembles/tempo-review-squad.yaml +32 -0
- package/package.json +172 -0
- package/packaging/launchd/com.agent.tempo.plist +46 -0
- package/packaging/systemd/agent-tempo.service +32 -0
- package/packaging/windows/install-task.ps1 +71 -0
- package/scenarios/conductor-recruit-mock.yaml +33 -0
- package/scenarios/echo-roundtrip.yaml +15 -0
- package/scenarios/multi-player-handoff.yaml +38 -0
- package/scenarios/recruit-cascade.yaml +38 -0
- package/scenarios/two-player-conversation.yaml +33 -0
- package/workflow-bundle.js +14146 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerAgentTypesTool = registerAgentTypesTool;
|
|
4
|
+
const helpers_1 = require("./helpers");
|
|
5
|
+
const agent_types_1 = require("../ensemble/agent-types");
|
|
6
|
+
function registerAgentTypesTool(server) {
|
|
7
|
+
(0, helpers_1.defineTool)(server, 'agent_types', 'List available player types (agent definitions) that can be used when recruiting', {}, async () => {
|
|
8
|
+
const types = (0, agent_types_1.listAgentTypes)();
|
|
9
|
+
if (types.length === 0) {
|
|
10
|
+
return (0, helpers_1.ok)('No agent types found.');
|
|
11
|
+
}
|
|
12
|
+
const lines = types.map(t => {
|
|
13
|
+
const src = t.source === 'shipped' ? '(shipped)' : t.source === 'user' ? '(user)' : '(project)';
|
|
14
|
+
const tools = t.allowedTools && t.allowedTools.length > 0
|
|
15
|
+
? `\n Allowed tools: ${t.allowedTools.join(', ')}`
|
|
16
|
+
: '';
|
|
17
|
+
return `**${t.name}** ${src}\n ${t.description || 'No description'}${tools}`;
|
|
18
|
+
});
|
|
19
|
+
return (0, helpers_1.ok)(lines.join('\n\n'));
|
|
20
|
+
});
|
|
21
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerAttachmentInfoTool = registerAttachmentInfoTool;
|
|
4
|
+
/**
|
|
5
|
+
* `attachment_info` — diagnostic query for the V2 attachment lifecycle (design §§2.2, 2.4).
|
|
6
|
+
*
|
|
7
|
+
* Thin wrapper over the `attachmentInfoQuery` primitive (PR-A). Read-only; does not
|
|
8
|
+
* mutate state. Used by operators + the TUI to inspect a session's phase, current
|
|
9
|
+
* attachment holder, preferred host, and in-flight count.
|
|
10
|
+
*/
|
|
11
|
+
const zod_1 = require("zod");
|
|
12
|
+
const resolve_1 = require("./resolve");
|
|
13
|
+
const signals_1 = require("../workflows/signals");
|
|
14
|
+
const helpers_1 = require("./helpers");
|
|
15
|
+
const validation_1 = require("../utils/validation");
|
|
16
|
+
function registerAttachmentInfoTool(server, client, config) {
|
|
17
|
+
(0, helpers_1.defineTool)(server, 'attachment_info', 'Query the V2 attachment lifecycle state of a session — phase (booting/attached/processing/awaiting/draining/detached/gone), current attachment holder (host + adapter + lease expiry), preferred host, and in-flight message count. Read-only diagnostic.', {
|
|
18
|
+
playerId: zod_1.z.string().max(validation_1.PLAYER_NAME_MAX).describe('The player name to inspect'),
|
|
19
|
+
}, async (args) => {
|
|
20
|
+
const { playerId } = args;
|
|
21
|
+
const nameError = (0, validation_1.validatePlayerName)(playerId);
|
|
22
|
+
if (nameError)
|
|
23
|
+
return (0, helpers_1.fail)(nameError);
|
|
24
|
+
try {
|
|
25
|
+
const resolved = await (0, resolve_1.resolveSession)(client, config.ensemble, playerId);
|
|
26
|
+
if (!resolved)
|
|
27
|
+
return (0, helpers_1.fail)(`No session found with name "${playerId}".`);
|
|
28
|
+
const info = await resolved.query(signals_1.attachmentInfoQuery);
|
|
29
|
+
const lines = [
|
|
30
|
+
`**${playerId}** — phase: \`${info.phase}\``,
|
|
31
|
+
`in-flight messages: ${info.inFlightCount}`,
|
|
32
|
+
];
|
|
33
|
+
if (info.currentAttachment) {
|
|
34
|
+
const a = info.currentAttachment;
|
|
35
|
+
lines.push(`attached on: **${a.hostname}** (adapter: ${a.adapterId}/${a.adapterClass}, attachmentId: \`${a.attachmentId.slice(0, 8)}…\`)`);
|
|
36
|
+
lines.push(`lease expires: ${a.expiresAt}`);
|
|
37
|
+
}
|
|
38
|
+
if (info.preferredHost)
|
|
39
|
+
lines.push(`preferred host: ${info.preferredHost}`);
|
|
40
|
+
if (info.processingSince)
|
|
41
|
+
lines.push(`processing since: ${info.processingSince}`);
|
|
42
|
+
return (0, helpers_1.ok)(lines.join('\n'));
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
return (0, helpers_1.fail)(`Failed to query attachment info: ${(0, helpers_1.formatError)(err)}`);
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { Client, WorkflowHandle } from '@temporalio/client';
|
|
3
|
+
import { Config } from '../config';
|
|
4
|
+
export declare function registerBroadcastTool(server: McpServer, client: Client, config: Config, getPlayerId: () => string, handle: WorkflowHandle): void;
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerBroadcastTool = registerBroadcastTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const crypto_1 = require("crypto");
|
|
6
|
+
const signals_1 = require("../workflows/signals");
|
|
7
|
+
const helpers_1 = require("./helpers");
|
|
8
|
+
const validation_1 = require("../utils/validation");
|
|
9
|
+
const search_attributes_1 = require("../utils/search-attributes");
|
|
10
|
+
function registerBroadcastTool(server, client, config, getPlayerId, handle) {
|
|
11
|
+
(0, helpers_1.defineTool)(server, 'broadcast', 'Send a message to all active players in the ensemble. Optionally filter by player type.', {
|
|
12
|
+
message: zod_1.z.string().max(validation_1.MESSAGE_MAX).describe('The message to broadcast'),
|
|
13
|
+
type: zod_1.z.string().optional().describe('Only send to players of this type (e.g., "tempo-soloist")'),
|
|
14
|
+
includeStale: zod_1.z.boolean().optional().describe('Include disconnected sessions (draining/detached phases; default: false). Argument name kept for backward compatibility.'),
|
|
15
|
+
}, async (args) => {
|
|
16
|
+
const { message, type: playerType, includeStale: rawIncludeStale } = args;
|
|
17
|
+
const includeDisconnected = rawIncludeStale === true;
|
|
18
|
+
try {
|
|
19
|
+
const query = `WorkflowType = "agentSessionWorkflow" AND ExecutionStatus = "Running"`;
|
|
20
|
+
const targets = [];
|
|
21
|
+
for await (const workflow of client.workflow.list({ query })) {
|
|
22
|
+
try {
|
|
23
|
+
const wfHandle = client.workflow.getHandle(workflow.workflowId);
|
|
24
|
+
const metadata = await wfHandle.query('getMetadata');
|
|
25
|
+
// Filter by ensemble
|
|
26
|
+
if (metadata.ensemble !== config.ensemble)
|
|
27
|
+
continue;
|
|
28
|
+
// Exclude sender
|
|
29
|
+
if (metadata.playerId === getPlayerId())
|
|
30
|
+
continue;
|
|
31
|
+
// Filter by attachment phase (post-#176). Phase lives on the
|
|
32
|
+
// `AgentTempoAttachmentState` search attribute.
|
|
33
|
+
const phase = (0, search_attributes_1.getAttachmentPhase)(workflow);
|
|
34
|
+
if (!(0, validation_1.shouldIncludeInBroadcast)(phase, includeDisconnected))
|
|
35
|
+
continue;
|
|
36
|
+
// Filter by player type if specified
|
|
37
|
+
if (playerType && metadata.playerType !== playerType)
|
|
38
|
+
continue;
|
|
39
|
+
targets.push({
|
|
40
|
+
playerId: metadata.playerId,
|
|
41
|
+
playerType: metadata.playerType,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Workflow may have just completed — skip it
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (targets.length === 0) {
|
|
49
|
+
return (0, helpers_1.ok)('No active players matched the broadcast filter.');
|
|
50
|
+
}
|
|
51
|
+
// #357: stamp every fan-out cue with the same `broadcastId` so the
|
|
52
|
+
// TUI can fold the N deliveries into one chat row. Generated ONCE
|
|
53
|
+
// here in the MCP-tool process — not inside the workflow — so
|
|
54
|
+
// workflow determinism is preserved (the workflow only sees the id
|
|
55
|
+
// as an opaque string on `OutboxEntryInput`).
|
|
56
|
+
const broadcastId = (0, crypto_1.randomUUID)();
|
|
57
|
+
// Fan out cue outbox entries for each target.
|
|
58
|
+
const entryIds = [];
|
|
59
|
+
for (const target of targets) {
|
|
60
|
+
const entry = {
|
|
61
|
+
type: 'cue',
|
|
62
|
+
targetPlayerId: target.playerId,
|
|
63
|
+
message,
|
|
64
|
+
broadcastId,
|
|
65
|
+
};
|
|
66
|
+
const entryId = await handle.executeUpdate(signals_1.submitOutboxUpdate, { args: [entry] });
|
|
67
|
+
entryIds.push(entryId);
|
|
68
|
+
}
|
|
69
|
+
const names = targets.map((t) => t.playerId);
|
|
70
|
+
return (0, helpers_1.ok)(`Broadcast sent to ${targets.length} player${targets.length === 1 ? '' : 's'}: ${names.join(', ')}`);
|
|
71
|
+
}
|
|
72
|
+
catch (err) {
|
|
73
|
+
return (0, helpers_1.fail)(`Failed to broadcast: ${(0, helpers_1.formatError)(err)}`);
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerCancelStageTool = registerCancelStageTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const helpers_1 = require("./helpers");
|
|
6
|
+
const validation_1 = require("../utils/validation");
|
|
7
|
+
function registerCancelStageTool(server, handle) {
|
|
8
|
+
(0, helpers_1.defineTool)(server, 'cancel_stage', 'Cancel an active pipeline stage. Players are no longer tracked. Conductor only.', {
|
|
9
|
+
name: zod_1.z.string().max(validation_1.STAGE_NAME_MAX).describe('Name of the stage to cancel'),
|
|
10
|
+
}, async (args) => {
|
|
11
|
+
const { name } = args;
|
|
12
|
+
try {
|
|
13
|
+
await handle.signal('cancelStage', name);
|
|
14
|
+
return (0, helpers_1.ok)(`Stage **${name}** cancelled.`);
|
|
15
|
+
}
|
|
16
|
+
catch (err) {
|
|
17
|
+
return (0, helpers_1.fail)(`Failed to cancel stage: ${(0, helpers_1.formatError)(err)}`);
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerClearStateTool = registerClearStateTool;
|
|
4
|
+
/**
|
|
5
|
+
* `clear_state` — remove one of the calling player's saved-state slots
|
|
6
|
+
* (#334 PR-1, ADR 0011).
|
|
7
|
+
*
|
|
8
|
+
* Owner-only by structure: there is no `playerId` arg — the tool always
|
|
9
|
+
* clears via the calling player's own session-workflow handle.
|
|
10
|
+
*
|
|
11
|
+
* Idempotent: clearing an already-empty slot returns `cleared: false`.
|
|
12
|
+
* Surfaces a UX-friendly "was already empty" message rather than treating
|
|
13
|
+
* the no-op as an error.
|
|
14
|
+
*/
|
|
15
|
+
const zod_1 = require("zod");
|
|
16
|
+
const signals_1 = require("../workflows/signals");
|
|
17
|
+
const helpers_1 = require("./helpers");
|
|
18
|
+
const validation_1 = require("../utils/validation");
|
|
19
|
+
function registerClearStateTool(server, handle) {
|
|
20
|
+
(0, helpers_1.defineTool)(server, 'clear_state', `Clear one of your saved-state slots. Owner-only — you can only clear your own state. Idempotent (clearing an empty slot is a no-op). Returns whether the slot was non-empty before the clear.`, {
|
|
21
|
+
key: zod_1.z.string().regex(validation_1.PLAYER_STATE_KEY_REGEX).max(validation_1.PLAYER_STATE_KEY_MAX).optional().describe(`Slot name (default "${validation_1.PLAYER_STATE_DEFAULT_KEY}").`),
|
|
22
|
+
}, async (args) => {
|
|
23
|
+
const { key } = args;
|
|
24
|
+
const slotKey = key ?? validation_1.PLAYER_STATE_DEFAULT_KEY;
|
|
25
|
+
try {
|
|
26
|
+
const result = await handle.executeUpdate(signals_1.clearPlayerStateUpdate, {
|
|
27
|
+
args: [{ key: slotKey }],
|
|
28
|
+
});
|
|
29
|
+
return (0, helpers_1.ok)(result.cleared
|
|
30
|
+
? `Cleared slot **"${slotKey}"**.`
|
|
31
|
+
: `Slot **"${slotKey}"** was already empty.`);
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
return (0, helpers_1.fail)(`Failed to clear state: ${(0, helpers_1.formatError)(err)}`);
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { Client } from '@temporalio/client';
|
|
3
|
+
import { Config } from '../config';
|
|
4
|
+
export declare function registerCoatCheckEvictTool(server: McpServer, client: Client, config: Config, getPlayerId: () => string): void;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerCoatCheckEvictTool = registerCoatCheckEvictTool;
|
|
4
|
+
/**
|
|
5
|
+
* `coat_check_evict` — remove a coat-check entry (#318, ADR 0008) before
|
|
6
|
+
* its TTL expires. Owner-or-conductor only: the workflow validator rejects
|
|
7
|
+
* mismatched `evictedBy` with `CoatCheckEvictPermissionDenied`. Returns
|
|
8
|
+
* `evicted: false` when the ticket was already missing / expired before
|
|
9
|
+
* the call landed.
|
|
10
|
+
*
|
|
11
|
+
* Audit identity (`evictedBy`) is set by the tool layer from
|
|
12
|
+
* `getPlayerId()` — there is NO `evictedBy` arg on the MCP schema.
|
|
13
|
+
*/
|
|
14
|
+
const zod_1 = require("zod");
|
|
15
|
+
const config_1 = require("../config");
|
|
16
|
+
const maestro_signals_1 = require("../workflows/maestro-signals");
|
|
17
|
+
const helpers_1 = require("./helpers");
|
|
18
|
+
const validation_1 = require("../utils/validation");
|
|
19
|
+
function registerCoatCheckEvictTool(server, client, config, getPlayerId) {
|
|
20
|
+
(0, helpers_1.defineTool)(server, 'coat_check_evict', `Evict a coat-check entry (#318) before its TTL expires. Owner-or-conductor only — non-owners (and non-conductors) get a permission error.
|
|
21
|
+
|
|
22
|
+
Use to free a slot when this ensemble is at the 20-entry cap and you want to make room. \`evicted: false\` means the ticket was already gone (TTL-expired or evicted by someone else).`, {
|
|
23
|
+
ticket: zod_1.z.string().regex(validation_1.COAT_CHECK_TICKET_REGEX).max(validation_1.COAT_CHECK_TICKET_MAX).describe(`The ticket id returned by an earlier \`coat_check_put\` (≤${validation_1.COAT_CHECK_TICKET_MAX} chars).`),
|
|
24
|
+
}, async (args) => {
|
|
25
|
+
const { ticket } = args;
|
|
26
|
+
const evictedBy = getPlayerId();
|
|
27
|
+
try {
|
|
28
|
+
const handle = client.workflow.getHandle((0, config_1.maestroWorkflowId)(config.ensemble));
|
|
29
|
+
const result = await handle.executeUpdate(maestro_signals_1.coatCheckEvictUpdate, {
|
|
30
|
+
args: [{ ticket, evictedBy }],
|
|
31
|
+
});
|
|
32
|
+
if (!result.evicted) {
|
|
33
|
+
return (0, helpers_1.ok)(`Ticket **${ticket}** was already gone (no-op).`);
|
|
34
|
+
}
|
|
35
|
+
return (0, helpers_1.ok)(`Evicted ticket **${ticket}**.`);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
// Surfaces `CoatCheckEvictPermissionDenied` ApplicationFailure with
|
|
39
|
+
// owner/conductor diagnostic from the workflow validator.
|
|
40
|
+
return (0, helpers_1.fail)(`Failed to evict ticket: ${(0, helpers_1.formatError)(err)}`);
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { Client } from '@temporalio/client';
|
|
3
|
+
import { Config } from '../config';
|
|
4
|
+
export declare function registerCoatCheckGetTool(server: McpServer, client: Client, config: Config, getPlayerId: () => string): void;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerCoatCheckGetTool = registerCoatCheckGetTool;
|
|
4
|
+
/**
|
|
5
|
+
* `coat_check_get` — redeem a coat-check ticket and pull the stashed content
|
|
6
|
+
* (#318, ADR 0008). Returns the entry's summary, content body, and audit
|
|
7
|
+
* fields, or `null` when the ticket is missing / expired / evicted (no
|
|
8
|
+
* error-class proliferation for the common "ticket already gone" case).
|
|
9
|
+
*
|
|
10
|
+
* Audit identity (`fetchedBy`) is set by the tool layer from `getPlayerId()`
|
|
11
|
+
* — there is NO `fetchedBy` arg on the MCP schema. The workflow handler
|
|
12
|
+
* bumps `lastFetchedAt` / `lastFetchedBy` / `fetchCount` on the entry so
|
|
13
|
+
* the putter can later see whether anyone has redeemed.
|
|
14
|
+
*
|
|
15
|
+
* Implemented as a workflow Update (not Query) because the fetch-audit
|
|
16
|
+
* counters mutate state — Queries cannot mutate.
|
|
17
|
+
*/
|
|
18
|
+
const zod_1 = require("zod");
|
|
19
|
+
const config_1 = require("../config");
|
|
20
|
+
const maestro_signals_1 = require("../workflows/maestro-signals");
|
|
21
|
+
const helpers_1 = require("./helpers");
|
|
22
|
+
const validation_1 = require("../utils/validation");
|
|
23
|
+
function registerCoatCheckGetTool(server, client, config, getPlayerId) {
|
|
24
|
+
(0, helpers_1.defineTool)(server, 'coat_check_get', `Redeem a coat-check ticket (#318) and pull the stashed content. Returns the entry's summary, content body, and audit info — or "not found" when the ticket is missing / expired / evicted (no error, just empty).
|
|
25
|
+
|
|
26
|
+
Successful redemptions bump the entry's fetch-audit counters (\`lastFetchedAt\` / \`lastFetchedBy\` / \`fetchCount\`) so the putter can later see whether anyone has redeemed. \`coat_check_list\` won't bump these — only an actual redemption counts.`, {
|
|
27
|
+
ticket: zod_1.z.string().regex(validation_1.COAT_CHECK_TICKET_REGEX).max(validation_1.COAT_CHECK_TICKET_MAX).describe(`The ticket id returned by an earlier \`coat_check_put\` (≤${validation_1.COAT_CHECK_TICKET_MAX} chars).`),
|
|
28
|
+
}, async (args) => {
|
|
29
|
+
const { ticket } = args;
|
|
30
|
+
const fetchedBy = getPlayerId();
|
|
31
|
+
try {
|
|
32
|
+
const handle = client.workflow.getHandle((0, config_1.maestroWorkflowId)(config.ensemble));
|
|
33
|
+
const entry = await handle.executeUpdate(maestro_signals_1.coatCheckGetUpdate, {
|
|
34
|
+
args: [{ ticket, fetchedBy }],
|
|
35
|
+
});
|
|
36
|
+
if (!entry) {
|
|
37
|
+
return (0, helpers_1.ok)(`Ticket **${ticket}** is not found (missing, expired, or evicted).`);
|
|
38
|
+
}
|
|
39
|
+
const lines = [
|
|
40
|
+
`**Ticket ${ticket}** — stashed by ${entry.putBy} at ${entry.putAt}, expires ${entry.expiresAt}`,
|
|
41
|
+
`Summary: ${entry.summary}`,
|
|
42
|
+
];
|
|
43
|
+
if (entry.contentType)
|
|
44
|
+
lines.push(`Content-Type: ${entry.contentType}`);
|
|
45
|
+
lines.push(`Size: ${entry.size} bytes`);
|
|
46
|
+
lines.push(`Fetches: ${entry.fetchCount}${entry.lastFetchedBy ? ` (last by ${entry.lastFetchedBy} at ${entry.lastFetchedAt})` : ''}`);
|
|
47
|
+
lines.push('');
|
|
48
|
+
lines.push('---');
|
|
49
|
+
lines.push(entry.content);
|
|
50
|
+
return (0, helpers_1.ok)(lines.join('\n'));
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
return (0, helpers_1.fail)(`Failed to redeem ticket: ${(0, helpers_1.formatError)(err)}`);
|
|
54
|
+
}
|
|
55
|
+
});
|
|
56
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerCoatCheckListTool = registerCoatCheckListTool;
|
|
4
|
+
/**
|
|
5
|
+
* `coat_check_list` — list coat-check entry headers (#318, ADR 0008) for
|
|
6
|
+
* the calling player's ensemble. Read-only — does NOT bump fetch-audit
|
|
7
|
+
* counters (only an actual `coat_check_get` redemption counts).
|
|
8
|
+
*
|
|
9
|
+
* Returns headers (no `content` body) sorted newest-first. Optional
|
|
10
|
+
* `putBy` / `prefix` / `unfetchedOnly` filters narrow the result.
|
|
11
|
+
*/
|
|
12
|
+
const zod_1 = require("zod");
|
|
13
|
+
const config_1 = require("../config");
|
|
14
|
+
const maestro_signals_1 = require("../workflows/maestro-signals");
|
|
15
|
+
const helpers_1 = require("./helpers");
|
|
16
|
+
const validation_1 = require("../utils/validation");
|
|
17
|
+
function registerCoatCheckListTool(server, client, config) {
|
|
18
|
+
(0, helpers_1.defineTool)(server, 'coat_check_list', `List coat-check entries (#318) for this ensemble. Read-only — does NOT bump fetch-audit counters; only \`coat_check_get\` does. Sorted newest-first. Pass \`unfetchedOnly: true\` to surface entries nobody has redeemed yet — useful for an owner cleaning up stale stashes.`, {
|
|
19
|
+
putBy: zod_1.z.string().max(validation_1.PLAYER_NAME_MAX).optional().describe('Optional filter — only entries stashed by this player.'),
|
|
20
|
+
prefix: zod_1.z.string().max(validation_1.COAT_CHECK_SUMMARY_MAX).optional().describe('Optional summary-prefix filter — narrows the listing to entries whose summary starts with this string.'),
|
|
21
|
+
unfetchedOnly: zod_1.z.boolean().optional().describe('When true, only return entries with fetchCount=0 (never redeemed). Default false.'),
|
|
22
|
+
}, async (args) => {
|
|
23
|
+
const { putBy, prefix, unfetchedOnly } = args;
|
|
24
|
+
try {
|
|
25
|
+
const handle = client.workflow.getHandle((0, config_1.maestroWorkflowId)(config.ensemble));
|
|
26
|
+
const filter = {
|
|
27
|
+
...(putBy !== undefined ? { putBy } : {}),
|
|
28
|
+
...(prefix !== undefined ? { prefix } : {}),
|
|
29
|
+
...(unfetchedOnly !== undefined ? { unfetchedOnly } : {}),
|
|
30
|
+
};
|
|
31
|
+
const headers = await handle.query(maestro_signals_1.coatCheckListQuery, filter);
|
|
32
|
+
if (headers.length === 0) {
|
|
33
|
+
const filters = [];
|
|
34
|
+
if (putBy)
|
|
35
|
+
filters.push(`putBy="${putBy}"`);
|
|
36
|
+
if (prefix)
|
|
37
|
+
filters.push(`prefix="${prefix}"`);
|
|
38
|
+
if (unfetchedOnly)
|
|
39
|
+
filters.push('unfetchedOnly=true');
|
|
40
|
+
const suffix = filters.length > 0 ? ` (filter: ${filters.join(', ')})` : '';
|
|
41
|
+
return (0, helpers_1.ok)(`No coat-check entries in this ensemble${suffix}.`);
|
|
42
|
+
}
|
|
43
|
+
const lines = [];
|
|
44
|
+
lines.push(`${headers.length}/${validation_1.COAT_CHECK_SLOTS_MAX} coat-check ${headers.length === 1 ? 'entry' : 'entries'}:`);
|
|
45
|
+
lines.push('');
|
|
46
|
+
for (const h of headers) {
|
|
47
|
+
const fetchTag = h.fetchCount === 0
|
|
48
|
+
? ' (unfetched)'
|
|
49
|
+
: ` (fetched ${h.fetchCount}× by ${h.lastFetchedBy ?? '(unknown)'} at ${h.lastFetchedAt ?? '(unknown)'})`;
|
|
50
|
+
const typeTag = h.contentType ? ` [${h.contentType}]` : '';
|
|
51
|
+
lines.push(`- **${h.ticket}** ${typeTag}— ${h.summary}`);
|
|
52
|
+
lines.push(` putBy=${h.putBy} · putAt=${h.putAt} · expires=${h.expiresAt} · ${h.size} bytes${fetchTag}`);
|
|
53
|
+
}
|
|
54
|
+
return (0, helpers_1.ok)(lines.join('\n'));
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
return (0, helpers_1.fail)(`Failed to list coat-check entries: ${(0, helpers_1.formatError)(err)}`);
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { Client } from '@temporalio/client';
|
|
3
|
+
import { Config } from '../config';
|
|
4
|
+
export declare function registerCoatCheckPutTool(server: McpServer, client: Client, config: Config, getPlayerId: () => string): void;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerCoatCheckPutTool = registerCoatCheckPutTool;
|
|
4
|
+
/**
|
|
5
|
+
* `coat_check_put` — stash a large content body on per-ensemble Maestro state
|
|
6
|
+
* (#318, ADR 0008). Returns a ticket id that any player in the ensemble can
|
|
7
|
+
* later redeem via `coat_check_get` (or pass on a `cue`'s `attachmentTicket`
|
|
8
|
+
* field so the recipient knows what to fetch).
|
|
9
|
+
*
|
|
10
|
+
* Audit identity (`putBy`) is set by the tool layer from `getPlayerId()` —
|
|
11
|
+
* the MCP schema has NO `playerId` arg, so callers cannot spoof. Same
|
|
12
|
+
* structural-permission pattern as `save_state` (#334).
|
|
13
|
+
*/
|
|
14
|
+
const zod_1 = require("zod");
|
|
15
|
+
const config_1 = require("../config");
|
|
16
|
+
const maestro_signals_1 = require("../workflows/maestro-signals");
|
|
17
|
+
const helpers_1 = require("./helpers");
|
|
18
|
+
const validation_1 = require("../utils/validation");
|
|
19
|
+
function registerCoatCheckPutTool(server, client, config, getPlayerId) {
|
|
20
|
+
(0, helpers_1.defineTool)(server, 'coat_check_put', `Stash a large content body on this ensemble's coat-check (#318). Returns a ticket id any player can redeem later via \`coat_check_get\`. Pass the ticket on a \`cue\`'s \`attachmentTicket\` field so the recipient knows what to fetch.
|
|
21
|
+
|
|
22
|
+
Use this when your message body would otherwise exceed the cue's 100 KB cap — researcher reports, review-item dumps, etc. The cue body should carry a short summary; the coat-check entry holds the full artifact.
|
|
23
|
+
|
|
24
|
+
Limits: ${validation_1.COAT_CHECK_CONTENT_MAX} bytes (UTF-8) per entry, max ${validation_1.COAT_CHECK_SLOTS_MAX} live entries per ensemble. Saturation rejects with \`CoatCheckSlotsFull\` — wait for TTL or \`coat_check_evict\` an entry you own. TTL defaults to 7 days (configurable per put within [1h, 30d]).`, {
|
|
25
|
+
summary: zod_1.z.string().min(1).max(validation_1.COAT_CHECK_SUMMARY_MAX).describe(`Short preamble surfaced in \`coat_check_list\` and on dashboards (≤${validation_1.COAT_CHECK_SUMMARY_MAX} chars). 1-2 sentences describing what the recipient gets if they redeem.`),
|
|
26
|
+
content: zod_1.z.string().min(1).max(validation_1.COAT_CHECK_CONTENT_MAX).describe(`The full content body — markdown encouraged, opaque to the system. Max ${validation_1.COAT_CHECK_CONTENT_MAX} bytes (UTF-8).`),
|
|
27
|
+
contentType: zod_1.z.string().max(validation_1.COAT_CHECK_CONTENT_TYPE_MAX).optional().describe(`Optional MIME-shaped hint (e.g. "text/markdown"). Free-form; ≤${validation_1.COAT_CHECK_CONTENT_TYPE_MAX} chars.`),
|
|
28
|
+
ttlMs: zod_1.z.number().int().min(validation_1.COAT_CHECK_TTL_MIN_MS).max(validation_1.COAT_CHECK_TTL_MAX_MS).optional().describe(`Time-to-live in milliseconds. Default ${validation_1.COAT_CHECK_TTL_DEFAULT_MS} (7 days). Range [${validation_1.COAT_CHECK_TTL_MIN_MS}, ${validation_1.COAT_CHECK_TTL_MAX_MS}] (1h to 30d).`),
|
|
29
|
+
}, async (args) => {
|
|
30
|
+
const { summary, content, contentType, ttlMs } = args;
|
|
31
|
+
const putBy = getPlayerId();
|
|
32
|
+
try {
|
|
33
|
+
const handle = client.workflow.getHandle((0, config_1.maestroWorkflowId)(config.ensemble));
|
|
34
|
+
const result = await handle.executeUpdate(maestro_signals_1.coatCheckPutUpdate, {
|
|
35
|
+
args: [{
|
|
36
|
+
summary,
|
|
37
|
+
content,
|
|
38
|
+
...(contentType !== undefined ? { contentType } : {}),
|
|
39
|
+
...(ttlMs !== undefined ? { ttlMs } : {}),
|
|
40
|
+
putBy,
|
|
41
|
+
}],
|
|
42
|
+
});
|
|
43
|
+
return (0, helpers_1.ok)(`Stashed as ticket **${result.ticket}** (expires ${result.expiresAt}). Slots: ${result.slotsUsed}/${result.slotsTotal}.`);
|
|
44
|
+
}
|
|
45
|
+
catch (err) {
|
|
46
|
+
// The workflow validator surfaces structured ApplicationFailure
|
|
47
|
+
// errors (`CoatCheckSlotsFull`, `CoatCheckEntryTooLarge`, …). The
|
|
48
|
+
// `formatError` message preserves the workflow text so the LLM
|
|
49
|
+
// sees the oldest-3 ticket list and can pick which to evict.
|
|
50
|
+
return (0, helpers_1.fail)(`Failed to stash content: ${(0, helpers_1.formatError)(err)}`);
|
|
51
|
+
}
|
|
52
|
+
});
|
|
53
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { Client, WorkflowHandle } from '@temporalio/client';
|
|
3
|
+
import { Config } from '../config';
|
|
4
|
+
import type { AttachmentPhase } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* Build the operator-facing error message when the cue target is in an
|
|
7
|
+
* undeliverable phase. Lists three actionable next steps per the issue
|
|
8
|
+
* body's AC #3.
|
|
9
|
+
*
|
|
10
|
+
* Exported for unit testing.
|
|
11
|
+
*/
|
|
12
|
+
export declare function formatDetachedDeliveryError(playerId: string, phase: AttachmentPhase): string;
|
|
13
|
+
export declare function registerCueTool(server: McpServer, client: Client, config: Config, getPlayerId: () => string, handle: WorkflowHandle): void;
|
|
14
|
+
/**
|
|
15
|
+
* Format the cue tool's "unknown player" error with actionable suggestions.
|
|
16
|
+
* Exported for direct unit testing — the production path passes the active
|
|
17
|
+
* player list from `scanEnsembleSessions`.
|
|
18
|
+
*
|
|
19
|
+
* The message disambiguates the two common causes per the issue body (#560):
|
|
20
|
+
* 1. Typo / destroyed player → fuzzy-match suggestion (Levenshtein ≤ 3),
|
|
21
|
+
* active-player listing, hint about `recall` for destroyed targets.
|
|
22
|
+
* 2. Agent-tool sub-agent confusion → explicit note that Claude Code
|
|
23
|
+
* `subagent_type:` agents run in the spawner's process and are NOT
|
|
24
|
+
* addressable via `cue`; `recruit` is the cross-process surface.
|
|
25
|
+
*
|
|
26
|
+
* Returns a multi-line string. Caller wraps in {@link fail}.
|
|
27
|
+
*/
|
|
28
|
+
export declare function formatUnknownPlayerError(target: string, activePlayers: string[]): string;
|
|
29
|
+
/**
|
|
30
|
+
* Find the closest matching player names by Levenshtein distance.
|
|
31
|
+
* Returns the top-N nearest within {@link FUZZY_MATCH_MAX_DISTANCE},
|
|
32
|
+
* sorted by ascending distance then alphabetically. Empty array if no
|
|
33
|
+
* candidate is close enough.
|
|
34
|
+
*
|
|
35
|
+
* Exported for unit testing.
|
|
36
|
+
*/
|
|
37
|
+
export declare function findClosestPlayers(target: string, candidates: string[]): string[];
|
|
38
|
+
/**
|
|
39
|
+
* Plain Levenshtein edit distance — single-row DP, O(|a| · |b|) time,
|
|
40
|
+
* O(min) space. No library dependency.
|
|
41
|
+
*
|
|
42
|
+
* Exported for unit testing.
|
|
43
|
+
*/
|
|
44
|
+
export declare function levenshtein(a: string, b: string): number;
|