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,426 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base adapter infrastructure.
|
|
3
|
+
*
|
|
4
|
+
* Owns the V2 attachment lifecycle — `claimAttachment`, heartbeat loop,
|
|
5
|
+
* `attachmentInfo` phase watcher, `WorkflowNotFound` terminal handling, and
|
|
6
|
+
* graceful-detach orchestration. PR-H (#132) removed the
|
|
7
|
+
* `AGENT_TEMPO_LIFECYCLE_V2=0` escape hatch and its PR-A compat shim path;
|
|
8
|
+
* V2 is now the only path.
|
|
9
|
+
*
|
|
10
|
+
* The `SdkAttachment` intermediate class (processing-signal pairing, split-brain
|
|
11
|
+
* cancellation per §9.3) lives in `src/adapters/sdk/base.ts`.
|
|
12
|
+
*
|
|
13
|
+
* Design reference: docs/design/session-lifecycle-rebuild-v2.md §§3.2, 4.3, 9.1–9.5.
|
|
14
|
+
*/
|
|
15
|
+
import type { Client, WorkflowHandle } from '@temporalio/client';
|
|
16
|
+
import type { AdapterClass, AdapterDescriptor, AttachmentToken, AttachmentPhase, DetachReason } from '../types';
|
|
17
|
+
/** Snapshot of adapter state included in every telemetry frame. */
|
|
18
|
+
interface AdapterTelemetrySnapshot {
|
|
19
|
+
attachmentId: string | null;
|
|
20
|
+
workflowId: string | null;
|
|
21
|
+
runId: string | null;
|
|
22
|
+
heartbeatsSent: number;
|
|
23
|
+
phaseTicksDone: number;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Build the structured frame emitted by every lifecycle handler. Pure
|
|
27
|
+
* function — exposed for unit tests that don't want to spawn a child
|
|
28
|
+
* process.
|
|
29
|
+
*/
|
|
30
|
+
export declare function buildProcessTerminatingFrame(signal: string, errorMessage?: string, snapshot?: AdapterTelemetrySnapshot[]): string;
|
|
31
|
+
/**
|
|
32
|
+
* Install the process-lifecycle telemetry handlers. Idempotent. Skipped
|
|
33
|
+
* by default in test environments (see {@link shouldInstallLifecycleTelemetry}).
|
|
34
|
+
*
|
|
35
|
+
* Production callers (and the first `startV2Lifecycle()` call on any
|
|
36
|
+
* adapter) invoke without arguments. Unit tests pass `{ force: true }`
|
|
37
|
+
* to bypass the env gate.
|
|
38
|
+
*/
|
|
39
|
+
export declare function installProcessLifecycleTelemetry(opts?: {
|
|
40
|
+
force?: boolean;
|
|
41
|
+
}): void;
|
|
42
|
+
/** Test-only — uninstall handlers + reset state. */
|
|
43
|
+
export declare function _resetProcessLifecycleTelemetryForTest(): void;
|
|
44
|
+
/** Test-only — direct access to the live-adapter set. */
|
|
45
|
+
export declare function _liveAdaptersForTest(): ReadonlySet<BaseAttachment>;
|
|
46
|
+
/**
|
|
47
|
+
* Override bundle for the reconnect loop timing (#201). Production defaults are
|
|
48
|
+
* tuned for laptop-sleep cycles (15-min elapsed budget, 10s base, 60s cap). Tests
|
|
49
|
+
* override to run the whole loop in <1s. Any field omitted falls back to the
|
|
50
|
+
* production constant.
|
|
51
|
+
*/
|
|
52
|
+
export interface ReconnectTimingOverrides {
|
|
53
|
+
baseMs?: number;
|
|
54
|
+
maxMs?: number;
|
|
55
|
+
budgetMs?: number;
|
|
56
|
+
backoffFactor?: number;
|
|
57
|
+
}
|
|
58
|
+
/** Options shared by every adapter extending `BaseAttachment`. */
|
|
59
|
+
export interface BaseAttachmentOptions {
|
|
60
|
+
/** Temporal client — required for V2 attachment claim + runId pinning. */
|
|
61
|
+
client?: Client;
|
|
62
|
+
/** Hostname to announce in `claimAttachment`. Defaults to `os.hostname()` when omitted. */
|
|
63
|
+
host?: string;
|
|
64
|
+
/** Test-only: shrink the reconnect backoff/budget. Production callers never set this. */
|
|
65
|
+
reconnectTiming?: ReconnectTimingOverrides;
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Abstract base class for session adapters.
|
|
69
|
+
*
|
|
70
|
+
* Concrete adapters (`InteractiveAttachment`, `CopilotSdkAttachment`) own
|
|
71
|
+
* their own top-level delivery loop. The base class owns the V2 attachment
|
|
72
|
+
* lifecycle: claim, heartbeat at `descriptor.heartbeatMs`, phase-watcher
|
|
73
|
+
* loop, `WorkflowGone` classifier, graceful `adapterExited` on teardown.
|
|
74
|
+
* Subclasses must call `startV2Lifecycle()` before their delivery loop and
|
|
75
|
+
* `stopV2Lifecycle()` on shutdown.
|
|
76
|
+
*
|
|
77
|
+
* PR-H (#132): the `AGENT_TEMPO_LIFECYCLE_V2` flag and the legacy V1 poll-
|
|
78
|
+
* only path it gated have been removed. The V2 attachment-lease path is
|
|
79
|
+
* now the only path.
|
|
80
|
+
*/
|
|
81
|
+
export declare abstract class BaseAttachment {
|
|
82
|
+
abstract readonly descriptor: AdapterDescriptor;
|
|
83
|
+
/** Populated at construction for InteractiveAttachment; lazily via `configureV2()` for subprocess adapters (Copilot bridge). */
|
|
84
|
+
protected client?: Client;
|
|
85
|
+
protected host?: string;
|
|
86
|
+
/** V2 state — populated by `startV2Lifecycle()`, null on legacy path. */
|
|
87
|
+
protected token: AttachmentToken | null;
|
|
88
|
+
/** Handle pinned to the runId returned by `claimAttachment`. Never resolve by ID alone (§6.3). */
|
|
89
|
+
protected pinnedHandle: WorkflowHandle | null;
|
|
90
|
+
private heartbeatTimer;
|
|
91
|
+
private phaseWatcherTimer;
|
|
92
|
+
private heartbeatBackoff;
|
|
93
|
+
private phaseBackoff;
|
|
94
|
+
private stopped;
|
|
95
|
+
private terminalFired;
|
|
96
|
+
private knownPhase;
|
|
97
|
+
/**
|
|
98
|
+
* `true` once a heartbeat has successfully landed on the current attachment (or rebind).
|
|
99
|
+
* Cleared on `startV2Lifecycle`, reconnect-loop success, and CAN rebind so each freshly
|
|
100
|
+
* live attachment emits its own `heartbeat#1 delivered` diagnostic. Added in #249 to
|
|
101
|
+
* distinguish "claim OK but heartbeat loop died" from "adapter just hasn't ticked yet."
|
|
102
|
+
*/
|
|
103
|
+
private firstHeartbeatLogged;
|
|
104
|
+
/**
|
|
105
|
+
* Monotonic heartbeat counter for the current attachment cycle. Reset on
|
|
106
|
+
* claim/reconnect/CAN-rebind. Emitted periodically (every {@link LOOP_SUMMARY_EVERY}
|
|
107
|
+
* ticks) so a long-running session leaves breadcrumbs in the log proving the loop is
|
|
108
|
+
* alive — operators can `grep 'heartbeats-delivered='` to confirm health without
|
|
109
|
+
* parsing Temporal history. Added in #249.
|
|
110
|
+
*/
|
|
111
|
+
private heartbeatsSent;
|
|
112
|
+
/**
|
|
113
|
+
* Mirror of {@link heartbeatsSent} for the phase-watcher loop. Same emission cadence,
|
|
114
|
+
* same rationale — the watcher is the only self-heal surface when the heartbeat loop
|
|
115
|
+
* dies silently, so a summary log line proves it's still live too.
|
|
116
|
+
*/
|
|
117
|
+
private phaseTicksDone;
|
|
118
|
+
private readonly phaseChangeListeners;
|
|
119
|
+
private readonly leaseRevokedListeners;
|
|
120
|
+
private readonly terminalListeners;
|
|
121
|
+
/**
|
|
122
|
+
* Pending `abortableSleep` cancellers (#201). `stopV2Lifecycle` iterates and invokes
|
|
123
|
+
* each so any in-flight reconnect backoff rejects immediately and the loop unwinds
|
|
124
|
+
* instead of stalling teardown by up to `RECONNECT_MAX_MS`.
|
|
125
|
+
*/
|
|
126
|
+
private readonly sleepAborters;
|
|
127
|
+
/**
|
|
128
|
+
* `true` while `runReconnectLoop` is active. Prevents concurrent reconnect attempts
|
|
129
|
+
* (e.g. if both the heartbeat and phase-watcher loops observe the same lease expiry
|
|
130
|
+
* at nearly the same time) and gates heartbeat/watcher ticks from firing new terminals
|
|
131
|
+
* while the reconnect pre-check is still deciding.
|
|
132
|
+
*/
|
|
133
|
+
private reconnecting;
|
|
134
|
+
/** Reconnect loop timing — production constants unless overridden for tests. */
|
|
135
|
+
private readonly reconnectBaseMs;
|
|
136
|
+
private readonly reconnectMaxMs;
|
|
137
|
+
private readonly reconnectBudgetMs;
|
|
138
|
+
private readonly reconnectBackoffFactor;
|
|
139
|
+
constructor(options?: BaseAttachmentOptions);
|
|
140
|
+
/**
|
|
141
|
+
* Lazily populate the V2-path dependencies (Temporal client, host). Used by
|
|
142
|
+
* adapters whose subprocess constructs the client inside `run()` rather
|
|
143
|
+
* than receiving it from the outer process (Copilot bridge). Must be called
|
|
144
|
+
* BEFORE `startV2Lifecycle()`.
|
|
145
|
+
*
|
|
146
|
+
* C3 (PR-C dual-QA follow-up): rejects late reconfiguration — once a claim
|
|
147
|
+
* token has been issued, swapping the client out silently would leave the
|
|
148
|
+
* pinned handle pointing at the previous connection. Future adapters that
|
|
149
|
+
* mis-order the calls fail loudly instead of drifting.
|
|
150
|
+
*/
|
|
151
|
+
protected configureV2(client: Client, host: string): void;
|
|
152
|
+
/** Subscribe to `attachmentInfo.phase` changes observed by the watcher. */
|
|
153
|
+
onPhaseChange(listener: (phase: AttachmentPhase) => void): () => void;
|
|
154
|
+
/** Subscribe to lease-revocation events (§9.3 split-brain resolution). */
|
|
155
|
+
onLeaseRevoked(listener: (reason: DetachReason) => void): () => void;
|
|
156
|
+
/**
|
|
157
|
+
* Hypothesis A telemetry — capture the adapter state included in
|
|
158
|
+
* process-lifecycle log frames. Public so the module-level
|
|
159
|
+
* `snapshotLiveAdapters()` helper can read private fields without an
|
|
160
|
+
* `any` cast; consumers other than the telemetry path should not call it.
|
|
161
|
+
*/
|
|
162
|
+
_captureTelemetrySnapshot(): AdapterTelemetrySnapshot;
|
|
163
|
+
/**
|
|
164
|
+
* Subscribe to terminal events — `WorkflowNotFound` (§9.4) and phase `gone`.
|
|
165
|
+
* Terminal fires at most once per instance. Subclasses stop delivery + exit.
|
|
166
|
+
*/
|
|
167
|
+
onTerminal(listener: (reason: DetachReason) => void): () => void;
|
|
168
|
+
/**
|
|
169
|
+
* V2 lifecycle entry point. Claims (or renews) the attachment, pins the handle by runId,
|
|
170
|
+
* and starts the heartbeat + phase watcher loops.
|
|
171
|
+
*
|
|
172
|
+
* @param workflowId Target session workflow id.
|
|
173
|
+
* @param expectedAttachmentId
|
|
174
|
+
* PR-D renewal path. When present, the adapter was spawned by `restart` or `migrate`
|
|
175
|
+
* — the workflow has already created an `Attachment` with this id and is
|
|
176
|
+
* expecting the new adapter to take over. Passing it through to `claimAttachment`
|
|
177
|
+
* selects the renewal branch in §9.2 (refresh lease in place, idempotent on retry)
|
|
178
|
+
* instead of the fresh-claim branch. Fresh spawn (first recruit) omits this arg.
|
|
179
|
+
* @returns Pinned `WorkflowHandle` — subclass delivery loop MUST use this for every
|
|
180
|
+
* subsequent query/signal (never resolve by id alone).
|
|
181
|
+
* @throws Re-throws `claimAttachment` rejections (`AttachmentConflict`, `WorkflowGone`).
|
|
182
|
+
*/
|
|
183
|
+
protected startV2Lifecycle(workflowId: string, expectedAttachmentId?: string): Promise<WorkflowHandle>;
|
|
184
|
+
/**
|
|
185
|
+
* Tear down V2 machinery. Idempotent. Called by subclass on stop, on terminal
|
|
186
|
+
* events, and on graceful detach completion.
|
|
187
|
+
*
|
|
188
|
+
* When `graceful=true` (detach owner) we fire `adapterExited` so the workflow
|
|
189
|
+
* collapses `draining → detached` immediately per §11.1.
|
|
190
|
+
*/
|
|
191
|
+
protected stopV2Lifecycle(reason?: DetachReason, graceful?: boolean): Promise<void>;
|
|
192
|
+
private scheduleHeartbeat;
|
|
193
|
+
/**
|
|
194
|
+
* Emit a loud diagnostic when a tick early-returns via one of its guard paths (#249).
|
|
195
|
+
* Pre-#249 these returns were silent — the only observable effect was "heartbeats stop
|
|
196
|
+
* arriving." Now operators can grep `adapter.*guard tripped` to confirm or rule out
|
|
197
|
+
* tick-orphan as a failure mode without needing workflow history.
|
|
198
|
+
*
|
|
199
|
+
* `terminalFired=true` / `stopped=true` guards are load-bearing on the terminal path
|
|
200
|
+
* (don't want to re-enter terminal) so they're expected during teardown; we still log
|
|
201
|
+
* them but at the same level — operators can correlate timestamps against the preceding
|
|
202
|
+
* `terminal (...) — stopping delivery poll permanently` line.
|
|
203
|
+
*/
|
|
204
|
+
private logGuardTrip;
|
|
205
|
+
/**
|
|
206
|
+
* Single tick of the heartbeat loop. Try/finally scaffolding (#249) guarantees
|
|
207
|
+
* reschedule in every path except genuinely terminal state (`stopped`,
|
|
208
|
+
* `terminalFired`) or when the reconnect loop has taken ownership of scheduling
|
|
209
|
+
* (`reconnecting`). Pre-#249 the three early-return paths at the top + the
|
|
210
|
+
* handled-terminal-error path silently orphaned the timer forever; a transient
|
|
211
|
+
* `reconnecting=true` window or a null-handle race was enough to kill the loop
|
|
212
|
+
* with no log and no teardown.
|
|
213
|
+
*
|
|
214
|
+
* Handled terminals (CAN rebind, destroy) still short-circuit via `return` —
|
|
215
|
+
* the `finally` block re-checks `reconnecting` / `terminalFired` before
|
|
216
|
+
* rescheduling, so the reconnect/terminal machinery keeps ownership of
|
|
217
|
+
* whatever comes next.
|
|
218
|
+
*/
|
|
219
|
+
private tickHeartbeat;
|
|
220
|
+
private schedulePhaseWatcher;
|
|
221
|
+
/**
|
|
222
|
+
* Single tick of the phase-watcher loop. Same orphan-resistance scaffolding as
|
|
223
|
+
* {@link tickHeartbeat} (#249): try/finally reschedule, unconditional unless
|
|
224
|
+
* `stopped` / `terminalFired` / `reconnecting`. When the heartbeat loop dies
|
|
225
|
+
* silently, the watcher is the only remaining self-heal surface — losing it
|
|
226
|
+
* too meant the adapter had no path back to a healthy state short of process
|
|
227
|
+
* restart.
|
|
228
|
+
*/
|
|
229
|
+
private tickPhaseWatcher;
|
|
230
|
+
/**
|
|
231
|
+
* Shared error-classification path for the heartbeat + phase-watcher ticks (#226).
|
|
232
|
+
*
|
|
233
|
+
* Returns `true` if the error was a terminal-class (handled inline: CAN rebind
|
|
234
|
+
* kicked off, or destroy fired). Returns `false` when the caller should treat
|
|
235
|
+
* the error as transient and continue its backoff.
|
|
236
|
+
*
|
|
237
|
+
* Always consults `fetchHistory` on any terminal-class error, because the
|
|
238
|
+
* Temporal SDK can't distinguish CAN-close from true-complete at the error
|
|
239
|
+
* level — see {@link isTerminalWorkflowError}. The history lookup is cheap
|
|
240
|
+
* (only runs on terminal, so at most once per adapter lifetime per terminal)
|
|
241
|
+
* and safer than re-querying by workflow id (which could race a fresh session
|
|
242
|
+
* reusing the id).
|
|
243
|
+
*/
|
|
244
|
+
private handleRunEndError;
|
|
245
|
+
/**
|
|
246
|
+
* Fetch the closed pinned run's history and return the runId of a CAN successor
|
|
247
|
+
* if present, else `null`. Scoped to the pinned (old) run via `this.pinnedHandle`,
|
|
248
|
+
* so it can't be fooled by a fresh session that happens to reuse the workflow id.
|
|
249
|
+
*
|
|
250
|
+
* Called only on the terminal path from {@link handleRunEndError}, so the cost
|
|
251
|
+
* of `fetchHistory` (a full event stream for the closed run) is paid at most
|
|
252
|
+
* once per terminal — not on every tick.
|
|
253
|
+
*/
|
|
254
|
+
private findCanSuccessorRunId;
|
|
255
|
+
/**
|
|
256
|
+
* Fire the terminal hook — the adapter is going dark and won't recover.
|
|
257
|
+
*
|
|
258
|
+
* #258: emits a structured log line on every fire so the next post-CAN
|
|
259
|
+
* silence incident is unambiguous in logs. Pre-#258, a `fireTerminal`
|
|
260
|
+
* from an unexpected source (the root cause was a silent destroy from
|
|
261
|
+
* the reconnect-loop pre-check on a transient terminal-class error) was
|
|
262
|
+
* indistinguishable from process death in workflow history — both produced
|
|
263
|
+
* "no further heartbeats." The structured log includes:
|
|
264
|
+
*
|
|
265
|
+
* - `reason` — the existing DetachReason
|
|
266
|
+
* - `callsite` — the calling function or rationale (passed by every
|
|
267
|
+
* callsite so the source is grep-able without parsing stack traces)
|
|
268
|
+
* - `attachmentId` / `workflowId` / `runId` — for cross-referencing
|
|
269
|
+
* against workflow history when bisecting an incident
|
|
270
|
+
* - `heartbeatsSent` / `phaseTicksDone` — the existing #249 counters
|
|
271
|
+
* so an operator can correlate "loop alive at N heartbeats, then
|
|
272
|
+
* terminal fired at this callsite" without external context
|
|
273
|
+
*
|
|
274
|
+
* Idempotent — repeat calls (e.g. reconnect-exhausted re-fires after
|
|
275
|
+
* destroy) early-return without re-logging. The first fire wins.
|
|
276
|
+
*/
|
|
277
|
+
private fireTerminal;
|
|
278
|
+
/**
|
|
279
|
+
* #258 tiebreaker: confirm whether a workflow is genuinely terminal after
|
|
280
|
+
* the reconnect-loop pre-check threw a terminal-class error. Used to
|
|
281
|
+
* distinguish a real workflow-gone state from a transient gRPC /
|
|
282
|
+
* visibility-API blip that classified as terminal.
|
|
283
|
+
*
|
|
284
|
+
* Returns:
|
|
285
|
+
* - `{ kind: 'running', statusName }` — workflow is alive (any
|
|
286
|
+
* non-terminal status). Caller should treat the original error as
|
|
287
|
+
* transient and continue the reconnect loop.
|
|
288
|
+
* - `{ kind: 'terminal', statusName }` — workflow is in a terminal
|
|
289
|
+
* status (`COMPLETED` / `FAILED` / `CANCELLED` / `TERMINATED` /
|
|
290
|
+
* `CONTINUED_AS_NEW` / `TIMED_OUT`). Caller should fire destroy.
|
|
291
|
+
* - `{ kind: 'describe-threw' }` — `describe()` itself failed. Treat
|
|
292
|
+
* as terminal (fire destroy) — consistent with pre-#258 semantics
|
|
293
|
+
* when classification is ambiguous, and avoids spinning forever on
|
|
294
|
+
* a workflow we can't reach.
|
|
295
|
+
* - `{ kind: 'timed-out' }` — `describe()` exceeded
|
|
296
|
+
* {@link DESCRIBE_TIMEOUT_MS}. Treat as terminal (fire destroy) —
|
|
297
|
+
* same rationale: prefer clean shutdown to a hung loop.
|
|
298
|
+
*
|
|
299
|
+
* The unpinned handle follows any CAN chain to the latest run, so
|
|
300
|
+
* `desc.status.name === 'CONTINUED_AS_NEW'` here means the workflow
|
|
301
|
+
* id itself is closed (no successor) — genuinely terminal.
|
|
302
|
+
*/
|
|
303
|
+
private confirmWorkflowTerminal;
|
|
304
|
+
/**
|
|
305
|
+
* Opt-in reconnect policy. Default: return `false` — the base class behaves
|
|
306
|
+
* exactly as it did before #201 (fire terminal, tear down). Subclasses that
|
|
307
|
+
* can safely replay delivery on a fresh lease should override and return
|
|
308
|
+
* `true` for recoverable reasons (typically `heartbeat-timeout` and
|
|
309
|
+
* `superseded`; never `destroy`).
|
|
310
|
+
*
|
|
311
|
+
* Why opt-in: SDK adapters (e.g. Copilot bridge) have their own subprocess
|
|
312
|
+
* restart logic; double-reconnecting would race their native poller and
|
|
313
|
+
* produce duplicate `pendingMessages` queries. Keep them on the old
|
|
314
|
+
* behavior until we've proven reconnect is safe there.
|
|
315
|
+
*/
|
|
316
|
+
protected shouldReconnect(_reason: DetachReason): boolean;
|
|
317
|
+
/**
|
|
318
|
+
* Called once, just before the reconnect loop enters its first backoff sleep.
|
|
319
|
+
* Subclasses should tear down any delivery loops that are still polling the
|
|
320
|
+
* stale pinned handle (it may succeed but `markDelivered` will be ignored by
|
|
321
|
+
* the workflow because our `attachmentId` is no longer current). The default
|
|
322
|
+
* is a no-op.
|
|
323
|
+
*/
|
|
324
|
+
protected onReconnectStart(_reason: DetachReason): Promise<void>;
|
|
325
|
+
/**
|
|
326
|
+
* Called once on a successful re-claim, with the freshly pinned handle.
|
|
327
|
+
* Subclasses should restart their delivery loop against `handle`. Runs
|
|
328
|
+
* before the base class reschedules its own heartbeat + phase-watcher
|
|
329
|
+
* loops, so the subclass sees a quiescent state.
|
|
330
|
+
*
|
|
331
|
+
* Note: the runId returned by `claimAttachment` may differ from the previous
|
|
332
|
+
* pinned handle's runId (the workflow may have `continueAsNew`'d during the
|
|
333
|
+
* outage), so subclasses MUST use the `handle` argument — never cache a
|
|
334
|
+
* handle from before the reconnect.
|
|
335
|
+
*/
|
|
336
|
+
protected onReconnected(_handle: WorkflowHandle): Promise<void>;
|
|
337
|
+
/**
|
|
338
|
+
* Sleep `ms` milliseconds, resolving cleanly on timer and rejecting with
|
|
339
|
+
* `aborted:stopped` if `stopV2Lifecycle` or `fireTerminal` fires mid-wait.
|
|
340
|
+
* The canonical pattern for any blocking wait inside an adapter loop —
|
|
341
|
+
* never use bare `setTimeout` + `Promise` in loop code, or teardown stalls.
|
|
342
|
+
*/
|
|
343
|
+
protected abortableSleep(ms: number): Promise<void>;
|
|
344
|
+
/** Reject every in-flight `abortableSleep`. Called on stop + terminal. */
|
|
345
|
+
private abortSleepers;
|
|
346
|
+
/**
|
|
347
|
+
* Consult {@link shouldReconnect}; if true, kick off the reconnect loop in
|
|
348
|
+
* the background (fire-and-forget), otherwise fire terminal synchronously.
|
|
349
|
+
* Called by the heartbeat / phase-watcher ticks instead of `fireTerminal`
|
|
350
|
+
* when the reason is potentially recoverable.
|
|
351
|
+
*/
|
|
352
|
+
private fireTerminalOrReconnect;
|
|
353
|
+
/**
|
|
354
|
+
* #226 CAN rebind. Transparently repoints `pinnedHandle` at the successor run,
|
|
355
|
+
* keeps the existing `attachmentId` / `leaseMs` (the workflow extended the lease
|
|
356
|
+
* by one heartbeat interval during the CAN transition per §2.3, so the lease is
|
|
357
|
+
* still live on the new run), notifies the subclass to restart its delivery
|
|
358
|
+
* loop, and resumes heartbeat + phase-watcher.
|
|
359
|
+
*
|
|
360
|
+
* Why this is safe without re-claiming:
|
|
361
|
+
* - The new run carries forward `currentAttachment` verbatim from the old run.
|
|
362
|
+
* - The adapter's `attachmentId` still matches, so the next `heartbeat` /
|
|
363
|
+
* `markDelivered` / `adapterExited` signal on the new pinned handle will be
|
|
364
|
+
* accepted unchanged by the workflow's handlers.
|
|
365
|
+
* - If the lease actually did expire before we got here (e.g. adapter was
|
|
366
|
+
* offline through multiple CAN cycles), the next phase-watcher tick on the
|
|
367
|
+
* new pinned handle will see `phase=detached` + no current attachment and
|
|
368
|
+
* fall through to the existing #201 reclaim path — belt-and-suspenders.
|
|
369
|
+
*/
|
|
370
|
+
private runCanRebind;
|
|
371
|
+
/**
|
|
372
|
+
* Budget-bounded reconnect loop.
|
|
373
|
+
*
|
|
374
|
+
* Strategy:
|
|
375
|
+
* 1. Sleep (abortable) with exponential backoff from {@link RECONNECT_BASE_MS}
|
|
376
|
+
* up to {@link RECONNECT_MAX_MS}, capped by an elapsed-time budget of
|
|
377
|
+
* {@link RECONNECT_TOTAL_BUDGET_MS}.
|
|
378
|
+
* 2. Query `attachmentInfo` via a fresh unpinned handle:
|
|
379
|
+
* • workflow gone → fire `destroy`, exit.
|
|
380
|
+
* • phase `gone` → fire `destroy`, exit.
|
|
381
|
+
* • someone else holds the lease → fire `superseded`, exit (architect §1).
|
|
382
|
+
* • phase `draining` → wait another tick (lease about to reap).
|
|
383
|
+
* • otherwise → attempt fresh `claimAttachment`.
|
|
384
|
+
* 3. On successful claim: rebuild `this.pinnedHandle` from the **new** token's
|
|
385
|
+
* `runId` (workflow may have `continueAsNew`'d during outage), reset loop
|
|
386
|
+
* state, call subclass hooks, restart heartbeat + watcher.
|
|
387
|
+
*
|
|
388
|
+
* Fires `reconnect-exhausted` on budget exhaustion. Exits silently (without
|
|
389
|
+
* firing terminal) on abort — `stopV2Lifecycle` owns teardown messaging.
|
|
390
|
+
*/
|
|
391
|
+
private runReconnectLoop;
|
|
392
|
+
}
|
|
393
|
+
/**
|
|
394
|
+
* Registry of adapter descriptors keyed by `adapterId`.
|
|
395
|
+
*
|
|
396
|
+
* Look up the descriptor for a given session by `SessionMetadata.adapterId` (or
|
|
397
|
+
* fall back to `'claude-code'` for pre-v0.25 sessions that have no adapterId set).
|
|
398
|
+
* `src/adapters/index.ts` creates the singleton `registry` and registers all
|
|
399
|
+
* shipped adapters at import time.
|
|
400
|
+
*/
|
|
401
|
+
export declare class AdapterRegistry {
|
|
402
|
+
private readonly byId;
|
|
403
|
+
/** Register an adapter descriptor. Replaces any existing entry with the same id. */
|
|
404
|
+
register(desc: AdapterDescriptor): void;
|
|
405
|
+
/**
|
|
406
|
+
* Fetch the descriptor for `adapterId`. Throws if unregistered.
|
|
407
|
+
*
|
|
408
|
+
* Callers resolving from possibly-undefined metadata should coalesce first:
|
|
409
|
+
* `registry.get(metadata.adapterId ?? 'claude-code')`.
|
|
410
|
+
*/
|
|
411
|
+
get(adapterId: string): AdapterDescriptor;
|
|
412
|
+
/** `true` if `adapterId` is registered. */
|
|
413
|
+
has(adapterId: string): boolean;
|
|
414
|
+
/** Snapshot of all registered descriptors. */
|
|
415
|
+
all(): readonly AdapterDescriptor[];
|
|
416
|
+
/**
|
|
417
|
+
* Resolve an `adapterId` from the legacy `agent` field on {@link SessionMetadata}.
|
|
418
|
+
* Maps `'claude'` → `'claude-code'`, `'copilot'` → `'copilot'`.
|
|
419
|
+
*
|
|
420
|
+
* Used as a fallback when `adapterId` is not yet populated on the session metadata
|
|
421
|
+
* (e.g. sessions started before PR-B landed). PR-D removes this mapping when the
|
|
422
|
+
* legacy `AgentType` enum is retired.
|
|
423
|
+
*/
|
|
424
|
+
resolveFromAgentType(agent: string | undefined): string;
|
|
425
|
+
}
|
|
426
|
+
export type { AdapterClass, AdapterDescriptor };
|