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,426 @@
1
+ /**
2
+ * Base adapter infrastructure.
3
+ *
4
+ * Owns the V2 attachment lifecycle — `claimAttachment`, heartbeat loop,
5
+ * `attachmentInfo` phase watcher, `WorkflowNotFound` terminal handling, and
6
+ * graceful-detach orchestration. PR-H (#132) removed the
7
+ * `AGENT_TEMPO_LIFECYCLE_V2=0` escape hatch and its PR-A compat shim path;
8
+ * V2 is now the only path.
9
+ *
10
+ * The `SdkAttachment` intermediate class (processing-signal pairing, split-brain
11
+ * cancellation per §9.3) lives in `src/adapters/sdk/base.ts`.
12
+ *
13
+ * Design reference: docs/design/session-lifecycle-rebuild-v2.md §§3.2, 4.3, 9.1–9.5.
14
+ */
15
+ import type { Client, WorkflowHandle } from '@temporalio/client';
16
+ import type { AdapterClass, AdapterDescriptor, AttachmentToken, AttachmentPhase, DetachReason } from '../types';
17
+ /** Snapshot of adapter state included in every telemetry frame. */
18
+ interface AdapterTelemetrySnapshot {
19
+ attachmentId: string | null;
20
+ workflowId: string | null;
21
+ runId: string | null;
22
+ heartbeatsSent: number;
23
+ phaseTicksDone: number;
24
+ }
25
+ /**
26
+ * Build the structured frame emitted by every lifecycle handler. Pure
27
+ * function — exposed for unit tests that don't want to spawn a child
28
+ * process.
29
+ */
30
+ export declare function buildProcessTerminatingFrame(signal: string, errorMessage?: string, snapshot?: AdapterTelemetrySnapshot[]): string;
31
+ /**
32
+ * Install the process-lifecycle telemetry handlers. Idempotent. Skipped
33
+ * by default in test environments (see {@link shouldInstallLifecycleTelemetry}).
34
+ *
35
+ * Production callers (and the first `startV2Lifecycle()` call on any
36
+ * adapter) invoke without arguments. Unit tests pass `{ force: true }`
37
+ * to bypass the env gate.
38
+ */
39
+ export declare function installProcessLifecycleTelemetry(opts?: {
40
+ force?: boolean;
41
+ }): void;
42
+ /** Test-only — uninstall handlers + reset state. */
43
+ export declare function _resetProcessLifecycleTelemetryForTest(): void;
44
+ /** Test-only — direct access to the live-adapter set. */
45
+ export declare function _liveAdaptersForTest(): ReadonlySet<BaseAttachment>;
46
+ /**
47
+ * Override bundle for the reconnect loop timing (#201). Production defaults are
48
+ * tuned for laptop-sleep cycles (15-min elapsed budget, 10s base, 60s cap). Tests
49
+ * override to run the whole loop in <1s. Any field omitted falls back to the
50
+ * production constant.
51
+ */
52
+ export interface ReconnectTimingOverrides {
53
+ baseMs?: number;
54
+ maxMs?: number;
55
+ budgetMs?: number;
56
+ backoffFactor?: number;
57
+ }
58
+ /** Options shared by every adapter extending `BaseAttachment`. */
59
+ export interface BaseAttachmentOptions {
60
+ /** Temporal client — required for V2 attachment claim + runId pinning. */
61
+ client?: Client;
62
+ /** Hostname to announce in `claimAttachment`. Defaults to `os.hostname()` when omitted. */
63
+ host?: string;
64
+ /** Test-only: shrink the reconnect backoff/budget. Production callers never set this. */
65
+ reconnectTiming?: ReconnectTimingOverrides;
66
+ }
67
+ /**
68
+ * Abstract base class for session adapters.
69
+ *
70
+ * Concrete adapters (`InteractiveAttachment`, `CopilotSdkAttachment`) own
71
+ * their own top-level delivery loop. The base class owns the V2 attachment
72
+ * lifecycle: claim, heartbeat at `descriptor.heartbeatMs`, phase-watcher
73
+ * loop, `WorkflowGone` classifier, graceful `adapterExited` on teardown.
74
+ * Subclasses must call `startV2Lifecycle()` before their delivery loop and
75
+ * `stopV2Lifecycle()` on shutdown.
76
+ *
77
+ * PR-H (#132): the `AGENT_TEMPO_LIFECYCLE_V2` flag and the legacy V1 poll-
78
+ * only path it gated have been removed. The V2 attachment-lease path is
79
+ * now the only path.
80
+ */
81
+ export declare abstract class BaseAttachment {
82
+ abstract readonly descriptor: AdapterDescriptor;
83
+ /** Populated at construction for InteractiveAttachment; lazily via `configureV2()` for subprocess adapters (Copilot bridge). */
84
+ protected client?: Client;
85
+ protected host?: string;
86
+ /** V2 state — populated by `startV2Lifecycle()`, null on legacy path. */
87
+ protected token: AttachmentToken | null;
88
+ /** Handle pinned to the runId returned by `claimAttachment`. Never resolve by ID alone (§6.3). */
89
+ protected pinnedHandle: WorkflowHandle | null;
90
+ private heartbeatTimer;
91
+ private phaseWatcherTimer;
92
+ private heartbeatBackoff;
93
+ private phaseBackoff;
94
+ private stopped;
95
+ private terminalFired;
96
+ private knownPhase;
97
+ /**
98
+ * `true` once a heartbeat has successfully landed on the current attachment (or rebind).
99
+ * Cleared on `startV2Lifecycle`, reconnect-loop success, and CAN rebind so each freshly
100
+ * live attachment emits its own `heartbeat#1 delivered` diagnostic. Added in #249 to
101
+ * distinguish "claim OK but heartbeat loop died" from "adapter just hasn't ticked yet."
102
+ */
103
+ private firstHeartbeatLogged;
104
+ /**
105
+ * Monotonic heartbeat counter for the current attachment cycle. Reset on
106
+ * claim/reconnect/CAN-rebind. Emitted periodically (every {@link LOOP_SUMMARY_EVERY}
107
+ * ticks) so a long-running session leaves breadcrumbs in the log proving the loop is
108
+ * alive — operators can `grep 'heartbeats-delivered='` to confirm health without
109
+ * parsing Temporal history. Added in #249.
110
+ */
111
+ private heartbeatsSent;
112
+ /**
113
+ * Mirror of {@link heartbeatsSent} for the phase-watcher loop. Same emission cadence,
114
+ * same rationale — the watcher is the only self-heal surface when the heartbeat loop
115
+ * dies silently, so a summary log line proves it's still live too.
116
+ */
117
+ private phaseTicksDone;
118
+ private readonly phaseChangeListeners;
119
+ private readonly leaseRevokedListeners;
120
+ private readonly terminalListeners;
121
+ /**
122
+ * Pending `abortableSleep` cancellers (#201). `stopV2Lifecycle` iterates and invokes
123
+ * each so any in-flight reconnect backoff rejects immediately and the loop unwinds
124
+ * instead of stalling teardown by up to `RECONNECT_MAX_MS`.
125
+ */
126
+ private readonly sleepAborters;
127
+ /**
128
+ * `true` while `runReconnectLoop` is active. Prevents concurrent reconnect attempts
129
+ * (e.g. if both the heartbeat and phase-watcher loops observe the same lease expiry
130
+ * at nearly the same time) and gates heartbeat/watcher ticks from firing new terminals
131
+ * while the reconnect pre-check is still deciding.
132
+ */
133
+ private reconnecting;
134
+ /** Reconnect loop timing — production constants unless overridden for tests. */
135
+ private readonly reconnectBaseMs;
136
+ private readonly reconnectMaxMs;
137
+ private readonly reconnectBudgetMs;
138
+ private readonly reconnectBackoffFactor;
139
+ constructor(options?: BaseAttachmentOptions);
140
+ /**
141
+ * Lazily populate the V2-path dependencies (Temporal client, host). Used by
142
+ * adapters whose subprocess constructs the client inside `run()` rather
143
+ * than receiving it from the outer process (Copilot bridge). Must be called
144
+ * BEFORE `startV2Lifecycle()`.
145
+ *
146
+ * C3 (PR-C dual-QA follow-up): rejects late reconfiguration — once a claim
147
+ * token has been issued, swapping the client out silently would leave the
148
+ * pinned handle pointing at the previous connection. Future adapters that
149
+ * mis-order the calls fail loudly instead of drifting.
150
+ */
151
+ protected configureV2(client: Client, host: string): void;
152
+ /** Subscribe to `attachmentInfo.phase` changes observed by the watcher. */
153
+ onPhaseChange(listener: (phase: AttachmentPhase) => void): () => void;
154
+ /** Subscribe to lease-revocation events (§9.3 split-brain resolution). */
155
+ onLeaseRevoked(listener: (reason: DetachReason) => void): () => void;
156
+ /**
157
+ * Hypothesis A telemetry — capture the adapter state included in
158
+ * process-lifecycle log frames. Public so the module-level
159
+ * `snapshotLiveAdapters()` helper can read private fields without an
160
+ * `any` cast; consumers other than the telemetry path should not call it.
161
+ */
162
+ _captureTelemetrySnapshot(): AdapterTelemetrySnapshot;
163
+ /**
164
+ * Subscribe to terminal events — `WorkflowNotFound` (§9.4) and phase `gone`.
165
+ * Terminal fires at most once per instance. Subclasses stop delivery + exit.
166
+ */
167
+ onTerminal(listener: (reason: DetachReason) => void): () => void;
168
+ /**
169
+ * V2 lifecycle entry point. Claims (or renews) the attachment, pins the handle by runId,
170
+ * and starts the heartbeat + phase watcher loops.
171
+ *
172
+ * @param workflowId Target session workflow id.
173
+ * @param expectedAttachmentId
174
+ * PR-D renewal path. When present, the adapter was spawned by `restart` or `migrate`
175
+ * — the workflow has already created an `Attachment` with this id and is
176
+ * expecting the new adapter to take over. Passing it through to `claimAttachment`
177
+ * selects the renewal branch in §9.2 (refresh lease in place, idempotent on retry)
178
+ * instead of the fresh-claim branch. Fresh spawn (first recruit) omits this arg.
179
+ * @returns Pinned `WorkflowHandle` — subclass delivery loop MUST use this for every
180
+ * subsequent query/signal (never resolve by id alone).
181
+ * @throws Re-throws `claimAttachment` rejections (`AttachmentConflict`, `WorkflowGone`).
182
+ */
183
+ protected startV2Lifecycle(workflowId: string, expectedAttachmentId?: string): Promise<WorkflowHandle>;
184
+ /**
185
+ * Tear down V2 machinery. Idempotent. Called by subclass on stop, on terminal
186
+ * events, and on graceful detach completion.
187
+ *
188
+ * When `graceful=true` (detach owner) we fire `adapterExited` so the workflow
189
+ * collapses `draining → detached` immediately per §11.1.
190
+ */
191
+ protected stopV2Lifecycle(reason?: DetachReason, graceful?: boolean): Promise<void>;
192
+ private scheduleHeartbeat;
193
+ /**
194
+ * Emit a loud diagnostic when a tick early-returns via one of its guard paths (#249).
195
+ * Pre-#249 these returns were silent — the only observable effect was "heartbeats stop
196
+ * arriving." Now operators can grep `adapter.*guard tripped` to confirm or rule out
197
+ * tick-orphan as a failure mode without needing workflow history.
198
+ *
199
+ * `terminalFired=true` / `stopped=true` guards are load-bearing on the terminal path
200
+ * (don't want to re-enter terminal) so they're expected during teardown; we still log
201
+ * them but at the same level — operators can correlate timestamps against the preceding
202
+ * `terminal (...) — stopping delivery poll permanently` line.
203
+ */
204
+ private logGuardTrip;
205
+ /**
206
+ * Single tick of the heartbeat loop. Try/finally scaffolding (#249) guarantees
207
+ * reschedule in every path except genuinely terminal state (`stopped`,
208
+ * `terminalFired`) or when the reconnect loop has taken ownership of scheduling
209
+ * (`reconnecting`). Pre-#249 the three early-return paths at the top + the
210
+ * handled-terminal-error path silently orphaned the timer forever; a transient
211
+ * `reconnecting=true` window or a null-handle race was enough to kill the loop
212
+ * with no log and no teardown.
213
+ *
214
+ * Handled terminals (CAN rebind, destroy) still short-circuit via `return` —
215
+ * the `finally` block re-checks `reconnecting` / `terminalFired` before
216
+ * rescheduling, so the reconnect/terminal machinery keeps ownership of
217
+ * whatever comes next.
218
+ */
219
+ private tickHeartbeat;
220
+ private schedulePhaseWatcher;
221
+ /**
222
+ * Single tick of the phase-watcher loop. Same orphan-resistance scaffolding as
223
+ * {@link tickHeartbeat} (#249): try/finally reschedule, unconditional unless
224
+ * `stopped` / `terminalFired` / `reconnecting`. When the heartbeat loop dies
225
+ * silently, the watcher is the only remaining self-heal surface — losing it
226
+ * too meant the adapter had no path back to a healthy state short of process
227
+ * restart.
228
+ */
229
+ private tickPhaseWatcher;
230
+ /**
231
+ * Shared error-classification path for the heartbeat + phase-watcher ticks (#226).
232
+ *
233
+ * Returns `true` if the error was a terminal-class (handled inline: CAN rebind
234
+ * kicked off, or destroy fired). Returns `false` when the caller should treat
235
+ * the error as transient and continue its backoff.
236
+ *
237
+ * Always consults `fetchHistory` on any terminal-class error, because the
238
+ * Temporal SDK can't distinguish CAN-close from true-complete at the error
239
+ * level — see {@link isTerminalWorkflowError}. The history lookup is cheap
240
+ * (only runs on terminal, so at most once per adapter lifetime per terminal)
241
+ * and safer than re-querying by workflow id (which could race a fresh session
242
+ * reusing the id).
243
+ */
244
+ private handleRunEndError;
245
+ /**
246
+ * Fetch the closed pinned run's history and return the runId of a CAN successor
247
+ * if present, else `null`. Scoped to the pinned (old) run via `this.pinnedHandle`,
248
+ * so it can't be fooled by a fresh session that happens to reuse the workflow id.
249
+ *
250
+ * Called only on the terminal path from {@link handleRunEndError}, so the cost
251
+ * of `fetchHistory` (a full event stream for the closed run) is paid at most
252
+ * once per terminal — not on every tick.
253
+ */
254
+ private findCanSuccessorRunId;
255
+ /**
256
+ * Fire the terminal hook — the adapter is going dark and won't recover.
257
+ *
258
+ * #258: emits a structured log line on every fire so the next post-CAN
259
+ * silence incident is unambiguous in logs. Pre-#258, a `fireTerminal`
260
+ * from an unexpected source (the root cause was a silent destroy from
261
+ * the reconnect-loop pre-check on a transient terminal-class error) was
262
+ * indistinguishable from process death in workflow history — both produced
263
+ * "no further heartbeats." The structured log includes:
264
+ *
265
+ * - `reason` — the existing DetachReason
266
+ * - `callsite` — the calling function or rationale (passed by every
267
+ * callsite so the source is grep-able without parsing stack traces)
268
+ * - `attachmentId` / `workflowId` / `runId` — for cross-referencing
269
+ * against workflow history when bisecting an incident
270
+ * - `heartbeatsSent` / `phaseTicksDone` — the existing #249 counters
271
+ * so an operator can correlate "loop alive at N heartbeats, then
272
+ * terminal fired at this callsite" without external context
273
+ *
274
+ * Idempotent — repeat calls (e.g. reconnect-exhausted re-fires after
275
+ * destroy) early-return without re-logging. The first fire wins.
276
+ */
277
+ private fireTerminal;
278
+ /**
279
+ * #258 tiebreaker: confirm whether a workflow is genuinely terminal after
280
+ * the reconnect-loop pre-check threw a terminal-class error. Used to
281
+ * distinguish a real workflow-gone state from a transient gRPC /
282
+ * visibility-API blip that classified as terminal.
283
+ *
284
+ * Returns:
285
+ * - `{ kind: 'running', statusName }` — workflow is alive (any
286
+ * non-terminal status). Caller should treat the original error as
287
+ * transient and continue the reconnect loop.
288
+ * - `{ kind: 'terminal', statusName }` — workflow is in a terminal
289
+ * status (`COMPLETED` / `FAILED` / `CANCELLED` / `TERMINATED` /
290
+ * `CONTINUED_AS_NEW` / `TIMED_OUT`). Caller should fire destroy.
291
+ * - `{ kind: 'describe-threw' }` — `describe()` itself failed. Treat
292
+ * as terminal (fire destroy) — consistent with pre-#258 semantics
293
+ * when classification is ambiguous, and avoids spinning forever on
294
+ * a workflow we can't reach.
295
+ * - `{ kind: 'timed-out' }` — `describe()` exceeded
296
+ * {@link DESCRIBE_TIMEOUT_MS}. Treat as terminal (fire destroy) —
297
+ * same rationale: prefer clean shutdown to a hung loop.
298
+ *
299
+ * The unpinned handle follows any CAN chain to the latest run, so
300
+ * `desc.status.name === 'CONTINUED_AS_NEW'` here means the workflow
301
+ * id itself is closed (no successor) — genuinely terminal.
302
+ */
303
+ private confirmWorkflowTerminal;
304
+ /**
305
+ * Opt-in reconnect policy. Default: return `false` — the base class behaves
306
+ * exactly as it did before #201 (fire terminal, tear down). Subclasses that
307
+ * can safely replay delivery on a fresh lease should override and return
308
+ * `true` for recoverable reasons (typically `heartbeat-timeout` and
309
+ * `superseded`; never `destroy`).
310
+ *
311
+ * Why opt-in: SDK adapters (e.g. Copilot bridge) have their own subprocess
312
+ * restart logic; double-reconnecting would race their native poller and
313
+ * produce duplicate `pendingMessages` queries. Keep them on the old
314
+ * behavior until we've proven reconnect is safe there.
315
+ */
316
+ protected shouldReconnect(_reason: DetachReason): boolean;
317
+ /**
318
+ * Called once, just before the reconnect loop enters its first backoff sleep.
319
+ * Subclasses should tear down any delivery loops that are still polling the
320
+ * stale pinned handle (it may succeed but `markDelivered` will be ignored by
321
+ * the workflow because our `attachmentId` is no longer current). The default
322
+ * is a no-op.
323
+ */
324
+ protected onReconnectStart(_reason: DetachReason): Promise<void>;
325
+ /**
326
+ * Called once on a successful re-claim, with the freshly pinned handle.
327
+ * Subclasses should restart their delivery loop against `handle`. Runs
328
+ * before the base class reschedules its own heartbeat + phase-watcher
329
+ * loops, so the subclass sees a quiescent state.
330
+ *
331
+ * Note: the runId returned by `claimAttachment` may differ from the previous
332
+ * pinned handle's runId (the workflow may have `continueAsNew`'d during the
333
+ * outage), so subclasses MUST use the `handle` argument — never cache a
334
+ * handle from before the reconnect.
335
+ */
336
+ protected onReconnected(_handle: WorkflowHandle): Promise<void>;
337
+ /**
338
+ * Sleep `ms` milliseconds, resolving cleanly on timer and rejecting with
339
+ * `aborted:stopped` if `stopV2Lifecycle` or `fireTerminal` fires mid-wait.
340
+ * The canonical pattern for any blocking wait inside an adapter loop —
341
+ * never use bare `setTimeout` + `Promise` in loop code, or teardown stalls.
342
+ */
343
+ protected abortableSleep(ms: number): Promise<void>;
344
+ /** Reject every in-flight `abortableSleep`. Called on stop + terminal. */
345
+ private abortSleepers;
346
+ /**
347
+ * Consult {@link shouldReconnect}; if true, kick off the reconnect loop in
348
+ * the background (fire-and-forget), otherwise fire terminal synchronously.
349
+ * Called by the heartbeat / phase-watcher ticks instead of `fireTerminal`
350
+ * when the reason is potentially recoverable.
351
+ */
352
+ private fireTerminalOrReconnect;
353
+ /**
354
+ * #226 CAN rebind. Transparently repoints `pinnedHandle` at the successor run,
355
+ * keeps the existing `attachmentId` / `leaseMs` (the workflow extended the lease
356
+ * by one heartbeat interval during the CAN transition per §2.3, so the lease is
357
+ * still live on the new run), notifies the subclass to restart its delivery
358
+ * loop, and resumes heartbeat + phase-watcher.
359
+ *
360
+ * Why this is safe without re-claiming:
361
+ * - The new run carries forward `currentAttachment` verbatim from the old run.
362
+ * - The adapter's `attachmentId` still matches, so the next `heartbeat` /
363
+ * `markDelivered` / `adapterExited` signal on the new pinned handle will be
364
+ * accepted unchanged by the workflow's handlers.
365
+ * - If the lease actually did expire before we got here (e.g. adapter was
366
+ * offline through multiple CAN cycles), the next phase-watcher tick on the
367
+ * new pinned handle will see `phase=detached` + no current attachment and
368
+ * fall through to the existing #201 reclaim path — belt-and-suspenders.
369
+ */
370
+ private runCanRebind;
371
+ /**
372
+ * Budget-bounded reconnect loop.
373
+ *
374
+ * Strategy:
375
+ * 1. Sleep (abortable) with exponential backoff from {@link RECONNECT_BASE_MS}
376
+ * up to {@link RECONNECT_MAX_MS}, capped by an elapsed-time budget of
377
+ * {@link RECONNECT_TOTAL_BUDGET_MS}.
378
+ * 2. Query `attachmentInfo` via a fresh unpinned handle:
379
+ * • workflow gone → fire `destroy`, exit.
380
+ * • phase `gone` → fire `destroy`, exit.
381
+ * • someone else holds the lease → fire `superseded`, exit (architect §1).
382
+ * • phase `draining` → wait another tick (lease about to reap).
383
+ * • otherwise → attempt fresh `claimAttachment`.
384
+ * 3. On successful claim: rebuild `this.pinnedHandle` from the **new** token's
385
+ * `runId` (workflow may have `continueAsNew`'d during outage), reset loop
386
+ * state, call subclass hooks, restart heartbeat + watcher.
387
+ *
388
+ * Fires `reconnect-exhausted` on budget exhaustion. Exits silently (without
389
+ * firing terminal) on abort — `stopV2Lifecycle` owns teardown messaging.
390
+ */
391
+ private runReconnectLoop;
392
+ }
393
+ /**
394
+ * Registry of adapter descriptors keyed by `adapterId`.
395
+ *
396
+ * Look up the descriptor for a given session by `SessionMetadata.adapterId` (or
397
+ * fall back to `'claude-code'` for pre-v0.25 sessions that have no adapterId set).
398
+ * `src/adapters/index.ts` creates the singleton `registry` and registers all
399
+ * shipped adapters at import time.
400
+ */
401
+ export declare class AdapterRegistry {
402
+ private readonly byId;
403
+ /** Register an adapter descriptor. Replaces any existing entry with the same id. */
404
+ register(desc: AdapterDescriptor): void;
405
+ /**
406
+ * Fetch the descriptor for `adapterId`. Throws if unregistered.
407
+ *
408
+ * Callers resolving from possibly-undefined metadata should coalesce first:
409
+ * `registry.get(metadata.adapterId ?? 'claude-code')`.
410
+ */
411
+ get(adapterId: string): AdapterDescriptor;
412
+ /** `true` if `adapterId` is registered. */
413
+ has(adapterId: string): boolean;
414
+ /** Snapshot of all registered descriptors. */
415
+ all(): readonly AdapterDescriptor[];
416
+ /**
417
+ * Resolve an `adapterId` from the legacy `agent` field on {@link SessionMetadata}.
418
+ * Maps `'claude'` → `'claude-code'`, `'copilot'` → `'copilot'`.
419
+ *
420
+ * Used as a fallback when `adapterId` is not yet populated on the session metadata
421
+ * (e.g. sessions started before PR-B landed). PR-D removes this mapping when the
422
+ * legacy `AgentType` enum is retired.
423
+ */
424
+ resolveFromAgentType(agent: string | undefined): string;
425
+ }
426
+ export type { AdapterClass, AdapterDescriptor };