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,274 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InteractiveAttachment = exports.claudeCodeDescriptor = void 0;
|
|
4
|
+
const base_1 = require("../base");
|
|
5
|
+
const terminal_error_1 = require("../terminal-error");
|
|
6
|
+
const config_1 = require("../../config");
|
|
7
|
+
const log = (...args) => console.error('[agent-tempo:poller]', ...args);
|
|
8
|
+
/**
|
|
9
|
+
* Descriptor for the claude-code adapter. Kept colocated with the class so
|
|
10
|
+
* `adapter.ts` has no import dependency on `index.ts` (breaks the circular
|
|
11
|
+
* module-graph cycle flagged in QA review of PR-B). `index.ts` re-exports
|
|
12
|
+
* this constant alongside the class.
|
|
13
|
+
*
|
|
14
|
+
* Design reference: docs/design/session-lifecycle-rebuild-v2.md §4.2–4.3.
|
|
15
|
+
*/
|
|
16
|
+
exports.claudeCodeDescriptor = {
|
|
17
|
+
adapterId: 'claude-code',
|
|
18
|
+
adapterClass: 'interactive',
|
|
19
|
+
blocksOnLLMTurn: false,
|
|
20
|
+
// Interactive class — 60s cadence per design §4.3. The base class drives the
|
|
21
|
+
// heartbeat loop at this interval when the V2 lifecycle path is active.
|
|
22
|
+
heartbeatMs: 60_000,
|
|
23
|
+
};
|
|
24
|
+
const POLL_BASE_MS = 2000;
|
|
25
|
+
const POLL_BACKOFF_FACTOR = 1.5;
|
|
26
|
+
const POLL_MAX_MS = 30000;
|
|
27
|
+
/**
|
|
28
|
+
* Poll a session workflow for pending messages and deliver them via `onMessages`.
|
|
29
|
+
*
|
|
30
|
+
* Module-private; callers go through {@link InteractiveAttachment.start}. Runs
|
|
31
|
+
* on the V2 runId-pinned handle so `markDelivered` signals reach the correct
|
|
32
|
+
* execution.
|
|
33
|
+
*
|
|
34
|
+
* **Terminal-error handling (#249 Bug 4):** pre-#249 this loop's catch-all
|
|
35
|
+
* swallowed every error including `WorkflowNotFoundError` from a CAN-closed
|
|
36
|
+
* pinned runId, so the poller spun forever against a dead run while the
|
|
37
|
+
* successor accepted messages no one was draining. Post-fix: classify via
|
|
38
|
+
* the shared {@link isTerminalWorkflowError}, stop cleanly when seen, and
|
|
39
|
+
* rely on the base class's heartbeat/watcher `handleRunEndError` path to
|
|
40
|
+
* run the CAN rebind — which then calls `onReconnected` on
|
|
41
|
+
* {@link InteractiveAttachment} to start a fresh poller on the successor.
|
|
42
|
+
*
|
|
43
|
+
* This fix depends on Bugs 1+2 (tick orphan resistance) — if the heartbeat
|
|
44
|
+
* loop is dead, `onReconnected` never fires and the poller stays stopped
|
|
45
|
+
* without a replacement. See the Bug 4 commit message for the revert-together
|
|
46
|
+
* dependency.
|
|
47
|
+
*/
|
|
48
|
+
function startMessagePoller(handle, onMessages) {
|
|
49
|
+
let stopped = false;
|
|
50
|
+
let timeout = null;
|
|
51
|
+
let currentInterval = POLL_BASE_MS;
|
|
52
|
+
let consecutiveErrors = 0;
|
|
53
|
+
const cleanupTimer = () => {
|
|
54
|
+
if (timeout) {
|
|
55
|
+
clearTimeout(timeout);
|
|
56
|
+
timeout = null;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
const poll = async () => {
|
|
60
|
+
if (stopped)
|
|
61
|
+
return;
|
|
62
|
+
try {
|
|
63
|
+
const messages = await handle.query('pendingMessages');
|
|
64
|
+
if (messages.length > 0) {
|
|
65
|
+
const ids = messages.map((m) => m.id);
|
|
66
|
+
// Deliver messages first — only mark delivered after successful notification.
|
|
67
|
+
// If onMessages throws, messages stay undelivered and retry on next poll cycle.
|
|
68
|
+
await onMessages(messages);
|
|
69
|
+
await handle.signal('markDelivered', ids);
|
|
70
|
+
}
|
|
71
|
+
// Reset backoff on successful poll
|
|
72
|
+
currentInterval = POLL_BASE_MS;
|
|
73
|
+
consecutiveErrors = 0;
|
|
74
|
+
}
|
|
75
|
+
catch (err) {
|
|
76
|
+
// #249 Bug 4: surface terminal-class errors instead of swallowing. The
|
|
77
|
+
// pinned-runId handle throws `WorkflowNotFoundError` /
|
|
78
|
+
// `WorkflowExecutionAlreadyCompleted` when its run has CAN'd or been
|
|
79
|
+
// destroyed. Keep polling against the closed run is pointless and masks
|
|
80
|
+
// the lifecycle event from logs. Stop the poller here; the base class's
|
|
81
|
+
// heartbeat/watcher tick will trigger CAN rebind or terminal, and
|
|
82
|
+
// `onReconnected` restarts a fresh poller on the live run.
|
|
83
|
+
if ((0, terminal_error_1.isTerminalWorkflowError)(err)) {
|
|
84
|
+
log(`poll hit terminal workflow error — stopping (onReconnected will restart on successor if recoverable):`, err?.message ?? err);
|
|
85
|
+
stopped = true;
|
|
86
|
+
cleanupTimer();
|
|
87
|
+
return;
|
|
88
|
+
}
|
|
89
|
+
consecutiveErrors++;
|
|
90
|
+
// Apply exponential backoff on errors
|
|
91
|
+
currentInterval = Math.min(currentInterval * POLL_BACKOFF_FACTOR, POLL_MAX_MS);
|
|
92
|
+
log(`Poll error (attempt ${consecutiveErrors}, next in ${Math.round(currentInterval)}ms):`, err);
|
|
93
|
+
}
|
|
94
|
+
if (!stopped) {
|
|
95
|
+
timeout = setTimeout(poll, currentInterval);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
// Start the first poll
|
|
99
|
+
timeout = setTimeout(poll, POLL_BASE_MS);
|
|
100
|
+
return () => {
|
|
101
|
+
stopped = true;
|
|
102
|
+
cleanupTimer();
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Interactive adapter for the Claude Code CLI.
|
|
107
|
+
*
|
|
108
|
+
* Delivery model is push-based: messages are fetched via the `pendingMessages`
|
|
109
|
+
* query, notified to the MCP server via `notifications/claude/channel`, then
|
|
110
|
+
* `markDelivered` is signaled to the workflow. Delivery does not block on an
|
|
111
|
+
* LLM turn (`blocksOnLLMTurn: false`).
|
|
112
|
+
*
|
|
113
|
+
* V2 attachment lifecycle: the adapter calls `claimAttachment` via
|
|
114
|
+
* `startV2Lifecycle()`, pins the runId, and runs the delivery poll on the
|
|
115
|
+
* pinned handle. Base class drives heartbeat + phase watcher in parallel.
|
|
116
|
+
*
|
|
117
|
+
* Reconnect (#201): the adapter opts into the base class's reconnect loop
|
|
118
|
+
* via {@link shouldReconnect}. On a recoverable terminal (lease reaped
|
|
119
|
+
* workflow-side without a competitor, or superseded-then-released), the
|
|
120
|
+
* base class runs a budget-bounded backoff + fresh-claim flow, then calls
|
|
121
|
+
* {@link onReconnected} with a freshly pinned handle so the delivery poll
|
|
122
|
+
* can resume. Truly terminal events (`destroy`, `reconnect-exhausted`)
|
|
123
|
+
* still tear the adapter down permanently.
|
|
124
|
+
*
|
|
125
|
+
* CAN rebind (#226): when the session workflow continues-as-new, the pinned
|
|
126
|
+
* runId starts returning `WorkflowExecutionAlreadyCompleted`. The base class
|
|
127
|
+
* reads the closed run's history, extracts the successor runId from the
|
|
128
|
+
* `WorkflowExecutionContinuedAsNewEvent`, rebinds `pinnedHandle` in place (no
|
|
129
|
+
* re-claim — the workflow's §2.3 CAN-boundary lease extension keeps the lease
|
|
130
|
+
* alive across the transition), and calls {@link onReconnected} so we restart
|
|
131
|
+
* the poller on the live run. Transparent to upstream.
|
|
132
|
+
*
|
|
133
|
+
* PR-H (#132): the legacy unpinned-poll fallback (gated on
|
|
134
|
+
* `AGENT_TEMPO_LIFECYCLE_V2=0`) has been removed. V2 is the only path.
|
|
135
|
+
*/
|
|
136
|
+
class InteractiveAttachment extends base_1.BaseAttachment {
|
|
137
|
+
descriptor = exports.claudeCodeDescriptor;
|
|
138
|
+
/** Current delivery poller stopper; null when no poll is running (pre-claim, mid-reconnect, post-terminal). */
|
|
139
|
+
stopPoller = null;
|
|
140
|
+
/** Retained across `onReconnected` calls so the poller can be restarted on a new pinned handle. */
|
|
141
|
+
onMessages = null;
|
|
142
|
+
/** True once user-initiated `stop()` has fired or the adapter reached a true terminal. */
|
|
143
|
+
localStopped = false;
|
|
144
|
+
constructor(options = {}) {
|
|
145
|
+
super(options);
|
|
146
|
+
}
|
|
147
|
+
/**
|
|
148
|
+
* Start polling for pending messages and delivering each batch via `onMessages`.
|
|
149
|
+
* Returns a `stop()` function the caller invokes on shutdown.
|
|
150
|
+
*
|
|
151
|
+
* The `handle` argument is forwarded for its `workflowId` only — V2 mode
|
|
152
|
+
* claims its own runId-pinned handle via the base class for all subsequent
|
|
153
|
+
* queries/signals.
|
|
154
|
+
*/
|
|
155
|
+
start(handle, onMessages) {
|
|
156
|
+
return this.startV2(handle.workflowId, onMessages);
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* V2 path: claim the attachment, pin the handle, then run the poll/deliver/
|
|
160
|
+
* markDelivered loop against the pinned handle. The base class simultaneously
|
|
161
|
+
* drives heartbeats and the `attachmentInfo` watcher, and (via {@link shouldReconnect})
|
|
162
|
+
* may reclaim on recoverable lease loss without this method firing terminal.
|
|
163
|
+
*
|
|
164
|
+
* Returns a stop function that tears down the delivery poll AND the base
|
|
165
|
+
* class lifecycle. Safe to call multiple times.
|
|
166
|
+
*
|
|
167
|
+
* **Error handling:** a `claimAttachment` rejection at startup
|
|
168
|
+
* (`AttachmentConflict`, `WorkflowGone`) propagates up — the caller in
|
|
169
|
+
* `server.ts` treats it like any other startup failure. Runtime lease loss
|
|
170
|
+
* on the pinned handle is first routed through `shouldReconnect`; only truly
|
|
171
|
+
* terminal reasons (`destroy`, `reconnect-exhausted`) reach `onTerminal`
|
|
172
|
+
* and tear down the poller permanently.
|
|
173
|
+
*/
|
|
174
|
+
startV2(workflowId, onMessages) {
|
|
175
|
+
this.onMessages = onMessages;
|
|
176
|
+
const stop = () => {
|
|
177
|
+
if (this.localStopped)
|
|
178
|
+
return;
|
|
179
|
+
this.localStopped = true;
|
|
180
|
+
if (this.stopPoller) {
|
|
181
|
+
this.stopPoller();
|
|
182
|
+
this.stopPoller = null;
|
|
183
|
+
}
|
|
184
|
+
// Fire-and-forget — V2 graceful exit signals adapterExited to the workflow.
|
|
185
|
+
void this.stopV2Lifecycle('user-stop', /* graceful */ true);
|
|
186
|
+
};
|
|
187
|
+
// Terminal events from the base class: `destroy`, `reconnect-exhausted`, or any
|
|
188
|
+
// non-reconnectable reason. By the time this fires, the reconnect loop (if
|
|
189
|
+
// applicable) has already given up; tear the poller down permanently.
|
|
190
|
+
this.onTerminal((reason) => {
|
|
191
|
+
log(`terminal (${reason}) — stopping delivery poll permanently`);
|
|
192
|
+
this.localStopped = true;
|
|
193
|
+
if (this.stopPoller) {
|
|
194
|
+
this.stopPoller();
|
|
195
|
+
this.stopPoller = null;
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
// PR-D: when spawned by `restart` or `migrate`, the workflow has
|
|
199
|
+
// pre-claimed an attachment and passed its id through env. Forward to
|
|
200
|
+
// `startV2Lifecycle` so the update takes the §9.2 renewal path and the
|
|
201
|
+
// adapter takes over the existing lease atomically. Absent on first-recruit
|
|
202
|
+
// spawn (fresh-claim path).
|
|
203
|
+
const expectedAttachmentId = process.env[config_1.ENV.ATTACHMENT_ID] || undefined;
|
|
204
|
+
// Kick off claim + heartbeat + watcher. If this throws (conflict/gone),
|
|
205
|
+
// the caller's startup bails — we haven't started the poll yet.
|
|
206
|
+
this.startV2Lifecycle(workflowId, expectedAttachmentId)
|
|
207
|
+
.then((pinned) => {
|
|
208
|
+
if (this.localStopped)
|
|
209
|
+
return; // caller bailed between await and here
|
|
210
|
+
this.stopPoller = startMessagePoller(pinned, onMessages);
|
|
211
|
+
})
|
|
212
|
+
.catch((err) => {
|
|
213
|
+
log(`startV2Lifecycle failed: ${err?.message ?? err}`);
|
|
214
|
+
// Surface via stop — caller's shutdown path sees the error in logs
|
|
215
|
+
// and proceeds with graceful shutdown. We don't re-throw here because
|
|
216
|
+
// start() is synchronous by contract.
|
|
217
|
+
this.localStopped = true;
|
|
218
|
+
});
|
|
219
|
+
return stop;
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* #201 / #226: reconnect opt-in. The interactive adapter is stateless wrt
|
|
223
|
+
* in-flight messages (no processing-signal pairing; `markDelivered` is
|
|
224
|
+
* idempotent), so every recoverable reason is safe to replay on a fresh or
|
|
225
|
+
* re-bound lease:
|
|
226
|
+
*
|
|
227
|
+
* - `heartbeat-timeout` (#201): the workflow reaped our lease (e.g. laptop
|
|
228
|
+
* slept). Re-claim and resume — full budget-bounded reconnect loop.
|
|
229
|
+
* - `superseded` (#201): another adapter currently holds our slot. The
|
|
230
|
+
* reconnect loop's pre-check will re-query and bail cleanly if that's
|
|
231
|
+
* still true; we enter the loop in case the competitor releases during
|
|
232
|
+
* our backoff.
|
|
233
|
+
* - `continued-as-new` (#226): the session workflow's CAN transition closed
|
|
234
|
+
* our pinned runId while the workflow id kept running on a successor. The
|
|
235
|
+
* base class transparently rebinds to the successor runId (no re-claim —
|
|
236
|
+
* the lease is carried across CAN per §2.3) and our poller resumes.
|
|
237
|
+
*
|
|
238
|
+
* Unrecoverable reasons (`destroy`, `gone`, anything else) fall through to
|
|
239
|
+
* the default `false`, firing terminal directly.
|
|
240
|
+
*/
|
|
241
|
+
shouldReconnect(reason) {
|
|
242
|
+
return (reason === 'heartbeat-timeout' ||
|
|
243
|
+
reason === 'superseded' ||
|
|
244
|
+
reason === 'continued-as-new');
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Tear down the current poller immediately when entering the reconnect loop.
|
|
248
|
+
* The old pinned handle may still respond to `pendingMessages` queries but
|
|
249
|
+
* the workflow side will ignore our `markDelivered` signals (our `attachmentId`
|
|
250
|
+
* is no longer current), so continuing to poll wastes I/O and logs noise.
|
|
251
|
+
*/
|
|
252
|
+
async onReconnectStart(_reason) {
|
|
253
|
+
if (this.stopPoller) {
|
|
254
|
+
this.stopPoller();
|
|
255
|
+
this.stopPoller = null;
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Fresh pinned handle is live — restart the delivery poller. The workflow's
|
|
260
|
+
* `pendingMessages` queue carries everything that landed while we were
|
|
261
|
+
* detached; the first poll will drain it in one batch.
|
|
262
|
+
*/
|
|
263
|
+
async onReconnected(handle) {
|
|
264
|
+
if (this.localStopped || !this.onMessages)
|
|
265
|
+
return;
|
|
266
|
+
// Belt-and-suspenders: if onReconnectStart was skipped somehow, don't leak.
|
|
267
|
+
if (this.stopPoller) {
|
|
268
|
+
this.stopPoller();
|
|
269
|
+
this.stopPoller = null;
|
|
270
|
+
}
|
|
271
|
+
this.stopPoller = startMessagePoller(handle, this.onMessages);
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
exports.InteractiveAttachment = InteractiveAttachment;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* claude-code adapter — barrel export.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the descriptor and class from `./adapter`. `src/adapters/index.ts`
|
|
5
|
+
* imports the descriptor here at module load and registers it with the
|
|
6
|
+
* singleton {@link AdapterRegistry}. Direct consumers should fetch from the
|
|
7
|
+
* registry, not import the descriptor directly.
|
|
8
|
+
*
|
|
9
|
+
* The descriptor constant itself lives colocated with the class in `./adapter`
|
|
10
|
+
* so this file has no inward-pointing imports — breaks the module-graph cycle
|
|
11
|
+
* flagged in PR-B QA review.
|
|
12
|
+
*
|
|
13
|
+
* Design reference: docs/design/session-lifecycle-rebuild-v2.md §4.2.
|
|
14
|
+
*/
|
|
15
|
+
export { InteractiveAttachment, claudeCodeDescriptor } from './adapter';
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.claudeCodeDescriptor = exports.InteractiveAttachment = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* claude-code adapter — barrel export.
|
|
6
|
+
*
|
|
7
|
+
* Re-exports the descriptor and class from `./adapter`. `src/adapters/index.ts`
|
|
8
|
+
* imports the descriptor here at module load and registers it with the
|
|
9
|
+
* singleton {@link AdapterRegistry}. Direct consumers should fetch from the
|
|
10
|
+
* registry, not import the descriptor directly.
|
|
11
|
+
*
|
|
12
|
+
* The descriptor constant itself lives colocated with the class in `./adapter`
|
|
13
|
+
* so this file has no inward-pointing imports — breaks the module-graph cycle
|
|
14
|
+
* flagged in PR-B QA review.
|
|
15
|
+
*
|
|
16
|
+
* Design reference: docs/design/session-lifecycle-rebuild-v2.md §4.2.
|
|
17
|
+
*/
|
|
18
|
+
var adapter_1 = require("./adapter");
|
|
19
|
+
Object.defineProperty(exports, "InteractiveAttachment", { enumerable: true, get: function () { return adapter_1.InteractiveAttachment; } });
|
|
20
|
+
Object.defineProperty(exports, "claudeCodeDescriptor", { enumerable: true, get: function () { return adapter_1.claudeCodeDescriptor; } });
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { type ChildProcess } from 'child_process';
|
|
2
|
+
import type { AdapterDescriptor, Message } from '../../types';
|
|
3
|
+
import { SdkAttachment, type SdkDeliverResult } from '../sdk/base';
|
|
4
|
+
/**
|
|
5
|
+
* Descriptor for the claude-code-headless adapter. Colocated with the
|
|
6
|
+
* class so `adapter.ts` has no import dependency on `index.ts` (avoids
|
|
7
|
+
* the circular module-graph cycle QA flagged on copilot's PR-B).
|
|
8
|
+
*
|
|
9
|
+
* Design reference: `docs/design/520-claude-code-headless-adapter.md` §2.
|
|
10
|
+
*/
|
|
11
|
+
export declare const claudeCodeHeadlessDescriptor: AdapterDescriptor;
|
|
12
|
+
export { CLAUDE_CODE_PERMISSION_MODES, type ClaudeCodeHeadlessPermissionMode, } from './types';
|
|
13
|
+
import type { ClaudeCodeHeadlessPermissionMode } from './types';
|
|
14
|
+
/** Construction options for {@link ClaudeCodeHeadlessAttachment}. */
|
|
15
|
+
export interface ClaudeCodeHeadlessAdapterOptions {
|
|
16
|
+
/** `--permission-mode` flag value. Default: `'acceptEdits'`. */
|
|
17
|
+
permissionMode?: ClaudeCodeHeadlessPermissionMode;
|
|
18
|
+
/** Pass `--dangerously-skip-permissions` instead of `--permission-mode`. Mutually exclusive with `permissionMode`. */
|
|
19
|
+
dangerouslySkipPermissions?: boolean;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* SDK-class adapter that drives `claude -p` as a per-turn subprocess.
|
|
23
|
+
*
|
|
24
|
+
* **PR-2 status**: lifecycle + spawn scaffold complete. `run()` boots the
|
|
25
|
+
* full V2 lifecycle, hydrates the per-cwd session UUID via the shared
|
|
26
|
+
* `sessionId` metadata field, and drives the poll loop. `onSuperseded()`
|
|
27
|
+
* SIGTERMs `this.childProcess` (which PR-3 populates inside `invokeSdk`).
|
|
28
|
+
* `invokeSdk()` still throws — calling it errors the turn loudly until
|
|
29
|
+
* PR-3 wires the per-turn `claude -p` invocation.
|
|
30
|
+
*
|
|
31
|
+
* Lifecycle inherited from `SdkAttachment` / `BaseAttachment`: claim,
|
|
32
|
+
* heartbeat, phase watcher, `processingStart`/`End` pairing,
|
|
33
|
+
* `markDelivered`. No reconnect opt-in (matches claude-api / opencode —
|
|
34
|
+
* the daemon's `reconcile-on-boot` recovers from lease loss).
|
|
35
|
+
*/
|
|
36
|
+
export declare class ClaudeCodeHeadlessAttachment extends SdkAttachment {
|
|
37
|
+
readonly descriptor: AdapterDescriptor;
|
|
38
|
+
/** `--permission-mode` flag value. Resolved at construction; ENV fallback. */
|
|
39
|
+
protected readonly permissionMode: ClaudeCodeHeadlessPermissionMode;
|
|
40
|
+
/** Whether to use `--dangerously-skip-permissions` instead of permissionMode. */
|
|
41
|
+
protected readonly dangerouslySkipPermissions: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* In-flight per-turn `claude -p` subprocess. Set by PR-3's `invokeSdk`
|
|
44
|
+
* before each turn; cleared after exit. `onSuperseded` reads this to
|
|
45
|
+
* SIGTERM the child on lease revocation.
|
|
46
|
+
*/
|
|
47
|
+
protected childProcess: ChildProcess | null;
|
|
48
|
+
/**
|
|
49
|
+
* Per-cwd Claude Code session UUID. Used as `--session-id` on the first
|
|
50
|
+
* turn (to PIN the UUID) and `--resume` alone on subsequent turns
|
|
51
|
+
* (mutually exclusive per CLI v2.1.126 — see §16.9). Hydrated from
|
|
52
|
+
* `SessionMetadata.sessionId` on `run()` — generated fresh + stashed if
|
|
53
|
+
* absent. The same field is shared with the interactive Claude Code
|
|
54
|
+
* adapter (architect-ratified Option (a) post-spike — see PR-3 §16).
|
|
55
|
+
*/
|
|
56
|
+
protected sessionId: string | null;
|
|
57
|
+
/** Cached for the per-turn telemetry log. Populated in `run()`. */
|
|
58
|
+
protected playerName: string;
|
|
59
|
+
constructor(opts?: ClaudeCodeHeadlessAdapterOptions);
|
|
60
|
+
/**
|
|
61
|
+
* Lease-revocation hook — fired by `SdkAttachment` when the base-class
|
|
62
|
+
* phase watcher detects another claimant stole the attachment.
|
|
63
|
+
*
|
|
64
|
+
* Two-step graceful → forced fallback per design §5.7: SIGTERM first
|
|
65
|
+
* (lets `claude` flush any in-flight stream-json frames + tear down its
|
|
66
|
+
* MCP child cleanly); SIGKILL after {@link SIGTERM_GRACE_MS} grace if it
|
|
67
|
+
* doesn't exit. Identical pattern to opencode/adapter.ts:160-173.
|
|
68
|
+
*
|
|
69
|
+
* Idempotent — racing signals (lease revoke + cleanup) are safe.
|
|
70
|
+
*/
|
|
71
|
+
protected onSuperseded(): void;
|
|
72
|
+
/**
|
|
73
|
+
* Subprocess entry point. Connects Temporal, waits for the session
|
|
74
|
+
* workflow to register, hydrates the per-cwd session UUID via metadata,
|
|
75
|
+
* claims the attachment via V2 lifecycle, and drives the poll loop.
|
|
76
|
+
*
|
|
77
|
+
* Design reference: §3.6 (env hygiene), §5.1 (session continuity), §7
|
|
78
|
+
* (engineer-facing skeleton).
|
|
79
|
+
*/
|
|
80
|
+
run(): Promise<void>;
|
|
81
|
+
/**
|
|
82
|
+
* Poll the workflow for pending messages, drive each one through
|
|
83
|
+
* `SdkAttachment.deliver()`. Mirrors claude-api's loop shape; the LLM
|
|
84
|
+
* call lives in `invokeSdk` (PR-3).
|
|
85
|
+
*
|
|
86
|
+
* Periodic workflow-status checks detect external termination /
|
|
87
|
+
* destroy and exit cleanly so the daemon doesn't accumulate zombie
|
|
88
|
+
* adapter processes after a `destroy` from another player.
|
|
89
|
+
*/
|
|
90
|
+
private pollLoop;
|
|
91
|
+
/** True once `onTerminal` fired and cleanup tore down the V2 token. */
|
|
92
|
+
private shouldStop;
|
|
93
|
+
/**
|
|
94
|
+
* Per-turn LLM dispatch. Spawns `claude -p` with the synthesized argv
|
|
95
|
+
* + inline `--mcp-config`, streams stdout through `StreamJsonReader`,
|
|
96
|
+
* and returns the closing `result` frame's assembled text + usage.
|
|
97
|
+
*
|
|
98
|
+
* Closure-captured `messages[]` carries the multi-cue batch (PR-2 QA
|
|
99
|
+
* flag — see `pollLoop` for the closure-wrapping rationale). The
|
|
100
|
+
* representative `_prompt` arg from `SdkAttachment.deliver()` is
|
|
101
|
+
* unused; we build the prompt argv from `messages` directly.
|
|
102
|
+
*
|
|
103
|
+
* `_timeoutMs` is passed through to a Promise.race that SIGTERMs the
|
|
104
|
+
* subprocess on timeout. The base `SdkAttachment.deliver()` doesn't
|
|
105
|
+
* enforce its own timeout — we do it here.
|
|
106
|
+
*
|
|
107
|
+
* Subprocess failures (exit != 0, no result frame, or
|
|
108
|
+
* `result.is_error`) flow through the architect-ratified classifier
|
|
109
|
+
* in `./error-mapper.ts`. The classifier output is logged but the
|
|
110
|
+
* adapter does NOT call `markDelivered` on failure — the message
|
|
111
|
+
* stays PENDING so the next poll picks it up. The adapter's own
|
|
112
|
+
* retry-budget logic (PR-3 follow-up; mirrors #521's claude-api fix)
|
|
113
|
+
* tracks consecutive failures and escalates to detach when N=10
|
|
114
|
+
* `retriable-with-backoff` failures pile up.
|
|
115
|
+
*/
|
|
116
|
+
protected invokeSdkWithBatch(messages: Message[], _prompt: string, timeoutMs: number): Promise<SdkDeliverResult>;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Encode a cwd into Claude Code's per-cwd project-dir naming scheme.
|
|
120
|
+
* Confirmed empirically in the §11.2 spike check (issue #520) — every
|
|
121
|
+
* `:`, `/`, and `\` becomes `-`. Drive prefixes like `C:\` produce a
|
|
122
|
+
* double-dash (`C--`).
|
|
123
|
+
*
|
|
124
|
+
* Pinned by `tests/adapters/claude-code-headless/cwd-encoding.test.ts`
|
|
125
|
+
* against the captured fixture so a future Claude Code minor bump that
|
|
126
|
+
* changes the scheme breaks loudly here, not silently in resume.
|
|
127
|
+
*
|
|
128
|
+
* Exported for tests only — production callers go through the on-disk
|
|
129
|
+
* sessionFile-exists check in `invokeSdkWithBatch`.
|
|
130
|
+
*/
|
|
131
|
+
export declare function encodeCwd(cwd: string): string;
|