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,99 @@
|
|
|
1
|
+
/** Single source of truth — must match `SEARCH_ATTRIBUTES` in `src/cli/startup.ts`. */
|
|
2
|
+
export declare const REQUIRED_SEARCH_ATTRIBUTES: ReadonlyArray<{
|
|
3
|
+
name: string;
|
|
4
|
+
type: 'Keyword' | 'Bool';
|
|
5
|
+
}>;
|
|
6
|
+
export interface SearchAttributePreflightOpts {
|
|
7
|
+
temporalAddress: string;
|
|
8
|
+
temporalNamespace: string;
|
|
9
|
+
/**
|
|
10
|
+
* Optional test seam — given a namespace, return the set of search
|
|
11
|
+
* attribute names that ARE currently registered. Defaults to
|
|
12
|
+
* {@link defaultProbeRegisteredAttributes} which shells out to
|
|
13
|
+
* `temporal operator search-attribute list`.
|
|
14
|
+
*/
|
|
15
|
+
probe?: (opts: {
|
|
16
|
+
temporalAddress: string;
|
|
17
|
+
temporalNamespace: string;
|
|
18
|
+
}) => Promise<Set<string>>;
|
|
19
|
+
}
|
|
20
|
+
export interface SearchAttributePreflightResult {
|
|
21
|
+
ok: boolean;
|
|
22
|
+
/** Subset of `REQUIRED_SEARCH_ATTRIBUTES` that the probe couldn't find. */
|
|
23
|
+
missing: ReadonlyArray<typeof REQUIRED_SEARCH_ATTRIBUTES[number]>;
|
|
24
|
+
/** Formatted, paste-friendly error message — populated when `ok === false`. */
|
|
25
|
+
message?: string;
|
|
26
|
+
/** Probe error, if the call failed entirely (e.g. `temporal` CLI not on PATH). */
|
|
27
|
+
probeError?: string;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Default probe — shells out to `temporal operator search-attribute list`.
|
|
31
|
+
* Returns an empty set on any error so callers fall through to the
|
|
32
|
+
* "missing all" branch with an explanatory `probeError` in the result.
|
|
33
|
+
*/
|
|
34
|
+
export declare function defaultProbeRegisteredAttributes(opts: {
|
|
35
|
+
temporalAddress: string;
|
|
36
|
+
temporalNamespace: string;
|
|
37
|
+
}): Promise<Set<string>>;
|
|
38
|
+
/**
|
|
39
|
+
* Format the missing-SA error message. Paste-friendly: operators copy the
|
|
40
|
+
* `temporal operator search-attribute create` block verbatim.
|
|
41
|
+
*/
|
|
42
|
+
export declare function formatPreflightError(missing: ReadonlyArray<typeof REQUIRED_SEARCH_ATTRIBUTES[number]>, namespace: string, probeError?: string): string;
|
|
43
|
+
/**
|
|
44
|
+
* Verify all {@link REQUIRED_SEARCH_ATTRIBUTES} are registered on the
|
|
45
|
+
* given namespace. Returns a structured result — callers decide whether
|
|
46
|
+
* to log+continue (boot bootstrap step) or exit non-zero (daemon start).
|
|
47
|
+
*/
|
|
48
|
+
export declare function verifySearchAttributes(opts: SearchAttributePreflightOpts): Promise<SearchAttributePreflightResult>;
|
|
49
|
+
/**
|
|
50
|
+
* Outcome of a single `temporal operator search-attribute create` invocation.
|
|
51
|
+
*
|
|
52
|
+
* Pre-#605 the two registration call sites (`commands.ts:registerSearchAttributes`
|
|
53
|
+
* and `startup.ts:stepSearchAttrs`) ran the create command with `stdio: 'ignore'`
|
|
54
|
+
* and swallowed every non-zero exit as "already exists". That hid the
|
|
55
|
+
* SQLite dev-server's 10-Keyword-per-namespace cap (and any other genuine
|
|
56
|
+
* failure) until a downstream workflow start crashed with the confusing
|
|
57
|
+
* `INVALID_ARGUMENT: search attribute "..." is not defined` — hours later
|
|
58
|
+
* and miles away from the real cause.
|
|
59
|
+
*/
|
|
60
|
+
export type RegistrationStatus = 'created' | 'already-exists' | 'failed';
|
|
61
|
+
export interface RegistrationResult {
|
|
62
|
+
attr: typeof REQUIRED_SEARCH_ATTRIBUTES[number];
|
|
63
|
+
status: RegistrationStatus;
|
|
64
|
+
/** stderr from the temporal CLI, populated when `status === 'failed'`. */
|
|
65
|
+
detail?: string;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Pure classifier — turn a temporal CLI exit into a {@link RegistrationStatus}.
|
|
69
|
+
* Extracted from {@link registerSearchAttribute} so the matching rules can
|
|
70
|
+
* be unit-tested without mocking `child_process`.
|
|
71
|
+
*
|
|
72
|
+
* Rules:
|
|
73
|
+
* - exit code 0 → `created`
|
|
74
|
+
* - stderr/stdout matches the → `already-exists` (idempotent)
|
|
75
|
+
* standard Temporal markers
|
|
76
|
+
* - anything else → `failed` (with detail for the operator)
|
|
77
|
+
*/
|
|
78
|
+
export declare function classifyRegistrationOutput(exitCode: number | null, output: string, errorMessage?: string): {
|
|
79
|
+
status: RegistrationStatus;
|
|
80
|
+
detail?: string;
|
|
81
|
+
};
|
|
82
|
+
/**
|
|
83
|
+
* Register one search attribute. Captures stderr so callers can
|
|
84
|
+
* distinguish "already-exists" (idempotent expected case) from real
|
|
85
|
+
* failures (CLI missing, server unreachable, namespace cap exceeded, …).
|
|
86
|
+
*/
|
|
87
|
+
export declare function registerSearchAttribute(attr: typeof REQUIRED_SEARCH_ATTRIBUTES[number], temporalAddress: string, namespace: string): RegistrationResult;
|
|
88
|
+
/**
|
|
89
|
+
* Hard variant for the daemon boot path — verify, and if missing, write the
|
|
90
|
+
* actionable error to stderr and exit non-zero. Returns when all attributes
|
|
91
|
+
* are present; never returns in the failure branch.
|
|
92
|
+
*
|
|
93
|
+
* The caller hands in a `processExit` injectable so tests can assert the
|
|
94
|
+
* call without crashing the test runner.
|
|
95
|
+
*/
|
|
96
|
+
export declare function assertSearchAttributesOrExit(opts: SearchAttributePreflightOpts & {
|
|
97
|
+
processExit?: (code: number) => never;
|
|
98
|
+
log?: (line: string) => void;
|
|
99
|
+
}): Promise<void>;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.REQUIRED_SEARCH_ATTRIBUTES = void 0;
|
|
4
|
+
exports.defaultProbeRegisteredAttributes = defaultProbeRegisteredAttributes;
|
|
5
|
+
exports.formatPreflightError = formatPreflightError;
|
|
6
|
+
exports.verifySearchAttributes = verifySearchAttributes;
|
|
7
|
+
exports.classifyRegistrationOutput = classifyRegistrationOutput;
|
|
8
|
+
exports.registerSearchAttribute = registerSearchAttribute;
|
|
9
|
+
exports.assertSearchAttributesOrExit = assertSearchAttributesOrExit;
|
|
10
|
+
/**
|
|
11
|
+
* Search-attribute preflight (PR-3 of the v1.0 rebrand).
|
|
12
|
+
*
|
|
13
|
+
* After the wire-level rename from `ClaudeTempo*` to `AgentTempo*`, every
|
|
14
|
+
* Temporal namespace agent-tempo / agent-tempo touches needs the new
|
|
15
|
+
* search attributes registered before workflows can start. Self-hosted
|
|
16
|
+
* Temporal makes registration a privileged one-shot operator action — the
|
|
17
|
+
* daemon can't do it itself, but it CAN refuse to boot with an actionable
|
|
18
|
+
* error so operators don't see a confusing
|
|
19
|
+
* `INVALID_ARGUMENT: search attribute "AgentTempoEnsemble" is not defined`
|
|
20
|
+
* deep in workflow-start RPC failures hours later.
|
|
21
|
+
*
|
|
22
|
+
* This module is dependency-injected over a `searchAttributesPresent`
|
|
23
|
+
* probe so tests can simulate every namespace-state branch without
|
|
24
|
+
* touching a real Temporal server.
|
|
25
|
+
*
|
|
26
|
+
* Wiring:
|
|
27
|
+
* - `src/cli/startup.ts` `searchAttrs` step uses the verify-or-instruct
|
|
28
|
+
* output to surface the actionable error in the TUI bootstrap surface.
|
|
29
|
+
* - `src/daemon.ts` boot path calls {@link verifySearchAttributes}
|
|
30
|
+
* directly to fail fast on `agent-tempo daemon start` before the worker
|
|
31
|
+
* tries to register workflows.
|
|
32
|
+
*/
|
|
33
|
+
const child_process_1 = require("child_process");
|
|
34
|
+
/** Single source of truth — must match `SEARCH_ATTRIBUTES` in `src/cli/startup.ts`. */
|
|
35
|
+
exports.REQUIRED_SEARCH_ATTRIBUTES = Object.freeze([
|
|
36
|
+
{ name: 'AgentTempoHostname', type: 'Keyword' },
|
|
37
|
+
{ name: 'AgentTempoGitRoot', type: 'Keyword' },
|
|
38
|
+
{ name: 'AgentTempoEnsemble', type: 'Keyword' },
|
|
39
|
+
{ name: 'AgentTempoPlayerId', type: 'Keyword' },
|
|
40
|
+
{ name: 'AgentTempoPlayerType', type: 'Keyword' },
|
|
41
|
+
{ name: 'AgentTempoIsConductor', type: 'Bool' },
|
|
42
|
+
{ name: 'AgentTempoAttachedHost', type: 'Keyword' },
|
|
43
|
+
{ name: 'AgentTempoAttachmentState', type: 'Keyword' },
|
|
44
|
+
{ name: 'AgentTempoAttachmentId', type: 'Keyword' },
|
|
45
|
+
]);
|
|
46
|
+
/**
|
|
47
|
+
* Default probe — shells out to `temporal operator search-attribute list`.
|
|
48
|
+
* Returns an empty set on any error so callers fall through to the
|
|
49
|
+
* "missing all" branch with an explanatory `probeError` in the result.
|
|
50
|
+
*/
|
|
51
|
+
async function defaultProbeRegisteredAttributes(opts) {
|
|
52
|
+
const args = [
|
|
53
|
+
'operator', 'search-attribute', 'list',
|
|
54
|
+
'--address', opts.temporalAddress,
|
|
55
|
+
'--namespace', opts.temporalNamespace,
|
|
56
|
+
];
|
|
57
|
+
const raw = (0, child_process_1.execFileSync)('temporal', args, {
|
|
58
|
+
encoding: 'utf8',
|
|
59
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
60
|
+
});
|
|
61
|
+
// The CLI prints a human table; we only need the leading column. Each row
|
|
62
|
+
// starts with the attribute name as the first whitespace-delimited token.
|
|
63
|
+
// Header row (and blank lines) are filtered by the AgentTempo prefix /
|
|
64
|
+
// alphanumeric guard below.
|
|
65
|
+
const names = new Set();
|
|
66
|
+
for (const line of raw.split('\n')) {
|
|
67
|
+
const trimmed = line.trim();
|
|
68
|
+
if (!trimmed)
|
|
69
|
+
continue;
|
|
70
|
+
const first = trimmed.split(/\s+/, 1)[0];
|
|
71
|
+
if (/^[A-Za-z][A-Za-z0-9_]*$/.test(first))
|
|
72
|
+
names.add(first);
|
|
73
|
+
}
|
|
74
|
+
return names;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Format the missing-SA error message. Paste-friendly: operators copy the
|
|
78
|
+
* `temporal operator search-attribute create` block verbatim.
|
|
79
|
+
*/
|
|
80
|
+
function formatPreflightError(missing, namespace, probeError) {
|
|
81
|
+
const lines = [];
|
|
82
|
+
lines.push(`Required search attributes not registered on namespace '${namespace}'.`);
|
|
83
|
+
if (probeError) {
|
|
84
|
+
lines.push(`(Could not probe namespace state: ${probeError})`);
|
|
85
|
+
}
|
|
86
|
+
lines.push('');
|
|
87
|
+
lines.push('Run these commands once per Temporal namespace, then restart the daemon:');
|
|
88
|
+
lines.push('');
|
|
89
|
+
for (const attr of missing) {
|
|
90
|
+
lines.push(` temporal operator search-attribute create ` +
|
|
91
|
+
`--name ${attr.name} --type ${attr.type} --namespace ${namespace}`);
|
|
92
|
+
}
|
|
93
|
+
lines.push('');
|
|
94
|
+
lines.push('(See docs/ops/v1.0-migration.md for the full upgrade walkthrough.)');
|
|
95
|
+
return lines.join('\n');
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Verify all {@link REQUIRED_SEARCH_ATTRIBUTES} are registered on the
|
|
99
|
+
* given namespace. Returns a structured result — callers decide whether
|
|
100
|
+
* to log+continue (boot bootstrap step) or exit non-zero (daemon start).
|
|
101
|
+
*/
|
|
102
|
+
async function verifySearchAttributes(opts) {
|
|
103
|
+
const probe = opts.probe ?? defaultProbeRegisteredAttributes;
|
|
104
|
+
let registered;
|
|
105
|
+
let probeError;
|
|
106
|
+
try {
|
|
107
|
+
registered = await probe({
|
|
108
|
+
temporalAddress: opts.temporalAddress,
|
|
109
|
+
temporalNamespace: opts.temporalNamespace,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
catch (err) {
|
|
113
|
+
probeError = err instanceof Error ? err.message : String(err);
|
|
114
|
+
registered = new Set();
|
|
115
|
+
}
|
|
116
|
+
const missing = exports.REQUIRED_SEARCH_ATTRIBUTES.filter((a) => !registered.has(a.name));
|
|
117
|
+
if (missing.length === 0 && !probeError) {
|
|
118
|
+
return { ok: true, missing: [] };
|
|
119
|
+
}
|
|
120
|
+
return {
|
|
121
|
+
ok: false,
|
|
122
|
+
missing,
|
|
123
|
+
probeError,
|
|
124
|
+
message: formatPreflightError(missing, opts.temporalNamespace, probeError),
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Pure classifier — turn a temporal CLI exit into a {@link RegistrationStatus}.
|
|
129
|
+
* Extracted from {@link registerSearchAttribute} so the matching rules can
|
|
130
|
+
* be unit-tested without mocking `child_process`.
|
|
131
|
+
*
|
|
132
|
+
* Rules:
|
|
133
|
+
* - exit code 0 → `created`
|
|
134
|
+
* - stderr/stdout matches the → `already-exists` (idempotent)
|
|
135
|
+
* standard Temporal markers
|
|
136
|
+
* - anything else → `failed` (with detail for the operator)
|
|
137
|
+
*/
|
|
138
|
+
function classifyRegistrationOutput(exitCode, output, errorMessage) {
|
|
139
|
+
if (exitCode === 0)
|
|
140
|
+
return { status: 'created' };
|
|
141
|
+
if (/already\s*exists/i.test(output) || /AlreadyExists/.test(output)) {
|
|
142
|
+
return { status: 'already-exists' };
|
|
143
|
+
}
|
|
144
|
+
const detail = output.trim() || errorMessage || `temporal CLI exited ${exitCode ?? 'with no status'}`;
|
|
145
|
+
return { status: 'failed', detail };
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Register one search attribute. Captures stderr so callers can
|
|
149
|
+
* distinguish "already-exists" (idempotent expected case) from real
|
|
150
|
+
* failures (CLI missing, server unreachable, namespace cap exceeded, …).
|
|
151
|
+
*/
|
|
152
|
+
function registerSearchAttribute(attr, temporalAddress, namespace) {
|
|
153
|
+
const result = (0, child_process_1.spawnSync)('temporal', [
|
|
154
|
+
'operator', 'search-attribute', 'create',
|
|
155
|
+
'--address', temporalAddress,
|
|
156
|
+
'--namespace', namespace,
|
|
157
|
+
'--name', attr.name,
|
|
158
|
+
'--type', attr.type,
|
|
159
|
+
], { encoding: 'utf8' });
|
|
160
|
+
const classified = classifyRegistrationOutput(result.status, (result.stderr || '') + (result.stdout || ''), result.error?.message);
|
|
161
|
+
return { attr, ...classified };
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Hard variant for the daemon boot path — verify, and if missing, write the
|
|
165
|
+
* actionable error to stderr and exit non-zero. Returns when all attributes
|
|
166
|
+
* are present; never returns in the failure branch.
|
|
167
|
+
*
|
|
168
|
+
* The caller hands in a `processExit` injectable so tests can assert the
|
|
169
|
+
* call without crashing the test runner.
|
|
170
|
+
*/
|
|
171
|
+
async function assertSearchAttributesOrExit(opts) {
|
|
172
|
+
const result = await verifySearchAttributes(opts);
|
|
173
|
+
if (result.ok)
|
|
174
|
+
return;
|
|
175
|
+
const log = opts.log ?? ((line) => process.stderr.write(line + '\n'));
|
|
176
|
+
log('ERROR: ' + result.message);
|
|
177
|
+
const exit = opts.processExit ?? ((code) => {
|
|
178
|
+
process.exit(code);
|
|
179
|
+
// Unreachable, but satisfies the `never` return.
|
|
180
|
+
throw new Error(`process.exit(${code}) failed`);
|
|
181
|
+
});
|
|
182
|
+
exit(1);
|
|
183
|
+
}
|
|
@@ -0,0 +1,167 @@
|
|
|
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.scenariosCommand = scenariosCommand;
|
|
37
|
+
/**
|
|
38
|
+
* `agent-tempo --dev scenarios <list|show> [name]` — discoverability surface
|
|
39
|
+
* for the mock-adapter scenario library shipped at the package's repo-root
|
|
40
|
+
* `scenarios/` directory (ADR 0014 §4.8).
|
|
41
|
+
*
|
|
42
|
+
* Crash-proof: imports only `fs`, `path`, the scenario parser, and the
|
|
43
|
+
* shared CLI output helpers. No Temporal, no rxjs — lives in the same
|
|
44
|
+
* "always-importable" tier as `help-text.ts` and `daemon-command.ts`. A
|
|
45
|
+
* conductor can `agent-tempo --dev scenarios list` to enumerate the
|
|
46
|
+
* library before the dev daemon is even running.
|
|
47
|
+
*
|
|
48
|
+
* Resolution rules mirror `MockAttachment.resolveScenarioPath`:
|
|
49
|
+
*
|
|
50
|
+
* 1. Absolute path — used verbatim.
|
|
51
|
+
* 2. Bare name (no separators) — `<package-root>/scenarios/<name>.yaml`.
|
|
52
|
+
* 3. Relative path — `process.cwd()`-relative.
|
|
53
|
+
*/
|
|
54
|
+
const fs = __importStar(require("fs"));
|
|
55
|
+
const path = __importStar(require("path"));
|
|
56
|
+
const scenario_1 = require("../adapters/mock/scenario");
|
|
57
|
+
const out = __importStar(require("./output"));
|
|
58
|
+
/** Walk up from this file's compiled location to the package root. */
|
|
59
|
+
function packageRoot() {
|
|
60
|
+
// dist/cli/scenarios-command.js → dist/cli → dist → <root>
|
|
61
|
+
return path.resolve(__dirname, '..', '..');
|
|
62
|
+
}
|
|
63
|
+
function shippedScenariosDir() {
|
|
64
|
+
return path.join(packageRoot(), 'scenarios');
|
|
65
|
+
}
|
|
66
|
+
/** Surface used by `src/cli.ts`'s `--dev scenarios` verb. */
|
|
67
|
+
async function scenariosCommand(args) {
|
|
68
|
+
const sub = args.subcommand ?? 'list';
|
|
69
|
+
switch (sub) {
|
|
70
|
+
case 'list':
|
|
71
|
+
await listScenarios(Boolean(args.json));
|
|
72
|
+
return;
|
|
73
|
+
case 'show':
|
|
74
|
+
if (!args.name) {
|
|
75
|
+
out.error('Usage: agent-tempo --dev scenarios show <name>');
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
await showScenario(args.name);
|
|
79
|
+
return;
|
|
80
|
+
default:
|
|
81
|
+
out.error(`Unknown scenarios subcommand "${sub}". Available: list, show.`);
|
|
82
|
+
process.exit(1);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
async function listScenarios(asJson) {
|
|
86
|
+
const dir = shippedScenariosDir();
|
|
87
|
+
if (!fs.existsSync(dir)) {
|
|
88
|
+
if (asJson) {
|
|
89
|
+
out.log(JSON.stringify({ scenarios: [], scenariosDir: dir }));
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
out.warn(`No scenarios directory found at ${dir}.`);
|
|
93
|
+
out.warn('This agent-tempo install may have been built without dev-mode artifacts.');
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const entries = fs.readdirSync(dir)
|
|
97
|
+
.filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'))
|
|
98
|
+
.sort();
|
|
99
|
+
const items = entries.map((file) => {
|
|
100
|
+
const abs = path.join(dir, file);
|
|
101
|
+
try {
|
|
102
|
+
const yamlText = fs.readFileSync(abs, 'utf8');
|
|
103
|
+
const scenario = (0, scenario_1.parseScenario)(yamlText);
|
|
104
|
+
return {
|
|
105
|
+
name: scenario.name,
|
|
106
|
+
file: path.basename(file, path.extname(file)),
|
|
107
|
+
description: (scenario.description ?? '').split('\n').map((l) => l.trim()).filter(Boolean).join(' '),
|
|
108
|
+
ruleCount: scenario.rules.length,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
catch (err) {
|
|
112
|
+
return {
|
|
113
|
+
name: '(invalid)',
|
|
114
|
+
file: path.basename(file, path.extname(file)),
|
|
115
|
+
description: `parse error: ${err?.message ?? err}`,
|
|
116
|
+
ruleCount: 0,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
if (asJson) {
|
|
121
|
+
out.log(JSON.stringify({ scenarios: items, scenariosDir: dir }, null, 2));
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
if (items.length === 0) {
|
|
125
|
+
out.log(`No scenarios found in ${dir}.`);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
out.log(`Mock-adapter scenarios in ${dir}:\n`);
|
|
129
|
+
for (const item of items) {
|
|
130
|
+
out.log(` ${item.file} (${item.ruleCount} rule${item.ruleCount === 1 ? '' : 's'})`);
|
|
131
|
+
if (item.description) {
|
|
132
|
+
out.log(` ${item.description}`);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
out.log('\nUse with: agent-tempo --dev recruit <name> --agent mock --mockMode scripted --mockScenario <name>');
|
|
136
|
+
}
|
|
137
|
+
async function showScenario(reference) {
|
|
138
|
+
const abs = resolveCliReference(reference);
|
|
139
|
+
if (!fs.existsSync(abs)) {
|
|
140
|
+
out.error(`Scenario file not found: ${abs}`);
|
|
141
|
+
process.exit(1);
|
|
142
|
+
}
|
|
143
|
+
const yamlText = fs.readFileSync(abs, 'utf8');
|
|
144
|
+
// Validate while displaying so users get an immediate "this YAML is fine"
|
|
145
|
+
// signal alongside the printed body. Show the raw YAML even on parse
|
|
146
|
+
// failure so operators can spot the offending line.
|
|
147
|
+
try {
|
|
148
|
+
(0, scenario_1.parseScenario)(yamlText);
|
|
149
|
+
}
|
|
150
|
+
catch (err) {
|
|
151
|
+
out.error(`(scenario validation failed: ${err?.message ?? err})`);
|
|
152
|
+
out.error('Showing raw YAML below regardless:\n');
|
|
153
|
+
}
|
|
154
|
+
out.log(`# ${abs}\n`);
|
|
155
|
+
out.log(yamlText.replace(/\n$/, ''));
|
|
156
|
+
}
|
|
157
|
+
function resolveCliReference(reference) {
|
|
158
|
+
if (path.isAbsolute(reference))
|
|
159
|
+
return reference;
|
|
160
|
+
if (!reference.includes('/') && !reference.includes(path.sep)) {
|
|
161
|
+
const stem = reference.endsWith('.yaml') || reference.endsWith('.yml')
|
|
162
|
+
? reference
|
|
163
|
+
: `${reference}.yaml`;
|
|
164
|
+
return path.join(shippedScenariosDir(), stem);
|
|
165
|
+
}
|
|
166
|
+
return path.resolve(process.cwd(), reference);
|
|
167
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Config } from '../config';
|
|
2
|
+
import type { EnsembleSummary } from '../client/interface';
|
|
3
|
+
export type StepName = 'legacyHomeMigration' | 'preflight' | 'mcpConfig' | 'temporalReach' | 'searchAttrs' | 'daemonBoot' | 'badgeCollection';
|
|
4
|
+
/** Structured per-step result. `ok` = ran successfully; `skipped` = cache hit;
|
|
5
|
+
* `action-taken` = needed repair (e.g. started daemon, registered MCP);
|
|
6
|
+
* `failed` = non-fatal failure recorded for the TUI to surface. */
|
|
7
|
+
export interface StepOutcome {
|
|
8
|
+
status: 'ok' | 'skipped' | 'action-taken' | 'failed';
|
|
9
|
+
durationMs: number;
|
|
10
|
+
detail?: string;
|
|
11
|
+
}
|
|
12
|
+
export interface OutdatedVersionBadge {
|
|
13
|
+
latest: string;
|
|
14
|
+
severity: 'major' | 'minor';
|
|
15
|
+
}
|
|
16
|
+
export interface DaemonLogErrorsBadge {
|
|
17
|
+
count: number;
|
|
18
|
+
/** Up to 3 most recent ERROR lines from the daemon log tail. */
|
|
19
|
+
sample: string[];
|
|
20
|
+
logPath: string;
|
|
21
|
+
}
|
|
22
|
+
export interface BootstrapResult {
|
|
23
|
+
durationMs: number;
|
|
24
|
+
steps: Record<StepName, StepOutcome>;
|
|
25
|
+
badges: {
|
|
26
|
+
/** Orphan count from `queryOrphanedSessions` on this host. Always fresh. */
|
|
27
|
+
orphanCount: number;
|
|
28
|
+
/** Undefined = up-to-date, patch-only, or npm-check offline / timed out. */
|
|
29
|
+
outdatedVersion?: OutdatedVersionBadge;
|
|
30
|
+
/** Undefined = clean daemon-log tail. */
|
|
31
|
+
daemonLogErrors?: DaemonLogErrorsBadge;
|
|
32
|
+
};
|
|
33
|
+
/** Pre-fetched for HomeView's first render; TUI re-polls every 10s. */
|
|
34
|
+
ensembles: EnsembleSummary[];
|
|
35
|
+
cwd: string;
|
|
36
|
+
/** `null` when not in a git dir. */
|
|
37
|
+
cwdGitRoot: string | null;
|
|
38
|
+
}
|
|
39
|
+
export interface BootstrapArgs {
|
|
40
|
+
config: Config;
|
|
41
|
+
cwd?: string;
|
|
42
|
+
/** Injectable clock for tests. */
|
|
43
|
+
now?: () => number;
|
|
44
|
+
/** Injectable cache-path override for tests. Default: `AGENT_TEMPO_HOME`. */
|
|
45
|
+
cacheDir?: string;
|
|
46
|
+
/** Injectable npm-version fetcher for tests. Default: live registry fetch. */
|
|
47
|
+
fetchLatestVersion?: (pkgName: string, timeoutMs: number) => Promise<string | null>;
|
|
48
|
+
/** Binary version (defaults to `require('../../package.json').version`). Tests pin. */
|
|
49
|
+
binaryVersion?: string;
|
|
50
|
+
/**
|
|
51
|
+
* Inject step-5 daemon-boot. Default spawns the real daemon via
|
|
52
|
+
* `startDaemon` (up to 30s wait). Tests should always override to avoid
|
|
53
|
+
* spawning a real daemon process from the test harness. Returning
|
|
54
|
+
* `'skipped'` simulates "daemon already running"; `'action-taken'`
|
|
55
|
+
* simulates a successful start; `'failed'` + `detail` simulates failure.
|
|
56
|
+
*/
|
|
57
|
+
daemonBoot?: (config: Config) => Promise<StepOutcome>;
|
|
58
|
+
/**
|
|
59
|
+
* PR-2 of the v1.0 rebrand — one-shot copy of `~/.agent-tempo/` →
|
|
60
|
+
* `~/.agent-tempo/`. Runs once on first boot of the new binary; idempotent
|
|
61
|
+
* thereafter. Tests should override to avoid touching real $HOME.
|
|
62
|
+
*
|
|
63
|
+
* Failure here MUST NOT block the boot path — record `'failed'` with a
|
|
64
|
+
* detail string and let the rest of bootstrap proceed.
|
|
65
|
+
*/
|
|
66
|
+
legacyHomeMigration?: () => Promise<StepOutcome>;
|
|
67
|
+
/**
|
|
68
|
+
* Inject the Temporal reachability probe (steps 3 + 6). Tests override
|
|
69
|
+
* to avoid real network I/O — default performs `createTemporalConnection`
|
|
70
|
+
* with a 3s timeout. Returning `false` simulates unreachable;
|
|
71
|
+
* `true` simulates reachable (step 3 caches success, step 6 still
|
|
72
|
+
* attempts connect but is tolerant of failure).
|
|
73
|
+
*/
|
|
74
|
+
isTemporalReachable?: (config: Config) => Promise<boolean>;
|
|
75
|
+
}
|
|
76
|
+
type CacheStepKey = 'preflight' | 'mcpConfig' | 'temporalReach' | 'searchAttrs' | 'npmVersionCheck';
|
|
77
|
+
interface CacheStepEntry {
|
|
78
|
+
lastSuccess: string;
|
|
79
|
+
/** MCP config file mtime snapshot at last success — `mcpConfig` only. */
|
|
80
|
+
configMtime?: string;
|
|
81
|
+
/** Cached npm-registry result — `npmVersionCheck` only. */
|
|
82
|
+
result?: {
|
|
83
|
+
latest: string;
|
|
84
|
+
};
|
|
85
|
+
}
|
|
86
|
+
interface BootstrapCache {
|
|
87
|
+
schemaVersion: number;
|
|
88
|
+
binaryVersion: string;
|
|
89
|
+
steps: Partial<Record<CacheStepKey, CacheStepEntry>>;
|
|
90
|
+
}
|
|
91
|
+
/** Read the cache, validating schema + binary version. Any failure returns
|
|
92
|
+
* a fresh empty cache — malformed / upgrade-mismatched files are treated
|
|
93
|
+
* as a cache miss, the caller just does a cold bootstrap. */
|
|
94
|
+
export declare function readCache(cacheDir: string, binaryVersion: string): BootstrapCache;
|
|
95
|
+
/** Best-effort cache write; never throws (a cache failure must not break bootstrap). */
|
|
96
|
+
export declare function writeCache(cacheDir: string, cache: BootstrapCache): void;
|
|
97
|
+
/** Decide if a cached step is fresh enough to skip. `undefined` entry or
|
|
98
|
+
* `lastSuccess` older than `ttlMs` → stale. */
|
|
99
|
+
export declare function isCacheFresh(entry: CacheStepEntry | undefined, ttlMs: number, now: number): boolean;
|
|
100
|
+
/** Decide the outdated-version badge shape per the policy table:
|
|
101
|
+
* - major/minor behind → badge with severity
|
|
102
|
+
* - patch-only → silent
|
|
103
|
+
* - prerelease vs stable mismatches → silent (respect release channel)
|
|
104
|
+
*/
|
|
105
|
+
export declare function classifyVersion(installed: string, latest: string): OutdatedVersionBadge | undefined;
|
|
106
|
+
/**
|
|
107
|
+
* Run the 7-step auto-provisioning sequence. Returns a `BootstrapResult`
|
|
108
|
+
* the caller feeds to the TUI; step 7 (TUI launch) is the caller's
|
|
109
|
+
* handoff — this function does NOT spawn UI processes.
|
|
110
|
+
*/
|
|
111
|
+
export declare function bootstrap(args: BootstrapArgs): Promise<BootstrapResult>;
|
|
112
|
+
export {};
|