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
package/dist/cli.js ADDED
@@ -0,0 +1,680 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ // Lazy-loaded command surfaces — see `main()` below. The CLI entrypoint
4
+ // avoids top-level imports of any module that transitively pulls in the
5
+ // Temporal SDK, so that recovery commands (`daemon stop`, `version`, `help`,
6
+ // `config show/set`, `upgrade`) stay operable on Node versions where the
7
+ // Temporal SDK's transitive deps fail to resolve (issue #157).
8
+ //
9
+ // Each command-specific handler lives in its own module:
10
+ // - `./cli/daemon-command` (PR A) — `daemon` subcommands
11
+ // - `./cli/help-text` (PR C) — `help` output
12
+ // - `./cli/upgrade-command` (PR C) — `upgrade`
13
+ // - `./cli/config-command` — `config` set/show/interactive
14
+ // - `./cli/preflight` — Temporal-touching, legitimately not crash-proof
15
+ // - `./cli/commands` — all Temporal-touching verbs (start, status, …)
16
+ // The `test/cli-crash-proof-isolation.test.ts` suite asserts the crash-proof
17
+ // modules carry no `@temporalio/*` / `rxjs` / `@grpc/*` leaks in their
18
+ // `require.cache` after load.
19
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
20
+ if (k2 === undefined) k2 = k;
21
+ var desc = Object.getOwnPropertyDescriptor(m, k);
22
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
23
+ desc = { enumerable: true, get: function() { return m[k]; } };
24
+ }
25
+ Object.defineProperty(o, k2, desc);
26
+ }) : (function(o, m, k, k2) {
27
+ if (k2 === undefined) k2 = k;
28
+ o[k2] = m[k];
29
+ }));
30
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
31
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
32
+ }) : function(o, v) {
33
+ o["default"] = v;
34
+ });
35
+ var __importStar = (this && this.__importStar) || (function () {
36
+ var ownKeys = function(o) {
37
+ ownKeys = Object.getOwnPropertyNames || function (o) {
38
+ var ar = [];
39
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
40
+ return ar;
41
+ };
42
+ return ownKeys(o);
43
+ };
44
+ return function (mod) {
45
+ if (mod && mod.__esModule) return mod;
46
+ var result = {};
47
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
48
+ __setModuleDefault(result, mod);
49
+ return result;
50
+ };
51
+ })();
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ // MUST be the first import — promotes a top-level `--dev` flag into the
54
+ // `AGENT_TEMPO_DEV_MODE=1` env var BEFORE `./config` evaluates its
55
+ // module-load-time `AGENT_TEMPO_HOME` constant. ADR 0014 §5.4.
56
+ require("./cli/dev-mode-bootstrap");
57
+ const fs_1 = require("fs");
58
+ const path_1 = require("path");
59
+ const out = __importStar(require("./cli/output"));
60
+ const dev_banner_1 = require("./cli/dev-banner");
61
+ const types_1 = require("./types");
62
+ const config_1 = require("./config");
63
+ const legacy_migration_1 = require("./cli/legacy-migration");
64
+ /** Package root — cli.js compiles to dist/cli.js, so one level up. Used by the inline `version` handler. */
65
+ const PACKAGE_ROOT = (0, path_1.resolve)(__dirname, '..');
66
+ function parseArgs(argv) {
67
+ const result = {
68
+ command: 'tui',
69
+ positional: [],
70
+ dir: process.cwd(),
71
+ skipPreflight: false,
72
+ background: false,
73
+ keepMcp: false,
74
+ keepDaemon: false,
75
+ yes: false,
76
+ all: false,
77
+ allHosts: false,
78
+ project: false,
79
+ noHold: false,
80
+ destroy: false,
81
+ killSharedTemporal: false,
82
+ includeStale: false,
83
+ force: false,
84
+ includeSent: false,
85
+ json: false,
86
+ noOpen: false,
87
+ pair: false,
88
+ };
89
+ let i = 0;
90
+ while (i < argv.length) {
91
+ const arg = argv[i];
92
+ if (arg === '--temporal-address' && i + 1 < argv.length) {
93
+ result.temporalAddress = argv[++i];
94
+ }
95
+ else if (arg === '--temporal-namespace' && i + 1 < argv.length) {
96
+ result.temporalNamespace = argv[++i];
97
+ }
98
+ else if (arg === '--temporal-api-key' && i + 1 < argv.length) {
99
+ result.temporalApiKey = argv[++i];
100
+ }
101
+ else if (arg === '--temporal-tls-cert' && i + 1 < argv.length) {
102
+ result.temporalTlsCertPath = argv[++i];
103
+ }
104
+ else if (arg === '--temporal-tls-key' && i + 1 < argv.length) {
105
+ result.temporalTlsKeyPath = argv[++i];
106
+ }
107
+ else if (arg === '--lineup' && i + 1 < argv.length) {
108
+ result.lineup = argv[++i];
109
+ }
110
+ else if (arg === '--name' && i + 1 < argv.length) {
111
+ // Alias for the positional form on `recall` / `attachment-info`.
112
+ result.name = argv[++i];
113
+ }
114
+ else if ((arg === '-d' || arg === '--dir') && i + 1 < argv.length) {
115
+ result.dir = argv[++i];
116
+ }
117
+ else if (arg === '--skip-preflight') {
118
+ result.skipPreflight = true;
119
+ }
120
+ else if (arg === '--background') {
121
+ result.background = true;
122
+ }
123
+ else if (arg === '--keep-mcp') {
124
+ result.keepMcp = true;
125
+ }
126
+ else if (arg === '--keep-daemon') {
127
+ result.keepDaemon = true;
128
+ }
129
+ else if (arg === '--yes' || arg === '-y') {
130
+ result.yes = true;
131
+ }
132
+ else if (arg === '--all') {
133
+ result.all = true;
134
+ }
135
+ else if (arg === '--all-hosts') {
136
+ // #151: `restore --all-hosts` — cluster-view readonly orphan listing.
137
+ result.allHosts = true;
138
+ }
139
+ else if (arg === '--project') {
140
+ result.project = true;
141
+ }
142
+ else if (arg === '--no-hold') {
143
+ result.noHold = true;
144
+ }
145
+ else if (arg === '--destroy') {
146
+ result.destroy = true;
147
+ }
148
+ else if (arg === '--kill-shared-temporal') {
149
+ // #423 (down only): bypass the cross-profile coexistence guard and
150
+ // tear down the shared Temporal dev server even when the OPPOSITE
151
+ // profile is likely active. Without it, `--dev down` skips the
152
+ // Temporal kill to avoid collateral damage to the prod profile.
153
+ result.killSharedTemporal = true;
154
+ }
155
+ else if (arg === '--ensemble' && i + 1 < argv.length) {
156
+ result.ensemble = argv[++i];
157
+ }
158
+ else if (arg === '--type' && i + 1 < argv.length) {
159
+ result.type = argv[++i];
160
+ }
161
+ else if (arg === '--include-stale') {
162
+ result.includeStale = true;
163
+ }
164
+ else if (arg === '--host' && i + 1 < argv.length) {
165
+ result.host = argv[++i];
166
+ }
167
+ else if (arg === '--force') {
168
+ // Consumed by `daemon start --force` (bypass stale-PID guard) and by
169
+ // `migrate-from-claude-tempo --force` (bypass conflict + volatile-state guards).
170
+ result.force = true;
171
+ }
172
+ else if (arg === '--dry-run') {
173
+ // `migrate-from-claude-tempo --dry-run` — print the plan, write nothing.
174
+ result.dryRun = true;
175
+ }
176
+ else if (arg === '--no-open') {
177
+ // `dashboard --no-open` — print the URL without spawning a browser.
178
+ result.noOpen = true;
179
+ }
180
+ else if (arg === '--pair') {
181
+ // `dashboard --pair` — mint a single-use cross-device pairing token.
182
+ result.pair = true;
183
+ }
184
+ else if (arg === '--port' && i + 1 < argv.length) {
185
+ const n = Number(argv[++i]);
186
+ if (!Number.isInteger(n) || n < 1 || n > 65535) {
187
+ out.error(`Invalid --port: ${argv[i]} (expected 1-65535)`);
188
+ process.exit(1);
189
+ }
190
+ result.port = n;
191
+ }
192
+ else if (arg === '--bind' && i + 1 < argv.length) {
193
+ result.bind = argv[++i];
194
+ }
195
+ else if (arg === '--bearer' && i + 1 < argv.length) {
196
+ result.bearer = argv[++i];
197
+ }
198
+ else if (arg === '--scenario' && i + 1 < argv.length) {
199
+ // PR-3 of #340-followup. Threaded through to mock-player spawn envs by
200
+ // `up`'s `applyLineupPlayersAndSchedules`. Dev-mode only — silently
201
+ // no-ops outside dev mode because mock players can't exist there.
202
+ result.scenario = argv[++i];
203
+ }
204
+ else if (arg === '--limit' && i + 1 < argv.length) {
205
+ const raw = argv[++i];
206
+ const n = Number(raw);
207
+ if (!Number.isInteger(n) || n < 1) {
208
+ out.error(`Invalid --limit: ${raw}`);
209
+ process.exit(1);
210
+ }
211
+ // #270: cap at 100 to match the MCP Zod schema. Recall queries load
212
+ // the full inbox/sent history from the workflow; the cap bounds the
213
+ // worst-case payload across every surface. Use `--offset` to page.
214
+ if (n > 100) {
215
+ out.error(`--limit exceeds max (100). Use --offset N to page through more results.`);
216
+ process.exit(1);
217
+ }
218
+ result.limit = n;
219
+ }
220
+ else if (arg === '--offset' && i + 1 < argv.length) {
221
+ const n = Number(argv[++i]);
222
+ if (Number.isInteger(n) && n >= 0)
223
+ result.offset = n;
224
+ else {
225
+ out.error(`Invalid --offset: ${argv[i]}`);
226
+ process.exit(1);
227
+ }
228
+ }
229
+ else if (arg === '--preview' && i + 1 < argv.length) {
230
+ const n = Number(argv[++i]);
231
+ if (Number.isInteger(n) && n >= 1)
232
+ result.previewLength = n;
233
+ else {
234
+ out.error(`Invalid --preview: ${argv[i]}`);
235
+ process.exit(1);
236
+ }
237
+ }
238
+ else if (arg === '--since' && i + 1 < argv.length) {
239
+ result.since = argv[++i];
240
+ }
241
+ else if (arg === '--from' && i + 1 < argv.length) {
242
+ result.from = argv[++i];
243
+ }
244
+ else if (arg === '--include-sent') {
245
+ result.includeSent = true;
246
+ }
247
+ else if (arg === '--json') {
248
+ result.json = true;
249
+ }
250
+ else if (arg === '--agent' && i + 1 < argv.length) {
251
+ const val = argv[++i];
252
+ // #476: source the allowlist from the canonical `AGENT_TYPES` tuple in
253
+ // `src/types.ts` so the CLI surface tracks the union automatically when
254
+ // a new adapter lands. Pre-#476 this was a hardcoded `'claude'|'copilot'`
255
+ // pair that fell out of sync when `'mock'` (#220) and `'claude-api'`
256
+ // (#131) were added — `agent-tempo recruit --agent claude-api` errored
257
+ // out here even though the recruit MCP tool accepted it. Dev-mode gating
258
+ // for `'mock'` lives downstream at the recruit boundary (`src/tools/
259
+ // recruit.ts`, ADR 0014 §7 gate 3); we don't double-gate it here.
260
+ if (!types_1.AGENT_TYPES.includes(val)) {
261
+ out.error(`Invalid agent type: "${val}". Must be one of: ${types_1.AGENT_TYPES.join(', ')}.`);
262
+ process.exit(1);
263
+ }
264
+ result.agent = val;
265
+ }
266
+ else if (arg === '--help' || arg === '-h') {
267
+ result.command = 'help';
268
+ }
269
+ else if (arg === '--version' || arg === '-v') {
270
+ result.command = 'version';
271
+ }
272
+ else if (!arg.startsWith('-')) {
273
+ result.positional.push(arg);
274
+ }
275
+ else {
276
+ out.error(`Unknown option: ${arg}`);
277
+ out.log(`Run ${out.dim('agent-tempo help')} for usage.`);
278
+ process.exit(1);
279
+ }
280
+ i++;
281
+ }
282
+ if (result.positional.length > 0) {
283
+ result.command = result.positional[0];
284
+ }
285
+ return result;
286
+ }
287
+ /** Extract CLI overrides for config resolution. */
288
+ function cliOverrides(args) {
289
+ return {
290
+ temporalAddress: args.temporalAddress,
291
+ temporalNamespace: args.temporalNamespace,
292
+ temporalApiKey: args.temporalApiKey,
293
+ temporalTlsCertPath: args.temporalTlsCertPath,
294
+ temporalTlsKeyPath: args.temporalTlsKeyPath,
295
+ };
296
+ }
297
+ /**
298
+ * Format + print a {@link LegacyMigrationResult} from
299
+ * `migrate-from-claude-tempo`. Extracted to module scope (an if/else cascade
300
+ * rather than a nested switch) so the body doesn't trip the CLI surface-drift
301
+ * detector, which scans top-level `case '...':` labels in this file.
302
+ */
303
+ function reportMigrationResult(result) {
304
+ const msg = (0, legacy_migration_1.formatMigrationResult)(result);
305
+ if (result.status === 'no-legacy' || result.status === 'already-migrated') {
306
+ out.success(msg);
307
+ return;
308
+ }
309
+ if (result.status === 'migrated') {
310
+ out.success(msg);
311
+ if (result.copiedFiles?.length) {
312
+ for (const f of result.copiedFiles)
313
+ out.log(` ${out.dim('+')} ${f}`);
314
+ }
315
+ if (result.errors?.length) {
316
+ for (const e of result.errors)
317
+ out.warn(e);
318
+ }
319
+ return;
320
+ }
321
+ if (result.status === 'skipped') {
322
+ out.warn(msg);
323
+ process.exitCode = 1;
324
+ return;
325
+ }
326
+ // 'failed'
327
+ out.error(msg);
328
+ process.exitCode = 1;
329
+ }
330
+ async function main() {
331
+ const args = parseArgs(process.argv.slice(2));
332
+ const overrides = cliOverrides(args);
333
+ // ADR 0014 §5.4 / gate 4: every dev-mode CLI invocation prints the
334
+ // `[DEV MODE]` banner so operators (and operators' daemon log files)
335
+ // self-identify as the dev profile. Banner emits to stderr — keeps
336
+ // `--json` stdout consumers clean.
337
+ (0, dev_banner_1.emitDevBannerIfActive)();
338
+ // ── Crash-proof fast paths (#157 PR C) ────────────────────────────────
339
+ // These handlers MUST NOT reach `./cli/commands`, `./cli/preflight`, or
340
+ // any other module that transitively imports `@temporalio/*` / `rxjs` /
341
+ // `@grpc/*`. Keeping their dispatch ABOVE the `import('./cli/commands')`
342
+ // line is what makes them resilient to a broken Temporal SDK install —
343
+ // the scenario users are often trying to recover from by running one of
344
+ // these very commands. Any future crash-proof candidate should slot in
345
+ // here AND get added to CRASH_PROOF_MODULES in the isolation test.
346
+ //
347
+ // Enumerated crash-proof entrypoints:
348
+ // version / --version / -v (inline below)
349
+ // help / --help / -h (→ ./cli/help-text)
350
+ // daemon <sub> (→ ./cli/daemon-command) [PR A]
351
+ // upgrade [version] (→ ./cli/upgrade-command) [PR C]
352
+ // config / config show / config set (→ ./cli/config-command) [PR C]
353
+ if (args.command === 'version') {
354
+ try {
355
+ const pkg = JSON.parse((0, fs_1.readFileSync)((0, path_1.join)(PACKAGE_ROOT, 'package.json'), 'utf8'));
356
+ out.log(`agent-tempo v${pkg.version}`);
357
+ }
358
+ catch {
359
+ out.log('agent-tempo (unknown version)');
360
+ }
361
+ return;
362
+ }
363
+ if (args.command === 'help') {
364
+ const { printHelp } = await Promise.resolve().then(() => __importStar(require('./cli/help-text')));
365
+ printHelp();
366
+ return;
367
+ }
368
+ if (args.command === 'daemon') {
369
+ const { daemon } = await Promise.resolve().then(() => __importStar(require('./cli/daemon-command')));
370
+ await daemon({
371
+ subcommand: args.positional[1],
372
+ force: args.force,
373
+ ...overrides,
374
+ });
375
+ return;
376
+ }
377
+ if (args.command === 'upgrade') {
378
+ const { upgrade } = await Promise.resolve().then(() => __importStar(require('./cli/upgrade-command')));
379
+ await upgrade({
380
+ version: args.positional[1], // "0.20.0" | "latest" | undefined
381
+ ...overrides,
382
+ });
383
+ return;
384
+ }
385
+ if (args.command === 'config') {
386
+ const { configCommand } = await Promise.resolve().then(() => __importStar(require('./cli/config-command')));
387
+ await configCommand(args.positional);
388
+ return;
389
+ }
390
+ if (args.command === 'dashboard') {
391
+ // PR-8 of #340. Crash-proof — stays out of `./cli/commands` so a
392
+ // broken Temporal SDK doesn't block operators from opening the
393
+ // dashboard against an already-running daemon.
394
+ const { dashboardCommand } = await Promise.resolve().then(() => __importStar(require('./cli/dashboard-command')));
395
+ await dashboardCommand({
396
+ port: args.port,
397
+ bind: args.bind,
398
+ noOpen: args.noOpen,
399
+ pair: args.pair,
400
+ bearer: args.bearer,
401
+ json: args.json,
402
+ ...overrides,
403
+ });
404
+ return;
405
+ }
406
+ // Dev-mode scriptable verbs (#432). Gated on `isDevMode()` AND an explicit
407
+ // allowlist (`DEV_VERBS`); intercepts BEFORE the removed-verbs check so
408
+ // verbs like `pause` (collapsed by #288) can act on the live ensemble in
409
+ // dev mode. NOT crash-proof — dev mode requires Temporal anyway, and the
410
+ // dynamic-import keeps `cli.ts` itself out of `dev-verbs.ts`'s module
411
+ // graph at the top level. The DEV_VERBS ↔ REMOVED_VERBS ↔ cli.ts switch
412
+ // invariants are mechanically asserted by `test/cli-dev-verbs.test.ts`.
413
+ if ((0, config_1.isDevMode)()) {
414
+ const { DEV_VERBS, dispatchDevVerb } = await Promise.resolve().then(() => __importStar(require('./cli/dev-verbs')));
415
+ if (DEV_VERBS.has(args.command)) {
416
+ const ensemble = args.ensemble || process.env[config_1.ENV.ENSEMBLE] || 'default';
417
+ await dispatchDevVerb(args.command, {
418
+ positional: args.positional,
419
+ ensemble,
420
+ ...overrides,
421
+ });
422
+ return;
423
+ }
424
+ }
425
+ // Removed-verb fast path (#288). Intercepted BEFORE the Temporal-touching
426
+ // `./cli/commands` import so the friendly error message works even when
427
+ // Temporal is broken — same reasoning as the crash-proof `help` path.
428
+ const { REMOVED_VERBS, printRemovedVerbMessage } = await Promise.resolve().then(() => __importStar(require('./cli/removed-verbs')));
429
+ if (Object.prototype.hasOwnProperty.call(REMOVED_VERBS, args.command)) {
430
+ printRemovedVerbMessage(args.command);
431
+ process.exit(1);
432
+ }
433
+ // All other commands: lazy-load the full command surface now.
434
+ const { status, init, server, up, down, ensembleCommand, agentTypesCommand, broadcast, release, destroy, attachmentInfo, recall, hosts, refreshHostProfile, restore, } = await Promise.resolve().then(() => __importStar(require('./cli/commands')));
435
+ const ensemble = args.positional[1] || process.env[config_1.ENV.ENSEMBLE] || 'default';
436
+ // Resolve the default agent from config (only needed for commands that use it)
437
+ const resolvedAgent = () => args.agent ?? (0, config_1.getConfig)(overrides).defaultAgent;
438
+ switch (args.command) {
439
+ case 'status':
440
+ await status({
441
+ ensemble: args.positional[1], // undefined = show all
442
+ ...overrides,
443
+ });
444
+ break;
445
+ case 'server':
446
+ await server({
447
+ background: args.background,
448
+ ...overrides,
449
+ });
450
+ break;
451
+ case 'down':
452
+ await down({
453
+ removeMcp: !args.keepMcp,
454
+ keepDaemon: args.keepDaemon,
455
+ killSharedTemporal: args.killSharedTemporal,
456
+ yes: args.yes,
457
+ destroy: args.destroy,
458
+ dir: args.dir,
459
+ ...overrides,
460
+ });
461
+ break;
462
+ case 'up':
463
+ await up({
464
+ ensemble,
465
+ name: args.name,
466
+ lineup: args.lineup,
467
+ noHold: args.noHold,
468
+ agent: resolvedAgent(),
469
+ ...(args.scenario ? { scenario: args.scenario } : {}),
470
+ ...overrides,
471
+ });
472
+ break;
473
+ case 'broadcast': {
474
+ const msg = args.positional.slice(1).join(' ');
475
+ if (!msg) {
476
+ out.error('Usage: agent-tempo broadcast <message> [--ensemble <name>] [--type <player-type>] [--include-stale]');
477
+ process.exit(1);
478
+ }
479
+ await broadcast({
480
+ message: msg,
481
+ ensemble: args.ensemble || ensemble,
482
+ type: args.type,
483
+ includeStale: args.includeStale,
484
+ ...overrides,
485
+ });
486
+ break;
487
+ }
488
+ case 'release':
489
+ await release({
490
+ ensemble: args.ensemble || ensemble,
491
+ ...overrides,
492
+ });
493
+ break;
494
+ case 'destroy': {
495
+ const target = args.positional[1] || args.ensemble || process.env[config_1.ENV.ENSEMBLE];
496
+ if (!target) {
497
+ out.error('Usage: agent-tempo destroy <ensemble> [-y]');
498
+ process.exit(1);
499
+ }
500
+ await destroy({
501
+ ensemble: target,
502
+ yes: args.yes,
503
+ ...overrides,
504
+ });
505
+ break;
506
+ }
507
+ case 'attachment-info':
508
+ case 'attachment': {
509
+ const name = args.positional[1] || args.name;
510
+ if (!name) {
511
+ out.error('Usage: agent-tempo attachment-info <name>');
512
+ process.exit(1);
513
+ }
514
+ await attachmentInfo({
515
+ name,
516
+ ensemble: args.ensemble || ensemble,
517
+ ...overrides,
518
+ });
519
+ break;
520
+ }
521
+ case 'hosts': {
522
+ await hosts({
523
+ ensemble: args.ensemble || ensemble,
524
+ ...(args.all ? { all: true } : {}),
525
+ ...(args.json ? { json: true } : {}),
526
+ ...overrides,
527
+ });
528
+ break;
529
+ }
530
+ case 'refresh-host-profile': {
531
+ await refreshHostProfile({
532
+ ensemble: args.ensemble || ensemble,
533
+ ...overrides,
534
+ });
535
+ break;
536
+ }
537
+ case 'recall': {
538
+ // Positional player is required — matches the #128 design.
539
+ const name = args.positional[1] || args.name;
540
+ if (!name) {
541
+ out.error('Usage: agent-tempo recall <player> [--limit N] [--offset N] [--preview N] [--from X] [--since ISO] [--include-sent] [--json]');
542
+ process.exit(1);
543
+ }
544
+ await recall({
545
+ name,
546
+ ensemble: args.ensemble || ensemble,
547
+ ...(args.limit !== undefined ? { limit: args.limit } : {}),
548
+ ...(args.offset !== undefined ? { offset: args.offset } : {}),
549
+ ...(args.previewLength !== undefined ? { previewLength: args.previewLength } : {}),
550
+ ...(args.since !== undefined ? { since: args.since } : {}),
551
+ ...(args.from !== undefined ? { from: args.from } : {}),
552
+ ...(args.includeSent ? { includeSent: true } : {}),
553
+ ...(args.json ? { json: true } : {}),
554
+ ...overrides,
555
+ });
556
+ break;
557
+ }
558
+ case 'restore': {
559
+ // #288: ensemble-scoped local mode requires a positional name.
560
+ // #151: `--all-hosts` switches to cluster-view readonly listing
561
+ // — ensemble becomes optional (when set, narrows the listing).
562
+ const target = args.positional[1] || args.ensemble || process.env[config_1.ENV.ENSEMBLE];
563
+ if (!args.allHosts && !target) {
564
+ out.error('Usage: agent-tempo restore <ensemble> (or --all-hosts for cluster-view)');
565
+ process.exit(1);
566
+ }
567
+ await restore({
568
+ ...(target ? { ensemble: target } : {}),
569
+ ...(args.allHosts ? { allHosts: true } : {}),
570
+ ...overrides,
571
+ });
572
+ break;
573
+ }
574
+ case 'ensemble':
575
+ await ensembleCommand({
576
+ subcommand: args.positional[1],
577
+ name: args.positional[2],
578
+ ...overrides,
579
+ });
580
+ break;
581
+ case 'agent-types':
582
+ await agentTypesCommand({
583
+ subcommand: args.positional[1],
584
+ name: args.positional[2],
585
+ });
586
+ break;
587
+ case 'scenarios': {
588
+ // ADR 0014 PR-2 — mock-adapter scenario library discovery surface.
589
+ // Available regardless of `--dev` so users investigating a published
590
+ // agent-tempo can see the shipped library; but the actual recruit
591
+ // gate (`agent: 'mock'`) still rejects without dev mode.
592
+ const { scenariosCommand } = await Promise.resolve().then(() => __importStar(require('./cli/scenarios-command')));
593
+ await scenariosCommand({
594
+ subcommand: args.positional[1],
595
+ name: args.positional[2],
596
+ json: args.json,
597
+ });
598
+ break;
599
+ }
600
+ case 'init':
601
+ await init({ dir: args.dir, project: args.project });
602
+ break;
603
+ case 'migrate-from-claude-tempo': {
604
+ // PR-2 of the v1.0 rebrand — one-shot copy of `~/.agent-tempo/` →
605
+ // `~/.agent-tempo/`. Crash-proof (no Temporal deps). The `--dev`
606
+ // top-level flag selects the dev profile (`~/.agent-tempo-dev/` →
607
+ // `~/.agent-tempo-dev/`) via {@link isDevMode}.
608
+ const { migrateLegacyHome } = await Promise.resolve().then(() => __importStar(require('./cli/legacy-migration')));
609
+ const result = await migrateLegacyHome({
610
+ dryRun: !!args.dryRun,
611
+ force: !!args.force,
612
+ profile: (0, config_1.isDevMode)() ? 'dev' : 'prod',
613
+ });
614
+ reportMigrationResult(result);
615
+ break;
616
+ }
617
+ case 'preflight': {
618
+ // Preflight legitimately requires Temporal (that's what it tests), so
619
+ // it's NOT in the crash-proof module set. Dynamic-imported here so its
620
+ // static import doesn't leak into the top-level module graph of cli.ts
621
+ // (which would undo the crash-proofing of version/help/daemon/etc).
622
+ const { runPreflight } = await Promise.resolve().then(() => __importStar(require('./cli/preflight')));
623
+ const result = await runPreflight({
624
+ dir: args.dir,
625
+ ...overrides,
626
+ });
627
+ for (const w of result.warnings)
628
+ out.warn(w);
629
+ if (!result.ok) {
630
+ for (const e of result.errors)
631
+ out.error(e);
632
+ process.exit(1);
633
+ }
634
+ out.success('All checks passed');
635
+ break;
636
+ }
637
+ case 'tui': {
638
+ const config = (0, config_1.getConfig)(overrides);
639
+ // If --ensemble or positional arg given, start in single-ensemble view.
640
+ // Otherwise, start in multi-ensemble home view.
641
+ const tuiEnsemble = args.ensemble || args.positional[1] || undefined;
642
+ // #289 / S7: run the auto-provisioning bootstrap before handing off
643
+ // to the TUI. Steps 1–6 register MCP, ensure Temporal reachability,
644
+ // boot the daemon, and prefetch badges + ensembles so the TUI home
645
+ // view renders instantly. `skipPreflight` bypass: power users can
646
+ // opt out if the cache / disk-probe cost ever regresses (no current
647
+ // way to trigger, but the flag is already on the parser).
648
+ let bootstrapResult;
649
+ if (!args.skipPreflight) {
650
+ const { bootstrap } = await Promise.resolve().then(() => __importStar(require('./cli/startup')));
651
+ try {
652
+ bootstrapResult = await bootstrap({ config });
653
+ }
654
+ catch (err) {
655
+ // Bootstrap is best-effort — per-step failures degrade into
656
+ // `StepOutcome.status: 'failed'` and a usable result. A thrown
657
+ // error means something outside the step boundaries broke
658
+ // (e.g. cache-dir creation). Log + continue with an undefined
659
+ // bootstrap payload so the TUI still launches.
660
+ out.warn(`Bootstrap hit an unexpected error: ${err instanceof Error ? err.message : String(err)}`);
661
+ }
662
+ }
663
+ // Dynamic import — TUI module uses ESM ink
664
+ const { run: runTui } = await Promise.resolve().then(() => __importStar(require('./tui/index')));
665
+ await runTui({ config, ensemble: tuiEnsemble, ...(bootstrapResult ? { bootstrap: bootstrapResult } : {}) });
666
+ break;
667
+ }
668
+ // `version`, `help`, `upgrade`, `config`, `daemon`, and removed-verb
669
+ // dispatch handled above the `./cli/commands` import — crash-proof
670
+ // fast paths (#157 PR C + #288).
671
+ default:
672
+ out.error(`Unknown command: ${args.command}`);
673
+ out.log(`Run ${out.dim('agent-tempo --help')} for usage.`);
674
+ process.exit(1);
675
+ }
676
+ }
677
+ main().catch((err) => {
678
+ out.error(err.message || String(err));
679
+ process.exit(1);
680
+ });