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,241 @@
|
|
|
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.dashboardCommand = dashboardCommand;
|
|
37
|
+
/**
|
|
38
|
+
* `agent-tempo dashboard` — open the packaged web dashboard,
|
|
39
|
+
* optionally minting a single-use pairing token + QR code for
|
|
40
|
+
* cross-device access. PR-8 of #340.
|
|
41
|
+
*
|
|
42
|
+
* **Critical constraint**: like {@link daemon-command}, this module
|
|
43
|
+
* must NOT import from `@temporalio/*`, `../workflows/*`, or any
|
|
44
|
+
* module that pulls in the Temporal SDK. The dashboard verb must
|
|
45
|
+
* remain operable when Temporal itself is broken (same #157
|
|
46
|
+
* reasoning: a stranded operator with a running daemon should still
|
|
47
|
+
* be able to run `agent-tempo dashboard` to see what's going on).
|
|
48
|
+
*
|
|
49
|
+
* Flow:
|
|
50
|
+
* 1. Resolve the daemon's port (port-file or `--port` override)
|
|
51
|
+
* 2. Probe `GET /v1/health` — if the daemon isn't running, exit 1
|
|
52
|
+
* with a hint to run `agent-tempo daemon start`
|
|
53
|
+
* 3. Print the dashboard URL
|
|
54
|
+
* 4. If `--pair`: POST `/dashboard/api/pair` (with the operator's
|
|
55
|
+
* bearer if any) → render a terminal QR + the URL with the
|
|
56
|
+
* `?pair=<token>` fragment. The user scans from their phone.
|
|
57
|
+
* 5. Unless `--no-open`, spawn the platform browser-opener so the
|
|
58
|
+
* dashboard shows up immediately.
|
|
59
|
+
*
|
|
60
|
+
* Output modes:
|
|
61
|
+
* - default: human-readable colored
|
|
62
|
+
* - `--json`: single JSON object on stdout, no banners — for
|
|
63
|
+
* scripts and CI
|
|
64
|
+
*/
|
|
65
|
+
const http_1 = require("http");
|
|
66
|
+
const child_process_1 = require("child_process");
|
|
67
|
+
const port_file_1 = require("../http/port-file");
|
|
68
|
+
const out = __importStar(require("./output"));
|
|
69
|
+
const DEFAULT_BIND = '127.0.0.1';
|
|
70
|
+
/**
|
|
71
|
+
* Public entry point — invoked by the CLI dispatcher. Returns void;
|
|
72
|
+
* exits the process with code 1 on error, 0 on success.
|
|
73
|
+
*/
|
|
74
|
+
async function dashboardCommand(args) {
|
|
75
|
+
const port = await resolvePort(args, args.json ?? false);
|
|
76
|
+
if (port === null)
|
|
77
|
+
return; // resolvePort already exited
|
|
78
|
+
const bind = args.bind ?? DEFAULT_BIND;
|
|
79
|
+
const baseUrl = `http://${bind}:${port}`;
|
|
80
|
+
const healthy = await probeHealth(baseUrl);
|
|
81
|
+
if (!healthy) {
|
|
82
|
+
return emitError(args.json ?? false, {
|
|
83
|
+
error: 'daemon-not-reachable',
|
|
84
|
+
hint: `No response from ${baseUrl}/v1/health. Run \`agent-tempo daemon start\` and retry.`,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
const dashboardUrl = `${baseUrl}/dashboard/`;
|
|
88
|
+
let pairResult = null;
|
|
89
|
+
if (args.pair) {
|
|
90
|
+
const minted = await mintPairToken(baseUrl, args.bearer);
|
|
91
|
+
if (!minted.ok) {
|
|
92
|
+
return emitError(args.json ?? false, {
|
|
93
|
+
error: 'pair-mint-failed',
|
|
94
|
+
hint: minted.reason,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
pairResult = {
|
|
98
|
+
url: `${dashboardUrl}?pair=${encodeURIComponent(minted.token)}`,
|
|
99
|
+
expiresAt: minted.expiresAt,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
if (args.json) {
|
|
103
|
+
const payload = {
|
|
104
|
+
ok: true,
|
|
105
|
+
url: dashboardUrl,
|
|
106
|
+
...(pairResult ? { pair: pairResult } : {}),
|
|
107
|
+
};
|
|
108
|
+
out.log(JSON.stringify(payload));
|
|
109
|
+
return;
|
|
110
|
+
}
|
|
111
|
+
// Human-readable output
|
|
112
|
+
out.heading('agent-tempo dashboard');
|
|
113
|
+
out.log(` ${out.cyan(dashboardUrl)}`);
|
|
114
|
+
if (pairResult) {
|
|
115
|
+
out.log('');
|
|
116
|
+
out.log(` ${out.bold('Cross-device pair:')}`);
|
|
117
|
+
out.log(` ${out.cyan(pairResult.url)}`);
|
|
118
|
+
out.log(` ${out.dim(`Token expires at ${new Date(pairResult.expiresAt).toLocaleTimeString()} (single-use, 5-min TTL)`)}`);
|
|
119
|
+
await renderQr(pairResult.url);
|
|
120
|
+
}
|
|
121
|
+
if (!args.noOpen) {
|
|
122
|
+
openInBrowser(dashboardUrl);
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
out.log('');
|
|
126
|
+
out.log(` ${out.dim('--no-open: not launching browser')}`);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
async function resolvePort(args, json) {
|
|
130
|
+
if (typeof args.port === 'number' && args.port > 0)
|
|
131
|
+
return args.port;
|
|
132
|
+
const fromFile = (0, port_file_1.readPortFile)();
|
|
133
|
+
if (fromFile !== null)
|
|
134
|
+
return fromFile;
|
|
135
|
+
emitError(json, {
|
|
136
|
+
error: 'no-port',
|
|
137
|
+
hint: 'No daemon port file. Pass --port <N> or run `agent-tempo daemon start` first.',
|
|
138
|
+
});
|
|
139
|
+
return null;
|
|
140
|
+
}
|
|
141
|
+
async function probeHealth(baseUrl) {
|
|
142
|
+
return new Promise((resolve) => {
|
|
143
|
+
const req = (0, http_1.request)(`${baseUrl}/v1/health`, { method: 'GET', timeout: 3000 }, (res) => {
|
|
144
|
+
// Drain to avoid leaving the socket open.
|
|
145
|
+
res.resume();
|
|
146
|
+
resolve(res.statusCode === 200);
|
|
147
|
+
});
|
|
148
|
+
req.on('error', () => resolve(false));
|
|
149
|
+
req.on('timeout', () => {
|
|
150
|
+
req.destroy();
|
|
151
|
+
resolve(false);
|
|
152
|
+
});
|
|
153
|
+
req.end();
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
async function mintPairToken(baseUrl, bearer) {
|
|
157
|
+
return new Promise((resolve) => {
|
|
158
|
+
const headers = { 'Content-Length': '0' };
|
|
159
|
+
if (bearer)
|
|
160
|
+
headers.Authorization = `Bearer ${bearer}`;
|
|
161
|
+
const req = (0, http_1.request)(`${baseUrl}/dashboard/api/pair`, { method: 'POST', headers, timeout: 3000 }, (res) => {
|
|
162
|
+
let body = '';
|
|
163
|
+
res.setEncoding('utf8');
|
|
164
|
+
res.on('data', (chunk) => { body += chunk; });
|
|
165
|
+
res.on('end', () => {
|
|
166
|
+
if (res.statusCode === 201) {
|
|
167
|
+
try {
|
|
168
|
+
const parsed = JSON.parse(body);
|
|
169
|
+
return resolve({ ok: true, token: parsed.token, expiresAt: parsed.expiresAt });
|
|
170
|
+
}
|
|
171
|
+
catch (err) {
|
|
172
|
+
return resolve({ ok: false, reason: `malformed pair response: ${err instanceof Error ? err.message : String(err)}` });
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (res.statusCode === 401)
|
|
176
|
+
return resolve({ ok: false, reason: 'unauthorized — pass --bearer <token> or run on the host without bearer auth' });
|
|
177
|
+
if (res.statusCode === 400)
|
|
178
|
+
return resolve({ ok: false, reason: 'pair flow requires bearer auth (loopback skips this)' });
|
|
179
|
+
resolve({ ok: false, reason: `unexpected status ${res.statusCode}: ${body}` });
|
|
180
|
+
});
|
|
181
|
+
});
|
|
182
|
+
req.on('error', (err) => resolve({ ok: false, reason: err.message }));
|
|
183
|
+
req.on('timeout', () => {
|
|
184
|
+
req.destroy();
|
|
185
|
+
resolve({ ok: false, reason: 'request timed out' });
|
|
186
|
+
});
|
|
187
|
+
req.end();
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Render a QR code in the terminal. `qrcode-terminal` is loaded
|
|
192
|
+
* lazily so the require cost only hits operators who pass `--pair`.
|
|
193
|
+
* The package may not be installed in development checkouts that
|
|
194
|
+
* skipped optional deps; surface a graceful fallback.
|
|
195
|
+
*/
|
|
196
|
+
async function renderQr(url) {
|
|
197
|
+
try {
|
|
198
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
199
|
+
const qrcode = require('qrcode-terminal');
|
|
200
|
+
await new Promise((resolve) => {
|
|
201
|
+
qrcode.generate(url, { small: true }, (rendered) => {
|
|
202
|
+
out.log('');
|
|
203
|
+
out.log(rendered);
|
|
204
|
+
resolve();
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
}
|
|
208
|
+
catch {
|
|
209
|
+
out.warn('qrcode-terminal not available — copy the URL above into your phone instead.');
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Open `url` in the operator's default browser via the platform's
|
|
214
|
+
* standard launcher. Best-effort — failures are logged but don't
|
|
215
|
+
* block the command's success path (the URL is already printed).
|
|
216
|
+
*/
|
|
217
|
+
function openInBrowser(url) {
|
|
218
|
+
const cmd = process.platform === 'darwin' ? 'open' :
|
|
219
|
+
process.platform === 'win32' ? 'cmd' :
|
|
220
|
+
'xdg-open';
|
|
221
|
+
const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
|
|
222
|
+
try {
|
|
223
|
+
const child = (0, child_process_1.spawn)(cmd, args, { detached: true, stdio: 'ignore' });
|
|
224
|
+
child.unref();
|
|
225
|
+
}
|
|
226
|
+
catch (err) {
|
|
227
|
+
out.warn(`could not launch browser (${err instanceof Error ? err.message : String(err)}); open the URL manually`);
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
function emitError(json, body) {
|
|
231
|
+
if (json) {
|
|
232
|
+
const payload = { ok: false, ...body };
|
|
233
|
+
out.log(JSON.stringify(payload));
|
|
234
|
+
}
|
|
235
|
+
else {
|
|
236
|
+
out.error(body.error);
|
|
237
|
+
if (body.hint)
|
|
238
|
+
out.log(` ${out.dim(body.hint)}`);
|
|
239
|
+
}
|
|
240
|
+
process.exit(1);
|
|
241
|
+
}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { type ConfigSource } from '../config';
|
|
2
|
+
/**
|
|
3
|
+
* Render `<homedir>/foo/bar` as `~/foo/bar` for human-readable banner
|
|
4
|
+
* output. Falls back to the absolute path when it doesn't live under the
|
|
5
|
+
* user's home dir (e.g. `AGENT_TEMPO_HOME_OVERRIDE=/tmp/scratch`).
|
|
6
|
+
*
|
|
7
|
+
* Exported for unit testing — banner output is checked against this
|
|
8
|
+
* formatter so the test fixtures don't bake in a developer's username.
|
|
9
|
+
*/
|
|
10
|
+
export declare function prettyPath(absPath: string, home?: string): string;
|
|
11
|
+
/** Inputs to {@link formatDevBanner}. Exposed so tests can pin every value. */
|
|
12
|
+
export interface DevBannerInputs {
|
|
13
|
+
/** Resolved home dir; defaults to `AGENT_TEMPO_HOME`. */
|
|
14
|
+
home?: string;
|
|
15
|
+
/** Daemon port; defaults to {@link DEV_DAEMON_PORT}. */
|
|
16
|
+
port?: number;
|
|
17
|
+
/** Temporal namespace; defaults to {@link DEV_TEMPORAL_NAMESPACE}. */
|
|
18
|
+
namespace?: string;
|
|
19
|
+
/** Source of the namespace value; annotates the banner when provided. */
|
|
20
|
+
namespaceSource?: ConfigSource;
|
|
21
|
+
/** Task queue; defaults to {@link DEV_TASK_QUEUE}. */
|
|
22
|
+
taskQueue?: string;
|
|
23
|
+
/**
|
|
24
|
+
* Source of the task queue value. Only `'env'` and `'default'` are
|
|
25
|
+
* possible today (queue resolution is hardcoded — env var wins, dev/prod
|
|
26
|
+
* default fills in), but the type widens to {@link ConfigSource} so a
|
|
27
|
+
* future PR-B carve-out has somewhere to land without a type change.
|
|
28
|
+
*/
|
|
29
|
+
taskQueueSource?: ConfigSource;
|
|
30
|
+
/**
|
|
31
|
+
* Override `homedir()` resolution for path prettification. Tests pass an
|
|
32
|
+
* explicit value to keep fixtures stable across machines.
|
|
33
|
+
*/
|
|
34
|
+
homedirOverride?: string;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Format the single-line `[DEV MODE]` banner. Pure function — no I/O.
|
|
38
|
+
*
|
|
39
|
+
* [DEV MODE] using ~/.agent-tempo-dev · port 8474 · namespace agent-tempo-dev (default) · queue agent-tempo-dev (default)
|
|
40
|
+
*
|
|
41
|
+
* After a leak the banner self-narrates the drift:
|
|
42
|
+
*
|
|
43
|
+
* [DEV MODE] using ~/.agent-tempo-dev · port 8474 · namespace default (env) · queue agent-tempo-dev (default)
|
|
44
|
+
*
|
|
45
|
+
* The `[DEV MODE]` prefix is rendered with ANSI yellow + bold when stdout
|
|
46
|
+
* is a TTY (`out.bold`/`out.yellow` handle the `NO_COLOR` / non-TTY
|
|
47
|
+
* fallback). The remainder is plain text so it greps cleanly out of
|
|
48
|
+
* `~/.agent-tempo-dev/daemon.log`.
|
|
49
|
+
*
|
|
50
|
+
* Production callers go through {@link emitDevBannerIfActive}, which
|
|
51
|
+
* resolves the inputs from {@link getConfigWithSources}. Tests pin every
|
|
52
|
+
* input to keep fixtures deterministic.
|
|
53
|
+
*/
|
|
54
|
+
export declare function formatDevBanner(inputs?: DevBannerInputs): string;
|
|
55
|
+
/**
|
|
56
|
+
* Resolve the runtime inputs the banner should display. Reads from
|
|
57
|
+
* {@link getConfigWithSources} so the printed values match what the daemon
|
|
58
|
+
* actually connects to. On any resolution error (e.g. invalid ensemble
|
|
59
|
+
* name throwing out of `getConfig`'s validator), falls back to the dev
|
|
60
|
+
* profile's hardcoded constants — the banner is best-effort diagnostics
|
|
61
|
+
* and must not be load-bearing for daemon startup.
|
|
62
|
+
*
|
|
63
|
+
* Exported for unit testing without monkey-patching the config module.
|
|
64
|
+
*
|
|
65
|
+
* @internal
|
|
66
|
+
*/
|
|
67
|
+
export declare function resolveDevBannerInputs(): DevBannerInputs;
|
|
68
|
+
/**
|
|
69
|
+
* Convenience: emit the banner to stderr if `isDevMode()` is true,
|
|
70
|
+
* otherwise no-op. Stderr (not stdout) so the banner doesn't pollute
|
|
71
|
+
* commands whose stdout is captured by callers (e.g. `agent-tempo
|
|
72
|
+
* --dev recall --json …`).
|
|
73
|
+
*
|
|
74
|
+
* Resolves the displayed values from {@link getConfigWithSources} so the
|
|
75
|
+
* banner reflects what the daemon ACTUALLY connects to. The previous
|
|
76
|
+
* implementation read the dev profile's hardcoded constants directly, so
|
|
77
|
+
* a `TEMPORAL_NAMESPACE=default` shell export silently disagreed with the
|
|
78
|
+
* banner (#423).
|
|
79
|
+
*
|
|
80
|
+
* Called from:
|
|
81
|
+
* - `src/cli.ts` (every dev-mode CLI invocation)
|
|
82
|
+
* - `src/cli/daemon-command.ts` (dev daemon start)
|
|
83
|
+
* - `src/daemon.ts` (daemon child process startup)
|
|
84
|
+
*/
|
|
85
|
+
export declare function emitDevBannerIfActive(): void;
|
|
86
|
+
/**
|
|
87
|
+
* Production banner counterpart used only by tests — verifies the negative
|
|
88
|
+
* case (env var unset → empty string). Production callers always go through
|
|
89
|
+
* `emitDevBannerIfActive()` which short-circuits when not in dev mode.
|
|
90
|
+
*
|
|
91
|
+
* Exported for `tests/cli/dev-banner.test.ts` so the test asserts both
|
|
92
|
+
* positive ("dev mode renders banner") AND negative ("not in dev mode
|
|
93
|
+
* renders nothing") branches without duplicating the env-var-toggling
|
|
94
|
+
* scaffolding.
|
|
95
|
+
*/
|
|
96
|
+
export declare function devBannerOrEmpty(): string;
|
|
97
|
+
/**
|
|
98
|
+
* Single-line summary of the prod defaults — used by tests to confirm
|
|
99
|
+
* that the dev banner doesn't accidentally pick up production values.
|
|
100
|
+
*
|
|
101
|
+
* @internal
|
|
102
|
+
*/
|
|
103
|
+
export declare const PROD_DEFAULTS_FOR_TESTS: {
|
|
104
|
+
readonly port: 8473;
|
|
105
|
+
readonly namespace: "default";
|
|
106
|
+
readonly taskQueue: "agent-tempo";
|
|
107
|
+
};
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PROD_DEFAULTS_FOR_TESTS = void 0;
|
|
4
|
+
exports.prettyPath = prettyPath;
|
|
5
|
+
exports.formatDevBanner = formatDevBanner;
|
|
6
|
+
exports.resolveDevBannerInputs = resolveDevBannerInputs;
|
|
7
|
+
exports.emitDevBannerIfActive = emitDevBannerIfActive;
|
|
8
|
+
exports.devBannerOrEmpty = devBannerOrEmpty;
|
|
9
|
+
/**
|
|
10
|
+
* `[DEV MODE]` banner formatter (ADR 0014 §5.4 — gate 4 of production
|
|
11
|
+
* safety). Single conspicuous header line, printed on every CLI invocation
|
|
12
|
+
* in dev mode and on every dev daemon startup so logs self-identify.
|
|
13
|
+
*
|
|
14
|
+
* Crash-proof: imports only `os` and `../config`. No Temporal, no rxjs.
|
|
15
|
+
* Safe to call from `src/cli/daemon-command.ts` and `src/cli.ts` without
|
|
16
|
+
* breaking the #157 isolation guarantee.
|
|
17
|
+
*
|
|
18
|
+
* **Load-bearing invariant (#423 PR-A).** The banner output MUST reflect
|
|
19
|
+
* the daemon's actual resolved config — any divergence is a silent
|
|
20
|
+
* coordination bug. `formatDevBanner` stays pure (testable) over
|
|
21
|
+
* caller-injected inputs; `emitDevBannerIfActive` owns the resolution.
|
|
22
|
+
* Source annotations are uniform across all fields so a leak shows up as
|
|
23
|
+
* a single-character diff (`(default)` → `(env)`) rather than requiring
|
|
24
|
+
* the operator to know what "no annotation" means.
|
|
25
|
+
*/
|
|
26
|
+
const os_1 = require("os");
|
|
27
|
+
const config_1 = require("../config");
|
|
28
|
+
const output_1 = require("./output");
|
|
29
|
+
/**
|
|
30
|
+
* Render `<homedir>/foo/bar` as `~/foo/bar` for human-readable banner
|
|
31
|
+
* output. Falls back to the absolute path when it doesn't live under the
|
|
32
|
+
* user's home dir (e.g. `AGENT_TEMPO_HOME_OVERRIDE=/tmp/scratch`).
|
|
33
|
+
*
|
|
34
|
+
* Exported for unit testing — banner output is checked against this
|
|
35
|
+
* formatter so the test fixtures don't bake in a developer's username.
|
|
36
|
+
*/
|
|
37
|
+
function prettyPath(absPath, home = (0, os_1.homedir)()) {
|
|
38
|
+
if (!home)
|
|
39
|
+
return absPath;
|
|
40
|
+
if (absPath === home)
|
|
41
|
+
return '~';
|
|
42
|
+
// Always check both `/` and `\` separators regardless of the host OS.
|
|
43
|
+
// The function is sometimes called on POSIX with Windows-shaped path
|
|
44
|
+
// strings (e.g. unit tests that fix a fixture homedir of `C:\Users\alice`,
|
|
45
|
+
// or env-var values that escaped from a Windows shell). Using the
|
|
46
|
+
// platform's `path.sep` alone would leave half of those cases broken.
|
|
47
|
+
const trailers = ['/', '\\'];
|
|
48
|
+
for (const trailer of trailers) {
|
|
49
|
+
const prefix = home + trailer;
|
|
50
|
+
if (absPath.startsWith(prefix)) {
|
|
51
|
+
return '~/' + absPath.slice(prefix.length).replace(/\\/g, '/');
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return absPath;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Annotate a banner field with its source. Always emits the `(source)`
|
|
58
|
+
* suffix when a source is provided so the banner is uniformly diagnostic
|
|
59
|
+
* — every field tells the operator where its value came from. `'none'`
|
|
60
|
+
* suppresses the annotation (the value couldn't be resolved at all, so
|
|
61
|
+
* a source label would be misleading).
|
|
62
|
+
*
|
|
63
|
+
* The architect's `docs/design/dev-mode-isolation-fix-423.md` example:
|
|
64
|
+
*
|
|
65
|
+
* `namespace agent-tempo-dev (default) · queue agent-tempo-dev (default)`
|
|
66
|
+
*
|
|
67
|
+
* After a leak this becomes `namespace default (env)` — operator instantly
|
|
68
|
+
* sees what changed. If we suppressed `(default)` they'd have to know
|
|
69
|
+
* what "no annotation" means before they could spot the drift.
|
|
70
|
+
*/
|
|
71
|
+
function annotateField(name, value, source) {
|
|
72
|
+
if (!source || source === 'none')
|
|
73
|
+
return `${name} ${value}`;
|
|
74
|
+
return `${name} ${value} (${source})`;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Format the single-line `[DEV MODE]` banner. Pure function — no I/O.
|
|
78
|
+
*
|
|
79
|
+
* [DEV MODE] using ~/.agent-tempo-dev · port 8474 · namespace agent-tempo-dev (default) · queue agent-tempo-dev (default)
|
|
80
|
+
*
|
|
81
|
+
* After a leak the banner self-narrates the drift:
|
|
82
|
+
*
|
|
83
|
+
* [DEV MODE] using ~/.agent-tempo-dev · port 8474 · namespace default (env) · queue agent-tempo-dev (default)
|
|
84
|
+
*
|
|
85
|
+
* The `[DEV MODE]` prefix is rendered with ANSI yellow + bold when stdout
|
|
86
|
+
* is a TTY (`out.bold`/`out.yellow` handle the `NO_COLOR` / non-TTY
|
|
87
|
+
* fallback). The remainder is plain text so it greps cleanly out of
|
|
88
|
+
* `~/.agent-tempo-dev/daemon.log`.
|
|
89
|
+
*
|
|
90
|
+
* Production callers go through {@link emitDevBannerIfActive}, which
|
|
91
|
+
* resolves the inputs from {@link getConfigWithSources}. Tests pin every
|
|
92
|
+
* input to keep fixtures deterministic.
|
|
93
|
+
*/
|
|
94
|
+
function formatDevBanner(inputs = {}) {
|
|
95
|
+
const home = inputs.home ?? config_1.AGENT_TEMPO_HOME;
|
|
96
|
+
const port = inputs.port ?? config_1.DEV_DAEMON_PORT;
|
|
97
|
+
const namespace = inputs.namespace ?? config_1.DEV_TEMPORAL_NAMESPACE;
|
|
98
|
+
const taskQueue = inputs.taskQueue ?? config_1.DEV_TASK_QUEUE;
|
|
99
|
+
const display = prettyPath(home, inputs.homedirOverride);
|
|
100
|
+
const namespaceField = annotateField('namespace', namespace, inputs.namespaceSource);
|
|
101
|
+
const queueField = annotateField('queue', taskQueue, inputs.taskQueueSource);
|
|
102
|
+
return (`${(0, output_1.bold)((0, output_1.yellow)('[DEV MODE]'))} using ${display} · ` +
|
|
103
|
+
`port ${port} · ${namespaceField} · ${queueField}`);
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Resolve the runtime inputs the banner should display. Reads from
|
|
107
|
+
* {@link getConfigWithSources} so the printed values match what the daemon
|
|
108
|
+
* actually connects to. On any resolution error (e.g. invalid ensemble
|
|
109
|
+
* name throwing out of `getConfig`'s validator), falls back to the dev
|
|
110
|
+
* profile's hardcoded constants — the banner is best-effort diagnostics
|
|
111
|
+
* and must not be load-bearing for daemon startup.
|
|
112
|
+
*
|
|
113
|
+
* Exported for unit testing without monkey-patching the config module.
|
|
114
|
+
*
|
|
115
|
+
* @internal
|
|
116
|
+
*/
|
|
117
|
+
function resolveDevBannerInputs() {
|
|
118
|
+
// `taskQueue` source isn't tracked by `getConfigWithSources` (queue
|
|
119
|
+
// resolution lives directly in `getConfig`'s constructor). Compute it
|
|
120
|
+
// here so the banner annotates it uniformly with the namespace source.
|
|
121
|
+
const taskQueueSource = process.env[config_1.ENV.TASK_QUEUE] ? 'env' : 'default';
|
|
122
|
+
try {
|
|
123
|
+
const { config, sources } = (0, config_1.getConfigWithSources)();
|
|
124
|
+
return {
|
|
125
|
+
namespace: config.temporalNamespace,
|
|
126
|
+
namespaceSource: sources.temporalNamespace,
|
|
127
|
+
taskQueue: config.taskQueue,
|
|
128
|
+
taskQueueSource,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
catch (err) {
|
|
132
|
+
// `getConfigWithSources` validates the ensemble name and may throw
|
|
133
|
+
// when an operator has e.g. invalid characters in `$AGENT_TEMPO_ENSEMBLE`.
|
|
134
|
+
// Surface the cause to stderr — the banner stays diagnostic and the
|
|
135
|
+
// operator sees that the displayed values are dev defaults, not the
|
|
136
|
+
// actual resolution. The CLI surfaces the same validation error a
|
|
137
|
+
// moment later, so the duplicate isn't noisy enough to suppress.
|
|
138
|
+
console.error('[dev-mode] banner falling back to defaults — config resolution failed:', err instanceof Error ? err.message : String(err));
|
|
139
|
+
return { taskQueueSource };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Convenience: emit the banner to stderr if `isDevMode()` is true,
|
|
144
|
+
* otherwise no-op. Stderr (not stdout) so the banner doesn't pollute
|
|
145
|
+
* commands whose stdout is captured by callers (e.g. `agent-tempo
|
|
146
|
+
* --dev recall --json …`).
|
|
147
|
+
*
|
|
148
|
+
* Resolves the displayed values from {@link getConfigWithSources} so the
|
|
149
|
+
* banner reflects what the daemon ACTUALLY connects to. The previous
|
|
150
|
+
* implementation read the dev profile's hardcoded constants directly, so
|
|
151
|
+
* a `TEMPORAL_NAMESPACE=default` shell export silently disagreed with the
|
|
152
|
+
* banner (#423).
|
|
153
|
+
*
|
|
154
|
+
* Called from:
|
|
155
|
+
* - `src/cli.ts` (every dev-mode CLI invocation)
|
|
156
|
+
* - `src/cli/daemon-command.ts` (dev daemon start)
|
|
157
|
+
* - `src/daemon.ts` (daemon child process startup)
|
|
158
|
+
*/
|
|
159
|
+
function emitDevBannerIfActive() {
|
|
160
|
+
if (!(0, config_1.isDevMode)())
|
|
161
|
+
return;
|
|
162
|
+
// stderr keeps stdout clean for `--json` / pipe consumers. Same reasoning
|
|
163
|
+
// as `out.error` / `out.warn`. Ship it via console.error directly so we
|
|
164
|
+
// don't depend on `out.log` (which writes to stdout).
|
|
165
|
+
console.error(formatDevBanner(resolveDevBannerInputs()));
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Production banner counterpart used only by tests — verifies the negative
|
|
169
|
+
* case (env var unset → empty string). Production callers always go through
|
|
170
|
+
* `emitDevBannerIfActive()` which short-circuits when not in dev mode.
|
|
171
|
+
*
|
|
172
|
+
* Exported for `tests/cli/dev-banner.test.ts` so the test asserts both
|
|
173
|
+
* positive ("dev mode renders banner") AND negative ("not in dev mode
|
|
174
|
+
* renders nothing") branches without duplicating the env-var-toggling
|
|
175
|
+
* scaffolding.
|
|
176
|
+
*/
|
|
177
|
+
function devBannerOrEmpty() {
|
|
178
|
+
return (0, config_1.isDevMode)() ? formatDevBanner(resolveDevBannerInputs()) : '';
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Single-line summary of the prod defaults — used by tests to confirm
|
|
182
|
+
* that the dev banner doesn't accidentally pick up production values.
|
|
183
|
+
*
|
|
184
|
+
* @internal
|
|
185
|
+
*/
|
|
186
|
+
exports.PROD_DEFAULTS_FOR_TESTS = {
|
|
187
|
+
port: config_1.PROD_DAEMON_PORT,
|
|
188
|
+
namespace: config_1.PROD_TEMPORAL_NAMESPACE,
|
|
189
|
+
taskQueue: config_1.PROD_TASK_QUEUE,
|
|
190
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-import side-effect that promotes a top-level `--dev` CLI flag into
|
|
3
|
+
* `AGENT_TEMPO_DEV_MODE=1` BEFORE any other module loads (ADR 0014 §5.4).
|
|
4
|
+
*
|
|
5
|
+
* **Why this file exists**: `src/cli.ts` imports `./config` statically, and
|
|
6
|
+
* `src/config.ts` evaluates `AGENT_TEMPO_HOME = resolveTempoHome()` at
|
|
7
|
+
* module load time. By the time the main argv parser runs, that constant
|
|
8
|
+
* has already been frozen against `~/.agent-tempo/`. The bootstrap mutates
|
|
9
|
+
* `process.env` early — before the static `./config` import resolves — so
|
|
10
|
+
* the dev profile lights up everywhere downstream consistently.
|
|
11
|
+
*
|
|
12
|
+
* Imported as the very first statement of `src/cli.ts`. Has zero imports
|
|
13
|
+
* (not even `./config`) so it can run before any other module loads. This
|
|
14
|
+
* file MUST stay dependency-free; if you find yourself wanting to import
|
|
15
|
+
* something here, put it in `src/cli/dev-banner.ts` instead.
|
|
16
|
+
*
|
|
17
|
+
* Side effects:
|
|
18
|
+
* 1. If `--dev` appears anywhere in `process.argv`, set
|
|
19
|
+
* `process.env.AGENT_TEMPO_DEV_MODE='1'`.
|
|
20
|
+
* 2. Strip `--dev` from `process.argv` so the main parser doesn't reject
|
|
21
|
+
* it as unknown.
|
|
22
|
+
*
|
|
23
|
+
* Daemon child processes inherit `AGENT_TEMPO_DEV_MODE` automatically via
|
|
24
|
+
* `spawn(..., { env: { ...process.env } })` in `src/cli/daemon.ts`. Users
|
|
25
|
+
* can also bypass the flag entirely by setting `AGENT_TEMPO_DEV_MODE=1`
|
|
26
|
+
* directly in their shell — useful for MCP server processes that aren't
|
|
27
|
+
* launched via the CLI.
|
|
28
|
+
*/
|
|
29
|
+
export {};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Pre-import side-effect that promotes a top-level `--dev` CLI flag into
|
|
4
|
+
* `AGENT_TEMPO_DEV_MODE=1` BEFORE any other module loads (ADR 0014 §5.4).
|
|
5
|
+
*
|
|
6
|
+
* **Why this file exists**: `src/cli.ts` imports `./config` statically, and
|
|
7
|
+
* `src/config.ts` evaluates `AGENT_TEMPO_HOME = resolveTempoHome()` at
|
|
8
|
+
* module load time. By the time the main argv parser runs, that constant
|
|
9
|
+
* has already been frozen against `~/.agent-tempo/`. The bootstrap mutates
|
|
10
|
+
* `process.env` early — before the static `./config` import resolves — so
|
|
11
|
+
* the dev profile lights up everywhere downstream consistently.
|
|
12
|
+
*
|
|
13
|
+
* Imported as the very first statement of `src/cli.ts`. Has zero imports
|
|
14
|
+
* (not even `./config`) so it can run before any other module loads. This
|
|
15
|
+
* file MUST stay dependency-free; if you find yourself wanting to import
|
|
16
|
+
* something here, put it in `src/cli/dev-banner.ts` instead.
|
|
17
|
+
*
|
|
18
|
+
* Side effects:
|
|
19
|
+
* 1. If `--dev` appears anywhere in `process.argv`, set
|
|
20
|
+
* `process.env.AGENT_TEMPO_DEV_MODE='1'`.
|
|
21
|
+
* 2. Strip `--dev` from `process.argv` so the main parser doesn't reject
|
|
22
|
+
* it as unknown.
|
|
23
|
+
*
|
|
24
|
+
* Daemon child processes inherit `AGENT_TEMPO_DEV_MODE` automatically via
|
|
25
|
+
* `spawn(..., { env: { ...process.env } })` in `src/cli/daemon.ts`. Users
|
|
26
|
+
* can also bypass the flag entirely by setting `AGENT_TEMPO_DEV_MODE=1`
|
|
27
|
+
* directly in their shell — useful for MCP server processes that aren't
|
|
28
|
+
* launched via the CLI.
|
|
29
|
+
*/
|
|
30
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
31
|
+
const DEV_FLAG = '--dev';
|
|
32
|
+
const idx = process.argv.indexOf(DEV_FLAG);
|
|
33
|
+
if (idx !== -1) {
|
|
34
|
+
process.env.AGENT_TEMPO_DEV_MODE = '1';
|
|
35
|
+
process.argv.splice(idx, 1);
|
|
36
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dev-mode scriptable CLI verbs (#432).
|
|
3
|
+
*
|
|
4
|
+
* Five thin shell-scriptable wrappers over the MCP tool surface, available
|
|
5
|
+
* only when `--dev` / `AGENT_TEMPO_DEV_MODE=1` is active. Production CLI
|
|
6
|
+
* was collapsed to TUI/MCP-only in #288; this module restores
|
|
7
|
+
* shell-scriptable access for autonomous E2E validation harnesses without
|
|
8
|
+
* re-introducing the public surface that #288 retired.
|
|
9
|
+
*
|
|
10
|
+
* ## Allowlist discipline
|
|
11
|
+
*
|
|
12
|
+
* `DEV_VERBS` is an explicit `ReadonlySet<string>`, NOT derived from
|
|
13
|
+
* `REMOVED_VERBS` keys. Promoting a removed verb to a dev-mode verb must
|
|
14
|
+
* be a deliberate, code-reviewed action. The mechanical-enforcement test
|
|
15
|
+
* in `test/cli-dev-verbs.test.ts` asserts the DEV_VERBS ↔ REMOVED_VERBS
|
|
16
|
+
* ↔ `cli.ts` switch invariants.
|
|
17
|
+
*
|
|
18
|
+
* ## NOT crash-proof
|
|
19
|
+
*
|
|
20
|
+
* This module touches Temporal directly. It is deliberately excluded from
|
|
21
|
+
* `test/cli-crash-proof-isolation.test.ts`'s `CRASH_PROOF_MODULES` allowlist
|
|
22
|
+
* — dev mode requires Temporal anyway.
|
|
23
|
+
*/
|
|
24
|
+
import { CliOverrides } from '../config';
|
|
25
|
+
/** Allowlist of verbs accepted in dev mode. Single source of truth. */
|
|
26
|
+
export declare const DEV_VERBS: ReadonlySet<string>;
|
|
27
|
+
/**
|
|
28
|
+
* Subset of {@link import('../cli').ParsedArgs} consumed by the dispatcher.
|
|
29
|
+
* Kept narrow so this module doesn't import `../cli` (would be cyclic).
|
|
30
|
+
*/
|
|
31
|
+
export interface DevVerbArgs extends CliOverrides {
|
|
32
|
+
/** All non-flag tokens, including `args.positional[0] === args.command`. */
|
|
33
|
+
positional: string[];
|
|
34
|
+
/** Resolved ensemble (positional override / env fallback). */
|
|
35
|
+
ensemble: string;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Dispatch a dev-mode verb. Caller (`cli.ts`) gates on `isDevMode()` +
|
|
39
|
+
* `DEV_VERBS.has(verb)` before calling. Throws `Error` for unknown verbs
|
|
40
|
+
* — the mechanical test in `cli-dev-verbs.test.ts` asserts that this
|
|
41
|
+
* is unreachable in practice.
|
|
42
|
+
*/
|
|
43
|
+
export declare function dispatchDevVerb(verb: string, args: DevVerbArgs): Promise<void>;
|