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,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared helper for restore-after-shutdown: make sure a conductor terminal
|
|
3
|
+
* is attached to an ensemble before `/restore` completes. Called by the
|
|
4
|
+
* TUI `/restore` slash command (`App.tsx`, `commands.ts`).
|
|
5
|
+
*
|
|
6
|
+
* NOTE: This file lives in `src/client/` because the CLI `restore` command
|
|
7
|
+
* was expected to adopt it. If no CLI consumer adopts within 2 PRs after
|
|
8
|
+
* #308 merges, move to `src/tui/utils/` — current consumers are TUI-only.
|
|
9
|
+
*
|
|
10
|
+
* Returns a structured outcome so callers can render a summary without
|
|
11
|
+
* parsing strings. Never throws — callers should treat a missing conductor
|
|
12
|
+
* as a soft failure.
|
|
13
|
+
*/
|
|
14
|
+
import type { TempoClientWithSpawn } from './interface';
|
|
15
|
+
export type EnsureConductorSpawnedOutcome = {
|
|
16
|
+
spawned: false;
|
|
17
|
+
reason: 'alreadyLive';
|
|
18
|
+
} | {
|
|
19
|
+
spawned: true;
|
|
20
|
+
} | {
|
|
21
|
+
spawned: false;
|
|
22
|
+
reason: 'spawnFailed';
|
|
23
|
+
error: string;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* If the ensemble already has a conductor session in a live phase, no-op.
|
|
27
|
+
* Otherwise shell out via {@link TempoClientWithSpawn.spawnConductor} to
|
|
28
|
+
* open a conductor terminal. The `agent-tempo up` path is idempotent at
|
|
29
|
+
* the workflow layer, so a benign race (two restores in flight) converges
|
|
30
|
+
* on one workflow.
|
|
31
|
+
*
|
|
32
|
+
* Typed against `TempoClientWithSpawn` (not `TempoClient` alias) so the
|
|
33
|
+
* spawn dependency is explicit at the call site (#308 follow-up).
|
|
34
|
+
*/
|
|
35
|
+
export declare function ensureConductorSpawned(ensemble: string, client: TempoClientWithSpawn): Promise<EnsureConductorSpawnedOutcome>;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ensureConductorSpawned = ensureConductorSpawned;
|
|
4
|
+
/**
|
|
5
|
+
* If the ensemble already has a conductor session in a live phase, no-op.
|
|
6
|
+
* Otherwise shell out via {@link TempoClientWithSpawn.spawnConductor} to
|
|
7
|
+
* open a conductor terminal. The `agent-tempo up` path is idempotent at
|
|
8
|
+
* the workflow layer, so a benign race (two restores in flight) converges
|
|
9
|
+
* on one workflow.
|
|
10
|
+
*
|
|
11
|
+
* Typed against `TempoClientWithSpawn` (not `TempoClient` alias) so the
|
|
12
|
+
* spawn dependency is explicit at the call site (#308 follow-up).
|
|
13
|
+
*/
|
|
14
|
+
async function ensureConductorSpawned(ensemble, client) {
|
|
15
|
+
try {
|
|
16
|
+
const info = await client.attachmentInfo(ensemble, 'conductor');
|
|
17
|
+
const phase = info.phase;
|
|
18
|
+
const alreadyLive = phase === 'attached' || phase === 'processing'
|
|
19
|
+
|| phase === 'awaiting' || phase === 'booting';
|
|
20
|
+
if (alreadyLive)
|
|
21
|
+
return { spawned: false, reason: 'alreadyLive' };
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
// No conductor session / query failed — fall through to spawn.
|
|
25
|
+
}
|
|
26
|
+
try {
|
|
27
|
+
await client.spawnConductor({ ensemble });
|
|
28
|
+
return { spawned: true };
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
32
|
+
// #306: `/restore` runs two parallel paths that can both spawn the
|
|
33
|
+
// conductor — `restoreOrphansOnce` reattaches the orphan adapter via
|
|
34
|
+
// `deliverRestart`, and this helper falls through to a fresh spawn when
|
|
35
|
+
// the attachment-info query returns a non-live phase. If the orphan
|
|
36
|
+
// reattach wins the race, our spawn (`agent-tempo up <ensemble>`)
|
|
37
|
+
// throws "A conductor is already running for ensemble" — which is the
|
|
38
|
+
// success condition for THIS helper. Swallow the race and report alive.
|
|
39
|
+
if (/conductor is already running/i.test(message)) {
|
|
40
|
+
return { spawned: false, reason: 'alreadyLive' };
|
|
41
|
+
}
|
|
42
|
+
return {
|
|
43
|
+
spawned: false,
|
|
44
|
+
reason: 'spawnFailed',
|
|
45
|
+
error: message,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Public entry point for the `TempoClient` family.
|
|
3
|
+
*
|
|
4
|
+
* Two factories ship side by side after the #308 follow-up split (see ADR
|
|
5
|
+
* 0007 and `docs/design/tempoclient-core-spawn-split.md`):
|
|
6
|
+
*
|
|
7
|
+
* - {@link createTempoClientCore} — pure Temporal RPC, headless-safe
|
|
8
|
+
* (daemon, MCP server, SSE event source, future SDK consumers).
|
|
9
|
+
* - {@link createTempoClientWithSpawn} — the TTY-bound superset adding
|
|
10
|
+
* `createEnsemble` and `spawnConductor`. Use from the TUI/CLI only.
|
|
11
|
+
*
|
|
12
|
+
* `createTempoClient` is preserved as a permanent alias for
|
|
13
|
+
* `createTempoClientWithSpawn` so every existing call site keeps the same
|
|
14
|
+
* return shape — no codemod required at adoption.
|
|
15
|
+
*/
|
|
16
|
+
import type { Client } from '@temporalio/client';
|
|
17
|
+
import { type CreateTempoClientOpts } from './with-spawn';
|
|
18
|
+
import type { TempoClientWithSpawn } from './interface';
|
|
19
|
+
export { createTempoClientCore } from './core';
|
|
20
|
+
export { createTempoClientWithSpawn, type CreateTempoClientOpts } from './with-spawn';
|
|
21
|
+
export type { TempoClient, TempoClientCore, TempoClientWithSpawn, EnsembleSummary, EnsembleShutdownSummary, EnsembleShutdownDetail, EnsembleDestroySummary, EnsembleDestroyDetail, RecruitClientOpts, RecruitClientResult, ReleaseClientResult, } from './interface';
|
|
22
|
+
export type { SubscribeOptions, SubscribeTopic, TempoEvent } from '../http/event-types';
|
|
23
|
+
export { SubscribeHttpError, type SubscribeDeps } from './subscribe';
|
|
24
|
+
/**
|
|
25
|
+
* Backwards-compatible alias for {@link createTempoClientWithSpawn}. The
|
|
26
|
+
* `TempoClient` type alias resolves to `TempoClientWithSpawn`, so every
|
|
27
|
+
* existing `createTempoClient(client)` call site keeps its current shape.
|
|
28
|
+
*
|
|
29
|
+
* **New headless consumers should call {@link createTempoClientCore}
|
|
30
|
+
* directly** — the type system then forbids accidental TTY dependencies.
|
|
31
|
+
*/
|
|
32
|
+
export declare function createTempoClient(client: Client, opts?: CreateTempoClientOpts): TempoClientWithSpawn;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SubscribeHttpError = exports.createTempoClientWithSpawn = exports.createTempoClientCore = void 0;
|
|
4
|
+
exports.createTempoClient = createTempoClient;
|
|
5
|
+
const with_spawn_1 = require("./with-spawn");
|
|
6
|
+
var core_1 = require("./core");
|
|
7
|
+
Object.defineProperty(exports, "createTempoClientCore", { enumerable: true, get: function () { return core_1.createTempoClientCore; } });
|
|
8
|
+
var with_spawn_2 = require("./with-spawn");
|
|
9
|
+
Object.defineProperty(exports, "createTempoClientWithSpawn", { enumerable: true, get: function () { return with_spawn_2.createTempoClientWithSpawn; } });
|
|
10
|
+
var subscribe_1 = require("./subscribe");
|
|
11
|
+
Object.defineProperty(exports, "SubscribeHttpError", { enumerable: true, get: function () { return subscribe_1.SubscribeHttpError; } });
|
|
12
|
+
/**
|
|
13
|
+
* Backwards-compatible alias for {@link createTempoClientWithSpawn}. The
|
|
14
|
+
* `TempoClient` type alias resolves to `TempoClientWithSpawn`, so every
|
|
15
|
+
* existing `createTempoClient(client)` call site keeps its current shape.
|
|
16
|
+
*
|
|
17
|
+
* **New headless consumers should call {@link createTempoClientCore}
|
|
18
|
+
* directly** — the type system then forbids accidental TTY dependencies.
|
|
19
|
+
*/
|
|
20
|
+
function createTempoClient(client, opts = {}) {
|
|
21
|
+
return (0, with_spawn_1.createTempoClientWithSpawn)(client, opts);
|
|
22
|
+
}
|
|
@@ -0,0 +1,461 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* TempoClient — public interface and related types.
|
|
3
|
+
*
|
|
4
|
+
* Extracted from `src/tui/client.ts` so that non-TUI consumers (CLI, tests,
|
|
5
|
+
* external integrations) can depend on the interface without pulling in Ink/React.
|
|
6
|
+
*/
|
|
7
|
+
import type { AgentType, MaestroPlayerInfo, MaestroRelayMessage, HistoryEntry, Message, SentMessage, SessionMetadata, ScheduleEntry, QualityGate, StageEntry, WorktreeEntry, EnsembleChatResult, AttachmentInfo, HostInfo } from '../types';
|
|
8
|
+
import type { RestoreOrphansSummary } from '../reconcile/orphans';
|
|
9
|
+
import type { SubscribeOptions, TempoEvent } from '../http/event-types';
|
|
10
|
+
/**
|
|
11
|
+
* Raw (unfiltered, unsorted, unsliced) output of `TempoClient.recall`.
|
|
12
|
+
* The shared formatter at `src/utils/recall-format.ts` turns this into a
|
|
13
|
+
* timeline + pagination header; returning the raw shape keeps every
|
|
14
|
+
* surface's presentation logic testable without booting a client.
|
|
15
|
+
*/
|
|
16
|
+
export interface RecallClientResult {
|
|
17
|
+
received: Message[];
|
|
18
|
+
sent: SentMessage[];
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Options for {@link TempoClient.recruit} — direct submit of a `recruit`
|
|
22
|
+
* outbox entry from the caller's maestro session. Mirrors the `recruit`
|
|
23
|
+
* MCP tool's parameters, minus the conductor-only bits handled by the
|
|
24
|
+
* `load_lineup` flow. The TUI uses this to bypass the conductor LLM hop
|
|
25
|
+
* for UI-initiated recruiting (the prior path routed through the
|
|
26
|
+
* maestro hub → conductor → MCP tool, which required a live conductor).
|
|
27
|
+
*/
|
|
28
|
+
export interface RecruitClientOpts {
|
|
29
|
+
name: string;
|
|
30
|
+
workDir: string;
|
|
31
|
+
agent?: AgentType;
|
|
32
|
+
/** Agent type name from the subagent registry (e.g. "tempo-soloist"). */
|
|
33
|
+
playerType?: string;
|
|
34
|
+
isConductor?: boolean;
|
|
35
|
+
initialMessage?: string;
|
|
36
|
+
systemPrompt?: string;
|
|
37
|
+
host?: string;
|
|
38
|
+
/** When true, spawn process but lock outbox until `release`. */
|
|
39
|
+
held?: boolean;
|
|
40
|
+
}
|
|
41
|
+
export interface RecruitClientResult {
|
|
42
|
+
playerId: string;
|
|
43
|
+
/** Outbox entry id submitted on the maestro session's workflow. */
|
|
44
|
+
entryId: string;
|
|
45
|
+
}
|
|
46
|
+
export interface ReleaseClientResult {
|
|
47
|
+
/** Names of players released, in scan order. */
|
|
48
|
+
released: string[];
|
|
49
|
+
/** Soft-failure diagnostics per player, if any. */
|
|
50
|
+
errors: Array<{
|
|
51
|
+
playerId: string;
|
|
52
|
+
error: string;
|
|
53
|
+
}>;
|
|
54
|
+
}
|
|
55
|
+
export interface RestartClientOpts {
|
|
56
|
+
/** Target host (defaults to session's preferredHost or last-known hostname). */
|
|
57
|
+
host?: string;
|
|
58
|
+
/** Skip context replay. */
|
|
59
|
+
fresh?: boolean;
|
|
60
|
+
/** Steal a live attachment via forceDetach. */
|
|
61
|
+
force?: boolean;
|
|
62
|
+
/** Number of recent messages to include in context replay. */
|
|
63
|
+
contextMessages?: number;
|
|
64
|
+
/** Identifier of the invoker for audit messages (default: 'cli'). */
|
|
65
|
+
invokerPlayerId?: string;
|
|
66
|
+
/**
|
|
67
|
+
* #334 PR-2 — seed the restarted session from a saved-state slot. `true`
|
|
68
|
+
* resolves to the default key (`'main'`); a string names a specific slot.
|
|
69
|
+
* Suppresses transcript replay by default; pass `transcript: 'replay'` to
|
|
70
|
+
* stack. Falls back to transcript replay if the slot is empty.
|
|
71
|
+
*/
|
|
72
|
+
loadFromState?: boolean | string;
|
|
73
|
+
/**
|
|
74
|
+
* #334 PR-2 — controls transcript-replay interaction when `loadFromState`
|
|
75
|
+
* is set: `'suppress'` (default) or `'replay'` (stack saved state + transcript).
|
|
76
|
+
* Ignored when `loadFromState` is absent.
|
|
77
|
+
*/
|
|
78
|
+
transcript?: 'suppress' | 'replay';
|
|
79
|
+
/**
|
|
80
|
+
* #580 / design §16.5 Option B — deliberate-action gate for cross-host
|
|
81
|
+
* force-restart. When `force: true` AND the target's current attachment
|
|
82
|
+
* is on a host other than the caller's, the value must match the
|
|
83
|
+
* current holder's hostname exactly. The shared MCP-tool guard
|
|
84
|
+
* (`enforceYesStealGuard` in `src/tools/restart.ts`) enforces the same
|
|
85
|
+
* property when callers go through the `restart` / `migrate` MCP tools;
|
|
86
|
+
* the TUI's `/migrate` handler enforces it locally and forwards the
|
|
87
|
+
* confirmed value here so the recorded intent rides the call. Workflow
|
|
88
|
+
* trusts the caller — the check happens pre-submit, not in the outbox.
|
|
89
|
+
*/
|
|
90
|
+
confirmStealFromHost?: string;
|
|
91
|
+
}
|
|
92
|
+
export interface RestartClientResult {
|
|
93
|
+
/** Player the restart was queued for. */
|
|
94
|
+
playerId: string;
|
|
95
|
+
/** Target host — `undefined` when the caller didn't specify and the activity uses `preferredHost`. */
|
|
96
|
+
host?: string;
|
|
97
|
+
/** Outbox entry id; callers can poll `submitOutbox` history or `outboxQuery` for status. */
|
|
98
|
+
entryId: string;
|
|
99
|
+
}
|
|
100
|
+
/** Per-target outcome returned by `shutdown`. */
|
|
101
|
+
export interface EnsembleShutdownDetail {
|
|
102
|
+
playerId: string;
|
|
103
|
+
/**
|
|
104
|
+
* #299 sibling: removed `'skipped-self'`. The only public consumer of
|
|
105
|
+
* this type is `EnsembleShutdownSummary.details`, returned by
|
|
106
|
+
* `TempoClient.shutdown()`. The TempoClient implementation does not pass
|
|
107
|
+
* a `skip` predicate to `signalAllSessions`, so the fan-out never
|
|
108
|
+
* produces a `'skipped'` outcome and the `'skipped-self'` mapping was
|
|
109
|
+
* unreachable. Mirror cleanup of the destroy-detail change.
|
|
110
|
+
*/
|
|
111
|
+
outcome: 'detaching' | 'failed';
|
|
112
|
+
error?: string;
|
|
113
|
+
}
|
|
114
|
+
export interface EnsembleShutdownSummary {
|
|
115
|
+
detached: number;
|
|
116
|
+
skipped: number;
|
|
117
|
+
failed: number;
|
|
118
|
+
maestroPaused: boolean;
|
|
119
|
+
schedulerPaused: boolean;
|
|
120
|
+
details: EnsembleShutdownDetail[];
|
|
121
|
+
}
|
|
122
|
+
/** Per-target outcome returned by ensemble-scope `destroy`. */
|
|
123
|
+
export interface EnsembleDestroyDetail {
|
|
124
|
+
target: string;
|
|
125
|
+
/**
|
|
126
|
+
* #299: removed `'skipped-self'`. The only public consumer of this type is
|
|
127
|
+
* `EnsembleDestroySummary.details`, returned by `TempoClient.destroy()`,
|
|
128
|
+
* and the TempoClient implementation has no caller-self concept (the
|
|
129
|
+
* client is a programmatic caller, not a player in the ensemble) — so it
|
|
130
|
+
* never produces a self-skip. The MCP-tool path (`src/tools/destroy.ts`)
|
|
131
|
+
* does internally branch on caller-self for control flow but never
|
|
132
|
+
* surfaces those entries to a public consumer.
|
|
133
|
+
*/
|
|
134
|
+
outcome: 'destroyed' | 'terminated' | 'failed';
|
|
135
|
+
error?: string;
|
|
136
|
+
}
|
|
137
|
+
export interface EnsembleDestroySummary {
|
|
138
|
+
destroyed: number;
|
|
139
|
+
terminated: number;
|
|
140
|
+
failed: number;
|
|
141
|
+
details: EnsembleDestroyDetail[];
|
|
142
|
+
}
|
|
143
|
+
export interface EnsembleSummary {
|
|
144
|
+
name: string;
|
|
145
|
+
playerCount: number;
|
|
146
|
+
hasConductor: boolean;
|
|
147
|
+
conductorStatus?: string;
|
|
148
|
+
/**
|
|
149
|
+
* Lifecycle classification populated by {@link TempoClient.listEnsembles}
|
|
150
|
+
* (absent on `discoverEnsembles` results):
|
|
151
|
+
*
|
|
152
|
+
* - `'online'` — maestro hub is unpaused (`maestroPaused === false`).
|
|
153
|
+
* - `'paused'` — maestro hub is paused **and** at least one session is
|
|
154
|
+
* still in a live attachment phase. Operationally this is
|
|
155
|
+
* a `/pause` (resume in place via `/play`).
|
|
156
|
+
* - `'offline'` — maestro hub is paused **and** no live adapters remain.
|
|
157
|
+
* Operationally this is a `/shutdown` (requires `/restore`).
|
|
158
|
+
*/
|
|
159
|
+
state?: 'online' | 'paused' | 'offline';
|
|
160
|
+
}
|
|
161
|
+
/** Options for {@link TempoClient.createEnsemble}. */
|
|
162
|
+
export interface CreateEnsembleOpts {
|
|
163
|
+
/** New ensemble name. Must pass `validateEnsembleName`. */
|
|
164
|
+
ensemble: string;
|
|
165
|
+
/** Working directory for the spawned conductor terminal. Defaults to `process.cwd()`. */
|
|
166
|
+
workDir?: string;
|
|
167
|
+
/** Optional lineup name or path forwarded to `agent-tempo up --lineup …`. */
|
|
168
|
+
lineup?: string;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* #308 follow-up: pure-RPC subset of the TempoClient surface.
|
|
172
|
+
*
|
|
173
|
+
* `TempoClientCore` is the headless-safe interface — every method routes
|
|
174
|
+
* through the Temporal `Client` and never spawns a local terminal. Safe to
|
|
175
|
+
* instantiate inside the daemon, the SSE event source, MCP tools, and
|
|
176
|
+
* future SDK consumers that don't carry a `child_process` dependency.
|
|
177
|
+
*
|
|
178
|
+
* The TUI (and any other TTY-bound consumer that needs to launch a
|
|
179
|
+
* conductor terminal) imports {@link TempoClientWithSpawn} instead, which
|
|
180
|
+
* extends this interface with the two spawn methods.
|
|
181
|
+
*
|
|
182
|
+
* See `docs/adr/0007-tempoclient-core-withspawn-split.md` and
|
|
183
|
+
* `docs/design/tempoclient-core-spawn-split.md` for the rationale.
|
|
184
|
+
*/
|
|
185
|
+
export interface TempoClientCore {
|
|
186
|
+
/** Discover all running ensembles across the cluster. */
|
|
187
|
+
discoverEnsembles(): Promise<EnsembleSummary[]>;
|
|
188
|
+
/**
|
|
189
|
+
* List every ensemble with at least one live workflow, splitting running
|
|
190
|
+
* from parked (all-sessions-detached) via `state`.
|
|
191
|
+
*/
|
|
192
|
+
listEnsembles(): Promise<EnsembleSummary[]>;
|
|
193
|
+
/**
|
|
194
|
+
* #336/#529 — bounded variant of {@link listEnsembles}. Wraps the
|
|
195
|
+
* underlying visibility iterator with a wall-clock deadline and
|
|
196
|
+
* surfaces a `timedOut` flag so callers that diff against prior
|
|
197
|
+
* state (e.g. `AggregateRunner.collect()` at 750ms cadence) can
|
|
198
|
+
* skip an entire tick rather than silently produce a partial
|
|
199
|
+
* snapshot that would emit phantom `ensemble.destroyed` events.
|
|
200
|
+
*
|
|
201
|
+
* Unlike `listEnsembles()`, this method propagates non-timeout
|
|
202
|
+
* errors — the existing "swallow-and-return-empty" path is reserved
|
|
203
|
+
* for the unbounded variant's CLI / dashboard callers that don't
|
|
204
|
+
* need to distinguish timeout from emptiness.
|
|
205
|
+
*
|
|
206
|
+
* @param deadlineMs Wall-clock budget for the visibility iterator.
|
|
207
|
+
* `AggregateRunner` uses 500ms (correctness, well
|
|
208
|
+
* below the 750ms tick cadence); ad-hoc callers
|
|
209
|
+
* should match the caller's surrounding timeout.
|
|
210
|
+
*/
|
|
211
|
+
listEnsemblesBounded(deadlineMs: number): Promise<{
|
|
212
|
+
items: EnsembleSummary[];
|
|
213
|
+
timedOut: boolean;
|
|
214
|
+
scanned: number;
|
|
215
|
+
}>;
|
|
216
|
+
/** Get current player snapshot for an ensemble. */
|
|
217
|
+
getPlayers(ensemble: string): Promise<MaestroPlayerInfo[]>;
|
|
218
|
+
/**
|
|
219
|
+
* Issue #399 W1 — read the per-ensemble maestro hub's wire-extension
|
|
220
|
+
* fields (description / startedAt / currentBpm / tempoSeries) in a
|
|
221
|
+
* single fan-out. The four queries run in parallel against the same
|
|
222
|
+
* maestro workflow handle so total latency is bounded by the slowest
|
|
223
|
+
* query, not the sum.
|
|
224
|
+
*
|
|
225
|
+
* Returns an object with sentinel defaults (`description: ''`,
|
|
226
|
+
* `startedAt: ''`, `currentBpm: 0`, `tempoSeries: []`) when individual
|
|
227
|
+
* queries soft-fail — the snapshot endpoint must NEVER 500 because of
|
|
228
|
+
* a transient maestro query glitch.
|
|
229
|
+
*/
|
|
230
|
+
getEnsembleMeta(ensemble: string): Promise<{
|
|
231
|
+
description: string;
|
|
232
|
+
startedAt: string;
|
|
233
|
+
currentBpm: number;
|
|
234
|
+
tempoSeries: number[];
|
|
235
|
+
}>;
|
|
236
|
+
/**
|
|
237
|
+
* Issue #399 W2 — read a session workflow's wire-extension fields
|
|
238
|
+
* (runId / messaging / lease) in a single fan-out. The three queries
|
|
239
|
+
* run in parallel against the same session handle. Returns `null`
|
|
240
|
+
* when the session workflow can't be resolved (just-recruited,
|
|
241
|
+
* just-destroyed, or transient lookup failure); soft-fails individual
|
|
242
|
+
* fields to `undefined` in the returned shape so partial results
|
|
243
|
+
* still surface.
|
|
244
|
+
*/
|
|
245
|
+
getPlayerWireMeta(ensemble: string, playerId: string): Promise<{
|
|
246
|
+
runId?: string;
|
|
247
|
+
messaging?: {
|
|
248
|
+
received: number;
|
|
249
|
+
sent: number;
|
|
250
|
+
outbox: string;
|
|
251
|
+
};
|
|
252
|
+
lease?: {
|
|
253
|
+
expiresAt: number | null;
|
|
254
|
+
leaseMs: number | null;
|
|
255
|
+
};
|
|
256
|
+
} | null>;
|
|
257
|
+
/** Get recent messages for an ensemble. */
|
|
258
|
+
getMessages(ensemble: string, limit?: number): Promise<MaestroRelayMessage[]>;
|
|
259
|
+
/** Get conductor command/report history for an ensemble. */
|
|
260
|
+
getConductorHistory(ensemble: string): Promise<HistoryEntry[]>;
|
|
261
|
+
/** Get a player's message history (received + sent). */
|
|
262
|
+
getPlayerMessages(ensemble: string, playerId: string): Promise<Array<Message | (SentMessage & {
|
|
263
|
+
direction: 'sent';
|
|
264
|
+
})>>;
|
|
265
|
+
/** Get a player's workflow metadata. */
|
|
266
|
+
getPlayerMetadata(ensemble: string, playerId: string): Promise<SessionMetadata | null>;
|
|
267
|
+
/** Send a command to an ensemble's conductor via Maestro. Returns command ID. */
|
|
268
|
+
sendCommand(ensemble: string, text: string, source: string): Promise<string>;
|
|
269
|
+
/** Send a message to a specific player in an ensemble. Returns message ID. */
|
|
270
|
+
sendMessage(ensemble: string, to: string, text: string, source: string): Promise<string>;
|
|
271
|
+
/** Terminate a player's workflow. */
|
|
272
|
+
terminatePlayer(ensemble: string, playerId: string): Promise<void>;
|
|
273
|
+
/**
|
|
274
|
+
* #306: Recruit a player directly via the caller's maestro session outbox.
|
|
275
|
+
* Replaces the legacy TUI path of routing `/recruit …` through the
|
|
276
|
+
* conductor's Claude Code session. Structural-op parity with the `recruit`
|
|
277
|
+
* MCP tool — enqueues a `recruit` outbox entry; the dispatch loop spawns
|
|
278
|
+
* the process. The conductor's LLM is never in the critical path.
|
|
279
|
+
*/
|
|
280
|
+
recruit(ensemble: string, opts: RecruitClientOpts): Promise<RecruitClientResult>;
|
|
281
|
+
/**
|
|
282
|
+
* #306: Release held players directly via the caller's maestro session
|
|
283
|
+
* outbox. Without `playerId`, scans the ensemble for sessions whose
|
|
284
|
+
* outbox is locked and enqueues a `release` entry for each. With
|
|
285
|
+
* `playerId`, releases just that session. Structural-op parity with
|
|
286
|
+
* the `release` MCP tool.
|
|
287
|
+
*/
|
|
288
|
+
release(ensemble: string, playerId?: string): Promise<ReleaseClientResult>;
|
|
289
|
+
/** PR-D: Restart a player — §8.2 algorithm. Works on any non-`gone` phase. */
|
|
290
|
+
restart(ensemble: string, playerId: string, opts?: RestartClientOpts): Promise<RestartClientResult>;
|
|
291
|
+
/** PR-D: Gracefully detach a player's adapter. Workflow survives in `detached`. */
|
|
292
|
+
detach(ensemble: string, playerId: string, deadlineMs?: number): Promise<void>;
|
|
293
|
+
/**
|
|
294
|
+
* #287: Terminally destroy a workflow. Single-player when `playerId` is
|
|
295
|
+
* given; ensemble-scope (peer sessions → scheduler → maestro → conductor)
|
|
296
|
+
* when `playerId` is omitted. Ensemble-scope returns a count summary.
|
|
297
|
+
*/
|
|
298
|
+
destroy(ensemble: string, playerId?: string, reason?: string): Promise<void | EnsembleDestroySummary>;
|
|
299
|
+
/**
|
|
300
|
+
* #287: Pause every session in the ensemble + scheduler + maestro. MCP
|
|
301
|
+
* counterpart of the `pause` tool. Replaces the v0.26 `pauseEnsemble` shape.
|
|
302
|
+
*/
|
|
303
|
+
pause(ensemble: string): Promise<void>;
|
|
304
|
+
/**
|
|
305
|
+
* #287: Unpause every session + scheduler + maestro. `release: true` also
|
|
306
|
+
* fans out `releaseHeld` so any held sessions deliver their buffered task
|
|
307
|
+
* messages. MCP counterpart of the `play` tool.
|
|
308
|
+
*/
|
|
309
|
+
play(ensemble: string, opts?: {
|
|
310
|
+
release?: boolean;
|
|
311
|
+
}): Promise<void>;
|
|
312
|
+
/**
|
|
313
|
+
* #287: Graceful ensemble teardown — fan-out detach + pause scheduler +
|
|
314
|
+
* pause maestro. Workflows survive in `detached`; pair with `restore`.
|
|
315
|
+
*/
|
|
316
|
+
shutdown(ensemble: string, opts?: {
|
|
317
|
+
deadlineMs?: number;
|
|
318
|
+
reason?: string;
|
|
319
|
+
}): Promise<EnsembleShutdownSummary>;
|
|
320
|
+
/**
|
|
321
|
+
* #287: Bring the ensemble back up after `shutdown`. Reattaches all local
|
|
322
|
+
* orphans (delegates to the shared `restoreOrphansOnce` helper) and
|
|
323
|
+
* unpauses the scheduler + maestro. Does NOT spawn a conductor terminal
|
|
324
|
+
* — CLI owns that (design #285 S4).
|
|
325
|
+
*/
|
|
326
|
+
restore(ensemble: string): Promise<RestoreOrphansSummary>;
|
|
327
|
+
/** PR-D: Migrate a player to a different host — sugar for restart({host}). */
|
|
328
|
+
migrate(ensemble: string, playerId: string, host: string, opts?: Omit<RestartClientOpts, 'host'>): Promise<RestartClientResult>;
|
|
329
|
+
/** PR-D: Query a player's V2 attachment lifecycle state. */
|
|
330
|
+
attachmentInfo(ensemble: string, playerId: string): Promise<AttachmentInfo>;
|
|
331
|
+
/**
|
|
332
|
+
* #128: Fetch a player's raw message timeline (received + sent). Throws
|
|
333
|
+
* when the session cannot be resolved. Callers are expected to feed the
|
|
334
|
+
* result through the shared `formatRecall` helper for filter / sort /
|
|
335
|
+
* slice / render; the client stays presentation-free.
|
|
336
|
+
*/
|
|
337
|
+
recall(ensemble: string, playerId: string): Promise<RecallClientResult>;
|
|
338
|
+
/**
|
|
339
|
+
* #274: List all daemons polling this Temporal namespace, joined with
|
|
340
|
+
* their boot-signaled capability profiles. Consumers typically feed
|
|
341
|
+
* the result through `formatHostList` for a consistent UX across
|
|
342
|
+
* CLI / TUI / MCP. `force: true` bypasses the 3-second result cache.
|
|
343
|
+
*/
|
|
344
|
+
listHosts(opts?: {
|
|
345
|
+
force?: boolean;
|
|
346
|
+
}): Promise<HostInfo[]>;
|
|
347
|
+
/** Get active schedules for an ensemble. */
|
|
348
|
+
getSchedules(ensemble: string): Promise<ScheduleEntry[]>;
|
|
349
|
+
/** Cancel a named schedule in an ensemble. */
|
|
350
|
+
cancelSchedule(ensemble: string, name: string): Promise<void>;
|
|
351
|
+
/** Get quality gates from the conductor workflow. */
|
|
352
|
+
getGates(ensemble: string): Promise<QualityGate[]>;
|
|
353
|
+
/** Get stages from the conductor workflow. */
|
|
354
|
+
getStages(ensemble: string): Promise<StageEntry[]>;
|
|
355
|
+
/** Get worktrees from the conductor workflow. */
|
|
356
|
+
getWorktrees(ensemble: string): Promise<WorktreeEntry[]>;
|
|
357
|
+
/** Get aggregated ensemble chat (maestro + conductor traffic). */
|
|
358
|
+
getEnsembleChat(ensemble: string, offset?: number, limit?: number): Promise<EnsembleChatResult>;
|
|
359
|
+
/**
|
|
360
|
+
* Bug B: Read the maestro hub's `maestroPaused` flag for an ensemble.
|
|
361
|
+
* Returns `false` when the hub workflow doesn't exist (treat absence as
|
|
362
|
+
* "not paused" — the StatusBar renders nothing for the bare-ensemble case).
|
|
363
|
+
* The TUI polls this so a paused conductor swallowing messages becomes
|
|
364
|
+
* visible (status bar segment + tooltip-style hint to type `/play`).
|
|
365
|
+
*/
|
|
366
|
+
isMaestroPaused(ensemble: string): Promise<boolean>;
|
|
367
|
+
/**
|
|
368
|
+
* #306 follow-up: True when at least one session in the ensemble has its
|
|
369
|
+
* outbox locked (i.e. is `held`). Companion to {@link isMaestroPaused};
|
|
370
|
+
* the two are orthogonal — `/load_lineup` flips both, `/pause` flips just
|
|
371
|
+
* paused, `/recruit --held` flips just held. The TUI polls this to surface
|
|
372
|
+
* a yellow `held` segment + a `Tip: /go` hint, so users don't sit paused
|
|
373
|
+
* watching held players that need releasing.
|
|
374
|
+
*
|
|
375
|
+
* Skips the maestro session (the TUI's own dashboard attachment) so a
|
|
376
|
+
* locked maestro outbox — never a real held-player state — doesn't
|
|
377
|
+
* trigger the indicator. Returns `false` when the scan or every per-
|
|
378
|
+
* session query fails (treat absence as "not held").
|
|
379
|
+
*/
|
|
380
|
+
isAnySessionHeld(ensemble: string): Promise<boolean>;
|
|
381
|
+
/** Disband an ensemble: terminate all sessions, scheduler, and maestro workflows. */
|
|
382
|
+
disbandEnsemble(ensemble: string): Promise<{
|
|
383
|
+
terminated: number;
|
|
384
|
+
}>;
|
|
385
|
+
/** Check if the Temporal connection is alive. */
|
|
386
|
+
isConnected(): Promise<boolean>;
|
|
387
|
+
/** Check if the Global Maestro workflow is running. */
|
|
388
|
+
hasGlobalMaestro(): Promise<boolean>;
|
|
389
|
+
/**
|
|
390
|
+
* Subscribe to the per-ensemble SSE event stream exposed by the daemon
|
|
391
|
+
* at `/v1/events/:ensemble`. Returns an `AsyncIterable<TempoEvent>` —
|
|
392
|
+
* iterate with `for await` to consume events. The stream is
|
|
393
|
+
* snapshot-then-stream: a synthetic `event: snapshot` arrives first
|
|
394
|
+
* (carrying the `/v1/state/:ensemble` payload), then live diff events
|
|
395
|
+
* follow per [`docs/SSE-PROTOCOL.md`](../../docs/SSE-PROTOCOL.md).
|
|
396
|
+
*
|
|
397
|
+
* **Cancellation**: pass `opts.signal` (`AbortSignal`) to terminate the
|
|
398
|
+
* stream from the caller side, or simply `break` out of the `for await`
|
|
399
|
+
* — the wrapper's iterator hooks `return()` to abort the underlying
|
|
400
|
+
* transport (§7.4). The wrapper transparently reconnects on TCP drops
|
|
401
|
+
* with `Last-Event-ID` carried across reconnects (§7.5).
|
|
402
|
+
*
|
|
403
|
+
* **Gap recovery**: `gap` and `chat.compressed` events surface to the
|
|
404
|
+
* consumer (not swallowed). `gap` requires a `/v1/state/:ensemble`
|
|
405
|
+
* re-fetch + resubscribe per §7.2; `chat.compressed` is a soft gap
|
|
406
|
+
* scoped to the chat slice only per §7.6.
|
|
407
|
+
*/
|
|
408
|
+
subscribe(ensemble: string, opts?: SubscribeOptions): AsyncIterable<TempoEvent>;
|
|
409
|
+
/**
|
|
410
|
+
* Subscribe to the global cluster-shape stream at `/v1/events`. Carries
|
|
411
|
+
* only the cluster-wide events (`ensemble.created`, `ensemble.destroyed`,
|
|
412
|
+
* `host_profile.changed`, `heartbeat`, `gap`, `throttled`).
|
|
413
|
+
*/
|
|
414
|
+
subscribe(opts?: SubscribeOptions): AsyncIterable<TempoEvent>;
|
|
415
|
+
/** Ensure a maestro session workflow exists for the ensemble (create or reuse). */
|
|
416
|
+
ensureMaestroSession(ensemble: string): Promise<string>;
|
|
417
|
+
/** Send a message as the maestro to a target player. */
|
|
418
|
+
sendAsMaestro(ensemble: string, targetPlayer: string, text: string): Promise<void>;
|
|
419
|
+
/** Get messages received + sent by the maestro session. */
|
|
420
|
+
getMaestroMessages(ensemble: string): Promise<{
|
|
421
|
+
received: Message[];
|
|
422
|
+
sent: SentMessage[];
|
|
423
|
+
}>;
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* #308 follow-up: TTY-bound superset of {@link TempoClientCore}.
|
|
427
|
+
*
|
|
428
|
+
* Adds the two methods that shell out to a local terminal via
|
|
429
|
+
* `agent-tempo up …`. Required for the TUI's "create ensemble" wizard
|
|
430
|
+
* and the restore-after-shutdown flow. **DO NOT depend on this interface
|
|
431
|
+
* from headless contexts** — the daemon, MCP tools, and SSE event source
|
|
432
|
+
* must use {@link TempoClientCore}.
|
|
433
|
+
*/
|
|
434
|
+
export interface TempoClientWithSpawn extends TempoClientCore {
|
|
435
|
+
/**
|
|
436
|
+
* Spawn a new conductor terminal for a brand-new ensemble. Shells out to
|
|
437
|
+
* `agent-tempo up <name>` so the spawned conductor terminal matches the
|
|
438
|
+
* CLI path. **Requires a TTY context** — DO NOT call from MCP tools, the
|
|
439
|
+
* daemon, or other headless processes.
|
|
440
|
+
*/
|
|
441
|
+
createEnsemble(opts: CreateEnsembleOpts): Promise<void>;
|
|
442
|
+
/**
|
|
443
|
+
* Spawn a conductor terminal for an existing ensemble — the restore-
|
|
444
|
+
* after-shutdown path. Shells out to `agent-tempo up <name>` which is
|
|
445
|
+
* idempotent at the workflow layer. Semantically distinct from
|
|
446
|
+
* {@link TempoClientWithSpawn.createEnsemble}: this fires on an ensemble
|
|
447
|
+
* that already exists; a "create" contradiction would mislead future
|
|
448
|
+
* readers. **Requires a TTY context.**
|
|
449
|
+
*/
|
|
450
|
+
spawnConductor(opts: {
|
|
451
|
+
ensemble: string;
|
|
452
|
+
workDir?: string;
|
|
453
|
+
}): Promise<void>;
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Backwards-compatible alias preserved indefinitely (per ADR 0007's
|
|
457
|
+
* forward-looking note). Existing code that imports `TempoClient` keeps
|
|
458
|
+
* the full surface (Core + spawn). New consumers that want headless
|
|
459
|
+
* safety should import {@link TempoClientCore} directly.
|
|
460
|
+
*/
|
|
461
|
+
export type TempoClient = TempoClientWithSpawn;
|