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.
Files changed (484) hide show
  1. package/CLAUDE.md +213 -0
  2. package/LICENSE +21 -0
  3. package/README.md +289 -0
  4. package/assets/icon-32.png +0 -0
  5. package/assets/icon-512.png +0 -0
  6. package/assets/icon-64.png +0 -0
  7. package/assets/icon-dark-32.png +0 -0
  8. package/assets/icon-dark-64.png +0 -0
  9. package/assets/icon-dark.svg +9 -0
  10. package/assets/icon.svg +9 -0
  11. package/assets/logo-dark.svg +11 -0
  12. package/assets/logo-light.svg +11 -0
  13. package/dashboard/README.md +91 -0
  14. package/dashboard/dist/assets/index-CB78ToNE.css +2 -0
  15. package/dashboard/dist/assets/index-_5jV0Znu.js +62 -0
  16. package/dashboard/dist/assets/index-_5jV0Znu.js.map +1 -0
  17. package/dashboard/dist/index.html +21 -0
  18. package/dashboard/package.json +47 -0
  19. package/dist/activities/hard-terminate.d.ts +32 -0
  20. package/dist/activities/hard-terminate.js +460 -0
  21. package/dist/activities/maestro.d.ts +72 -0
  22. package/dist/activities/maestro.js +254 -0
  23. package/dist/activities/outbox.d.ts +188 -0
  24. package/dist/activities/outbox.js +849 -0
  25. package/dist/activities/resolve.d.ts +64 -0
  26. package/dist/activities/resolve.js +129 -0
  27. package/dist/activities/schedule-fire.d.ts +36 -0
  28. package/dist/activities/schedule-fire.js +147 -0
  29. package/dist/adapters/base.d.ts +426 -0
  30. package/dist/adapters/base.js +1270 -0
  31. package/dist/adapters/claude-api/adapter.d.ts +168 -0
  32. package/dist/adapters/claude-api/adapter.js +797 -0
  33. package/dist/adapters/claude-api/api-error.d.ts +96 -0
  34. package/dist/adapters/claude-api/api-error.js +191 -0
  35. package/dist/adapters/claude-api/index.d.ts +16 -0
  36. package/dist/adapters/claude-api/index.js +21 -0
  37. package/dist/adapters/claude-api/mcp-bridge.d.ts +50 -0
  38. package/dist/adapters/claude-api/mcp-bridge.js +157 -0
  39. package/dist/adapters/claude-code/adapter.d.ts +133 -0
  40. package/dist/adapters/claude-code/adapter.js +274 -0
  41. package/dist/adapters/claude-code/index.d.ts +15 -0
  42. package/dist/adapters/claude-code/index.js +20 -0
  43. package/dist/adapters/claude-code-headless/adapter.d.ts +131 -0
  44. package/dist/adapters/claude-code-headless/adapter.js +710 -0
  45. package/dist/adapters/claude-code-headless/error-mapper.d.ts +107 -0
  46. package/dist/adapters/claude-code-headless/error-mapper.js +281 -0
  47. package/dist/adapters/claude-code-headless/index.d.ts +17 -0
  48. package/dist/adapters/claude-code-headless/index.js +26 -0
  49. package/dist/adapters/claude-code-headless/pre-flight.d.ts +51 -0
  50. package/dist/adapters/claude-code-headless/pre-flight.js +207 -0
  51. package/dist/adapters/claude-code-headless/prompt.d.ts +93 -0
  52. package/dist/adapters/claude-code-headless/prompt.js +79 -0
  53. package/dist/adapters/claude-code-headless/stream-json.d.ts +242 -0
  54. package/dist/adapters/claude-code-headless/stream-json.js +208 -0
  55. package/dist/adapters/claude-code-headless/types.d.ts +28 -0
  56. package/dist/adapters/claude-code-headless/types.js +36 -0
  57. package/dist/adapters/copilot/adapter.d.ts +100 -0
  58. package/dist/adapters/copilot/adapter.js +730 -0
  59. package/dist/adapters/copilot/index.d.ts +15 -0
  60. package/dist/adapters/copilot/index.js +20 -0
  61. package/dist/adapters/index.d.ts +42 -0
  62. package/dist/adapters/index.js +115 -0
  63. package/dist/adapters/opencode/adapter.d.ts +82 -0
  64. package/dist/adapters/opencode/adapter.js +710 -0
  65. package/dist/adapters/opencode/config.d.ts +90 -0
  66. package/dist/adapters/opencode/config.js +137 -0
  67. package/dist/adapters/opencode/helpers.d.ts +40 -0
  68. package/dist/adapters/opencode/helpers.js +144 -0
  69. package/dist/adapters/opencode/index.d.ts +12 -0
  70. package/dist/adapters/opencode/index.js +17 -0
  71. package/dist/adapters/opencode/server-bridge.d.ts +124 -0
  72. package/dist/adapters/opencode/server-bridge.js +216 -0
  73. package/dist/adapters/sdk/base.d.ts +95 -0
  74. package/dist/adapters/sdk/base.js +134 -0
  75. package/dist/adapters/sdk/system-prompt.d.ts +64 -0
  76. package/dist/adapters/sdk/system-prompt.js +78 -0
  77. package/dist/adapters/terminal-error.d.ts +27 -0
  78. package/dist/adapters/terminal-error.js +39 -0
  79. package/dist/channel.d.ts +3 -0
  80. package/dist/channel.js +48 -0
  81. package/dist/cli/commands.d.ts +245 -0
  82. package/dist/cli/commands.js +2438 -0
  83. package/dist/cli/config-command.d.ts +8 -0
  84. package/dist/cli/config-command.js +254 -0
  85. package/dist/cli/daemon-command.d.ts +57 -0
  86. package/dist/cli/daemon-command.js +493 -0
  87. package/dist/cli/daemon.d.ts +217 -0
  88. package/dist/cli/daemon.js +632 -0
  89. package/dist/cli/dashboard-command.d.ts +20 -0
  90. package/dist/cli/dashboard-command.js +241 -0
  91. package/dist/cli/dev-banner.d.ts +107 -0
  92. package/dist/cli/dev-banner.js +190 -0
  93. package/dist/cli/dev-mode-bootstrap.d.ts +29 -0
  94. package/dist/cli/dev-mode-bootstrap.js +36 -0
  95. package/dist/cli/dev-verbs.d.ts +43 -0
  96. package/dist/cli/dev-verbs.js +254 -0
  97. package/dist/cli/help-text.d.ts +1 -0
  98. package/dist/cli/help-text.js +158 -0
  99. package/dist/cli/legacy-migration.d.ts +35 -0
  100. package/dist/cli/legacy-migration.js +335 -0
  101. package/dist/cli/mcp.d.ts +8 -0
  102. package/dist/cli/mcp.js +63 -0
  103. package/dist/cli/output.d.ts +12 -0
  104. package/dist/cli/output.js +37 -0
  105. package/dist/cli/preflight.d.ts +9 -0
  106. package/dist/cli/preflight.js +96 -0
  107. package/dist/cli/removed-verbs.d.ts +9 -0
  108. package/dist/cli/removed-verbs.js +78 -0
  109. package/dist/cli/sa-preflight.d.ts +99 -0
  110. package/dist/cli/sa-preflight.js +183 -0
  111. package/dist/cli/scenarios-command.d.ts +6 -0
  112. package/dist/cli/scenarios-command.js +167 -0
  113. package/dist/cli/startup.d.ts +112 -0
  114. package/dist/cli/startup.js +641 -0
  115. package/dist/cli/upgrade-command.d.ts +5 -0
  116. package/dist/cli/upgrade-command.js +240 -0
  117. package/dist/cli.d.ts +2 -0
  118. package/dist/cli.js +680 -0
  119. package/dist/client/core.d.ts +33 -0
  120. package/dist/client/core.js +1260 -0
  121. package/dist/client/ensure-conductor-spawned.d.ts +35 -0
  122. package/dist/client/ensure-conductor-spawned.js +48 -0
  123. package/dist/client/index.d.ts +32 -0
  124. package/dist/client/index.js +22 -0
  125. package/dist/client/interface.d.ts +461 -0
  126. package/dist/client/interface.js +2 -0
  127. package/dist/client/subscribe.d.ts +108 -0
  128. package/dist/client/subscribe.js +598 -0
  129. package/dist/client/with-spawn.d.ts +27 -0
  130. package/dist/client/with-spawn.js +87 -0
  131. package/dist/config.d.ts +323 -0
  132. package/dist/config.js +593 -0
  133. package/dist/connection.d.ts +7 -0
  134. package/dist/connection.js +46 -0
  135. package/dist/constants.d.ts +50 -0
  136. package/dist/constants.js +74 -0
  137. package/dist/copilot-bridge.d.ts +22 -0
  138. package/dist/copilot-bridge.js +565 -0
  139. package/dist/daemon-adapter-versions.d.ts +52 -0
  140. package/dist/daemon-adapter-versions.js +170 -0
  141. package/dist/daemon.d.ts +275 -0
  142. package/dist/daemon.js +989 -0
  143. package/dist/ensemble/agent-types.d.ts +23 -0
  144. package/dist/ensemble/agent-types.js +132 -0
  145. package/dist/ensemble/loader.d.ts +14 -0
  146. package/dist/ensemble/loader.js +140 -0
  147. package/dist/ensemble/saver.d.ts +49 -0
  148. package/dist/ensemble/saver.js +201 -0
  149. package/dist/ensemble/schema.d.ts +71 -0
  150. package/dist/ensemble/schema.js +3 -0
  151. package/dist/git-info.d.ts +4 -0
  152. package/dist/git-info.js +29 -0
  153. package/dist/http/aggregate.d.ts +319 -0
  154. package/dist/http/aggregate.js +684 -0
  155. package/dist/http/auth.d.ts +67 -0
  156. package/dist/http/auth.js +177 -0
  157. package/dist/http/body.d.ts +71 -0
  158. package/dist/http/body.js +121 -0
  159. package/dist/http/catalog.d.ts +67 -0
  160. package/dist/http/catalog.js +209 -0
  161. package/dist/http/cors.d.ts +42 -0
  162. package/dist/http/cors.js +111 -0
  163. package/dist/http/dashboard-pair.d.ts +94 -0
  164. package/dist/http/dashboard-pair.js +148 -0
  165. package/dist/http/dashboard.d.ts +20 -0
  166. package/dist/http/dashboard.js +160 -0
  167. package/dist/http/event-bus.d.ts +217 -0
  168. package/dist/http/event-bus.js +365 -0
  169. package/dist/http/event-id.d.ts +77 -0
  170. package/dist/http/event-id.js +117 -0
  171. package/dist/http/event-types.d.ts +348 -0
  172. package/dist/http/event-types.js +36 -0
  173. package/dist/http/fixtures/chat-stress.d.ts +8 -0
  174. package/dist/http/fixtures/chat-stress.js +63 -0
  175. package/dist/http/fixtures/conductor-leaving.d.ts +8 -0
  176. package/dist/http/fixtures/conductor-leaving.js +80 -0
  177. package/dist/http/fixtures/constants.d.ts +10 -0
  178. package/dist/http/fixtures/constants.js +13 -0
  179. package/dist/http/fixtures/eight-player-broadcast.d.ts +10 -0
  180. package/dist/http/fixtures/eight-player-broadcast.js +81 -0
  181. package/dist/http/fixtures/empty-ensemble.d.ts +6 -0
  182. package/dist/http/fixtures/empty-ensemble.js +26 -0
  183. package/dist/http/fixtures/index.d.ts +55 -0
  184. package/dist/http/fixtures/index.js +110 -0
  185. package/dist/http/fixtures/single-conductor.d.ts +7 -0
  186. package/dist/http/fixtures/single-conductor.js +46 -0
  187. package/dist/http/fixtures/sse-reconnect.d.ts +8 -0
  188. package/dist/http/fixtures/sse-reconnect.js +77 -0
  189. package/dist/http/index.d.ts +21 -0
  190. package/dist/http/index.js +61 -0
  191. package/dist/http/port-file.d.ts +22 -0
  192. package/dist/http/port-file.js +132 -0
  193. package/dist/http/responses.d.ts +27 -0
  194. package/dist/http/responses.js +40 -0
  195. package/dist/http/ring-buffer.d.ts +41 -0
  196. package/dist/http/ring-buffer.js +80 -0
  197. package/dist/http/server.d.ts +122 -0
  198. package/dist/http/server.js +459 -0
  199. package/dist/http/snapshot.d.ts +85 -0
  200. package/dist/http/snapshot.js +180 -0
  201. package/dist/http/sse-handler.d.ts +87 -0
  202. package/dist/http/sse-handler.js +294 -0
  203. package/dist/http/writes.d.ts +55 -0
  204. package/dist/http/writes.js +240 -0
  205. package/dist/palette/index.d.ts +138 -0
  206. package/dist/palette/index.js +221 -0
  207. package/dist/reconcile/orphans.d.ts +255 -0
  208. package/dist/reconcile/orphans.js +340 -0
  209. package/dist/scripts/258-spotcheck.js +303 -0
  210. package/dist/scripts/check-components-css-sync.js +199 -0
  211. package/dist/scripts/run-shard.js +121 -0
  212. package/dist/scripts/verify-daemon-isolation-guard.js +128 -0
  213. package/dist/server-tools.d.ts +87 -0
  214. package/dist/server-tools.js +146 -0
  215. package/dist/server.d.ts +2 -0
  216. package/dist/server.js +366 -0
  217. package/dist/spawn.d.ts +296 -0
  218. package/dist/spawn.js +747 -0
  219. package/dist/tools/agent-types.d.ts +2 -0
  220. package/dist/tools/agent-types.js +21 -0
  221. package/dist/tools/attachment-info.d.ts +4 -0
  222. package/dist/tools/attachment-info.js +48 -0
  223. package/dist/tools/broadcast.d.ts +4 -0
  224. package/dist/tools/broadcast.js +76 -0
  225. package/dist/tools/cancel-stage.d.ts +3 -0
  226. package/dist/tools/cancel-stage.js +20 -0
  227. package/dist/tools/clear-state.d.ts +3 -0
  228. package/dist/tools/clear-state.js +37 -0
  229. package/dist/tools/coat-check-evict.d.ts +4 -0
  230. package/dist/tools/coat-check-evict.js +43 -0
  231. package/dist/tools/coat-check-get.d.ts +4 -0
  232. package/dist/tools/coat-check-get.js +56 -0
  233. package/dist/tools/coat-check-list.d.ts +4 -0
  234. package/dist/tools/coat-check-list.js +60 -0
  235. package/dist/tools/coat-check-put.d.ts +4 -0
  236. package/dist/tools/coat-check-put.js +53 -0
  237. package/dist/tools/cue.d.ts +44 -0
  238. package/dist/tools/cue.js +201 -0
  239. package/dist/tools/destroy.d.ts +4 -0
  240. package/dist/tools/destroy.js +188 -0
  241. package/dist/tools/detach.d.ts +4 -0
  242. package/dist/tools/detach.js +45 -0
  243. package/dist/tools/encore.d.ts +4 -0
  244. package/dist/tools/encore.js +31 -0
  245. package/dist/tools/ensemble.d.ts +32 -0
  246. package/dist/tools/ensemble.js +198 -0
  247. package/dist/tools/evaluate-gate.d.ts +3 -0
  248. package/dist/tools/evaluate-gate.js +32 -0
  249. package/dist/tools/fetch-state.d.ts +13 -0
  250. package/dist/tools/fetch-state.js +78 -0
  251. package/dist/tools/gates.d.ts +3 -0
  252. package/dist/tools/gates.js +41 -0
  253. package/dist/tools/helpers.d.ts +21 -0
  254. package/dist/tools/helpers.js +25 -0
  255. package/dist/tools/hosts.d.ts +4 -0
  256. package/dist/tools/hosts.js +40 -0
  257. package/dist/tools/listen.d.ts +3 -0
  258. package/dist/tools/listen.js +22 -0
  259. package/dist/tools/load-lineup.d.ts +5 -0
  260. package/dist/tools/load-lineup.js +381 -0
  261. package/dist/tools/migrate.d.ts +4 -0
  262. package/dist/tools/migrate.js +60 -0
  263. package/dist/tools/pause-ensemble.d.ts +4 -0
  264. package/dist/tools/pause-ensemble.js +58 -0
  265. package/dist/tools/pause.d.ts +4 -0
  266. package/dist/tools/pause.js +36 -0
  267. package/dist/tools/play.d.ts +4 -0
  268. package/dist/tools/play.js +57 -0
  269. package/dist/tools/quality-gate.d.ts +3 -0
  270. package/dist/tools/quality-gate.js +26 -0
  271. package/dist/tools/recall.d.ts +3 -0
  272. package/dist/tools/recall.js +32 -0
  273. package/dist/tools/recruit.d.ts +38 -0
  274. package/dist/tools/recruit.js +447 -0
  275. package/dist/tools/release.d.ts +4 -0
  276. package/dist/tools/release.js +98 -0
  277. package/dist/tools/report.d.ts +3 -0
  278. package/dist/tools/report.js +29 -0
  279. package/dist/tools/resolve.d.ts +1 -0
  280. package/dist/tools/resolve.js +7 -0
  281. package/dist/tools/restart.d.ts +35 -0
  282. package/dist/tools/restart.js +131 -0
  283. package/dist/tools/restore.d.ts +4 -0
  284. package/dist/tools/restore.js +107 -0
  285. package/dist/tools/resume-ensemble.d.ts +4 -0
  286. package/dist/tools/resume-ensemble.js +79 -0
  287. package/dist/tools/save-lineup.d.ts +4 -0
  288. package/dist/tools/save-lineup.js +36 -0
  289. package/dist/tools/save-state.d.ts +3 -0
  290. package/dist/tools/save-state.js +57 -0
  291. package/dist/tools/schedule.d.ts +4 -0
  292. package/dist/tools/schedule.js +152 -0
  293. package/dist/tools/schedules.d.ts +4 -0
  294. package/dist/tools/schedules.js +54 -0
  295. package/dist/tools/set-ensemble-description.d.ts +4 -0
  296. package/dist/tools/set-ensemble-description.js +37 -0
  297. package/dist/tools/set-name.d.ts +4 -0
  298. package/dist/tools/set-name.js +45 -0
  299. package/dist/tools/set-part.d.ts +3 -0
  300. package/dist/tools/set-part.js +20 -0
  301. package/dist/tools/shutdown.d.ts +4 -0
  302. package/dist/tools/shutdown.js +54 -0
  303. package/dist/tools/stage.d.ts +3 -0
  304. package/dist/tools/stage.js +28 -0
  305. package/dist/tools/stages.d.ts +3 -0
  306. package/dist/tools/stages.js +35 -0
  307. package/dist/tools/stop.d.ts +4 -0
  308. package/dist/tools/stop.js +29 -0
  309. package/dist/tools/unschedule.d.ts +4 -0
  310. package/dist/tools/unschedule.js +35 -0
  311. package/dist/tools/who-am-i.d.ts +3 -0
  312. package/dist/tools/who-am-i.js +34 -0
  313. package/dist/tools/worktree.d.ts +4 -0
  314. package/dist/tools/worktree.js +181 -0
  315. package/dist/tui/App.d.ts +85 -0
  316. package/dist/tui/App.js +1791 -0
  317. package/dist/tui/bootstrap-types.d.ts +46 -0
  318. package/dist/tui/bootstrap-types.js +7 -0
  319. package/dist/tui/client.d.ts +6 -0
  320. package/dist/tui/client.js +9 -0
  321. package/dist/tui/commands.d.ts +71 -0
  322. package/dist/tui/commands.js +1375 -0
  323. package/dist/tui/components/ActivityLog.d.ts +16 -0
  324. package/dist/tui/components/ActivityLog.js +36 -0
  325. package/dist/tui/components/ChatView.d.ts +35 -0
  326. package/dist/tui/components/ChatView.js +54 -0
  327. package/dist/tui/components/CommandOverlay.d.ts +15 -0
  328. package/dist/tui/components/CommandOverlay.js +34 -0
  329. package/dist/tui/components/CommandPalette.d.ts +21 -0
  330. package/dist/tui/components/CommandPalette.js +67 -0
  331. package/dist/tui/components/ConductorChat.d.ts +16 -0
  332. package/dist/tui/components/ConductorChat.js +32 -0
  333. package/dist/tui/components/ConversationStream.d.ts +114 -0
  334. package/dist/tui/components/ConversationStream.js +307 -0
  335. package/dist/tui/components/CreateEnsembleWizard.d.ts +19 -0
  336. package/dist/tui/components/CreateEnsembleWizard.js +223 -0
  337. package/dist/tui/components/DestroyConfirmModal.d.ts +17 -0
  338. package/dist/tui/components/DestroyConfirmModal.js +62 -0
  339. package/dist/tui/components/EnsembleListView.d.ts +14 -0
  340. package/dist/tui/components/EnsembleListView.js +32 -0
  341. package/dist/tui/components/EnsemblePanel.d.ts +12 -0
  342. package/dist/tui/components/EnsemblePanel.js +40 -0
  343. package/dist/tui/components/ErrorView.d.ts +31 -0
  344. package/dist/tui/components/ErrorView.js +129 -0
  345. package/dist/tui/components/HomeView.d.ts +54 -0
  346. package/dist/tui/components/HomeView.js +306 -0
  347. package/dist/tui/components/InputBar.d.ts +13 -0
  348. package/dist/tui/components/InputBar.js +58 -0
  349. package/dist/tui/components/LoadLineupModal.d.ts +18 -0
  350. package/dist/tui/components/LoadLineupModal.js +79 -0
  351. package/dist/tui/components/MainView.d.ts +21 -0
  352. package/dist/tui/components/MainView.js +107 -0
  353. package/dist/tui/components/NewEnsembleModal.d.ts +9 -0
  354. package/dist/tui/components/NewEnsembleModal.js +73 -0
  355. package/dist/tui/components/Picker.d.ts +23 -0
  356. package/dist/tui/components/Picker.js +70 -0
  357. package/dist/tui/components/PlayerDetailView.d.ts +26 -0
  358. package/dist/tui/components/PlayerDetailView.js +118 -0
  359. package/dist/tui/components/PromptArea.d.ts +50 -0
  360. package/dist/tui/components/PromptArea.js +303 -0
  361. package/dist/tui/components/RecruitWizard.d.ts +17 -0
  362. package/dist/tui/components/RecruitWizard.js +221 -0
  363. package/dist/tui/components/RestoreConfirmModal.d.ts +18 -0
  364. package/dist/tui/components/RestoreConfirmModal.js +71 -0
  365. package/dist/tui/components/ScheduleOverlay.d.ts +13 -0
  366. package/dist/tui/components/ScheduleOverlay.js +113 -0
  367. package/dist/tui/components/ScheduleWizard.d.ts +19 -0
  368. package/dist/tui/components/ScheduleWizard.js +259 -0
  369. package/dist/tui/components/Splash.d.ts +23 -0
  370. package/dist/tui/components/Splash.js +221 -0
  371. package/dist/tui/components/StatusBar.d.ts +48 -0
  372. package/dist/tui/components/StatusBar.js +128 -0
  373. package/dist/tui/components/StatusOverlay.d.ts +15 -0
  374. package/dist/tui/components/StatusOverlay.js +76 -0
  375. package/dist/tui/components/TitleBar.d.ts +10 -0
  376. package/dist/tui/components/TitleBar.js +21 -0
  377. package/dist/tui/components/TopBar.d.ts +12 -0
  378. package/dist/tui/components/TopBar.js +15 -0
  379. package/dist/tui/core-api.d.ts +26 -0
  380. package/dist/tui/core-api.js +67 -0
  381. package/dist/tui/hooks/useEnsembleDiscovery.d.ts +3 -0
  382. package/dist/tui/hooks/useEnsembleDiscovery.js +30 -0
  383. package/dist/tui/hooks/useMaestroPoller.d.ts +3 -0
  384. package/dist/tui/hooks/useMaestroPoller.js +36 -0
  385. package/dist/tui/hooks/useSendCommand.d.ts +7 -0
  386. package/dist/tui/hooks/useSendCommand.js +29 -0
  387. package/dist/tui/index.d.ts +15 -0
  388. package/dist/tui/index.js +156 -0
  389. package/dist/tui/ink-context.d.ts +18 -0
  390. package/dist/tui/ink-context.js +59 -0
  391. package/dist/tui/ink-loader.d.ts +26 -0
  392. package/dist/tui/ink-loader.js +42 -0
  393. package/dist/tui/removed-commands.d.ts +9 -0
  394. package/dist/tui/removed-commands.js +22 -0
  395. package/dist/tui/sse-handler.d.ts +52 -0
  396. package/dist/tui/sse-handler.js +157 -0
  397. package/dist/tui/store.d.ts +598 -0
  398. package/dist/tui/store.js +753 -0
  399. package/dist/tui/utils/format.d.ts +56 -0
  400. package/dist/tui/utils/format.js +155 -0
  401. package/dist/tui/utils/fullscreen.d.ts +23 -0
  402. package/dist/tui/utils/fullscreen.js +71 -0
  403. package/dist/tui/utils/history.d.ts +10 -0
  404. package/dist/tui/utils/history.js +85 -0
  405. package/dist/tui/utils/platform.d.ts +45 -0
  406. package/dist/tui/utils/platform.js +258 -0
  407. package/dist/tui/utils/theme.d.ts +21 -0
  408. package/dist/tui/utils/theme.js +24 -0
  409. package/dist/types.d.ts +1020 -0
  410. package/dist/types.js +39 -0
  411. package/dist/utils/attachment-format.d.ts +22 -0
  412. package/dist/utils/attachment-format.js +32 -0
  413. package/dist/utils/default-part.d.ts +43 -0
  414. package/dist/utils/default-part.js +104 -0
  415. package/dist/utils/duration.d.ts +30 -0
  416. package/dist/utils/duration.js +69 -0
  417. package/dist/utils/ensemble-ops.d.ts +61 -0
  418. package/dist/utils/ensemble-ops.js +77 -0
  419. package/dist/utils/format-hosts.d.ts +21 -0
  420. package/dist/utils/format-hosts.js +73 -0
  421. package/dist/utils/hosts.d.ts +113 -0
  422. package/dist/utils/hosts.js +265 -0
  423. package/dist/utils/parent-death-watchdog.d.ts +1 -0
  424. package/dist/utils/parent-death-watchdog.js +47 -0
  425. package/dist/utils/query-timeout.d.ts +103 -0
  426. package/dist/utils/query-timeout.js +113 -0
  427. package/dist/utils/recall-format.d.ts +78 -0
  428. package/dist/utils/recall-format.js +105 -0
  429. package/dist/utils/restore-format.d.ts +49 -0
  430. package/dist/utils/restore-format.js +91 -0
  431. package/dist/utils/safe-path.d.ts +10 -0
  432. package/dist/utils/safe-path.js +43 -0
  433. package/dist/utils/sdk-probe.d.ts +9 -0
  434. package/dist/utils/sdk-probe.js +45 -0
  435. package/dist/utils/search-attributes.d.ts +76 -0
  436. package/dist/utils/search-attributes.js +86 -0
  437. package/dist/utils/validation.d.ts +113 -0
  438. package/dist/utils/validation.js +163 -0
  439. package/dist/utils/visibility-deadline.d.ts +186 -0
  440. package/dist/utils/visibility-deadline.js +158 -0
  441. package/dist/utils/worktree.d.ts +103 -0
  442. package/dist/utils/worktree.js +327 -0
  443. package/dist/worker.d.ts +14 -0
  444. package/dist/worker.js +146 -0
  445. package/dist/workflows/attachment-math.d.ts +56 -0
  446. package/dist/workflows/attachment-math.js +47 -0
  447. package/dist/workflows/index.d.ts +3 -0
  448. package/dist/workflows/index.js +11 -0
  449. package/dist/workflows/maestro-signals.d.ts +217 -0
  450. package/dist/workflows/maestro-signals.js +155 -0
  451. package/dist/workflows/maestro.d.ts +3 -0
  452. package/dist/workflows/maestro.js +812 -0
  453. package/dist/workflows/scheduler-signals.d.ts +10 -0
  454. package/dist/workflows/scheduler-signals.js +14 -0
  455. package/dist/workflows/scheduler.d.ts +17 -0
  456. package/dist/workflows/scheduler.js +143 -0
  457. package/dist/workflows/session.d.ts +2 -0
  458. package/dist/workflows/session.js +1638 -0
  459. package/dist/workflows/signals.d.ts +297 -0
  460. package/dist/workflows/signals.js +239 -0
  461. package/examples/agents/tempo-composer.md +56 -0
  462. package/examples/agents/tempo-conductor.md +117 -0
  463. package/examples/agents/tempo-critic.md +73 -0
  464. package/examples/agents/tempo-improv.md +74 -0
  465. package/examples/agents/tempo-liner.md +75 -0
  466. package/examples/agents/tempo-roadie.md +61 -0
  467. package/examples/agents/tempo-soloist.md +71 -0
  468. package/examples/agents/tempo-tuner.md +94 -0
  469. package/examples/ensembles/tempo-big-band.yaml +146 -0
  470. package/examples/ensembles/tempo-dev-team.yaml +58 -0
  471. package/examples/ensembles/tempo-headless-jam.yaml +77 -0
  472. package/examples/ensembles/tempo-jam-session.yaml +41 -0
  473. package/examples/ensembles/tempo-mock-jam.yaml +79 -0
  474. package/examples/ensembles/tempo-review-squad.yaml +32 -0
  475. package/package.json +172 -0
  476. package/packaging/launchd/com.agent.tempo.plist +46 -0
  477. package/packaging/systemd/agent-tempo.service +32 -0
  478. package/packaging/windows/install-task.ps1 +71 -0
  479. package/scenarios/conductor-recruit-mock.yaml +33 -0
  480. package/scenarios/echo-roundtrip.yaml +15 -0
  481. package/scenarios/multi-player-handoff.yaml +38 -0
  482. package/scenarios/recruit-cascade.yaml +38 -0
  483. package/scenarios/two-player-conversation.yaml +33 -0
  484. 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
+ }