@chorus-aidlc/chorus 0.17.2 → 0.18.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 (446) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +357 -355
  3. package/.next/standalone/.next/app-path-routes-manifest.json +44 -44
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +18 -18
  6. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
  7. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +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.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
  69. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +1 -1
  70. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
  83. package/.next/standalone/.next/server/app/api/comments/route.js.nft.json +1 -1
  84. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +1 -1
  91. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -1
  93. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -1
  95. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -1
  96. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -1
  100. package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -1
  103. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
  106. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -1
  107. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route.js.nft.json +1 -1
  109. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -1
  113. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js +1 -1
  116. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js.nft.json +1 -1
  117. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -1
  119. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +1 -1
  120. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -1
  122. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -1
  123. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -1
  125. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -1
  126. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js +1 -1
  129. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/events/notifications/route.js +1 -1
  132. package/.next/standalone/.next/server/app/api/events/notifications/route.js.nft.json +1 -1
  133. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/events/route.js +1 -1
  135. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  139. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +1 -1
  140. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
  142. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +1 -1
  143. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
  145. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js +1 -1
  148. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -1
  149. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
  151. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +1 -1
  152. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
  154. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +1 -1
  155. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route.js.nft.json +1 -1
  157. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js +1 -1
  159. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/api/mcp/route.js +1 -1
  162. package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
  163. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
  165. package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
  168. package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +1 -1
  169. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js +1 -1
  171. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js +1 -1
  174. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +1 -1
  175. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js +1 -1
  177. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +1 -1
  178. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  179. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js +1 -1
  180. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +1 -1
  181. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/api/notifications/route.js +1 -1
  183. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  185. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js +1 -1
  186. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +1 -1
  187. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  189. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  190. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  191. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  192. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  193. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  194. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  195. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
  197. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  198. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
  199. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  200. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  201. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  202. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
  203. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
  204. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  205. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
  206. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
  207. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  208. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  209. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  210. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  211. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js +1 -1
  212. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js.nft.json +1 -1
  213. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  214. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  215. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  216. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
  217. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
  218. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  219. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
  220. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
  221. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  222. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route.js.nft.json +1 -1
  223. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
  224. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  225. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  226. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  227. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  228. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  229. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  230. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  231. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  232. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  233. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  234. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  235. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
  236. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +1 -1
  237. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  238. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
  239. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +1 -1
  240. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  241. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
  242. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +1 -1
  243. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  244. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
  245. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +1 -1
  246. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  247. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
  248. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +1 -1
  249. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  250. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
  251. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +1 -1
  252. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  253. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
  254. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +1 -1
  255. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  256. package/.next/standalone/.next/server/app/index.html +2 -2
  257. package/.next/standalone/.next/server/app/index.rsc +2 -2
  258. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  259. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  260. package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
  261. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  262. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  263. package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
  264. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  265. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  267. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
  268. package/.next/standalone/.next/server/app/login.html +2 -2
  269. package/.next/standalone/.next/server/app/login.rsc +2 -2
  270. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  271. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  272. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  273. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  274. package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
  275. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  276. package/.next/standalone/.next/server/app/projects.html +2 -2
  277. package/.next/standalone/.next/server/app/projects.rsc +3 -3
  278. package/.next/standalone/.next/server/app/settings.html +2 -2
  279. package/.next/standalone/.next/server/app/settings.rsc +4 -4
  280. package/.next/standalone/.next/server/app-paths-manifest.json +44 -44
  281. package/.next/standalone/.next/server/chunks/109.js +1 -0
  282. package/.next/standalone/.next/server/chunks/1318.js +1 -1
  283. package/.next/standalone/.next/server/chunks/1496.js +1 -0
  284. package/.next/standalone/.next/server/chunks/1559.js +2 -2
  285. package/.next/standalone/.next/server/chunks/2572.js +1 -1
  286. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  287. package/.next/standalone/.next/server/chunks/3112.js +1 -1
  288. package/.next/standalone/.next/server/chunks/{2536.js → 3619.js} +3 -3
  289. package/.next/standalone/.next/server/chunks/{6080.js → 4810.js} +1 -1
  290. package/.next/standalone/.next/server/chunks/4827.js +1 -1
  291. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  292. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  293. package/.next/standalone/.next/server/chunks/6506.js +2 -2
  294. package/.next/standalone/.next/server/chunks/6515.js +2 -2
  295. package/.next/standalone/.next/server/chunks/6737.js +1 -0
  296. package/.next/standalone/.next/server/chunks/6753.js +3 -3
  297. package/.next/standalone/.next/server/chunks/679.js +1 -1
  298. package/.next/standalone/.next/server/chunks/731.js +1 -0
  299. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  300. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  301. package/.next/standalone/.next/server/chunks/7857.js +1 -0
  302. package/.next/standalone/.next/server/chunks/920.js +1 -1
  303. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  304. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  305. package/.next/standalone/.next/server/chunks/9931.js +1 -1
  306. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  307. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  308. package/.next/standalone/.next/server/pages/404.html +2 -2
  309. package/.next/standalone/.next/server/pages/500.html +1 -1
  310. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  311. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  312. package/.next/standalone/.next/static/chunks/11595.0afa1a540f681fb4.js +1 -0
  313. package/.next/standalone/.next/static/chunks/22705-324a191727ae45b7.js +1 -0
  314. package/.next/standalone/.next/static/chunks/{31308-32614efb88305738.js → 31308-bb4a97b3f39c22dd.js} +1 -1
  315. package/.next/standalone/.next/static/chunks/33456.4a5f4712a7e78d8f.js +1 -0
  316. package/.next/standalone/.next/static/chunks/44216-3876e84f5b02d355.js +1 -0
  317. package/.next/standalone/.next/static/chunks/4860.5719e32b95be2d93.js +1 -0
  318. package/.next/standalone/.next/static/chunks/6528-a8a562ef7d26bb43.js +1 -0
  319. package/.next/standalone/.next/static/chunks/67439-7b339b28ed0ecfc6.js +1 -0
  320. package/.next/standalone/.next/static/chunks/79919-ae8bd8d8ec1e38ce.js +1 -0
  321. package/.next/standalone/.next/static/chunks/82203-4ce5926624df7ed0.js +1 -0
  322. package/.next/standalone/.next/static/chunks/94643-37ac7b8ef8ea5e75.js +1 -0
  323. package/.next/standalone/.next/static/chunks/99373.6c1509bfaf599741.js +1 -0
  324. package/.next/standalone/.next/static/chunks/99775-697e82ee04eac6b1.js +1 -0
  325. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-2fda722cdace8147.js +1 -0
  326. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-eecb38fa4b8eb4e8.js → page-b45c42c536eff64b.js} +1 -1
  327. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-792aba7fd6b6daa3.js +1 -0
  328. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-cd7ec77596304a07.js → page-800a979f12b73f27.js} +1 -1
  329. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-97a9e6f949002004.js → page-34de35f75aa71f6d.js} +1 -1
  330. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-a16002aa2a911619.js +1 -0
  331. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-cec15f4b835d34fc.js → page-e8030824994edf35.js} +1 -1
  332. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-4f7f1ddbaf79be8f.js +1 -0
  333. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-4ee117e690fda56f.js → page-349b0977f3c6209a.js} +1 -1
  334. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-7fbc46dfb7b22bd3.js → page-be43cb06112fce12.js} +1 -1
  335. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-6916e1abab42a6e6.js +1 -0
  336. package/.next/standalone/.next/static/chunks/app/onboarding/{page-4fce966dc96d4ff1.js → page-c0090caae202eae5.js} +1 -1
  337. package/.next/standalone/.next/static/chunks/{webpack-1bfc783412a06fc5.js → webpack-cfb63dd1b416c92e.js} +1 -1
  338. package/.next/standalone/.next/static/css/75c761a5428611fa.css +1 -0
  339. package/.next/standalone/package.json +1 -1
  340. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +2 -2
  341. package/.next/standalone/public/chorus-plugin/agents/code-reviewer.md +1 -0
  342. package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +12 -3
  343. package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +4 -0
  344. package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +1 -1
  345. package/.next/standalone/public/chorus-plugin/bin/on-post-submit-for-verify.sh +3 -3
  346. package/.next/standalone/public/chorus-plugin/bin/on-post-submit-proposal.sh +3 -3
  347. package/.next/standalone/public/chorus-plugin/bin/on-post-verify-task.sh +2 -2
  348. package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +39 -64
  349. package/.next/standalone/public/chorus-plugin/bin/resolve-spec-mode.sh +107 -0
  350. package/.next/standalone/public/chorus-plugin/bin/tests/test-resolver-drift.sh +46 -0
  351. package/.next/standalone/public/chorus-plugin/bin/tests/test-skill-harness-fidelity-negative.sh +328 -0
  352. package/.next/standalone/public/chorus-plugin/bin/tests/test-skill-harness-fidelity.sh +372 -0
  353. package/.next/standalone/public/chorus-plugin/bin/tests/test-spec-mode-resolution.sh +83 -0
  354. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  355. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +11 -6
  356. package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +1 -1
  357. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +14 -9
  358. package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
  359. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  360. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +27 -31
  361. package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +11 -1
  362. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +14 -7
  363. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +6 -4
  364. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +10 -8
  365. package/.next/standalone/public/chorus-plugin/skills/spec-lite/SKILL.md +147 -0
  366. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +49 -34
  367. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-code-reviewer.json +1 -1
  368. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json +2 -1
  369. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-task-reviewer.json +1 -1
  370. package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus.md +1 -1
  371. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  372. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-cli/SKILL.md +1 -1
  373. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +9 -7
  374. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
  375. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
  376. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +35 -27
  377. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +9 -1
  378. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +14 -7
  379. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +2 -2
  380. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +8 -8
  381. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-spec-lite/SKILL.md +147 -0
  382. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +39 -25
  383. package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +11 -6
  384. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  385. package/.next/standalone/public/kiro-plugin/bin/on-agent-spawn.sh +41 -0
  386. package/.next/standalone/public/kiro-plugin/bin/on-post-submit-for-verify.sh +3 -3
  387. package/.next/standalone/public/kiro-plugin/bin/on-post-submit-proposal.sh +3 -3
  388. package/.next/standalone/public/kiro-plugin/bin/on-post-verify-task.sh +2 -2
  389. package/.next/standalone/public/kiro-plugin/bin/resolve-spec-mode.sh +107 -0
  390. package/.next/standalone/public/kiro-plugin/manifest.txt +2 -0
  391. package/.next/standalone/public/skill/chorus/SKILL.md +11 -1
  392. package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -0
  393. package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
  394. package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +11 -1
  395. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +5 -2
  396. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
  397. package/.next/standalone/public/skill/review-chorus/SKILL.md +5 -3
  398. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +4 -0
  399. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +23 -7
  400. package/README.ja.md +3 -3
  401. package/README.ko.md +3 -3
  402. package/README.md +3 -3
  403. package/README.zh.md +3 -3
  404. package/cli/agent-cli-config.mjs +323 -0
  405. package/cli/agent-launcher.mjs +45 -17
  406. package/cli/claude-spawner.mjs +22 -13
  407. package/cli/codex-spawner.mjs +23 -15
  408. package/cli/credentials.mjs +7 -0
  409. package/cli/daemon-agent.mjs +1 -1
  410. package/cli/daemon-config.mjs +14 -0
  411. package/cli/daemon.mjs +34 -9
  412. package/cli/dsh-managed-config.mjs +219 -293
  413. package/cli/dsh-spawner.mjs +53 -27
  414. package/cli/init/steps/credential-seed.mjs +1 -1
  415. package/cli/kiro-spawner.mjs +22 -15
  416. package/cli/launch-diagnostics.mjs +67 -0
  417. package/cli/login.mjs +17 -1
  418. package/cli/pi-spawner.mjs +19 -12
  419. package/cli/prompts.mjs +52 -2
  420. package/cli/spawner-select.mjs +6 -11
  421. package/package.json +1 -1
  422. package/.next/standalone/.next/server/chunks/1114.js +0 -1
  423. package/.next/standalone/.next/server/chunks/2953.js +0 -1
  424. package/.next/standalone/.next/server/chunks/5162.js +0 -1
  425. package/.next/standalone/.next/server/chunks/6689.js +0 -1
  426. package/.next/standalone/.next/server/chunks/9667.js +0 -1
  427. package/.next/standalone/.next/static/chunks/11595.b81c0bf7732c3b62.js +0 -1
  428. package/.next/standalone/.next/static/chunks/24808-e3d95efc7ec039c5.js +0 -1
  429. package/.next/standalone/.next/static/chunks/33456.cfc9aa607a62e879.js +0 -1
  430. package/.next/standalone/.next/static/chunks/4860.41351a823cf400e4.js +0 -1
  431. package/.next/standalone/.next/static/chunks/51468-194d894e563580dd.js +0 -1
  432. package/.next/standalone/.next/static/chunks/61570-527701d072d00a24.js +0 -1
  433. package/.next/standalone/.next/static/chunks/65066-6da35d5cb080c7f5.js +0 -1
  434. package/.next/standalone/.next/static/chunks/72875-0987d09cd8406614.js +0 -1
  435. package/.next/standalone/.next/static/chunks/75936-79860953212592fd.js +0 -1
  436. package/.next/standalone/.next/static/chunks/79919-e02963faee5cb563.js +0 -1
  437. package/.next/standalone/.next/static/chunks/94643-e8f5fa25e2340cc8.js +0 -1
  438. package/.next/standalone/.next/static/chunks/99373.633f7c25e64bcdac.js +0 -1
  439. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-bb5ef11586301c72.js +0 -1
  440. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-725373108da1b08c.js +0 -1
  441. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-7d2f4713697eb0a7.js +0 -1
  442. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0225f87552b977d9.js +0 -1
  443. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-8b30678a58e7b2ee.js +0 -1
  444. package/.next/standalone/.next/static/css/1d9cf83f50b6db00.css +0 -1
  445. /package/.next/standalone/.next/static/{WSN4XeA1kUCI6CeEHcaT_ → IxKVu5zkFPTjSKAUR99yH}/_buildManifest.js +0 -0
  446. /package/.next/standalone/.next/static/{WSN4XeA1kUCI6CeEHcaT_ → IxKVu5zkFPTjSKAUR99yH}/_ssgManifest.js +0 -0
@@ -2,6 +2,8 @@
2
2
  // session are created per wake; no dsh session state is persisted by Chorus.
3
3
 
4
4
  import { spawn } from "node:child_process";
5
+ import { safeSpawnError, redactedSetupError } from "./launch-diagnostics.mjs";
6
+ import { validateAgentCliConfig, overlayAgentEnv, getAgentEnv, assertConfiguredShimArgs } from "./agent-cli-config.mjs";
5
7
  import { randomUUID } from "node:crypto";
6
8
  import { statSync } from "node:fs";
7
9
  import { win32 as pathWin32, posix as pathPosix } from "node:path";
@@ -28,20 +30,21 @@ function isFile(path) {
28
30
  }
29
31
  }
30
32
 
31
- /** Resolve the external SDK runtime. CHORUS_DSH_PATH overrides PATH. */
33
+ /**
34
+ * Resolve the external `dsh` CLI (the profile launcher — dsh 0.1.2-rc.1 removed
35
+ * the standalone `dsh-jsonrpc-agent` bin). CHORUS_DSH_PATH overrides PATH.
36
+ */
32
37
  export function resolveDshPath(deps = {}) {
33
38
  const env = deps.env ?? process.env;
34
39
  const platform = deps.platform ?? process.platform;
35
40
  const fileProbe = deps.isFile ?? isFile;
36
- const override = nonEmpty(env.CHORUS_DSH_PATH);
41
+ const override = nonEmpty(getAgentEnv(env, "CHORUS_DSH_PATH", platform));
37
42
  if (override && fileProbe(override)) return override;
38
43
 
39
44
  const windows = platform === "win32";
40
45
  const path = windows ? pathWin32 : pathPosix;
41
- const names = windows
42
- ? ["dsh-jsonrpc-agent.cmd", "dsh-jsonrpc-agent.exe", "dsh-jsonrpc-agent"]
43
- : ["dsh-jsonrpc-agent"];
44
- const dirs = (env.PATH || env.Path || "").split(path.delimiter).filter(Boolean);
46
+ const names = windows ? ["dsh.cmd", "dsh.exe", "dsh"] : ["dsh"];
47
+ const dirs = (getAgentEnv(env, "PATH", platform) || env.Path || "").split(path.delimiter).filter(Boolean);
45
48
  for (const dir of dirs) {
46
49
  for (const name of names) {
47
50
  const candidate = path.join(dir, name);
@@ -51,9 +54,14 @@ export function resolveDshPath(deps = {}) {
51
54
  return null;
52
55
  }
53
56
 
54
- /** Resolve the required Cordis composition without placing it in argv. */
55
- export function resolveDshConfig(env = process.env) {
56
- return nonEmpty(env.CHORUS_DSH_CONFIG) ?? nonEmpty(env.DSH_CORDIS_CONFIG);
57
+ /**
58
+ * An operator-supplied managed home override. When set, the daemon boots
59
+ * `dsh --profile sdk` against this pre-composed DSH_HOME and skips managed
60
+ * profile preparation entirely (the escape hatch replacing the old
61
+ * DSH_CORDIS_CONFIG override — which is gone with the removed cordis.yml model).
62
+ */
63
+ export function resolveDshHome(env = process.env, platform = process.platform) {
64
+ return nonEmpty(getAgentEnv(env, "CHORUS_DSH_HOME", platform)) ?? nonEmpty(getAgentEnv(env, "DSH_HOME", platform));
57
65
  }
58
66
 
59
67
  /** Windows npm command shims need cmd.exe while retaining argv isolation. */
@@ -61,7 +69,7 @@ export function resolveDshSpawnCommand(dshPath, platform = process.platform, env
61
69
  const lower = dshPath.toLowerCase();
62
70
  if (platform === "win32" && (lower.endsWith(".cmd") || lower.endsWith(".bat"))) {
63
71
  return {
64
- command: env.ComSpec || env.COMSPEC || "cmd.exe",
72
+ command: getAgentEnv(env, "COMSPEC", platform) || "cmd.exe",
65
73
  argv: ["/d", "/s", "/c", dshPath],
66
74
  };
67
75
  }
@@ -133,7 +141,8 @@ export class DshSpawner {
133
141
  this.logger = opts.logger ?? NOOP_LOGGER;
134
142
  this.creds = opts.creds ?? null;
135
143
  this.platform = opts.platform ?? process.platform;
136
- this.env = opts.env ?? process.env;
144
+ this.cliConfig = validateAgentCliConfig(opts.cliConfig, "dsh", opts.label);
145
+ this.env = overlayAgentEnv(opts.env ?? process.env, this.cliConfig.env, this.platform);
137
146
  this.bundleVersion = opts.bundleVersion ?? null;
138
147
  this.prepareManagedConfigFn = opts.prepareManagedConfigFn ?? prepareManagedDshConfig;
139
148
  this.timeoutMs = opts.timeoutMs ?? positiveInt(this.env.CHORUS_DSH_TIMEOUT_MS, DEFAULT_DSH_TIMEOUT_MS);
@@ -143,8 +152,9 @@ export class DshSpawner {
143
152
  }
144
153
 
145
154
  async wake({ prompt, sessionId: anchor, cwd, onMessage, onChild }) {
146
- let dshPath = this.dshPath ?? this.resolveDshPathFn({ env: this.env, platform: this.platform });
147
- let config = resolveDshConfig(this.env);
155
+ const dshPath = this.dshPath ?? this.resolveDshPathFn({ env: this.env, platform: this.platform });
156
+ let dshHome = resolveDshHome(this.env, this.platform);
157
+ let patchPath = null;
148
158
  const result = (backendSessionId, exitCode) => ({
149
159
  sessionId: backendSessionId || anchor || "",
150
160
  backendSessionId: backendSessionId || null,
@@ -154,37 +164,41 @@ export class DshSpawner {
154
164
 
155
165
  if (!dshPath) {
156
166
  this.logger.error(
157
- "[Chorus] cannot locate `dsh-jsonrpc-agent`; install it or set CHORUS_DSH_PATH",
167
+ "[Chorus] cannot locate the `dsh` CLI; install DeepSeek Harness (dsh) or set CHORUS_DSH_PATH",
158
168
  );
159
169
  return result(null, null);
160
170
  }
161
- if (!config) {
171
+ assertConfiguredShimArgs(dshPath, this.cliConfig.args, this.platform);
172
+ if (!dshHome) {
162
173
  try {
163
174
  const managed = await this.prepareManagedConfigFn({
164
175
  env: this.env,
176
+ platform: this.platform,
165
177
  bundleVersion: this.bundleVersion,
166
178
  dshPath,
167
179
  creds: this.creds,
168
180
  });
169
- config = managed.configPath;
170
- dshPath = managed.runtimePath ?? dshPath;
181
+ dshHome = managed.home;
182
+ patchPath = managed.patchPath ?? null;
171
183
  } catch (error) {
172
- this.logger.error(`[Chorus] cannot prepare managed dsh config: ${errorText(error)}`);
184
+ const detail = redactedSetupError(error);
185
+ this.logger.error(`[Chorus] cannot prepare managed dsh profile: ${detail}`);
173
186
  return result(null, null);
174
187
  }
188
+ } else {
189
+ this.logger.info("[Chorus] using existing DSH_HOME profile, skipping managed preparation");
175
190
  }
176
191
 
177
192
  const dshSessionId = `chorus-${this.uuidFn().replaceAll("-", "")}`;
178
193
  const provider =
179
- nonEmpty(this.env.CHORUS_DSH_PROVIDER) ?? nonEmpty(this.env.DSH_PROVIDER) ?? "deepseek-official";
194
+ nonEmpty(getAgentEnv(this.env, "CHORUS_DSH_PROVIDER", this.platform)) ?? nonEmpty(getAgentEnv(this.env, "DSH_PROVIDER", this.platform)) ?? "deepseek-official";
180
195
  const model =
181
- nonEmpty(this.env.CHORUS_DSH_MODEL) ?? nonEmpty(this.env.DSH_MODEL) ?? "deepseek-v4-flash";
182
- const childEnv = {
183
- ...this.env,
196
+ nonEmpty(getAgentEnv(this.env, "CHORUS_DSH_MODEL", this.platform)) ?? nonEmpty(getAgentEnv(this.env, "DSH_MODEL", this.platform)) ?? "deepseek-v4-flash";
197
+ const childEnv = overlayAgentEnv(this.env, {
184
198
  CHORUS_DAEMON_HEADLESS: "1",
185
- DSH_CORDIS_CONFIG: config,
199
+ DSH_HOME: dshHome,
186
200
  DSH_CWD: cwd || process.cwd(),
187
- };
201
+ }, this.platform);
188
202
  if (this.creds?.url) childEnv.CHORUS_URL = this.creds.url;
189
203
  if (this.creds?.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
190
204
  // Identity profile — the dsh doc-mirror wrapper passes this to `chorus mcp
@@ -195,7 +209,19 @@ export class DshSpawner {
195
209
  if (this.creds?.agentUuid || this.creds?.agentName)
196
210
  childEnv.CHORUS_AGENT_PROFILE = this.creds.agentUuid || this.creds.agentName;
197
211
 
198
- const { command, argv } = resolveDshSpawnCommand(dshPath, this.platform, childEnv);
212
+ // `dsh --profile sdk` boots the managed profile from DSH_HOME. The Chorus
213
+ // rows auto-apply as a bundle layer, so `--patch` is added only for a
214
+ // non-default provider overlay. resolveDshSpawnCommand keeps the win32 .cmd
215
+ // wrapper prefix; the launcher argv follows it.
216
+ const launch = resolveDshSpawnCommand(dshPath, this.platform, childEnv);
217
+ const command = launch.command;
218
+ const argv = [
219
+ ...launch.argv,
220
+ "--profile",
221
+ "sdk",
222
+ ...(patchPath ? ["--patch", patchPath] : []),
223
+ ...this.cliConfig.args,
224
+ ];
199
225
  let child;
200
226
  try {
201
227
  child = this.spawnImpl(command, argv, {
@@ -207,7 +233,7 @@ export class DshSpawner {
207
233
  windowsHide: true,
208
234
  });
209
235
  } catch (error) {
210
- this.logger.error(`[Chorus] failed to start dsh runtime: ${errorText(error)}`);
236
+ this.logger.error(`[Chorus] failed to start dsh runtime: ${safeSpawnError(error)}`);
211
237
  return result(dshSessionId, null);
212
238
  }
213
239
 
@@ -349,7 +375,7 @@ export class DshSpawner {
349
375
  if (line) this.logger.warn(`[dsh] ${line}`);
350
376
  }
351
377
  });
352
- child.on?.("error", (error) => fail(`dsh runtime process error: ${errorText(error)}`));
378
+ child.on?.("error", (error) => fail(`dsh runtime process error: ${safeSpawnError(error)}`));
353
379
  child.on?.("close", (code) => {
354
380
  closeSeen = true;
355
381
  exitCode = code;
@@ -68,7 +68,7 @@ function nonEmpty(value) {
68
68
  * Whether an init selection id is the DeepSeek Harness (dsh). dsh needs a SECOND
69
69
  * credential sink beyond ~/.chorus/daemon.json — see {@link writeDshCredentialsEnv}.
70
70
  * We gate on the selection id, NOT the daemon agentType: dsh maps to the shared
71
- * "offline" agentType (agent-type-map.mjs) alongside opencode/openclaw/pi, so the
71
+ * "offline" agentType (agent-type-map.mjs) alongside opencode/openclaw, so the
72
72
  * agentType cannot single dsh out. The id can.
73
73
  * @param {string} id
74
74
  */
@@ -28,6 +28,8 @@
28
28
  // no-op here (this task owns spawn/resume/trust/interrupt + sessionId capture).
29
29
 
30
30
  import { spawn } from "node:child_process";
31
+ import { safeSpawnError } from "./launch-diagnostics.mjs";
32
+ import { validateAgentCliConfig, overlayAgentEnv, getAgentEnv, assertConfiguredShimArgs } from "./agent-cli-config.mjs";
31
33
  import { readdirSync, readFileSync, statSync } from "node:fs";
32
34
  import { homedir } from "node:os";
33
35
  import { win32 as pathWin32, posix as pathPosix, join } from "node:path";
@@ -37,8 +39,8 @@ import { reconstructTranscript as defaultReconstructTranscript } from "./kiro-tr
37
39
  const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
38
40
 
39
41
  /** Directory Kiro persists its CLI session store under (per-cwd conversations). */
40
- export function kiroSessionsDir() {
41
- return join(homedir(), ".kiro", "sessions", "cli");
42
+ export function kiroSessionsDir(env = process.env, platform = process.platform) {
43
+ return join(getAgentEnv(env, "HOME", platform) || getAgentEnv(env, "USERPROFILE", platform) || homedir(), ".kiro", "sessions", "cli");
42
44
  }
43
45
 
44
46
  /**
@@ -96,14 +98,15 @@ export function resolveKiroPath(deps = {}) {
96
98
  }
97
99
  });
98
100
 
99
- if (env.CHORUS_KIRO_PATH && isFile(env.CHORUS_KIRO_PATH)) {
100
- return env.CHORUS_KIRO_PATH;
101
+ const override = getAgentEnv(env, "CHORUS_KIRO_PATH", platform);
102
+ if (override && isFile(override)) {
103
+ return override;
101
104
  }
102
105
 
103
106
  const isWin = platform === "win32";
104
107
  const p = isWin ? pathWin32 : pathPosix;
105
108
  const names = isWin ? ["kiro-cli.cmd", "kiro-cli.exe", "kiro-cli"] : ["kiro-cli"];
106
- const pathVar = env.PATH || env.Path || "";
109
+ const pathVar = getAgentEnv(env, "PATH", platform) || env.Path || "";
107
110
  const dirs = pathVar.split(p.delimiter).filter(Boolean);
108
111
  for (const dir of dirs) {
109
112
  for (const name of names) {
@@ -126,7 +129,7 @@ export function resolveSpawnCommand(kiroPath, args, platform = process.platform,
126
129
  const isWin = platform === "win32";
127
130
  const lower = kiroPath.toLowerCase();
128
131
  if (isWin && (lower.endsWith(".cmd") || lower.endsWith(".bat"))) {
129
- const comspec = env.ComSpec || env.COMSPEC || "cmd.exe";
132
+ const comspec = getAgentEnv(env, "COMSPEC", platform) || "cmd.exe";
130
133
  return { command: comspec, argv: ["/d", "/s", "/c", kiroPath, ...args] };
131
134
  }
132
135
  return { command: kiroPath, argv: args };
@@ -229,6 +232,8 @@ export class KiroSpawner {
229
232
  this.permissionMode = opts.permissionMode ?? "chorus";
230
233
  this.creds = opts.creds ?? null;
231
234
  this.platform = opts.platform ?? process.platform;
235
+ this.cliConfig = validateAgentCliConfig(opts.cliConfig, "kiro", opts.label);
236
+ this.env = overlayAgentEnv(opts.env ?? process.env, this.cliConfig.env, this.platform);
232
237
  this.getSessionIdFn = opts.getSessionIdFn ?? defaultGetSessionId;
233
238
  this.setSessionIdFn = opts.setSessionIdFn ?? defaultSetSessionId;
234
239
  this.resolveKiroPathFn = opts.resolveKiroPathFn ?? resolveKiroPath;
@@ -260,15 +265,16 @@ export class KiroSpawner {
260
265
  const knownSessionId = anchor ? this.getSessionIdFn(anchor) : null;
261
266
  const isNew = !knownSessionId;
262
267
 
263
- const kiroPath = this.kiroPath ?? this.resolveKiroPathFn();
268
+ const kiroPath = this.kiroPath ?? this.resolveKiroPathFn({ env: this.env, platform: this.platform });
264
269
  if (!kiroPath) {
265
270
  // No crash — surface visibly and resolve with a failure result.
266
271
  this.logger.error("[Chorus] cannot locate the `kiro-cli` executable on PATH; skipping wake");
267
272
  return { sessionId: anchor, exitCode: null, isNew };
268
273
  }
269
274
 
270
- const args = buildKiroArgs({ isNew, sessionId: knownSessionId, permissionMode: this.permissionMode });
271
- const { command, argv } = resolveSpawnCommand(kiroPath, args, this.platform);
275
+ assertConfiguredShimArgs(kiroPath, this.cliConfig.args, this.platform);
276
+ const args = [...buildKiroArgs({ isNew, sessionId: knownSessionId, permissionMode: this.permissionMode }), ...this.cliConfig.args];
277
+ const { command, argv } = resolveSpawnCommand(kiroPath, args, this.platform, this.env);
272
278
 
273
279
  // POSIX: detached process group so the interrupt path can group-kill the tree
274
280
  // (kiro-cli forks child shells for tools). Windows uses taskkill /T. stdio
@@ -277,7 +283,7 @@ export class KiroSpawner {
277
283
 
278
284
  // Export the daemon's authoritative connection pair. CHORUS_API_KEY is also
279
285
  // referenced by the plugin's MCP config; neither value is placed in argv.
280
- const childEnv = { ...process.env, CHORUS_DAEMON_HEADLESS: "1" };
286
+ const childEnv = { ...this.env, CHORUS_DAEMON_HEADLESS: "1" };
281
287
  if (this.creds) {
282
288
  if (this.creds.url) childEnv.CHORUS_URL = this.creds.url;
283
289
  if (this.creds.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
@@ -303,8 +309,8 @@ export class KiroSpawner {
303
309
  detached,
304
310
  windowsHide: true,
305
311
  });
306
- } catch (err) {
307
- this.logger.error(`[Chorus] failed to spawn kiro-cli: ${err}`);
312
+ } catch (error) {
313
+ this.logger.error(`[Chorus] failed to spawn kiro-cli: ${safeSpawnError(error)}`);
308
314
  resolve({ sessionId: anchor, exitCode: null, isNew });
309
315
  return;
310
316
  }
@@ -332,8 +338,8 @@ export class KiroSpawner {
332
338
  if (text) this.logger.warn(`[Chorus] kiro-cli stderr: ${text}`);
333
339
  });
334
340
 
335
- child.on("error", (err) => {
336
- this.logger.error(`[Chorus] kiro-cli process error: ${err}`);
341
+ child.on("error", (error) => {
342
+ this.logger.error(`[Chorus] kiro-cli process error: ${safeSpawnError(error)}`);
337
343
  resolve({ sessionId: knownSessionId || anchor, exitCode: null, isNew });
338
344
  });
339
345
 
@@ -376,6 +382,7 @@ export class KiroSpawner {
376
382
  this.reconstructTranscript({
377
383
  sessionId: observedSessionId ?? "",
378
384
  cwd: runCwd,
385
+ dir: kiroSessionsDir(this.env, this.platform),
379
386
  onMessage,
380
387
  stdout: stdoutBuf,
381
388
  logger: this.logger,
@@ -407,7 +414,7 @@ export class KiroSpawner {
407
414
  /** Snapshot the store, swallowing any failure (best-effort id capture). */
408
415
  #safeSnapshot(cwd) {
409
416
  try {
410
- return this.snapshotSessionsFn(cwd, { logger: this.logger });
417
+ return this.snapshotSessionsFn(cwd, { logger: this.logger, dir: kiroSessionsDir(this.env, this.platform) });
411
418
  } catch (err) {
412
419
  this.logger.warn(`[Chorus] kiro session snapshot failed (${err}) — id capture degraded`);
413
420
  return new Map();
@@ -0,0 +1,67 @@
1
+ // Child-process error messages, paths, argv, code and syscall are untrusted.
2
+ // Only emit known classifications for spawn failures; never echo raw fields.
3
+ const SPAWN_CODES = new Map([
4
+ ["ENOENT", "executable or working directory not found; check PATH and cwd"],
5
+ ["EACCES", "permission denied; check executable and directory permissions"],
6
+ ["EPERM", "operation not permitted; check process permissions"],
7
+ ["ENOEXEC", "invalid executable format; check the installed binary"],
8
+ ["ENOTDIR", "path component is not a directory; check executable path and cwd"],
9
+ ["EINVAL", "invalid process options; check executable and launch configuration"],
10
+ ["E2BIG", "argument/environment size limit exceeded; reduce configuration size"],
11
+ ["ENOMEM", "insufficient memory to start process"],
12
+ ["EAGAIN", "process resource limit reached; retry or check system limits"],
13
+ ["EMFILE", "process file descriptor limit reached"],
14
+ ["ENFILE", "system file descriptor limit reached"],
15
+ ["ETIMEDOUT", "process startup timed out"],
16
+ ]);
17
+
18
+ export function safeSpawnError(error) {
19
+ const code = error?.code;
20
+ return typeof code === "string" && SPAWN_CODES.has(code)
21
+ ? `${code}: ${SPAWN_CODES.get(code)}`
22
+ : "unclassified startup failure; check executable installation, PATH, cwd and permissions";
23
+ }
24
+
25
+ // Setup stderr can embed arbitrary argv/env in JSON, escaped nested errors,
26
+ // URLs, or encodings we cannot enumerate. Substring replacement is NOT a safe
27
+ // output boundary. Classify known problems, but render only these fixed strings
28
+ // (never captures, original text, paths, codes, or even a "redacted" remainder).
29
+ // Keep the patterns recognizable in our own output: setup and spawner both call
30
+ // this helper, and the second boundary must retain the first one's useful hints.
31
+ const SETUP_HINTS = [
32
+ [/version mismatch/i, "version mismatch; check dsh runtime and Chorus bundle compatibility"],
33
+ [/no adapter registered/i, "no adapter registered; check that the selected provider adapter is installed"],
34
+ [/invalid plugin graph/i, "invalid plugin graph; rebuild the sdk profile and check plugin compatibility"],
35
+ [/bad key|unauthorized|authentication failed/i, "authentication failed; check provider and Chorus credentials"],
36
+ [/ERR_PNPM.*offline|package registry unavailable/i, "package registry unavailable; check network access and pnpm registry configuration"],
37
+ [/bundle version/i, "bundle version required; check the installed Chorus version"],
38
+ [/requires the dsh CLI|dsh CLI was not found|dsh CLI required/i, "dsh CLI required; install dsh or set CHORUS_DSH_PATH"],
39
+ [/missing.*bundle layer/i, "missing Chorus bundle layer; rebuild the managed sdk profile"],
40
+ [/did not install|Chorus bundle not installed/i, "Chorus bundle not installed; check package installation and rebuild the managed sdk profile"],
41
+ [/did not complete JSON-RPC initialization/i, "did not complete JSON-RPC initialization; check the dsh sdk profile and runtime compatibility"],
42
+ [/unexpected server identity/i, "unexpected server identity; check that the sdk profile loads the expected dsh runtime"],
43
+ ];
44
+ const SETUP_CODES = new Map([
45
+ ...SPAWN_CODES,
46
+ ["ENOSPC", "disk full; free space for the managed profile"],
47
+ ["EROFS", "read-only filesystem; use a writable managed profile home"],
48
+ ]);
49
+ const SETUP_FALLBACK = "unclassified setup failure; check dsh installation, sdk profile, provider adapter, package registry and filesystem permissions (raw details withheld)";
50
+
51
+ export function redactedSetupError(error) {
52
+ const text = error instanceof Error ? error.message : typeof error === "string" ? error : "";
53
+ const stages = [];
54
+ if (/profile installation failed/i.test(text)) stages.push("dsh managed profile installation failed");
55
+ if (/composition validation failed/i.test(text)) stages.push("dsh managed composition validation failed");
56
+ if (/non-default provider/i.test(text)) {
57
+ stages.push("a non-default provider is configured; the managed sdk profile mounts only the deepseek-official adapter; pre-compose its adapter and point CHORUS_DSH_HOME at your own sdk profile");
58
+ }
59
+ const hints = [];
60
+ for (const [code, hint] of SETUP_CODES) {
61
+ if (error?.code === code || new RegExp(`\\b${code}\\b`).test(text)) hints.push(`${code}: ${hint}`);
62
+ }
63
+ for (const [pattern, hint] of SETUP_HINTS) {
64
+ if (pattern.test(text)) hints.push(hint);
65
+ }
66
+ return [...stages, hints.length ? hints.join("; ") : SETUP_FALLBACK].join(": ");
67
+ }
package/cli/login.mjs CHANGED
@@ -10,6 +10,7 @@ import { createInterface } from "node:readline";
10
10
  import { loginFilePath } from "./credentials.mjs";
11
11
  import { validateAndFetchIdentity } from "./chorus-client.mjs";
12
12
  import { promptAgentBackend } from "./agent-backend-prompt.mjs";
13
+ import { rejectSharedCliConfig } from "./agent-cli-config.mjs";
13
14
 
14
15
  /**
15
16
  * Prompt for a line of input. When `mask` is true, typed characters are not
@@ -177,9 +178,12 @@ export function appendAgentConfig(agentObj, deps = {}) {
177
178
  // treat as empty
178
179
  }
179
180
 
181
+ // Refuse already-misplaced customization before any write (even duplicates).
182
+ rejectSharedCliConfig(current);
180
183
  const existingAgents =
181
184
  Array.isArray(current.agents) ? current.agents.filter((a) => a && typeof a === "object") : [];
182
185
 
186
+ let migratedFlat = false;
183
187
  /** @type {object[]} */
184
188
  let agents;
185
189
  if (existingAgents.length > 0) {
@@ -192,6 +196,12 @@ export function appendAgentConfig(agentObj, deps = {}) {
192
196
  if (Array.isArray(current.cwds)) flat.cwds = current.cwds;
193
197
  if (nonEmpty(current.agentName)) flat.agentName = current.agentName;
194
198
  if (nonEmpty(current.agentUuid)) flat.agentUuid = current.agentUuid;
199
+ // Move by presence, not validity: later validation must attribute malformed
200
+ // values to the original agent rather than lose them or leave shared keys.
201
+ for (const field of ["args", "env"]) {
202
+ if (Object.hasOwn(current, field)) flat[field] = current[field];
203
+ }
204
+ migratedFlat = true;
195
205
  agents = [flat];
196
206
  } else {
197
207
  agents = [];
@@ -206,7 +216,13 @@ export function appendAgentConfig(agentObj, deps = {}) {
206
216
  }
207
217
 
208
218
  agents.push(agentObj);
209
- const writtenPath = updateDaemonConfig({ agents }, deps);
219
+ // JSON serialization omits undefined keys; the existing temp-file rename
220
+ // commits the fold and top-level removal together in one atomic write.
221
+ const update = { agents, ...(migratedFlat ? { args: undefined, env: undefined } : {}) };
222
+ // A flat file without a key cannot be folded into an original agent. Do not
223
+ // turn that partial config into an invalid shared file by adding an agent.
224
+ if (!migratedFlat) rejectSharedCliConfig({ ...current, agents });
225
+ const writtenPath = updateDaemonConfig(update, deps);
210
226
  return { ok: true, path: writtenPath, agents, index: agents.length - 1 };
211
227
  }
212
228
 
@@ -38,6 +38,8 @@
38
38
  // PATH-walk / .cmd-shim shape of the other spawners' path resolution.
39
39
 
40
40
  import { spawn } from "node:child_process";
41
+ import { safeSpawnError } from "./launch-diagnostics.mjs";
42
+ import { validateAgentCliConfig, overlayAgentEnv, getAgentEnv, assertConfiguredShimArgs } from "./agent-cli-config.mjs";
41
43
  import { statSync } from "node:fs";
42
44
  import { win32 as pathWin32, posix as pathPosix } from "node:path";
43
45
  import { parseNdjsonChunk } from "./claude-spawner.mjs";
@@ -83,14 +85,15 @@ export function resolvePiPath(deps = {}) {
83
85
  }
84
86
  });
85
87
 
86
- if (env.CHORUS_PI_PATH && isFile(env.CHORUS_PI_PATH)) {
87
- return env.CHORUS_PI_PATH;
88
+ const override = getAgentEnv(env, "CHORUS_PI_PATH", platform);
89
+ if (override && isFile(override)) {
90
+ return override;
88
91
  }
89
92
 
90
93
  const isWin = platform === "win32";
91
94
  const p = isWin ? pathWin32 : pathPosix;
92
95
  const names = isWin ? ["pi.cmd", "pi.exe", "pi"] : ["pi"];
93
- const pathVar = env.PATH || env.Path || "";
96
+ const pathVar = getAgentEnv(env, "PATH", platform) || env.Path || "";
94
97
  const dirs = pathVar.split(p.delimiter).filter(Boolean);
95
98
  for (const dir of dirs) {
96
99
  for (const name of names) {
@@ -113,7 +116,7 @@ export function resolveSpawnCommand(piPath, args, platform = process.platform, e
113
116
  const isWin = platform === "win32";
114
117
  const lower = piPath.toLowerCase();
115
118
  if (isWin && (lower.endsWith(".cmd") || lower.endsWith(".bat"))) {
116
- const comspec = env.ComSpec || env.COMSPEC || "cmd.exe";
119
+ const comspec = getAgentEnv(env, "COMSPEC", platform) || "cmd.exe";
117
120
  return { command: comspec, argv: ["/d", "/s", "/c", piPath, ...args] };
118
121
  }
119
122
  return { command: piPath, argv: args };
@@ -150,6 +153,8 @@ export class PiSpawner {
150
153
  this.permissionMode = opts.permissionMode ?? "chorus";
151
154
  this.creds = opts.creds ?? null;
152
155
  this.platform = opts.platform ?? process.platform;
156
+ this.cliConfig = validateAgentCliConfig(opts.cliConfig, "pi", opts.label);
157
+ this.env = overlayAgentEnv(opts.env ?? process.env, this.cliConfig.env, this.platform);
153
158
  this.resolvePiPathFn = opts.resolvePiPathFn ?? resolvePiPath;
154
159
  }
155
160
 
@@ -174,7 +179,7 @@ export class PiSpawner {
174
179
  const anchor = typeof sessionId === "string" ? sessionId : "";
175
180
  const isNewFlag = Boolean(isNew);
176
181
 
177
- const piPath = this.piPath ?? this.resolvePiPathFn();
182
+ const piPath = this.piPath ?? this.resolvePiPathFn({ env: this.env, platform: this.platform });
178
183
  if (!piPath) {
179
184
  // No crash — surface visibly and resolve with a failure result (matches the
180
185
  // other spawners' "skipping wake" convention: exitCode null, no throw).
@@ -182,8 +187,10 @@ export class PiSpawner {
182
187
  return { sessionId: anchor, backendSessionId: null, exitCode: null, isNew: isNewFlag };
183
188
  }
184
189
 
185
- const args = buildPiArgs({ sessionId: anchor });
186
- const { command, argv } = resolveSpawnCommand(piPath, args, this.platform);
190
+ assertConfiguredShimArgs(piPath, this.cliConfig.args, this.platform);
191
+ const fixed = buildPiArgs({ sessionId: anchor });
192
+ const args = [...fixed.slice(0, -1), ...this.cliConfig.args, fixed.at(-1)];
193
+ const { command, argv } = resolveSpawnCommand(piPath, args, this.platform, this.env);
187
194
 
188
195
  // POSIX: detached process group so the interrupt path can group-kill the tree
189
196
  // (pi may fork child shells / subagents). Windows uses taskkill /T. stdio stays
@@ -193,7 +200,7 @@ export class PiSpawner {
193
200
  // Export the daemon's resolved connection pair for the chorus-pi extension's
194
201
  // Chorus tooling. Explicitly overwrite inherited values so the extension and the
195
202
  // daemon cannot disagree about which Chorus instance this wake belongs to.
196
- const childEnv = { ...process.env, CHORUS_DAEMON_HEADLESS: "1" };
203
+ const childEnv = { ...this.env, CHORUS_DAEMON_HEADLESS: "1" };
197
204
  if (this.creds) {
198
205
  if (this.creds.url) childEnv.CHORUS_URL = this.creds.url;
199
206
  if (this.creds.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
@@ -214,8 +221,8 @@ export class PiSpawner {
214
221
  detached,
215
222
  windowsHide: true,
216
223
  });
217
- } catch (err) {
218
- this.logger.error(`[Chorus] failed to spawn pi: ${err}`);
224
+ } catch (error) {
225
+ this.logger.error(`[Chorus] failed to spawn pi: ${safeSpawnError(error)}`);
219
226
  resolve({ sessionId: anchor, backendSessionId: null, exitCode: null, isNew: isNewFlag });
220
227
  return;
221
228
  }
@@ -256,8 +263,8 @@ export class PiSpawner {
256
263
  if (text) this.logger.warn(`[Chorus] pi stderr: ${text}`);
257
264
  });
258
265
 
259
- child.on("error", (err) => {
260
- this.logger.error(`[Chorus] pi process error: ${err}`);
266
+ child.on("error", (error) => {
267
+ this.logger.error(`[Chorus] pi process error: ${safeSpawnError(error)}`);
261
268
  resolve({ sessionId: anchor, backendSessionId: anchor || null, exitCode: null, isNew: isNewFlag });
262
269
  });
263
270
 
package/cli/prompts.mjs CHANGED
@@ -26,6 +26,13 @@
26
26
  * @property {string} actorUuid
27
27
  * @property {string} actorName
28
28
  * @property {{type: string, uuid: string, name: string} | null} [orchestrator]
29
+ * @property {{agentUuid: string, agentName: string, ideaUuid: string} | null} [wakerSession]
30
+ * Derived, NON-persisted waker-session anchor (wake-carry-waker-session-anchor, T1). Present
31
+ * only for an agent-caused wake on an idea/task-anchored resource whose waking agent has a
32
+ * live, ONLINE-origin session for that idea — it tells the woken peer that replying on this
33
+ * resource reaches the waker's existing live session. A SIBLING of `orchestrator`
34
+ * (actor-scoped vs assignment-scoped): either, both, or neither may be present. The server
35
+ * supplies it on the `chorus_get_notifications` projection; the router threads it here.
29
36
  * @property {string} [instructionText] Free-text body of a `human_instruction` wake
30
37
  * (子1 — daemon-session-conversation). The server denormalizes the canonical turn
31
38
  * promptText onto the wake notification so the daemon reads it in the
@@ -64,6 +71,37 @@ function orchestratorGuidance(n) {
64
71
  );
65
72
  }
66
73
 
74
+ /**
75
+ * Waker-session advisory, appended to a wake body whenever the notification carries a
76
+ * `wakerSession` anchor (wake-carry-waker-session-anchor, T2). It tells the woken peer WHERE
77
+ * the waking agent's live conversation is: replying by commenting on THIS resource lands the
78
+ * reply back in that agent's existing idea-anchored session, keeping the exchange on one
79
+ * thread instead of scattering into a fresh one.
80
+ *
81
+ * It is deliberately ADVISORY, not routing — the server surfaces the anchor only when it
82
+ * resolved a live, ONLINE-origin waker session (an offline/missing waker degrades to
83
+ * notify-only and the field is null); there is no automatic subscription and nothing is
84
+ * force-delivered. The wording must NOT promise a guaranteed channel.
85
+ *
86
+ * A SIBLING of `orchestratorGuidance`: independent, appended alongside it in buildPrompt, so
87
+ * either/both/neither may render on one wake and they may name different agents. Its OpenClaw
88
+ * twin is `buildWakerSessionGuidance` in packages/openclaw-plugin/src/event-router.ts —
89
+ * KEEP THE TWO WORDINGS IN SYNC.
90
+ * @param {NotificationDetail} n
91
+ */
92
+ function wakerSessionGuidance(n) {
93
+ if (!n.wakerSession) return null;
94
+ const { agentName, agentUuid } = n.wakerSession;
95
+ return (
96
+ `@[${agentName}](agent:${agentUuid}) woke you and has a live session open on this ` +
97
+ `resource. If you reply by commenting on this same resource, your reply reaches that ` +
98
+ `agent's live session, keeping the exchange on one thread. This is advisory, not an ` +
99
+ `enforced server route — there is no automatic subscription and nothing is force-delivered; ` +
100
+ `replying here is simply where a reply lands via the normal return path. Prefer replying ` +
101
+ `on this resource over opening a new session.`
102
+ );
103
+ }
104
+
67
105
  /**
68
106
  * Shared headless preamble prepended to EVERY wake prompt (add-daemon-headless-
69
107
  * interaction-guard). A daemon-woken session is a headless `claude -p` run with no
@@ -121,7 +159,12 @@ export function buildPrompt(n) {
121
159
  const body = buildPromptBody(n);
122
160
  if (body == null) return null;
123
161
  const handoff = orchestratorGuidance(n);
124
- return `${HEADLESS_PREAMBLE}\n\n${body}${handoff ? `\n\n${handoff}` : ""}`;
162
+ const anchor = wakerSessionGuidance(n);
163
+ return (
164
+ `${HEADLESS_PREAMBLE}\n\n${body}` +
165
+ (handoff ? `\n\n${handoff}` : "") +
166
+ (anchor ? `\n\n${anchor}` : "")
167
+ );
125
168
  }
126
169
 
127
170
  /**
@@ -208,7 +251,14 @@ export function buildBatchPrompt(notifications) {
208
251
  ? `\n(${g.count} ${n.action} events on this ${entityType} arrived — showing the newest ` +
209
252
  `below; earlier ones are re-derivable via the entity's own chorus_get_* tools.)`
210
253
  : "";
211
- return `${header}${collapseNote}\n\n${g.body}`;
254
+ // Per-wake waker-session advisory (wake-carry-waker-session-anchor, T2). The anchor is
255
+ // ACTOR-scoped, so it belongs to each event individually — different queued wakes may
256
+ // carry different (or no) waker sessions. Appending it only in buildPrompt would silently
257
+ // drop it in this coalesced busy-worker batch, the feature's core scenario; so surface it
258
+ // per block here too, keyed off the collapsed group's newest notification.
259
+ const anchor = wakerSessionGuidance(n);
260
+ const anchorBlock = anchor ? `\n\n${anchor}` : "";
261
+ return `${header}${collapseNote}\n\n${g.body}${anchorBlock}`;
212
262
  });
213
263
 
214
264
  return [HEADLESS_PREAMBLE, backlogPreamble, ...rendered].join("\n\n");
@@ -59,7 +59,7 @@ export class OfflineSpawner {
59
59
  * @returns {import("./codex-spawner.mjs").Spawner}
60
60
  */
61
61
  export function selectSpawner(agentType, opts = {}) {
62
- const { logger, permissionMode, creds } = opts;
62
+ const { logger } = opts;
63
63
  if (agentType === "offline") {
64
64
  // Fail-closed: an offline agent has no local backend. Return the no-op spawner
65
65
  // explicitly so we NEVER fall through to the claude-code default below and wake
@@ -67,23 +67,18 @@ export function selectSpawner(agentType, opts = {}) {
67
67
  return new OfflineSpawner({ logger });
68
68
  }
69
69
  if (agentType === "codex") {
70
- return new CodexSpawner({ logger, permissionMode, creds });
70
+ return new CodexSpawner(opts);
71
71
  }
72
72
  if (agentType === "kiro") {
73
- return new KiroSpawner({ logger, permissionMode, creds });
73
+ return new KiroSpawner(opts);
74
74
  }
75
75
  if (agentType === "dsh") {
76
- return new DshSpawner({
77
- logger,
78
- creds,
79
- bundleVersion: opts.bundleVersion,
80
- prepareManagedConfigFn: opts.prepareManagedConfigFn,
81
- });
76
+ return new DshSpawner(opts);
82
77
  }
83
78
  if (agentType === "pi") {
84
79
  // pi is a first-class wakeable backend — an explicit branch so it NEVER falls
85
80
  // through to the claude-code default below (nor is treated as offline).
86
- return new PiSpawner({ logger, permissionMode, creds });
81
+ return new PiSpawner(opts);
87
82
  }
88
- return new ClaudeSpawner({ logger, permissionMode, creds });
83
+ return new ClaudeSpawner(opts);
89
84
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@chorus-aidlc/chorus",
3
- "version": "0.17.2",
3
+ "version": "0.18.0",
4
4
  "description": "The Agent Harness for AI-Human Collaboration — session lifecycle, task state, sub-agent orchestration, observability, and failure recovery",
5
5
  "homepage": "https://github.com/Chorus-AIDLC/Chorus",
6
6
  "repository": {