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,35 @@
1
+ /**
2
+ * Shared helper for restore-after-shutdown: make sure a conductor terminal
3
+ * is attached to an ensemble before `/restore` completes. Called by the
4
+ * TUI `/restore` slash command (`App.tsx`, `commands.ts`).
5
+ *
6
+ * NOTE: This file lives in `src/client/` because the CLI `restore` command
7
+ * was expected to adopt it. If no CLI consumer adopts within 2 PRs after
8
+ * #308 merges, move to `src/tui/utils/` — current consumers are TUI-only.
9
+ *
10
+ * Returns a structured outcome so callers can render a summary without
11
+ * parsing strings. Never throws — callers should treat a missing conductor
12
+ * as a soft failure.
13
+ */
14
+ import type { TempoClientWithSpawn } from './interface';
15
+ export type EnsureConductorSpawnedOutcome = {
16
+ spawned: false;
17
+ reason: 'alreadyLive';
18
+ } | {
19
+ spawned: true;
20
+ } | {
21
+ spawned: false;
22
+ reason: 'spawnFailed';
23
+ error: string;
24
+ };
25
+ /**
26
+ * If the ensemble already has a conductor session in a live phase, no-op.
27
+ * Otherwise shell out via {@link TempoClientWithSpawn.spawnConductor} to
28
+ * open a conductor terminal. The `agent-tempo up` path is idempotent at
29
+ * the workflow layer, so a benign race (two restores in flight) converges
30
+ * on one workflow.
31
+ *
32
+ * Typed against `TempoClientWithSpawn` (not `TempoClient` alias) so the
33
+ * spawn dependency is explicit at the call site (#308 follow-up).
34
+ */
35
+ export declare function ensureConductorSpawned(ensemble: string, client: TempoClientWithSpawn): Promise<EnsureConductorSpawnedOutcome>;
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ensureConductorSpawned = ensureConductorSpawned;
4
+ /**
5
+ * If the ensemble already has a conductor session in a live phase, no-op.
6
+ * Otherwise shell out via {@link TempoClientWithSpawn.spawnConductor} to
7
+ * open a conductor terminal. The `agent-tempo up` path is idempotent at
8
+ * the workflow layer, so a benign race (two restores in flight) converges
9
+ * on one workflow.
10
+ *
11
+ * Typed against `TempoClientWithSpawn` (not `TempoClient` alias) so the
12
+ * spawn dependency is explicit at the call site (#308 follow-up).
13
+ */
14
+ async function ensureConductorSpawned(ensemble, client) {
15
+ try {
16
+ const info = await client.attachmentInfo(ensemble, 'conductor');
17
+ const phase = info.phase;
18
+ const alreadyLive = phase === 'attached' || phase === 'processing'
19
+ || phase === 'awaiting' || phase === 'booting';
20
+ if (alreadyLive)
21
+ return { spawned: false, reason: 'alreadyLive' };
22
+ }
23
+ catch {
24
+ // No conductor session / query failed — fall through to spawn.
25
+ }
26
+ try {
27
+ await client.spawnConductor({ ensemble });
28
+ return { spawned: true };
29
+ }
30
+ catch (err) {
31
+ const message = err instanceof Error ? err.message : String(err);
32
+ // #306: `/restore` runs two parallel paths that can both spawn the
33
+ // conductor — `restoreOrphansOnce` reattaches the orphan adapter via
34
+ // `deliverRestart`, and this helper falls through to a fresh spawn when
35
+ // the attachment-info query returns a non-live phase. If the orphan
36
+ // reattach wins the race, our spawn (`agent-tempo up <ensemble>`)
37
+ // throws "A conductor is already running for ensemble" — which is the
38
+ // success condition for THIS helper. Swallow the race and report alive.
39
+ if (/conductor is already running/i.test(message)) {
40
+ return { spawned: false, reason: 'alreadyLive' };
41
+ }
42
+ return {
43
+ spawned: false,
44
+ reason: 'spawnFailed',
45
+ error: message,
46
+ };
47
+ }
48
+ }
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Public entry point for the `TempoClient` family.
3
+ *
4
+ * Two factories ship side by side after the #308 follow-up split (see ADR
5
+ * 0007 and `docs/design/tempoclient-core-spawn-split.md`):
6
+ *
7
+ * - {@link createTempoClientCore} — pure Temporal RPC, headless-safe
8
+ * (daemon, MCP server, SSE event source, future SDK consumers).
9
+ * - {@link createTempoClientWithSpawn} — the TTY-bound superset adding
10
+ * `createEnsemble` and `spawnConductor`. Use from the TUI/CLI only.
11
+ *
12
+ * `createTempoClient` is preserved as a permanent alias for
13
+ * `createTempoClientWithSpawn` so every existing call site keeps the same
14
+ * return shape — no codemod required at adoption.
15
+ */
16
+ import type { Client } from '@temporalio/client';
17
+ import { type CreateTempoClientOpts } from './with-spawn';
18
+ import type { TempoClientWithSpawn } from './interface';
19
+ export { createTempoClientCore } from './core';
20
+ export { createTempoClientWithSpawn, type CreateTempoClientOpts } from './with-spawn';
21
+ export type { TempoClient, TempoClientCore, TempoClientWithSpawn, EnsembleSummary, EnsembleShutdownSummary, EnsembleShutdownDetail, EnsembleDestroySummary, EnsembleDestroyDetail, RecruitClientOpts, RecruitClientResult, ReleaseClientResult, } from './interface';
22
+ export type { SubscribeOptions, SubscribeTopic, TempoEvent } from '../http/event-types';
23
+ export { SubscribeHttpError, type SubscribeDeps } from './subscribe';
24
+ /**
25
+ * Backwards-compatible alias for {@link createTempoClientWithSpawn}. The
26
+ * `TempoClient` type alias resolves to `TempoClientWithSpawn`, so every
27
+ * existing `createTempoClient(client)` call site keeps its current shape.
28
+ *
29
+ * **New headless consumers should call {@link createTempoClientCore}
30
+ * directly** — the type system then forbids accidental TTY dependencies.
31
+ */
32
+ export declare function createTempoClient(client: Client, opts?: CreateTempoClientOpts): TempoClientWithSpawn;
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SubscribeHttpError = exports.createTempoClientWithSpawn = exports.createTempoClientCore = void 0;
4
+ exports.createTempoClient = createTempoClient;
5
+ const with_spawn_1 = require("./with-spawn");
6
+ var core_1 = require("./core");
7
+ Object.defineProperty(exports, "createTempoClientCore", { enumerable: true, get: function () { return core_1.createTempoClientCore; } });
8
+ var with_spawn_2 = require("./with-spawn");
9
+ Object.defineProperty(exports, "createTempoClientWithSpawn", { enumerable: true, get: function () { return with_spawn_2.createTempoClientWithSpawn; } });
10
+ var subscribe_1 = require("./subscribe");
11
+ Object.defineProperty(exports, "SubscribeHttpError", { enumerable: true, get: function () { return subscribe_1.SubscribeHttpError; } });
12
+ /**
13
+ * Backwards-compatible alias for {@link createTempoClientWithSpawn}. The
14
+ * `TempoClient` type alias resolves to `TempoClientWithSpawn`, so every
15
+ * existing `createTempoClient(client)` call site keeps its current shape.
16
+ *
17
+ * **New headless consumers should call {@link createTempoClientCore}
18
+ * directly** — the type system then forbids accidental TTY dependencies.
19
+ */
20
+ function createTempoClient(client, opts = {}) {
21
+ return (0, with_spawn_1.createTempoClientWithSpawn)(client, opts);
22
+ }
@@ -0,0 +1,461 @@
1
+ /**
2
+ * TempoClient — public interface and related types.
3
+ *
4
+ * Extracted from `src/tui/client.ts` so that non-TUI consumers (CLI, tests,
5
+ * external integrations) can depend on the interface without pulling in Ink/React.
6
+ */
7
+ import type { AgentType, MaestroPlayerInfo, MaestroRelayMessage, HistoryEntry, Message, SentMessage, SessionMetadata, ScheduleEntry, QualityGate, StageEntry, WorktreeEntry, EnsembleChatResult, AttachmentInfo, HostInfo } from '../types';
8
+ import type { RestoreOrphansSummary } from '../reconcile/orphans';
9
+ import type { SubscribeOptions, TempoEvent } from '../http/event-types';
10
+ /**
11
+ * Raw (unfiltered, unsorted, unsliced) output of `TempoClient.recall`.
12
+ * The shared formatter at `src/utils/recall-format.ts` turns this into a
13
+ * timeline + pagination header; returning the raw shape keeps every
14
+ * surface's presentation logic testable without booting a client.
15
+ */
16
+ export interface RecallClientResult {
17
+ received: Message[];
18
+ sent: SentMessage[];
19
+ }
20
+ /**
21
+ * Options for {@link TempoClient.recruit} — direct submit of a `recruit`
22
+ * outbox entry from the caller's maestro session. Mirrors the `recruit`
23
+ * MCP tool's parameters, minus the conductor-only bits handled by the
24
+ * `load_lineup` flow. The TUI uses this to bypass the conductor LLM hop
25
+ * for UI-initiated recruiting (the prior path routed through the
26
+ * maestro hub → conductor → MCP tool, which required a live conductor).
27
+ */
28
+ export interface RecruitClientOpts {
29
+ name: string;
30
+ workDir: string;
31
+ agent?: AgentType;
32
+ /** Agent type name from the subagent registry (e.g. "tempo-soloist"). */
33
+ playerType?: string;
34
+ isConductor?: boolean;
35
+ initialMessage?: string;
36
+ systemPrompt?: string;
37
+ host?: string;
38
+ /** When true, spawn process but lock outbox until `release`. */
39
+ held?: boolean;
40
+ }
41
+ export interface RecruitClientResult {
42
+ playerId: string;
43
+ /** Outbox entry id submitted on the maestro session's workflow. */
44
+ entryId: string;
45
+ }
46
+ export interface ReleaseClientResult {
47
+ /** Names of players released, in scan order. */
48
+ released: string[];
49
+ /** Soft-failure diagnostics per player, if any. */
50
+ errors: Array<{
51
+ playerId: string;
52
+ error: string;
53
+ }>;
54
+ }
55
+ export interface RestartClientOpts {
56
+ /** Target host (defaults to session's preferredHost or last-known hostname). */
57
+ host?: string;
58
+ /** Skip context replay. */
59
+ fresh?: boolean;
60
+ /** Steal a live attachment via forceDetach. */
61
+ force?: boolean;
62
+ /** Number of recent messages to include in context replay. */
63
+ contextMessages?: number;
64
+ /** Identifier of the invoker for audit messages (default: 'cli'). */
65
+ invokerPlayerId?: string;
66
+ /**
67
+ * #334 PR-2 — seed the restarted session from a saved-state slot. `true`
68
+ * resolves to the default key (`'main'`); a string names a specific slot.
69
+ * Suppresses transcript replay by default; pass `transcript: 'replay'` to
70
+ * stack. Falls back to transcript replay if the slot is empty.
71
+ */
72
+ loadFromState?: boolean | string;
73
+ /**
74
+ * #334 PR-2 — controls transcript-replay interaction when `loadFromState`
75
+ * is set: `'suppress'` (default) or `'replay'` (stack saved state + transcript).
76
+ * Ignored when `loadFromState` is absent.
77
+ */
78
+ transcript?: 'suppress' | 'replay';
79
+ /**
80
+ * #580 / design §16.5 Option B — deliberate-action gate for cross-host
81
+ * force-restart. When `force: true` AND the target's current attachment
82
+ * is on a host other than the caller's, the value must match the
83
+ * current holder's hostname exactly. The shared MCP-tool guard
84
+ * (`enforceYesStealGuard` in `src/tools/restart.ts`) enforces the same
85
+ * property when callers go through the `restart` / `migrate` MCP tools;
86
+ * the TUI's `/migrate` handler enforces it locally and forwards the
87
+ * confirmed value here so the recorded intent rides the call. Workflow
88
+ * trusts the caller — the check happens pre-submit, not in the outbox.
89
+ */
90
+ confirmStealFromHost?: string;
91
+ }
92
+ export interface RestartClientResult {
93
+ /** Player the restart was queued for. */
94
+ playerId: string;
95
+ /** Target host — `undefined` when the caller didn't specify and the activity uses `preferredHost`. */
96
+ host?: string;
97
+ /** Outbox entry id; callers can poll `submitOutbox` history or `outboxQuery` for status. */
98
+ entryId: string;
99
+ }
100
+ /** Per-target outcome returned by `shutdown`. */
101
+ export interface EnsembleShutdownDetail {
102
+ playerId: string;
103
+ /**
104
+ * #299 sibling: removed `'skipped-self'`. The only public consumer of
105
+ * this type is `EnsembleShutdownSummary.details`, returned by
106
+ * `TempoClient.shutdown()`. The TempoClient implementation does not pass
107
+ * a `skip` predicate to `signalAllSessions`, so the fan-out never
108
+ * produces a `'skipped'` outcome and the `'skipped-self'` mapping was
109
+ * unreachable. Mirror cleanup of the destroy-detail change.
110
+ */
111
+ outcome: 'detaching' | 'failed';
112
+ error?: string;
113
+ }
114
+ export interface EnsembleShutdownSummary {
115
+ detached: number;
116
+ skipped: number;
117
+ failed: number;
118
+ maestroPaused: boolean;
119
+ schedulerPaused: boolean;
120
+ details: EnsembleShutdownDetail[];
121
+ }
122
+ /** Per-target outcome returned by ensemble-scope `destroy`. */
123
+ export interface EnsembleDestroyDetail {
124
+ target: string;
125
+ /**
126
+ * #299: removed `'skipped-self'`. The only public consumer of this type is
127
+ * `EnsembleDestroySummary.details`, returned by `TempoClient.destroy()`,
128
+ * and the TempoClient implementation has no caller-self concept (the
129
+ * client is a programmatic caller, not a player in the ensemble) — so it
130
+ * never produces a self-skip. The MCP-tool path (`src/tools/destroy.ts`)
131
+ * does internally branch on caller-self for control flow but never
132
+ * surfaces those entries to a public consumer.
133
+ */
134
+ outcome: 'destroyed' | 'terminated' | 'failed';
135
+ error?: string;
136
+ }
137
+ export interface EnsembleDestroySummary {
138
+ destroyed: number;
139
+ terminated: number;
140
+ failed: number;
141
+ details: EnsembleDestroyDetail[];
142
+ }
143
+ export interface EnsembleSummary {
144
+ name: string;
145
+ playerCount: number;
146
+ hasConductor: boolean;
147
+ conductorStatus?: string;
148
+ /**
149
+ * Lifecycle classification populated by {@link TempoClient.listEnsembles}
150
+ * (absent on `discoverEnsembles` results):
151
+ *
152
+ * - `'online'` — maestro hub is unpaused (`maestroPaused === false`).
153
+ * - `'paused'` — maestro hub is paused **and** at least one session is
154
+ * still in a live attachment phase. Operationally this is
155
+ * a `/pause` (resume in place via `/play`).
156
+ * - `'offline'` — maestro hub is paused **and** no live adapters remain.
157
+ * Operationally this is a `/shutdown` (requires `/restore`).
158
+ */
159
+ state?: 'online' | 'paused' | 'offline';
160
+ }
161
+ /** Options for {@link TempoClient.createEnsemble}. */
162
+ export interface CreateEnsembleOpts {
163
+ /** New ensemble name. Must pass `validateEnsembleName`. */
164
+ ensemble: string;
165
+ /** Working directory for the spawned conductor terminal. Defaults to `process.cwd()`. */
166
+ workDir?: string;
167
+ /** Optional lineup name or path forwarded to `agent-tempo up --lineup …`. */
168
+ lineup?: string;
169
+ }
170
+ /**
171
+ * #308 follow-up: pure-RPC subset of the TempoClient surface.
172
+ *
173
+ * `TempoClientCore` is the headless-safe interface — every method routes
174
+ * through the Temporal `Client` and never spawns a local terminal. Safe to
175
+ * instantiate inside the daemon, the SSE event source, MCP tools, and
176
+ * future SDK consumers that don't carry a `child_process` dependency.
177
+ *
178
+ * The TUI (and any other TTY-bound consumer that needs to launch a
179
+ * conductor terminal) imports {@link TempoClientWithSpawn} instead, which
180
+ * extends this interface with the two spawn methods.
181
+ *
182
+ * See `docs/adr/0007-tempoclient-core-withspawn-split.md` and
183
+ * `docs/design/tempoclient-core-spawn-split.md` for the rationale.
184
+ */
185
+ export interface TempoClientCore {
186
+ /** Discover all running ensembles across the cluster. */
187
+ discoverEnsembles(): Promise<EnsembleSummary[]>;
188
+ /**
189
+ * List every ensemble with at least one live workflow, splitting running
190
+ * from parked (all-sessions-detached) via `state`.
191
+ */
192
+ listEnsembles(): Promise<EnsembleSummary[]>;
193
+ /**
194
+ * #336/#529 — bounded variant of {@link listEnsembles}. Wraps the
195
+ * underlying visibility iterator with a wall-clock deadline and
196
+ * surfaces a `timedOut` flag so callers that diff against prior
197
+ * state (e.g. `AggregateRunner.collect()` at 750ms cadence) can
198
+ * skip an entire tick rather than silently produce a partial
199
+ * snapshot that would emit phantom `ensemble.destroyed` events.
200
+ *
201
+ * Unlike `listEnsembles()`, this method propagates non-timeout
202
+ * errors — the existing "swallow-and-return-empty" path is reserved
203
+ * for the unbounded variant's CLI / dashboard callers that don't
204
+ * need to distinguish timeout from emptiness.
205
+ *
206
+ * @param deadlineMs Wall-clock budget for the visibility iterator.
207
+ * `AggregateRunner` uses 500ms (correctness, well
208
+ * below the 750ms tick cadence); ad-hoc callers
209
+ * should match the caller's surrounding timeout.
210
+ */
211
+ listEnsemblesBounded(deadlineMs: number): Promise<{
212
+ items: EnsembleSummary[];
213
+ timedOut: boolean;
214
+ scanned: number;
215
+ }>;
216
+ /** Get current player snapshot for an ensemble. */
217
+ getPlayers(ensemble: string): Promise<MaestroPlayerInfo[]>;
218
+ /**
219
+ * Issue #399 W1 — read the per-ensemble maestro hub's wire-extension
220
+ * fields (description / startedAt / currentBpm / tempoSeries) in a
221
+ * single fan-out. The four queries run in parallel against the same
222
+ * maestro workflow handle so total latency is bounded by the slowest
223
+ * query, not the sum.
224
+ *
225
+ * Returns an object with sentinel defaults (`description: ''`,
226
+ * `startedAt: ''`, `currentBpm: 0`, `tempoSeries: []`) when individual
227
+ * queries soft-fail — the snapshot endpoint must NEVER 500 because of
228
+ * a transient maestro query glitch.
229
+ */
230
+ getEnsembleMeta(ensemble: string): Promise<{
231
+ description: string;
232
+ startedAt: string;
233
+ currentBpm: number;
234
+ tempoSeries: number[];
235
+ }>;
236
+ /**
237
+ * Issue #399 W2 — read a session workflow's wire-extension fields
238
+ * (runId / messaging / lease) in a single fan-out. The three queries
239
+ * run in parallel against the same session handle. Returns `null`
240
+ * when the session workflow can't be resolved (just-recruited,
241
+ * just-destroyed, or transient lookup failure); soft-fails individual
242
+ * fields to `undefined` in the returned shape so partial results
243
+ * still surface.
244
+ */
245
+ getPlayerWireMeta(ensemble: string, playerId: string): Promise<{
246
+ runId?: string;
247
+ messaging?: {
248
+ received: number;
249
+ sent: number;
250
+ outbox: string;
251
+ };
252
+ lease?: {
253
+ expiresAt: number | null;
254
+ leaseMs: number | null;
255
+ };
256
+ } | null>;
257
+ /** Get recent messages for an ensemble. */
258
+ getMessages(ensemble: string, limit?: number): Promise<MaestroRelayMessage[]>;
259
+ /** Get conductor command/report history for an ensemble. */
260
+ getConductorHistory(ensemble: string): Promise<HistoryEntry[]>;
261
+ /** Get a player's message history (received + sent). */
262
+ getPlayerMessages(ensemble: string, playerId: string): Promise<Array<Message | (SentMessage & {
263
+ direction: 'sent';
264
+ })>>;
265
+ /** Get a player's workflow metadata. */
266
+ getPlayerMetadata(ensemble: string, playerId: string): Promise<SessionMetadata | null>;
267
+ /** Send a command to an ensemble's conductor via Maestro. Returns command ID. */
268
+ sendCommand(ensemble: string, text: string, source: string): Promise<string>;
269
+ /** Send a message to a specific player in an ensemble. Returns message ID. */
270
+ sendMessage(ensemble: string, to: string, text: string, source: string): Promise<string>;
271
+ /** Terminate a player's workflow. */
272
+ terminatePlayer(ensemble: string, playerId: string): Promise<void>;
273
+ /**
274
+ * #306: Recruit a player directly via the caller's maestro session outbox.
275
+ * Replaces the legacy TUI path of routing `/recruit …` through the
276
+ * conductor's Claude Code session. Structural-op parity with the `recruit`
277
+ * MCP tool — enqueues a `recruit` outbox entry; the dispatch loop spawns
278
+ * the process. The conductor's LLM is never in the critical path.
279
+ */
280
+ recruit(ensemble: string, opts: RecruitClientOpts): Promise<RecruitClientResult>;
281
+ /**
282
+ * #306: Release held players directly via the caller's maestro session
283
+ * outbox. Without `playerId`, scans the ensemble for sessions whose
284
+ * outbox is locked and enqueues a `release` entry for each. With
285
+ * `playerId`, releases just that session. Structural-op parity with
286
+ * the `release` MCP tool.
287
+ */
288
+ release(ensemble: string, playerId?: string): Promise<ReleaseClientResult>;
289
+ /** PR-D: Restart a player — §8.2 algorithm. Works on any non-`gone` phase. */
290
+ restart(ensemble: string, playerId: string, opts?: RestartClientOpts): Promise<RestartClientResult>;
291
+ /** PR-D: Gracefully detach a player's adapter. Workflow survives in `detached`. */
292
+ detach(ensemble: string, playerId: string, deadlineMs?: number): Promise<void>;
293
+ /**
294
+ * #287: Terminally destroy a workflow. Single-player when `playerId` is
295
+ * given; ensemble-scope (peer sessions → scheduler → maestro → conductor)
296
+ * when `playerId` is omitted. Ensemble-scope returns a count summary.
297
+ */
298
+ destroy(ensemble: string, playerId?: string, reason?: string): Promise<void | EnsembleDestroySummary>;
299
+ /**
300
+ * #287: Pause every session in the ensemble + scheduler + maestro. MCP
301
+ * counterpart of the `pause` tool. Replaces the v0.26 `pauseEnsemble` shape.
302
+ */
303
+ pause(ensemble: string): Promise<void>;
304
+ /**
305
+ * #287: Unpause every session + scheduler + maestro. `release: true` also
306
+ * fans out `releaseHeld` so any held sessions deliver their buffered task
307
+ * messages. MCP counterpart of the `play` tool.
308
+ */
309
+ play(ensemble: string, opts?: {
310
+ release?: boolean;
311
+ }): Promise<void>;
312
+ /**
313
+ * #287: Graceful ensemble teardown — fan-out detach + pause scheduler +
314
+ * pause maestro. Workflows survive in `detached`; pair with `restore`.
315
+ */
316
+ shutdown(ensemble: string, opts?: {
317
+ deadlineMs?: number;
318
+ reason?: string;
319
+ }): Promise<EnsembleShutdownSummary>;
320
+ /**
321
+ * #287: Bring the ensemble back up after `shutdown`. Reattaches all local
322
+ * orphans (delegates to the shared `restoreOrphansOnce` helper) and
323
+ * unpauses the scheduler + maestro. Does NOT spawn a conductor terminal
324
+ * — CLI owns that (design #285 S4).
325
+ */
326
+ restore(ensemble: string): Promise<RestoreOrphansSummary>;
327
+ /** PR-D: Migrate a player to a different host — sugar for restart({host}). */
328
+ migrate(ensemble: string, playerId: string, host: string, opts?: Omit<RestartClientOpts, 'host'>): Promise<RestartClientResult>;
329
+ /** PR-D: Query a player's V2 attachment lifecycle state. */
330
+ attachmentInfo(ensemble: string, playerId: string): Promise<AttachmentInfo>;
331
+ /**
332
+ * #128: Fetch a player's raw message timeline (received + sent). Throws
333
+ * when the session cannot be resolved. Callers are expected to feed the
334
+ * result through the shared `formatRecall` helper for filter / sort /
335
+ * slice / render; the client stays presentation-free.
336
+ */
337
+ recall(ensemble: string, playerId: string): Promise<RecallClientResult>;
338
+ /**
339
+ * #274: List all daemons polling this Temporal namespace, joined with
340
+ * their boot-signaled capability profiles. Consumers typically feed
341
+ * the result through `formatHostList` for a consistent UX across
342
+ * CLI / TUI / MCP. `force: true` bypasses the 3-second result cache.
343
+ */
344
+ listHosts(opts?: {
345
+ force?: boolean;
346
+ }): Promise<HostInfo[]>;
347
+ /** Get active schedules for an ensemble. */
348
+ getSchedules(ensemble: string): Promise<ScheduleEntry[]>;
349
+ /** Cancel a named schedule in an ensemble. */
350
+ cancelSchedule(ensemble: string, name: string): Promise<void>;
351
+ /** Get quality gates from the conductor workflow. */
352
+ getGates(ensemble: string): Promise<QualityGate[]>;
353
+ /** Get stages from the conductor workflow. */
354
+ getStages(ensemble: string): Promise<StageEntry[]>;
355
+ /** Get worktrees from the conductor workflow. */
356
+ getWorktrees(ensemble: string): Promise<WorktreeEntry[]>;
357
+ /** Get aggregated ensemble chat (maestro + conductor traffic). */
358
+ getEnsembleChat(ensemble: string, offset?: number, limit?: number): Promise<EnsembleChatResult>;
359
+ /**
360
+ * Bug B: Read the maestro hub's `maestroPaused` flag for an ensemble.
361
+ * Returns `false` when the hub workflow doesn't exist (treat absence as
362
+ * "not paused" — the StatusBar renders nothing for the bare-ensemble case).
363
+ * The TUI polls this so a paused conductor swallowing messages becomes
364
+ * visible (status bar segment + tooltip-style hint to type `/play`).
365
+ */
366
+ isMaestroPaused(ensemble: string): Promise<boolean>;
367
+ /**
368
+ * #306 follow-up: True when at least one session in the ensemble has its
369
+ * outbox locked (i.e. is `held`). Companion to {@link isMaestroPaused};
370
+ * the two are orthogonal — `/load_lineup` flips both, `/pause` flips just
371
+ * paused, `/recruit --held` flips just held. The TUI polls this to surface
372
+ * a yellow `held` segment + a `Tip: /go` hint, so users don't sit paused
373
+ * watching held players that need releasing.
374
+ *
375
+ * Skips the maestro session (the TUI's own dashboard attachment) so a
376
+ * locked maestro outbox — never a real held-player state — doesn't
377
+ * trigger the indicator. Returns `false` when the scan or every per-
378
+ * session query fails (treat absence as "not held").
379
+ */
380
+ isAnySessionHeld(ensemble: string): Promise<boolean>;
381
+ /** Disband an ensemble: terminate all sessions, scheduler, and maestro workflows. */
382
+ disbandEnsemble(ensemble: string): Promise<{
383
+ terminated: number;
384
+ }>;
385
+ /** Check if the Temporal connection is alive. */
386
+ isConnected(): Promise<boolean>;
387
+ /** Check if the Global Maestro workflow is running. */
388
+ hasGlobalMaestro(): Promise<boolean>;
389
+ /**
390
+ * Subscribe to the per-ensemble SSE event stream exposed by the daemon
391
+ * at `/v1/events/:ensemble`. Returns an `AsyncIterable<TempoEvent>` —
392
+ * iterate with `for await` to consume events. The stream is
393
+ * snapshot-then-stream: a synthetic `event: snapshot` arrives first
394
+ * (carrying the `/v1/state/:ensemble` payload), then live diff events
395
+ * follow per [`docs/SSE-PROTOCOL.md`](../../docs/SSE-PROTOCOL.md).
396
+ *
397
+ * **Cancellation**: pass `opts.signal` (`AbortSignal`) to terminate the
398
+ * stream from the caller side, or simply `break` out of the `for await`
399
+ * — the wrapper's iterator hooks `return()` to abort the underlying
400
+ * transport (§7.4). The wrapper transparently reconnects on TCP drops
401
+ * with `Last-Event-ID` carried across reconnects (§7.5).
402
+ *
403
+ * **Gap recovery**: `gap` and `chat.compressed` events surface to the
404
+ * consumer (not swallowed). `gap` requires a `/v1/state/:ensemble`
405
+ * re-fetch + resubscribe per §7.2; `chat.compressed` is a soft gap
406
+ * scoped to the chat slice only per §7.6.
407
+ */
408
+ subscribe(ensemble: string, opts?: SubscribeOptions): AsyncIterable<TempoEvent>;
409
+ /**
410
+ * Subscribe to the global cluster-shape stream at `/v1/events`. Carries
411
+ * only the cluster-wide events (`ensemble.created`, `ensemble.destroyed`,
412
+ * `host_profile.changed`, `heartbeat`, `gap`, `throttled`).
413
+ */
414
+ subscribe(opts?: SubscribeOptions): AsyncIterable<TempoEvent>;
415
+ /** Ensure a maestro session workflow exists for the ensemble (create or reuse). */
416
+ ensureMaestroSession(ensemble: string): Promise<string>;
417
+ /** Send a message as the maestro to a target player. */
418
+ sendAsMaestro(ensemble: string, targetPlayer: string, text: string): Promise<void>;
419
+ /** Get messages received + sent by the maestro session. */
420
+ getMaestroMessages(ensemble: string): Promise<{
421
+ received: Message[];
422
+ sent: SentMessage[];
423
+ }>;
424
+ }
425
+ /**
426
+ * #308 follow-up: TTY-bound superset of {@link TempoClientCore}.
427
+ *
428
+ * Adds the two methods that shell out to a local terminal via
429
+ * `agent-tempo up …`. Required for the TUI's "create ensemble" wizard
430
+ * and the restore-after-shutdown flow. **DO NOT depend on this interface
431
+ * from headless contexts** — the daemon, MCP tools, and SSE event source
432
+ * must use {@link TempoClientCore}.
433
+ */
434
+ export interface TempoClientWithSpawn extends TempoClientCore {
435
+ /**
436
+ * Spawn a new conductor terminal for a brand-new ensemble. Shells out to
437
+ * `agent-tempo up <name>` so the spawned conductor terminal matches the
438
+ * CLI path. **Requires a TTY context** — DO NOT call from MCP tools, the
439
+ * daemon, or other headless processes.
440
+ */
441
+ createEnsemble(opts: CreateEnsembleOpts): Promise<void>;
442
+ /**
443
+ * Spawn a conductor terminal for an existing ensemble — the restore-
444
+ * after-shutdown path. Shells out to `agent-tempo up <name>` which is
445
+ * idempotent at the workflow layer. Semantically distinct from
446
+ * {@link TempoClientWithSpawn.createEnsemble}: this fires on an ensemble
447
+ * that already exists; a "create" contradiction would mislead future
448
+ * readers. **Requires a TTY context.**
449
+ */
450
+ spawnConductor(opts: {
451
+ ensemble: string;
452
+ workDir?: string;
453
+ }): Promise<void>;
454
+ }
455
+ /**
456
+ * Backwards-compatible alias preserved indefinitely (per ADR 0007's
457
+ * forward-looking note). Existing code that imports `TempoClient` keeps
458
+ * the full surface (Core + spawn). New consumers that want headless
459
+ * safety should import {@link TempoClientCore} directly.
460
+ */
461
+ export type TempoClient = TempoClientWithSpawn;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });