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,241 @@
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.dashboardCommand = dashboardCommand;
37
+ /**
38
+ * `agent-tempo dashboard` — open the packaged web dashboard,
39
+ * optionally minting a single-use pairing token + QR code for
40
+ * cross-device access. PR-8 of #340.
41
+ *
42
+ * **Critical constraint**: like {@link daemon-command}, this module
43
+ * must NOT import from `@temporalio/*`, `../workflows/*`, or any
44
+ * module that pulls in the Temporal SDK. The dashboard verb must
45
+ * remain operable when Temporal itself is broken (same #157
46
+ * reasoning: a stranded operator with a running daemon should still
47
+ * be able to run `agent-tempo dashboard` to see what's going on).
48
+ *
49
+ * Flow:
50
+ * 1. Resolve the daemon's port (port-file or `--port` override)
51
+ * 2. Probe `GET /v1/health` — if the daemon isn't running, exit 1
52
+ * with a hint to run `agent-tempo daemon start`
53
+ * 3. Print the dashboard URL
54
+ * 4. If `--pair`: POST `/dashboard/api/pair` (with the operator's
55
+ * bearer if any) → render a terminal QR + the URL with the
56
+ * `?pair=<token>` fragment. The user scans from their phone.
57
+ * 5. Unless `--no-open`, spawn the platform browser-opener so the
58
+ * dashboard shows up immediately.
59
+ *
60
+ * Output modes:
61
+ * - default: human-readable colored
62
+ * - `--json`: single JSON object on stdout, no banners — for
63
+ * scripts and CI
64
+ */
65
+ const http_1 = require("http");
66
+ const child_process_1 = require("child_process");
67
+ const port_file_1 = require("../http/port-file");
68
+ const out = __importStar(require("./output"));
69
+ const DEFAULT_BIND = '127.0.0.1';
70
+ /**
71
+ * Public entry point — invoked by the CLI dispatcher. Returns void;
72
+ * exits the process with code 1 on error, 0 on success.
73
+ */
74
+ async function dashboardCommand(args) {
75
+ const port = await resolvePort(args, args.json ?? false);
76
+ if (port === null)
77
+ return; // resolvePort already exited
78
+ const bind = args.bind ?? DEFAULT_BIND;
79
+ const baseUrl = `http://${bind}:${port}`;
80
+ const healthy = await probeHealth(baseUrl);
81
+ if (!healthy) {
82
+ return emitError(args.json ?? false, {
83
+ error: 'daemon-not-reachable',
84
+ hint: `No response from ${baseUrl}/v1/health. Run \`agent-tempo daemon start\` and retry.`,
85
+ });
86
+ }
87
+ const dashboardUrl = `${baseUrl}/dashboard/`;
88
+ let pairResult = null;
89
+ if (args.pair) {
90
+ const minted = await mintPairToken(baseUrl, args.bearer);
91
+ if (!minted.ok) {
92
+ return emitError(args.json ?? false, {
93
+ error: 'pair-mint-failed',
94
+ hint: minted.reason,
95
+ });
96
+ }
97
+ pairResult = {
98
+ url: `${dashboardUrl}?pair=${encodeURIComponent(minted.token)}`,
99
+ expiresAt: minted.expiresAt,
100
+ };
101
+ }
102
+ if (args.json) {
103
+ const payload = {
104
+ ok: true,
105
+ url: dashboardUrl,
106
+ ...(pairResult ? { pair: pairResult } : {}),
107
+ };
108
+ out.log(JSON.stringify(payload));
109
+ return;
110
+ }
111
+ // Human-readable output
112
+ out.heading('agent-tempo dashboard');
113
+ out.log(` ${out.cyan(dashboardUrl)}`);
114
+ if (pairResult) {
115
+ out.log('');
116
+ out.log(` ${out.bold('Cross-device pair:')}`);
117
+ out.log(` ${out.cyan(pairResult.url)}`);
118
+ out.log(` ${out.dim(`Token expires at ${new Date(pairResult.expiresAt).toLocaleTimeString()} (single-use, 5-min TTL)`)}`);
119
+ await renderQr(pairResult.url);
120
+ }
121
+ if (!args.noOpen) {
122
+ openInBrowser(dashboardUrl);
123
+ }
124
+ else {
125
+ out.log('');
126
+ out.log(` ${out.dim('--no-open: not launching browser')}`);
127
+ }
128
+ }
129
+ async function resolvePort(args, json) {
130
+ if (typeof args.port === 'number' && args.port > 0)
131
+ return args.port;
132
+ const fromFile = (0, port_file_1.readPortFile)();
133
+ if (fromFile !== null)
134
+ return fromFile;
135
+ emitError(json, {
136
+ error: 'no-port',
137
+ hint: 'No daemon port file. Pass --port <N> or run `agent-tempo daemon start` first.',
138
+ });
139
+ return null;
140
+ }
141
+ async function probeHealth(baseUrl) {
142
+ return new Promise((resolve) => {
143
+ const req = (0, http_1.request)(`${baseUrl}/v1/health`, { method: 'GET', timeout: 3000 }, (res) => {
144
+ // Drain to avoid leaving the socket open.
145
+ res.resume();
146
+ resolve(res.statusCode === 200);
147
+ });
148
+ req.on('error', () => resolve(false));
149
+ req.on('timeout', () => {
150
+ req.destroy();
151
+ resolve(false);
152
+ });
153
+ req.end();
154
+ });
155
+ }
156
+ async function mintPairToken(baseUrl, bearer) {
157
+ return new Promise((resolve) => {
158
+ const headers = { 'Content-Length': '0' };
159
+ if (bearer)
160
+ headers.Authorization = `Bearer ${bearer}`;
161
+ const req = (0, http_1.request)(`${baseUrl}/dashboard/api/pair`, { method: 'POST', headers, timeout: 3000 }, (res) => {
162
+ let body = '';
163
+ res.setEncoding('utf8');
164
+ res.on('data', (chunk) => { body += chunk; });
165
+ res.on('end', () => {
166
+ if (res.statusCode === 201) {
167
+ try {
168
+ const parsed = JSON.parse(body);
169
+ return resolve({ ok: true, token: parsed.token, expiresAt: parsed.expiresAt });
170
+ }
171
+ catch (err) {
172
+ return resolve({ ok: false, reason: `malformed pair response: ${err instanceof Error ? err.message : String(err)}` });
173
+ }
174
+ }
175
+ if (res.statusCode === 401)
176
+ return resolve({ ok: false, reason: 'unauthorized — pass --bearer <token> or run on the host without bearer auth' });
177
+ if (res.statusCode === 400)
178
+ return resolve({ ok: false, reason: 'pair flow requires bearer auth (loopback skips this)' });
179
+ resolve({ ok: false, reason: `unexpected status ${res.statusCode}: ${body}` });
180
+ });
181
+ });
182
+ req.on('error', (err) => resolve({ ok: false, reason: err.message }));
183
+ req.on('timeout', () => {
184
+ req.destroy();
185
+ resolve({ ok: false, reason: 'request timed out' });
186
+ });
187
+ req.end();
188
+ });
189
+ }
190
+ /**
191
+ * Render a QR code in the terminal. `qrcode-terminal` is loaded
192
+ * lazily so the require cost only hits operators who pass `--pair`.
193
+ * The package may not be installed in development checkouts that
194
+ * skipped optional deps; surface a graceful fallback.
195
+ */
196
+ async function renderQr(url) {
197
+ try {
198
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
199
+ const qrcode = require('qrcode-terminal');
200
+ await new Promise((resolve) => {
201
+ qrcode.generate(url, { small: true }, (rendered) => {
202
+ out.log('');
203
+ out.log(rendered);
204
+ resolve();
205
+ });
206
+ });
207
+ }
208
+ catch {
209
+ out.warn('qrcode-terminal not available — copy the URL above into your phone instead.');
210
+ }
211
+ }
212
+ /**
213
+ * Open `url` in the operator's default browser via the platform's
214
+ * standard launcher. Best-effort — failures are logged but don't
215
+ * block the command's success path (the URL is already printed).
216
+ */
217
+ function openInBrowser(url) {
218
+ const cmd = process.platform === 'darwin' ? 'open' :
219
+ process.platform === 'win32' ? 'cmd' :
220
+ 'xdg-open';
221
+ const args = process.platform === 'win32' ? ['/c', 'start', '', url] : [url];
222
+ try {
223
+ const child = (0, child_process_1.spawn)(cmd, args, { detached: true, stdio: 'ignore' });
224
+ child.unref();
225
+ }
226
+ catch (err) {
227
+ out.warn(`could not launch browser (${err instanceof Error ? err.message : String(err)}); open the URL manually`);
228
+ }
229
+ }
230
+ function emitError(json, body) {
231
+ if (json) {
232
+ const payload = { ok: false, ...body };
233
+ out.log(JSON.stringify(payload));
234
+ }
235
+ else {
236
+ out.error(body.error);
237
+ if (body.hint)
238
+ out.log(` ${out.dim(body.hint)}`);
239
+ }
240
+ process.exit(1);
241
+ }
@@ -0,0 +1,107 @@
1
+ import { type ConfigSource } from '../config';
2
+ /**
3
+ * Render `<homedir>/foo/bar` as `~/foo/bar` for human-readable banner
4
+ * output. Falls back to the absolute path when it doesn't live under the
5
+ * user's home dir (e.g. `AGENT_TEMPO_HOME_OVERRIDE=/tmp/scratch`).
6
+ *
7
+ * Exported for unit testing — banner output is checked against this
8
+ * formatter so the test fixtures don't bake in a developer's username.
9
+ */
10
+ export declare function prettyPath(absPath: string, home?: string): string;
11
+ /** Inputs to {@link formatDevBanner}. Exposed so tests can pin every value. */
12
+ export interface DevBannerInputs {
13
+ /** Resolved home dir; defaults to `AGENT_TEMPO_HOME`. */
14
+ home?: string;
15
+ /** Daemon port; defaults to {@link DEV_DAEMON_PORT}. */
16
+ port?: number;
17
+ /** Temporal namespace; defaults to {@link DEV_TEMPORAL_NAMESPACE}. */
18
+ namespace?: string;
19
+ /** Source of the namespace value; annotates the banner when provided. */
20
+ namespaceSource?: ConfigSource;
21
+ /** Task queue; defaults to {@link DEV_TASK_QUEUE}. */
22
+ taskQueue?: string;
23
+ /**
24
+ * Source of the task queue value. Only `'env'` and `'default'` are
25
+ * possible today (queue resolution is hardcoded — env var wins, dev/prod
26
+ * default fills in), but the type widens to {@link ConfigSource} so a
27
+ * future PR-B carve-out has somewhere to land without a type change.
28
+ */
29
+ taskQueueSource?: ConfigSource;
30
+ /**
31
+ * Override `homedir()` resolution for path prettification. Tests pass an
32
+ * explicit value to keep fixtures stable across machines.
33
+ */
34
+ homedirOverride?: string;
35
+ }
36
+ /**
37
+ * Format the single-line `[DEV MODE]` banner. Pure function — no I/O.
38
+ *
39
+ * [DEV MODE] using ~/.agent-tempo-dev · port 8474 · namespace agent-tempo-dev (default) · queue agent-tempo-dev (default)
40
+ *
41
+ * After a leak the banner self-narrates the drift:
42
+ *
43
+ * [DEV MODE] using ~/.agent-tempo-dev · port 8474 · namespace default (env) · queue agent-tempo-dev (default)
44
+ *
45
+ * The `[DEV MODE]` prefix is rendered with ANSI yellow + bold when stdout
46
+ * is a TTY (`out.bold`/`out.yellow` handle the `NO_COLOR` / non-TTY
47
+ * fallback). The remainder is plain text so it greps cleanly out of
48
+ * `~/.agent-tempo-dev/daemon.log`.
49
+ *
50
+ * Production callers go through {@link emitDevBannerIfActive}, which
51
+ * resolves the inputs from {@link getConfigWithSources}. Tests pin every
52
+ * input to keep fixtures deterministic.
53
+ */
54
+ export declare function formatDevBanner(inputs?: DevBannerInputs): string;
55
+ /**
56
+ * Resolve the runtime inputs the banner should display. Reads from
57
+ * {@link getConfigWithSources} so the printed values match what the daemon
58
+ * actually connects to. On any resolution error (e.g. invalid ensemble
59
+ * name throwing out of `getConfig`'s validator), falls back to the dev
60
+ * profile's hardcoded constants — the banner is best-effort diagnostics
61
+ * and must not be load-bearing for daemon startup.
62
+ *
63
+ * Exported for unit testing without monkey-patching the config module.
64
+ *
65
+ * @internal
66
+ */
67
+ export declare function resolveDevBannerInputs(): DevBannerInputs;
68
+ /**
69
+ * Convenience: emit the banner to stderr if `isDevMode()` is true,
70
+ * otherwise no-op. Stderr (not stdout) so the banner doesn't pollute
71
+ * commands whose stdout is captured by callers (e.g. `agent-tempo
72
+ * --dev recall --json …`).
73
+ *
74
+ * Resolves the displayed values from {@link getConfigWithSources} so the
75
+ * banner reflects what the daemon ACTUALLY connects to. The previous
76
+ * implementation read the dev profile's hardcoded constants directly, so
77
+ * a `TEMPORAL_NAMESPACE=default` shell export silently disagreed with the
78
+ * banner (#423).
79
+ *
80
+ * Called from:
81
+ * - `src/cli.ts` (every dev-mode CLI invocation)
82
+ * - `src/cli/daemon-command.ts` (dev daemon start)
83
+ * - `src/daemon.ts` (daemon child process startup)
84
+ */
85
+ export declare function emitDevBannerIfActive(): void;
86
+ /**
87
+ * Production banner counterpart used only by tests — verifies the negative
88
+ * case (env var unset → empty string). Production callers always go through
89
+ * `emitDevBannerIfActive()` which short-circuits when not in dev mode.
90
+ *
91
+ * Exported for `tests/cli/dev-banner.test.ts` so the test asserts both
92
+ * positive ("dev mode renders banner") AND negative ("not in dev mode
93
+ * renders nothing") branches without duplicating the env-var-toggling
94
+ * scaffolding.
95
+ */
96
+ export declare function devBannerOrEmpty(): string;
97
+ /**
98
+ * Single-line summary of the prod defaults — used by tests to confirm
99
+ * that the dev banner doesn't accidentally pick up production values.
100
+ *
101
+ * @internal
102
+ */
103
+ export declare const PROD_DEFAULTS_FOR_TESTS: {
104
+ readonly port: 8473;
105
+ readonly namespace: "default";
106
+ readonly taskQueue: "agent-tempo";
107
+ };
@@ -0,0 +1,190 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PROD_DEFAULTS_FOR_TESTS = void 0;
4
+ exports.prettyPath = prettyPath;
5
+ exports.formatDevBanner = formatDevBanner;
6
+ exports.resolveDevBannerInputs = resolveDevBannerInputs;
7
+ exports.emitDevBannerIfActive = emitDevBannerIfActive;
8
+ exports.devBannerOrEmpty = devBannerOrEmpty;
9
+ /**
10
+ * `[DEV MODE]` banner formatter (ADR 0014 §5.4 — gate 4 of production
11
+ * safety). Single conspicuous header line, printed on every CLI invocation
12
+ * in dev mode and on every dev daemon startup so logs self-identify.
13
+ *
14
+ * Crash-proof: imports only `os` and `../config`. No Temporal, no rxjs.
15
+ * Safe to call from `src/cli/daemon-command.ts` and `src/cli.ts` without
16
+ * breaking the #157 isolation guarantee.
17
+ *
18
+ * **Load-bearing invariant (#423 PR-A).** The banner output MUST reflect
19
+ * the daemon's actual resolved config — any divergence is a silent
20
+ * coordination bug. `formatDevBanner` stays pure (testable) over
21
+ * caller-injected inputs; `emitDevBannerIfActive` owns the resolution.
22
+ * Source annotations are uniform across all fields so a leak shows up as
23
+ * a single-character diff (`(default)` → `(env)`) rather than requiring
24
+ * the operator to know what "no annotation" means.
25
+ */
26
+ const os_1 = require("os");
27
+ const config_1 = require("../config");
28
+ const output_1 = require("./output");
29
+ /**
30
+ * Render `<homedir>/foo/bar` as `~/foo/bar` for human-readable banner
31
+ * output. Falls back to the absolute path when it doesn't live under the
32
+ * user's home dir (e.g. `AGENT_TEMPO_HOME_OVERRIDE=/tmp/scratch`).
33
+ *
34
+ * Exported for unit testing — banner output is checked against this
35
+ * formatter so the test fixtures don't bake in a developer's username.
36
+ */
37
+ function prettyPath(absPath, home = (0, os_1.homedir)()) {
38
+ if (!home)
39
+ return absPath;
40
+ if (absPath === home)
41
+ return '~';
42
+ // Always check both `/` and `\` separators regardless of the host OS.
43
+ // The function is sometimes called on POSIX with Windows-shaped path
44
+ // strings (e.g. unit tests that fix a fixture homedir of `C:\Users\alice`,
45
+ // or env-var values that escaped from a Windows shell). Using the
46
+ // platform's `path.sep` alone would leave half of those cases broken.
47
+ const trailers = ['/', '\\'];
48
+ for (const trailer of trailers) {
49
+ const prefix = home + trailer;
50
+ if (absPath.startsWith(prefix)) {
51
+ return '~/' + absPath.slice(prefix.length).replace(/\\/g, '/');
52
+ }
53
+ }
54
+ return absPath;
55
+ }
56
+ /**
57
+ * Annotate a banner field with its source. Always emits the `(source)`
58
+ * suffix when a source is provided so the banner is uniformly diagnostic
59
+ * — every field tells the operator where its value came from. `'none'`
60
+ * suppresses the annotation (the value couldn't be resolved at all, so
61
+ * a source label would be misleading).
62
+ *
63
+ * The architect's `docs/design/dev-mode-isolation-fix-423.md` example:
64
+ *
65
+ * `namespace agent-tempo-dev (default) · queue agent-tempo-dev (default)`
66
+ *
67
+ * After a leak this becomes `namespace default (env)` — operator instantly
68
+ * sees what changed. If we suppressed `(default)` they'd have to know
69
+ * what "no annotation" means before they could spot the drift.
70
+ */
71
+ function annotateField(name, value, source) {
72
+ if (!source || source === 'none')
73
+ return `${name} ${value}`;
74
+ return `${name} ${value} (${source})`;
75
+ }
76
+ /**
77
+ * Format the single-line `[DEV MODE]` banner. Pure function — no I/O.
78
+ *
79
+ * [DEV MODE] using ~/.agent-tempo-dev · port 8474 · namespace agent-tempo-dev (default) · queue agent-tempo-dev (default)
80
+ *
81
+ * After a leak the banner self-narrates the drift:
82
+ *
83
+ * [DEV MODE] using ~/.agent-tempo-dev · port 8474 · namespace default (env) · queue agent-tempo-dev (default)
84
+ *
85
+ * The `[DEV MODE]` prefix is rendered with ANSI yellow + bold when stdout
86
+ * is a TTY (`out.bold`/`out.yellow` handle the `NO_COLOR` / non-TTY
87
+ * fallback). The remainder is plain text so it greps cleanly out of
88
+ * `~/.agent-tempo-dev/daemon.log`.
89
+ *
90
+ * Production callers go through {@link emitDevBannerIfActive}, which
91
+ * resolves the inputs from {@link getConfigWithSources}. Tests pin every
92
+ * input to keep fixtures deterministic.
93
+ */
94
+ function formatDevBanner(inputs = {}) {
95
+ const home = inputs.home ?? config_1.AGENT_TEMPO_HOME;
96
+ const port = inputs.port ?? config_1.DEV_DAEMON_PORT;
97
+ const namespace = inputs.namespace ?? config_1.DEV_TEMPORAL_NAMESPACE;
98
+ const taskQueue = inputs.taskQueue ?? config_1.DEV_TASK_QUEUE;
99
+ const display = prettyPath(home, inputs.homedirOverride);
100
+ const namespaceField = annotateField('namespace', namespace, inputs.namespaceSource);
101
+ const queueField = annotateField('queue', taskQueue, inputs.taskQueueSource);
102
+ return (`${(0, output_1.bold)((0, output_1.yellow)('[DEV MODE]'))} using ${display} · ` +
103
+ `port ${port} · ${namespaceField} · ${queueField}`);
104
+ }
105
+ /**
106
+ * Resolve the runtime inputs the banner should display. Reads from
107
+ * {@link getConfigWithSources} so the printed values match what the daemon
108
+ * actually connects to. On any resolution error (e.g. invalid ensemble
109
+ * name throwing out of `getConfig`'s validator), falls back to the dev
110
+ * profile's hardcoded constants — the banner is best-effort diagnostics
111
+ * and must not be load-bearing for daemon startup.
112
+ *
113
+ * Exported for unit testing without monkey-patching the config module.
114
+ *
115
+ * @internal
116
+ */
117
+ function resolveDevBannerInputs() {
118
+ // `taskQueue` source isn't tracked by `getConfigWithSources` (queue
119
+ // resolution lives directly in `getConfig`'s constructor). Compute it
120
+ // here so the banner annotates it uniformly with the namespace source.
121
+ const taskQueueSource = process.env[config_1.ENV.TASK_QUEUE] ? 'env' : 'default';
122
+ try {
123
+ const { config, sources } = (0, config_1.getConfigWithSources)();
124
+ return {
125
+ namespace: config.temporalNamespace,
126
+ namespaceSource: sources.temporalNamespace,
127
+ taskQueue: config.taskQueue,
128
+ taskQueueSource,
129
+ };
130
+ }
131
+ catch (err) {
132
+ // `getConfigWithSources` validates the ensemble name and may throw
133
+ // when an operator has e.g. invalid characters in `$AGENT_TEMPO_ENSEMBLE`.
134
+ // Surface the cause to stderr — the banner stays diagnostic and the
135
+ // operator sees that the displayed values are dev defaults, not the
136
+ // actual resolution. The CLI surfaces the same validation error a
137
+ // moment later, so the duplicate isn't noisy enough to suppress.
138
+ console.error('[dev-mode] banner falling back to defaults — config resolution failed:', err instanceof Error ? err.message : String(err));
139
+ return { taskQueueSource };
140
+ }
141
+ }
142
+ /**
143
+ * Convenience: emit the banner to stderr if `isDevMode()` is true,
144
+ * otherwise no-op. Stderr (not stdout) so the banner doesn't pollute
145
+ * commands whose stdout is captured by callers (e.g. `agent-tempo
146
+ * --dev recall --json …`).
147
+ *
148
+ * Resolves the displayed values from {@link getConfigWithSources} so the
149
+ * banner reflects what the daemon ACTUALLY connects to. The previous
150
+ * implementation read the dev profile's hardcoded constants directly, so
151
+ * a `TEMPORAL_NAMESPACE=default` shell export silently disagreed with the
152
+ * banner (#423).
153
+ *
154
+ * Called from:
155
+ * - `src/cli.ts` (every dev-mode CLI invocation)
156
+ * - `src/cli/daemon-command.ts` (dev daemon start)
157
+ * - `src/daemon.ts` (daemon child process startup)
158
+ */
159
+ function emitDevBannerIfActive() {
160
+ if (!(0, config_1.isDevMode)())
161
+ return;
162
+ // stderr keeps stdout clean for `--json` / pipe consumers. Same reasoning
163
+ // as `out.error` / `out.warn`. Ship it via console.error directly so we
164
+ // don't depend on `out.log` (which writes to stdout).
165
+ console.error(formatDevBanner(resolveDevBannerInputs()));
166
+ }
167
+ /**
168
+ * Production banner counterpart used only by tests — verifies the negative
169
+ * case (env var unset → empty string). Production callers always go through
170
+ * `emitDevBannerIfActive()` which short-circuits when not in dev mode.
171
+ *
172
+ * Exported for `tests/cli/dev-banner.test.ts` so the test asserts both
173
+ * positive ("dev mode renders banner") AND negative ("not in dev mode
174
+ * renders nothing") branches without duplicating the env-var-toggling
175
+ * scaffolding.
176
+ */
177
+ function devBannerOrEmpty() {
178
+ return (0, config_1.isDevMode)() ? formatDevBanner(resolveDevBannerInputs()) : '';
179
+ }
180
+ /**
181
+ * Single-line summary of the prod defaults — used by tests to confirm
182
+ * that the dev banner doesn't accidentally pick up production values.
183
+ *
184
+ * @internal
185
+ */
186
+ exports.PROD_DEFAULTS_FOR_TESTS = {
187
+ port: config_1.PROD_DAEMON_PORT,
188
+ namespace: config_1.PROD_TEMPORAL_NAMESPACE,
189
+ taskQueue: config_1.PROD_TASK_QUEUE,
190
+ };
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Pre-import side-effect that promotes a top-level `--dev` CLI flag into
3
+ * `AGENT_TEMPO_DEV_MODE=1` BEFORE any other module loads (ADR 0014 §5.4).
4
+ *
5
+ * **Why this file exists**: `src/cli.ts` imports `./config` statically, and
6
+ * `src/config.ts` evaluates `AGENT_TEMPO_HOME = resolveTempoHome()` at
7
+ * module load time. By the time the main argv parser runs, that constant
8
+ * has already been frozen against `~/.agent-tempo/`. The bootstrap mutates
9
+ * `process.env` early — before the static `./config` import resolves — so
10
+ * the dev profile lights up everywhere downstream consistently.
11
+ *
12
+ * Imported as the very first statement of `src/cli.ts`. Has zero imports
13
+ * (not even `./config`) so it can run before any other module loads. This
14
+ * file MUST stay dependency-free; if you find yourself wanting to import
15
+ * something here, put it in `src/cli/dev-banner.ts` instead.
16
+ *
17
+ * Side effects:
18
+ * 1. If `--dev` appears anywhere in `process.argv`, set
19
+ * `process.env.AGENT_TEMPO_DEV_MODE='1'`.
20
+ * 2. Strip `--dev` from `process.argv` so the main parser doesn't reject
21
+ * it as unknown.
22
+ *
23
+ * Daemon child processes inherit `AGENT_TEMPO_DEV_MODE` automatically via
24
+ * `spawn(..., { env: { ...process.env } })` in `src/cli/daemon.ts`. Users
25
+ * can also bypass the flag entirely by setting `AGENT_TEMPO_DEV_MODE=1`
26
+ * directly in their shell — useful for MCP server processes that aren't
27
+ * launched via the CLI.
28
+ */
29
+ export {};
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ /**
3
+ * Pre-import side-effect that promotes a top-level `--dev` CLI flag into
4
+ * `AGENT_TEMPO_DEV_MODE=1` BEFORE any other module loads (ADR 0014 §5.4).
5
+ *
6
+ * **Why this file exists**: `src/cli.ts` imports `./config` statically, and
7
+ * `src/config.ts` evaluates `AGENT_TEMPO_HOME = resolveTempoHome()` at
8
+ * module load time. By the time the main argv parser runs, that constant
9
+ * has already been frozen against `~/.agent-tempo/`. The bootstrap mutates
10
+ * `process.env` early — before the static `./config` import resolves — so
11
+ * the dev profile lights up everywhere downstream consistently.
12
+ *
13
+ * Imported as the very first statement of `src/cli.ts`. Has zero imports
14
+ * (not even `./config`) so it can run before any other module loads. This
15
+ * file MUST stay dependency-free; if you find yourself wanting to import
16
+ * something here, put it in `src/cli/dev-banner.ts` instead.
17
+ *
18
+ * Side effects:
19
+ * 1. If `--dev` appears anywhere in `process.argv`, set
20
+ * `process.env.AGENT_TEMPO_DEV_MODE='1'`.
21
+ * 2. Strip `--dev` from `process.argv` so the main parser doesn't reject
22
+ * it as unknown.
23
+ *
24
+ * Daemon child processes inherit `AGENT_TEMPO_DEV_MODE` automatically via
25
+ * `spawn(..., { env: { ...process.env } })` in `src/cli/daemon.ts`. Users
26
+ * can also bypass the flag entirely by setting `AGENT_TEMPO_DEV_MODE=1`
27
+ * directly in their shell — useful for MCP server processes that aren't
28
+ * launched via the CLI.
29
+ */
30
+ Object.defineProperty(exports, "__esModule", { value: true });
31
+ const DEV_FLAG = '--dev';
32
+ const idx = process.argv.indexOf(DEV_FLAG);
33
+ if (idx !== -1) {
34
+ process.env.AGENT_TEMPO_DEV_MODE = '1';
35
+ process.argv.splice(idx, 1);
36
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Dev-mode scriptable CLI verbs (#432).
3
+ *
4
+ * Five thin shell-scriptable wrappers over the MCP tool surface, available
5
+ * only when `--dev` / `AGENT_TEMPO_DEV_MODE=1` is active. Production CLI
6
+ * was collapsed to TUI/MCP-only in #288; this module restores
7
+ * shell-scriptable access for autonomous E2E validation harnesses without
8
+ * re-introducing the public surface that #288 retired.
9
+ *
10
+ * ## Allowlist discipline
11
+ *
12
+ * `DEV_VERBS` is an explicit `ReadonlySet<string>`, NOT derived from
13
+ * `REMOVED_VERBS` keys. Promoting a removed verb to a dev-mode verb must
14
+ * be a deliberate, code-reviewed action. The mechanical-enforcement test
15
+ * in `test/cli-dev-verbs.test.ts` asserts the DEV_VERBS ↔ REMOVED_VERBS
16
+ * ↔ `cli.ts` switch invariants.
17
+ *
18
+ * ## NOT crash-proof
19
+ *
20
+ * This module touches Temporal directly. It is deliberately excluded from
21
+ * `test/cli-crash-proof-isolation.test.ts`'s `CRASH_PROOF_MODULES` allowlist
22
+ * — dev mode requires Temporal anyway.
23
+ */
24
+ import { CliOverrides } from '../config';
25
+ /** Allowlist of verbs accepted in dev mode. Single source of truth. */
26
+ export declare const DEV_VERBS: ReadonlySet<string>;
27
+ /**
28
+ * Subset of {@link import('../cli').ParsedArgs} consumed by the dispatcher.
29
+ * Kept narrow so this module doesn't import `../cli` (would be cyclic).
30
+ */
31
+ export interface DevVerbArgs extends CliOverrides {
32
+ /** All non-flag tokens, including `args.positional[0] === args.command`. */
33
+ positional: string[];
34
+ /** Resolved ensemble (positional override / env fallback). */
35
+ ensemble: string;
36
+ }
37
+ /**
38
+ * Dispatch a dev-mode verb. Caller (`cli.ts`) gates on `isDevMode()` +
39
+ * `DEV_VERBS.has(verb)` before calling. Throws `Error` for unknown verbs
40
+ * — the mechanical test in `cli-dev-verbs.test.ts` asserts that this
41
+ * is unreachable in practice.
42
+ */
43
+ export declare function dispatchDevVerb(verb: string, args: DevVerbArgs): Promise<void>;