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,99 @@
1
+ /** Single source of truth — must match `SEARCH_ATTRIBUTES` in `src/cli/startup.ts`. */
2
+ export declare const REQUIRED_SEARCH_ATTRIBUTES: ReadonlyArray<{
3
+ name: string;
4
+ type: 'Keyword' | 'Bool';
5
+ }>;
6
+ export interface SearchAttributePreflightOpts {
7
+ temporalAddress: string;
8
+ temporalNamespace: string;
9
+ /**
10
+ * Optional test seam — given a namespace, return the set of search
11
+ * attribute names that ARE currently registered. Defaults to
12
+ * {@link defaultProbeRegisteredAttributes} which shells out to
13
+ * `temporal operator search-attribute list`.
14
+ */
15
+ probe?: (opts: {
16
+ temporalAddress: string;
17
+ temporalNamespace: string;
18
+ }) => Promise<Set<string>>;
19
+ }
20
+ export interface SearchAttributePreflightResult {
21
+ ok: boolean;
22
+ /** Subset of `REQUIRED_SEARCH_ATTRIBUTES` that the probe couldn't find. */
23
+ missing: ReadonlyArray<typeof REQUIRED_SEARCH_ATTRIBUTES[number]>;
24
+ /** Formatted, paste-friendly error message — populated when `ok === false`. */
25
+ message?: string;
26
+ /** Probe error, if the call failed entirely (e.g. `temporal` CLI not on PATH). */
27
+ probeError?: string;
28
+ }
29
+ /**
30
+ * Default probe — shells out to `temporal operator search-attribute list`.
31
+ * Returns an empty set on any error so callers fall through to the
32
+ * "missing all" branch with an explanatory `probeError` in the result.
33
+ */
34
+ export declare function defaultProbeRegisteredAttributes(opts: {
35
+ temporalAddress: string;
36
+ temporalNamespace: string;
37
+ }): Promise<Set<string>>;
38
+ /**
39
+ * Format the missing-SA error message. Paste-friendly: operators copy the
40
+ * `temporal operator search-attribute create` block verbatim.
41
+ */
42
+ export declare function formatPreflightError(missing: ReadonlyArray<typeof REQUIRED_SEARCH_ATTRIBUTES[number]>, namespace: string, probeError?: string): string;
43
+ /**
44
+ * Verify all {@link REQUIRED_SEARCH_ATTRIBUTES} are registered on the
45
+ * given namespace. Returns a structured result — callers decide whether
46
+ * to log+continue (boot bootstrap step) or exit non-zero (daemon start).
47
+ */
48
+ export declare function verifySearchAttributes(opts: SearchAttributePreflightOpts): Promise<SearchAttributePreflightResult>;
49
+ /**
50
+ * Outcome of a single `temporal operator search-attribute create` invocation.
51
+ *
52
+ * Pre-#605 the two registration call sites (`commands.ts:registerSearchAttributes`
53
+ * and `startup.ts:stepSearchAttrs`) ran the create command with `stdio: 'ignore'`
54
+ * and swallowed every non-zero exit as "already exists". That hid the
55
+ * SQLite dev-server's 10-Keyword-per-namespace cap (and any other genuine
56
+ * failure) until a downstream workflow start crashed with the confusing
57
+ * `INVALID_ARGUMENT: search attribute "..." is not defined` — hours later
58
+ * and miles away from the real cause.
59
+ */
60
+ export type RegistrationStatus = 'created' | 'already-exists' | 'failed';
61
+ export interface RegistrationResult {
62
+ attr: typeof REQUIRED_SEARCH_ATTRIBUTES[number];
63
+ status: RegistrationStatus;
64
+ /** stderr from the temporal CLI, populated when `status === 'failed'`. */
65
+ detail?: string;
66
+ }
67
+ /**
68
+ * Pure classifier — turn a temporal CLI exit into a {@link RegistrationStatus}.
69
+ * Extracted from {@link registerSearchAttribute} so the matching rules can
70
+ * be unit-tested without mocking `child_process`.
71
+ *
72
+ * Rules:
73
+ * - exit code 0 → `created`
74
+ * - stderr/stdout matches the → `already-exists` (idempotent)
75
+ * standard Temporal markers
76
+ * - anything else → `failed` (with detail for the operator)
77
+ */
78
+ export declare function classifyRegistrationOutput(exitCode: number | null, output: string, errorMessage?: string): {
79
+ status: RegistrationStatus;
80
+ detail?: string;
81
+ };
82
+ /**
83
+ * Register one search attribute. Captures stderr so callers can
84
+ * distinguish "already-exists" (idempotent expected case) from real
85
+ * failures (CLI missing, server unreachable, namespace cap exceeded, …).
86
+ */
87
+ export declare function registerSearchAttribute(attr: typeof REQUIRED_SEARCH_ATTRIBUTES[number], temporalAddress: string, namespace: string): RegistrationResult;
88
+ /**
89
+ * Hard variant for the daemon boot path — verify, and if missing, write the
90
+ * actionable error to stderr and exit non-zero. Returns when all attributes
91
+ * are present; never returns in the failure branch.
92
+ *
93
+ * The caller hands in a `processExit` injectable so tests can assert the
94
+ * call without crashing the test runner.
95
+ */
96
+ export declare function assertSearchAttributesOrExit(opts: SearchAttributePreflightOpts & {
97
+ processExit?: (code: number) => never;
98
+ log?: (line: string) => void;
99
+ }): Promise<void>;
@@ -0,0 +1,183 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.REQUIRED_SEARCH_ATTRIBUTES = void 0;
4
+ exports.defaultProbeRegisteredAttributes = defaultProbeRegisteredAttributes;
5
+ exports.formatPreflightError = formatPreflightError;
6
+ exports.verifySearchAttributes = verifySearchAttributes;
7
+ exports.classifyRegistrationOutput = classifyRegistrationOutput;
8
+ exports.registerSearchAttribute = registerSearchAttribute;
9
+ exports.assertSearchAttributesOrExit = assertSearchAttributesOrExit;
10
+ /**
11
+ * Search-attribute preflight (PR-3 of the v1.0 rebrand).
12
+ *
13
+ * After the wire-level rename from `ClaudeTempo*` to `AgentTempo*`, every
14
+ * Temporal namespace agent-tempo / agent-tempo touches needs the new
15
+ * search attributes registered before workflows can start. Self-hosted
16
+ * Temporal makes registration a privileged one-shot operator action — the
17
+ * daemon can't do it itself, but it CAN refuse to boot with an actionable
18
+ * error so operators don't see a confusing
19
+ * `INVALID_ARGUMENT: search attribute "AgentTempoEnsemble" is not defined`
20
+ * deep in workflow-start RPC failures hours later.
21
+ *
22
+ * This module is dependency-injected over a `searchAttributesPresent`
23
+ * probe so tests can simulate every namespace-state branch without
24
+ * touching a real Temporal server.
25
+ *
26
+ * Wiring:
27
+ * - `src/cli/startup.ts` `searchAttrs` step uses the verify-or-instruct
28
+ * output to surface the actionable error in the TUI bootstrap surface.
29
+ * - `src/daemon.ts` boot path calls {@link verifySearchAttributes}
30
+ * directly to fail fast on `agent-tempo daemon start` before the worker
31
+ * tries to register workflows.
32
+ */
33
+ const child_process_1 = require("child_process");
34
+ /** Single source of truth — must match `SEARCH_ATTRIBUTES` in `src/cli/startup.ts`. */
35
+ exports.REQUIRED_SEARCH_ATTRIBUTES = Object.freeze([
36
+ { name: 'AgentTempoHostname', type: 'Keyword' },
37
+ { name: 'AgentTempoGitRoot', type: 'Keyword' },
38
+ { name: 'AgentTempoEnsemble', type: 'Keyword' },
39
+ { name: 'AgentTempoPlayerId', type: 'Keyword' },
40
+ { name: 'AgentTempoPlayerType', type: 'Keyword' },
41
+ { name: 'AgentTempoIsConductor', type: 'Bool' },
42
+ { name: 'AgentTempoAttachedHost', type: 'Keyword' },
43
+ { name: 'AgentTempoAttachmentState', type: 'Keyword' },
44
+ { name: 'AgentTempoAttachmentId', type: 'Keyword' },
45
+ ]);
46
+ /**
47
+ * Default probe — shells out to `temporal operator search-attribute list`.
48
+ * Returns an empty set on any error so callers fall through to the
49
+ * "missing all" branch with an explanatory `probeError` in the result.
50
+ */
51
+ async function defaultProbeRegisteredAttributes(opts) {
52
+ const args = [
53
+ 'operator', 'search-attribute', 'list',
54
+ '--address', opts.temporalAddress,
55
+ '--namespace', opts.temporalNamespace,
56
+ ];
57
+ const raw = (0, child_process_1.execFileSync)('temporal', args, {
58
+ encoding: 'utf8',
59
+ stdio: ['ignore', 'pipe', 'pipe'],
60
+ });
61
+ // The CLI prints a human table; we only need the leading column. Each row
62
+ // starts with the attribute name as the first whitespace-delimited token.
63
+ // Header row (and blank lines) are filtered by the AgentTempo prefix /
64
+ // alphanumeric guard below.
65
+ const names = new Set();
66
+ for (const line of raw.split('\n')) {
67
+ const trimmed = line.trim();
68
+ if (!trimmed)
69
+ continue;
70
+ const first = trimmed.split(/\s+/, 1)[0];
71
+ if (/^[A-Za-z][A-Za-z0-9_]*$/.test(first))
72
+ names.add(first);
73
+ }
74
+ return names;
75
+ }
76
+ /**
77
+ * Format the missing-SA error message. Paste-friendly: operators copy the
78
+ * `temporal operator search-attribute create` block verbatim.
79
+ */
80
+ function formatPreflightError(missing, namespace, probeError) {
81
+ const lines = [];
82
+ lines.push(`Required search attributes not registered on namespace '${namespace}'.`);
83
+ if (probeError) {
84
+ lines.push(`(Could not probe namespace state: ${probeError})`);
85
+ }
86
+ lines.push('');
87
+ lines.push('Run these commands once per Temporal namespace, then restart the daemon:');
88
+ lines.push('');
89
+ for (const attr of missing) {
90
+ lines.push(` temporal operator search-attribute create ` +
91
+ `--name ${attr.name} --type ${attr.type} --namespace ${namespace}`);
92
+ }
93
+ lines.push('');
94
+ lines.push('(See docs/ops/v1.0-migration.md for the full upgrade walkthrough.)');
95
+ return lines.join('\n');
96
+ }
97
+ /**
98
+ * Verify all {@link REQUIRED_SEARCH_ATTRIBUTES} are registered on the
99
+ * given namespace. Returns a structured result — callers decide whether
100
+ * to log+continue (boot bootstrap step) or exit non-zero (daemon start).
101
+ */
102
+ async function verifySearchAttributes(opts) {
103
+ const probe = opts.probe ?? defaultProbeRegisteredAttributes;
104
+ let registered;
105
+ let probeError;
106
+ try {
107
+ registered = await probe({
108
+ temporalAddress: opts.temporalAddress,
109
+ temporalNamespace: opts.temporalNamespace,
110
+ });
111
+ }
112
+ catch (err) {
113
+ probeError = err instanceof Error ? err.message : String(err);
114
+ registered = new Set();
115
+ }
116
+ const missing = exports.REQUIRED_SEARCH_ATTRIBUTES.filter((a) => !registered.has(a.name));
117
+ if (missing.length === 0 && !probeError) {
118
+ return { ok: true, missing: [] };
119
+ }
120
+ return {
121
+ ok: false,
122
+ missing,
123
+ probeError,
124
+ message: formatPreflightError(missing, opts.temporalNamespace, probeError),
125
+ };
126
+ }
127
+ /**
128
+ * Pure classifier — turn a temporal CLI exit into a {@link RegistrationStatus}.
129
+ * Extracted from {@link registerSearchAttribute} so the matching rules can
130
+ * be unit-tested without mocking `child_process`.
131
+ *
132
+ * Rules:
133
+ * - exit code 0 → `created`
134
+ * - stderr/stdout matches the → `already-exists` (idempotent)
135
+ * standard Temporal markers
136
+ * - anything else → `failed` (with detail for the operator)
137
+ */
138
+ function classifyRegistrationOutput(exitCode, output, errorMessage) {
139
+ if (exitCode === 0)
140
+ return { status: 'created' };
141
+ if (/already\s*exists/i.test(output) || /AlreadyExists/.test(output)) {
142
+ return { status: 'already-exists' };
143
+ }
144
+ const detail = output.trim() || errorMessage || `temporal CLI exited ${exitCode ?? 'with no status'}`;
145
+ return { status: 'failed', detail };
146
+ }
147
+ /**
148
+ * Register one search attribute. Captures stderr so callers can
149
+ * distinguish "already-exists" (idempotent expected case) from real
150
+ * failures (CLI missing, server unreachable, namespace cap exceeded, …).
151
+ */
152
+ function registerSearchAttribute(attr, temporalAddress, namespace) {
153
+ const result = (0, child_process_1.spawnSync)('temporal', [
154
+ 'operator', 'search-attribute', 'create',
155
+ '--address', temporalAddress,
156
+ '--namespace', namespace,
157
+ '--name', attr.name,
158
+ '--type', attr.type,
159
+ ], { encoding: 'utf8' });
160
+ const classified = classifyRegistrationOutput(result.status, (result.stderr || '') + (result.stdout || ''), result.error?.message);
161
+ return { attr, ...classified };
162
+ }
163
+ /**
164
+ * Hard variant for the daemon boot path — verify, and if missing, write the
165
+ * actionable error to stderr and exit non-zero. Returns when all attributes
166
+ * are present; never returns in the failure branch.
167
+ *
168
+ * The caller hands in a `processExit` injectable so tests can assert the
169
+ * call without crashing the test runner.
170
+ */
171
+ async function assertSearchAttributesOrExit(opts) {
172
+ const result = await verifySearchAttributes(opts);
173
+ if (result.ok)
174
+ return;
175
+ const log = opts.log ?? ((line) => process.stderr.write(line + '\n'));
176
+ log('ERROR: ' + result.message);
177
+ const exit = opts.processExit ?? ((code) => {
178
+ process.exit(code);
179
+ // Unreachable, but satisfies the `never` return.
180
+ throw new Error(`process.exit(${code}) failed`);
181
+ });
182
+ exit(1);
183
+ }
@@ -0,0 +1,6 @@
1
+ /** Surface used by `src/cli.ts`'s `--dev scenarios` verb. */
2
+ export declare function scenariosCommand(args: {
3
+ subcommand?: string;
4
+ name?: string;
5
+ json?: boolean;
6
+ }): Promise<void>;
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.scenariosCommand = scenariosCommand;
37
+ /**
38
+ * `agent-tempo --dev scenarios <list|show> [name]` — discoverability surface
39
+ * for the mock-adapter scenario library shipped at the package's repo-root
40
+ * `scenarios/` directory (ADR 0014 §4.8).
41
+ *
42
+ * Crash-proof: imports only `fs`, `path`, the scenario parser, and the
43
+ * shared CLI output helpers. No Temporal, no rxjs — lives in the same
44
+ * "always-importable" tier as `help-text.ts` and `daemon-command.ts`. A
45
+ * conductor can `agent-tempo --dev scenarios list` to enumerate the
46
+ * library before the dev daemon is even running.
47
+ *
48
+ * Resolution rules mirror `MockAttachment.resolveScenarioPath`:
49
+ *
50
+ * 1. Absolute path — used verbatim.
51
+ * 2. Bare name (no separators) — `<package-root>/scenarios/<name>.yaml`.
52
+ * 3. Relative path — `process.cwd()`-relative.
53
+ */
54
+ const fs = __importStar(require("fs"));
55
+ const path = __importStar(require("path"));
56
+ const scenario_1 = require("../adapters/mock/scenario");
57
+ const out = __importStar(require("./output"));
58
+ /** Walk up from this file's compiled location to the package root. */
59
+ function packageRoot() {
60
+ // dist/cli/scenarios-command.js → dist/cli → dist → <root>
61
+ return path.resolve(__dirname, '..', '..');
62
+ }
63
+ function shippedScenariosDir() {
64
+ return path.join(packageRoot(), 'scenarios');
65
+ }
66
+ /** Surface used by `src/cli.ts`'s `--dev scenarios` verb. */
67
+ async function scenariosCommand(args) {
68
+ const sub = args.subcommand ?? 'list';
69
+ switch (sub) {
70
+ case 'list':
71
+ await listScenarios(Boolean(args.json));
72
+ return;
73
+ case 'show':
74
+ if (!args.name) {
75
+ out.error('Usage: agent-tempo --dev scenarios show <name>');
76
+ process.exit(1);
77
+ }
78
+ await showScenario(args.name);
79
+ return;
80
+ default:
81
+ out.error(`Unknown scenarios subcommand "${sub}". Available: list, show.`);
82
+ process.exit(1);
83
+ }
84
+ }
85
+ async function listScenarios(asJson) {
86
+ const dir = shippedScenariosDir();
87
+ if (!fs.existsSync(dir)) {
88
+ if (asJson) {
89
+ out.log(JSON.stringify({ scenarios: [], scenariosDir: dir }));
90
+ return;
91
+ }
92
+ out.warn(`No scenarios directory found at ${dir}.`);
93
+ out.warn('This agent-tempo install may have been built without dev-mode artifacts.');
94
+ return;
95
+ }
96
+ const entries = fs.readdirSync(dir)
97
+ .filter((f) => f.endsWith('.yaml') || f.endsWith('.yml'))
98
+ .sort();
99
+ const items = entries.map((file) => {
100
+ const abs = path.join(dir, file);
101
+ try {
102
+ const yamlText = fs.readFileSync(abs, 'utf8');
103
+ const scenario = (0, scenario_1.parseScenario)(yamlText);
104
+ return {
105
+ name: scenario.name,
106
+ file: path.basename(file, path.extname(file)),
107
+ description: (scenario.description ?? '').split('\n').map((l) => l.trim()).filter(Boolean).join(' '),
108
+ ruleCount: scenario.rules.length,
109
+ };
110
+ }
111
+ catch (err) {
112
+ return {
113
+ name: '(invalid)',
114
+ file: path.basename(file, path.extname(file)),
115
+ description: `parse error: ${err?.message ?? err}`,
116
+ ruleCount: 0,
117
+ };
118
+ }
119
+ });
120
+ if (asJson) {
121
+ out.log(JSON.stringify({ scenarios: items, scenariosDir: dir }, null, 2));
122
+ return;
123
+ }
124
+ if (items.length === 0) {
125
+ out.log(`No scenarios found in ${dir}.`);
126
+ return;
127
+ }
128
+ out.log(`Mock-adapter scenarios in ${dir}:\n`);
129
+ for (const item of items) {
130
+ out.log(` ${item.file} (${item.ruleCount} rule${item.ruleCount === 1 ? '' : 's'})`);
131
+ if (item.description) {
132
+ out.log(` ${item.description}`);
133
+ }
134
+ }
135
+ out.log('\nUse with: agent-tempo --dev recruit <name> --agent mock --mockMode scripted --mockScenario <name>');
136
+ }
137
+ async function showScenario(reference) {
138
+ const abs = resolveCliReference(reference);
139
+ if (!fs.existsSync(abs)) {
140
+ out.error(`Scenario file not found: ${abs}`);
141
+ process.exit(1);
142
+ }
143
+ const yamlText = fs.readFileSync(abs, 'utf8');
144
+ // Validate while displaying so users get an immediate "this YAML is fine"
145
+ // signal alongside the printed body. Show the raw YAML even on parse
146
+ // failure so operators can spot the offending line.
147
+ try {
148
+ (0, scenario_1.parseScenario)(yamlText);
149
+ }
150
+ catch (err) {
151
+ out.error(`(scenario validation failed: ${err?.message ?? err})`);
152
+ out.error('Showing raw YAML below regardless:\n');
153
+ }
154
+ out.log(`# ${abs}\n`);
155
+ out.log(yamlText.replace(/\n$/, ''));
156
+ }
157
+ function resolveCliReference(reference) {
158
+ if (path.isAbsolute(reference))
159
+ return reference;
160
+ if (!reference.includes('/') && !reference.includes(path.sep)) {
161
+ const stem = reference.endsWith('.yaml') || reference.endsWith('.yml')
162
+ ? reference
163
+ : `${reference}.yaml`;
164
+ return path.join(shippedScenariosDir(), stem);
165
+ }
166
+ return path.resolve(process.cwd(), reference);
167
+ }
@@ -0,0 +1,112 @@
1
+ import { Config } from '../config';
2
+ import type { EnsembleSummary } from '../client/interface';
3
+ export type StepName = 'legacyHomeMigration' | 'preflight' | 'mcpConfig' | 'temporalReach' | 'searchAttrs' | 'daemonBoot' | 'badgeCollection';
4
+ /** Structured per-step result. `ok` = ran successfully; `skipped` = cache hit;
5
+ * `action-taken` = needed repair (e.g. started daemon, registered MCP);
6
+ * `failed` = non-fatal failure recorded for the TUI to surface. */
7
+ export interface StepOutcome {
8
+ status: 'ok' | 'skipped' | 'action-taken' | 'failed';
9
+ durationMs: number;
10
+ detail?: string;
11
+ }
12
+ export interface OutdatedVersionBadge {
13
+ latest: string;
14
+ severity: 'major' | 'minor';
15
+ }
16
+ export interface DaemonLogErrorsBadge {
17
+ count: number;
18
+ /** Up to 3 most recent ERROR lines from the daemon log tail. */
19
+ sample: string[];
20
+ logPath: string;
21
+ }
22
+ export interface BootstrapResult {
23
+ durationMs: number;
24
+ steps: Record<StepName, StepOutcome>;
25
+ badges: {
26
+ /** Orphan count from `queryOrphanedSessions` on this host. Always fresh. */
27
+ orphanCount: number;
28
+ /** Undefined = up-to-date, patch-only, or npm-check offline / timed out. */
29
+ outdatedVersion?: OutdatedVersionBadge;
30
+ /** Undefined = clean daemon-log tail. */
31
+ daemonLogErrors?: DaemonLogErrorsBadge;
32
+ };
33
+ /** Pre-fetched for HomeView's first render; TUI re-polls every 10s. */
34
+ ensembles: EnsembleSummary[];
35
+ cwd: string;
36
+ /** `null` when not in a git dir. */
37
+ cwdGitRoot: string | null;
38
+ }
39
+ export interface BootstrapArgs {
40
+ config: Config;
41
+ cwd?: string;
42
+ /** Injectable clock for tests. */
43
+ now?: () => number;
44
+ /** Injectable cache-path override for tests. Default: `AGENT_TEMPO_HOME`. */
45
+ cacheDir?: string;
46
+ /** Injectable npm-version fetcher for tests. Default: live registry fetch. */
47
+ fetchLatestVersion?: (pkgName: string, timeoutMs: number) => Promise<string | null>;
48
+ /** Binary version (defaults to `require('../../package.json').version`). Tests pin. */
49
+ binaryVersion?: string;
50
+ /**
51
+ * Inject step-5 daemon-boot. Default spawns the real daemon via
52
+ * `startDaemon` (up to 30s wait). Tests should always override to avoid
53
+ * spawning a real daemon process from the test harness. Returning
54
+ * `'skipped'` simulates "daemon already running"; `'action-taken'`
55
+ * simulates a successful start; `'failed'` + `detail` simulates failure.
56
+ */
57
+ daemonBoot?: (config: Config) => Promise<StepOutcome>;
58
+ /**
59
+ * PR-2 of the v1.0 rebrand — one-shot copy of `~/.agent-tempo/` →
60
+ * `~/.agent-tempo/`. Runs once on first boot of the new binary; idempotent
61
+ * thereafter. Tests should override to avoid touching real $HOME.
62
+ *
63
+ * Failure here MUST NOT block the boot path — record `'failed'` with a
64
+ * detail string and let the rest of bootstrap proceed.
65
+ */
66
+ legacyHomeMigration?: () => Promise<StepOutcome>;
67
+ /**
68
+ * Inject the Temporal reachability probe (steps 3 + 6). Tests override
69
+ * to avoid real network I/O — default performs `createTemporalConnection`
70
+ * with a 3s timeout. Returning `false` simulates unreachable;
71
+ * `true` simulates reachable (step 3 caches success, step 6 still
72
+ * attempts connect but is tolerant of failure).
73
+ */
74
+ isTemporalReachable?: (config: Config) => Promise<boolean>;
75
+ }
76
+ type CacheStepKey = 'preflight' | 'mcpConfig' | 'temporalReach' | 'searchAttrs' | 'npmVersionCheck';
77
+ interface CacheStepEntry {
78
+ lastSuccess: string;
79
+ /** MCP config file mtime snapshot at last success — `mcpConfig` only. */
80
+ configMtime?: string;
81
+ /** Cached npm-registry result — `npmVersionCheck` only. */
82
+ result?: {
83
+ latest: string;
84
+ };
85
+ }
86
+ interface BootstrapCache {
87
+ schemaVersion: number;
88
+ binaryVersion: string;
89
+ steps: Partial<Record<CacheStepKey, CacheStepEntry>>;
90
+ }
91
+ /** Read the cache, validating schema + binary version. Any failure returns
92
+ * a fresh empty cache — malformed / upgrade-mismatched files are treated
93
+ * as a cache miss, the caller just does a cold bootstrap. */
94
+ export declare function readCache(cacheDir: string, binaryVersion: string): BootstrapCache;
95
+ /** Best-effort cache write; never throws (a cache failure must not break bootstrap). */
96
+ export declare function writeCache(cacheDir: string, cache: BootstrapCache): void;
97
+ /** Decide if a cached step is fresh enough to skip. `undefined` entry or
98
+ * `lastSuccess` older than `ttlMs` → stale. */
99
+ export declare function isCacheFresh(entry: CacheStepEntry | undefined, ttlMs: number, now: number): boolean;
100
+ /** Decide the outdated-version badge shape per the policy table:
101
+ * - major/minor behind → badge with severity
102
+ * - patch-only → silent
103
+ * - prerelease vs stable mismatches → silent (respect release channel)
104
+ */
105
+ export declare function classifyVersion(installed: string, latest: string): OutdatedVersionBadge | undefined;
106
+ /**
107
+ * Run the 7-step auto-provisioning sequence. Returns a `BootstrapResult`
108
+ * the caller feeds to the TUI; step 7 (TUI launch) is the caller's
109
+ * handoff — this function does NOT spawn UI processes.
110
+ */
111
+ export declare function bootstrap(args: BootstrapArgs): Promise<BootstrapResult>;
112
+ export {};