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,170 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.probeAdapterVersions = probeAdapterVersions;
|
|
4
|
+
exports.resolveCopilotSdkVersionSync = resolveCopilotSdkVersionSync;
|
|
5
|
+
/**
|
|
6
|
+
* Probe upstream tool versions for the adapters this daemon ships.
|
|
7
|
+
* Issue #399 Q5.4 — `HostProfile.adapterVersions`.
|
|
8
|
+
*
|
|
9
|
+
* Runs once at daemon boot, in parallel with `ensureGlobalMaestro`, so
|
|
10
|
+
* the host-profile signal can advertise something like:
|
|
11
|
+
*
|
|
12
|
+
* { "claude-code": "1.2.4", "copilot": "0.5.2" }
|
|
13
|
+
*
|
|
14
|
+
* Adapter probes:
|
|
15
|
+
* - **claude-code** — shells out to `claude --version` and pulls the
|
|
16
|
+
* first `MAJOR.MINOR.PATCH` triple via a defensive regex. Claude
|
|
17
|
+
* Code's `--version` output isn't part of its public API contract
|
|
18
|
+
* (the format may change between releases); on parse failure or
|
|
19
|
+
* spawn failure we omit the entry, and the dashboard renders `—`.
|
|
20
|
+
* - **copilot** — reads `@github/copilot-sdk/package.json#version` via
|
|
21
|
+
* dynamic import. The SDK is an optional npm dep; when absent
|
|
22
|
+
* (no copilot bridge available) we omit the entry.
|
|
23
|
+
* - **mock** — never probed in production. The mock adapter is
|
|
24
|
+
* dev-mode-only (`isDevMode()` gate in `src/adapters/index.ts`)
|
|
25
|
+
* and its npm tarball is stripped at prepack; including it here
|
|
26
|
+
* would just produce a literal `"dev"` that nobody wants in their
|
|
27
|
+
* Hosts table. Skipped.
|
|
28
|
+
*
|
|
29
|
+
* Latency budget: ~50–100ms total. Each probe runs in parallel; the
|
|
30
|
+
* outer `Promise.all` resolves when the slowest finishes. Each
|
|
31
|
+
* individual probe has its own timeout so a hung `claude --version`
|
|
32
|
+
* (rare but possible — claude CLI sometimes pauses on first launch
|
|
33
|
+
* to register) doesn't keep the daemon's first signal pending.
|
|
34
|
+
*
|
|
35
|
+
* **Failure semantics: never throw.** A probe failure → that key is
|
|
36
|
+
* omitted from the result map. The caller treats the map as a
|
|
37
|
+
* best-effort snapshot; consumers (Hosts table) gracefully degrade.
|
|
38
|
+
*/
|
|
39
|
+
const child_process_1 = require("child_process");
|
|
40
|
+
const util_1 = require("util");
|
|
41
|
+
const execFileAsync = (0, util_1.promisify)(child_process_1.execFile);
|
|
42
|
+
/** Per-probe timeout. Generous enough to cover a cold launch but short
|
|
43
|
+
* enough that the daemon-boot pipeline isn't held up. */
|
|
44
|
+
const PROBE_TIMEOUT_MS = 5000;
|
|
45
|
+
/** Defensive semver-ish capture. Tolerates leading `v`, optional
|
|
46
|
+
* pre-release suffix. Anchored to the FIRST `MAJOR.MINOR.PATCH` triple
|
|
47
|
+
* in the output so headers / banners / multi-line greetings don't break
|
|
48
|
+
* the parse. */
|
|
49
|
+
const VERSION_REGEX = /v?(\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)/;
|
|
50
|
+
/**
|
|
51
|
+
* Probe the upstream tool versions for every adapter this daemon ships.
|
|
52
|
+
*
|
|
53
|
+
* @returns A map keyed by adapter name. Adapters whose probe failed or
|
|
54
|
+
* whose output couldn't be parsed are omitted entirely. The map may be
|
|
55
|
+
* empty in environments without any of the supported adapters available.
|
|
56
|
+
*/
|
|
57
|
+
async function probeAdapterVersions(deps = {}) {
|
|
58
|
+
const runCommand = deps.runCommand ?? defaultRunCommand;
|
|
59
|
+
const resolveCopilotSdkVersion = deps.resolveCopilotSdkVersion ?? defaultResolveCopilotSdkVersion;
|
|
60
|
+
const log = deps.log ?? defaultLog;
|
|
61
|
+
// Each probe is `Promise<[name, version] | null>`. Resolved-null →
|
|
62
|
+
// omit from the result map. Promise.all won't reject because each
|
|
63
|
+
// catches its own errors.
|
|
64
|
+
const probes = [
|
|
65
|
+
probeClaudeCode({ runCommand, log }),
|
|
66
|
+
probeCopilot({ resolveCopilotSdkVersion, log }),
|
|
67
|
+
];
|
|
68
|
+
const results = await Promise.all(probes);
|
|
69
|
+
const out = {};
|
|
70
|
+
for (const r of results) {
|
|
71
|
+
if (r)
|
|
72
|
+
out[r[0]] = r[1];
|
|
73
|
+
}
|
|
74
|
+
return out;
|
|
75
|
+
}
|
|
76
|
+
async function probeClaudeCode(deps) {
|
|
77
|
+
try {
|
|
78
|
+
const stdout = await deps.runCommand('claude', ['--version']);
|
|
79
|
+
const match = VERSION_REGEX.exec(stdout);
|
|
80
|
+
if (!match) {
|
|
81
|
+
deps.log('probeAdapterVersions: claude --version produced no MAJOR.MINOR.PATCH match; omitting');
|
|
82
|
+
return null;
|
|
83
|
+
}
|
|
84
|
+
return ['claude-code', match[1]];
|
|
85
|
+
}
|
|
86
|
+
catch (err) {
|
|
87
|
+
deps.log('probeAdapterVersions: claude --version failed:', err instanceof Error ? err.message : err);
|
|
88
|
+
return null;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
async function probeCopilot(deps) {
|
|
92
|
+
try {
|
|
93
|
+
const version = await deps.resolveCopilotSdkVersion();
|
|
94
|
+
if (!version)
|
|
95
|
+
return null;
|
|
96
|
+
// Reuse the same defensive regex so a malformed package.json
|
|
97
|
+
// version field doesn't poison the result map.
|
|
98
|
+
const match = VERSION_REGEX.exec(version);
|
|
99
|
+
if (!match) {
|
|
100
|
+
deps.log('probeAdapterVersions: copilot SDK package.json version unparseable; omitting');
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
return ['copilot', match[1]];
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
deps.log('probeAdapterVersions: copilot SDK probe failed:', err instanceof Error ? err.message : err);
|
|
107
|
+
return null;
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** Real `execFile` with a timeout + stderr-friendly options. Used in
|
|
111
|
+
* production; tests stub `runCommand`. */
|
|
112
|
+
async function defaultRunCommand(cmd, args) {
|
|
113
|
+
const { stdout } = await execFileAsync(cmd, args, {
|
|
114
|
+
timeout: PROBE_TIMEOUT_MS,
|
|
115
|
+
encoding: 'utf8',
|
|
116
|
+
// Don't fail on non-zero stderr; we only care about stdout.
|
|
117
|
+
windowsHide: true,
|
|
118
|
+
});
|
|
119
|
+
return stdout;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Synchronous companion to {@link defaultResolveCopilotSdkVersion}.
|
|
123
|
+
* Returns the Copilot SDK's `package.json#version` if the optional
|
|
124
|
+
* dependency is installed, or `undefined` when the require fails.
|
|
125
|
+
*
|
|
126
|
+
* Exported for #532 PR-2 — `src/daemon.ts` `computeHostProfile()` is
|
|
127
|
+
* synchronous (matches the existing `claude-code-headless` block at
|
|
128
|
+
* `daemon.ts:278-288`, which uses synchronous probes from
|
|
129
|
+
* `src/adapters/claude-code-headless/pre-flight.ts`). Awaiting an
|
|
130
|
+
* async helper from a sync function isn't possible without cascading
|
|
131
|
+
* the change to all `computeHostProfile` call sites; instead, this
|
|
132
|
+
* sync helper is the single require-source-of-truth, and the async
|
|
133
|
+
* `defaultResolveCopilotSdkVersion` (kept for the
|
|
134
|
+
* `ProbeAdapterVersionsDeps['resolveCopilotSdkVersion']` contract)
|
|
135
|
+
* delegates to it.
|
|
136
|
+
*
|
|
137
|
+
* Tests stub this directly via the `resolveCopilotSdkVersionSync` dep
|
|
138
|
+
* on `computeHostProfile` (see `test/daemon-boot.test.ts`).
|
|
139
|
+
*
|
|
140
|
+
* Never throws — a `try/catch` swallows MODULE_NOT_FOUND and any
|
|
141
|
+
* other failure mode to `undefined`. A throw here would crash the
|
|
142
|
+
* daemon-boot critical path.
|
|
143
|
+
*/
|
|
144
|
+
function resolveCopilotSdkVersionSync() {
|
|
145
|
+
try {
|
|
146
|
+
// `require` rather than ESM `import` so we read the package.json
|
|
147
|
+
// synchronously without the await + dynamic-import-of-JSON dance.
|
|
148
|
+
// The wrapper try/catch keeps the require inside a guard so a
|
|
149
|
+
// bundler that statically analyzes imports still treats it as
|
|
150
|
+
// optional.
|
|
151
|
+
const pkg = require('@github/copilot-sdk/package.json');
|
|
152
|
+
return pkg.version;
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
return undefined;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/** Try to resolve the Copilot SDK's package.json version. Returns
|
|
159
|
+
* `undefined` when the optional dep isn't installed (covers npm
|
|
160
|
+
* installs that opted out, dev environments without the bridge, etc.).
|
|
161
|
+
*
|
|
162
|
+
* Delegates to {@link resolveCopilotSdkVersionSync} so the require
|
|
163
|
+
* call has a single source of truth — see that function's docstring
|
|
164
|
+
* for why the sync sibling exists. */
|
|
165
|
+
async function defaultResolveCopilotSdkVersion() {
|
|
166
|
+
return resolveCopilotSdkVersionSync();
|
|
167
|
+
}
|
|
168
|
+
function defaultLog(...args) {
|
|
169
|
+
console.error('[agent-tempo:adapter-versions]', ...args);
|
|
170
|
+
}
|
package/dist/daemon.d.ts
ADDED
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import { Client, Connection } from '@temporalio/client';
|
|
3
|
+
import { type Config, type DaemonConfig } from './config';
|
|
4
|
+
import { type OrphanCandidate } from './reconcile/orphans';
|
|
5
|
+
import type { HostProfile } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Atomically write the daemon PID file via `writeFile(tmp) + rename(tmp, final)`.
|
|
8
|
+
*
|
|
9
|
+
* A racing reader (a CLI invocation that happens to poll during startup) will
|
|
10
|
+
* either see the previous file or the new one — never a half-written one.
|
|
11
|
+
*
|
|
12
|
+
* Windows sometimes fails the rename with EPERM/EBUSY/EACCES if an antivirus
|
|
13
|
+
* scanner or the previous handle is still active. We retry with short backoffs
|
|
14
|
+
* before giving up so a transient scanner doesn't crash startup.
|
|
15
|
+
*
|
|
16
|
+
* Exported for unit testing.
|
|
17
|
+
*/
|
|
18
|
+
export declare function writePidFileAtomic(pidFilePath: string, pid: number): Promise<void>;
|
|
19
|
+
/**
|
|
20
|
+
* Runtime drift detector — #423 PR-A Fix 3. When dev mode is active but
|
|
21
|
+
* the resolved namespace is NOT the dev default, an explicit override is
|
|
22
|
+
* in play (CLI `--namespace`, `~/.agent-tempo-dev/config.json`, or — if
|
|
23
|
+
* the env-var carve-out from Fix 1 ever regressed — a leaked shell var).
|
|
24
|
+
* Either way, the operator deserves a load-bearing diagnostic so the
|
|
25
|
+
* "banner says X, daemon connects to Y" drift doesn't recur silently.
|
|
26
|
+
*
|
|
27
|
+
* Pure function over the resolved Config + an injected log sink so the
|
|
28
|
+
* unit test can capture the message without a live daemon process.
|
|
29
|
+
* Returns whether a warning fired so callers (and tests) can assert on
|
|
30
|
+
* the branch directly.
|
|
31
|
+
*
|
|
32
|
+
* The check is intentionally loose: any namespace mismatch in dev mode
|
|
33
|
+
* triggers the warning, even for intentional overrides. We can't tell
|
|
34
|
+
* a typo'd `config.json` entry from a deliberate one — the warning is
|
|
35
|
+
* cheap, and an operator who overrode the namespace on purpose can
|
|
36
|
+
* grep-skip a single line.
|
|
37
|
+
*/
|
|
38
|
+
export declare function warnIfDevNamespaceDrift(config: Pick<Config, 'temporalNamespace'>, logFn?: (...args: unknown[]) => void): boolean;
|
|
39
|
+
/**
|
|
40
|
+
* Outcome of {@link ensureDevNamespace} — exposed so unit tests can assert
|
|
41
|
+
* on which branch fired without having to inspect log output.
|
|
42
|
+
*
|
|
43
|
+
* - `created`: registerNamespace succeeded (first dev daemon boot)
|
|
44
|
+
* - `already-exists`: namespace already registered (every subsequent boot)
|
|
45
|
+
* - `permission-denied`: server rejected; daemon continues, worker may fail
|
|
46
|
+
* - `error`: any other failure
|
|
47
|
+
*
|
|
48
|
+
* @internal
|
|
49
|
+
*/
|
|
50
|
+
export interface EnsureDevNamespaceResult {
|
|
51
|
+
ok: boolean;
|
|
52
|
+
status: 'created' | 'already-exists' | 'permission-denied' | 'error';
|
|
53
|
+
message?: string;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Auto-create the dev profile's Temporal namespace on dev daemon boot
|
|
57
|
+
* (ADR 0014 §6.2). Idempotent — calling it on every boot is correct and
|
|
58
|
+
* cheap.
|
|
59
|
+
*
|
|
60
|
+
* - `ALREADY_EXISTS`: the steady state after the first boot. Happy path.
|
|
61
|
+
* - `PERMISSION_DENIED`: e.g. managed Temporal Cloud where `RegisterNamespace`
|
|
62
|
+
* isn't granted. Log + return; the subsequent worker bootstrap fails
|
|
63
|
+
* loudly with `Namespace not found` and the operator can run
|
|
64
|
+
* `temporal operator namespace create -n agent-tempo-dev` themselves.
|
|
65
|
+
* - any other error: same fall-through; daemon stays alive without
|
|
66
|
+
* mutating state.
|
|
67
|
+
*
|
|
68
|
+
* Production daemons never call this — guarded by `isDevMode()` at the
|
|
69
|
+
* single callsite in `main()` below. Exported for direct unit testing
|
|
70
|
+
* with an injected stub workflow service.
|
|
71
|
+
*/
|
|
72
|
+
export declare function ensureDevNamespace(connection: Pick<Connection, 'workflowService'>, namespace: string, logFn?: (...args: unknown[]) => void): Promise<EnsureDevNamespaceResult>;
|
|
73
|
+
/**
|
|
74
|
+
* Test-only dependency-injection seam for {@link computeHostProfile}.
|
|
75
|
+
*
|
|
76
|
+
* Production callers omit `deps` entirely; the defaults resolve to the
|
|
77
|
+
* real probes in `daemon-adapter-versions.ts`. Tests inject stubs to
|
|
78
|
+
* exercise installed-vs-not-installed scenarios deterministically
|
|
79
|
+
* without touching the host filesystem. Mirrors the
|
|
80
|
+
* `ProbeAdapterVersionsDeps` shape from `daemon-adapter-versions.ts`,
|
|
81
|
+
* but only includes synchronous probes — `computeHostProfile` is sync
|
|
82
|
+
* by contract.
|
|
83
|
+
*
|
|
84
|
+
* Added in #532 PR-2 for the copilot host-profile probe.
|
|
85
|
+
*/
|
|
86
|
+
export interface ComputeHostProfileDeps {
|
|
87
|
+
/**
|
|
88
|
+
* Synchronous Copilot SDK version probe. Default:
|
|
89
|
+
* {@link resolveCopilotSdkVersionSync} from `daemon-adapter-versions.ts`.
|
|
90
|
+
* Returns the SDK's `package.json#version` when installed, or
|
|
91
|
+
* `undefined` when missing or unresolvable.
|
|
92
|
+
*/
|
|
93
|
+
resolveCopilotSdkVersionSync?: () => string | undefined;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Build the daemon's capability profile from its config + runtime env.
|
|
97
|
+
* Result is NOT scrubbed — call `scrubHostProfile` before signaling.
|
|
98
|
+
*
|
|
99
|
+
* Exported for testability; production callers go through
|
|
100
|
+
* `runDaemonBoot(client, deps)` which provides this as the default
|
|
101
|
+
* `computeHostProfile` dep.
|
|
102
|
+
*/
|
|
103
|
+
export declare function computeHostProfile(config: Config, deps?: ComputeHostProfileDeps): HostProfile;
|
|
104
|
+
/**
|
|
105
|
+
* #274 AC5c / M10 — HARD REQUIREMENT privacy scrub.
|
|
106
|
+
*
|
|
107
|
+
* Strips absolute paths and file extensions from every `HostProfile` field
|
|
108
|
+
* before the payload crosses the signal boundary. The global maestro is
|
|
109
|
+
* namespace-wide; a multi-tenant or multi-ensemble corporate setup would
|
|
110
|
+
* leak username-containing paths across ensembles if this is ever
|
|
111
|
+
* violated. Unit-tested in `test/daemon-boot.test.ts` with a dedicated
|
|
112
|
+
* "no `/` or `\\` in any string" invariant assertion against pathological
|
|
113
|
+
* inputs.
|
|
114
|
+
*
|
|
115
|
+
* Contract per architect AC5c:
|
|
116
|
+
* - `claudeBin` — basename only (e.g. `claude`), never absolute
|
|
117
|
+
* - `availableAgentTypes` — names only, never paths
|
|
118
|
+
* - `availablePlayerTypes` — names only, never paths
|
|
119
|
+
* - No env var values, no `workDir`, no user directories in any field
|
|
120
|
+
*
|
|
121
|
+
* The scrub is defense-in-depth: production callers (`computeHostProfile`)
|
|
122
|
+
* already produce clean inputs from `listAgentTypes().map(a => a.name)`.
|
|
123
|
+
* If a future code path accidentally passes a path, this function catches
|
|
124
|
+
* it before the workflow handler ever sees it.
|
|
125
|
+
*/
|
|
126
|
+
export declare function scrubHostProfile(raw: HostProfile): HostProfile;
|
|
127
|
+
/**
|
|
128
|
+
* Signal `hostProfile` with bounded retry (AC5b / M11).
|
|
129
|
+
*
|
|
130
|
+
* Default backoff: `[0, 5000, 15000]` ms → 3 attempts, ≤20 s wall-clock,
|
|
131
|
+
* well under the 30 s budget. Tests override to `[0, 0, 0]` for fast
|
|
132
|
+
* execution. On total failure, logs a warning and returns — the daemon
|
|
133
|
+
* stays alive without its profile advertised.
|
|
134
|
+
*
|
|
135
|
+
* Exported for reuse by the Phase 5 `agent-tempo refresh-host-profile`
|
|
136
|
+
* CLI subcommand, which re-signals without needing the full
|
|
137
|
+
* `runDaemonBoot` sequence (the global maestro is already up).
|
|
138
|
+
*/
|
|
139
|
+
export declare function advertiseHostProfile(client: Client, profile: HostProfile, opts?: {
|
|
140
|
+
retryBackoffsMs?: number[];
|
|
141
|
+
log?: (...args: unknown[]) => void;
|
|
142
|
+
sendSignal?: (client: Client, profile: HostProfile) => Promise<void>;
|
|
143
|
+
}): Promise<{
|
|
144
|
+
ok: boolean;
|
|
145
|
+
attempts: number;
|
|
146
|
+
lastError?: unknown;
|
|
147
|
+
}>;
|
|
148
|
+
/**
|
|
149
|
+
* #274 M14 — boot-sequence deps. Injected at `runDaemonBoot` so the
|
|
150
|
+
* ordering + retry + scrub invariants are all unit-testable without
|
|
151
|
+
* subprocess fixtures. Production callers pass the default impls
|
|
152
|
+
* already exported from this module.
|
|
153
|
+
*/
|
|
154
|
+
export interface DaemonBootDeps {
|
|
155
|
+
/** Ensure the global maestro workflow is running. Awaited before any signal. */
|
|
156
|
+
ensureGlobalMaestro: () => Promise<void>;
|
|
157
|
+
/** Signal the global maestro with the scrubbed host profile. */
|
|
158
|
+
sendHostProfileSignal: (client: Client, profile: HostProfile) => Promise<void>;
|
|
159
|
+
/**
|
|
160
|
+
* Compute the daemon's capability profile. Output is fed into
|
|
161
|
+
* `scrubHostProfile` before signaling — computeHostProfile itself does
|
|
162
|
+
* not need to scrub, the dep-swap pattern makes the pipeline testable.
|
|
163
|
+
*/
|
|
164
|
+
computeHostProfile: () => HostProfile;
|
|
165
|
+
/**
|
|
166
|
+
* Probe upstream tool versions for each adapter. Issue #399 Q5.4 —
|
|
167
|
+
* the result is merged into the profile as
|
|
168
|
+
* {@link HostProfile.adapterVersions} before the first signal. Runs
|
|
169
|
+
* in parallel with `ensureGlobalMaestro`, so a slow probe doesn't
|
|
170
|
+
* extend the boot. Probe failures yield an empty / partial map; the
|
|
171
|
+
* caller never throws. Tests stub this to return canned maps.
|
|
172
|
+
*
|
|
173
|
+
* Optional — when omitted (existing tests, embedded callers), the
|
|
174
|
+
* profile is signaled without an `adapterVersions` field. The
|
|
175
|
+
* production daemon entry-point passes the real `probeAdapterVersions`
|
|
176
|
+
* from `daemon-adapter-versions.ts`.
|
|
177
|
+
*/
|
|
178
|
+
probeAdapterVersions?: () => Promise<Record<string, string>>;
|
|
179
|
+
/**
|
|
180
|
+
* Retry backoffs for the `hostProfile` signal (ms). Production uses
|
|
181
|
+
* `[0, 5000, 15000]`; tests override to `[0, 0, 0]` for speed.
|
|
182
|
+
*/
|
|
183
|
+
retryBackoffsMs?: number[];
|
|
184
|
+
/** Log sink. Tests stub to capture output. Defaults to module-level `log`. */
|
|
185
|
+
log?: (...args: unknown[]) => void;
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* #274 M14 — daemon boot sequence: ensure global maestro is running,
|
|
189
|
+
* then advertise the (scrubbed) capability profile with bounded retry.
|
|
190
|
+
*
|
|
191
|
+
* Ordering is load-bearing (AC5a / M11): the `hostProfile` signal MUST
|
|
192
|
+
* NOT fire until `ensureGlobalMaestro` has resolved. Otherwise the
|
|
193
|
+
* signal races the workflow-start and gets silently dropped by Temporal
|
|
194
|
+
* (WorkflowNotFound on an unknown workflow id).
|
|
195
|
+
*
|
|
196
|
+
* Hard-failure behavior (AC5b): if `ensureGlobalMaestro` rejects, the
|
|
197
|
+
* daemon stays alive WITHOUT advertising its profile. Next opportunity
|
|
198
|
+
* is the next daemon restart OR a manual `agent-tempo refresh-host-profile`
|
|
199
|
+
* invocation (Phase 5).
|
|
200
|
+
*
|
|
201
|
+
* Tests in `test/daemon-boot.test.ts` exercise:
|
|
202
|
+
* - ensure-before-signal ordering via deferred promises
|
|
203
|
+
* - retry success on 3rd attempt
|
|
204
|
+
* - all-retries-exhausted stays alive
|
|
205
|
+
* - ensure-fails-stays-alive
|
|
206
|
+
*/
|
|
207
|
+
export declare function runDaemonBoot(client: Client, deps: DaemonBootDeps): Promise<void>;
|
|
208
|
+
/**
|
|
209
|
+
* PR-E reconcile-on-boot — design §10.1.
|
|
210
|
+
*
|
|
211
|
+
* Called once during daemon startup, after workers are running but before
|
|
212
|
+
* the main run loop blocks. Queries for orphaned sessions owned by this
|
|
213
|
+
* host and applies the effective {@link DaemonConfig.restorePolicy}:
|
|
214
|
+
*
|
|
215
|
+
* - `auto`: call `restart` on each orphan inside the allowlist + age
|
|
216
|
+
* window. `AttachmentConflict` is caught silently — another process
|
|
217
|
+
* may have restored concurrently.
|
|
218
|
+
* - `prompt`: log the orphan list and leave the restore to the CLI
|
|
219
|
+
* `agent-tempo restore` command. No automatic action.
|
|
220
|
+
* - `never`: silent no-op.
|
|
221
|
+
*
|
|
222
|
+
* All three branches exit in bounded time — never blocks worker startup.
|
|
223
|
+
* Non-fatal: any failure is logged and reconcile bails without crashing
|
|
224
|
+
* the daemon (worker loop takes over and the user can re-run the query
|
|
225
|
+
* via the CLI).
|
|
226
|
+
*/
|
|
227
|
+
export declare function reconcileOnBoot(client: Client, daemonConfig: DaemonConfig, hostname?: string, now?: number): Promise<void>;
|
|
228
|
+
/**
|
|
229
|
+
* Pure formatter — turns a `process.memoryUsage()` snapshot into a single
|
|
230
|
+
* space-separated `key=NNNmb` string suitable for grepping out of the log.
|
|
231
|
+
*
|
|
232
|
+
* Exported for unit testing without a live process.
|
|
233
|
+
*/
|
|
234
|
+
export declare function formatMemoryUsage(usage: NodeJS.MemoryUsage): string;
|
|
235
|
+
/**
|
|
236
|
+
* #336 — schedule a periodic `[agent-tempo:daemon ...] memory: ...` log
|
|
237
|
+
* line so the next memory-leak investigation has a baseline + growth curve
|
|
238
|
+
* directly in the daemon log instead of needing a debugger attach.
|
|
239
|
+
*
|
|
240
|
+
* Returns a stop function the daemon's shutdown handler invokes.
|
|
241
|
+
*
|
|
242
|
+
* `unref()` on the timer handle so memory reporting alone never keeps the
|
|
243
|
+
* daemon alive — workers + the HTTP listener are the only legitimate
|
|
244
|
+
* long-lived references.
|
|
245
|
+
*/
|
|
246
|
+
export declare function startMemoryReporter(intervalMs?: number, logFn?: (...args: unknown[]) => void, sample?: () => NodeJS.MemoryUsage): () => void;
|
|
247
|
+
/**
|
|
248
|
+
* Filter a set of orphan candidates to those that exceed the
|
|
249
|
+
* `detachedMaxAgeDays` retention threshold. Exported for unit testing the
|
|
250
|
+
* retention math without a live Temporal connection.
|
|
251
|
+
*/
|
|
252
|
+
export declare function selectStaleDetachedOrphans(orphans: OrphanCandidate[], detachedMaxAgeDays: number, now?: number): OrphanCandidate[];
|
|
253
|
+
/**
|
|
254
|
+
* PR-E cleanup loop — design §13.4 regression row 1.
|
|
255
|
+
*
|
|
256
|
+
* Runs on a 6-hour timer (hardcoded per §8 answer 2). Destroys detached
|
|
257
|
+
* orphans older than `detachedMaxAgeDays` via `TempoClient.destroy` so the
|
|
258
|
+
* workflow completes and eventually falls out of the namespace.
|
|
259
|
+
*
|
|
260
|
+
* Never touches `Running` workflows that still hold a live attachment
|
|
261
|
+
* (filter is explicit on `phase === 'detached'`).
|
|
262
|
+
*
|
|
263
|
+
* **Note (#144)**: an earlier revision included a "pass 2" that tried to
|
|
264
|
+
* `terminate()` already-Completed workflows as belt-and-suspenders retention.
|
|
265
|
+
* `terminate()` throws on Completed workflows in every Temporal namespace
|
|
266
|
+
* setting, so the pass was dead code masked by a swallowing catch. It was
|
|
267
|
+
* removed: namespace retention (Temporal Cloud default 30d, self-hosted
|
|
268
|
+
* configurable) is the authoritative reaper for Completed workflows.
|
|
269
|
+
*/
|
|
270
|
+
export declare function cleanupLoop(client: Client, daemonConfig: DaemonConfig, hostname?: string): Promise<void>;
|
|
271
|
+
/**
|
|
272
|
+
* Schedule {@link cleanupLoop} to run every 6 hours. Returns a clearer
|
|
273
|
+
* function that cancels the timer — called during shutdown.
|
|
274
|
+
*/
|
|
275
|
+
export declare function startCleanupLoop(client: Client, daemonConfig: DaemonConfig, hostname?: string): () => void;
|