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