@chorus-aidlc/chorus 0.18.0 → 0.18.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (321) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +320 -318
  3. package/.next/standalone/.next/app-path-routes-manifest.json +33 -33
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +30 -30
  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 +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.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
  93. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  146. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  149. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  159. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/index.html +2 -2
  161. package/.next/standalone/.next/server/app/index.rsc +2 -2
  162. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  164. package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
  165. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  167. package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
  168. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  169. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  171. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
  172. package/.next/standalone/.next/server/app/login.html +2 -2
  173. package/.next/standalone/.next/server/app/login.rsc +2 -2
  174. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  175. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  176. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  177. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  178. package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
  179. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  180. package/.next/standalone/.next/server/app/projects.html +2 -2
  181. package/.next/standalone/.next/server/app/projects.rsc +3 -3
  182. package/.next/standalone/.next/server/app/settings.html +2 -2
  183. package/.next/standalone/.next/server/app/settings.rsc +4 -4
  184. package/.next/standalone/.next/server/app-paths-manifest.json +33 -33
  185. package/.next/standalone/.next/server/chunks/1318.js +1 -1
  186. package/.next/standalone/.next/server/chunks/{5201.js → 1416.js} +2 -2
  187. package/.next/standalone/.next/server/chunks/1559.js +2 -2
  188. package/.next/standalone/.next/server/chunks/{4810.js → 2195.js} +1 -1
  189. package/.next/standalone/.next/server/chunks/2460.js +1 -0
  190. package/.next/standalone/.next/server/chunks/2572.js +2 -2
  191. package/.next/standalone/.next/server/chunks/2758.js +1 -0
  192. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  193. package/.next/standalone/.next/server/chunks/3112.js +1 -1
  194. package/.next/standalone/.next/server/chunks/3419.js +1 -1
  195. package/.next/standalone/.next/server/chunks/4066.js +1 -0
  196. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  197. package/.next/standalone/.next/server/chunks/5453.js +1 -1
  198. package/.next/standalone/.next/server/chunks/5489.js +1 -1
  199. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  200. package/.next/standalone/.next/server/chunks/6506.js +1 -1
  201. package/.next/standalone/.next/server/chunks/6737.js +1 -1
  202. package/.next/standalone/.next/server/chunks/6753.js +3 -3
  203. package/.next/standalone/.next/server/chunks/679.js +1 -1
  204. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  205. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  206. package/.next/standalone/.next/server/chunks/7578.js +2 -2
  207. package/.next/standalone/.next/server/chunks/7675.js +1 -0
  208. package/.next/standalone/.next/server/chunks/7789.js +1 -0
  209. package/.next/standalone/.next/server/chunks/{3619.js → 8030.js} +2 -2
  210. package/.next/standalone/.next/server/chunks/920.js +1 -1
  211. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  212. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  213. package/.next/standalone/.next/server/chunks/9931.js +1 -1
  214. package/.next/standalone/.next/server/instrumentation.js +1 -1
  215. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  216. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  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.f080a1d100972212.js +1 -0
  222. package/.next/standalone/.next/static/chunks/14628-283d3983d1fb36c9.js +1 -0
  223. package/.next/standalone/.next/static/chunks/{29305-f587e7e81bc0b200.js → 17562-56f932146e9e6c94.js} +4 -4
  224. package/.next/standalone/.next/static/chunks/25080-25ad29e64c855338.js +1 -0
  225. package/.next/standalone/.next/static/chunks/28698-7fb271ffc6e63a26.js +1 -0
  226. package/.next/standalone/.next/static/chunks/32736-aeaaa1e4c4d5529b.js +1 -0
  227. package/.next/standalone/.next/static/chunks/33456.20313bd67a5c41cc.js +1 -0
  228. package/.next/standalone/.next/static/chunks/4860.3b555a398cdffb19.js +1 -0
  229. package/.next/standalone/.next/static/chunks/75257-99c0ce24b436847b.js +1 -0
  230. package/.next/standalone/.next/static/chunks/79919-0c6dcda1dd8646f0.js +1 -0
  231. package/.next/standalone/.next/static/chunks/91328-f501e3c3ca519a92.js +1 -0
  232. package/.next/standalone/.next/static/chunks/94643-e54eff17e941a93b.js +1 -0
  233. package/.next/standalone/.next/static/chunks/99373.b8a95d1bec5ad4e7.js +1 -0
  234. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-f3c6431432d42c7c.js +1 -0
  235. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-b45c42c536eff64b.js → page-5d723f974bdad33b.js} +1 -1
  236. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-8d3b1f4d8b76d66c.js +1 -0
  237. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-800a979f12b73f27.js → page-57c698dea2fa6e29.js} +1 -1
  238. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-34de35f75aa71f6d.js → page-d2bb622855e746f1.js} +1 -1
  239. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-fc255dc3612032b9.js +1 -0
  240. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-e8030824994edf35.js → page-f032ee8a80d1f56a.js} +1 -1
  241. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-46a0ddfd0421b0a8.js +1 -0
  242. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-349b0977f3c6209a.js → page-3a83748ce0ae1c4f.js} +1 -1
  243. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-be43cb06112fce12.js → page-8af9bb9f96ab0258.js} +1 -1
  244. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-b02939820affdae5.js +1 -0
  245. package/.next/standalone/.next/static/chunks/app/onboarding/page-d2c0c7951114e763.js +1 -0
  246. package/.next/standalone/.next/static/chunks/{webpack-cfb63dd1b416c92e.js → webpack-de8a36d232a91d6b.js} +1 -1
  247. package/.next/standalone/.next/static/css/44f13b43a3de716d.css +1 -0
  248. package/.next/standalone/package.json +1 -1
  249. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  250. package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +1 -1
  251. package/.next/standalone/public/chorus-plugin/bin/on-pre-spawn-agent.sh +22 -9
  252. package/.next/standalone/public/chorus-plugin/bin/on-subagent-start.sh +44 -29
  253. package/.next/standalone/public/chorus-plugin/bin/on-subagent-stop.sh +100 -29
  254. package/.next/standalone/public/chorus-plugin/bin/test-syntax.sh +6 -2
  255. package/.next/standalone/public/chorus-plugin/bin/tests/test-subagent-session-name.sh +599 -0
  256. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  257. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +1 -1
  258. package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +1 -1
  259. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
  260. package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
  261. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  262. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
  263. package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +1 -1
  264. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
  265. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  266. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  267. package/.next/standalone/public/chorus-plugin/skills/spec-lite/SKILL.md +1 -1
  268. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
  269. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  270. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-cli/SKILL.md +1 -1
  271. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
  272. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
  273. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
  274. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +1 -1
  275. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +1 -1
  276. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
  277. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
  278. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
  279. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-spec-lite/SKILL.md +1 -1
  280. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +1 -1
  281. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  282. package/README.ja.md +1 -1
  283. package/README.ko.md +1 -1
  284. package/README.md +1 -1
  285. package/README.zh.md +1 -1
  286. package/chorus.mjs +30 -2
  287. package/cli/child-exit.mjs +77 -0
  288. package/cli/claude-spawner.mjs +4 -1
  289. package/cli/codex-spawner.mjs +4 -1
  290. package/cli/control-handler.mjs +104 -6
  291. package/cli/daemon-rest-client.mjs +98 -29
  292. package/cli/daemon.mjs +5 -1
  293. package/cli/dsh-spawner.mjs +4 -1
  294. package/cli/kiro-spawner.mjs +4 -1
  295. package/cli/pi-spawner.mjs +4 -1
  296. package/package.json +1 -1
  297. package/.next/standalone/.next/server/chunks/109.js +0 -1
  298. package/.next/standalone/.next/server/chunks/1496.js +0 -1
  299. package/.next/standalone/.next/server/chunks/731.js +0 -1
  300. package/.next/standalone/.next/server/chunks/7857.js +0 -1
  301. package/.next/standalone/.next/static/chunks/11595.0afa1a540f681fb4.js +0 -1
  302. package/.next/standalone/.next/static/chunks/22705-324a191727ae45b7.js +0 -1
  303. package/.next/standalone/.next/static/chunks/33456.4a5f4712a7e78d8f.js +0 -1
  304. package/.next/standalone/.next/static/chunks/44216-3876e84f5b02d355.js +0 -1
  305. package/.next/standalone/.next/static/chunks/4860.5719e32b95be2d93.js +0 -1
  306. package/.next/standalone/.next/static/chunks/6528-a8a562ef7d26bb43.js +0 -1
  307. package/.next/standalone/.next/static/chunks/67439-7b339b28ed0ecfc6.js +0 -1
  308. package/.next/standalone/.next/static/chunks/79919-ae8bd8d8ec1e38ce.js +0 -1
  309. package/.next/standalone/.next/static/chunks/82203-4ce5926624df7ed0.js +0 -1
  310. package/.next/standalone/.next/static/chunks/94643-37ac7b8ef8ea5e75.js +0 -1
  311. package/.next/standalone/.next/static/chunks/99373.6c1509bfaf599741.js +0 -1
  312. package/.next/standalone/.next/static/chunks/99775-697e82ee04eac6b1.js +0 -1
  313. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-2fda722cdace8147.js +0 -1
  314. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-792aba7fd6b6daa3.js +0 -1
  315. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-a16002aa2a911619.js +0 -1
  316. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-4f7f1ddbaf79be8f.js +0 -1
  317. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-6916e1abab42a6e6.js +0 -1
  318. package/.next/standalone/.next/static/chunks/app/onboarding/page-c0090caae202eae5.js +0 -1
  319. package/.next/standalone/.next/static/css/75c761a5428611fa.css +0 -1
  320. /package/.next/standalone/.next/static/{IxKVu5zkFPTjSKAUR99yH → dot63ILT878Tloqi7Czj_}/_buildManifest.js +0 -0
  321. /package/.next/standalone/.next/static/{IxKVu5zkFPTjSKAUR99yH → dot63ILT878Tloqi7Czj_}/_ssgManifest.js +0 -0
@@ -4,7 +4,7 @@ description: Chorus Proposal workflow — create proposals with document and tas
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Quick Task workflow — skip Idea→Proposal, create tasks directly
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Review workflow — approve/reject proposals, verify tasks,
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Lightweight, Chorus-native local specs for Chorus PM workflows —
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Full-auto AI-DLC pipeline — from prompt to done. Automates the en
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Optional divergent-then-convergent dialogue for fuzzy ideas. Invoke
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: How to install, configure, and use the `chorus` CLI — install it,
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Development workflow — claim tasks, report work, manage se
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus documentation router — consult the live Chorus docs site t
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Idea workflow — claim ideas, run elaboration rounds, and p
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: OpenSpec-mode authoring for Chorus PM workflows in Kiro CLI. The de
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Multi-agent orchestration playbook — coordinate OTHER agents and
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Proposal workflow — create proposals with document and tas
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Quick Task workflow — skip Idea→Proposal, create tasks directly
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Review workflow — approve/reject proposals, verify tasks,
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Lightweight, Chorus-native local specs for Chorus PM workflows in K
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Full-auto AI-DLC pipeline — from prompt to done. Automates the en
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.18.0"
7
+ version: "0.18.1"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -283,7 +283,7 @@ cmd_mcp_tool() {
283
283
  # Step 1: Initialize MCP session
284
284
  local init_payload
285
285
  init_payload=$(cat <<JSONEOF
286
- {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"chorus-hook","version":"0.18.0"}}}
286
+ {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"chorus-hook","version":"0.18.1"}}}
287
287
  JSONEOF
288
288
  )
289
289
 
package/README.ja.md CHANGED
@@ -63,7 +63,7 @@ Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Veri
63
63
  2 つのコマンドだけです — データベースも Docker も設定ファイルも不要です。
64
64
 
65
65
  ```bash
66
- npm install -g @chorus-aidlc/chorus@0.18.0
66
+ npm install -g @chorus-aidlc/chorus@0.18.1
67
67
  chorus
68
68
  ```
69
69
 
package/README.ko.md CHANGED
@@ -63,7 +63,7 @@ Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Veri
63
63
  두 개의 명령이면 됩니다. 데이터베이스도, Docker도, 설정 파일도 필요 없습니다.
64
64
 
65
65
  ```bash
66
- npm install -g @chorus-aidlc/chorus@0.18.0
66
+ npm install -g @chorus-aidlc/chorus@0.18.1
67
67
  chorus
68
68
  ```
69
69
 
package/README.md CHANGED
@@ -63,7 +63,7 @@ The labels under each stage are the **permissions** an actor needs there — gra
63
63
  Two commands. No database, no Docker, no config files.
64
64
 
65
65
  ```bash
66
- npm install -g @chorus-aidlc/chorus@0.18.0
66
+ npm install -g @chorus-aidlc/chorus@0.18.1
67
67
  chorus
68
68
  ```
69
69
 
package/README.zh.md CHANGED
@@ -54,7 +54,7 @@ Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Veri
54
54
  两条命令即可,无需数据库、无需 Docker、无需配置文件。
55
55
 
56
56
  ```bash
57
- npm install -g @chorus-aidlc/chorus@0.18.0
57
+ npm install -g @chorus-aidlc/chorus@0.18.1
58
58
  chorus
59
59
  ```
60
60
 
package/chorus.mjs CHANGED
@@ -315,11 +315,39 @@ function isPortOccupied(host, tcpPort, timeoutMs = 1000) {
315
315
  });
316
316
  }
317
317
 
318
+ // Publicly known placeholder secrets (GitHub #559). Must stay identical to
319
+ // KNOWN_INSECURE_SECRETS in src/lib/secret-check.ts and
320
+ // CHORUS_KNOWN_INSECURE_SECRETS in docker/ensure-secret.sh (parity-tested).
321
+ const KNOWN_INSECURE_SECRETS = [
322
+ "chorus-docker-secret-change-in-production",
323
+ "chorus-local-secret",
324
+ "your-secret-key-change-in-production",
325
+ "change-me-to-a-random-secret",
326
+ ];
327
+
318
328
  function ensureSecret() {
319
329
  const secretPath = join(dataDir, ".secret");
320
- if (process.env.NEXTAUTH_SECRET) return;
330
+ const fromEnv = process.env.NEXTAUTH_SECRET;
331
+ if (fromEnv) {
332
+ if (!KNOWN_INSECURE_SECRETS.includes(fromEnv.trim())) return;
333
+ // A pasted placeholder is treated exactly like "unset": fall through to the
334
+ // persisted / generated secret instead of signing JWTs with a public value.
335
+ console.error(
336
+ "WARNING: NEXTAUTH_SECRET is set to a publicly known placeholder (GitHub #559); ignoring it and using the persisted secret in " +
337
+ secretPath
338
+ );
339
+ }
321
340
  if (existsSync(secretPath)) {
322
- process.env.NEXTAUTH_SECRET = readFileSync(secretPath, "utf8").trim();
341
+ // Fail closed, matching docker/ensure-secret.sh: a persisted file that is
342
+ // empty or holds a publicly known placeholder must never be exported.
343
+ const persisted = readFileSync(secretPath, "utf8").trim();
344
+ if (!persisted || KNOWN_INSECURE_SECRETS.includes(persisted)) {
345
+ console.error(
346
+ `ERROR: the secret persisted at ${secretPath} is ${persisted ? "a publicly known placeholder" : "empty"} (GitHub #559); refusing to start — delete the file to regenerate, or set NEXTAUTH_SECRET explicitly.`
347
+ );
348
+ process.exit(1);
349
+ }
350
+ process.env.NEXTAUTH_SECRET = persisted;
323
351
  return;
324
352
  }
325
353
  const secret = createHash("sha256")
@@ -0,0 +1,77 @@
1
+ // cli/child-exit.mjs
2
+ // One shared settlement path for every spawner's child process, so the five
3
+ // backends (pi / claude / codex / kiro / dsh) cannot drift on "when is the wake
4
+ // over?".
5
+ //
6
+ // WHY THIS EXISTS — `close` is not the same event as "the agent finished".
7
+ // Node emits `exit` when the child process itself is reaped, but `close` only
8
+ // once every stdio stream the child was given has been closed. A child that
9
+ // leaves a DETACHED DESCENDANT behind (a backgrounded server, a `nohup`'d
10
+ // helper) hands that descendant the SAME inherited pipes, so the pipes stay
11
+ // open after the child is long gone and `close` may never fire. A spawner that
12
+ // waits only for `close` therefore keeps reporting a finished wake as still
13
+ // `running` — the phantom `running` turn. Settling on `exit` fixes that.
14
+ //
15
+ // !!! THE GRACE IS NOT A WAKE TIMEOUT AND NOT A WATCHDOG !!!
16
+ // `stdioGraceMs` only starts counting AFTER the child process has ALREADY
17
+ // EXITED, and it bounds one thing only: how long we wait for that dead
18
+ // process's pipes to drain so a final stdout chunk is still parsed. It places
19
+ // no limit whatsoever on how long an agent may run — a wake that runs for
20
+ // hours is never interrupted, cancelled or "timed out" by this module. No
21
+ // wake-duration limit is introduced anywhere here; do not repurpose this timer
22
+ // into one.
23
+
24
+ /** Grace for an already-exited process's pipes to drain. NOT a wake timeout. */
25
+ export const DEFAULT_STDIO_GRACE_MS = 2000;
26
+
27
+ /**
28
+ * Resolve once with the child's exit code as soon as the process is KNOWN to be gone.
29
+ *
30
+ * • `close` first → resolve immediately (today's behaviour, zero regression).
31
+ * • `exit` first → wait up to `stdioGraceMs` for `close` (so a last stdout chunk
32
+ * is still parsed), then resolve with the exit code anyway.
33
+ *
34
+ * Settles exactly once and NEVER rejects. The grace timer is `unref`'d so it can
35
+ * never hold the daemon's event loop open.
36
+ *
37
+ * @param {import("node:child_process").ChildProcess} child
38
+ * @param {{ stdioGraceMs?: number, logger?: { warn?: (msg: string) => void }, label?: string }} [options]
39
+ * @returns {Promise<number | null>} the exit code (`null` when the child was signalled)
40
+ */
41
+ export function awaitChildSettled(child, options = {}) {
42
+ const { stdioGraceMs = DEFAULT_STDIO_GRACE_MS, logger, label = "child" } = options;
43
+
44
+ return new Promise((resolve) => {
45
+ let settled = false;
46
+ let timer = null;
47
+
48
+ const settle = (code) => {
49
+ if (settled) return;
50
+ settled = true;
51
+ if (timer) {
52
+ clearTimeout(timer);
53
+ timer = null;
54
+ }
55
+ resolve(code ?? null);
56
+ };
57
+
58
+ child.on?.("close", (code) => settle(code));
59
+
60
+ child.on?.("exit", (code) => {
61
+ if (settled || timer) return;
62
+ // The process is gone; give its (possibly descendant-held) pipes a bounded
63
+ // moment to drain, then settle regardless. See the header: not a timeout.
64
+ timer = setTimeout(() => {
65
+ timer = null;
66
+ if (settled) return;
67
+ logger?.warn?.(
68
+ `[Chorus] ${label} exited (code ${code ?? null}) but stdio stayed open for ` +
69
+ `${stdioGraceMs}ms; settling on exit`
70
+ );
71
+ settle(code);
72
+ }, stdioGraceMs);
73
+ // Never keep the daemon's event loop alive for a dead process's pipes.
74
+ timer?.unref?.();
75
+ });
76
+ });
77
+ }
@@ -28,6 +28,7 @@ import { validateAgentCliConfig, overlayAgentEnv, getAgentEnv, assertConfiguredS
28
28
  import { existsSync, statSync } from "node:fs";
29
29
  import { homedir } from "node:os";
30
30
  import { win32 as pathWin32, posix as pathPosix, join as pathJoin } from "node:path";
31
+ import { awaitChildSettled } from "./child-exit.mjs";
31
32
 
32
33
  const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
33
34
 
@@ -447,7 +448,9 @@ export class ClaudeSpawner {
447
448
  resolve({ sessionId: observedSessionId, backendSessionId: id, exitCode: null, isNew });
448
449
  });
449
450
 
450
- child.on("close", (code) => {
451
+ // Settle on process exit, not only on stdio close: a detached descendant can
452
+ // inherit the pipes and keep `close` from ever firing (see cli/child-exit.mjs).
453
+ awaitChildSettled(child, { logger: this.logger, label: "claude" }).then((code) => {
451
454
  if (code !== 0) {
452
455
  this.logger.warn(`[Chorus] claude exited with code ${code}`);
453
456
  }
@@ -33,6 +33,7 @@ import { readFileSync, statSync } from "node:fs";
33
33
  import { homedir } from "node:os";
34
34
  import { join, win32 as pathWin32, posix as pathPosix } from "node:path";
35
35
  import { parseNdjsonChunk } from "./claude-spawner.mjs";
36
+ import { awaitChildSettled } from "./child-exit.mjs";
36
37
  import { getThreadId as defaultGetThreadId, setThreadId as defaultSetThreadId } from "./codex-session-map.mjs";
37
38
  import {
38
39
  getCodexUsageSnapshot as defaultGetUsageSnapshot,
@@ -370,7 +371,9 @@ export class CodexSpawner {
370
371
  resolve({ sessionId: anchor, backendSessionId: observedThreadId, exitCode: null, isNew });
371
372
  });
372
373
 
373
- child.on("close", (code) => {
374
+ // Settle on process exit, not only on stdio close: a detached descendant can
375
+ // inherit the pipes and keep `close` from ever firing (see cli/child-exit.mjs).
376
+ awaitChildSettled(child, { logger: this.logger, label: "codex" }).then((code) => {
374
377
  if (code !== 0) {
375
378
  this.logger.warn(`[Chorus] codex exited with code ${code}`);
376
379
  }
@@ -12,6 +12,17 @@
12
12
  // so a stale / recycled connection uuid can never make the daemon kill the wrong
13
13
  // subprocess (Tech Design "Risks": mis-kill after a reconnect).
14
14
  //
15
+ // When Check-2 fails for an `interrupt` (no live child here) the command is NOT
16
+ // silently dropped (fix-phantom-running-turn, Tech Design "D — a no-child interrupt
17
+ // reports the truth"): the handler logs the miss AND fire-and-forgets one
18
+ // `advanceTurn({ status: "interrupted", interruptedReason: "user" })` so a server-side
19
+ // `running` turn with no daemon child behind it converges instead of hanging forever.
20
+ // The session business key is derived without any lookup, and therefore only for the
21
+ // two control entity types where the derivation is an identity (`idea`,
22
+ // `daemon_session` → sessionId === entityUuid). `task` / `proposal` / `document` keep
23
+ // the pure-log behaviour: their session is anchored on the resource's DIRECT idea,
24
+ // which the daemon cannot resolve locally, and guessing would converge the wrong turn.
25
+ //
15
26
  // On a verified match it (a) sets a per-entity "interrupting" flag on the waker so
16
27
  // the waker reports the resulting exit as interrupted(reason="user") rather than a
17
28
  // crash, then (b) invokes the injected killer (process-killer.killProcessTree) on
@@ -25,6 +36,16 @@ import { killProcessTree } from "./process-killer.mjs";
25
36
 
26
37
  const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
27
38
 
39
+ /**
40
+ * Control entity types whose session business key is the entityUuid itself, so a
41
+ * no-child interrupt can report the turn terminal WITHOUT any REST lookup:
42
+ * • `idea` — the session anchor IS the direct idea uuid.
43
+ * • `daemon_session` — the ad-hoc session's own business id.
44
+ * Every other member of CONTROL_ENTITY_TYPES (`task`, `proposal`, `document`) is
45
+ * anchored on that resource's DIRECT idea, which is not derivable locally.
46
+ */
47
+ const SELF_ANCHORED_ENTITY_TYPES = new Set(["idea", "daemon_session"]);
48
+
28
49
  /**
29
50
  * Build the `onControl(event)` callback the SseListener invokes for a
30
51
  * `type:"control"` event.
@@ -56,6 +77,15 @@ const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
56
77
  * other still-pending turn along. Injected by the
57
78
  * daemon (`backfill.pendingTurnsOnly`); the
58
79
  * arg-less form (reconnect) still sweeps all.
80
+ * advanceTurn?: (params: { sessionId: string, status: string, interruptedReason?: string,
81
+ * entityType?: string|null, entityUuid?: string|null }) => any,
82
+ * The SAME `createTurnReporter(...)` instance the
83
+ * waker uses (injected by `cli/daemon.mjs`; no
84
+ * second transport, no new endpoint). Invoked
85
+ * fire-and-forget ONLY when an `interrupt` finds no
86
+ * live child for a self-anchored entity type, to
87
+ * close a server-side `running` turn that nothing
88
+ * else would ever close.
59
89
  * logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
60
90
  * }} deps
61
91
  * @returns {(event: any) => void} The onControl callback (synchronous, non-throwing).
@@ -67,6 +97,7 @@ export function createControlHandler(deps) {
67
97
  const sigintTimeoutMs = deps.sigintTimeoutMs;
68
98
  const redispatchResume = deps.redispatchResume;
69
99
  const deliverTurn = deps.deliverTurn;
100
+ const advanceTurn = deps.advanceTurn;
70
101
  const handleDirectoryRequest = deps.handleDirectoryRequest;
71
102
  const reportDirectoryRequest = deps.reportDirectoryRequest;
72
103
  const logger = deps.logger ?? NOOP_LOGGER;
@@ -202,11 +233,76 @@ export function createControlHandler(deps) {
202
233
  }
203
234
 
204
235
  // --- interrupt path: Check 2 — in-memory entity ownership (running child) ---
236
+ //
237
+ // The registry is keyed by the WAKE's own resource (`task:T`), while a
238
+ // conversation's control key is its session anchor (`idea:A`). A wake on a CHILD
239
+ // resource of idea A runs on session A (waker: `sessionId = directIdeaUuid`), so an
240
+ // `idea:A` interrupt must also find a running `task:T` / `proposal:P` / `document:D`
241
+ // entry whose `directIdeaUuid` is A — the same rule the UI's `executionMatchesSession`
242
+ // applies. Without this the exact-key lookup misses, we report a turn miss, the
243
+ // server's FIFO resolution grabs the SIBLING wake's `running` turn, and NOTHING is
244
+ // killed: the UI would say interrupted while the agent keeps working.
205
245
  const key = execKey(entityType, entityUuid);
206
- const entry = waker?.executions?.get(key);
246
+ let entry = waker?.executions?.get(key);
247
+ // The entity the kill actually targets — normally the command's own, but a sibling
248
+ // wake when the match below re-points it.
249
+ let killEntityType = entityType;
250
+ let killEntityUuid = entityUuid;
251
+ let killKey = key;
252
+ if ((!entry || entry.status !== "running" || !entry.child) && entityType === "idea") {
253
+ for (const candidate of waker?.executions?.values() ?? []) {
254
+ if (
255
+ candidate.status === "running" &&
256
+ candidate.child &&
257
+ candidate.directIdeaUuid === entityUuid
258
+ ) {
259
+ killEntityType = candidate.entityType;
260
+ killEntityUuid = candidate.entityUuid;
261
+ killKey = execKey(killEntityType, killEntityUuid);
262
+ logger.info(
263
+ `[Chorus] control: no direct child for ${key}, but sibling wake ${killKey} ` +
264
+ `runs on this session; interrupting that instead`
265
+ );
266
+ entry = candidate;
267
+ break;
268
+ }
269
+ }
270
+ }
207
271
  if (!entry || entry.status !== "running" || !entry.child) {
208
272
  // Either we never ran this entity, it's only queued (no child yet), or the
209
- // wake already finished (race: interrupt arrived after exit). Safe no-op.
273
+ // wake already finished (race: interrupt arrived after exit). There is nothing
274
+ // to kill — but the SERVER may still hold a `running` turn for this session
275
+ // that nothing else will ever close (the phantom-running-turn bug). Report it
276
+ // terminal so the UI converges. Only for the self-anchored entity types; for
277
+ // the rest we cannot know the session locally, so keep the old pure log.
278
+ if (SELF_ANCHORED_ENTITY_TYPES.has(entityType)) {
279
+ logger.info(
280
+ `[Chorus] control: no running subprocess for ${key} on this daemon; ` +
281
+ `reporting the turn as interrupted(user)`
282
+ );
283
+ // Fire-and-forget: createTurnReporter never throws and logs its own
284
+ // failures, but guard both the synchronous throw and the rejection so
285
+ // nothing escapes into the SSE loop. A server with no `running` turn
286
+ // answers not_found — a harmless no-op (losing race).
287
+ try {
288
+ Promise.resolve(
289
+ advanceTurn?.({
290
+ sessionId: entityUuid,
291
+ status: "interrupted",
292
+ interruptedReason: "user",
293
+ entityType,
294
+ entityUuid,
295
+ })
296
+ ).catch((err) => {
297
+ logger.warn(
298
+ `[Chorus] control: interrupted-turn report rejected for ${key}: ${err}`
299
+ );
300
+ });
301
+ } catch (err) {
302
+ logger.warn(`[Chorus] control: interrupted-turn report failed for ${key}: ${err}`);
303
+ }
304
+ return;
305
+ }
210
306
  logger.info(
211
307
  `[Chorus] control: no running subprocess for ${key} on this daemon; ignoring interrupt`
212
308
  );
@@ -215,18 +311,20 @@ export function createControlHandler(deps) {
215
311
 
216
312
  // --- Both checks passed: mark interrupting (so the waker reports reason=user),
217
313
  // then kill the tree. ---
218
- logger.info(`[Chorus] control: interrupting running subprocess for ${key} (pid=${entry.child.pid})`);
314
+ logger.info(`[Chorus] control: interrupting running subprocess for ${killKey} (pid=${entry.child.pid})`);
219
315
  try {
220
- waker.markInterrupting?.(entityType, entityUuid);
316
+ // Flag the entity whose wake we are actually killing — a sibling re-point must
317
+ // mark THAT wake interrupting, or its exit would be reported as a crash.
318
+ waker.markInterrupting?.(killEntityType, killEntityUuid);
221
319
  } catch (err) {
222
- logger.warn(`[Chorus] control: markInterrupting failed for ${key}: ${err}`);
320
+ logger.warn(`[Chorus] control: markInterrupting failed for ${killKey}: ${err}`);
223
321
  }
224
322
 
225
323
  // Fire-and-forget the kill: the waker observes the child's exit and reports
226
324
  // the interrupted state. The killer never throws, but guard the promise
227
325
  // anyway so a rejection can't surface as an unhandled rejection.
228
326
  Promise.resolve(killer(entry.child, { sigintTimeoutMs, logger })).catch((err) => {
229
- logger.warn(`[Chorus] control: killProcessTree rejected for ${key}: ${err}`);
327
+ logger.warn(`[Chorus] control: killProcessTree rejected for ${killKey}: ${err}`);
230
328
  });
231
329
  } catch (err) {
232
330
  // Absolute backstop — a control event must never crash the SSE loop.