@chorus-aidlc/chorus 0.19.0 → 0.20.0

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 (563) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +334 -335
  3. package/.next/standalone/.next/app-path-routes-manifest.json +30 -30
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +21 -21
  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 +2 -2
  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 +2 -2
  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 +2 -2
  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 +1 -1
  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 +2 -2
  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.js +1 -1
  52. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/admin/companies/new/page.js +1 -1
  54. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
  56. package/.next/standalone/.next/server/app/admin/companies/new.rsc +3 -3
  57. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/admin/companies.html +2 -2
  59. package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
  60. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/admin.html +2 -2
  62. package/.next/standalone/.next/server/app/admin.rsc +2 -2
  63. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route.js +1 -1
  64. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route.js.nft.json +1 -1
  65. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/admin/companies/route.js +1 -1
  67. package/.next/standalone/.next/server/app/api/admin/companies/route.js.nft.json +1 -1
  68. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/agent-connections/route.js +1 -1
  72. package/.next/standalone/.next/server/app/api/agent-connections/route.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/agents/[uuid]/route.js +1 -1
  75. package/.next/standalone/.next/server/app/api/agents/[uuid]/route.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
  78. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +1 -1
  79. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/agents/route.js +1 -1
  81. package/.next/standalone/.next/server/app/api/agents/route.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route.js +1 -1
  84. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/api-keys/route.js +1 -1
  87. package/.next/standalone/.next/server/app/api/api-keys/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  93. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
  98. package/.next/standalone/.next/server/app/api/comments/route.js.nft.json +1 -1
  99. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js +1 -1
  101. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/daemon/control/route.js +1 -1
  104. package/.next/standalone/.next/server/app/api/daemon/control/route.js.nft.json +1 -1
  105. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route.js +1 -1
  107. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route.js.nft.json +1 -1
  108. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js +1 -1
  110. package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/daemon/executions/route.js +1 -1
  113. package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -1
  116. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -1
  117. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js +1 -1
  119. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -1
  122. package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +1 -1
  123. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -1
  125. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
  128. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -1
  129. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route.js +1 -1
  131. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route.js.nft.json +1 -1
  132. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route.js +1 -1
  134. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route.js.nft.json +1 -1
  135. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -1
  137. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js +1 -1
  140. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js.nft.json +1 -1
  141. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -1
  143. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -1
  146. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -1
  147. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -1
  149. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js +1 -1
  152. package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js.nft.json +1 -1
  153. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js +1 -1
  155. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/api/events/notifications/route.js +1 -1
  158. package/.next/standalone/.next/server/app/api/events/notifications/route.js.nft.json +1 -1
  159. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/api/events/route.js +2 -2
  161. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  162. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  165. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
  168. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +1 -1
  169. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
  171. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js +1 -1
  174. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -1
  175. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
  177. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +1 -1
  178. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  179. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
  180. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +1 -1
  181. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route.js +1 -1
  183. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  185. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js +1 -1
  186. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js.nft.json +1 -1
  187. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/api/mcp/route.js +1 -1
  189. package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
  190. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  191. package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
  192. package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
  193. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  194. package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
  195. package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  197. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js +1 -1
  198. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +1 -1
  199. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  200. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js +1 -1
  201. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  203. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js +1 -1
  204. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +1 -1
  205. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  206. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js +1 -1
  207. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +1 -1
  208. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  209. package/.next/standalone/.next/server/app/api/notifications/route.js +1 -1
  210. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  211. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  212. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js +1 -1
  213. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +1 -1
  214. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  215. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js +1 -1
  216. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js.nft.json +1 -1
  217. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  218. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js +1 -1
  219. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js.nft.json +1 -1
  220. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  221. package/.next/standalone/.next/server/app/api/project-groups/route.js +1 -1
  222. package/.next/standalone/.next/server/app/api/project-groups/route.js.nft.json +1 -1
  223. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  224. package/.next/standalone/.next/server/app/api/project-visits/pin/route.js +1 -1
  225. package/.next/standalone/.next/server/app/api/project-visits/pin/route.js.nft.json +1 -1
  226. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  227. package/.next/standalone/.next/server/app/api/project-visits/route.js +1 -1
  228. package/.next/standalone/.next/server/app/api/project-visits/route.js.nft.json +1 -1
  229. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  230. package/.next/standalone/.next/server/app/api/project-visits/visit/route.js +1 -1
  231. package/.next/standalone/.next/server/app/api/project-visits/visit/route.js.nft.json +1 -1
  232. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  233. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route.js +1 -1
  234. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route.js.nft.json +1 -1
  235. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  236. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route.js +1 -1
  237. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route.js.nft.json +1 -1
  238. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
  239. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  240. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
  241. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  242. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js +1 -1
  243. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js.nft.json +1 -1
  244. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  245. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js +1 -1
  246. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js.nft.json +1 -1
  247. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  248. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
  249. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
  250. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  251. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
  252. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
  253. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
  255. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js.nft.json +1 -1
  256. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  257. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
  258. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js.nft.json +1 -1
  259. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  260. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
  261. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js.nft.json +1 -1
  262. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  263. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js +1 -1
  264. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js.nft.json +1 -1
  265. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js +1 -1
  267. package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js.nft.json +1 -1
  268. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  269. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js +1 -1
  270. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js.nft.json +1 -1
  271. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  272. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
  273. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
  274. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  275. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
  276. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
  277. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  278. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route.js +1 -1
  279. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route.js.nft.json +1 -1
  280. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
  281. package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
  282. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  283. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  284. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
  285. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js.nft.json +1 -1
  286. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  287. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
  288. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js.nft.json +1 -1
  289. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  290. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
  291. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js.nft.json +1 -1
  292. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  293. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
  294. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js.nft.json +1 -1
  295. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  296. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
  297. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js.nft.json +1 -1
  298. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  299. package/.next/standalone/.next/server/app/api/references/[uuid]/route.js +1 -1
  300. package/.next/standalone/.next/server/app/api/references/[uuid]/route.js.nft.json +1 -1
  301. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  302. package/.next/standalone/.next/server/app/api/references/route.js +1 -1
  303. package/.next/standalone/.next/server/app/api/references/route.js.nft.json +1 -1
  304. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  305. package/.next/standalone/.next/server/app/api/search/route.js +1 -1
  306. package/.next/standalone/.next/server/app/api/search/route.js.nft.json +1 -1
  307. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  308. package/.next/standalone/.next/server/app/api/session/route.js +1 -1
  309. package/.next/standalone/.next/server/app/api/session/route.js.nft.json +1 -1
  310. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  311. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
  312. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +1 -1
  313. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  314. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
  315. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +1 -1
  316. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  317. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
  318. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +1 -1
  319. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  320. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
  321. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +1 -1
  322. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  323. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
  324. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +1 -1
  325. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  326. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
  327. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +1 -1
  328. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  329. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
  330. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +1 -1
  331. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  332. package/.next/standalone/.next/server/app/index.html +2 -2
  333. package/.next/standalone/.next/server/app/index.rsc +2 -2
  334. package/.next/standalone/.next/server/app/login/admin/page.js +1 -1
  335. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  336. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  337. package/.next/standalone/.next/server/app/login/admin.rsc +3 -3
  338. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  339. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  340. package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
  341. package/.next/standalone/.next/server/app/login/page.js +1 -1
  342. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  343. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  344. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  345. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
  346. package/.next/standalone/.next/server/app/login.html +2 -2
  347. package/.next/standalone/.next/server/app/login.rsc +3 -3
  348. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  349. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  350. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  351. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  352. package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
  353. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  354. package/.next/standalone/.next/server/app/projects.html +2 -2
  355. package/.next/standalone/.next/server/app/projects.rsc +4 -4
  356. package/.next/standalone/.next/server/app/settings.html +2 -2
  357. package/.next/standalone/.next/server/app/settings.rsc +4 -4
  358. package/.next/standalone/.next/server/app-paths-manifest.json +30 -30
  359. package/.next/standalone/.next/server/chunks/1559.js +2 -2
  360. package/.next/standalone/.next/server/chunks/186.js +1 -0
  361. package/.next/standalone/.next/server/chunks/2572.js +2 -2
  362. package/.next/standalone/.next/server/chunks/2618.js +1 -1
  363. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  364. package/.next/standalone/.next/server/chunks/3371.js +1 -0
  365. package/.next/standalone/.next/server/chunks/4131.js +39 -0
  366. package/.next/standalone/.next/server/chunks/4672.js +6 -0
  367. package/.next/standalone/.next/server/chunks/4827.js +1 -1
  368. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  369. package/.next/standalone/.next/server/chunks/5577.js +1 -0
  370. package/.next/standalone/.next/server/chunks/5728.js +1 -0
  371. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  372. package/.next/standalone/.next/server/chunks/6506.js +39 -3
  373. package/.next/standalone/.next/server/chunks/6515.js +2 -2
  374. package/.next/standalone/.next/server/chunks/{5489.js → 661.js} +44 -8
  375. package/.next/standalone/.next/server/chunks/6654.js +1 -0
  376. package/.next/standalone/.next/server/chunks/6737.js +1 -1
  377. package/.next/standalone/.next/server/chunks/6753.js +4 -4
  378. package/.next/standalone/.next/server/chunks/679.js +1 -1
  379. package/.next/standalone/.next/server/chunks/{2516.js → 7258.js} +1 -1
  380. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  381. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  382. package/.next/standalone/.next/server/chunks/7578.js +1 -1
  383. package/.next/standalone/.next/server/chunks/8017.js +1 -0
  384. package/.next/standalone/.next/server/chunks/8177.js +1 -0
  385. package/.next/standalone/.next/server/chunks/8437.js +1 -0
  386. package/.next/standalone/.next/server/chunks/{6449.js → 8566.js} +1 -1
  387. package/.next/standalone/.next/server/chunks/920.js +1 -1
  388. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  389. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  390. package/.next/standalone/.next/server/chunks/951.js +88 -1
  391. package/.next/standalone/.next/server/chunks/9670.js +1 -0
  392. package/.next/standalone/.next/server/chunks/9931.js +1 -1
  393. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  394. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  395. package/.next/standalone/.next/server/pages/404.html +2 -2
  396. package/.next/standalone/.next/server/pages/500.html +1 -1
  397. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  398. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  399. package/.next/standalone/.next/static/chunks/{15183-3f43af926186f7ef.js → 10488-d518e8ce8ae45724.js} +6 -6
  400. package/.next/standalone/.next/static/chunks/11595.4cebcf7499ef6a78.js +1 -0
  401. package/.next/standalone/.next/static/chunks/2069-68d93343e4ca252e.js +1 -0
  402. package/.next/standalone/.next/static/chunks/27370-0d04028ec8a339f0.js +1 -0
  403. package/.next/standalone/.next/static/chunks/27787-3566e3dd0506e241.js +1 -0
  404. package/.next/standalone/.next/static/chunks/33456.a5a9acba61ca3665.js +1 -0
  405. package/.next/standalone/.next/static/chunks/4860.61dfcdf8c4c5c703.js +1 -0
  406. package/.next/standalone/.next/static/chunks/53504-3a0f6dee12a39d5d.js +1 -0
  407. package/.next/standalone/.next/static/chunks/56863-a2cc92f9ca49f0f8.js +1 -0
  408. package/.next/standalone/.next/static/chunks/63819-c52b5bc9ee32ca9b.js +1 -0
  409. package/.next/standalone/.next/static/chunks/69398-c2f73fe154aaee76.js +1 -0
  410. package/.next/standalone/.next/static/chunks/71890-e6c13ce1debd87c2.js +1 -0
  411. package/.next/standalone/.next/static/chunks/71921-f6754331cd35fa5a.js +1 -0
  412. package/.next/standalone/.next/static/chunks/{26020-7b4756ba0aa906cf.js → 76103-5d656aebd9cd5e7f.js} +1 -1
  413. package/.next/standalone/.next/static/chunks/7777-18527b954e3c5557.js +1 -0
  414. package/.next/standalone/.next/static/chunks/78847-9f65efbac984cf70.js +1 -0
  415. package/.next/standalone/.next/static/chunks/79919-32af2c1abfc92a30.js +1 -0
  416. package/.next/standalone/.next/static/chunks/83749-f797272bf30fc2f4.js +10 -0
  417. package/.next/standalone/.next/static/chunks/91907-a4182d1a3c870d0f.js +1 -0
  418. package/.next/standalone/.next/static/chunks/91997-3592827b5a069beb.js +1 -0
  419. package/.next/standalone/.next/static/chunks/99373.747e181e4c952509.js +1 -0
  420. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-6135300353d6c6ad.js +1 -0
  421. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-bb9f26c107a6b113.js +1 -0
  422. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-31dd9042ee36b8e5.js +1 -0
  423. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-a6bfa3b6b6893bc4.js +1 -0
  424. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-01e81333c9beee2d.js +1 -0
  425. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-795b161eb0694092.js +1 -0
  426. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-e20e65b5df817433.js +1 -0
  427. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-fc2d02d552bbdbf0.js +1 -0
  428. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0cfa38d2de9fa9d9.js +1 -0
  429. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-301f21a3ae52e318.js → page-529dec4c3bcd5ba9.js} +1 -1
  430. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-dd123990c14e9768.js → page-b211c29669eaa3e4.js} +1 -1
  431. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-069c9738e516436b.js → page-793285a6cf214896.js} +1 -1
  432. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-0606d1497512e155.js +1 -0
  433. package/.next/standalone/.next/static/chunks/app/admin/companies/[uuid]/page-47e49c331996193b.js +1 -0
  434. package/.next/standalone/.next/static/chunks/app/admin/companies/new/page-c1e28205503002de.js +1 -0
  435. package/.next/standalone/.next/static/chunks/app/login/admin/page-b0d0ea2fa4102ff7.js +1 -0
  436. package/.next/standalone/.next/static/chunks/app/login/page-ee63e900cb54148c.js +1 -0
  437. package/.next/standalone/.next/static/chunks/app/onboarding/{page-5914ff3d878a3c34.js → page-1f3ab167cab58610.js} +1 -1
  438. package/.next/standalone/.next/static/chunks/{webpack-de8a36d232a91d6b.js → webpack-6151d196b2fab7e8.js} +1 -1
  439. package/.next/standalone/.next/static/css/09ac5931fe977492.css +1 -0
  440. package/.next/standalone/package.json +1 -1
  441. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  442. package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +1 -1
  443. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +5 -1
  444. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +16 -1
  445. package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +1 -1
  446. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
  447. package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
  448. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +13 -1
  449. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
  450. package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +1 -1
  451. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +9 -1
  452. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  453. package/.next/standalone/public/chorus-plugin/skills/research/SKILL.md +51 -0
  454. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  455. package/.next/standalone/public/chorus-plugin/skills/spec-lite/SKILL.md +1 -1
  456. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +5 -1
  457. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus.json +1 -0
  458. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +5 -1
  459. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-cli/SKILL.md +1 -1
  460. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
  461. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
  462. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +13 -1
  463. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +1 -1
  464. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +1 -1
  465. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +9 -1
  466. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
  467. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-research/SKILL.md +51 -0
  468. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
  469. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-spec-lite/SKILL.md +1 -1
  470. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +5 -1
  471. package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +16 -1
  472. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  473. package/.next/standalone/public/kiro-plugin/manifest.txt +1 -0
  474. package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +4 -0
  475. package/.next/standalone/public/skill/chorus/SKILL.md +20 -2
  476. package/.next/standalone/public/skill/idea-chorus/SKILL.md +12 -0
  477. package/.next/standalone/public/skill/package.json +1 -0
  478. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +8 -0
  479. package/.next/standalone/public/skill/research-chorus/SKILL.md +51 -0
  480. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +4 -0
  481. package/README.ja.md +5 -11
  482. package/README.ko.md +5 -11
  483. package/README.md +20 -11
  484. package/README.zh.md +20 -11
  485. package/chorus.mjs +7 -1
  486. package/cli/agent-cli-config.mjs +28 -2
  487. package/cli/claude-spawner.mjs +330 -18
  488. package/cli/codex-app-server-client.mjs +402 -0
  489. package/cli/codex-app-server-events.mjs +176 -0
  490. package/cli/codex-session-map.mjs +1 -1
  491. package/cli/codex-spawner.mjs +247 -241
  492. package/cli/control-handler.mjs +20 -0
  493. package/cli/daemon-rest-client.mjs +7 -4
  494. package/cli/event-router.mjs +65 -3
  495. package/cli/init/adapters.mjs +2 -2
  496. package/cli/init/file-template.mjs +11 -4
  497. package/cli/init/install-methods.mjs +3 -1
  498. package/cli/operation-contract.mjs +3 -0
  499. package/cli/operation-prompts.mjs +99 -0
  500. package/cli/operation.mjs +46 -0
  501. package/cli/pi-spawner.mjs +472 -78
  502. package/cli/process-killer.mjs +138 -13
  503. package/cli/process-stop-hooks.mjs +13 -0
  504. package/cli/prompts.mjs +7 -0
  505. package/cli/upgrade-plugins.mjs +202 -0
  506. package/cli/upgrade-process.mjs +159 -0
  507. package/cli/upgrade.mjs +125 -0
  508. package/cli/upload-hooks.mjs +2 -2
  509. package/cli/wake-queue.mjs +5 -1
  510. package/cli/waker.mjs +127 -4
  511. package/cli/windows-process-tree.mjs +154 -0
  512. package/package.json +1 -1
  513. package/prisma/migrations/20260927073000_add_daemon_operation_payload/migration.sql +1 -0
  514. package/prisma/schema.prisma +3 -2
  515. package/.next/standalone/.next/server/chunks/1318.js +0 -1
  516. package/.next/standalone/.next/server/chunks/1416.js +0 -88
  517. package/.next/standalone/.next/server/chunks/1683.js +0 -1
  518. package/.next/standalone/.next/server/chunks/3341.js +0 -1
  519. package/.next/standalone/.next/server/chunks/457.js +0 -1
  520. package/.next/standalone/.next/server/chunks/5300.js +0 -1
  521. package/.next/standalone/.next/server/chunks/6607.js +0 -1
  522. package/.next/standalone/.next/server/chunks/7400.js +0 -1
  523. package/.next/standalone/.next/server/chunks/8044.js +0 -1
  524. package/.next/standalone/.next/server/chunks/8185.js +0 -1
  525. package/.next/standalone/.next/server/chunks/8454.js +0 -1
  526. package/.next/standalone/.next/server/chunks/9848.js +0 -39
  527. package/.next/standalone/.next/static/chunks/11595.f080a1d100972212.js +0 -1
  528. package/.next/standalone/.next/static/chunks/17099-936da9caf4c119b8.js +0 -1
  529. package/.next/standalone/.next/static/chunks/17562-56f932146e9e6c94.js +0 -10
  530. package/.next/standalone/.next/static/chunks/18751-3616e33050e9611e.js +0 -1
  531. package/.next/standalone/.next/static/chunks/27370-c056dee2016c9124.js +0 -1
  532. package/.next/standalone/.next/static/chunks/31308-bb4a97b3f39c22dd.js +0 -1
  533. package/.next/standalone/.next/static/chunks/33456.20313bd67a5c41cc.js +0 -1
  534. package/.next/standalone/.next/static/chunks/35432-5c245212c7595169.js +0 -1
  535. package/.next/standalone/.next/static/chunks/44437-d13183f50281116f.js +0 -1
  536. package/.next/standalone/.next/static/chunks/45024-eb7c062d13d9fe08.js +0 -1
  537. package/.next/standalone/.next/static/chunks/4860.3b555a398cdffb19.js +0 -1
  538. package/.next/standalone/.next/static/chunks/59713-426f81b6576173d8.js +0 -1
  539. package/.next/standalone/.next/static/chunks/60351-bdef539874e5027e.js +0 -1
  540. package/.next/standalone/.next/static/chunks/67580-8733964ab2c7fc0e.js +0 -1
  541. package/.next/standalone/.next/static/chunks/7777-8b1b6681256e1534.js +0 -1
  542. package/.next/standalone/.next/static/chunks/78155-db70d9684a1e77a2.js +0 -1
  543. package/.next/standalone/.next/static/chunks/79919-1e7e294a06f2c4a0.js +0 -1
  544. package/.next/standalone/.next/static/chunks/94643-e54eff17e941a93b.js +0 -1
  545. package/.next/standalone/.next/static/chunks/99373.b8a95d1bec5ad4e7.js +0 -1
  546. package/.next/standalone/.next/static/chunks/99733-5a2e39f57fbda32d.js +0 -1
  547. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-072a6b8f0a48b1b6.js +0 -1
  548. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-82e90e222d6bc547.js +0 -1
  549. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-198a3ff89ae871b9.js +0 -1
  550. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-a506de82e8997714.js +0 -1
  551. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-dc54fafa22d21863.js +0 -1
  552. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-6eb5d3cb036a78e0.js +0 -1
  553. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-69c6f0190623e19b.js +0 -1
  554. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-2a52f747e6fac5a7.js +0 -1
  555. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-22cce567a85ea291.js +0 -1
  556. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-548231f8c9856489.js +0 -1
  557. package/.next/standalone/.next/static/chunks/app/admin/companies/[uuid]/page-56118c51122ad639.js +0 -1
  558. package/.next/standalone/.next/static/chunks/app/admin/companies/new/page-4e20deb41357171c.js +0 -1
  559. package/.next/standalone/.next/static/chunks/app/login/admin/page-c8e40259e5d3d9e0.js +0 -1
  560. package/.next/standalone/.next/static/chunks/app/login/page-0a16a64855b771ef.js +0 -1
  561. package/.next/standalone/.next/static/css/44f13b43a3de716d.css +0 -1
  562. /package/.next/standalone/.next/static/{Pmji9kEq8T2lM6AKQkZji → kDppeym4sfPwXjGFspZG8}/_buildManifest.js +0 -0
  563. /package/.next/standalone/.next/static/{Pmji9kEq8T2lM6AKQkZji → kDppeym4sfPwXjGFspZG8}/_ssgManifest.js +0 -0
@@ -3,9 +3,25 @@
3
3
  // engineering point of the daemon: parsing stream-json is plain JS and
4
4
  // platform-neutral; the real work is spawning, and it is all Windows.
5
5
  //
6
- // Verified against Claude Code CLI 2.1.251:
7
- // • `-p/--print` + `--output-format stream-json` emits NDJSON (one JSON object
8
- // per line); every line carries `session_id`.
6
+ // Verified against Claude Code CLI 2.1.283 (stream-json transport; frames pinned
7
+ // by cli/__tests__/fixtures/claude-stream-json/). Earlier facts first verified on
8
+ // 2.1.251 still hold:
9
+ // • `-p/--print` + `--input-format stream-json --output-format stream-json`
10
+ // is the bidirectional NDJSON protocol the Agent SDK's "Streaming Input Mode"
11
+ // runs on. It is documented only at the SDK level, so the exact frames the
12
+ // daemon relies on are pinned by live-captured fixtures. The prompt goes in as
13
+ // ONE `{"type":"user",...}` frame; stdin stays open for control frames and is
14
+ // closed after the turn's first `result` frame, after which the CLI drains its
15
+ // Stop hooks and exits (one process per wake, never reused).
16
+ // • stdout frames of type `control_request` / `control_response` /
17
+ // `control_cancel_request` are protocol plumbing: the spawner answers them and
18
+ // never forwards them to `onMessage`. `--permission-prompt-tool stdio` routes
19
+ // every non-allowlisted tool request to us as `control_request{can_use_tool}`,
20
+ // which we deny explicitly.
21
+ // • interrupt is `control_request{subtype:"interrupt"}`: the CLI acks it and
22
+ // ends the turn with `result:error_during_execution`. The spawner sends it from
23
+ // a process stop hook, so the shared killer's deadline bounds it (no SIGINT).
24
+ // • every output line carries `session_id`.
9
25
  // • `--session-id <uuid>` sets the session id for a fresh run, and
10
26
  // `--resume <uuid>` continues it. So we GENERATE the session id client-side
11
27
  // and pass it in, rather than scraping it from the init event — the id is
@@ -18,9 +34,11 @@
18
34
  //
19
35
  // HEADLESS SIGNAL (add-daemon-headless-interaction-guard): wake() spawns the child
20
36
  // with CHORUS_DAEMON_HEADLESS=1 merged over the inherited env — a machine-checkable
21
- // marker that this is a daemon-woken, no-human-at-the-terminal run. buildArgs is
22
- // deliberately NOT changed (no --append-system-prompt): the headless behavior rule is
23
- // carried per-turn by the wake-prompt preamble in prompts.mjs, not at the system level.
37
+ // marker that this is a daemon-woken, no-human-at-the-terminal run. buildArgs adds
38
+ // no --append-system-prompt: the headless behavior rule is carried per-turn by the
39
+ // wake-prompt preamble in prompts.mjs, not at the system level. It does block
40
+ // AskUserQuestion at the tool layer (`--disallowedTools AskUserQuestion`), since no
41
+ // human can answer it in a daemon wake.
24
42
 
25
43
  import { spawn } from "node:child_process";
26
44
  import { safeSpawnError } from "./launch-diagnostics.mjs";
@@ -29,6 +47,7 @@ import { existsSync, statSync } from "node:fs";
29
47
  import { homedir } from "node:os";
30
48
  import { win32 as pathWin32, posix as pathPosix, join as pathJoin } from "node:path";
31
49
  import { awaitChildSettled } from "./child-exit.mjs";
50
+ import { registerProcessStopHook } from "./process-stop-hooks.mjs";
32
51
 
33
52
  const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
34
53
 
@@ -195,24 +214,301 @@ export const CHORUS_MCP_SERVER_NAME = "chorus";
195
214
  */
196
215
 
197
216
  /**
198
- * Build the argv for a headless run. Prompt is NEVER here — it goes over stdin.
217
+ * Build the argv for a headless run. Prompt is NEVER here — it goes over stdin as
218
+ * a stream-json user frame.
219
+ *
220
+ * `--disallowedTools` is variadic, so it is emitted BEFORE the permission flags
221
+ * (never last) and operator `cliConfig.args` are appended after this whole list by
222
+ * the caller — nothing can be swallowed as an extra tool name.
223
+ * `--permission-prompt-tool stdio` (chorus mode) makes the CLI ask us, over the
224
+ * control protocol, about every tool outside the allowlist; the spawner denies it
225
+ * explicitly and visibly instead of the CLI denying it silently.
199
226
  * @param {{ sessionId: string, isNew: boolean, mcpConfigPath?: string, permissionMode?: PermissionMode }} o
200
227
  * @returns {string[]}
201
228
  */
202
229
  export function buildArgs({ sessionId, isNew, mcpConfigPath, permissionMode = "chorus" }) {
203
- const args = ["-p", "--output-format", "stream-json", "--verbose"];
230
+ const args = ["-p", "--input-format", "stream-json", "--output-format", "stream-json", "--verbose"];
204
231
  if (isNew) args.push("--session-id", sessionId);
205
232
  else args.push("--resume", sessionId);
206
233
  if (mcpConfigPath) args.push("--mcp-config", mcpConfigPath);
234
+ // Headless wakes have no human to answer AskUserQuestion — block it at the tool
235
+ // layer in every mode (daemon-headless-interaction-guard).
236
+ args.push("--disallowedTools", "AskUserQuestion");
207
237
  if (permissionMode === "yolo") {
208
238
  args.push("--dangerously-skip-permissions");
209
239
  } else {
210
- // Default: allow only this daemon's Chorus MCP tools through, nothing else.
211
- args.push("--allowedTools", `mcp__${CHORUS_MCP_SERVER_NAME}__*`);
240
+ // Default: allow only this daemon's Chorus MCP tools through, and route every
241
+ // other tool's permission request to the spawner (which denies it explicitly).
242
+ args.push("--allowedTools", `mcp__${CHORUS_MCP_SERVER_NAME}__*`, "--permission-prompt-tool", "stdio");
212
243
  }
213
244
  return args;
214
245
  }
215
246
 
247
+ /** stdout frame types the spawner consumes itself and never forwards to `onMessage`. */
248
+ export const CONTROL_FRAME_TYPES = new Set(["control_request", "control_response", "control_cancel_request"]);
249
+
250
+ /**
251
+ * Model-facing message for a denied `can_use_tool` request. It reaches the model
252
+ * as the tool_result of the blocked call (and is listed in result.permission_denials).
253
+ */
254
+ export const CHORUS_TOOL_DENY_MESSAGE =
255
+ "This tool is blocked by the Chorus daemon's --chorus-only permission policy: this headless " +
256
+ "wake may only use Chorus MCP tools (mcp__chorus__*). Use the Chorus MCP tools to do the work, " +
257
+ "or ask the human for what you need in a Chorus comment.";
258
+
259
+ /** Error text for any control request subtype the daemon does not implement. */
260
+ export const UNSUPPORTED_CONTROL_ERROR = "unsupported by Chorus daemon";
261
+
262
+ /**
263
+ * The one stream-json user frame that carries the wake prompt.
264
+ * @param {string} prompt
265
+ */
266
+ export function buildUserFrame(prompt) {
267
+ return { type: "user", message: { role: "user", content: prompt }, parent_tool_use_id: null };
268
+ }
269
+
270
+ /**
271
+ * Per-wake stdin side of the stream-json protocol: safe NDJSON writes, the one
272
+ * stdin close, and answers to incoming control frames. Kept as its own unit so the
273
+ * protocol interrupt (stop hook) can build on the same write/close/result state.
274
+ */
275
+ export class ClaudeControlChannel {
276
+ /**
277
+ * @param {{ stdin: any, logger: {info(m:string):void,warn(m:string):void,error(m:string):void},
278
+ * permissionMode: PermissionMode }} o
279
+ */
280
+ constructor({ stdin, logger, permissionMode }) {
281
+ this.stdin = stdin ?? null;
282
+ this.logger = logger;
283
+ this.permissionMode = permissionMode;
284
+ /** True once the first `result` frame was observed. */
285
+ this.resultSeen = false;
286
+ /** True once we called end() (or the child is gone and stdin is unusable). */
287
+ this.stdinClosed = false;
288
+ /** True once the child exited or errored (no further protocol progress possible). */
289
+ this.exited = false;
290
+ /** True once the user prompt frame was written (a turn may be running). */
291
+ this.promptSent = false;
292
+ }
293
+
294
+ /** In-flight protocol stop (shared by repeated stop-hook invocations). */
295
+ #stopWork = null;
296
+ /** Per-channel interrupt request counter → `chorus-interrupt-<n>`. */
297
+ #interruptSeq = 0;
298
+ /** Resolver for the pending interrupt wait: `{ requestId, resolve }` or null. */
299
+ #interruptWait = null;
300
+
301
+ /** @returns {boolean} whether stdin can still take a write. */
302
+ get writable() {
303
+ const s = this.stdin;
304
+ if (this.stdinClosed || !s || typeof s.write !== "function") return false;
305
+ if (s.destroyed || s.writableEnded || s.writable === false) return false;
306
+ return true;
307
+ }
308
+
309
+ /**
310
+ * Write one NDJSON frame. Never throws: a closed/destroyed stdin or a synchronous
311
+ * write error is logged and reported as `false` (async EPIPE is caught by the
312
+ * stdin 'error' listener the spawner installs).
313
+ * @param {object} frame @param {string} what Log label.
314
+ * @returns {boolean}
315
+ */
316
+ write(frame, what) {
317
+ if (!this.writable) {
318
+ this.logger.warn(`[Chorus] claude stdin is closed; dropped ${what}`);
319
+ return false;
320
+ }
321
+ try {
322
+ this.stdin.write(`${JSON.stringify(frame)}\n`);
323
+ return true;
324
+ } catch (err) {
325
+ this.logger.warn(`[Chorus] failed writing ${what} to claude stdin: ${err}`);
326
+ return false;
327
+ }
328
+ }
329
+
330
+ /**
331
+ * Write the wake's single user prompt frame, unless a protocol stop has already
332
+ * started (code-review B1). The waker's cancel-before-spawn branch calls the
333
+ * killer from inside `onChild`, i.e. BEFORE `wake()` reaches this write; sending
334
+ * the prompt after that would make the CLI run the whole cancelled turn (model
335
+ * calls, Chorus MCP side effects) until the forced deadline. Chosen fix (a):
336
+ * `#stopWork` is latched synchronously by `stop()`, so this check sees it, and
337
+ * with no prompt sent `stop()` skips the interrupt and goes straight to
338
+ * beforeClose → close stdin; the CLI then reads EOF with no input and exits
339
+ * without starting a turn. (Writing the frame before `onChild` was rejected:
340
+ * it would deliver the prompt a cancelled wake must never deliver.)
341
+ * @param {object} frame @returns {boolean} whether the prompt was written.
342
+ */
343
+ sendPrompt(frame) {
344
+ if (this.#stopWork) {
345
+ this.logger.info("[Chorus] claude stop started before the prompt was written; prompt not delivered");
346
+ return false;
347
+ }
348
+ this.promptSent = this.write(frame, "prompt");
349
+ return this.promptSent;
350
+ }
351
+
352
+ /** Close stdin once; idempotent and never throws. */
353
+ closeStdin() {
354
+ if (this.stdinClosed) return;
355
+ this.stdinClosed = true;
356
+ const s = this.stdin;
357
+ if (!s || typeof s.end !== "function" || s.destroyed || s.writableEnded) return;
358
+ try {
359
+ s.end();
360
+ } catch (err) {
361
+ this.logger.warn(`[Chorus] failed closing claude stdin: ${err}`);
362
+ }
363
+ }
364
+
365
+ /** The child is gone or its stdin errored (EPIPE): no further writes may be attempted. */
366
+ markStdinUnusable() {
367
+ this.stdinClosed = true;
368
+ }
369
+
370
+ /** The child exited or errored: stdin is unusable and a pending interrupt wait ends. */
371
+ markExited() {
372
+ this.exited = true;
373
+ this.markStdinUnusable();
374
+ this.#endInterruptWait();
375
+ }
376
+
377
+ #endInterruptWait() {
378
+ const wait = this.#interruptWait;
379
+ this.#interruptWait = null;
380
+ wait?.resolve();
381
+ }
382
+
383
+ /**
384
+ * Protocol stop (design D4), invoked by the process killer through the
385
+ * registered stop hook. Repeated calls share one promise.
386
+ * 1. Unless the prompt was never written (nothing to interrupt — see
387
+ * sendPrompt), a result was already seen, or stdin is already closed, write ONE
388
+ * `interrupt` control_request and wait for the first of: a result frame, an
389
+ * error control_response for that request id, child exit, or the killer's
390
+ * `protocolDeadline`. The deadline is the killer's own (derived from the
391
+ * existing sigintTimeoutMs); no other duration exists here (#569).
392
+ * 2. On EVERY path, including a skipped step 1: await `beforeClose` (the
393
+ * killer's Windows tree-identity capture, which needs the root alive and
394
+ * stdin open). A failure is logged and never skips step 3.
395
+ * 3. Close stdin if it is still open.
396
+ * @param {{ protocolDeadline: number, beforeClose?: () => unknown }} o
397
+ * @returns {Promise<void>}
398
+ */
399
+ stop({ protocolDeadline, beforeClose }) {
400
+ if (this.#stopWork) return this.#stopWork;
401
+ this.#stopWork = (async () => {
402
+ try {
403
+ if (this.promptSent && !this.resultSeen && !this.stdinClosed) {
404
+ const requestId = `chorus-interrupt-${++this.#interruptSeq}`;
405
+ const outcome = new Promise((resolve) => { this.#interruptWait = { requestId, resolve }; });
406
+ if (this.write({ type: "control_request", request_id: requestId, request: { subtype: "interrupt" } }, "interrupt request")) {
407
+ this.logger.info(`[Chorus] interrupt: sent claude control_request ${requestId}`);
408
+ let timer;
409
+ try {
410
+ await Promise.race([
411
+ outcome,
412
+ // The killer-supplied protocol deadline — not a new timeout.
413
+ new Promise((resolve) => { timer = setTimeout(resolve, Math.max(0, protocolDeadline - Date.now())); }),
414
+ ]);
415
+ } finally {
416
+ clearTimeout(timer);
417
+ }
418
+ }
419
+ this.#interruptWait = null;
420
+ }
421
+ } finally {
422
+ try {
423
+ await beforeClose?.();
424
+ } catch (err) {
425
+ this.logger.warn(`[Chorus] claude stop: beforeClose failed (continuing to close stdin): ${err}`);
426
+ }
427
+ this.closeStdin();
428
+ }
429
+ })();
430
+ return this.#stopWork;
431
+ }
432
+
433
+ /**
434
+ * Observe one stdout frame. Returns true when the frame is protocol plumbing the
435
+ * spawner consumed (so it must NOT be forwarded to `onMessage`). A `result`
436
+ * frame is forwarded, and closes stdin the first time one is seen.
437
+ * @param {any} frame
438
+ * @returns {boolean} consumed
439
+ */
440
+ handleFrame(frame) {
441
+ const type = frame && typeof frame === "object" ? frame.type : undefined;
442
+ if (type === "result") {
443
+ if (!this.resultSeen) {
444
+ this.resultSeen = true;
445
+ // During a protocol stop the stop hook owns the close: it must await the
446
+ // killer's beforeClose (Windows tree capture) BEFORE stdin closes.
447
+ if (!this.#stopWork) this.closeStdin();
448
+ this.#endInterruptWait();
449
+ }
450
+ return false;
451
+ }
452
+ if (!CONTROL_FRAME_TYPES.has(type)) return false;
453
+ if (type === "control_request") this.#answerControlRequest(frame);
454
+ else if (type === "control_response") this.#observeControlResponse(frame);
455
+ // control_cancel_request: nothing pending on our side to cancel. All control
456
+ // frames are consumed so the transcript stream is unchanged.
457
+ return true;
458
+ }
459
+
460
+ /** Correlate a control_response with the pending interrupt; others are ignored. */
461
+ #observeControlResponse(frame) {
462
+ const wait = this.#interruptWait;
463
+ const response = frame.response;
464
+ if (!wait || response?.request_id !== wait.requestId) return;
465
+ if (response.subtype === "error") {
466
+ this.logger.warn(`[Chorus] claude rejected interrupt ${wait.requestId}: ${String(response.error)}`);
467
+ this.#endInterruptWait();
468
+ }
469
+ // A success ack keeps waiting: the interrupted turn still ends with a result
470
+ // (or, if it landed before the turn started, the killer's deadline decides).
471
+ }
472
+
473
+ #answerControlRequest(frame) {
474
+ const requestId = frame.request_id;
475
+ const subtype = frame.request?.subtype;
476
+ if (typeof requestId !== "string" || !requestId) {
477
+ // Nothing to correlate an answer with; surface it instead of replying blind.
478
+ this.logger.warn(`[Chorus] claude control request ${String(subtype)} has no request_id; not answered`);
479
+ return;
480
+ }
481
+ if (subtype === "can_use_tool") {
482
+ // Log the tool NAME only — the tool input can carry secrets.
483
+ const toolName = typeof frame.request.tool_name === "string" ? frame.request.tool_name : "<unknown>";
484
+ const why = this.permissionMode === "yolo" ? "unexpected permission prompt in yolo mode" : "--chorus-only permission mode";
485
+ if (!this.writable) {
486
+ // One coherent line: the deny could not be delivered (child finishing/gone).
487
+ this.logger.warn(`[Chorus] tool ${toolName} permission request arrived after claude stdin closed (${why}); no deny sent`);
488
+ return;
489
+ }
490
+ this.logger.warn(`[Chorus] denied tool ${toolName} (${why})`);
491
+ this.write(
492
+ {
493
+ type: "control_response",
494
+ response: { subtype: "success", request_id: requestId, response: { behavior: "deny", message: CHORUS_TOOL_DENY_MESSAGE } },
495
+ },
496
+ `permission deny for ${toolName}`
497
+ );
498
+ return;
499
+ }
500
+ if (!this.writable) {
501
+ this.logger.warn(`[Chorus] unsupported claude control request subtype ${String(subtype)} arrived after claude stdin closed; not answered`);
502
+ return;
503
+ }
504
+ this.logger.warn(`[Chorus] unsupported claude control request subtype ${String(subtype)}; answered with an error`);
505
+ this.write(
506
+ { type: "control_response", response: { subtype: "error", request_id: requestId, error: UNSUPPORTED_CONTROL_ERROR } },
507
+ `control error response (${String(subtype)})`
508
+ );
509
+ }
510
+ }
511
+
216
512
  /**
217
513
  * Resolve the actual command + argv to spawn, given the resolved claude path
218
514
  * and the headless args. On Windows a `.cmd`/`.bat` shim is NOT a PE executable,
@@ -299,7 +595,7 @@ export class ClaudeSpawner {
299
595
 
300
596
  /**
301
597
  * Spawn a headless Claude run. Resolves when the subprocess exits. The prompt
302
- * is written to stdin (never argv) — this is what keeps long prompts off the
598
+ * is written to stdin as one stream-json user frame (never argv) — this is what keeps long prompts off the
303
599
  * Windows command line and out of shell escaping/injection.
304
600
  *
305
601
  * The session id is supplied by the caller (the daemon passes the dispatched
@@ -395,6 +691,14 @@ export class ClaudeSpawner {
395
691
  return;
396
692
  }
397
693
 
694
+ const channel = new ClaudeControlChannel({ stdin: child.stdin, logger: this.logger, permissionMode: this.permissionMode });
695
+ // Protocol interrupt (design D4): the shared killer calls this instead of
696
+ // SIGINT and then force-cleans within the same deadline if the child remains.
697
+ // Registered before onChild so an interrupt can never see an unhooked child.
698
+ const unregisterStopHook = registerProcessStopHook(child, ({ deadline, protocolDeadline = deadline, beforeClose }) =>
699
+ channel.stop({ protocolDeadline, beforeClose })
700
+ );
701
+
398
702
  // Hand the live child to the caller (子3) so the waker can register the handle
399
703
  // for the interrupt path before this promise resolves. Never let a throwing
400
704
  // callback escape into the spawn path.
@@ -418,6 +722,7 @@ export class ClaudeSpawner {
418
722
  String(chunk),
419
723
  (obj) => {
420
724
  if (obj && typeof obj.session_id === "string") observedSessionId = obj.session_id;
725
+ if (channel.handleFrame(obj)) return; // control plumbing — never forwarded
421
726
  if (onMessage) {
422
727
  try {
423
728
  onMessage(obj);
@@ -442,6 +747,8 @@ export class ClaudeSpawner {
442
747
  child.on("error", (error) => {
443
748
  // e.g. ENOENT if the resolved path vanished — log, don't throw.
444
749
  this.logger.error(`[Chorus] claude process error: ${safeSpawnError(error)}`);
750
+ channel.markExited();
751
+ unregisterStopHook();
445
752
  // backendSessionId is the `--resume` anchor (`id`), NOT observedSessionId:
446
753
  // a fork-on-resume claude can emit a new stream session_id, but the daemon
447
754
  // resumes and files the transcript under `id`, so `id` is the resumable value.
@@ -450,7 +757,12 @@ export class ClaudeSpawner {
450
757
 
451
758
  // Settle on process exit, not only on stdio close: a detached descendant can
452
759
  // inherit the pipes and keep `close` from ever firing (see cli/child-exit.mjs).
760
+ // A dead child's stdin must never be written again (late control answers).
761
+ child.on?.("exit", () => channel.markExited());
762
+
453
763
  awaitChildSettled(child, { logger: this.logger, label: "claude" }).then((code) => {
764
+ channel.markExited();
765
+ unregisterStopHook();
454
766
  if (code !== 0) {
455
767
  this.logger.warn(`[Chorus] claude exited with code ${code}`);
456
768
  }
@@ -470,15 +782,15 @@ export class ClaudeSpawner {
470
782
  // daemon". The try/catch below only catches a synchronous throw.
471
783
  child.stdin?.on?.("error", (err) => {
472
784
  this.logger.warn(`[Chorus] claude stdin error (ignored): ${err}`);
785
+ channel.markStdinUnusable();
473
786
  });
474
787
 
475
- // Feed the prompt over stdin, then close it so the model runs.
476
- try {
477
- child.stdin?.write(prompt);
478
- child.stdin?.end();
479
- } catch (err) {
480
- this.logger.warn(`[Chorus] failed writing prompt to claude stdin: ${err}`);
481
- }
788
+ // Feed the prompt as ONE stream-json user frame and keep stdin OPEN: control
789
+ // frames flow over it until the first `result` frame, when handleFrame()
790
+ // closes it and the CLI exits. No result before exit → the raw exit code
791
+ // settles the wake (never a synthetic success). Skipped when a stop already
792
+ // started (e.g. from inside onChild above) — see ClaudeControlChannel.sendPrompt.
793
+ channel.sendPrompt(buildUserFrame(prompt));
482
794
  });
483
795
  }
484
796
  }