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,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Subprocess-failure → classifier translation for claude-code-headless.
|
|
3
|
+
*
|
|
4
|
+
* Issue #520 PR-3. Maps a per-turn `claude -p` subprocess outcome (exit
|
|
5
|
+
* code, stderr, observed stream-json events, accumulated result-frame
|
|
6
|
+
* fields) onto the shared `ApiErrorCategory` taxonomy used by the SDK
|
|
7
|
+
* adapters' retry-budget logic.
|
|
8
|
+
*
|
|
9
|
+
* **Architect-ratified 5-rule precedence** (issue #520 spike-comment
|
|
10
|
+
* thread, post-Delta #3 ruling). Most-fatal-wins; a single subprocess
|
|
11
|
+
* failure must increment the retry budget exactly ONCE:
|
|
12
|
+
*
|
|
13
|
+
* ```
|
|
14
|
+
* subprocess+stderr-regex
|
|
15
|
+
* > api_retry-fatal-cats
|
|
16
|
+
* > rate_limit_event(blocked,blocked)
|
|
17
|
+
* > api_retry-transient
|
|
18
|
+
* > rate_limit_event(blocked,allowed)
|
|
19
|
+
* ```
|
|
20
|
+
*
|
|
21
|
+
* **Preferred classifier input — `result.is_error` + `result.api_error_status`**:
|
|
22
|
+
* when the result frame arrives with `is_error: true` AND a non-null HTTP
|
|
23
|
+
* status, dispatch directly on the HTTP code. This bypasses both the
|
|
24
|
+
* `system/api_retry` and `rate_limit_event` channels and reuses the same
|
|
25
|
+
* mapping shape claude-api uses (`401/403/4xx → fatal`, `5xx → retriable`).
|
|
26
|
+
*
|
|
27
|
+
* **Pinned constraints from architect ratification**:
|
|
28
|
+
* 1. `rate_limit_event(status='allowed')` is NEVER a classifier input —
|
|
29
|
+
* it fires informationally on every successful turn. Counting it
|
|
30
|
+
* would overflow the N=10 retry budget on turn 1.
|
|
31
|
+
* 2. `rate_limit_event(blocked,blocked)` → `fatal` (subscription +
|
|
32
|
+
* extra-usage both exhausted).
|
|
33
|
+
* 3. `rate_limit_event(blocked,allowed)` → `retriable-with-backoff`
|
|
34
|
+
* (subscription cap hit but extra-usage pool still has headroom).
|
|
35
|
+
* 4. Multi-channel de-dupe: the precedence table is enforced top-down;
|
|
36
|
+
* each call returns exactly one category.
|
|
37
|
+
* 5. Auth/billing/oauth-org/invalid-request stay on
|
|
38
|
+
* `system/api_retry` + stderr regex — `rate_limit_event` doesn't
|
|
39
|
+
* carry these categories.
|
|
40
|
+
*
|
|
41
|
+
* Pure code; no I/O; trivially unit-testable. The PR-2 sibling adapters
|
|
42
|
+
* (`claude-api`, etc.) will adopt the shared `ApiErrorCategory` type
|
|
43
|
+
* when the cross-adapter classifier lands (#521); for now this file
|
|
44
|
+
* defines the type locally and the adapter reads it directly.
|
|
45
|
+
*/
|
|
46
|
+
import type { TurnAccumulator, SystemApiRetryFrame, RateLimitEvent } from './stream-json';
|
|
47
|
+
/**
|
|
48
|
+
* Three-bucket error category. Mirrors the proposed cross-adapter
|
|
49
|
+
* classifier from #521 (claude-api retry-loop bug) — the design
|
|
50
|
+
* intentionally keeps this shape so the two adapters can converge on
|
|
51
|
+
* the shared type when #521 ships.
|
|
52
|
+
*
|
|
53
|
+
* - `fatal` — operator action required; do NOT retry; detach immediately.
|
|
54
|
+
* - `retriable-with-backoff` — transient; apply exponential backoff;
|
|
55
|
+
* leave message PENDING. Counted toward the N=10 retry budget.
|
|
56
|
+
* - `retriable-immediate` — adapter-initiated abort (lease loss); the
|
|
57
|
+
* next adapter (after restart / supersede) picks the message up.
|
|
58
|
+
* NOT counted toward the retry budget.
|
|
59
|
+
*/
|
|
60
|
+
export type ApiErrorCategory = 'fatal' | 'retriable-with-backoff' | 'retriable-immediate';
|
|
61
|
+
/** Subprocess-failure context fed to the mapper. */
|
|
62
|
+
export interface SubprocessFailureContext {
|
|
63
|
+
/** Exit code from the `claude -p` child. `null` when we SIGTERMed it. */
|
|
64
|
+
exitCode: number | null;
|
|
65
|
+
/** Captured stderr (capped at 4KB at the call site). May be empty. */
|
|
66
|
+
stderr: string;
|
|
67
|
+
/** Per-turn accumulator — provides observed retry events + result frame state. */
|
|
68
|
+
turn: TurnAccumulator;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Apply the architect's 5-rule precedence to classify a turn outcome.
|
|
72
|
+
*
|
|
73
|
+
* **MUST NOT be called on a successful turn** — caller should inspect
|
|
74
|
+
* `turn.resultFrameSeen && !turn.resultIsError && exitCode === 0` first
|
|
75
|
+
* and skip the classifier entirely on success.
|
|
76
|
+
*
|
|
77
|
+
* Throws if called on success — fail loudly rather than return a
|
|
78
|
+
* misleading category.
|
|
79
|
+
*/
|
|
80
|
+
export declare function mapSubprocessFailure(ctx: SubprocessFailureContext): ApiErrorCategory;
|
|
81
|
+
/**
|
|
82
|
+
* Build an operator-facing error message from a classifier input. Used
|
|
83
|
+
* by the adapter's surfaced detach reason so `attachment_info` shows
|
|
84
|
+
* something actionable instead of a bare HTTP code.
|
|
85
|
+
*
|
|
86
|
+
* Mirrors the design §5.4 messages — same operator copy as the original
|
|
87
|
+
* `system/api_retry` table, generalized to also fire from the result-
|
|
88
|
+
* frame-driven preferred path.
|
|
89
|
+
*/
|
|
90
|
+
export declare function describeFailure(ctx: SubprocessFailureContext): string;
|
|
91
|
+
/**
|
|
92
|
+
* Helper: was the rate_limit_event observation purely informational?
|
|
93
|
+
* Architect Constraint #1 — `status: 'allowed'` events fire on every
|
|
94
|
+
* successful turn and MUST be ignored by the classifier. Exposed so
|
|
95
|
+
* adapter telemetry can log only the action-required ones.
|
|
96
|
+
*/
|
|
97
|
+
export declare function isRateLimitInformational(evt: RateLimitEvent): boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Helper for the classifier-precedence regression test: classify a
|
|
100
|
+
* synthesized retry event without spinning up the full subprocess
|
|
101
|
+
* machinery. Mirrors `mapSubprocessFailure` but operates on a single
|
|
102
|
+
* `system/api_retry` event in isolation. Internal helper for tests
|
|
103
|
+
* only — production callers go through `mapSubprocessFailure`.
|
|
104
|
+
*
|
|
105
|
+
* @internal
|
|
106
|
+
*/
|
|
107
|
+
export declare function _classifyApiRetryForTest(evt: SystemApiRetryFrame): ApiErrorCategory | null;
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Subprocess-failure → classifier translation for claude-code-headless.
|
|
4
|
+
*
|
|
5
|
+
* Issue #520 PR-3. Maps a per-turn `claude -p` subprocess outcome (exit
|
|
6
|
+
* code, stderr, observed stream-json events, accumulated result-frame
|
|
7
|
+
* fields) onto the shared `ApiErrorCategory` taxonomy used by the SDK
|
|
8
|
+
* adapters' retry-budget logic.
|
|
9
|
+
*
|
|
10
|
+
* **Architect-ratified 5-rule precedence** (issue #520 spike-comment
|
|
11
|
+
* thread, post-Delta #3 ruling). Most-fatal-wins; a single subprocess
|
|
12
|
+
* failure must increment the retry budget exactly ONCE:
|
|
13
|
+
*
|
|
14
|
+
* ```
|
|
15
|
+
* subprocess+stderr-regex
|
|
16
|
+
* > api_retry-fatal-cats
|
|
17
|
+
* > rate_limit_event(blocked,blocked)
|
|
18
|
+
* > api_retry-transient
|
|
19
|
+
* > rate_limit_event(blocked,allowed)
|
|
20
|
+
* ```
|
|
21
|
+
*
|
|
22
|
+
* **Preferred classifier input — `result.is_error` + `result.api_error_status`**:
|
|
23
|
+
* when the result frame arrives with `is_error: true` AND a non-null HTTP
|
|
24
|
+
* status, dispatch directly on the HTTP code. This bypasses both the
|
|
25
|
+
* `system/api_retry` and `rate_limit_event` channels and reuses the same
|
|
26
|
+
* mapping shape claude-api uses (`401/403/4xx → fatal`, `5xx → retriable`).
|
|
27
|
+
*
|
|
28
|
+
* **Pinned constraints from architect ratification**:
|
|
29
|
+
* 1. `rate_limit_event(status='allowed')` is NEVER a classifier input —
|
|
30
|
+
* it fires informationally on every successful turn. Counting it
|
|
31
|
+
* would overflow the N=10 retry budget on turn 1.
|
|
32
|
+
* 2. `rate_limit_event(blocked,blocked)` → `fatal` (subscription +
|
|
33
|
+
* extra-usage both exhausted).
|
|
34
|
+
* 3. `rate_limit_event(blocked,allowed)` → `retriable-with-backoff`
|
|
35
|
+
* (subscription cap hit but extra-usage pool still has headroom).
|
|
36
|
+
* 4. Multi-channel de-dupe: the precedence table is enforced top-down;
|
|
37
|
+
* each call returns exactly one category.
|
|
38
|
+
* 5. Auth/billing/oauth-org/invalid-request stay on
|
|
39
|
+
* `system/api_retry` + stderr regex — `rate_limit_event` doesn't
|
|
40
|
+
* carry these categories.
|
|
41
|
+
*
|
|
42
|
+
* Pure code; no I/O; trivially unit-testable. The PR-2 sibling adapters
|
|
43
|
+
* (`claude-api`, etc.) will adopt the shared `ApiErrorCategory` type
|
|
44
|
+
* when the cross-adapter classifier lands (#521); for now this file
|
|
45
|
+
* defines the type locally and the adapter reads it directly.
|
|
46
|
+
*/
|
|
47
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
48
|
+
exports.mapSubprocessFailure = mapSubprocessFailure;
|
|
49
|
+
exports.describeFailure = describeFailure;
|
|
50
|
+
exports.isRateLimitInformational = isRateLimitInformational;
|
|
51
|
+
exports._classifyApiRetryForTest = _classifyApiRetryForTest;
|
|
52
|
+
/**
|
|
53
|
+
* Auth/billing failure stderr regex. Catches the case where the CLI
|
|
54
|
+
* exits non-zero due to auth issues but doesn't emit a `system/api_retry`
|
|
55
|
+
* frame first (older CLI versions, edge cases). Patterns are deliberately
|
|
56
|
+
* broad — false positives here just mean "treat as fatal", which is the
|
|
57
|
+
* safe direction.
|
|
58
|
+
*/
|
|
59
|
+
const AUTH_FAILURE_STDERR_RE = /not (logged in|authenticated)|expired|please run.*claude auth/i;
|
|
60
|
+
const BILLING_FAILURE_STDERR_RE = /credit balance|billing|insufficient/i;
|
|
61
|
+
/**
|
|
62
|
+
* Apply the architect's 5-rule precedence to classify a turn outcome.
|
|
63
|
+
*
|
|
64
|
+
* **MUST NOT be called on a successful turn** — caller should inspect
|
|
65
|
+
* `turn.resultFrameSeen && !turn.resultIsError && exitCode === 0` first
|
|
66
|
+
* and skip the classifier entirely on success.
|
|
67
|
+
*
|
|
68
|
+
* Throws if called on success — fail loudly rather than return a
|
|
69
|
+
* misleading category.
|
|
70
|
+
*/
|
|
71
|
+
function mapSubprocessFailure(ctx) {
|
|
72
|
+
const { exitCode, stderr, turn } = ctx;
|
|
73
|
+
// Sanity check — caller bug if they invoke us on a clean success.
|
|
74
|
+
if (turn.resultFrameSeen &&
|
|
75
|
+
turn.resultIsError === false &&
|
|
76
|
+
exitCode === 0) {
|
|
77
|
+
throw new Error('mapSubprocessFailure called on a successful turn — programmer error. ' +
|
|
78
|
+
'Caller must skip the classifier when resultIsError=false + exit=0.');
|
|
79
|
+
}
|
|
80
|
+
// ── PREFERRED PATH — result.is_error + result.api_error_status ──
|
|
81
|
+
// Architect-locked Delta #1 bonus: when the result frame arrives with
|
|
82
|
+
// `is_error: true` AND a clean HTTP status, dispatch directly on the
|
|
83
|
+
// status code. Cleaner than either of the two streaming channels —
|
|
84
|
+
// bypasses the rate_limit_event/api_retry ambiguity entirely.
|
|
85
|
+
if (turn.resultFrameSeen && turn.resultIsError === true) {
|
|
86
|
+
const status = turn.resultApiErrorStatus;
|
|
87
|
+
if (typeof status === 'number') {
|
|
88
|
+
// 401 / 403 → fatal-auth (don't retry; operator action)
|
|
89
|
+
if (status === 401 || status === 403)
|
|
90
|
+
return 'fatal';
|
|
91
|
+
// 400 / 404 / 422 etc → fatal (bad request; retry won't help)
|
|
92
|
+
if (status >= 400 && status < 500)
|
|
93
|
+
return 'fatal';
|
|
94
|
+
// 5xx + 529 (overloaded) → retriable backoff
|
|
95
|
+
if (status >= 500)
|
|
96
|
+
return 'retriable-with-backoff';
|
|
97
|
+
}
|
|
98
|
+
// is_error=true but no HTTP status — fall through to the precedence
|
|
99
|
+
// table below; the api_retry / rate_limit_event channels may carry
|
|
100
|
+
// a category we can map.
|
|
101
|
+
}
|
|
102
|
+
// ── PRECEDENCE RULE 1 — subprocess+stderr-regex (highest fatal) ──
|
|
103
|
+
// Auth/billing failures NOT surfaced via api_retry (older CLI versions,
|
|
104
|
+
// shell-level keychain failures, etc). Stderr regex is the catch-all.
|
|
105
|
+
if (AUTH_FAILURE_STDERR_RE.test(stderr))
|
|
106
|
+
return 'fatal';
|
|
107
|
+
if (BILLING_FAILURE_STDERR_RE.test(stderr))
|
|
108
|
+
return 'fatal';
|
|
109
|
+
// ── PRECEDENCE RULE 2 — api_retry fatal categories ──
|
|
110
|
+
// Architect Constraint #5: auth/billing/oauth-org/invalid-request stay
|
|
111
|
+
// on system/api_retry + stderr regex; rate_limit_event doesn't carry
|
|
112
|
+
// these categories.
|
|
113
|
+
for (const evt of turn.apiRetryEvents) {
|
|
114
|
+
const cat = evt.error;
|
|
115
|
+
if (cat === 'authentication_failed' ||
|
|
116
|
+
cat === 'oauth_org_not_allowed' ||
|
|
117
|
+
cat === 'billing_error' ||
|
|
118
|
+
cat === 'invalid_request' ||
|
|
119
|
+
// max_output_tokens — design §11.4 spike-check uncertain whether
|
|
120
|
+
// CLI emits via api_retry or only result.stop_reason. Either way
|
|
121
|
+
// it's fatal at the budget level (same prompt → same limit on
|
|
122
|
+
// retry); architect agreed in spike-comment thread.
|
|
123
|
+
cat === 'max_output_tokens') {
|
|
124
|
+
return 'fatal';
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
// ── PRECEDENCE RULE 3 — rate_limit_event(blocked, blocked) ──
|
|
128
|
+
// Subscription cap hit AND extra-usage pool exhausted — operator must
|
|
129
|
+
// top up or wait for plan reset. Architect Constraint #2.
|
|
130
|
+
for (const evt of turn.rateLimitEvents) {
|
|
131
|
+
if (isRateLimitFatal(evt))
|
|
132
|
+
return 'fatal';
|
|
133
|
+
}
|
|
134
|
+
// ── PRECEDENCE RULE 4 — api_retry transient categories ──
|
|
135
|
+
// CLI's own backoff already retries internally; if the subprocess
|
|
136
|
+
// exited anyway, the retry didn't help. Treat as retriable-with-backoff
|
|
137
|
+
// so the adapter's outer budget eventually escalates to fatal after
|
|
138
|
+
// sustained transient failures.
|
|
139
|
+
for (const evt of turn.apiRetryEvents) {
|
|
140
|
+
const cat = evt.error;
|
|
141
|
+
if (cat === 'rate_limit' ||
|
|
142
|
+
cat === 'server_error' ||
|
|
143
|
+
cat === 'unknown') {
|
|
144
|
+
return 'retriable-with-backoff';
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// ── PRECEDENCE RULE 5 — rate_limit_event(blocked, allowed) ──
|
|
148
|
+
// Subscription cap hit but extra-usage still good. CLI's own retry
|
|
149
|
+
// should kick in via api_retry (above) on the next subprocess
|
|
150
|
+
// invocation; classify as retriable-with-backoff.
|
|
151
|
+
for (const evt of turn.rateLimitEvents) {
|
|
152
|
+
if (isRateLimitTransient(evt))
|
|
153
|
+
return 'retriable-with-backoff';
|
|
154
|
+
}
|
|
155
|
+
// ── No recognized signal — distinguish caller-initiated abort from
|
|
156
|
+
// subprocess crash by exit code. ──
|
|
157
|
+
// SIGTERMed by us (lease loss / superseded) → retriable-immediate;
|
|
158
|
+
// subprocess crashed without a clear signal → retriable-with-backoff.
|
|
159
|
+
if (exitCode === null)
|
|
160
|
+
return 'retriable-immediate';
|
|
161
|
+
return 'retriable-with-backoff';
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* `rate_limit_event` is fatal iff BOTH the subscription cap (`status`)
|
|
165
|
+
* AND the extra-usage pool (`overageStatus`) are blocked. Architect
|
|
166
|
+
* Constraint #2.
|
|
167
|
+
*/
|
|
168
|
+
function isRateLimitFatal(evt) {
|
|
169
|
+
const info = evt.rate_limit_info;
|
|
170
|
+
if (!info)
|
|
171
|
+
return false;
|
|
172
|
+
return info.status === 'blocked' && info.overageStatus === 'blocked';
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* `rate_limit_event` is retriable-transient iff the subscription cap is
|
|
176
|
+
* blocked but the extra-usage pool is still allowed. Architect
|
|
177
|
+
* Constraint #3. Crucially this does NOT match `status: 'allowed'` —
|
|
178
|
+
* Architect Constraint #1: `status: 'allowed'` is NEVER a classifier
|
|
179
|
+
* input (it fires informationally on every successful turn).
|
|
180
|
+
*/
|
|
181
|
+
function isRateLimitTransient(evt) {
|
|
182
|
+
const info = evt.rate_limit_info;
|
|
183
|
+
if (!info)
|
|
184
|
+
return false;
|
|
185
|
+
return info.status === 'blocked' && info.overageStatus === 'allowed';
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* Build an operator-facing error message from a classifier input. Used
|
|
189
|
+
* by the adapter's surfaced detach reason so `attachment_info` shows
|
|
190
|
+
* something actionable instead of a bare HTTP code.
|
|
191
|
+
*
|
|
192
|
+
* Mirrors the design §5.4 messages — same operator copy as the original
|
|
193
|
+
* `system/api_retry` table, generalized to also fire from the result-
|
|
194
|
+
* frame-driven preferred path.
|
|
195
|
+
*/
|
|
196
|
+
function describeFailure(ctx) {
|
|
197
|
+
const { stderr, turn } = ctx;
|
|
198
|
+
// Result-frame preferred path
|
|
199
|
+
if (turn.resultFrameSeen && turn.resultIsError === true) {
|
|
200
|
+
const status = turn.resultApiErrorStatus;
|
|
201
|
+
if (status === 401 || status === 403) {
|
|
202
|
+
return `Authentication failed (HTTP ${status}). Run \`claude auth status\` to diagnose; \`claude auth login\` if needed.`;
|
|
203
|
+
}
|
|
204
|
+
if (status === 400) {
|
|
205
|
+
return `Invalid request (HTTP ${status}). Likely a config bug — check stderr for details.`;
|
|
206
|
+
}
|
|
207
|
+
if (typeof status === 'number' && status >= 400 && status < 500) {
|
|
208
|
+
return `Client error (HTTP ${status}). Inspect stderr for details.`;
|
|
209
|
+
}
|
|
210
|
+
if (typeof status === 'number' && status >= 500) {
|
|
211
|
+
return `Server error (HTTP ${status}) — Anthropic API is having trouble. Will retry with backoff.`;
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// api_retry-fatal categories
|
|
215
|
+
for (const evt of turn.apiRetryEvents) {
|
|
216
|
+
const cat = evt.error;
|
|
217
|
+
if (cat === 'authentication_failed') {
|
|
218
|
+
return `\`claude\` is not logged in or token expired. Run \`claude auth status\` to diagnose.`;
|
|
219
|
+
}
|
|
220
|
+
if (cat === 'oauth_org_not_allowed') {
|
|
221
|
+
return `OAuth org access denied. Authorize agent-tempo via \`claude auth login --org <id>\` or recruit with \`agent: 'claude-api'\`.`;
|
|
222
|
+
}
|
|
223
|
+
if (cat === 'billing_error') {
|
|
224
|
+
return `Subscription extra-usage exhausted. Top up at console.anthropic.com or wait for plan reset. Recruit with \`agent: 'claude-api'\` to use Console credits instead.`;
|
|
225
|
+
}
|
|
226
|
+
if (cat === 'invalid_request') {
|
|
227
|
+
return `Invalid request (api_retry: invalid_request). Likely a bug — log includes full retry-event payload.`;
|
|
228
|
+
}
|
|
229
|
+
if (cat === 'max_output_tokens') {
|
|
230
|
+
return `Turn ended at max_output_tokens — the prompt is too large for one turn. Split into smaller cues.`;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
// rate_limit_event fatal
|
|
234
|
+
for (const evt of turn.rateLimitEvents) {
|
|
235
|
+
if (isRateLimitFatal(evt)) {
|
|
236
|
+
return `Subscription + extra-usage both exhausted. Top up at console.anthropic.com or wait for plan reset. Recruit with \`agent: 'claude-api'\` to use Console credits instead.`;
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
// Stderr signals
|
|
240
|
+
if (AUTH_FAILURE_STDERR_RE.test(stderr)) {
|
|
241
|
+
return `\`claude\` auth failure (stderr regex match). Run \`claude auth status\` to diagnose.`;
|
|
242
|
+
}
|
|
243
|
+
if (BILLING_FAILURE_STDERR_RE.test(stderr)) {
|
|
244
|
+
return `Billing failure (stderr regex match). Check console.anthropic.com.`;
|
|
245
|
+
}
|
|
246
|
+
// Generic fallback
|
|
247
|
+
const tail = stderr ? `: ${stderr.slice(0, 200)}` : '';
|
|
248
|
+
return `\`claude -p\` failure (no recognized category)${tail}`;
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Helper: was the rate_limit_event observation purely informational?
|
|
252
|
+
* Architect Constraint #1 — `status: 'allowed'` events fire on every
|
|
253
|
+
* successful turn and MUST be ignored by the classifier. Exposed so
|
|
254
|
+
* adapter telemetry can log only the action-required ones.
|
|
255
|
+
*/
|
|
256
|
+
function isRateLimitInformational(evt) {
|
|
257
|
+
return evt.rate_limit_info?.status === 'allowed';
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Helper for the classifier-precedence regression test: classify a
|
|
261
|
+
* synthesized retry event without spinning up the full subprocess
|
|
262
|
+
* machinery. Mirrors `mapSubprocessFailure` but operates on a single
|
|
263
|
+
* `system/api_retry` event in isolation. Internal helper for tests
|
|
264
|
+
* only — production callers go through `mapSubprocessFailure`.
|
|
265
|
+
*
|
|
266
|
+
* @internal
|
|
267
|
+
*/
|
|
268
|
+
function _classifyApiRetryForTest(evt) {
|
|
269
|
+
const cat = evt.error;
|
|
270
|
+
if (cat === 'authentication_failed' ||
|
|
271
|
+
cat === 'oauth_org_not_allowed' ||
|
|
272
|
+
cat === 'billing_error' ||
|
|
273
|
+
cat === 'invalid_request' ||
|
|
274
|
+
cat === 'max_output_tokens') {
|
|
275
|
+
return 'fatal';
|
|
276
|
+
}
|
|
277
|
+
if (cat === 'rate_limit' || cat === 'server_error' || cat === 'unknown') {
|
|
278
|
+
return 'retriable-with-backoff';
|
|
279
|
+
}
|
|
280
|
+
return null;
|
|
281
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* claude-code-headless adapter — barrel export.
|
|
3
|
+
*
|
|
4
|
+
* Re-exports the descriptor, class, and pre-flight probes from
|
|
5
|
+
* `./adapter` and `./pre-flight`. `src/adapters/index.ts` imports the
|
|
6
|
+
* descriptor here at module load and registers it with the singleton
|
|
7
|
+
* `AdapterRegistry`. Direct consumers should fetch from the registry,
|
|
8
|
+
* not import the descriptor directly.
|
|
9
|
+
*
|
|
10
|
+
* Same cycle-avoidance pattern as `src/adapters/claude-api/index.ts`,
|
|
11
|
+
* `src/adapters/opencode/index.ts`, and `src/adapters/copilot/index.ts`.
|
|
12
|
+
*
|
|
13
|
+
* Design reference: docs/design/520-claude-code-headless-adapter.md §3.5.
|
|
14
|
+
*/
|
|
15
|
+
export { ClaudeCodeHeadlessAttachment, claudeCodeHeadlessDescriptor, type ClaudeCodeHeadlessAdapterOptions, } from './adapter';
|
|
16
|
+
export { CLAUDE_CODE_PERMISSION_MODES, type ClaudeCodeHeadlessPermissionMode, } from './types';
|
|
17
|
+
export { probeClaudeBinary, probeClaudeAuth, parseAuthStatusOutput, type BinaryProbeResult, type AuthProbeResult, } from './pre-flight';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.parseAuthStatusOutput = exports.probeClaudeAuth = exports.probeClaudeBinary = exports.CLAUDE_CODE_PERMISSION_MODES = exports.claudeCodeHeadlessDescriptor = exports.ClaudeCodeHeadlessAttachment = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* claude-code-headless adapter — barrel export.
|
|
6
|
+
*
|
|
7
|
+
* Re-exports the descriptor, class, and pre-flight probes from
|
|
8
|
+
* `./adapter` and `./pre-flight`. `src/adapters/index.ts` imports the
|
|
9
|
+
* descriptor here at module load and registers it with the singleton
|
|
10
|
+
* `AdapterRegistry`. Direct consumers should fetch from the registry,
|
|
11
|
+
* not import the descriptor directly.
|
|
12
|
+
*
|
|
13
|
+
* Same cycle-avoidance pattern as `src/adapters/claude-api/index.ts`,
|
|
14
|
+
* `src/adapters/opencode/index.ts`, and `src/adapters/copilot/index.ts`.
|
|
15
|
+
*
|
|
16
|
+
* Design reference: docs/design/520-claude-code-headless-adapter.md §3.5.
|
|
17
|
+
*/
|
|
18
|
+
var adapter_1 = require("./adapter");
|
|
19
|
+
Object.defineProperty(exports, "ClaudeCodeHeadlessAttachment", { enumerable: true, get: function () { return adapter_1.ClaudeCodeHeadlessAttachment; } });
|
|
20
|
+
Object.defineProperty(exports, "claudeCodeHeadlessDescriptor", { enumerable: true, get: function () { return adapter_1.claudeCodeHeadlessDescriptor; } });
|
|
21
|
+
var types_1 = require("./types");
|
|
22
|
+
Object.defineProperty(exports, "CLAUDE_CODE_PERMISSION_MODES", { enumerable: true, get: function () { return types_1.CLAUDE_CODE_PERMISSION_MODES; } });
|
|
23
|
+
var pre_flight_1 = require("./pre-flight");
|
|
24
|
+
Object.defineProperty(exports, "probeClaudeBinary", { enumerable: true, get: function () { return pre_flight_1.probeClaudeBinary; } });
|
|
25
|
+
Object.defineProperty(exports, "probeClaudeAuth", { enumerable: true, get: function () { return pre_flight_1.probeClaudeAuth; } });
|
|
26
|
+
Object.defineProperty(exports, "parseAuthStatusOutput", { enumerable: true, get: function () { return pre_flight_1.parseAuthStatusOutput; } });
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/** Result of {@link probeClaudeBinary} — combined version + presence info. */
|
|
2
|
+
export interface BinaryProbeResult {
|
|
3
|
+
/** True if `claude --version` exited 0 within the timeout. */
|
|
4
|
+
ok: boolean;
|
|
5
|
+
/** Reported version string (e.g. `"2.1.126"`) when `ok`; undefined otherwise. */
|
|
6
|
+
version?: string;
|
|
7
|
+
/** Operator-actionable error string when `ok === false`. */
|
|
8
|
+
error?: string;
|
|
9
|
+
}
|
|
10
|
+
/** Result of {@link probeClaudeAuth} — parsed `claude auth status` envelope. */
|
|
11
|
+
export interface AuthProbeResult {
|
|
12
|
+
/** True iff the CLI reports `loggedIn: true`. */
|
|
13
|
+
loggedIn: boolean;
|
|
14
|
+
/** `'claude.ai'` (subscription) | `'api-token'` (long-lived OAuth) | other CLI string. Undefined when logged out. */
|
|
15
|
+
authMethod?: string;
|
|
16
|
+
/** `'firstParty'` (Anthropic direct) | other (Bedrock, Vertex, …). */
|
|
17
|
+
apiProvider?: string;
|
|
18
|
+
/** Operator-actionable error string when the probe failed (timeout, parse error, exit non-zero). */
|
|
19
|
+
error?: string;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Probe whether `claude --version` is callable on the host PATH and returns
|
|
23
|
+
* a parseable version string. Bounded by {@link VERSION_PROBE_TIMEOUT_MS} so
|
|
24
|
+
* a hung binary can't stall the recruit pre-flight.
|
|
25
|
+
*
|
|
26
|
+
* Returns `{ ok: false, error }` for missing binary, hung process, or
|
|
27
|
+
* non-zero exit. The error string is operator-actionable (mentions both
|
|
28
|
+
* "install" and "PATH" so the user knows where to start).
|
|
29
|
+
*/
|
|
30
|
+
export declare function probeClaudeBinary(claudeBin?: string): BinaryProbeResult;
|
|
31
|
+
/**
|
|
32
|
+
* Probe whether the host's Claude Code CLI is logged in to an Anthropic
|
|
33
|
+
* account. Calls `claude auth status` — an official supported subcommand
|
|
34
|
+
* that does NOT make a billed API call.
|
|
35
|
+
*
|
|
36
|
+
* Per spike findings (#520 §11.3), exit code is 0 in all cases — the
|
|
37
|
+
* boolean `loggedIn` field in the JSON envelope is the source of truth.
|
|
38
|
+
*
|
|
39
|
+
* Returns `{ loggedIn: false, error }` for: not-logged-in, malformed JSON,
|
|
40
|
+
* timeout, or spawn failure. Caller surfaces `error` actionably.
|
|
41
|
+
*/
|
|
42
|
+
export declare function probeClaudeAuth(claudeBin?: string): AuthProbeResult;
|
|
43
|
+
/**
|
|
44
|
+
* Parse a `claude auth status` stdout envelope. Exported for unit tests
|
|
45
|
+
* that load fixtures from `tests/adapters/fixtures/claude-code-headless/`.
|
|
46
|
+
*
|
|
47
|
+
* Per spike findings, the schema is JSON `{loggedIn, authMethod?, apiProvider?, ...}`.
|
|
48
|
+
* Logged-out variant is `{loggedIn: false}`. We tolerate trailing whitespace
|
|
49
|
+
* and missing optional fields.
|
|
50
|
+
*/
|
|
51
|
+
export declare function parseAuthStatusOutput(stdout: string, exitStatus: number | null, claudeBin?: string): AuthProbeResult;
|