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,16 @@
1
+ /**
2
+ * Activity log — shows recent Maestro events (player joins, leaves, status changes).
3
+ */
4
+ import React from 'react';
5
+ import type { MaestroEvent } from '../../types';
6
+ export interface ActivityLogProps {
7
+ events: MaestroEvent[];
8
+ maxVisible?: number;
9
+ }
10
+ export declare function ActivityLog({ events, maxVisible }: ActivityLogProps): React.FunctionComponentElement<{
11
+ flexDirection: string;
12
+ }> | React.CElement<{
13
+ flexDirection: string;
14
+ }, React.Component<{
15
+ flexDirection: string;
16
+ }, any, any>>;
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ActivityLog = ActivityLog;
7
+ /**
8
+ * Activity log — shows recent Maestro events (player joins, leaves, status changes).
9
+ */
10
+ const react_1 = __importDefault(require("react"));
11
+ const ink_context_1 = require("../ink-context");
12
+ const format_1 = require("../utils/format");
13
+ const platform_1 = require("../utils/platform");
14
+ function ActivityLog({ events, maxVisible = 15 }) {
15
+ const { Box, Text } = (0, ink_context_1.useInk)();
16
+ const icons = (0, platform_1.statusIcons)();
17
+ const visible = events.slice(-maxVisible);
18
+ if (visible.length === 0) {
19
+ return react_1.default.createElement(Box, { flexDirection: 'column' }, react_1.default.createElement(Text, { dimColor: true }, 'No events yet'));
20
+ }
21
+ return react_1.default.createElement(Box, { flexDirection: 'column' }, ...visible.map((e, i) => {
22
+ const time = (0, format_1.formatTime)(e.timestamp);
23
+ const typeLabel = (0, format_1.formatEventType)(e.type);
24
+ const icon = e.type === 'player_joined' ? icons.check
25
+ : e.type === 'player_left' ? icons.cross
26
+ : icons.arrow;
27
+ const color = e.type === 'player_joined' ? 'green'
28
+ : e.type === 'player_left' ? 'red'
29
+ : e.type === 'status_changed' ? 'yellow'
30
+ : 'white';
31
+ const detail = e.newValue
32
+ ? ` ${icons.arrow} ${e.newValue}`
33
+ : '';
34
+ return react_1.default.createElement(Box, { key: `${e.timestamp}-${i}` }, react_1.default.createElement(Text, { dimColor: true }, `[${time}] `), react_1.default.createElement(Text, { color }, `${icon} `), react_1.default.createElement(Text, { bold: true }, e.playerId), react_1.default.createElement(Text, { dimColor: true }, ` ${typeLabel}`), react_1.default.createElement(Text, null, detail));
35
+ }));
36
+ }
@@ -0,0 +1,35 @@
1
+ /**
2
+ * ChatView — header for a conversation with a specific player.
3
+ * Messages are rendered via <Static> in App.tsx, not here.
4
+ * This component only shows context (player name, part, branch, counts).
5
+ *
6
+ * PR-F cross-host indicator (design §16, brief §8 answer 3 — Option 3):
7
+ * - Local session (targetHost === localHost) → omit host entirely (no noise).
8
+ * - Remote session → prepend `{host} · ` to the existing status line in
9
+ * `THEME.accent` (amber).
10
+ * Zero new Yoga nodes: the host prefix goes into the same `<Text>` children
11
+ * tree as an additional string + nested accent-colored `<Text>` (which is a
12
+ * virtual text node, not a Box).
13
+ */
14
+ import React from 'react';
15
+ export interface ChatMessage {
16
+ direction: 'received' | 'sent';
17
+ from: string;
18
+ text: string;
19
+ timestamp: string;
20
+ }
21
+ export interface ChatViewProps {
22
+ targetPlayer: string;
23
+ targetPart?: string;
24
+ targetBranch?: string;
25
+ targetStatus?: string;
26
+ /** The session's home hostname (PR-A metadata). Compare vs `localHost` to decide cross-host rendering. */
27
+ targetHost?: string;
28
+ /** The local TUI process's hostname. */
29
+ localHost?: string;
30
+ isConductor?: boolean;
31
+ receivedCount: number;
32
+ sentCount: number;
33
+ messages: ChatMessage[];
34
+ }
35
+ export declare function ChatView({ targetPlayer, targetPart, targetBranch, targetHost, localHost, isConductor, receivedCount, sentCount, }: ChatViewProps): React.CElement<{}, React.Component<{}, any, any>>;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ChatView = ChatView;
7
+ /**
8
+ * ChatView — header for a conversation with a specific player.
9
+ * Messages are rendered via <Static> in App.tsx, not here.
10
+ * This component only shows context (player name, part, branch, counts).
11
+ *
12
+ * PR-F cross-host indicator (design §16, brief §8 answer 3 — Option 3):
13
+ * - Local session (targetHost === localHost) → omit host entirely (no noise).
14
+ * - Remote session → prepend `{host} · ` to the existing status line in
15
+ * `THEME.accent` (amber).
16
+ * Zero new Yoga nodes: the host prefix goes into the same `<Text>` children
17
+ * tree as an additional string + nested accent-colored `<Text>` (which is a
18
+ * virtual text node, not a Box).
19
+ */
20
+ const react_1 = __importDefault(require("react"));
21
+ const ink_context_1 = require("../ink-context");
22
+ const theme_1 = require("../utils/theme");
23
+ function ChatView({ targetPlayer, targetPart, targetBranch, targetHost, localHost, isConductor, receivedCount, sentCount, }) {
24
+ const { Text } = (0, ink_context_1.useInk)();
25
+ const icon = isConductor ? '\u2605 ' : '';
26
+ const label = isConductor ? 'Conductor' : 'Conversation with';
27
+ // §8 answer 3 — remote host only; local omits entirely.
28
+ const showRemoteHost = Boolean(targetHost && localHost && targetHost !== localHost);
29
+ const children = [];
30
+ children.push(react_1.default.createElement(Text, { key: 'h1', bold: true, color: theme_1.THEME.accent }, ` ${icon}${label} ${targetPlayer}`));
31
+ if (targetPart) {
32
+ children.push('\n');
33
+ children.push(react_1.default.createElement(Text, { key: 'h2', color: theme_1.THEME.dim }, ` Part: ${targetPart}`));
34
+ }
35
+ children.push('\n');
36
+ // Status line — prepend amber {host} · for remote sessions only.
37
+ // Zero new Yoga nodes: composed inline as nested <Text> within h3.
38
+ const h3Children = [];
39
+ h3Children.push(' ');
40
+ if (showRemoteHost) {
41
+ h3Children.push(react_1.default.createElement(Text, { key: 'host', color: theme_1.THEME.accent }, targetHost));
42
+ h3Children.push(' \u00B7 ');
43
+ }
44
+ if (targetBranch) {
45
+ h3Children.push(`Branch: ${targetBranch} \u00B7 `);
46
+ }
47
+ h3Children.push(`${receivedCount} received, ${sentCount} sent`);
48
+ children.push(react_1.default.createElement(Text, { key: 'h3', color: theme_1.THEME.dim }, ...h3Children));
49
+ children.push('\n');
50
+ children.push(react_1.default.createElement(Text, { key: 'h4', color: theme_1.THEME.border }, ' ' + '\u2500'.repeat(55)));
51
+ children.push('\n');
52
+ children.push(react_1.default.createElement(Text, { key: 'h5', color: theme_1.THEME.dim }, ' Messages appear above \u2191 (scroll up in terminal)'));
53
+ return react_1.default.createElement(Text, null, ...children);
54
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * CommandOverlay — generic dismissible overlay for data-display commands.
3
+ *
4
+ * Renders a title and pre-formatted text content. Used by /gates, /stages,
5
+ * /worktree list, /recall, and /search instead of static scrollback.
6
+ *
7
+ * Performance: Single <Text> root with nested virtual-text children.
8
+ * Zero Yoga <Box> nodes.
9
+ */
10
+ import React from 'react';
11
+ export interface CommandOverlayProps {
12
+ title: string;
13
+ content: string;
14
+ }
15
+ export declare function CommandOverlay({ title, content }: CommandOverlayProps): React.CElement<{}, React.Component<{}, any, any>>;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CommandOverlay = CommandOverlay;
7
+ /**
8
+ * CommandOverlay — generic dismissible overlay for data-display commands.
9
+ *
10
+ * Renders a title and pre-formatted text content. Used by /gates, /stages,
11
+ * /worktree list, /recall, and /search instead of static scrollback.
12
+ *
13
+ * Performance: Single <Text> root with nested virtual-text children.
14
+ * Zero Yoga <Box> nodes.
15
+ */
16
+ const react_1 = __importDefault(require("react"));
17
+ const ink_context_1 = require("../ink-context");
18
+ const theme_1 = require("../utils/theme");
19
+ function CommandOverlay({ title, content }) {
20
+ const { Text } = (0, ink_context_1.useInk)();
21
+ const children = [];
22
+ children.push(react_1.default.createElement(Text, { key: 'h', bold: true, color: theme_1.THEME.accent }, ` ${title}`));
23
+ children.push('\n\n');
24
+ // Render each line of pre-formatted content as dimmed text
25
+ const lines = content.split('\n');
26
+ for (let i = 0; i < lines.length; i++) {
27
+ if (i > 0)
28
+ children.push('\n');
29
+ children.push(react_1.default.createElement(Text, { key: `l-${i}`, color: theme_1.THEME.text }, ` ${lines[i]}`));
30
+ }
31
+ children.push('\n\n');
32
+ children.push(react_1.default.createElement(Text, { key: 'hint', color: theme_1.THEME.dim }, ' Esc to dismiss'));
33
+ return react_1.default.createElement(Text, null, ...children);
34
+ }
@@ -0,0 +1,21 @@
1
+ /**
2
+ * CommandPalette — dropdown overlay showing filtered slash commands.
3
+ * Renders as a SINGLE Text element (1 Yoga node) with newlines for rows.
4
+ */
5
+ import React from 'react';
6
+ export interface PaletteCommand {
7
+ name: string;
8
+ usage: string;
9
+ description: string;
10
+ }
11
+ export interface CommandPaletteProps {
12
+ commands: PaletteCommand[];
13
+ selectedIndex: number;
14
+ /** Prefix character for display (default: "/"). Use "@" for player palette. */
15
+ prefix?: string;
16
+ }
17
+ export declare function CommandPalette({ commands, selectedIndex, prefix }: CommandPaletteProps): React.CElement<{}, React.Component<{}, any, any>> | React.CElement<{
18
+ color: string;
19
+ }, React.Component<{
20
+ color: string;
21
+ }, any, any>>;
@@ -0,0 +1,67 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.CommandPalette = CommandPalette;
7
+ /**
8
+ * CommandPalette — dropdown overlay showing filtered slash commands.
9
+ * Renders as a SINGLE Text element (1 Yoga node) with newlines for rows.
10
+ */
11
+ const react_1 = __importDefault(require("react"));
12
+ const ink_context_1 = require("../ink-context");
13
+ const theme_1 = require("../utils/theme");
14
+ const MAX_VISIBLE = 6;
15
+ function CommandPalette({ commands, selectedIndex, prefix = '/' }) {
16
+ const { Text } = (0, ink_context_1.useInk)();
17
+ if (commands.length === 0) {
18
+ return react_1.default.createElement(Text, { color: theme_1.THEME.dim }, ' No matching commands');
19
+ }
20
+ // Window the visible commands around the selected index
21
+ let startIdx = 0;
22
+ if (commands.length > MAX_VISIBLE) {
23
+ startIdx = Math.max(0, Math.min(selectedIndex - Math.floor(MAX_VISIBLE / 2), commands.length - MAX_VISIBLE));
24
+ }
25
+ const visible = commands.slice(startIdx, startIdx + MAX_VISIBLE);
26
+ const lines = [];
27
+ // Scroll-up indicator
28
+ if (startIdx > 0) {
29
+ lines.push(` \u2191 ${startIdx} more above`);
30
+ }
31
+ // Visible rows (plain text — color via outer Text)
32
+ for (let i = 0; i < visible.length; i++) {
33
+ const cmd = visible[i];
34
+ const actualIdx = startIdx + i;
35
+ const isSelected = actualIdx === selectedIndex;
36
+ const indicator = isSelected ? '\u25B8 ' : ' ';
37
+ lines.push(` ${indicator}/${cmd.name} ${cmd.description}`);
38
+ }
39
+ // Scroll-down indicator
40
+ const hasBelow = startIdx + MAX_VISIBLE < commands.length;
41
+ if (hasBelow) {
42
+ lines.push(` \u2193 ${commands.length - startIdx - MAX_VISIBLE} more below`);
43
+ }
44
+ // Single Text element with newlines — all one Yoga node
45
+ // Use nested Text for selected item highlighting
46
+ const children = [];
47
+ let lineIdx = 0;
48
+ if (startIdx > 0) {
49
+ children.push(react_1.default.createElement(Text, { key: 'above', color: theme_1.THEME.dim }, lines[lineIdx]));
50
+ children.push('\n');
51
+ lineIdx++;
52
+ }
53
+ for (let i = 0; i < visible.length; i++) {
54
+ const cmd = visible[i];
55
+ const actualIdx = startIdx + i;
56
+ const isSelected = actualIdx === selectedIndex;
57
+ const indicator = isSelected ? '\u25B8 ' : ' ';
58
+ if (i > 0)
59
+ children.push('\n');
60
+ children.push(react_1.default.createElement(react_1.default.Fragment, { key: cmd.name }, react_1.default.createElement(Text, { color: isSelected ? theme_1.THEME.accent : theme_1.THEME.dim }, ` ${indicator}`), react_1.default.createElement(Text, { color: isSelected ? theme_1.THEME.accent : theme_1.THEME.success, bold: isSelected }, `${prefix}${cmd.name}`), react_1.default.createElement(Text, { color: theme_1.THEME.muted }, ` ${cmd.description}`)));
61
+ }
62
+ if (hasBelow) {
63
+ children.push('\n');
64
+ children.push(react_1.default.createElement(Text, { key: 'below', color: theme_1.THEME.dim }, ` \u2193 ${commands.length - startIdx - MAX_VISIBLE} more below`));
65
+ }
66
+ return react_1.default.createElement(Text, null, ...children);
67
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Conductor chat panel — shows command/report history from the conductor.
3
+ */
4
+ import React from 'react';
5
+ import type { HistoryEntry } from '../../types';
6
+ export interface ConductorChatProps {
7
+ history: HistoryEntry[];
8
+ maxVisible?: number;
9
+ }
10
+ export declare function ConductorChat({ history, maxVisible }: ConductorChatProps): React.FunctionComponentElement<{
11
+ flexDirection: string;
12
+ }> | React.CElement<{
13
+ flexDirection: string;
14
+ }, React.Component<{
15
+ flexDirection: string;
16
+ }, any, any>>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.ConductorChat = ConductorChat;
7
+ /**
8
+ * Conductor chat panel — shows command/report history from the conductor.
9
+ */
10
+ const react_1 = __importDefault(require("react"));
11
+ const ink_context_1 = require("../ink-context");
12
+ const format_1 = require("../utils/format");
13
+ function ConductorChat({ history, maxVisible = 20 }) {
14
+ const { Box, Text } = (0, ink_context_1.useInk)();
15
+ const visible = history.slice(-maxVisible);
16
+ if (visible.length === 0) {
17
+ return react_1.default.createElement(Box, { flexDirection: 'column' }, react_1.default.createElement(Text, { dimColor: true }, 'No conductor activity yet'));
18
+ }
19
+ return react_1.default.createElement(Box, { flexDirection: 'column' }, ...visible.map((entry, i) => {
20
+ const time = (0, format_1.formatTime)(entry.timestamp);
21
+ const isCommand = entry.type === 'command';
22
+ const data = entry.data;
23
+ if (isCommand) {
24
+ return react_1.default.createElement(Box, { key: `${entry.timestamp}-${i}` }, react_1.default.createElement(Text, { dimColor: true }, `[${time}] `), react_1.default.createElement(Text, { color: 'cyan' }, `${data.source}: `), react_1.default.createElement(Text, null, data.text));
25
+ }
26
+ // Report
27
+ const reportColor = data.type === 'blocker' ? 'red'
28
+ : data.type === 'question' ? 'yellow'
29
+ : 'green';
30
+ return react_1.default.createElement(Box, { key: `${entry.timestamp}-${i}` }, react_1.default.createElement(Text, { dimColor: true }, `[${time}] `), react_1.default.createElement(Text, { color: reportColor }, `[${data.type}] `), react_1.default.createElement(Text, { bold: true }, `${data.playerId}: `), react_1.default.createElement(Text, null, data.text));
31
+ }));
32
+ }
@@ -0,0 +1,114 @@
1
+ /**
2
+ * ConversationStream — live message area showing ensemble conversation.
3
+ *
4
+ * Merges server conversation with local echo (optimistic sent messages),
5
+ * formats messages with header/body layout and word-wrap, and renders
6
+ * the most recent that fit in the viewport.
7
+ *
8
+ * Performance: Single <Text> root with nested virtual-text children.
9
+ * Zero Yoga <Box> nodes.
10
+ */
11
+ import React from 'react';
12
+ export interface ConversationMessage {
13
+ id: string;
14
+ from: string;
15
+ to: string;
16
+ text: string;
17
+ timestamp: string;
18
+ direction: 'in' | 'out';
19
+ /** Message role from ensemble chat feed. */
20
+ role?: 'maestro-out' | 'maestro-in' | 'conductor-out' | 'conductor-in';
21
+ /** True for conductor↔player traffic (rendered dimmed). */
22
+ thirdParty?: boolean;
23
+ /**
24
+ * #357: Mirrors `EnsembleChatMessage.broadcastId`. When set, consecutive
25
+ * messages sharing the same id collapse into a single rendered row with
26
+ * a `📡 broadcast → N players` badge. `undefined` for direct cues.
27
+ */
28
+ broadcastId?: string;
29
+ }
30
+ export interface SentMessage {
31
+ to: string;
32
+ text: string;
33
+ timestamp: string;
34
+ /** #357: Mirrors `Message.broadcastId` on the sender side. */
35
+ broadcastId?: string;
36
+ }
37
+ export interface ConversationStreamProps {
38
+ conversation: ConversationMessage[];
39
+ sentMessages: SentMessage[];
40
+ contentHeight: number;
41
+ /** Ref to store overflow data for parent to commit to Static scrollback. */
42
+ overflowRef: React.MutableRefObject<{
43
+ formatted: Array<{
44
+ sender: string;
45
+ time: string;
46
+ body: string;
47
+ direction: 'in' | 'out';
48
+ thirdParty?: boolean;
49
+ routeLabel?: string;
50
+ }>;
51
+ startIdx: number;
52
+ } | null>;
53
+ /**
54
+ * #360: playerId of the conductor in the active ensemble (derived from
55
+ * `state.players.find(p => p.isConductor)`). Used to suppress the
56
+ * `→ @<to>` recipient prefix on outbound messages addressed to the
57
+ * conductor — those route through the implicit "send to conductor"
58
+ * path and the prefix would be visually noisy. `undefined` when no
59
+ * conductor is in the ensemble.
60
+ */
61
+ conductorPlayerId?: string;
62
+ }
63
+ export interface FormattedMsg {
64
+ sender: string;
65
+ time: string;
66
+ body: string;
67
+ direction: 'in' | 'out';
68
+ role?: string;
69
+ thirdParty?: boolean;
70
+ /** For conductor traffic: show routing (from → to). */
71
+ routeLabel?: string;
72
+ /**
73
+ * #360: For directed `maestro-out` messages where the recipient is
74
+ * NOT the conductor — prepend `→ @<recipientLabel>` to the rendered
75
+ * body so the user can see who they actually messaged. Empty for
76
+ * inbound, conductor-bound, or third-party messages.
77
+ *
78
+ * Mutually exclusive with `broadcastBadge` — when a row represents a
79
+ * folded broadcast group, the badge enumerates recipients and the
80
+ * single-recipient prefix would duplicate that information.
81
+ */
82
+ recipientLabel?: string;
83
+ /**
84
+ * #357: When set, this `FormattedMsg` represents a folded group of
85
+ * consecutive messages sharing the same `broadcastId`. The renderer
86
+ * surfaces a `📡 broadcast → <count> players` segment in front of
87
+ * the body in place of the `→ @<to>` recipient prefix. The first
88
+ * `recipients.length` names are listed (cap = 3 + "+N more").
89
+ */
90
+ broadcastBadge?: {
91
+ count: number;
92
+ recipients: string[];
93
+ };
94
+ /**
95
+ * Pre-rendered first-line prefix string (broadcast badge or directed
96
+ * `→ @<to> `). Computed once in `buildFormattedMessages` so the line
97
+ * estimator and the renderer share the exact same value without each
98
+ * having to call `broadcastBadgeText` independently.
99
+ */
100
+ firstLinePrefix?: string;
101
+ }
102
+ /**
103
+ * Pure projection: merge server conversation with local-echo sent
104
+ * messages, sort by timestamp, fold broadcast fan-out groups, and
105
+ * format each entry into the render-ready `FormattedMsg` shape.
106
+ * Exported so tests can assert on `recipientLabel` / `broadcastBadge`
107
+ * / `routeLabel` derivation without mounting Ink.
108
+ *
109
+ * `conductorPlayerId` is the active ensemble's conductor id. Used to
110
+ * suppress the `recipientLabel` on conductor-bound `maestro-out` rows
111
+ * so the `\u2192 @<conductor>` prefix doesn't dominate every message.
112
+ */
113
+ export declare function buildFormattedMessages(conversation: ConversationMessage[], sentMessages: SentMessage[], conductorPlayerId?: string): FormattedMsg[];
114
+ export declare function ConversationStream({ conversation, sentMessages, contentHeight, overflowRef, conductorPlayerId }: ConversationStreamProps): React.CElement<{}, React.Component<{}, any, any>>;