@chorus-aidlc/chorus 0.16.1 → 0.16.3

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 (351) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +450 -438
  3. package/.next/standalone/.next/app-path-routes-manifest.json +48 -48
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +18 -18
  6. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
  7. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +1 -1
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
  40. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +1 -1
  43. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
  46. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  50. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  51. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
  54. package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
  55. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/admin/companies.html +2 -2
  57. package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
  58. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/admin.html +2 -2
  60. package/.next/standalone/.next/server/app/admin.rsc +2 -2
  61. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/daemon/control/route.js +1 -1
  82. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js +1 -1
  88. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -1
  90. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
  93. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  107. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/mcp/route.js +4 -4
  116. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  146. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  149. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
  159. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  165. package/.next/standalone/.next/server/app/index.html +2 -2
  166. package/.next/standalone/.next/server/app/index.rsc +2 -2
  167. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  168. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  169. package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
  170. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  171. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  172. package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
  173. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  175. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  176. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
  177. package/.next/standalone/.next/server/app/login.html +2 -2
  178. package/.next/standalone/.next/server/app/login.rsc +2 -2
  179. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  180. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  181. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  183. package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
  184. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  185. package/.next/standalone/.next/server/app/projects.html +2 -2
  186. package/.next/standalone/.next/server/app/projects.rsc +4 -4
  187. package/.next/standalone/.next/server/app/settings.html +2 -2
  188. package/.next/standalone/.next/server/app/settings.rsc +4 -4
  189. package/.next/standalone/.next/server/app-paths-manifest.json +48 -48
  190. package/.next/standalone/.next/server/chunks/1114.js +1 -1
  191. package/.next/standalone/.next/server/chunks/1318.js +1 -1
  192. package/.next/standalone/.next/server/chunks/1559.js +2 -2
  193. package/.next/standalone/.next/server/chunks/2572.js +1 -1
  194. package/.next/standalone/.next/server/chunks/2618.js +1 -1
  195. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  196. package/.next/standalone/.next/server/chunks/3594.js +1 -1
  197. package/.next/standalone/.next/server/chunks/4394.js +1 -1
  198. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  199. package/.next/standalone/.next/server/chunks/5351.js +1 -1
  200. package/.next/standalone/.next/server/chunks/{2547.js → 5489.js} +5 -5
  201. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  202. package/.next/standalone/.next/server/chunks/6506.js +3 -3
  203. package/.next/standalone/.next/server/chunks/6515.js +2 -2
  204. package/.next/standalone/.next/server/chunks/6667.js +1 -1
  205. package/.next/standalone/.next/server/chunks/6995.js +1 -1
  206. package/.next/standalone/.next/server/chunks/7364.js +1 -1
  207. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  208. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  209. package/.next/standalone/.next/server/chunks/8044.js +1 -0
  210. package/.next/standalone/.next/server/chunks/8454.js +1 -1
  211. package/.next/standalone/.next/server/chunks/920.js +1 -1
  212. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  213. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  214. package/.next/standalone/.next/server/chunks/951.js +1 -1
  215. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  216. package/.next/standalone/.next/server/middleware-manifest.json +1 -1
  217. package/.next/standalone/.next/server/pages/404.html +2 -2
  218. package/.next/standalone/.next/server/pages/500.html +1 -1
  219. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  220. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  221. package/.next/standalone/.next/static/chunks/11595.97e534422c57aee1.js +1 -0
  222. package/.next/standalone/.next/static/chunks/17099-936da9caf4c119b8.js +1 -0
  223. package/.next/standalone/.next/static/chunks/18609-6c859f756d530e94.js +1 -0
  224. package/.next/standalone/.next/static/chunks/19887-c0bb297a78a1c7cd.js +1 -0
  225. package/.next/standalone/.next/static/chunks/20204-90d655ea14281e10.js +1 -0
  226. package/.next/standalone/.next/static/chunks/{53402-a54163001f3d953a.js → 27370-c056dee2016c9124.js} +1 -1
  227. package/.next/standalone/.next/static/chunks/{29108-e171d8b8c680cbb5.js → 29108-5a11eea003f4cc11.js} +1 -1
  228. package/.next/standalone/.next/static/chunks/29305-f587e7e81bc0b200.js +10 -0
  229. package/.next/standalone/.next/static/chunks/{31308-bb4a97b3f39c22dd.js → 31308-fda6febfb2882a28.js} +1 -1
  230. package/.next/standalone/.next/static/chunks/33456.6dc44a6aca1a01fd.js +1 -0
  231. package/.next/standalone/.next/static/chunks/35432-5c245212c7595169.js +1 -0
  232. package/.next/standalone/.next/static/chunks/45024-eb7c062d13d9fe08.js +1 -0
  233. package/.next/standalone/.next/static/chunks/46294-6ae5bd0480b1820f.js +1 -0
  234. package/.next/standalone/.next/static/chunks/4860.7873ebc9ba435c8c.js +1 -0
  235. package/.next/standalone/.next/static/chunks/53073-a7ed20af6538a178.js +1 -0
  236. package/.next/standalone/.next/static/chunks/65096-f756aac39efad7a3.js +1 -0
  237. package/.next/standalone/.next/static/chunks/6603-e70ddeab6ad09c50.js +1 -0
  238. package/.next/standalone/.next/static/chunks/67580-8733964ab2c7fc0e.js +1 -0
  239. package/.next/standalone/.next/static/chunks/7777-8b1b6681256e1534.js +1 -0
  240. package/.next/standalone/.next/static/chunks/78917-1b59cbb806b3ecfc.js +1 -0
  241. package/.next/standalone/.next/static/chunks/82751-3e161e1d8dbda3ac.js +1 -0
  242. package/.next/standalone/.next/static/chunks/94643-01be319472d751b3.js +1 -0
  243. package/.next/standalone/.next/static/chunks/99373.d0e808c18408b8da.js +1 -0
  244. package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-3d3b3b9e16c03cda.js → layout-b742c51c0a764daf.js} +1 -1
  245. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-974781e4886529f8.js +1 -0
  246. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-69d746c98079024d.js → page-f636e00c28f425ea.js} +1 -1
  247. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c004f1a194af7fa5.js +1 -0
  248. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-425acbe9ade5fa83.js +1 -0
  249. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-8119df915138a9c3.js → page-fdd617457730a116.js} +1 -1
  250. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-6b3fb08d53826d02.js +1 -0
  251. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0a6c2d0e1b68e0e4.js +1 -0
  252. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-58b48aa0a11603c3.js +1 -0
  253. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-286faced32c6133f.js +1 -0
  254. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-7a5ef281f6819ed4.js → page-9d79e285b6fd2f8d.js} +1 -1
  255. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-1507a761e67c2aa9.js +1 -0
  256. package/.next/standalone/.next/static/chunks/app/onboarding/page-5c82cf3abd856301.js +1 -0
  257. package/.next/standalone/.next/static/chunks/f5a9da1f-6abf712b3f684cf9.js +1 -0
  258. package/.next/standalone/.next/static/chunks/{webpack-dec1f54ebb9bf963.js → webpack-fa066d7ff9ab2b29.js} +1 -1
  259. package/.next/standalone/.next/static/css/5f52bd39b284ccdf.css +1 -0
  260. package/.next/standalone/package.json +3 -1
  261. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  262. package/.next/standalone/public/chorus-plugin/agents/code-reviewer.md +1 -1
  263. package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +1 -0
  264. package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +2 -0
  265. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  266. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +4 -3
  267. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
  268. package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
  269. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +5 -4
  270. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
  271. package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +128 -0
  272. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
  273. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  274. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  275. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
  276. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-code-reviewer.json +1 -1
  277. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json +1 -1
  278. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-task-reviewer.json +1 -1
  279. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  280. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
  281. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
  282. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +5 -4
  283. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +1 -1
  284. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +128 -0
  285. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
  286. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
  287. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
  288. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +1 -1
  289. package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +4 -3
  290. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  291. package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
  292. package/.next/standalone/public/skill/chorus/SKILL.md +4 -3
  293. package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +2 -2
  294. package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
  295. package/.next/standalone/public/skill/docs-chorus/SKILL.md +1 -1
  296. package/.next/standalone/public/skill/idea-chorus/SKILL.md +5 -4
  297. package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +128 -0
  298. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
  299. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +2 -1
  300. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
  301. package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
  302. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +2 -1
  303. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
  304. package/README.ja.md +26 -346
  305. package/README.ko.md +28 -347
  306. package/README.md +33 -353
  307. package/README.zh.md +31 -328
  308. package/cli/control-handler.mjs +13 -3
  309. package/cli/daemon-rest-client.mjs +11 -3
  310. package/cli/daemon.mjs +52 -10
  311. package/cli/event-router.mjs +17 -5
  312. package/cli/prompts.mjs +129 -4
  313. package/cli/turn-reporter.mjs +5 -1
  314. package/cli/wake-queue.mjs +57 -35
  315. package/cli/waker.mjs +125 -36
  316. package/package.json +3 -1
  317. package/prisma/migrations/20260814101500_add_typed_assignment_provenance/migration.sql +2 -0
  318. package/prisma/schema.prisma +4 -2
  319. package/.next/standalone/.next/server/chunks/2463.js +0 -1
  320. package/.next/standalone/.next/static/chunks/11595.1bcd2b65089007ae.js +0 -1
  321. package/.next/standalone/.next/static/chunks/19887-4d76db57a7ce4437.js +0 -1
  322. package/.next/standalone/.next/static/chunks/22987-8fd965ab4ff87546.js +0 -1
  323. package/.next/standalone/.next/static/chunks/33456.c98d3e21528b61d8.js +0 -1
  324. package/.next/standalone/.next/static/chunks/38296-316ba18af72385fb.js +0 -1
  325. package/.next/standalone/.next/static/chunks/4340-a33120fb742af57e.js +0 -1
  326. package/.next/standalone/.next/static/chunks/4860.9122a86d33dc6b62.js +0 -1
  327. package/.next/standalone/.next/static/chunks/53073-5fd399cb25a11740.js +0 -1
  328. package/.next/standalone/.next/static/chunks/6603-07faab08560f7ecd.js +0 -1
  329. package/.next/standalone/.next/static/chunks/6698-1c55791b2d0820d5.js +0 -1
  330. package/.next/standalone/.next/static/chunks/75137-c9e8422c9d4e1f52.js +0 -1
  331. package/.next/standalone/.next/static/chunks/7777-5dad34f6bdc13482.js +0 -1
  332. package/.next/standalone/.next/static/chunks/78917-7354d3b6908da7d1.js +0 -1
  333. package/.next/standalone/.next/static/chunks/82751-de255af4418d53e4.js +0 -1
  334. package/.next/standalone/.next/static/chunks/83285-db8ae107944eb6df.js +0 -1
  335. package/.next/standalone/.next/static/chunks/86155-c9b7c2c08d3fa80e.js +0 -1
  336. package/.next/standalone/.next/static/chunks/89836-b5ab6a0b32c54f42.js +0 -1
  337. package/.next/standalone/.next/static/chunks/94426-39b6da238425f9b7.js +0 -10
  338. package/.next/standalone/.next/static/chunks/94643-90a9ec7b9a9abaf0.js +0 -1
  339. package/.next/standalone/.next/static/chunks/99373.585230dcb315a068.js +0 -1
  340. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-7462c5eb92130796.js +0 -1
  341. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-2af705f6c3789131.js +0 -1
  342. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-82404154708e48a9.js +0 -1
  343. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-f619bd65e1eed8c9.js +0 -1
  344. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-6abc7d1785e2b999.js +0 -1
  345. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-0789c6589363154c.js +0 -1
  346. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-a612f6fc5be0239d.js +0 -1
  347. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-5fb9fd3db155d5ca.js +0 -1
  348. package/.next/standalone/.next/static/chunks/app/onboarding/page-e85315278aafc300.js +0 -1
  349. package/.next/standalone/.next/static/css/67fba0943f494f0e.css +0 -1
  350. /package/.next/standalone/.next/static/{H92ZuhpmDWcL3WOfYRc-- → K8qIdwvKoIWbwQ_f01mnM}/_buildManifest.js +0 -0
  351. /package/.next/standalone/.next/static/{H92ZuhpmDWcL3WOfYRc-- → K8qIdwvKoIWbwQ_f01mnM}/_ssgManifest.js +0 -0
@@ -37,8 +37,8 @@ export class EventRouter {
37
37
  /**
38
38
  * @param {{
39
39
  * mcpClient: { callTool: (name: string, args?: Record<string, unknown>) => Promise<any> },
40
- * waker: { keyFor: (n: any) => Promise<{ key: string, rootIdeaUuid: string|null, directIdeaUuid: string|null }>, wake: (n: any, key: string, attribution?: any) => Promise<void>, markQueued?: (n: any, key: string, attribution?: any) => void },
41
- * queue: { enqueue: (key: string, task: () => Promise<void>) => void },
40
+ * waker: { keyFor: (n: any) => Promise<{ key: string, rootIdeaUuid: string|null, directIdeaUuid: string|null }>, wakeBatch: (ns: any[], key: string, attribution?: any) => Promise<void>, markQueued?: (n: any, key: string, attribution?: any) => void },
41
+ * queue: { enqueue: (key: string, item: { notification: any, attribution: any }) => void },
42
42
  * wakeActions: Set<string>,
43
43
  * getConnectionUuid?: () => (string|null), This daemon's registered connection uuid
44
44
  * (null until the SSE handshake reports it).
@@ -228,7 +228,8 @@ export class EventRouter {
228
228
  * reason ("user" | "crash") threaded from the control event; it is stamped on the
229
229
  * synthetic notification as `resumedFrom` so the prompt builder can state a crash
230
230
  * explicitly. Absent/unknown → not stamped → the user-resume prompt.
231
- * @param {{ entityType?: string, entityUuid?: string, resumeReason?: string }} target
231
+ * @param {{ entityType?: string, entityUuid?: string, resumeReason?: string,
232
+ * orchestrator?: { type?: string, uuid?: string, name?: string } | null }} target
232
233
  */
233
234
  dispatchResume(target) {
234
235
  const entityType = target?.entityType;
@@ -247,6 +248,11 @@ export class EventRouter {
247
248
  entityUuid,
248
249
  ...(resumedFrom ? { resumedFrom } : {}),
249
250
  ...(typeof target?.runtimeCwd === "string" ? { runtimeCwd: target.runtimeCwd } : {}),
251
+ ...(target?.orchestrator?.type === "agent" &&
252
+ typeof target.orchestrator.uuid === "string" &&
253
+ typeof target.orchestrator.name === "string"
254
+ ? { orchestrator: target.orchestrator }
255
+ : {}),
250
256
  };
251
257
  this.#resolveAndEnqueue(n, `resume:${entityType}:${entityUuid}`).catch((err) => {
252
258
  this.logger.error(`[Chorus] failed to dispatch resume for ${entityType}:${entityUuid}: ${err}`);
@@ -383,7 +389,10 @@ export class EventRouter {
383
389
  } catch (err) {
384
390
  this.logger.warn(`[Chorus] markQueued failed for pending turn ${turnUuid}: ${err}`);
385
391
  }
386
- this.queue.enqueue(key, () => this.waker.wake(n, key, attribution));
392
+ // Enqueue an opaque DATA payload (add-daemon-wake-coalescing §C4), NOT a thunk: the
393
+ // queue coalesces all same-key pending items and hands the whole batch to its runBatch
394
+ // (wired to waker.wakeBatch in daemon.mjs). markQueued was already called per-item above.
395
+ this.queue.enqueue(key, { notification: n, attribution });
387
396
  }
388
397
 
389
398
  /**
@@ -531,6 +540,9 @@ export class EventRouter {
531
540
  } catch (err) {
532
541
  this.logger.warn(`[Chorus] markQueued failed for ${label}: ${err}`);
533
542
  }
534
- this.queue.enqueue(key, () => this.waker.wake(n, key, attribution));
543
+ // Enqueue an opaque DATA payload (add-daemon-wake-coalescing §C4), NOT a thunk: the
544
+ // queue coalesces all same-key pending items and hands the whole batch to its runBatch
545
+ // (wired to waker.wakeBatch in daemon.mjs). markQueued was already called per-item above.
546
+ this.queue.enqueue(key, { notification: n, attribution });
535
547
  }
536
548
  }
package/cli/prompts.mjs CHANGED
@@ -25,6 +25,7 @@
25
25
  * @property {string} actorType
26
26
  * @property {string} actorUuid
27
27
  * @property {string} actorName
28
+ * @property {{type: string, uuid: string, name: string} | null} [orchestrator]
28
29
  * @property {string} [instructionText] Free-text body of a `human_instruction` wake
29
30
  * (子1 — daemon-session-conversation). The server denormalizes the canonical turn
30
31
  * promptText onto the wake notification so the daemon reads it in the
@@ -40,6 +41,29 @@ function mentionGuidance(n, entityType) {
40
41
  );
41
42
  }
42
43
 
44
+ /**
45
+ * Orchestrator-handoff guidance, appended to every wake body by buildPrompt. This is
46
+ * the SINGLE home of the "hand back to the agent that dispatched you" instruction —
47
+ * it is runtime PE (it depends on who the wake resolved as orchestrator), so it lives
48
+ * here in the wake prompt, NOT in the static skill docs. Its OpenClaw twin is
49
+ * `buildOrchestratorGuidance` in packages/openclaw-plugin/src/event-router.ts —
50
+ * KEEP THE TWO WORDINGS IN SYNC.
51
+ * Returns null unless the resource has an AGENT orchestrator; a human-assigned
52
+ * resource hands back to the human via the per-event actor @mention (mentionGuidance).
53
+ * @param {NotificationDetail} n
54
+ */
55
+ function orchestratorGuidance(n) {
56
+ if (n.orchestrator?.type !== "agent") return null;
57
+ return (
58
+ `Your orchestrator for this resource is @${n.orchestrator.name}.\n` +
59
+ `At a human-only gate you cannot cross, or when this child resource is complete, hand control ` +
60
+ `back by commenting on the resource and mentioning ` +
61
+ `@[${n.orchestrator.name}](agent:${n.orchestrator.uuid}) with the decision needed or completion ` +
62
+ `evidence, then leave any human-gated resource pending and end the turn. Do not @mention the ` +
63
+ `orchestrator for ordinary internal progress.`
64
+ );
65
+ }
66
+
43
67
  /**
44
68
  * Shared headless preamble prepended to EVERY wake prompt (add-daemon-headless-
45
69
  * interaction-guard). A daemon-woken session is a headless `claude -p` run with no
@@ -96,7 +120,98 @@ export const HEADLESS_PREAMBLE = [
96
120
  export function buildPrompt(n) {
97
121
  const body = buildPromptBody(n);
98
122
  if (body == null) return null;
99
- return `${HEADLESS_PREAMBLE}\n\n${body}`;
123
+ const handoff = orchestratorGuidance(n);
124
+ return `${HEADLESS_PREAMBLE}\n\n${body}${handoff ? `\n\n${handoff}` : ""}`;
125
+ }
126
+
127
+ /**
128
+ * Build ONE combined wake prompt for a coalesced batch of same-session notifications
129
+ * (add-daemon-wake-coalescing, tech design §C2). The daemon serializes wakes per session
130
+ * key; while a turn runs, later same-key wakes pile up and — when the slot frees — are
131
+ * drained together into a single `claude --resume` turn. This composes their one prompt.
132
+ *
133
+ * Rules:
134
+ * - **Size 1** → delegate to `buildPrompt(n)` verbatim, so the single-event path is
135
+ * BYTE-IDENTICAL to today (and all current prompt tests keep passing). This is keyed on
136
+ * the count of RENDERABLE events (non-null body): a batch that reduces to a single
137
+ * renderable event — e.g. a real wake plus an empty `human_instruction` — also takes
138
+ * the single-event path.
139
+ * - **Size > 1 renderable** → `HEADLESS_PREAMBLE` ONCE (it is a per-turn guard, paid once
140
+ * per turn, not per event), then a short backlog preamble, then one labeled block per
141
+ * event in ARRIVAL order, each block being the reused per-action `buildPromptBody(n)` so
142
+ * every event keeps its own tool hints and @mention guidance.
143
+ * - **Same-entity collapse (Q2)**: events sharing `(action, entityUuid)` collapse into one
144
+ * block at the group's FIRST-SEEN position, noting the occurrence count and showing the
145
+ * NEWEST message. This is safe only because such actions' full content is re-derivable
146
+ * server-side (comments via chorus_get_comments, task lifecycle via chorus_get_*).
147
+ * - **`human_instruction` is NEVER collapsed (Q3, Round-1 BLOCKER-2)**: every queued chat
148
+ * message carries `action=human_instruction` and `entityUuid=directIdeaUuid`, and its
149
+ * text lives ONLY on the turn/notification (not re-fetchable), so collapsing to
150
+ * newest-only would silently drop earlier chat and defeat the feature. Each renders its
151
+ * full body as its own block, in arrival order.
152
+ * - Events whose body is null (empty `human_instruction`, non-wake action) are omitted; a
153
+ * batch with no renderable event returns null (the router then spawns nothing).
154
+ *
155
+ * @param {NotificationDetail[]} notifications Arrival-ordered batch (FIFO drain order).
156
+ * @returns {string | null}
157
+ */
158
+ export function buildBatchPrompt(notifications) {
159
+ if (!Array.isArray(notifications) || notifications.length === 0) return null;
160
+
161
+ // Keep only events with a renderable per-action body, in arrival order.
162
+ const items = [];
163
+ for (const n of notifications) {
164
+ const body = buildPromptBody(n);
165
+ if (body != null) items.push({ n, body });
166
+ }
167
+ if (items.length === 0) return null;
168
+ // One renderable event → byte-identical single-event prompt (delegates to buildPrompt so
169
+ // the exact "PREAMBLE\n\nbody" shape is preserved). Covers a true batch of size 1 and a
170
+ // batch that reduced to one renderable event after null-body events were dropped.
171
+ if (items.length === 1) return buildPrompt(items[0].n);
172
+
173
+ // Group into ordered blocks. Collapsible actions merge by (action, entityUuid) at their
174
+ // first-seen slot; human_instruction is exempt and always gets its own block.
175
+ const blocks = [];
176
+ const collapseIndex = new Map(); // "action::entityUuid" -> index into `blocks`
177
+ for (const { n, body } of items) {
178
+ if (n.action === "human_instruction") {
179
+ blocks.push({ notif: n, body, count: 1 });
180
+ continue;
181
+ }
182
+ const groupKey = `${n.action}::${n.entityUuid ?? ""}`;
183
+ const existing = collapseIndex.get(groupKey);
184
+ if (existing != null) {
185
+ const g = blocks[existing];
186
+ g.count += 1;
187
+ g.notif = n; // newest wins (arrival order → last member is newest)
188
+ g.body = body; // newest body
189
+ } else {
190
+ collapseIndex.set(groupKey, blocks.length);
191
+ blocks.push({ notif: n, body, count: 1 });
192
+ }
193
+ }
194
+
195
+ // Backlog preamble. N = number of renderable events that arrived (not the collapsed block
196
+ // count) — collapse is a rendering optimization; each collapsed block states its own count.
197
+ const backlogPreamble =
198
+ `You have ${items.length} queued Chorus events on this session that arrived while you ` +
199
+ `were busy — handle them together, in order; each is labeled with its type below.`;
200
+
201
+ const rendered = blocks.map((g, idx) => {
202
+ const n = g.notif;
203
+ const entityType = n.entityType || "session";
204
+ const entityUuid = n.entityUuid || "";
205
+ const header = `### Event ${idx + 1} — ${n.action} on ${entityType} ${entityUuid}`.replace(/\s+$/, "");
206
+ const collapseNote =
207
+ g.count > 1
208
+ ? `\n(${g.count} ${n.action} events on this ${entityType} arrived — showing the newest ` +
209
+ `below; earlier ones are re-derivable via the entity's own chorus_get_* tools.)`
210
+ : "";
211
+ return `${header}${collapseNote}\n\n${g.body}`;
212
+ });
213
+
214
+ return [HEADLESS_PREAMBLE, backlogPreamble, ...rendered].join("\n\n");
100
215
  }
101
216
 
102
217
  /**
@@ -205,10 +320,20 @@ function buildPromptBody(n) {
205
320
  );
206
321
  }
207
322
  case "idea_claimed":
323
+ // The assignment ALREADY set you as the assignee, so there is nothing to claim —
324
+ // chorus_claim_idea would throw (AlreadyClaimedError, and a hard "Cannot claim an
325
+ // elaborated Idea" for the elaborated-backfill case). Do NOT emit a claim
326
+ // instruction here (a prompt test asserts the literal never appears). Instead tell
327
+ // the already-assigned agent to review and advance from the idea's CURRENT stage,
328
+ // stopping at the human proposal/verify gates. Names the assigner via n.actorName /
329
+ // n.actorType (already on the notification — no server change). Mirrored in the
330
+ // OpenClaw twin handleIdeaClaimed (event-router.ts) — KEEP THE TWO WORDINGS IN SYNC.
208
331
  return (
209
- `[Chorus] Idea '${n.entityTitle}' was assigned to you (ideaUuid: ${n.entityUuid}, ` +
210
- `projectUuid: ${n.projectUuid}). Use chorus_get_idea to review it, then claim it ` +
211
- `(chorus_claim_idea) to begin elaboration.\n${mentionGuidance(n, "idea")}`
332
+ `[Chorus] Idea '${n.entityTitle}' was assigned to you by ${n.actorName} (${n.actorType}) ` +
333
+ `(ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). You are now the assignee no need ` +
334
+ `to claim it. Use chorus_get_idea to review it, then advance it from its CURRENT stage: if it is ` +
335
+ `still elaborating, run or continue elaboration; if it is already elaborated, author the proposal. ` +
336
+ `Stop at the human proposal/verify gates and never merge automatically.\n${mentionGuidance(n, "idea")}`
212
337
  );
213
338
  case "task_reopened":
214
339
  return (
@@ -52,7 +52,7 @@ export const TURN_INTERRUPT_REASONS = new Set([
52
52
  * logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
53
53
  * fetchImpl?: typeof fetch, Injectable for tests.
54
54
  * }} opts
55
- * @returns {(params: { sessionId: string, status: "running"|"ended"|"interrupted", entityType?: string|null, entityUuid?: string|null, interruptedReason?: "user"|"crash"|"shutdown"|"invalid_path"|null, transcriptRelayError?: string|null, usage?: import("./upload-hooks.mjs").TokenUsage|null }) => Promise<void>}
55
+ * @returns {(params: { sessionId: string, status: "running"|"ended"|"interrupted", entityType?: string|null, entityUuid?: string|null, interruptedReason?: "user"|"crash"|"shutdown"|"invalid_path"|null, transcriptRelayError?: string|null, usage?: import("./upload-hooks.mjs").TokenUsage|null, coalescedCount?: number }) => Promise<void>}
56
56
  */
57
57
  export function createTurnReporter(opts) {
58
58
  const logger = opts.logger ?? NOOP_LOGGER;
@@ -76,6 +76,7 @@ export function createTurnReporter(opts) {
76
76
  transcriptRelayError,
77
77
  usage,
78
78
  backendSessionId,
79
+ coalescedCount,
79
80
  }) {
80
81
  if (typeof sessionId !== "string" || !sessionId || !TURN_STATUSES.has(status)) {
81
82
  logger.warn(
@@ -111,6 +112,9 @@ export function createTurnReporter(opts) {
111
112
  // only on a terminal edge. No validation here — usage is an opaque nested object.
112
113
  usage,
113
114
  backendSessionId,
115
+ // Coalesced-wake count (add-daemon-wake-coalescing): threaded straight through; the
116
+ // client sends it only on the → running edge and only when > 1 (a single wake omits it).
117
+ coalescedCount,
114
118
  });
115
119
  };
116
120
  }
@@ -1,14 +1,22 @@
1
1
  // cli/wake-queue.mjs
2
- // Per-key FIFO scheduler with a global concurrency cap. This is what makes the
3
- // idea_root session anchor safe (cli-daemon spec "Per-root-idea wake
4
- // serialization", design.md "Concurrency model"):
5
- // within one key (root idea) strictly serial, FIFO. The 2nd wake waits
6
- // for the 1st subprocess to exit, so we never run two
2
+ // Per-key FIFO scheduler with a global concurrency cap, coalescing same-key
3
+ // wakes into batches. This is what makes the idea_root session anchor safe
4
+ // (cli-daemon spec "Per-root-idea wake serialization", design.md "Concurrency
5
+ // model") AND implements daemon-wake-coalescing (design.md §C1):
6
+ // within one key (root idea) → strictly serial, FIFO. The next batch waits
7
+ // for the current runBatch to settle, so we never run two
7
8
  // `claude --resume <sameSessionId>` against one session.
9
+ // • coalescing: when a key's slot frees, the ENTIRE pending array for that key
10
+ // is drained (splice) and delivered to runBatch ONCE as a single batch. So
11
+ // N events that pile up while the previous turn runs become ONE turn.
12
+ // Natural batching only — NO debounce/collect timer, NO batch-size cap.
8
13
  // • across keys → concurrent, bounded by maxConcurrency.
9
14
  // • enqueue() returns immediately — never blocks the SSE loop.
10
- // • a task that throws is logged and the next task for that key proceeds (a
11
- // poisoned wake must not wedge the key's queue forever).
15
+ // • a batch whose runBatch throws is logged and the next batch for that key
16
+ // proceeds (a poisoned wake must not wedge the key's queue forever).
17
+ // The queue carries opaque DATA items (the router passes `{ notification,
18
+ // attribution }`); it never introspects them — the runBatch callback (supplied
19
+ // at construction, wired to waker.wakeBatch in daemon.mjs) does.
12
20
  // Plain ESM, zero deps, in-memory.
13
21
 
14
22
  const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
@@ -18,41 +26,49 @@ export class WakeQueue {
18
26
  * @param {{
19
27
  * maxConcurrency?: number,
20
28
  * logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
29
+ * runBatch?: (key: string, items: any[]) => Promise<void>,
21
30
  * }} [opts]
22
31
  */
23
32
  constructor(opts = {}) {
24
33
  this.maxConcurrency = opts.maxConcurrency ?? 4;
25
34
  this.logger = opts.logger ?? NOOP_LOGGER;
26
- /** @type {Map<string, Array<() => Promise<void>>>} pending tasks per key. */
35
+ // The batch runner: called ONCE per drained batch with every pending item
36
+ // for the key. Defaults to a no-op so an unwired queue never throws (the
37
+ // daemon always supplies the real waker.wakeBatch runner).
38
+ this.runBatch = opts.runBatch ?? (async () => {});
39
+ /** @type {Map<string, any[]>} pending data items per key. */
27
40
  this.pending = new Map();
28
- /** @type {Set<string>} keys with a task currently running. */
41
+ /** @type {Set<string>} keys with a batch currently running. */
29
42
  this.running = new Set();
30
43
  /** @type {string[]} keys waiting for a global concurrency slot. */
31
44
  this.readyKeys = [];
32
45
  this.activeCount = 0;
33
- // Graceful-shutdown latch: once set, #pump starts NOTHING new — in-flight tasks
34
- // finish (drain observes them) but queued work stays queued and dies with the
35
- // process. Never cleared; a stopping queue is on its way out.
46
+ // Graceful-shutdown latch: once set, #pump starts NOTHING new — in-flight
47
+ // batches finish (drain observes them) but queued work stays queued and dies
48
+ // with the process. Never cleared; a stopping queue is on its way out.
36
49
  this.stopped = false;
37
50
  }
38
51
 
39
- /** Stop starting new tasks (graceful shutdown). In-flight tasks are unaffected. */
52
+ /** Stop starting new batches (graceful shutdown). In-flight batches are unaffected. */
40
53
  stop() {
41
54
  this.stopped = true;
42
55
  }
43
56
 
44
57
  /**
45
- * Enqueue a wake task under a key. Returns immediately. The task is a thunk
46
- * returning a promise (the actual wake). Same key serialized; different
47
- * keys concurrent up to maxConcurrency.
58
+ * Enqueue an opaque data item under a key. Returns immediately. Items on the
59
+ * same key coalesce: while a key's batch runs, later items pile up and are
60
+ * drained together as ONE batch when the slot frees. Different keys run
61
+ * concurrently up to maxConcurrency.
48
62
  * @param {string} key
49
- * @param {() => Promise<void>} task
63
+ * @param {any} item opaque data (e.g. `{ notification, attribution }`)
50
64
  */
51
- enqueue(key, task) {
65
+ enqueue(key, item) {
52
66
  if (!this.pending.has(key)) this.pending.set(key, []);
53
- this.pending.get(key).push(task);
67
+ this.pending.get(key).push(item);
54
68
  // A key becomes "ready" to claim a global slot only when it's not already
55
- // running (serial-per-key) and not already queued for a slot.
69
+ // running (serial-per-key) and not already queued for a slot. While it IS
70
+ // running, later items simply accumulate in `pending` and are picked up by
71
+ // the next batch — this is where coalescing happens.
56
72
  if (!this.running.has(key) && !this.readyKeys.includes(key)) {
57
73
  this.readyKeys.push(key);
58
74
  }
@@ -65,7 +81,7 @@ export class WakeQueue {
65
81
  }
66
82
 
67
83
  /**
68
- * Snapshot of the keys with a task currently running (observability read).
84
+ * Snapshot of the keys with a batch currently running (observability read).
69
85
  * Returns a fresh array so a caller can't mutate the internal Set.
70
86
  * @returns {string[]}
71
87
  */
@@ -74,7 +90,7 @@ export class WakeQueue {
74
90
  }
75
91
 
76
92
  /**
77
- * Snapshot of the keys that have at least one task still waiting to run —
93
+ * Snapshot of the keys that have at least one item still waiting to run —
78
94
  * i.e. enqueued but not yet started (observability read). A key that is
79
95
  * currently running with no further queued work is NOT pending. Returns a
80
96
  * fresh array so a caller can't mutate internal state.
@@ -85,13 +101,13 @@ export class WakeQueue {
85
101
  }
86
102
 
87
103
  /**
88
- * Wait (bounded) for every in-flight task to finish — the graceful-shutdown drain
104
+ * Wait (bounded) for every in-flight batch to finish — the graceful-shutdown drain
89
105
  * (fix-daemon-exit-orphan-running-turn). Resolves `true` when the queue went idle
90
- * (no active task) within `timeoutMs`, `false` on timeout — the caller exits
106
+ * (no active batch) within `timeoutMs`, `false` on timeout — the caller exits
91
107
  * anyway and leaves the rest to the server-side reconcile backstop. Pending
92
- * (not-yet-started) tasks are NOT waited for: a shutting-down daemon stops
108
+ * (not-yet-started) items are NOT waited for: a shutting-down daemon stops
93
109
  * starting new work, so only the in-flight subprocesses (and their exit reports)
94
- * matter. Polling (50ms) keeps this zero-dep and independent of task internals.
110
+ * matter. Polling (50ms) keeps this zero-dep and independent of batch internals.
95
111
  * @param {number} timeoutMs
96
112
  * @returns {Promise<boolean>}
97
113
  */
@@ -112,33 +128,39 @@ export class WakeQueue {
112
128
  if (this.running.has(key)) continue; // already running under another slot
113
129
  const queue = this.pending.get(key);
114
130
  if (!queue || queue.length === 0) continue;
115
- this.#runNext(key);
131
+ this.#startBatch(key);
116
132
  }
117
133
  }
118
134
 
119
- /** Run the next task for a key, then chain to the following one. */
120
- #runNext(key) {
135
+ /**
136
+ * Drain the ENTIRE pending array for a key into one batch and run it, then
137
+ * chain to the following batch. No batch-size cap (design.md §C1, Q7).
138
+ */
139
+ #startBatch(key) {
121
140
  const queue = this.pending.get(key);
122
141
  if (!queue || queue.length === 0) {
123
142
  this.running.delete(key);
124
143
  return;
125
144
  }
126
- const task = queue.shift();
145
+ // Coalesce: take everything pending for this key right now as one batch.
146
+ // Items that arrive after this splice accumulate for the NEXT batch.
147
+ const items = queue.splice(0);
127
148
  this.running.add(key);
128
149
  this.activeCount++;
129
150
 
130
151
  Promise.resolve()
131
- .then(task)
152
+ .then(() => this.runBatch(key, items))
132
153
  .catch((err) => {
133
- // Poisoned wake: log, do NOT let it wedge the key's queue.
134
- this.logger.warn(`[Chorus] wake task for ${key} failed: ${err}`);
154
+ // Poisoned batch: log, do NOT let it wedge the key's queue.
155
+ this.logger.warn(`[Chorus] wake batch for ${key} failed: ${err}`);
135
156
  })
136
157
  .finally(() => {
137
158
  this.activeCount--;
138
159
  const remaining = this.pending.get(key);
139
160
  if (remaining && remaining.length > 0) {
140
- // Same key still has work → it must run serially. Re-mark ready;
141
- // #pump will pick it up (respecting the global cap).
161
+ // Same key accumulated more work while this batch ran → it must run
162
+ // serially as the next batch. Re-mark ready; #pump will pick it up
163
+ // (respecting the global cap).
142
164
  if (!this.readyKeys.includes(key)) this.readyKeys.push(key);
143
165
  this.running.delete(key); // free the key so #pump can re-claim it
144
166
  } else {