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,198 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.DORMANT_THRESHOLD_MS = void 0;
|
|
37
|
+
exports.classifyDormancy = classifyDormancy;
|
|
38
|
+
exports.registerEnsembleTool = registerEnsembleTool;
|
|
39
|
+
const zod_1 = require("zod");
|
|
40
|
+
const os = __importStar(require("os"));
|
|
41
|
+
const resolve_1 = require("../activities/resolve");
|
|
42
|
+
const helpers_1 = require("./helpers");
|
|
43
|
+
const duration_1 = require("../utils/duration");
|
|
44
|
+
/**
|
|
45
|
+
* Default dormancy threshold (1 hour). Per #563: a `detached` player whose
|
|
46
|
+
* last activity is older than this is considered dormant. `phase === 'gone'`
|
|
47
|
+
* is dormant regardless of timestamp.
|
|
48
|
+
*/
|
|
49
|
+
exports.DORMANT_THRESHOLD_MS = 60 * 60 * 1000;
|
|
50
|
+
/**
|
|
51
|
+
* Classify a session as `'active'` or `'dormant'` per the #563 rules.
|
|
52
|
+
*
|
|
53
|
+
* - `phase === 'gone'` → always dormant.
|
|
54
|
+
* - `phase === 'detached'` AND `lastActivityAt` older than `thresholdMs`
|
|
55
|
+
* → dormant.
|
|
56
|
+
* - `phase === 'detached'` AND `lastActivityAt` missing → dormant. (Pre-W2
|
|
57
|
+
* sessions don't carry the timestamp; operator intent is to declutter
|
|
58
|
+
* the active list, so we err toward grouping these with the cruft. The
|
|
59
|
+
* default `--dormant=show` still shows them, just in their own section.)
|
|
60
|
+
* - Otherwise → active. Includes `awaiting` (live attachment), `processing`,
|
|
61
|
+
* `attached`, `booting`, `draining`, and the undefined-phase case (older
|
|
62
|
+
* workflows that predate the attachment lifecycle).
|
|
63
|
+
*
|
|
64
|
+
* Pure function — injectable `now` keeps it deterministic under test.
|
|
65
|
+
*
|
|
66
|
+
* Exported for unit testing.
|
|
67
|
+
*/
|
|
68
|
+
function classifyDormancy(session, now, thresholdMs = exports.DORMANT_THRESHOLD_MS) {
|
|
69
|
+
if (session.phase === 'gone')
|
|
70
|
+
return 'dormant';
|
|
71
|
+
if (session.phase === 'detached') {
|
|
72
|
+
if (!session.lastActivityAt)
|
|
73
|
+
return 'dormant';
|
|
74
|
+
const lastMs = Date.parse(session.lastActivityAt);
|
|
75
|
+
if (!Number.isFinite(lastMs))
|
|
76
|
+
return 'dormant';
|
|
77
|
+
if (now - lastMs > thresholdMs)
|
|
78
|
+
return 'dormant';
|
|
79
|
+
}
|
|
80
|
+
return 'active';
|
|
81
|
+
}
|
|
82
|
+
function registerEnsembleTool(server, client, config, getPlayerId, ownWorkflowId) {
|
|
83
|
+
(0, helpers_1.defineTool)(server, 'ensemble', `Discover active Claude Code sessions in the "${config.ensemble}" ensemble. Returns player IDs, descriptions, and metadata. NOTE: returns tempo-registered players only — does NOT include Claude Code Agent-tool sub-agents (spawned via the Agent tool / subagent_type). Those are ephemeral and process-local; call TaskList separately to enumerate them. Tempo players are addressable via cue; Agent-tool sub-agents are not.`, {
|
|
84
|
+
scope: zod_1.z.string().optional().describe('Filter scope: "machine" (same hostname), "repo" (same git root), "all" (default). All scopes are within the current ensemble.'),
|
|
85
|
+
// #563: dormancy filter. Default `show` preserves the pre-#563 listing
|
|
86
|
+
// (everything visible) but groups gone/long-detached players into a
|
|
87
|
+
// separate "Dormant" section. `hide` suppresses dormant entries
|
|
88
|
+
// entirely; `show-only` is the inverse, useful for cleanup workflows.
|
|
89
|
+
dormant: zod_1.z.enum(['show', 'hide', 'show-only']).optional().describe('Dormancy filter: "show" (default — group dormant in a separate section), "hide" (suppress dormant entries), "show-only" (only show dormant). A player is dormant when phase=gone, or phase=detached with no activity in the last hour.'),
|
|
90
|
+
}, async (args) => {
|
|
91
|
+
const scope = (args.scope ?? 'all');
|
|
92
|
+
const dormantFilter = (args.dormant ?? 'show');
|
|
93
|
+
let sessions;
|
|
94
|
+
try {
|
|
95
|
+
sessions = await (0, resolve_1.scanEnsembleSessions)(client, config.ensemble);
|
|
96
|
+
}
|
|
97
|
+
catch (err) {
|
|
98
|
+
return (0, helpers_1.fail)(`Error listing workflows: ${(0, helpers_1.formatError)(err)}`);
|
|
99
|
+
}
|
|
100
|
+
// Apply scope filters
|
|
101
|
+
let ownGitRoot;
|
|
102
|
+
if (scope === 'repo') {
|
|
103
|
+
try {
|
|
104
|
+
const ownHandle = client.workflow.getHandle(ownWorkflowId);
|
|
105
|
+
const ownMeta = await ownHandle.query('getMetadata');
|
|
106
|
+
ownGitRoot = ownMeta.gitRoot;
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// Can't determine own git root — skip repo filtering
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
const scoped = sessions.filter((s) => {
|
|
113
|
+
if (scope === 'machine' && s.hostname !== os.hostname())
|
|
114
|
+
return false;
|
|
115
|
+
if (scope === 'repo' && ownGitRoot && s.gitRoot !== ownGitRoot)
|
|
116
|
+
return false;
|
|
117
|
+
return true;
|
|
118
|
+
});
|
|
119
|
+
const now = Date.now();
|
|
120
|
+
const enriched = scoped.map((s) => ({
|
|
121
|
+
...s,
|
|
122
|
+
isYou: s.playerId === getPlayerId(),
|
|
123
|
+
dormancy: classifyDormancy(s, now),
|
|
124
|
+
}));
|
|
125
|
+
const active = enriched.filter((p) => p.dormancy === 'active');
|
|
126
|
+
const dormant = enriched.filter((p) => p.dormancy === 'dormant');
|
|
127
|
+
if (active.length === 0 && dormant.length === 0) {
|
|
128
|
+
return (0, helpers_1.ok)('No active sessions found.');
|
|
129
|
+
}
|
|
130
|
+
// #563 summary line — surface both counts so operators can see what's
|
|
131
|
+
// being hidden behind the dormant filter without re-running.
|
|
132
|
+
const summary = `**${config.ensemble}**: ${active.length} active, ${dormant.length} dormant`;
|
|
133
|
+
const sections = [summary];
|
|
134
|
+
const showActive = dormantFilter !== 'show-only';
|
|
135
|
+
const showDormant = dormantFilter !== 'hide';
|
|
136
|
+
if (showActive) {
|
|
137
|
+
if (active.length > 0) {
|
|
138
|
+
sections.push(`\n=== Active (${active.length}) ===\n`);
|
|
139
|
+
sections.push(active.map((p) => renderPlayerLine(p, now, false)).join('\n\n'));
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
sections.push('\n=== Active (0) ===\n(none)');
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
if (showDormant && dormant.length > 0) {
|
|
146
|
+
sections.push(`\n=== Dormant (${dormant.length}) — last seen >1h ago or gone ===\n`);
|
|
147
|
+
sections.push(dormant.map((p) => renderPlayerLine(p, now, true)).join('\n\n'));
|
|
148
|
+
}
|
|
149
|
+
return (0, helpers_1.ok)(sections.join('\n'));
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Render one player as the multi-line block historically emitted by
|
|
154
|
+
* `ensemble`. Dormant entries append a "last seen X ago" line so operators
|
|
155
|
+
* can gauge staleness without a second tool call.
|
|
156
|
+
*
|
|
157
|
+
* Kept private — the renderer's exact text is the tool's UI surface, not a
|
|
158
|
+
* stable API; the test exercises classification + the structural split, not
|
|
159
|
+
* line-by-line formatting.
|
|
160
|
+
*/
|
|
161
|
+
function renderPlayerLine(p, now, isDormant) {
|
|
162
|
+
const tags = [
|
|
163
|
+
p.isYou ? '(you)' : '',
|
|
164
|
+
p.isConductor ? '(conductor)' : '',
|
|
165
|
+
p.agentType === 'copilot' ? '[copilot]' : '',
|
|
166
|
+
phaseTag(p.phase),
|
|
167
|
+
].filter(Boolean).join(' ');
|
|
168
|
+
const nameDisplay = p.playerType
|
|
169
|
+
? `**${p.playerId}** (${p.playerType})`
|
|
170
|
+
: `**${p.playerId}**`;
|
|
171
|
+
const lines = [
|
|
172
|
+
`${nameDisplay} ${tags}`.trim(),
|
|
173
|
+
` Part: ${p.part}`,
|
|
174
|
+
` Dir: ${p.workDir}`,
|
|
175
|
+
p.gitBranch ? ` Branch: ${p.gitBranch}` : '',
|
|
176
|
+
` Host: ${p.hostname}`,
|
|
177
|
+
];
|
|
178
|
+
if (isDormant && p.lastActivityAt) {
|
|
179
|
+
lines.push(` Last seen: ${(0, duration_1.formatTimeAgo)(p.lastActivityAt, now)}`);
|
|
180
|
+
}
|
|
181
|
+
return lines.filter(Boolean).join('\n');
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Option-B phase → tag mapping (see #176 PR):
|
|
185
|
+
* booting → (pending); attached/processing/awaiting → no tag;
|
|
186
|
+
* draining/detached → (disconnected); gone → (gone).
|
|
187
|
+
* #203: typed as AttachmentPhase (callers always have the typed phase
|
|
188
|
+
* in hand via EnsembleSessionInfo.phase); `string` lost enum discipline.
|
|
189
|
+
*/
|
|
190
|
+
function phaseTag(phase) {
|
|
191
|
+
if (phase === 'booting')
|
|
192
|
+
return '(pending)';
|
|
193
|
+
if (phase === 'draining' || phase === 'detached')
|
|
194
|
+
return '(disconnected)';
|
|
195
|
+
if (phase === 'gone')
|
|
196
|
+
return '(gone)';
|
|
197
|
+
return '';
|
|
198
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerEvaluateGateTool = registerEvaluateGateTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const helpers_1 = require("./helpers");
|
|
6
|
+
const validation_1 = require("../utils/validation");
|
|
7
|
+
function registerEvaluateGateTool(server, handle, getPlayerId) {
|
|
8
|
+
(0, helpers_1.defineTool)(server, 'evaluate_gate', 'Mark one or more criteria on a quality gate as passed or failed. Conductor only.', {
|
|
9
|
+
task: zod_1.z.string().max(validation_1.GATE_TASK_MAX).describe('The task name of the gate to evaluate'),
|
|
10
|
+
evaluations: zod_1.z.array(zod_1.z.object({
|
|
11
|
+
index: zod_1.z.number().int().min(0).describe('Zero-based index of the criterion'),
|
|
12
|
+
status: zod_1.z.enum(['passed', 'failed']).describe('Whether this criterion passed or failed'),
|
|
13
|
+
notes: zod_1.z.string().max(validation_1.GATE_NOTES_MAX).optional().describe('Optional notes explaining the evaluation'),
|
|
14
|
+
})).min(1).describe('List of criterion evaluations'),
|
|
15
|
+
}, async (args) => {
|
|
16
|
+
const { task, evaluations } = args;
|
|
17
|
+
try {
|
|
18
|
+
await handle.signal('evaluateGateCriteria', {
|
|
19
|
+
task,
|
|
20
|
+
evaluations,
|
|
21
|
+
evaluatedBy: getPlayerId(),
|
|
22
|
+
});
|
|
23
|
+
const summary = evaluations
|
|
24
|
+
.map((ev) => ` ${ev.index}: ${ev.status === 'passed' ? '\u2705' : '\u274c'} ${ev.status}${ev.notes ? ` — ${ev.notes}` : ''}`)
|
|
25
|
+
.join('\n');
|
|
26
|
+
return (0, helpers_1.ok)(`Evaluated ${evaluations.length} criteria on gate **${task}**:\n${summary}`);
|
|
27
|
+
}
|
|
28
|
+
catch (err) {
|
|
29
|
+
return (0, helpers_1.fail)(`Failed to evaluate gate: ${(0, helpers_1.formatError)(err)}`);
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { WorkflowHandle, Client } from '@temporalio/client';
|
|
3
|
+
import { Config } from '../config';
|
|
4
|
+
/**
|
|
5
|
+
* Return type is monomorphic by design: `{ content, savedAt, savedBy } | null`.
|
|
6
|
+
* ADR 0011 §Alternatives explicitly rejected a `list: boolean` flag because
|
|
7
|
+
* the overloaded return shape (slot vs `string[]`) would force union-narrowing
|
|
8
|
+
* on every downstream consumer (TUI, dashboard, future TempoClient). Slot
|
|
9
|
+
* enumeration is reachable for operators via `temporal workflow query <id>
|
|
10
|
+
* playerStateKeys`; v2 can graduate a dedicated `list_state` MCP tool if
|
|
11
|
+
* telemetry shows real demand.
|
|
12
|
+
*/
|
|
13
|
+
export declare function registerFetchStateTool(server: McpServer, client: Client, config: Config, handle: WorkflowHandle, getPlayerId: () => string): void;
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerFetchStateTool = registerFetchStateTool;
|
|
4
|
+
/**
|
|
5
|
+
* `fetch_state` — read a saved state slot for self or any peer in the
|
|
6
|
+
* ensemble (#334 PR-1, ADR 0011).
|
|
7
|
+
*
|
|
8
|
+
* Permissions are by-design open for reads — the architect's design §5.4
|
|
9
|
+
* mirrors `recall` / `attachment_info` ergonomics: any player in the
|
|
10
|
+
* ensemble can read any other player's saved state. Audit identity lives
|
|
11
|
+
* on the entry's `savedBy` field. Writes/clears remain owner-only by
|
|
12
|
+
* structure (no `playerId` arg on `save_state` / `clear_state`).
|
|
13
|
+
*
|
|
14
|
+
* Implementation note: peer reads go through `resolveSession()` (the
|
|
15
|
+
* codebase convention), NOT a raw `client.workflow.getHandle(...)`. This
|
|
16
|
+
* matches every other peer-targeting tool (`cue`, `attachment_info`,
|
|
17
|
+
* `recall`) and inherits their resilience to workflow-id format drift.
|
|
18
|
+
*
|
|
19
|
+
* Phase=gone behavior: Temporal continues to serve queries against
|
|
20
|
+
* completed workflows (returning the last-known query state from history).
|
|
21
|
+
* `fetch_state` therefore returns the slot's final value even after
|
|
22
|
+
* `destroy` — useful for post-mortem inspection. If the workflow has been
|
|
23
|
+
* fully GC'd or never existed, `resolveSession` returns null and the tool
|
|
24
|
+
* surfaces a "no session found" error.
|
|
25
|
+
*/
|
|
26
|
+
const zod_1 = require("zod");
|
|
27
|
+
const resolve_1 = require("./resolve");
|
|
28
|
+
const signals_1 = require("../workflows/signals");
|
|
29
|
+
const helpers_1 = require("./helpers");
|
|
30
|
+
const validation_1 = require("../utils/validation");
|
|
31
|
+
/**
|
|
32
|
+
* Return type is monomorphic by design: `{ content, savedAt, savedBy } | null`.
|
|
33
|
+
* ADR 0011 §Alternatives explicitly rejected a `list: boolean` flag because
|
|
34
|
+
* the overloaded return shape (slot vs `string[]`) would force union-narrowing
|
|
35
|
+
* on every downstream consumer (TUI, dashboard, future TempoClient). Slot
|
|
36
|
+
* enumeration is reachable for operators via `temporal workflow query <id>
|
|
37
|
+
* playerStateKeys`; v2 can graduate a dedicated `list_state` MCP tool if
|
|
38
|
+
* telemetry shows real demand.
|
|
39
|
+
*/
|
|
40
|
+
function registerFetchStateTool(server, client, config, handle, getPlayerId) {
|
|
41
|
+
(0, helpers_1.defineTool)(server, 'fetch_state', `Read a saved-state slot for yourself or a peer. Defaults to your own "${validation_1.PLAYER_STATE_DEFAULT_KEY}" slot.
|
|
42
|
+
|
|
43
|
+
Pass \`playerId\` to read a peer's slot (any player in the ensemble can read any other player's state — audit identity is recorded on each slot via \`savedBy\`). Returns a "(no state saved …)" message when the slot is empty.`, {
|
|
44
|
+
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}").`),
|
|
45
|
+
playerId: zod_1.z.string().max(validation_1.PLAYER_NAME_MAX).optional().describe('Target player name (default: self).'),
|
|
46
|
+
}, async (args) => {
|
|
47
|
+
const { key, playerId } = args;
|
|
48
|
+
const targetId = playerId ?? getPlayerId();
|
|
49
|
+
// Validate any explicit playerId — `getPlayerId()` is trusted (set by
|
|
50
|
+
// the MCP server) and skips this check.
|
|
51
|
+
if (playerId !== undefined) {
|
|
52
|
+
const nameError = (0, validation_1.validatePlayerName)(playerId);
|
|
53
|
+
if (nameError)
|
|
54
|
+
return (0, helpers_1.fail)(nameError);
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
// Self-targeted reads use the cached own-session handle directly;
|
|
58
|
+
// peer reads go through `resolveSession` (the codebase convention,
|
|
59
|
+
// not a raw `client.workflow.getHandle`) so workflow-id format
|
|
60
|
+
// changes only need to be tracked in one place.
|
|
61
|
+
const targetHandle = targetId === getPlayerId()
|
|
62
|
+
? handle
|
|
63
|
+
: await (0, resolve_1.resolveSession)(client, config.ensemble, targetId);
|
|
64
|
+
if (!targetHandle) {
|
|
65
|
+
return (0, helpers_1.fail)(`No session found with name "${targetId}".`);
|
|
66
|
+
}
|
|
67
|
+
const slotKey = key ?? validation_1.PLAYER_STATE_DEFAULT_KEY;
|
|
68
|
+
const result = await targetHandle.query(signals_1.playerStateQuery, { key: slotKey });
|
|
69
|
+
if (!result) {
|
|
70
|
+
return (0, helpers_1.ok)(`(no state saved at slot "${slotKey}" for ${targetId})`);
|
|
71
|
+
}
|
|
72
|
+
return (0, helpers_1.ok)(`Slot **"${slotKey}"** — saved by **${result.savedBy}** at ${result.savedAt}\n\n${result.content}`);
|
|
73
|
+
}
|
|
74
|
+
catch (err) {
|
|
75
|
+
return (0, helpers_1.fail)(`Failed to fetch state: ${(0, helpers_1.formatError)(err)}`);
|
|
76
|
+
}
|
|
77
|
+
});
|
|
78
|
+
}
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerGatesTool = registerGatesTool;
|
|
4
|
+
const zod_1 = require("zod");
|
|
5
|
+
const helpers_1 = require("./helpers");
|
|
6
|
+
const validation_1 = require("../utils/validation");
|
|
7
|
+
function registerGatesTool(server, handle) {
|
|
8
|
+
(0, helpers_1.defineTool)(server, 'gates', 'List quality gates and their status. Optionally filter by task name or status. Conductor only.', {
|
|
9
|
+
task: zod_1.z.string().max(validation_1.GATE_TASK_MAX).optional().describe('Filter by specific task name'),
|
|
10
|
+
status: zod_1.z.enum(['open', 'passed', 'failed']).optional().describe('Filter by gate status'),
|
|
11
|
+
}, async (args) => {
|
|
12
|
+
const { task, status } = args;
|
|
13
|
+
try {
|
|
14
|
+
const gates = await handle.query('qualityGates');
|
|
15
|
+
let filtered = gates;
|
|
16
|
+
if (task) {
|
|
17
|
+
filtered = filtered.filter((g) => g.task === task);
|
|
18
|
+
}
|
|
19
|
+
if (status) {
|
|
20
|
+
filtered = filtered.filter((g) => g.status === status);
|
|
21
|
+
}
|
|
22
|
+
if (filtered.length === 0) {
|
|
23
|
+
return (0, helpers_1.ok)('No quality gates found matching the filter.');
|
|
24
|
+
}
|
|
25
|
+
const lines = filtered.map((g) => {
|
|
26
|
+
const icon = g.status === 'passed' ? '\u2705' : g.status === 'failed' ? '\u274c' : '\u23f3';
|
|
27
|
+
const criteriaLines = g.criteria.map((c, i) => {
|
|
28
|
+
const cIcon = c.status === 'passed' ? '\u2705' : c.status === 'failed' ? '\u274c' : '\u2b1c';
|
|
29
|
+
const evaluator = c.evaluatedBy ? ` (by ${c.evaluatedBy})` : '';
|
|
30
|
+
const notes = c.notes ? ` — ${c.notes}` : '';
|
|
31
|
+
return ` ${i}. ${cIcon} ${c.text}${evaluator}${notes}`;
|
|
32
|
+
});
|
|
33
|
+
return `${icon} **${g.task}** [${g.status}] (by ${g.createdBy}, ${g.createdAt})\n${criteriaLines.join('\n')}`;
|
|
34
|
+
});
|
|
35
|
+
return (0, helpers_1.ok)(`${filtered.length} quality gate${filtered.length === 1 ? '' : 's'}:\n\n${lines.join('\n\n')}`);
|
|
36
|
+
}
|
|
37
|
+
catch (err) {
|
|
38
|
+
return (0, helpers_1.fail)(`Failed to query gates: ${(0, helpers_1.formatError)(err)}`);
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
3
|
+
/** Standard MCP tool result type. */
|
|
4
|
+
export type ToolResult = {
|
|
5
|
+
content: Array<{
|
|
6
|
+
type: 'text';
|
|
7
|
+
text: string;
|
|
8
|
+
}>;
|
|
9
|
+
isError?: boolean;
|
|
10
|
+
};
|
|
11
|
+
/** Return a successful tool result. */
|
|
12
|
+
export declare function ok(text: string): ToolResult;
|
|
13
|
+
/** Return an error tool result. */
|
|
14
|
+
export declare function fail(text: string): ToolResult;
|
|
15
|
+
/** Extract a human-readable message from an unknown error. */
|
|
16
|
+
export declare function formatError(err: unknown): string;
|
|
17
|
+
/**
|
|
18
|
+
* Wrapper around McpServer.tool() that avoids TS2589 deep type instantiation
|
|
19
|
+
* errors caused by Zod 3.25 + MCP SDK type inference interaction.
|
|
20
|
+
*/
|
|
21
|
+
export declare function defineTool(server: McpServer, name: string, description: string, paramsSchema: Record<string, z.ZodTypeAny>, handler: (args: Record<string, any>, extra: any) => Promise<ToolResult>): void;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ok = ok;
|
|
4
|
+
exports.fail = fail;
|
|
5
|
+
exports.formatError = formatError;
|
|
6
|
+
exports.defineTool = defineTool;
|
|
7
|
+
/** Return a successful tool result. */
|
|
8
|
+
function ok(text) {
|
|
9
|
+
return { content: [{ type: 'text', text }] };
|
|
10
|
+
}
|
|
11
|
+
/** Return an error tool result. */
|
|
12
|
+
function fail(text) {
|
|
13
|
+
return { content: [{ type: 'text', text }], isError: true };
|
|
14
|
+
}
|
|
15
|
+
/** Extract a human-readable message from an unknown error. */
|
|
16
|
+
function formatError(err) {
|
|
17
|
+
return err instanceof Error ? err.message : String(err);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Wrapper around McpServer.tool() that avoids TS2589 deep type instantiation
|
|
21
|
+
* errors caused by Zod 3.25 + MCP SDK type inference interaction.
|
|
22
|
+
*/
|
|
23
|
+
function defineTool(server, name, description, paramsSchema, handler) {
|
|
24
|
+
server.tool(name, description, paramsSchema, handler);
|
|
25
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerHostsTool = registerHostsTool;
|
|
4
|
+
/**
|
|
5
|
+
* `hosts` — MCP tool for surfacing daemons polling the Temporal namespace (#274).
|
|
6
|
+
*
|
|
7
|
+
* Joins two sources of truth and returns a formatted text payload:
|
|
8
|
+
* - Temporal's own poller registry (`describeTaskQueue`), filtered to
|
|
9
|
+
* identities parseable as `agent-tempo:<host>:<pid>:<version>` or
|
|
10
|
+
* the legacy `<pid>@<hostname>` SDK default.
|
|
11
|
+
* - The `hostProfiles` projection maintained by the global maestro
|
|
12
|
+
* from daemon boot signals.
|
|
13
|
+
*
|
|
14
|
+
* Consumes the shared formatter from `src/utils/format-hosts.ts`, so
|
|
15
|
+
* CLI `agent-tempo hosts` and TUI `/hosts` produce the same text.
|
|
16
|
+
* Thin wrapper — all the logic is in `listHosts`.
|
|
17
|
+
*/
|
|
18
|
+
const zod_1 = require("zod");
|
|
19
|
+
const helpers_1 = require("./helpers");
|
|
20
|
+
const hosts_1 = require("../utils/hosts");
|
|
21
|
+
const format_hosts_1 = require("../utils/format-hosts");
|
|
22
|
+
function registerHostsTool(server, client, config) {
|
|
23
|
+
(0, helpers_1.defineTool)(server, 'hosts', 'Show all daemons polling this Temporal namespace, with their advertised capabilities. Returns liveness (live/stale), recruit-readiness, and each daemon\'s profile (default agent, available player types, platform) when it signaled one at boot. Read-only diagnostic.', {
|
|
24
|
+
includeStale: zod_1.z.boolean().optional().describe('Include hosts not seen in the last minute (default: false).'),
|
|
25
|
+
force: zod_1.z.boolean().optional().describe('Bypass the 3-second result cache (default: false).'),
|
|
26
|
+
}, async (args) => {
|
|
27
|
+
const { includeStale, force } = args;
|
|
28
|
+
try {
|
|
29
|
+
const hosts = await (0, hosts_1.listHosts)(client, {
|
|
30
|
+
force: Boolean(force),
|
|
31
|
+
namespace: config.temporalNamespace,
|
|
32
|
+
taskQueue: config.taskQueue,
|
|
33
|
+
});
|
|
34
|
+
return (0, helpers_1.ok)((0, format_hosts_1.formatHostList)(hosts, { includeStale: Boolean(includeStale) }));
|
|
35
|
+
}
|
|
36
|
+
catch (err) {
|
|
37
|
+
return (0, helpers_1.fail)(`Failed to list hosts: ${(0, helpers_1.formatError)(err)}`);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerListenTool = registerListenTool;
|
|
4
|
+
const helpers_1 = require("./helpers");
|
|
5
|
+
function registerListenTool(server, handle) {
|
|
6
|
+
(0, helpers_1.defineTool)(server, 'listen', 'Check for pending messages from other sessions. Use this if you want to manually check for new messages.', {}, async () => {
|
|
7
|
+
try {
|
|
8
|
+
const messages = await handle.query('pendingMessages');
|
|
9
|
+
if (messages.length === 0) {
|
|
10
|
+
return (0, helpers_1.ok)('No pending messages.');
|
|
11
|
+
}
|
|
12
|
+
// Mark messages as delivered
|
|
13
|
+
const ids = messages.map((m) => m.id);
|
|
14
|
+
await handle.signal('markDelivered', ids);
|
|
15
|
+
const lines = messages.map((m) => `**${m.from}** (${m.timestamp}):\n${m.text}`);
|
|
16
|
+
return (0, helpers_1.ok)(lines.join('\n\n'));
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
return (0, helpers_1.fail)(`Failed to check messages: ${(0, helpers_1.formatError)(err)}`);
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
2
|
+
import { Client, WorkflowHandle } from '@temporalio/client';
|
|
3
|
+
import { Config } from '../config';
|
|
4
|
+
import { AgentType } from '../types';
|
|
5
|
+
export declare function registerLoadLineupTool(server: McpServer, client: Client, config: Config, getPlayerId: () => string, ownAgentType?: AgentType, handle?: WorkflowHandle, setPlayerId?: (id: string) => void, isConductor?: boolean): void;
|