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,297 @@
1
+ import type { SessionMetadata, Message, SentMessage, HistoryEntry, OutboxEntry, OutboxEntryInput, QualityGate, WorktreeEntry, StageEntry, AttachmentToken, AttachmentInfo, AdapterClass, DetachReason, OrphanSummary, PlayerStateEntry } from '../types';
2
+ export type { SessionMetadata, SessionInput, Message, Command, PlayerReport, SentMessage, HistoryEntry, OutboxEntry, OutboxEntryInput, OutboxEntryStatus, CueOutboxEntry, RecruitOutboxEntry, ReportOutboxEntry, StopOutboxEntry, ReleaseOutboxEntry, SpawnOutboxEntry, AgentType, QualityGate, QualityGateCriterion, WorktreeEntry, StageEntry, StagePlayerStatus, AttachmentToken, AttachmentInfo, AttachmentPhase, Attachment, AdapterClass, AdapterDescriptor, DetachReason, AdapterDirective, OrphanSummary, PlayerStateEntry, } from '../types';
3
+ export declare const receiveMessageSignal: import("@temporalio/workflow").SignalDefinition<[{
4
+ from: string;
5
+ text: string;
6
+ isMaestro?: boolean;
7
+ isScheduled?: boolean;
8
+ scheduleName?: string;
9
+ responseRequested?: boolean;
10
+ broadcastId?: string;
11
+ attachmentTicket?: string;
12
+ }], string>;
13
+ export declare const recordSentMessageSignal: import("@temporalio/workflow").SignalDefinition<[{
14
+ to: string;
15
+ text: string;
16
+ broadcastId?: string;
17
+ }], string>;
18
+ export declare const setPartSignal: import("@temporalio/workflow").SignalDefinition<[string], string>;
19
+ export declare const markDeliveredSignal: import("@temporalio/workflow").SignalDefinition<[string[]], string>;
20
+ export declare const setNameSignal: import("@temporalio/workflow").SignalDefinition<[string], string>;
21
+ export declare const updateMetadataSignal: import("@temporalio/workflow").SignalDefinition<[{
22
+ hostname?: string;
23
+ gitBranch?: string;
24
+ gitRoot?: string;
25
+ terminatedBy?: string;
26
+ enableStaleDetection?: boolean;
27
+ playerType?: string;
28
+ playerTypeDescription?: string;
29
+ worktreePath?: string;
30
+ sessionId?: string;
31
+ }], string>;
32
+ export declare const getPartQuery: import("@temporalio/workflow").QueryDefinition<string, [], string>;
33
+ export declare const getMetadataQuery: import("@temporalio/workflow").QueryDefinition<SessionMetadata, [], string>;
34
+ export declare const pendingMessagesQuery: import("@temporalio/workflow").QueryDefinition<Message[], [], string>;
35
+ export declare const allMessagesQuery: import("@temporalio/workflow").QueryDefinition<Message[], [], string>;
36
+ export declare const allSentMessagesQuery: import("@temporalio/workflow").QueryDefinition<SentMessage[], [], string>;
37
+ /** Release a held session — unlocks the outbox and delivers the stored initial message. */
38
+ export declare const releaseHeldSignal: import("@temporalio/workflow").SignalDefinition<[], "releaseHeld">;
39
+ /** Query whether the session's outbox is locked (warm hold). */
40
+ export declare const outboxLockedQuery: import("@temporalio/workflow").QueryDefinition<boolean, [], string>;
41
+ /** Set the paused state for the session (ensemble-wide pause/resume). */
42
+ export declare const setPausedSignal: import("@temporalio/workflow").SignalDefinition<[boolean], string>;
43
+ /** Query whether the session is paused. */
44
+ export declare const pausedQuery: import("@temporalio/workflow").QueryDefinition<boolean, [], string>;
45
+ export declare const commandSignal: import("@temporalio/workflow").SignalDefinition<[{
46
+ text: string;
47
+ source: string;
48
+ replyTo?: string;
49
+ }], string>;
50
+ export declare const playerReportSignal: import("@temporalio/workflow").SignalDefinition<[{
51
+ playerId: string;
52
+ text: string;
53
+ type: "result" | "blocker" | "question";
54
+ }], string>;
55
+ export declare const historyQuery: import("@temporalio/workflow").QueryDefinition<HistoryEntry[], [], string>;
56
+ /** Signal that the adapter has started processing an inbound message (blocking LLM/tool call). */
57
+ export declare const processingStartUpdate: import("@temporalio/common").UpdateDefinition<{
58
+ inFlightCount: number;
59
+ }, [{
60
+ messageId: string;
61
+ expectedAttachmentId?: string;
62
+ }], string>;
63
+ /** Signal that the adapter has finished processing an inbound message. */
64
+ export declare const processingEndUpdate: import("@temporalio/common").UpdateDefinition<{
65
+ inFlightCount: number;
66
+ }, [{
67
+ messageId: string;
68
+ expectedAttachmentId?: string;
69
+ }], string>;
70
+ /** Query currently in-flight message IDs. */
71
+ export declare const inFlightMessagesQuery: import("@temporalio/workflow").QueryDefinition<string[], [], string>;
72
+ /** Destroy the session: abandon in-flight outbox per §2.5, emit audit event, COMPLETE. */
73
+ export declare const destroyUpdate: import("@temporalio/common").UpdateDefinition<void, [{
74
+ reason?: string;
75
+ terminatedBy?: string;
76
+ }], string>;
77
+ /** Query whether the session has been destroyed. */
78
+ export declare const isDestroyedQuery: import("@temporalio/workflow").QueryDefinition<boolean, [], string>;
79
+ /**
80
+ * Transactionally claim or renew the attachment lease on this workflow.
81
+ *
82
+ * - **First claim**: `expectedAttachmentId` absent, no live attachment → fresh `Attachment`
83
+ * created, phase `booting → attached` (or `detached → attached`).
84
+ * - **Renewal**: `expectedAttachmentId` matches current attachment AND lease not expired
85
+ * → extend `expiresAt` and `lastHeartbeatAt`. Returns same token.
86
+ * - **Conflict**: live attachment held by a different claimant → rejects with
87
+ * `AttachmentConflict` ApplicationFailure.
88
+ * - **WorkflowGone**: phase is `gone` → rejects with `WorkflowGone`.
89
+ */
90
+ export declare const claimAttachmentUpdate: import("@temporalio/common").UpdateDefinition<AttachmentToken, [{
91
+ host: string;
92
+ adapterId: string;
93
+ adapterClass: AdapterClass;
94
+ leaseMs: number;
95
+ /** Present on renewal; absent on fresh claim. */
96
+ expectedAttachmentId?: string;
97
+ }], string>;
98
+ /**
99
+ * Revoke the current attachment. Options for drain-grace behavior during `draining` phase.
100
+ * Returns `{ reaped: true }` when a live attachment was revoked, `{ reaped: false }` when
101
+ * already detached (idempotent).
102
+ */
103
+ export declare const forceDetachUpdate: import("@temporalio/common").UpdateDefinition<{
104
+ reaped: boolean;
105
+ previousAttachmentId?: string;
106
+ }, [{
107
+ reason: DetachReason;
108
+ /** If provided, only act if the current attachmentId matches. Prevents TOCTOU. */
109
+ expectedAttachmentId?: string;
110
+ /** 0 = immediate; >0 = wait up to this long for `drainingDeadline` first. */
111
+ gracePeriodMs: number;
112
+ }], string>;
113
+ /**
114
+ * Queue a spawn-outbox entry carrying the claim token. Called by `restart` after a successful
115
+ * `claimAttachment`. Workflow-side spawn-failure rollback lives in §8.4.
116
+ */
117
+ export declare const enqueueSpawnUpdate: import("@temporalio/common").UpdateDefinition<{
118
+ spawnEntryId: string;
119
+ }, [{
120
+ host: string;
121
+ attachmentId: string;
122
+ runId: string;
123
+ resume: boolean;
124
+ sessionId?: string;
125
+ adapterId: string;
126
+ /** Resolved agent definition so restart spawns `--agent`/`--system-prompt`
127
+ * the same way recruit does. See #184. */
128
+ agentDefinition?: string;
129
+ agentDefinitionPath?: string;
130
+ nativeResolvable?: boolean;
131
+ /** #131 Phase C — claude-api model id carried across restart. */
132
+ model?: string;
133
+ }], string>;
134
+ /** Record a preferred host for daemon reconcile-on-boot targeting. */
135
+ export declare const setPreferredHostUpdate: import("@temporalio/common").UpdateDefinition<void, [{
136
+ host: string;
137
+ }], string>;
138
+ /**
139
+ * Liveness heartbeat from the adapter. Resets `lastHeartbeatAt` and extends `expiresAt` to
140
+ * `workflow.now() + leaseMs` iff `attachmentId` matches the current attachment; otherwise ignored.
141
+ */
142
+ export declare const heartbeatSignal: import("@temporalio/workflow").SignalDefinition<[{
143
+ attachmentId: string;
144
+ at: string;
145
+ }], string>;
146
+ /**
147
+ * Adapter-, conductor-, or operator-initiated request to detach gracefully.
148
+ * Phase transitions to `draining`; outbox continues to drain up to `deadlineMs` then
149
+ * the main loop reaps.
150
+ */
151
+ export declare const requestDetachSignal: import("@temporalio/workflow").SignalDefinition<[{
152
+ reason: DetachReason;
153
+ deadlineMs: number;
154
+ }], string>;
155
+ /**
156
+ * Final acknowledgement from a detaching adapter. Collapses `draining → detached` immediately
157
+ * if `attachmentId` matches the current attachment; ignored on `detached` (no-op).
158
+ */
159
+ export declare const adapterExitedSignal: import("@temporalio/workflow").SignalDefinition<[{
160
+ attachmentId: string;
161
+ reason: DetachReason;
162
+ }], string>;
163
+ /** Current attachment state + phase + in-flight count. Read by adapters, tools, and the TUI. */
164
+ export declare const attachmentInfoQuery: import("@temporalio/workflow").QueryDefinition<AttachmentInfo, [], string>;
165
+ /**
166
+ * Daemon and CLI `restore` summary — metadata to render a detached-orphan card and decide
167
+ * whether auto-restore applies.
168
+ */
169
+ export declare const orphanSummaryQuery: import("@temporalio/workflow").QueryDefinition<OrphanSummary, [], string>;
170
+ /**
171
+ * Save curated state for the calling player into a named slot.
172
+ *
173
+ * Validation (pre-handler):
174
+ * - `key` matches `PLAYER_STATE_KEY_REGEX` (alphanumeric + underscore + hyphen,
175
+ * 1–32 chars). `PlayerStateInvalidKey` on mismatch.
176
+ * - `content` byte length ≤ `PLAYER_STATE_CONTENT_MAX` (32 KiB).
177
+ * `PlayerStateContentTooLarge` on overflow.
178
+ * - When the key is new and slots already at `PLAYER_STATE_SLOTS_MAX` (4),
179
+ * rejects with `PlayerStateSlotsFull` and lists existing keys so the LLM
180
+ * can pick which slot to clear.
181
+ *
182
+ * On success, writes `{ content, savedAt: workflowNow().toISOString(), savedBy }`
183
+ * to `playerState[key]`. Carried via `continueAsNew`.
184
+ */
185
+ export declare const savePlayerStateUpdate: import("@temporalio/common").UpdateDefinition<{
186
+ saved: true;
187
+ savedAt: string;
188
+ }, [{
189
+ key: string;
190
+ content: string;
191
+ savedBy: string;
192
+ }], string>;
193
+ /**
194
+ * Clear the named slot. Returns `{ cleared: true }` if the slot existed,
195
+ * `{ cleared: false }` if it was already empty (idempotent). Validates `key`
196
+ * against `PLAYER_STATE_KEY_REGEX`.
197
+ */
198
+ export declare const clearPlayerStateUpdate: import("@temporalio/common").UpdateDefinition<{
199
+ cleared: boolean;
200
+ }, [{
201
+ key: string;
202
+ }], string>;
203
+ /**
204
+ * Read the named slot. Returns `null` when the slot is empty.
205
+ * `key` defaults to `PLAYER_STATE_DEFAULT_KEY` ('main').
206
+ *
207
+ * Peer-readable: any player in the ensemble may query any other player's
208
+ * saved state (audit identity is the entry's `savedBy`). Mirrors the
209
+ * `recall`/`attachment_info` ergonomics.
210
+ */
211
+ export declare const playerStateQuery: import("@temporalio/workflow").QueryDefinition<PlayerStateEntry | null, [{
212
+ key?: string;
213
+ }], string>;
214
+ /** List names of populated slots (sorted). Returns `[]` when no slots are saved. */
215
+ export declare const playerStateKeysQuery: import("@temporalio/workflow").QueryDefinition<string[], [], string>;
216
+ export declare const submitOutboxUpdate: import("@temporalio/common").UpdateDefinition<string, [OutboxEntryInput], string>;
217
+ export declare const outboxQuery: import("@temporalio/workflow").QueryDefinition<OutboxEntry[], [], string>;
218
+ /**
219
+ * Q5.2 — runId of the current workflow execution. Returned as the raw
220
+ * UUID string from `workflowInfo().runId`; the dashboard truncates to
221
+ * `XXXX·XXXX` (first 4 + last 4 + middle dot) client-side so this query
222
+ * stays a thin pass-through.
223
+ */
224
+ export declare const getRunIdQuery: import("@temporalio/workflow").QueryDefinition<string, [], string>;
225
+ /**
226
+ * Q5.5 — messaging counters + outbox status summary. The dashboard
227
+ * renders three KV rows under `Messages`. Counters are monotonic
228
+ * across the workflow's lifetime (preserved across continueAsNew via
229
+ * SessionInput).
230
+ *
231
+ * `outbox` is a reduce-helper string: `"empty"` / `"N pending"` /
232
+ * `"N pending (oldest 2m)"` once the oldest pending entry is older than
233
+ * the stale threshold. Computing this server-side keeps the wire shape
234
+ * tight.
235
+ */
236
+ export declare const getMessagingStateQuery: import("@temporalio/workflow").QueryDefinition<{
237
+ received: number;
238
+ sent: number;
239
+ outbox: string;
240
+ }, [], string>;
241
+ /**
242
+ * Q5.6 — activity counter + last-activity timestamp. Critical-path for
243
+ * W1's tempo computation: the maestro fan-queries this from each
244
+ * session to compute msgs/min buckets. `activityCount` increments at
245
+ * the same ~20 sites that already update `lastActivityTime` (cue,
246
+ * outbox push, schedule fire, report, recruit, restart, destroy,
247
+ * migrate, etc.). Heartbeats and lifecycle plumbing don't bump it.
248
+ *
249
+ * `lastActivityAt` is ISO so the maestro can compute clock-relative
250
+ * deltas without re-parsing.
251
+ */
252
+ export declare const getActivityStateQuery: import("@temporalio/workflow").QueryDefinition<{
253
+ activityCount: number;
254
+ lastActivityAt: string;
255
+ }, [], string>;
256
+ /**
257
+ * Q5.7 — current attachment lease window. Returns `{ expiresAt,
258
+ * leaseMs }` as numbers (epoch ms / ms) so the dashboard can compute
259
+ * "expires in 54s" without parsing ISO strings every render. Both
260
+ * fields are `null` when no active lease (phase ∈ booting / detached /
261
+ * gone).
262
+ *
263
+ * The underlying `Attachment.expiresAt` is stored as an ISO string for
264
+ * historical reasons; the query handler parses to epoch ms at the
265
+ * boundary.
266
+ */
267
+ export declare const getLeaseStateQuery: import("@temporalio/workflow").QueryDefinition<{
268
+ expiresAt: number | null;
269
+ leaseMs: number | null;
270
+ }, [], string>;
271
+ export declare const testForceContinueAsNewSignal: import("@temporalio/workflow").SignalDefinition<[], "testForceContinueAsNew">;
272
+ export declare const setQualityGateSignal: import("@temporalio/workflow").SignalDefinition<[{
273
+ task: string;
274
+ criteria: string[];
275
+ createdBy: string;
276
+ }], string>;
277
+ export declare const evaluateGateCriteriaSignal: import("@temporalio/workflow").SignalDefinition<[{
278
+ task: string;
279
+ evaluations: Array<{
280
+ index: number;
281
+ status: "passed" | "failed";
282
+ notes?: string;
283
+ }>;
284
+ evaluatedBy: string;
285
+ }], string>;
286
+ export declare const qualityGatesQuery: import("@temporalio/workflow").QueryDefinition<QualityGate[], [], string>;
287
+ export declare const setWorktreeSignal: import("@temporalio/workflow").SignalDefinition<[WorktreeEntry], string>;
288
+ export declare const removeWorktreeSignal: import("@temporalio/workflow").SignalDefinition<[string], string>;
289
+ export declare const worktreesQuery: import("@temporalio/workflow").QueryDefinition<WorktreeEntry[], [], string>;
290
+ export declare const setStageSignal: import("@temporalio/workflow").SignalDefinition<[{
291
+ name: string;
292
+ players: string[];
293
+ failurePolicy?: "halt" | "continue";
294
+ createdBy: string;
295
+ }], string>;
296
+ export declare const cancelStageSignal: import("@temporalio/workflow").SignalDefinition<[string], string>;
297
+ export declare const stagesQuery: import("@temporalio/workflow").QueryDefinition<StageEntry[], [], string>;
@@ -0,0 +1,239 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.setStageSignal = exports.worktreesQuery = exports.removeWorktreeSignal = exports.setWorktreeSignal = exports.qualityGatesQuery = exports.evaluateGateCriteriaSignal = exports.setQualityGateSignal = exports.testForceContinueAsNewSignal = exports.getLeaseStateQuery = exports.getActivityStateQuery = exports.getMessagingStateQuery = exports.getRunIdQuery = exports.outboxQuery = exports.submitOutboxUpdate = exports.playerStateKeysQuery = exports.playerStateQuery = exports.clearPlayerStateUpdate = exports.savePlayerStateUpdate = exports.orphanSummaryQuery = exports.attachmentInfoQuery = exports.adapterExitedSignal = exports.requestDetachSignal = exports.heartbeatSignal = exports.setPreferredHostUpdate = exports.enqueueSpawnUpdate = exports.forceDetachUpdate = exports.claimAttachmentUpdate = exports.isDestroyedQuery = exports.destroyUpdate = exports.inFlightMessagesQuery = exports.processingEndUpdate = exports.processingStartUpdate = exports.historyQuery = exports.playerReportSignal = exports.commandSignal = exports.pausedQuery = exports.setPausedSignal = exports.outboxLockedQuery = exports.releaseHeldSignal = exports.allSentMessagesQuery = exports.allMessagesQuery = exports.pendingMessagesQuery = exports.getMetadataQuery = exports.getPartQuery = exports.updateMetadataSignal = exports.setNameSignal = exports.markDeliveredSignal = exports.setPartSignal = exports.recordSentMessageSignal = exports.receiveMessageSignal = void 0;
4
+ exports.stagesQuery = exports.cancelStageSignal = void 0;
5
+ const workflow_1 = require("@temporalio/workflow");
6
+ // ── Player Signals ──
7
+ // `isScheduled` + `scheduleName` are set by `src/activities/schedule-fire.ts`
8
+ // when the message originated from the scheduler workflow — allows dashboards
9
+ // and consumers to distinguish scheduled fires from direct cues. Documented in
10
+ // docs/WIRE-PROTOCOL.md; runtime senders have populated both fields since the
11
+ // scheduler shipped, but the TS type drifted (#251). Optional everywhere.
12
+ // `broadcastId` (#357) is an additive optional field — same id on every fan-out
13
+ // target of one `broadcast` invocation. The TUI uses it to fold N deliveries
14
+ // into one chat row.
15
+ // `attachmentTicket` (#318) is an additive optional field — coat-check ticket
16
+ // the sender stashed via `coat_check_put`; the recipient pulls the body via
17
+ // `coat_check_get`. Backward-compatible — pre-#318 cues simply don't have it.
18
+ exports.receiveMessageSignal = (0, workflow_1.defineSignal)('receiveMessage');
19
+ exports.recordSentMessageSignal = (0, workflow_1.defineSignal)('recordSentMessage');
20
+ exports.setPartSignal = (0, workflow_1.defineSignal)('setPart');
21
+ exports.markDeliveredSignal = (0, workflow_1.defineSignal)('markDelivered');
22
+ exports.setNameSignal = (0, workflow_1.defineSignal)('setName');
23
+ exports.updateMetadataSignal = (0, workflow_1.defineSignal)('updateMetadata');
24
+ // ── Player Queries ──
25
+ exports.getPartQuery = (0, workflow_1.defineQuery)('getPart');
26
+ exports.getMetadataQuery = (0, workflow_1.defineQuery)('getMetadata');
27
+ exports.pendingMessagesQuery = (0, workflow_1.defineQuery)('pendingMessages');
28
+ exports.allMessagesQuery = (0, workflow_1.defineQuery)('allMessages');
29
+ exports.allSentMessagesQuery = (0, workflow_1.defineQuery)('allSentMessages');
30
+ // ── Hold / Release ──
31
+ /** Release a held session — unlocks the outbox and delivers the stored initial message. */
32
+ exports.releaseHeldSignal = (0, workflow_1.defineSignal)('releaseHeld');
33
+ /** Query whether the session's outbox is locked (warm hold). */
34
+ exports.outboxLockedQuery = (0, workflow_1.defineQuery)('outboxLocked');
35
+ /** Set the paused state for the session (ensemble-wide pause/resume). */
36
+ exports.setPausedSignal = (0, workflow_1.defineSignal)('setPaused');
37
+ /** Query whether the session is paused. */
38
+ exports.pausedQuery = (0, workflow_1.defineQuery)('paused');
39
+ // ── Conductor Signals ──
40
+ exports.commandSignal = (0, workflow_1.defineSignal)('command');
41
+ exports.playerReportSignal = (0, workflow_1.defineSignal)('playerReport');
42
+ // ── Conductor Queries ──
43
+ exports.historyQuery = (0, workflow_1.defineQuery)('history');
44
+ // ── Processing Lifecycle (fixes #99; phase machine hook in v0.25) ──
45
+ // Suppress stale detection while the adapter is in a blocking operation (e.g. LLM tool call).
46
+ // `messageId` is required for idempotency — at-least-once update retries otherwise corrupt the set.
47
+ //
48
+ // v0.25 extends the input to carry `expectedAttachmentId` and the return to carry
49
+ // `inFlightCount`. The MVP shape (`{ messageId }`, `void`) remains supported by the
50
+ // compat shim; when `expectedAttachmentId` is absent the handler operates on whatever
51
+ // attachment is currently active (reconstructing MVP semantics).
52
+ //
53
+ // Post-PR-C, adapters always provide `expectedAttachmentId` so the workflow can reject
54
+ // updates intended for a superseded attachment.
55
+ /** Signal that the adapter has started processing an inbound message (blocking LLM/tool call). */
56
+ exports.processingStartUpdate = (0, workflow_1.defineUpdate)('processingStart');
57
+ /** Signal that the adapter has finished processing an inbound message. */
58
+ exports.processingEndUpdate = (0, workflow_1.defineUpdate)('processingEnd');
59
+ /** Query currently in-flight message IDs. */
60
+ exports.inFlightMessagesQuery = (0, workflow_1.defineQuery)('inFlightMessages');
61
+ // ── Destroy Verb (fixes #102; terminal per §8.5) ──
62
+ // Permanent, terminal teardown. Once destroyed, the workflow refuses all attach-adjacent ops
63
+ // and adapters (bridge) must exit cleanly instead of reconnecting.
64
+ /** Destroy the session: abandon in-flight outbox per §2.5, emit audit event, COMPLETE. */
65
+ exports.destroyUpdate = (0, workflow_1.defineUpdate)('destroy');
66
+ /** Query whether the session has been destroyed. */
67
+ exports.isDestroyedQuery = (0, workflow_1.defineQuery)('isDestroyed');
68
+ // ── v0.25 Attachment Lifecycle (design §§8, §9.2, §11.1) ──
69
+ /**
70
+ * Transactionally claim or renew the attachment lease on this workflow.
71
+ *
72
+ * - **First claim**: `expectedAttachmentId` absent, no live attachment → fresh `Attachment`
73
+ * created, phase `booting → attached` (or `detached → attached`).
74
+ * - **Renewal**: `expectedAttachmentId` matches current attachment AND lease not expired
75
+ * → extend `expiresAt` and `lastHeartbeatAt`. Returns same token.
76
+ * - **Conflict**: live attachment held by a different claimant → rejects with
77
+ * `AttachmentConflict` ApplicationFailure.
78
+ * - **WorkflowGone**: phase is `gone` → rejects with `WorkflowGone`.
79
+ */
80
+ exports.claimAttachmentUpdate = (0, workflow_1.defineUpdate)('claimAttachment');
81
+ /**
82
+ * Revoke the current attachment. Options for drain-grace behavior during `draining` phase.
83
+ * Returns `{ reaped: true }` when a live attachment was revoked, `{ reaped: false }` when
84
+ * already detached (idempotent).
85
+ */
86
+ exports.forceDetachUpdate = (0, workflow_1.defineUpdate)('forceDetach');
87
+ /**
88
+ * Queue a spawn-outbox entry carrying the claim token. Called by `restart` after a successful
89
+ * `claimAttachment`. Workflow-side spawn-failure rollback lives in §8.4.
90
+ */
91
+ exports.enqueueSpawnUpdate = (0, workflow_1.defineUpdate)('enqueueSpawn');
92
+ /** Record a preferred host for daemon reconcile-on-boot targeting. */
93
+ exports.setPreferredHostUpdate = (0, workflow_1.defineUpdate)('setPreferredHost');
94
+ // ── v0.25 Attachment Signals ──
95
+ /**
96
+ * Liveness heartbeat from the adapter. Resets `lastHeartbeatAt` and extends `expiresAt` to
97
+ * `workflow.now() + leaseMs` iff `attachmentId` matches the current attachment; otherwise ignored.
98
+ */
99
+ exports.heartbeatSignal = (0, workflow_1.defineSignal)('heartbeat');
100
+ /**
101
+ * Adapter-, conductor-, or operator-initiated request to detach gracefully.
102
+ * Phase transitions to `draining`; outbox continues to drain up to `deadlineMs` then
103
+ * the main loop reaps.
104
+ */
105
+ exports.requestDetachSignal = (0, workflow_1.defineSignal)('requestDetach');
106
+ /**
107
+ * Final acknowledgement from a detaching adapter. Collapses `draining → detached` immediately
108
+ * if `attachmentId` matches the current attachment; ignored on `detached` (no-op).
109
+ */
110
+ exports.adapterExitedSignal = (0, workflow_1.defineSignal)('adapterExited');
111
+ // ── v0.25 Attachment Queries ──
112
+ /** Current attachment state + phase + in-flight count. Read by adapters, tools, and the TUI. */
113
+ exports.attachmentInfoQuery = (0, workflow_1.defineQuery)('attachmentInfo');
114
+ /**
115
+ * Daemon and CLI `restore` summary — metadata to render a detached-orphan card and decide
116
+ * whether auto-restore applies.
117
+ */
118
+ exports.orphanSummaryQuery = (0, workflow_1.defineQuery)('orphanSummary');
119
+ // ── Player Saveable State (#334 PR-1, ADR 0011) ──
120
+ //
121
+ // Per-session, player-curated state slots. Player-only writes (no `playerId`
122
+ // arg → tool wires the calling player's own handle); peer reads via
123
+ // `playerStateQuery`. Sized per design §3.3: max 4 slots × 32 KiB content
124
+ // = 128 KiB structural max. Saturation rejects with `PlayerStateSlotsFull`
125
+ // rather than evicting LRU.
126
+ //
127
+ // Validators run pre-handler so size/slot-cap rejections never commit
128
+ // history events. See `src/utils/validation.ts` for the constants.
129
+ /**
130
+ * Save curated state for the calling player into a named slot.
131
+ *
132
+ * Validation (pre-handler):
133
+ * - `key` matches `PLAYER_STATE_KEY_REGEX` (alphanumeric + underscore + hyphen,
134
+ * 1–32 chars). `PlayerStateInvalidKey` on mismatch.
135
+ * - `content` byte length ≤ `PLAYER_STATE_CONTENT_MAX` (32 KiB).
136
+ * `PlayerStateContentTooLarge` on overflow.
137
+ * - When the key is new and slots already at `PLAYER_STATE_SLOTS_MAX` (4),
138
+ * rejects with `PlayerStateSlotsFull` and lists existing keys so the LLM
139
+ * can pick which slot to clear.
140
+ *
141
+ * On success, writes `{ content, savedAt: workflowNow().toISOString(), savedBy }`
142
+ * to `playerState[key]`. Carried via `continueAsNew`.
143
+ */
144
+ exports.savePlayerStateUpdate = (0, workflow_1.defineUpdate)('savePlayerState');
145
+ /**
146
+ * Clear the named slot. Returns `{ cleared: true }` if the slot existed,
147
+ * `{ cleared: false }` if it was already empty (idempotent). Validates `key`
148
+ * against `PLAYER_STATE_KEY_REGEX`.
149
+ */
150
+ exports.clearPlayerStateUpdate = (0, workflow_1.defineUpdate)('clearPlayerState');
151
+ /**
152
+ * Read the named slot. Returns `null` when the slot is empty.
153
+ * `key` defaults to `PLAYER_STATE_DEFAULT_KEY` ('main').
154
+ *
155
+ * Peer-readable: any player in the ensemble may query any other player's
156
+ * saved state (audit identity is the entry's `savedBy`). Mirrors the
157
+ * `recall`/`attachment_info` ergonomics.
158
+ */
159
+ exports.playerStateQuery = (0, workflow_1.defineQuery)('playerState');
160
+ /** List names of populated slots (sorted). Returns `[]` when no slots are saved. */
161
+ exports.playerStateKeysQuery = (0, workflow_1.defineQuery)('playerStateKeys');
162
+ // ── Outbox Update + Query ──
163
+ exports.submitOutboxUpdate = (0, workflow_1.defineUpdate)('submitOutbox');
164
+ exports.outboxQuery = (0, workflow_1.defineQuery)('outbox');
165
+ // ── #399 W2 — Session wire extensions (Q5.2 / Q5.5 / Q5.6 / Q5.7) ──
166
+ //
167
+ // Additive queries that surface session-level fields the dashboard
168
+ // renders as `"—"` placeholders today. All counters live on the session
169
+ // workflow + carry across continueAsNew via SessionInput.
170
+ /**
171
+ * Q5.2 — runId of the current workflow execution. Returned as the raw
172
+ * UUID string from `workflowInfo().runId`; the dashboard truncates to
173
+ * `XXXX·XXXX` (first 4 + last 4 + middle dot) client-side so this query
174
+ * stays a thin pass-through.
175
+ */
176
+ exports.getRunIdQuery = (0, workflow_1.defineQuery)('getRunId');
177
+ /**
178
+ * Q5.5 — messaging counters + outbox status summary. The dashboard
179
+ * renders three KV rows under `Messages`. Counters are monotonic
180
+ * across the workflow's lifetime (preserved across continueAsNew via
181
+ * SessionInput).
182
+ *
183
+ * `outbox` is a reduce-helper string: `"empty"` / `"N pending"` /
184
+ * `"N pending (oldest 2m)"` once the oldest pending entry is older than
185
+ * the stale threshold. Computing this server-side keeps the wire shape
186
+ * tight.
187
+ */
188
+ exports.getMessagingStateQuery = (0, workflow_1.defineQuery)('getMessagingState');
189
+ /**
190
+ * Q5.6 — activity counter + last-activity timestamp. Critical-path for
191
+ * W1's tempo computation: the maestro fan-queries this from each
192
+ * session to compute msgs/min buckets. `activityCount` increments at
193
+ * the same ~20 sites that already update `lastActivityTime` (cue,
194
+ * outbox push, schedule fire, report, recruit, restart, destroy,
195
+ * migrate, etc.). Heartbeats and lifecycle plumbing don't bump it.
196
+ *
197
+ * `lastActivityAt` is ISO so the maestro can compute clock-relative
198
+ * deltas without re-parsing.
199
+ */
200
+ exports.getActivityStateQuery = (0, workflow_1.defineQuery)('getActivityState');
201
+ /**
202
+ * Q5.7 — current attachment lease window. Returns `{ expiresAt,
203
+ * leaseMs }` as numbers (epoch ms / ms) so the dashboard can compute
204
+ * "expires in 54s" without parsing ISO strings every render. Both
205
+ * fields are `null` when no active lease (phase ∈ booting / detached /
206
+ * gone).
207
+ *
208
+ * The underlying `Attachment.expiresAt` is stored as an ISO string for
209
+ * historical reasons; the query handler parses to epoch ms at the
210
+ * boundary.
211
+ */
212
+ exports.getLeaseStateQuery = (0, workflow_1.defineQuery)('getLeaseState');
213
+ // ── Test-only Signals ──
214
+ //
215
+ // **Test-only.** Forces the session workflow's main loop to take the
216
+ // `continueAsNew` branch on its next iteration, regardless of
217
+ // `workflowInfo().continueAsNewSuggested`. Used by the adapter reconnect test
218
+ // (#226) to exercise the CAN-boundary rebind path without spamming ~10k
219
+ // history events to hit the server's native suggestion threshold.
220
+ //
221
+ // Production senders do not exist — the signal is a test fixture. Kept on the
222
+ // main signal surface (rather than a side channel) so the workflow worker
223
+ // bundle needs no special build flag to accept it. The wire name is a plain
224
+ // identifier so the wire-protocol drift detector can match it in the docs
225
+ // table (the doc regex in `test/wire-protocol.test.ts` only accepts
226
+ // identifier-shaped names to avoid picking up prose false positives).
227
+ exports.testForceContinueAsNewSignal = (0, workflow_1.defineSignal)('testForceContinueAsNew');
228
+ // ── Quality Gate Signals + Query (conductor-only) ──
229
+ exports.setQualityGateSignal = (0, workflow_1.defineSignal)('setQualityGate');
230
+ exports.evaluateGateCriteriaSignal = (0, workflow_1.defineSignal)('evaluateGateCriteria');
231
+ exports.qualityGatesQuery = (0, workflow_1.defineQuery)('qualityGates');
232
+ // ── Worktree Signals + Query (conductor-only) ──
233
+ exports.setWorktreeSignal = (0, workflow_1.defineSignal)('setWorktree');
234
+ exports.removeWorktreeSignal = (0, workflow_1.defineSignal)('removeWorktree');
235
+ exports.worktreesQuery = (0, workflow_1.defineQuery)('worktrees');
236
+ // ── Stage Signals + Query (conductor-only) ──
237
+ exports.setStageSignal = (0, workflow_1.defineSignal)('setStage');
238
+ exports.cancelStageSignal = (0, workflow_1.defineSignal)('cancelStage');
239
+ exports.stagesQuery = (0, workflow_1.defineQuery)('stages');
@@ -0,0 +1,56 @@
1
+ ---
2
+ name: tempo-composer
3
+ description: Software architect — designs system structure, defines interfaces, makes technology decisions. Focuses on the "what" and "why", not implementation.
4
+ model: opus
5
+ ---
6
+
7
+ You are the **Composer** of the ensemble — the Software Architect. You design the structure of the system: modules, boundaries, interfaces, data flow, and technical direction. You define *what* gets built and *why*, then hand off the *how* to soloists.
8
+
9
+ ## Responsibilities
10
+
11
+ - Design system architecture: module boundaries, service decomposition, data flow
12
+ - Define interfaces and contracts between components
13
+ - Make technology choices with clear rationale
14
+ - Analyze dependencies, coupling, and integration points
15
+ - Identify scalability, security, and maintainability risks before they become problems
16
+ - Review proposed designs and implementations for architectural consistency
17
+ - Select API paradigms (REST, GraphQL, RPC) based on use case requirements
18
+
19
+ ## Working Style
20
+
21
+ - **Understand before proposing**: Read existing code and architecture before suggesting changes. Respect what's already there.
22
+ - **Think in systems**: Focus on boundaries, trade-offs, and data flow — not individual functions.
23
+ - **Document decisions**: Every architectural decision should come with rationale and trade-offs considered. Write ADRs when the decision is significant.
24
+ - **Be opinionated but open**: Have strong views on architecture, loosely held. Change your mind when presented with evidence.
25
+ - **Delegate implementation**: Define the shape of the solution, then hand off to soloists. Don't get pulled into writing production code.
26
+ - **Consider observability**: Design systems that are debuggable. Think about logging, tracing, and error reporting from the start.
27
+ - **Don't over-architect**: Design the simplest structure that meets the known requirements. If you're adding abstraction layers without a concrete, present-tense benefit, remove them. Apply `/simplify` thinking — if a design element can't be justified by a real requirement, it doesn't belong.
28
+ - **Avoid designing for imagined futures**: Add extensibility only where there's evidence you'll need it. Speculative abstractions become maintenance burdens. You can always refactor when the need is real.
29
+
30
+ ## Ensemble Collaboration
31
+
32
+ - **`ensemble`**: Check who's active before proposing designs that affect multiple players' work. Understand the current state of implementation.
33
+ - **`cue`**: Use to share design decisions, interface definitions, and architectural guidance with soloists. When a soloist asks a design question, respond with structured reasoning: context, options, recommendation, trade-offs.
34
+ - **`report`**: Report to the conductor when:
35
+ - A design decision is made (so it can be communicated to affected players)
36
+ - You identify an architectural risk or concern
37
+ - You need input on requirements before you can finalize a design
38
+ - A design review is complete (with approve/reject/concerns)
39
+ - **`who_am_i`**: Check your assignment and any type-specific instructions at startup.
40
+ - **`agent_types`**: If you identify a need for a specialist (e.g., security review of your design), suggest the conductor recruit one.
41
+
42
+ ### When other players cue you
43
+
44
+ - **Soloists asking design questions**: Respond promptly with clear, actionable guidance. Don't send them in circles.
45
+ - **Conductor asking for design review**: Provide structured feedback — approved, changes requested, or concerns flagged — with specific reasoning.
46
+ - **Tuners reporting architectural test gaps**: Acknowledge and adjust the design to improve testability if needed.
47
+
48
+ ## Context Pressure
49
+
50
+ If you notice your context growing large, you're losing track of earlier instructions, or you find yourself repeating work, report to the conductor immediately with a structured summary:
51
+
52
+ 1. **Current task**: What you're working on right now
53
+ 2. **Key findings so far**: Important decisions, completed work, file paths changed
54
+ 3. **Recommended next steps**: What remains to be done
55
+
56
+ This lets the conductor refresh your session with a clean context while preserving continuity.