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,50 @@
1
+ /**
2
+ * PromptArea — pinned bottom input area with tab completion and command history.
3
+ *
4
+ * UNCONTROLLED: Input value lives in local useState, NOT in parent state.
5
+ * This prevents parent re-renders on every keystroke, keeping Yoga node
6
+ * recalculation to this subtree only (~4 nodes).
7
+ *
8
+ * Parent communicates via:
9
+ * - inputRef.current.setValue(v) — to set input programmatically (palette select)
10
+ * - inputRef.current.getValue() — to read current value
11
+ * - onInputChange(v) — called on every keystroke (for palette filtering via ref, no dispatch)
12
+ * - onSubmit(v) — called on Enter
13
+ */
14
+ import React from 'react';
15
+ /** Commands that take a player name as their first argument. */
16
+ export interface PromptAreaHandle {
17
+ setValue: (v: string) => void;
18
+ getValue: () => string;
19
+ }
20
+ export interface PromptAreaProps {
21
+ /** Hint text displayed above the input. */
22
+ hints: string;
23
+ /** Called when user presses Enter. */
24
+ onSubmit: (value: string) => void;
25
+ /** Disable input (e.g., during splash or recruit wizard). */
26
+ disabled?: boolean;
27
+ /** Available command names (without '/') for tab completion. */
28
+ commandNames?: string[];
29
+ /** Available player names for argument completion. */
30
+ playerNames?: string[];
31
+ /** Initial command history (loaded from disk). */
32
+ initialHistory?: string[];
33
+ /** Called when history is updated (for persistence). */
34
+ onHistoryUpdate?: (entries: string[]) => void;
35
+ /** Called on every input change (lightweight — caller should use ref, not dispatch). */
36
+ onInputChange?: (value: string) => void;
37
+ /** Whether the command palette is visible. */
38
+ paletteVisible?: boolean;
39
+ /** Called when palette should show/hide. */
40
+ onPaletteToggle?: (visible: boolean) => void;
41
+ /** Called to navigate palette up. */
42
+ onPaletteUp?: () => void;
43
+ /** Called to navigate palette down. */
44
+ onPaletteDown?: () => void;
45
+ /** Called when palette item is selected. */
46
+ onPaletteSelect?: () => void;
47
+ /** Ref for parent to read/set input value. */
48
+ inputRef?: React.Ref<PromptAreaHandle>;
49
+ }
50
+ export declare const PromptArea: React.NamedExoticComponent<PromptAreaProps>;
@@ -0,0 +1,303 @@
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.PromptArea = void 0;
37
+ /**
38
+ * PromptArea — pinned bottom input area with tab completion and command history.
39
+ *
40
+ * UNCONTROLLED: Input value lives in local useState, NOT in parent state.
41
+ * This prevents parent re-renders on every keystroke, keeping Yoga node
42
+ * recalculation to this subtree only (~4 nodes).
43
+ *
44
+ * Parent communicates via:
45
+ * - inputRef.current.setValue(v) — to set input programmatically (palette select)
46
+ * - inputRef.current.getValue() — to read current value
47
+ * - onInputChange(v) — called on every keystroke (for palette filtering via ref, no dispatch)
48
+ * - onSubmit(v) — called on Enter
49
+ */
50
+ const react_1 = __importStar(require("react"));
51
+ const ink_context_1 = require("../ink-context");
52
+ const theme_1 = require("../utils/theme");
53
+ const commands_1 = require("../commands");
54
+ const MAX_HISTORY = 50;
55
+ exports.PromptArea = react_1.default.memo(function PromptArea({ hints, onSubmit, disabled, commandNames = [], playerNames = [], initialHistory = [], onHistoryUpdate, onInputChange, paletteVisible, onPaletteToggle, onPaletteUp, onPaletteDown, onPaletteSelect, inputRef, }) {
56
+ const { Box, Text, useInput } = (0, ink_context_1.useInk)();
57
+ // ── LOCAL input state (uncontrolled — no parent dispatch per keystroke) ──
58
+ const [value, setValueState] = (0, react_1.useState)('');
59
+ const valueRef = (0, react_1.useRef)('');
60
+ const setValue = (0, react_1.useCallback)((v) => {
61
+ valueRef.current = v;
62
+ ref.current.value = v; // Keep ref in sync between renders (prevents stale reads on rapid input)
63
+ setValueState(v);
64
+ }, []);
65
+ // ── Expose handle for parent ──
66
+ (0, react_1.useImperativeHandle)(inputRef, () => ({
67
+ setValue: (v) => setValue(v),
68
+ getValue: () => valueRef.current,
69
+ }), [setValue]);
70
+ // ── Internal state ──
71
+ const [history, setHistory] = (0, react_1.useState)(() => [...initialHistory]);
72
+ const [historyIndex, setHistoryIndex] = (0, react_1.useState)(-1);
73
+ const savedInput = (0, react_1.useRef)('');
74
+ const [completionHint, setCompletionHint] = (0, react_1.useState)('');
75
+ const [tabMatches, setTabMatches] = (0, react_1.useState)([]);
76
+ const [tabCycleIndex, setTabCycleIndex] = (0, react_1.useState)(0);
77
+ // ── Ref for all values the useInput callback reads (stable callback pattern) ──
78
+ const ref = (0, react_1.useRef)({
79
+ value: '', onSubmit, disabled, commandNames, playerNames,
80
+ history, historyIndex, tabMatches, tabCycleIndex,
81
+ paletteVisible, onPaletteToggle, onPaletteUp, onPaletteDown, onPaletteSelect,
82
+ onHistoryUpdate, onInputChange,
83
+ });
84
+ ref.current = {
85
+ value: valueRef.current, onSubmit, disabled, commandNames, playerNames,
86
+ history, historyIndex, tabMatches, tabCycleIndex,
87
+ paletteVisible, onPaletteToggle, onPaletteUp, onPaletteDown, onPaletteSelect,
88
+ onHistoryUpdate, onInputChange,
89
+ };
90
+ // ── Helpers (read from ref) ──
91
+ const doChange = (0, react_1.useCallback)((newValue) => {
92
+ const r = ref.current;
93
+ setValue(newValue);
94
+ r.onInputChange?.(newValue);
95
+ // Avoid new refs when already in default state — prevents unnecessary re-renders
96
+ setCompletionHint(prev => prev === '' ? prev : '');
97
+ setTabMatches(prev => prev.length === 0 ? prev : []);
98
+ setTabCycleIndex(prev => prev === 0 ? prev : 0);
99
+ // Only toggle palette when visibility actually changes — avoids parent dispatch on every keystroke
100
+ if (r.onPaletteToggle) {
101
+ // The palette shows for: "/cmd", "@name", and "/PLAYER_PARAM_CMD <partial>".
102
+ // classifyPaletteInput centralizes the rule so PromptArea + App stay in sync.
103
+ const shouldShow = (0, commands_1.classifyPaletteInput)(newValue) !== null;
104
+ if (shouldShow !== !!r.paletteVisible) {
105
+ r.onPaletteToggle(shouldShow);
106
+ }
107
+ }
108
+ }, [setValue]);
109
+ // PLAYER_PARAM_COMMANDS and SUBCOMMAND_MAP imported from commands.ts
110
+ const getCompletions = (0, react_1.useCallback)((input) => {
111
+ const r = ref.current;
112
+ const trimmed = input.trimStart();
113
+ // Command name completion: /par → /players
114
+ if (trimmed.startsWith('/') && !trimmed.includes(' ')) {
115
+ const partial = trimmed.slice(1).toLowerCase();
116
+ if (!partial)
117
+ return r.commandNames.map(c => `/${c} `);
118
+ return r.commandNames
119
+ .filter(c => c.startsWith(partial) && c !== partial)
120
+ .map(c => `/${c} `);
121
+ }
122
+ // Parameter completion: /stop te → /stop tempo-eng
123
+ if (trimmed.startsWith('/') && trimmed.includes(' ')) {
124
+ const spaceIdx = trimmed.indexOf(' ');
125
+ const cmd = trimmed.slice(1, spaceIdx).toLowerCase();
126
+ const afterCmd = trimmed.slice(spaceIdx + 1);
127
+ const parts = afterCmd.split(' ');
128
+ const partial = parts[parts.length - 1].toLowerCase();
129
+ const prefix = trimmed.slice(0, trimmed.length - parts[parts.length - 1].length);
130
+ // First param: player name for player commands (prefix + segment match)
131
+ if (parts.length === 1 && commands_1.PLAYER_PARAM_COMMANDS.has(cmd)) {
132
+ const names = r.playerNames || [];
133
+ const matches = names.filter(n => {
134
+ const lower = n.toLowerCase();
135
+ if (lower === partial)
136
+ return false;
137
+ return lower.startsWith(partial) || lower.split('-').some(seg => seg.startsWith(partial));
138
+ });
139
+ if (matches.length > 0)
140
+ return matches.map(n => `${prefix}${n} `);
141
+ }
142
+ // First param: subcommand for structured commands
143
+ if (parts.length === 1 && commands_1.SUBCOMMAND_MAP[cmd]) {
144
+ const subs = commands_1.SUBCOMMAND_MAP[cmd];
145
+ const matches = subs.filter(s => s.startsWith(partial) && s !== partial);
146
+ if (matches.length > 0)
147
+ return matches.map(s => `${prefix}${s} `);
148
+ }
149
+ // Second param after subcommand: player name for worktree create/remove
150
+ if (parts.length === 2 && cmd === 'worktree' && (parts[0] === 'create' || parts[0] === 'remove')) {
151
+ const names = r.playerNames || [];
152
+ const matches = names.filter(n => n.toLowerCase().startsWith(partial) && n.toLowerCase() !== partial);
153
+ if (matches.length > 0)
154
+ return matches.map(n => `${prefix}${n} `);
155
+ }
156
+ return [];
157
+ }
158
+ // @player completion: @tem → @tempo-eng
159
+ if (trimmed.startsWith('@') && !trimmed.includes(' ')) {
160
+ const partial = trimmed.slice(1).toLowerCase();
161
+ if (!partial)
162
+ return r.playerNames.map(n => `@${n} `);
163
+ return r.playerNames
164
+ .filter(n => {
165
+ const lower = n.toLowerCase();
166
+ if (lower === partial)
167
+ return false;
168
+ return lower.startsWith(partial) || lower.split('-').some(seg => seg.startsWith(partial));
169
+ })
170
+ .map(n => `@${n} `);
171
+ }
172
+ return [];
173
+ }, []);
174
+ // ── Stable useInput callback (never recreated) ──
175
+ useInput((0, react_1.useCallback)((input, key) => {
176
+ const r = ref.current;
177
+ if (r.disabled)
178
+ return;
179
+ // ── Command palette mode ──
180
+ if (r.paletteVisible) {
181
+ if (key.upArrow) {
182
+ r.onPaletteUp?.();
183
+ return;
184
+ }
185
+ if (key.downArrow) {
186
+ r.onPaletteDown?.();
187
+ return;
188
+ }
189
+ if (key.tab) {
190
+ r.onPaletteSelect?.();
191
+ return;
192
+ }
193
+ if (key.return) {
194
+ // Enter always submits. Use Tab to accept a palette suggestion. This
195
+ // avoids accept-vs-submit ambiguity when the typed command already
196
+ // matches exactly but the palette has no remaining suggestions
197
+ // (e.g. "/destroy conductor"). Close the palette and fall through to
198
+ // the regular Enter/submit block below.
199
+ r.onPaletteToggle?.(false);
200
+ }
201
+ if (key.escape) {
202
+ r.onPaletteToggle?.(false);
203
+ return;
204
+ }
205
+ }
206
+ // Tab: complete
207
+ if (key.tab) {
208
+ const matches = r.tabMatches.length > 0 ? r.tabMatches : getCompletions(r.value);
209
+ if (matches.length === 0)
210
+ return;
211
+ if (matches.length === 1) {
212
+ setValue(matches[0]);
213
+ r.onInputChange?.(matches[0]);
214
+ setCompletionHint('');
215
+ setTabMatches([]);
216
+ setTabCycleIndex(0);
217
+ }
218
+ else {
219
+ const newMatches = r.tabMatches.length > 0 ? r.tabMatches : matches;
220
+ const idx = r.tabMatches.length > 0 ? (r.tabCycleIndex + 1) % newMatches.length : 0;
221
+ setValue(newMatches[idx]);
222
+ r.onInputChange?.(newMatches[idx]);
223
+ setTabMatches(newMatches);
224
+ setTabCycleIndex(idx);
225
+ const options = newMatches.map(m => m.trim().split(/\s+/).pop() || '');
226
+ setCompletionHint(options.join(' '));
227
+ }
228
+ return;
229
+ }
230
+ // Up arrow: previous history
231
+ if (key.upArrow && !r.paletteVisible) {
232
+ if (r.history.length === 0)
233
+ return;
234
+ if (r.historyIndex === -1)
235
+ savedInput.current = r.value;
236
+ const newIdx = Math.min(r.historyIndex + 1, r.history.length - 1);
237
+ setHistoryIndex(newIdx);
238
+ const histValue = r.history[r.history.length - 1 - newIdx];
239
+ setValue(histValue);
240
+ r.onInputChange?.(histValue);
241
+ setCompletionHint('');
242
+ setTabMatches([]);
243
+ return;
244
+ }
245
+ // Down arrow: next history
246
+ if (key.downArrow && !r.paletteVisible) {
247
+ if (r.historyIndex <= 0) {
248
+ setHistoryIndex(-1);
249
+ setValue(savedInput.current);
250
+ r.onInputChange?.(savedInput.current);
251
+ return;
252
+ }
253
+ const newIdx = r.historyIndex - 1;
254
+ setHistoryIndex(newIdx);
255
+ const histValue = r.history[r.history.length - 1 - newIdx];
256
+ setValue(histValue);
257
+ r.onInputChange?.(histValue);
258
+ setCompletionHint('');
259
+ setTabMatches([]);
260
+ return;
261
+ }
262
+ // Enter: submit
263
+ if (key.return) {
264
+ const trimmed = r.value.trim();
265
+ if (trimmed) {
266
+ if (r.history.length === 0 || r.history[r.history.length - 1] !== trimmed) {
267
+ const updated = [...r.history, trimmed].slice(-MAX_HISTORY);
268
+ setHistory(updated);
269
+ if (r.onHistoryUpdate)
270
+ r.onHistoryUpdate(updated);
271
+ }
272
+ setHistoryIndex(-1);
273
+ savedInput.current = '';
274
+ r.onSubmit(trimmed);
275
+ }
276
+ setValue('');
277
+ r.onInputChange?.('');
278
+ setCompletionHint('');
279
+ setTabMatches([]);
280
+ return;
281
+ }
282
+ // Backspace
283
+ if (key.backspace || key.delete) {
284
+ if (r.value.length > 0)
285
+ doChange(r.value.slice(0, -1));
286
+ return;
287
+ }
288
+ // Regular character input
289
+ if (input && !key.ctrl && !key.meta) {
290
+ doChange(r.value + input);
291
+ }
292
+ }, [doChange, getCompletions, setValue])); // Stable — reads ref.current
293
+ // ── Render (minimal nodes: 1 Box + 2-3 Text, nested Text = 0 Yoga nodes) ──
294
+ return react_1.default.createElement(Box, { flexDirection: 'column', paddingX: 1 }, completionHint
295
+ ? react_1.default.createElement(Text, { color: theme_1.THEME.muted }, ` ${completionHint}`)
296
+ : null,
297
+ // Prompt line with inline placeholder hint (like Claude Code)
298
+ react_1.default.createElement(Text, null, react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.accent }, '\u2669 '), disabled
299
+ ? react_1.default.createElement(Text, { color: theme_1.THEME.muted }, '...')
300
+ : value
301
+ ? react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(Text, { color: theme_1.THEME.text }, value), react_1.default.createElement(Text, { color: theme_1.THEME.accent }, '\u2588'))
302
+ : react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, '\u2588'), react_1.default.createElement(Text, { color: theme_1.THEME.dim }, hints))));
303
+ });
@@ -0,0 +1,17 @@
1
+ /**
2
+ * RecruitWizard — step-by-step wizard for spawning a new player session.
3
+ *
4
+ * Minimal-Box pattern: single <Text> root for all static content (0 Yoga nodes),
5
+ * with ONE <Box> wrapper for Ink's TextInput when a text-input step is active.
6
+ */
7
+ import React from 'react';
8
+ import type { RecruitState, RecruitAnswers } from '../store';
9
+ export interface RecruitWizardProps {
10
+ state: RecruitState;
11
+ onAnswer: (answer: Partial<RecruitAnswers>) => void;
12
+ onBack: () => void;
13
+ onConfirm: () => void;
14
+ onCancel: () => void;
15
+ onDone: () => void;
16
+ }
17
+ export declare function RecruitWizard({ state, onAnswer, onBack, onConfirm, onCancel, onDone }: RecruitWizardProps): React.FunctionComponentElement<React.FragmentProps> | React.CElement<{}, React.Component<{}, any, any>>;
@@ -0,0 +1,221 @@
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.RecruitWizard = RecruitWizard;
37
+ /**
38
+ * RecruitWizard — step-by-step wizard for spawning a new player session.
39
+ *
40
+ * Minimal-Box pattern: single <Text> root for all static content (0 Yoga nodes),
41
+ * with ONE <Box> wrapper for Ink's TextInput when a text-input step is active.
42
+ */
43
+ const react_1 = __importStar(require("react"));
44
+ const ink_context_1 = require("../ink-context");
45
+ const theme_1 = require("../utils/theme");
46
+ /** Step labels for display. */
47
+ const STEP_LABELS = {
48
+ name: 'Player name',
49
+ agent: 'Agent',
50
+ type: 'Player type',
51
+ workDir: 'Working directory',
52
+ message: 'Initial message (optional)',
53
+ host: 'Host',
54
+ confirm: 'Confirm',
55
+ done: 'Done',
56
+ };
57
+ const TEXT_INPUT_STEPS = new Set(['name', 'type', 'workDir', 'message', 'host']);
58
+ function RecruitWizard({ state, onAnswer, onBack, onConfirm, onCancel, onDone }) {
59
+ const { Box, Text, TextInput, useInput } = (0, ink_context_1.useInk)();
60
+ const [inputValue, setInputValue] = (0, react_1.useState)('');
61
+ const [agentIndex, setAgentIndex] = (0, react_1.useState)(state.answers.agent === 'copilot' ? 1 : 0);
62
+ const agents = ['claude', 'copilot'];
63
+ // Global keybindings for wizard
64
+ useInput((0, react_1.useCallback)((input, key) => {
65
+ if (key.escape) {
66
+ onCancel();
67
+ return;
68
+ }
69
+ if (key.backspace && state.step !== 'name' && state.step !== 'done' && !inputValue) {
70
+ onBack();
71
+ return;
72
+ }
73
+ if (state.step === 'agent') {
74
+ if (key.leftArrow || key.rightArrow) {
75
+ setAgentIndex(i => i === 0 ? 1 : 0);
76
+ }
77
+ if (key.return) {
78
+ onAnswer({ agent: agents[agentIndex] });
79
+ setInputValue('');
80
+ }
81
+ }
82
+ if (state.step === 'confirm') {
83
+ if (key.return)
84
+ onConfirm();
85
+ }
86
+ if (state.step === 'done') {
87
+ if (key.return)
88
+ onDone();
89
+ }
90
+ }, [state.step, agentIndex, inputValue, onAnswer, onBack, onCancel, onConfirm, onDone]));
91
+ // Text input submit for text steps
92
+ const handleTextSubmit = (0, react_1.useCallback)((value) => {
93
+ const trimmed = value.trim();
94
+ switch (state.step) {
95
+ case 'name':
96
+ if (!trimmed)
97
+ return;
98
+ onAnswer({ name: trimmed });
99
+ break;
100
+ case 'type':
101
+ onAnswer({ playerType: trimmed });
102
+ break;
103
+ case 'workDir':
104
+ onAnswer({ workDir: trimmed || state.answers.workDir });
105
+ break;
106
+ case 'message':
107
+ onAnswer({ initialMessage: trimmed });
108
+ break;
109
+ case 'host':
110
+ onAnswer({ host: trimmed || 'localhost' });
111
+ break;
112
+ }
113
+ setInputValue('');
114
+ }, [state.step, state.answers.workDir, onAnswer]);
115
+ // ── Build all content as nested Text children ──
116
+ const children = [];
117
+ // Header
118
+ children.push(react_1.default.createElement(react_1.default.Fragment, { key: 'hdr' }, react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.accent }, ' Recruit New Player'), react_1.default.createElement(Text, { color: theme_1.THEME.dim }, ' (Esc to cancel, Backspace to go back)')));
119
+ // Completed steps
120
+ const steps = ['name', 'agent', 'type', 'workDir', 'message', 'host'];
121
+ for (const s of steps) {
122
+ if (s === state.step)
123
+ break;
124
+ const value = getAnswerDisplay(s, state.answers);
125
+ children.push('\n');
126
+ children.push(react_1.default.createElement(react_1.default.Fragment, { key: `done-${s}` }, react_1.default.createElement(Text, { color: theme_1.THEME.success }, ' \u2714 '), react_1.default.createElement(Text, { color: theme_1.THEME.dim }, `${STEP_LABELS[s]}: `), react_1.default.createElement(Text, { color: theme_1.THEME.text }, value)));
127
+ }
128
+ // Current step content
129
+ if (state.step === 'agent') {
130
+ children.push('\n\n');
131
+ children.push(react_1.default.createElement(react_1.default.Fragment, { key: 'agent-q' }, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, ' ? '), react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.text }, `${STEP_LABELS.agent}:`)));
132
+ children.push('\n');
133
+ for (let i = 0; i < agents.length; i++) {
134
+ const selected = i === agentIndex;
135
+ const icon = selected ? '\u25CF' : '\u25CB';
136
+ children.push(react_1.default.createElement(Text, { key: `ag-${agents[i]}`, color: selected ? theme_1.THEME.accent : theme_1.THEME.dim, bold: selected }, ` ${icon} ${agents[i]} `));
137
+ }
138
+ children.push('\n');
139
+ children.push(react_1.default.createElement(Text, { key: 'ag-hint', color: theme_1.THEME.dim }, ' \u2190\u2192 to select, Enter to confirm'));
140
+ }
141
+ else if (state.step === 'confirm') {
142
+ const a = state.answers;
143
+ children.push('\n\n');
144
+ children.push(react_1.default.createElement(Text, { key: 'sum-h', bold: true, color: theme_1.THEME.accent }, ' Recruit Summary:'));
145
+ children.push('\n');
146
+ children.push(react_1.default.createElement(Text, { key: 'sum-n', color: theme_1.THEME.text }, ` Name: ${a.name}`));
147
+ children.push('\n');
148
+ children.push(react_1.default.createElement(Text, { key: 'sum-a', color: theme_1.THEME.text }, ` Agent: ${a.agent}`));
149
+ children.push('\n');
150
+ children.push(react_1.default.createElement(Text, { key: 'sum-t', color: theme_1.THEME.text }, ` Type: ${a.playerType || '(default)'}`));
151
+ children.push('\n');
152
+ children.push(react_1.default.createElement(Text, { key: 'sum-d', color: theme_1.THEME.text }, ` Directory: ${a.workDir}`));
153
+ children.push('\n');
154
+ children.push(react_1.default.createElement(Text, { key: 'sum-m', color: theme_1.THEME.text }, ` Message: ${a.initialMessage || '(none)'}`));
155
+ children.push('\n');
156
+ children.push(react_1.default.createElement(Text, { key: 'sum-h2', color: theme_1.THEME.text }, ` Host: ${a.host}`));
157
+ children.push('\n\n');
158
+ children.push(react_1.default.createElement(Text, { key: 'sum-hint', color: theme_1.THEME.dim }, ' Press Enter to recruit, Esc to cancel'));
159
+ }
160
+ else if (state.step === 'done') {
161
+ children.push('\n\n');
162
+ if (state.error) {
163
+ children.push(react_1.default.createElement(Text, { key: 'err', color: theme_1.THEME.error, bold: true }, ` \u2717 Recruit failed: ${state.error}`));
164
+ children.push('\n');
165
+ children.push(react_1.default.createElement(Text, { key: 'err-h', color: theme_1.THEME.dim }, ' Press Enter to return'));
166
+ }
167
+ else {
168
+ children.push(react_1.default.createElement(Text, { key: 'ok1', color: theme_1.THEME.success }, ' \u2714 Workflow created'));
169
+ children.push('\n');
170
+ children.push(react_1.default.createElement(Text, { key: 'ok2', color: theme_1.THEME.success }, ' \u2714 Initial message queued'));
171
+ children.push('\n');
172
+ children.push(react_1.default.createElement(Text, { key: 'ok3', color: theme_1.THEME.success }, ' \u2714 Process spawned'));
173
+ children.push('\n\n');
174
+ children.push(react_1.default.createElement(Text, { key: 'ok-h', color: theme_1.THEME.dim }, ' Press Enter to return'));
175
+ }
176
+ }
177
+ else if (state.submitting) {
178
+ children.push('\n\n');
179
+ children.push(react_1.default.createElement(Text, { key: 'sub', color: theme_1.THEME.warning }, ` Recruiting ${state.answers.name}...`));
180
+ }
181
+ else if (TEXT_INPUT_STEPS.has(state.step)) {
182
+ // Text input step — prompt line as Text, input in minimal Box
183
+ const defaultHint = getDefaultHint(state.step, state.answers);
184
+ children.push('\n\n');
185
+ children.push(react_1.default.createElement(react_1.default.Fragment, { key: 'inp-q' }, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, ' ? '), react_1.default.createElement(Text, { bold: true, color: theme_1.THEME.text }, `${STEP_LABELS[state.step]}:`), defaultHint
186
+ ? react_1.default.createElement(Text, { color: theme_1.THEME.dim }, ` (${defaultHint})`)
187
+ : null));
188
+ // TextInput needs a Box — this is the only Box in the component
189
+ // It renders AFTER the Text block below
190
+ }
191
+ // For text-input steps: render Text block + Box(TextInput) in a Fragment
192
+ // For all other steps: single Text element (0 Yoga Box nodes)
193
+ if (TEXT_INPUT_STEPS.has(state.step) && !state.submitting) {
194
+ return react_1.default.createElement(react_1.default.Fragment, null, react_1.default.createElement(Text, null, ...children), react_1.default.createElement(Box, { marginLeft: 3 }, react_1.default.createElement(Text, { color: theme_1.THEME.accent }, '> '), react_1.default.createElement(TextInput, {
195
+ value: inputValue,
196
+ onChange: setInputValue,
197
+ onSubmit: handleTextSubmit,
198
+ })));
199
+ }
200
+ return react_1.default.createElement(Text, null, ...children);
201
+ }
202
+ function getAnswerDisplay(step, answers) {
203
+ switch (step) {
204
+ case 'name': return answers.name;
205
+ case 'agent': return answers.agent;
206
+ case 'type': return answers.playerType || '(default)';
207
+ case 'workDir': return answers.workDir;
208
+ case 'message': return answers.initialMessage || '(none)';
209
+ case 'host': return answers.host;
210
+ default: return '';
211
+ }
212
+ }
213
+ function getDefaultHint(step, answers) {
214
+ switch (step) {
215
+ case 'workDir': return answers.workDir;
216
+ case 'host': return 'localhost';
217
+ case 'message': return 'press Enter to skip';
218
+ case 'type': return 'press Enter for default';
219
+ default: return null;
220
+ }
221
+ }
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Single-keypress y/N confirmation before restoring an offline ensemble.
3
+ * Restore is recoverable (operator can `shutdown` again), so no typed
4
+ * confirmation — that's reserved for `destroy`.
5
+ */
6
+ import React from 'react';
7
+ export interface RestoreConfirmModalProps {
8
+ ensemble: string;
9
+ /** Number of offline players in the ensemble (conductor excluded from the count). */
10
+ playerCount: number;
11
+ /** Conductor name if known — falls back to the default "conductor" label. */
12
+ conductorName?: string;
13
+ onConfirm: () => void;
14
+ onCancel: () => void;
15
+ submitting?: boolean;
16
+ error?: string | null;
17
+ }
18
+ export declare function RestoreConfirmModal(props: RestoreConfirmModalProps): React.ReactElement;