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,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `OPENCODE_CONFIG_CONTENT` synthesis for the opencode adapter.
|
|
3
|
+
*
|
|
4
|
+
* The adapter inlines the OpenCode config rather than writing a file —
|
|
5
|
+
* no filesystem cleanup risk, no permissions concerns, secrets-redacted
|
|
6
|
+
* stderr config-log preserves debuggability. ADR 0015 Q2.
|
|
7
|
+
*
|
|
8
|
+
* The synthesized config:
|
|
9
|
+
* - Hardcodes `--hostname 127.0.0.1` and `mdns: false` (security
|
|
10
|
+
* mitigation for OpenCode's no-Bearer-auth in v1.14.x). NOT
|
|
11
|
+
* configurable — see ADR 0015 §53 + design §6.
|
|
12
|
+
* - Auto-detects the provider from the `model` arg's `provider/...`
|
|
13
|
+
* prefix and emits a `provider.<name>.options` block for whichever
|
|
14
|
+
* env vars are present (mirrors OpenCode's own behavior).
|
|
15
|
+
* - Registers agent-tempo as an OpenCode MCP child via `type: "local"`
|
|
16
|
+
* stdio. OpenCode spawns a SECOND copy of `dist/server.js` as its
|
|
17
|
+
* MCP subprocess and dispatches tool calls there directly — the
|
|
18
|
+
* adapter is never on the tool-dispatch hot path.
|
|
19
|
+
*
|
|
20
|
+
* Design reference: docs/design/449-opencode-adapter.md §3.7, §4.1.
|
|
21
|
+
*/
|
|
22
|
+
/**
|
|
23
|
+
* Map of provider id (matches the prefix in `model: 'provider/name'`) to
|
|
24
|
+
* the env var name that holds the API key. Population is best-effort —
|
|
25
|
+
* if the env var isn't set, the corresponding `provider.X.options` block
|
|
26
|
+
* is omitted and OpenCode either falls back to its own auth chain (e.g.
|
|
27
|
+
* macOS Keychain for Anthropic OAuth) or fails the session-create with
|
|
28
|
+
* a clear error.
|
|
29
|
+
*/
|
|
30
|
+
export declare const PROVIDER_ENV_MAP: Readonly<Record<string, string>>;
|
|
31
|
+
export type ProviderEnvMap = Readonly<Record<string, string>>;
|
|
32
|
+
/**
|
|
33
|
+
* Extract the provider id from a `provider/model` string. Returns `null`
|
|
34
|
+
* when the input doesn't have a `/` (e.g. legacy claude-api ids like
|
|
35
|
+
* `claude-opus-4-7`) — caller decides whether to default to a particular
|
|
36
|
+
* provider or surface the error.
|
|
37
|
+
*/
|
|
38
|
+
export declare function detectProviderEnvFromModel(model: string): string | null;
|
|
39
|
+
/**
|
|
40
|
+
* Inputs for {@link synthesizeOpenCodeConfig}. Each field maps to one
|
|
41
|
+
* branch of the synthesized JSON.
|
|
42
|
+
*/
|
|
43
|
+
export interface SynthesizeOpenCodeConfigOpts {
|
|
44
|
+
/** Combined `provider/model` recruit-arg, e.g. `'anthropic/claude-opus-4-7'`. */
|
|
45
|
+
model: string;
|
|
46
|
+
/** Probed-free port `opencode serve` will bind. */
|
|
47
|
+
port: number;
|
|
48
|
+
/** Absolute path to agent-tempo's `dist/server.js` — runs as OpenCode's MCP child. */
|
|
49
|
+
mcpServerPath: string;
|
|
50
|
+
/** Ensemble name — passed through to the MCP child env. */
|
|
51
|
+
ensemble: string;
|
|
52
|
+
/** Player name — passed through to the MCP child env. */
|
|
53
|
+
playerName: string;
|
|
54
|
+
/** Temporal address — passed through to the MCP child env. */
|
|
55
|
+
temporalAddress: string;
|
|
56
|
+
/** Temporal namespace — passed through to the MCP child env. */
|
|
57
|
+
temporalNamespace: string;
|
|
58
|
+
/**
|
|
59
|
+
* Test seam — defaults to `process.env`. Tests inject a stub map to
|
|
60
|
+
* exercise the provider-detection + env-var-presence branches without
|
|
61
|
+
* mutating the real environment.
|
|
62
|
+
*/
|
|
63
|
+
env?: NodeJS.ProcessEnv;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Synthesize the inline `OPENCODE_CONFIG_CONTENT` JSON value. Returns the
|
|
67
|
+
* stringified JSON, ready to set as the env var on the `opencode serve`
|
|
68
|
+
* spawn. Caller passes through {@link redactSecrets} before logging.
|
|
69
|
+
*
|
|
70
|
+
* Shape per design §3.7:
|
|
71
|
+
* ```json
|
|
72
|
+
* {
|
|
73
|
+
* "model": "anthropic/claude-opus-4-7",
|
|
74
|
+
* "provider": { "anthropic": { "options": { "apiKey": "{env:ANTHROPIC_API_KEY}" } } },
|
|
75
|
+
* "server": { "port": 4732, "hostname": "127.0.0.1", "mdns": false },
|
|
76
|
+
* "mcp": {
|
|
77
|
+
* "agent-tempo": {
|
|
78
|
+
* "type": "local",
|
|
79
|
+
* "command": ["node", "/abs/path/to/dist/server.js"],
|
|
80
|
+
* "environment": { "AGENT_TEMPO_ENSEMBLE": "{env:AGENT_TEMPO_ENSEMBLE}", … }
|
|
81
|
+
* }
|
|
82
|
+
* }
|
|
83
|
+
* }
|
|
84
|
+
* ```
|
|
85
|
+
*
|
|
86
|
+
* The `{env:VAR}` markers are OpenCode-native substitutions — OpenCode
|
|
87
|
+
* resolves them at config-read time, so credentials never appear in the
|
|
88
|
+
* literal JSON we hand to the subprocess.
|
|
89
|
+
*/
|
|
90
|
+
export declare function synthesizeOpenCodeConfig(opts: SynthesizeOpenCodeConfigOpts): string;
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* `OPENCODE_CONFIG_CONTENT` synthesis for the opencode adapter.
|
|
4
|
+
*
|
|
5
|
+
* The adapter inlines the OpenCode config rather than writing a file —
|
|
6
|
+
* no filesystem cleanup risk, no permissions concerns, secrets-redacted
|
|
7
|
+
* stderr config-log preserves debuggability. ADR 0015 Q2.
|
|
8
|
+
*
|
|
9
|
+
* The synthesized config:
|
|
10
|
+
* - Hardcodes `--hostname 127.0.0.1` and `mdns: false` (security
|
|
11
|
+
* mitigation for OpenCode's no-Bearer-auth in v1.14.x). NOT
|
|
12
|
+
* configurable — see ADR 0015 §53 + design §6.
|
|
13
|
+
* - Auto-detects the provider from the `model` arg's `provider/...`
|
|
14
|
+
* prefix and emits a `provider.<name>.options` block for whichever
|
|
15
|
+
* env vars are present (mirrors OpenCode's own behavior).
|
|
16
|
+
* - Registers agent-tempo as an OpenCode MCP child via `type: "local"`
|
|
17
|
+
* stdio. OpenCode spawns a SECOND copy of `dist/server.js` as its
|
|
18
|
+
* MCP subprocess and dispatches tool calls there directly — the
|
|
19
|
+
* adapter is never on the tool-dispatch hot path.
|
|
20
|
+
*
|
|
21
|
+
* Design reference: docs/design/449-opencode-adapter.md §3.7, §4.1.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.PROVIDER_ENV_MAP = void 0;
|
|
25
|
+
exports.detectProviderEnvFromModel = detectProviderEnvFromModel;
|
|
26
|
+
exports.synthesizeOpenCodeConfig = synthesizeOpenCodeConfig;
|
|
27
|
+
/**
|
|
28
|
+
* Map of provider id (matches the prefix in `model: 'provider/name'`) to
|
|
29
|
+
* the env var name that holds the API key. Population is best-effort —
|
|
30
|
+
* if the env var isn't set, the corresponding `provider.X.options` block
|
|
31
|
+
* is omitted and OpenCode either falls back to its own auth chain (e.g.
|
|
32
|
+
* macOS Keychain for Anthropic OAuth) or fails the session-create with
|
|
33
|
+
* a clear error.
|
|
34
|
+
*/
|
|
35
|
+
exports.PROVIDER_ENV_MAP = Object.freeze({
|
|
36
|
+
anthropic: 'ANTHROPIC_API_KEY',
|
|
37
|
+
openai: 'OPENAI_API_KEY',
|
|
38
|
+
groq: 'GROQ_API_KEY',
|
|
39
|
+
deepseek: 'DEEPSEEK_API_KEY',
|
|
40
|
+
google: 'GOOGLE_API_KEY',
|
|
41
|
+
mistral: 'MISTRAL_API_KEY',
|
|
42
|
+
cohere: 'COHERE_API_KEY',
|
|
43
|
+
xai: 'XAI_API_KEY',
|
|
44
|
+
// Bedrock and Vertex use AWS / GCP creds, not a single bearer token.
|
|
45
|
+
// OpenCode reads the standard AWS/GCP env chain — no `provider.X.options`
|
|
46
|
+
// block needed here.
|
|
47
|
+
bedrock: '',
|
|
48
|
+
vertex: '',
|
|
49
|
+
// Ollama is local; no API key.
|
|
50
|
+
ollama: '',
|
|
51
|
+
// GitHub Copilot via OpenCode uses OAuth; no API key in env.
|
|
52
|
+
github: '',
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* Extract the provider id from a `provider/model` string. Returns `null`
|
|
56
|
+
* when the input doesn't have a `/` (e.g. legacy claude-api ids like
|
|
57
|
+
* `claude-opus-4-7`) — caller decides whether to default to a particular
|
|
58
|
+
* provider or surface the error.
|
|
59
|
+
*/
|
|
60
|
+
function detectProviderEnvFromModel(model) {
|
|
61
|
+
const slash = model.indexOf('/');
|
|
62
|
+
if (slash <= 0)
|
|
63
|
+
return null;
|
|
64
|
+
return model.slice(0, slash).toLowerCase();
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Synthesize the inline `OPENCODE_CONFIG_CONTENT` JSON value. Returns the
|
|
68
|
+
* stringified JSON, ready to set as the env var on the `opencode serve`
|
|
69
|
+
* spawn. Caller passes through {@link redactSecrets} before logging.
|
|
70
|
+
*
|
|
71
|
+
* Shape per design §3.7:
|
|
72
|
+
* ```json
|
|
73
|
+
* {
|
|
74
|
+
* "model": "anthropic/claude-opus-4-7",
|
|
75
|
+
* "provider": { "anthropic": { "options": { "apiKey": "{env:ANTHROPIC_API_KEY}" } } },
|
|
76
|
+
* "server": { "port": 4732, "hostname": "127.0.0.1", "mdns": false },
|
|
77
|
+
* "mcp": {
|
|
78
|
+
* "agent-tempo": {
|
|
79
|
+
* "type": "local",
|
|
80
|
+
* "command": ["node", "/abs/path/to/dist/server.js"],
|
|
81
|
+
* "environment": { "AGENT_TEMPO_ENSEMBLE": "{env:AGENT_TEMPO_ENSEMBLE}", … }
|
|
82
|
+
* }
|
|
83
|
+
* }
|
|
84
|
+
* }
|
|
85
|
+
* ```
|
|
86
|
+
*
|
|
87
|
+
* The `{env:VAR}` markers are OpenCode-native substitutions — OpenCode
|
|
88
|
+
* resolves them at config-read time, so credentials never appear in the
|
|
89
|
+
* literal JSON we hand to the subprocess.
|
|
90
|
+
*/
|
|
91
|
+
function synthesizeOpenCodeConfig(opts) {
|
|
92
|
+
const env = opts.env ?? process.env;
|
|
93
|
+
const providerId = detectProviderEnvFromModel(opts.model);
|
|
94
|
+
const providerBlock = {};
|
|
95
|
+
if (providerId) {
|
|
96
|
+
const envVarName = exports.PROVIDER_ENV_MAP[providerId];
|
|
97
|
+
if (envVarName && env[envVarName]) {
|
|
98
|
+
const options = {
|
|
99
|
+
apiKey: `{env:${envVarName}}`,
|
|
100
|
+
};
|
|
101
|
+
// Anthropic provider supports prompt caching; opt-in via the
|
|
102
|
+
// OpenCode-native `setCacheKey` knob. Other providers don't have an
|
|
103
|
+
// analog, so we only set this for the anthropic block.
|
|
104
|
+
if (providerId === 'anthropic') {
|
|
105
|
+
options.setCacheKey = true;
|
|
106
|
+
}
|
|
107
|
+
providerBlock[providerId] = { options };
|
|
108
|
+
}
|
|
109
|
+
// Bedrock / Vertex / Ollama / GitHub-Copilot intentionally skipped —
|
|
110
|
+
// they don't use a bearer-token env var; OpenCode reads their native
|
|
111
|
+
// auth chains (AWS env vars, gcloud ADC, local server, OAuth file).
|
|
112
|
+
}
|
|
113
|
+
const config = {
|
|
114
|
+
model: opts.model,
|
|
115
|
+
...(Object.keys(providerBlock).length > 0 ? { provider: providerBlock } : {}),
|
|
116
|
+
server: {
|
|
117
|
+
port: opts.port,
|
|
118
|
+
// SECURITY: hardcoded loopback. NOT configurable. ADR 0015 §53.
|
|
119
|
+
hostname: '127.0.0.1',
|
|
120
|
+
// SECURITY: avoid leaking session presence over Bonjour. ADR 0015 §82.
|
|
121
|
+
mdns: false,
|
|
122
|
+
},
|
|
123
|
+
mcp: {
|
|
124
|
+
'agent-tempo': {
|
|
125
|
+
type: 'local',
|
|
126
|
+
command: ['node', opts.mcpServerPath],
|
|
127
|
+
environment: {
|
|
128
|
+
AGENT_TEMPO_ENSEMBLE: '{env:AGENT_TEMPO_ENSEMBLE}',
|
|
129
|
+
AGENT_TEMPO_PLAYER_NAME: '{env:AGENT_TEMPO_PLAYER_NAME}',
|
|
130
|
+
TEMPORAL_ADDRESS: '{env:TEMPORAL_ADDRESS}',
|
|
131
|
+
TEMPORAL_NAMESPACE: '{env:TEMPORAL_NAMESPACE}',
|
|
132
|
+
},
|
|
133
|
+
},
|
|
134
|
+
},
|
|
135
|
+
};
|
|
136
|
+
return JSON.stringify(config);
|
|
137
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { ChildProcess } from 'child_process';
|
|
2
|
+
/**
|
|
3
|
+
* Probe a free TCP port on `127.0.0.1` by binding port 0 and reading the
|
|
4
|
+
* OS-assigned port. Same approach `src/http/server.ts` uses.
|
|
5
|
+
*
|
|
6
|
+
* The port is briefly bound and released — there is a TOCTOU window where
|
|
7
|
+
* another process could grab it before `opencode serve` starts. Acceptable
|
|
8
|
+
* for the v1 single-machine model: opencode is loopback-only and the
|
|
9
|
+
* single-tenant use case won't hit the race in practice.
|
|
10
|
+
*/
|
|
11
|
+
export declare function probeFreePort(): Promise<number>;
|
|
12
|
+
/**
|
|
13
|
+
* Wait for a `ChildProcess` to exit, with a timeout. Returns the exit code
|
|
14
|
+
* (or signal-as-string) on exit, or `null` on timeout.
|
|
15
|
+
*/
|
|
16
|
+
export declare function waitForExit(p: ChildProcess, timeoutMs: number): Promise<number | string | null>;
|
|
17
|
+
/**
|
|
18
|
+
* Redact API key substrings in a synthesized OpenCode config so the
|
|
19
|
+
* stderr config-log doesn't leak credentials. Any substring that looks
|
|
20
|
+
* like an API key (alphanumeric ≥20 chars, optionally prefixed `sk-` or
|
|
21
|
+
* `Bearer `) is replaced with `***`.
|
|
22
|
+
*
|
|
23
|
+
* Conservative: only known shapes are touched. The `{env:...}` substitution
|
|
24
|
+
* markers in the config (e.g. `"apiKey": "{env:ANTHROPIC_API_KEY}"`) are
|
|
25
|
+
* left intact because they don't contain literal credentials — OpenCode
|
|
26
|
+
* substitutes at read time.
|
|
27
|
+
*/
|
|
28
|
+
export declare function redactSecrets(json: string): string;
|
|
29
|
+
/**
|
|
30
|
+
* Compare a runtime version string to a tilde-pinned spec (e.g. `~1.14.29`).
|
|
31
|
+
* Returns `true` when `version` is on the same `MAJOR.MINOR` line as the
|
|
32
|
+
* spec — i.e. `1.14.29`, `1.14.30`, `1.14.99` all match `~1.14.29`, but
|
|
33
|
+
* `1.15.0` does not. Matches npm tilde-range semantics.
|
|
34
|
+
*
|
|
35
|
+
* Pure string compare — no semver dep. Both `version` and `spec` must be
|
|
36
|
+
* `MAJOR.MINOR.PATCH` (extra suffixes ignored). Returns `true` on
|
|
37
|
+
* unparseable inputs to avoid false-positive WARNING noise on weird
|
|
38
|
+
* builds (e.g. `1.14.29-rc1`).
|
|
39
|
+
*/
|
|
40
|
+
export declare function isVersionMatch(version: string, spec: string): boolean;
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.probeFreePort = probeFreePort;
|
|
37
|
+
exports.waitForExit = waitForExit;
|
|
38
|
+
exports.redactSecrets = redactSecrets;
|
|
39
|
+
exports.isVersionMatch = isVersionMatch;
|
|
40
|
+
/**
|
|
41
|
+
* Small, self-contained helpers for the opencode adapter.
|
|
42
|
+
*
|
|
43
|
+
* Kept out of `adapter.ts` so each can be unit-tested without the full
|
|
44
|
+
* Temporal/SdkAttachment scaffolding. Mirrors the per-adapter helpers
|
|
45
|
+
* pattern used by `src/adapters/claude-api/`.
|
|
46
|
+
*/
|
|
47
|
+
const net = __importStar(require("net"));
|
|
48
|
+
/**
|
|
49
|
+
* Probe a free TCP port on `127.0.0.1` by binding port 0 and reading the
|
|
50
|
+
* OS-assigned port. Same approach `src/http/server.ts` uses.
|
|
51
|
+
*
|
|
52
|
+
* The port is briefly bound and released — there is a TOCTOU window where
|
|
53
|
+
* another process could grab it before `opencode serve` starts. Acceptable
|
|
54
|
+
* for the v1 single-machine model: opencode is loopback-only and the
|
|
55
|
+
* single-tenant use case won't hit the race in practice.
|
|
56
|
+
*/
|
|
57
|
+
function probeFreePort() {
|
|
58
|
+
return new Promise((resolve, reject) => {
|
|
59
|
+
const server = net.createServer();
|
|
60
|
+
server.unref();
|
|
61
|
+
server.on('error', reject);
|
|
62
|
+
server.listen(0, '127.0.0.1', () => {
|
|
63
|
+
const addr = server.address();
|
|
64
|
+
if (typeof addr === 'object' && addr && 'port' in addr) {
|
|
65
|
+
const port = addr.port;
|
|
66
|
+
server.close((err) => (err ? reject(err) : resolve(port)));
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
server.close();
|
|
70
|
+
reject(new Error('probeFreePort: server.address() did not return an AddressInfo'));
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Wait for a `ChildProcess` to exit, with a timeout. Returns the exit code
|
|
77
|
+
* (or signal-as-string) on exit, or `null` on timeout.
|
|
78
|
+
*/
|
|
79
|
+
function waitForExit(p, timeoutMs) {
|
|
80
|
+
return new Promise((resolve) => {
|
|
81
|
+
if (p.killed && p.exitCode !== null) {
|
|
82
|
+
resolve(p.exitCode);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
let settled = false;
|
|
86
|
+
const onExit = (code, signal) => {
|
|
87
|
+
if (settled)
|
|
88
|
+
return;
|
|
89
|
+
settled = true;
|
|
90
|
+
clearTimeout(timer);
|
|
91
|
+
resolve(code ?? signal ?? null);
|
|
92
|
+
};
|
|
93
|
+
const timer = setTimeout(() => {
|
|
94
|
+
if (settled)
|
|
95
|
+
return;
|
|
96
|
+
settled = true;
|
|
97
|
+
p.removeListener('exit', onExit);
|
|
98
|
+
resolve(null);
|
|
99
|
+
}, timeoutMs);
|
|
100
|
+
p.once('exit', onExit);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Redact API key substrings in a synthesized OpenCode config so the
|
|
105
|
+
* stderr config-log doesn't leak credentials. Any substring that looks
|
|
106
|
+
* like an API key (alphanumeric ≥20 chars, optionally prefixed `sk-` or
|
|
107
|
+
* `Bearer `) is replaced with `***`.
|
|
108
|
+
*
|
|
109
|
+
* Conservative: only known shapes are touched. The `{env:...}` substitution
|
|
110
|
+
* markers in the config (e.g. `"apiKey": "{env:ANTHROPIC_API_KEY}"`) are
|
|
111
|
+
* left intact because they don't contain literal credentials — OpenCode
|
|
112
|
+
* substitutes at read time.
|
|
113
|
+
*/
|
|
114
|
+
function redactSecrets(json) {
|
|
115
|
+
// Match: "apiKey": "sk-foo..." or "apiKey": "long-token-here"
|
|
116
|
+
return json.replace(/("(?:apiKey|api_key|token|bearer|secret)"\s*:\s*")([^"]{20,})(")/gi, (_full, pre, value, post) => {
|
|
117
|
+
// Preserve `{env:...}` markers — they're config-shape, not secrets.
|
|
118
|
+
if (value.startsWith('{env:') && value.endsWith('}'))
|
|
119
|
+
return pre + value + post;
|
|
120
|
+
return pre + '***' + post;
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Compare a runtime version string to a tilde-pinned spec (e.g. `~1.14.29`).
|
|
125
|
+
* Returns `true` when `version` is on the same `MAJOR.MINOR` line as the
|
|
126
|
+
* spec — i.e. `1.14.29`, `1.14.30`, `1.14.99` all match `~1.14.29`, but
|
|
127
|
+
* `1.15.0` does not. Matches npm tilde-range semantics.
|
|
128
|
+
*
|
|
129
|
+
* Pure string compare — no semver dep. Both `version` and `spec` must be
|
|
130
|
+
* `MAJOR.MINOR.PATCH` (extra suffixes ignored). Returns `true` on
|
|
131
|
+
* unparseable inputs to avoid false-positive WARNING noise on weird
|
|
132
|
+
* builds (e.g. `1.14.29-rc1`).
|
|
133
|
+
*/
|
|
134
|
+
function isVersionMatch(version, spec) {
|
|
135
|
+
const versionMajorMinor = parseMajorMinor(version);
|
|
136
|
+
const specMajorMinor = parseMajorMinor(spec.replace(/^~/, ''));
|
|
137
|
+
if (!versionMajorMinor || !specMajorMinor)
|
|
138
|
+
return true;
|
|
139
|
+
return versionMajorMinor === specMajorMinor;
|
|
140
|
+
}
|
|
141
|
+
function parseMajorMinor(s) {
|
|
142
|
+
const m = /(\d+)\.(\d+)\.\d+/.exec(s);
|
|
143
|
+
return m ? `${m[1]}.${m[2]}` : null;
|
|
144
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* opencode 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
|
+
* Same cycle-avoidance pattern as `src/adapters/claude-api/index.ts` and
|
|
10
|
+
* `src/adapters/copilot/index.ts`.
|
|
11
|
+
*/
|
|
12
|
+
export { OpenCodeAttachment, opencodeDescriptor } from './adapter';
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.opencodeDescriptor = exports.OpenCodeAttachment = void 0;
|
|
4
|
+
/**
|
|
5
|
+
* opencode 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
|
+
* Same cycle-avoidance pattern as `src/adapters/claude-api/index.ts` and
|
|
13
|
+
* `src/adapters/copilot/index.ts`.
|
|
14
|
+
*/
|
|
15
|
+
var adapter_1 = require("./adapter");
|
|
16
|
+
Object.defineProperty(exports, "OpenCodeAttachment", { enumerable: true, get: function () { return adapter_1.OpenCodeAttachment; } });
|
|
17
|
+
Object.defineProperty(exports, "opencodeDescriptor", { enumerable: true, get: function () { return adapter_1.opencodeDescriptor; } });
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Thin HTTP/SSE wrapper around `opencode serve`.
|
|
3
|
+
*
|
|
4
|
+
* Hand-rolled over native `fetch` rather than `@opencode-ai/sdk` per design
|
|
5
|
+
* §8.3 LoC tightening proposal #2 — the SDK is auto-generated from
|
|
6
|
+
* OpenAPI 3.1, so it pulls in OpenAPI runtime + per-endpoint typed clients
|
|
7
|
+
* for ~50 endpoints. Our hot path uses ~5 endpoints + the `/event` SSE
|
|
8
|
+
* stream; the SDK weight isn't worth it. The architectural shape of the
|
|
9
|
+
* adapter is identical either way.
|
|
10
|
+
*
|
|
11
|
+
* The SDK is still listed as an `optionalDependency` and `require.resolve`
|
|
12
|
+
* gates the recruit pre-flight (ADR 0015 §85) — operators install it as
|
|
13
|
+
* the signal that opencode integration is intended on this host. Adapter
|
|
14
|
+
* runtime, however, never imports it.
|
|
15
|
+
*
|
|
16
|
+
* Contract surface (5 methods + 1 generator):
|
|
17
|
+
* - `waitForHealth(timeoutMs)`
|
|
18
|
+
* - `getHealth()`
|
|
19
|
+
* - `createSession()`
|
|
20
|
+
* - `promptAsync(sessionId, body)`
|
|
21
|
+
* - `abortSession(sessionId)`
|
|
22
|
+
* - `deleteSession(sessionId)`
|
|
23
|
+
* - `subscribeEvents(abortSignal)` — async generator yielding parsed events
|
|
24
|
+
*
|
|
25
|
+
* Design reference: docs/design/449-opencode-adapter.md §5.3, §8.1.
|
|
26
|
+
*/
|
|
27
|
+
/**
|
|
28
|
+
* Health response shape from `GET /global/health`. Drift-tolerant — only
|
|
29
|
+
* the `version` field is read, everything else is forwarded as `unknown`.
|
|
30
|
+
*/
|
|
31
|
+
export interface OpenCodeHealth {
|
|
32
|
+
version: string;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Newly-created session shape from `POST /session`. Drift-tolerant — only
|
|
36
|
+
* the `id` field is read.
|
|
37
|
+
*/
|
|
38
|
+
export interface OpenCodeSession {
|
|
39
|
+
id: string;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Body for `POST /session/:id/prompt_async`. The adapter sends the system
|
|
43
|
+
* prompt + the new turn's parts (agent-tempo workflow's pendingMessages
|
|
44
|
+
* flattened into a parts array) plus the model id to use for this turn.
|
|
45
|
+
*/
|
|
46
|
+
export interface PromptAsyncBody {
|
|
47
|
+
model: string;
|
|
48
|
+
system?: string;
|
|
49
|
+
parts: Array<{
|
|
50
|
+
type: 'text';
|
|
51
|
+
text: string;
|
|
52
|
+
}>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* One SSE event from the `/event` stream. OpenCode's event surface is
|
|
56
|
+
* still labeled experimental (ADR 0015 §82) so we model it permissively
|
|
57
|
+
* — `type` is parsed, the rest forwarded as `unknown`. Consumers
|
|
58
|
+
* narrow on `type` and read the fields they need.
|
|
59
|
+
*/
|
|
60
|
+
export interface OpenCodeEvent {
|
|
61
|
+
type: string;
|
|
62
|
+
[key: string]: unknown;
|
|
63
|
+
}
|
|
64
|
+
export interface ServerBridgeOpts {
|
|
65
|
+
/** Base URL — `http://127.0.0.1:<port>` per the loopback-only model. */
|
|
66
|
+
baseUrl: string;
|
|
67
|
+
/** Logger — adapter passes its `[agent-tempo:opencode]` prefix here. */
|
|
68
|
+
log?: (...args: unknown[]) => void;
|
|
69
|
+
/**
|
|
70
|
+
* Test seam — defaults to global `fetch`. Tests inject a stub to drive
|
|
71
|
+
* canned responses without standing up a real http server.
|
|
72
|
+
*/
|
|
73
|
+
fetchImpl?: typeof fetch;
|
|
74
|
+
}
|
|
75
|
+
export declare class OpenCodeServerBridge {
|
|
76
|
+
private readonly baseUrl;
|
|
77
|
+
private readonly log;
|
|
78
|
+
private readonly fetchImpl;
|
|
79
|
+
constructor(opts: ServerBridgeOpts);
|
|
80
|
+
/**
|
|
81
|
+
* Poll `GET /global/health` until 200 or `timeoutMs` elapses. Throws on
|
|
82
|
+
* timeout — caller is the adapter `run()` and a missing health probe
|
|
83
|
+
* means opencode didn't boot.
|
|
84
|
+
*/
|
|
85
|
+
waitForHealth(timeoutMs: number): Promise<void>;
|
|
86
|
+
/** `GET /global/health` — version + healthy flag. */
|
|
87
|
+
getHealth(): Promise<OpenCodeHealth>;
|
|
88
|
+
/** `POST /session` — create a new session; returns the session id + meta. */
|
|
89
|
+
createSession(): Promise<OpenCodeSession>;
|
|
90
|
+
/**
|
|
91
|
+
* `POST /session/:id/prompt_async` — send a turn; returns 204 immediately
|
|
92
|
+
* and the turn streams over `/event` SSE. Caller is responsible for
|
|
93
|
+
* subscribing to events first.
|
|
94
|
+
*/
|
|
95
|
+
promptAsync(sessionId: string, body: PromptAsyncBody): Promise<void>;
|
|
96
|
+
/**
|
|
97
|
+
* `POST /session/:id/abort` — graceful turn cancellation. The primary
|
|
98
|
+
* cancellation path on lease revocation; subprocess SIGTERM is the
|
|
99
|
+
* fallback only if this hangs.
|
|
100
|
+
*
|
|
101
|
+
* Best-effort — swallows non-2xx so the adapter's superseded path can
|
|
102
|
+
* still fall through to subprocess kill without surfacing an error.
|
|
103
|
+
*/
|
|
104
|
+
abortSession(sessionId: string, opts?: {
|
|
105
|
+
signal?: AbortSignal;
|
|
106
|
+
}): Promise<void>;
|
|
107
|
+
/**
|
|
108
|
+
* `DELETE /session/:id` — free server-side session resources. Called on
|
|
109
|
+
* graceful detach. Best-effort — swallows non-2xx.
|
|
110
|
+
*/
|
|
111
|
+
deleteSession(sessionId: string): Promise<void>;
|
|
112
|
+
/**
|
|
113
|
+
* `GET /event` — SSE stream of session events. Returns an async
|
|
114
|
+
* generator that yields parsed `OpenCodeEvent` objects until the
|
|
115
|
+
* abort signal fires or the stream closes.
|
|
116
|
+
*
|
|
117
|
+
* The caller is responsible for filtering events by session id —
|
|
118
|
+
* `/event` is global per `opencode serve` instance, but the v1
|
|
119
|
+
* subprocess-per-player model means there's only ever one session
|
|
120
|
+
* per stream anyway. Phase 2 subprocess-shared optimization would
|
|
121
|
+
* make filtering meaningful.
|
|
122
|
+
*/
|
|
123
|
+
subscribeEvents(signal?: AbortSignal): AsyncGenerator<OpenCodeEvent, void, void>;
|
|
124
|
+
}
|