@chorus-aidlc/chorus 0.16.3 → 0.17.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 (355) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +445 -445
  3. package/.next/standalone/.next/app-path-routes-manifest.json +54 -54
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +42 -42
  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_client-reference-manifest.js +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +2 -2
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
  40. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  44. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  45. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
  48. package/.next/standalone/.next/server/app/admin/companies/new.rsc +1 -1
  49. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/admin/companies.html +2 -2
  51. package/.next/standalone/.next/server/app/admin/companies.rsc +1 -1
  52. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/admin.html +2 -2
  54. package/.next/standalone/.next/server/app/admin.rsc +1 -1
  55. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
  84. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  93. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/mcp/route.js +3 -3
  106. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
  108. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  125. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  146. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  149. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/index.html +2 -2
  157. package/.next/standalone/.next/server/app/index.rsc +1 -1
  158. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  159. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  160. package/.next/standalone/.next/server/app/login/admin.rsc +1 -1
  161. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  163. package/.next/standalone/.next/server/app/login/callback.rsc +1 -1
  164. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  165. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  167. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +1 -1
  168. package/.next/standalone/.next/server/app/login.html +2 -2
  169. package/.next/standalone/.next/server/app/login.rsc +1 -1
  170. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  171. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  174. package/.next/standalone/.next/server/app/onboarding.rsc +2 -2
  175. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/projects.html +2 -2
  177. package/.next/standalone/.next/server/app/projects.rsc +2 -2
  178. package/.next/standalone/.next/server/app/settings.html +2 -2
  179. package/.next/standalone/.next/server/app/settings.rsc +3 -3
  180. package/.next/standalone/.next/server/app-paths-manifest.json +54 -54
  181. package/.next/standalone/.next/server/chunks/1114.js +1 -1
  182. package/.next/standalone/.next/server/chunks/1318.js +1 -1
  183. package/.next/standalone/.next/server/chunks/1437.js +1 -0
  184. package/.next/standalone/.next/server/chunks/1559.js +2 -2
  185. package/.next/standalone/.next/server/chunks/2572.js +1 -1
  186. package/.next/standalone/.next/server/chunks/2618.js +1 -1
  187. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  188. package/.next/standalone/.next/server/chunks/{9793.js → 3045.js} +1 -1
  189. package/.next/standalone/.next/server/chunks/3831.js +37 -0
  190. package/.next/standalone/.next/server/chunks/4827.js +1 -1
  191. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  192. package/.next/standalone/.next/server/chunks/{4394.js → 5706.js} +1 -1
  193. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  194. package/.next/standalone/.next/server/chunks/6207.js +1 -1
  195. package/.next/standalone/.next/server/chunks/6506.js +2 -2
  196. package/.next/standalone/.next/server/chunks/6515.js +2 -2
  197. package/.next/standalone/.next/server/chunks/679.js +1 -1
  198. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  199. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  200. package/.next/standalone/.next/server/chunks/8454.js +1 -1
  201. package/.next/standalone/.next/server/chunks/920.js +1 -1
  202. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  203. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  204. package/.next/standalone/.next/server/chunks/9449.js +1 -0
  205. package/.next/standalone/.next/server/chunks/9458.js +1 -0
  206. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  207. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  208. package/.next/standalone/.next/server/pages/404.html +2 -2
  209. package/.next/standalone/.next/server/pages/500.html +1 -1
  210. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  211. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  212. package/.next/standalone/.next/static/chunks/{11595.97e534422c57aee1.js → 11595.bbe40924d18958bf.js} +1 -1
  213. package/.next/standalone/.next/static/chunks/18139-e6ef4b5869593f8e.js +1 -0
  214. package/.next/standalone/.next/static/chunks/28856-ef2cb58fbd404ef9.js +1 -0
  215. package/.next/standalone/.next/static/chunks/{31308-fda6febfb2882a28.js → 31308-bb4a97b3f39c22dd.js} +1 -1
  216. package/.next/standalone/.next/static/chunks/{33456.6dc44a6aca1a01fd.js → 33456.5499eb8e892b110a.js} +1 -1
  217. package/.next/standalone/.next/static/chunks/{4860.7873ebc9ba435c8c.js → 4860.be77046fb2b3a2bd.js} +1 -1
  218. package/.next/standalone/.next/static/chunks/66873-e3be53f41b3f2255.js +1 -0
  219. package/.next/standalone/.next/static/chunks/70303-aec3d52ad87602a3.js +1 -0
  220. package/.next/standalone/.next/static/chunks/76201-83b26515f85ce37c.js +1 -0
  221. package/.next/standalone/.next/static/chunks/78917-a8a8dff98857c045.js +1 -0
  222. package/.next/standalone/.next/static/chunks/{94643-01be319472d751b3.js → 94643-ffa140f765c73daf.js} +1 -1
  223. package/.next/standalone/.next/static/chunks/97663-9c3ae4fd60b353db.js +1 -0
  224. package/.next/standalone/.next/static/chunks/{99373.d0e808c18408b8da.js → 99373.111493dc260a2a04.js} +1 -1
  225. package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-b742c51c0a764daf.js → layout-40fe7d026c5a7c6d.js} +1 -1
  226. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-87d4d0fe90fca28c.js +1 -0
  227. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-1206abaee85dc915.js +1 -0
  228. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-425acbe9ade5fa83.js → page-474e494097c8945f.js} +1 -1
  229. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-e902b19328092ccf.js +1 -0
  230. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-f273288c3530aa0f.js +1 -0
  231. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-6568a7b08bf9a54b.js +1 -0
  232. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-fbd3c27b68666234.js +1 -0
  233. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-58b48aa0a11603c3.js → page-15bb6e1696668512.js} +1 -1
  234. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-286faced32c6133f.js → page-2bea97214b1595cc.js} +1 -1
  235. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-2bf7ceee62b574c7.js +1 -0
  236. package/.next/standalone/.next/static/chunks/app/onboarding/{page-5c82cf3abd856301.js → page-540da64d7ba16dc7.js} +1 -1
  237. package/.next/standalone/.next/static/chunks/{webpack-fa066d7ff9ab2b29.js → webpack-7cbb3ba6792f1fb3.js} +1 -1
  238. package/.next/standalone/package.json +1 -1
  239. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  240. package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +44 -1
  241. package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +4 -3
  242. package/.next/standalone/public/chorus-plugin/bin/tests/test-mcp-cli-delegation.sh +244 -0
  243. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  244. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +19 -1
  245. package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +57 -0
  246. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +2 -2
  247. package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
  248. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  249. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +85 -42
  250. package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +1 -1
  251. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +2 -2
  252. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  253. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  254. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +3 -3
  255. package/.next/standalone/public/dsh-credentials.sh +30 -0
  256. package/.next/standalone/public/install-codex.sh +21 -406
  257. package/.next/standalone/public/install-kiro.sh +20 -344
  258. package/.next/standalone/public/install-opencode.sh +20 -275
  259. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  260. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-cli/SKILL.md +57 -0
  261. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +2 -2
  262. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
  263. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
  264. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +85 -42
  265. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +1 -1
  266. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +2 -2
  267. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
  268. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
  269. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +3 -3
  270. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +44 -1
  271. package/.next/standalone/public/kiro-plugin/bin/on-agent-spawn.sh +6 -4
  272. package/.next/standalone/public/kiro-plugin/manifest.txt +41 -0
  273. package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
  274. package/.next/standalone/public/skill/chorus/SKILL.md +19 -1
  275. package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
  276. package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
  277. package/.next/standalone/public/skill/docs-chorus/SKILL.md +1 -1
  278. package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
  279. package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +1 -1
  280. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
  281. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
  282. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
  283. package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
  284. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
  285. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
  286. package/.next/standalone/public/test-dsh-credentials.sh +39 -0
  287. package/.next/standalone/public/test-install-codex.sh +31 -79
  288. package/README.ja.md +5 -3
  289. package/README.ko.md +5 -3
  290. package/README.md +5 -3
  291. package/README.zh.md +5 -3
  292. package/chorus.mjs +35 -1
  293. package/cli/agent-backend-prompt.mjs +94 -0
  294. package/cli/agents.mjs +329 -0
  295. package/cli/chorus-client.mjs +69 -0
  296. package/cli/claude-spawner.mjs +4 -0
  297. package/cli/client-args.mjs +11 -5
  298. package/cli/codex-spawner.mjs +11 -6
  299. package/cli/credentials.mjs +185 -3
  300. package/cli/daemon-agent.mjs +30 -5
  301. package/cli/daemon-banner.mjs +3 -3
  302. package/cli/daemon-config.mjs +27 -2
  303. package/cli/daemon-install-config.mjs +21 -14
  304. package/cli/daemon-rest-client.mjs +31 -8
  305. package/cli/daemon-service.mjs +120 -33
  306. package/cli/daemon.mjs +175 -28
  307. package/cli/dsh-managed-config.mjs +407 -0
  308. package/cli/dsh-spawner.mjs +445 -0
  309. package/cli/init/adapters.mjs +137 -0
  310. package/cli/init/agent-type-map.mjs +60 -0
  311. package/cli/init/chorus-plugin-consts.mjs +16 -0
  312. package/cli/init/codex-mcp-config.mjs +183 -0
  313. package/cli/init/contracts.mjs +120 -0
  314. package/cli/init/detect.mjs +97 -0
  315. package/cli/init/file-template.mjs +248 -0
  316. package/cli/init/install-methods.mjs +508 -0
  317. package/cli/init/registry.mjs +74 -0
  318. package/cli/init/run-command.mjs +30 -0
  319. package/cli/init/select.mjs +111 -0
  320. package/cli/init/steps/credential-seed.mjs +751 -0
  321. package/cli/init/steps/daemon-setup.mjs +246 -0
  322. package/cli/init/steps/plugin-install.mjs +37 -0
  323. package/cli/init-args.mjs +137 -0
  324. package/cli/init.mjs +198 -0
  325. package/cli/kiro-spawner.mjs +4 -0
  326. package/cli/login.mjs +26 -4
  327. package/cli/mcp-args.mjs +280 -0
  328. package/cli/mcp.mjs +164 -0
  329. package/cli/spawner-select.mjs +54 -2
  330. package/cli/turn-reporter.mjs +5 -2
  331. package/cli/upload-hooks.mjs +31 -1
  332. package/cli/waker.mjs +49 -6
  333. package/package.json +1 -1
  334. package/prisma/migrations/20260818024700_add_turn_backend_session_id/migration.sql +1 -0
  335. package/prisma/schema.prisma +3 -0
  336. package/.next/standalone/.next/server/chunks/3594.js +0 -1
  337. package/.next/standalone/.next/server/chunks/5351.js +0 -32
  338. package/.next/standalone/.next/server/chunks/6667.js +0 -1
  339. package/.next/standalone/.next/server/chunks/6995.js +0 -1
  340. package/.next/standalone/.next/static/chunks/19887-c0bb297a78a1c7cd.js +0 -1
  341. package/.next/standalone/.next/static/chunks/29108-5a11eea003f4cc11.js +0 -1
  342. package/.next/standalone/.next/static/chunks/53073-a7ed20af6538a178.js +0 -1
  343. package/.next/standalone/.next/static/chunks/6603-e70ddeab6ad09c50.js +0 -1
  344. package/.next/standalone/.next/static/chunks/78917-1b59cbb806b3ecfc.js +0 -1
  345. package/.next/standalone/.next/static/chunks/82751-3e161e1d8dbda3ac.js +0 -1
  346. package/.next/standalone/.next/static/chunks/99366-425e9ef22e60e3e2.js +0 -1
  347. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-f636e00c28f425ea.js +0 -1
  348. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c004f1a194af7fa5.js +0 -1
  349. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-fdd617457730a116.js +0 -1
  350. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-6b3fb08d53826d02.js +0 -1
  351. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-d5b222f379b2e8ca.js +0 -1
  352. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0a6c2d0e1b68e0e4.js +0 -1
  353. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-1507a761e67c2aa9.js +0 -1
  354. /package/.next/standalone/.next/static/{K8qIdwvKoIWbwQ_f01mnM → 0spgxl3lP26Fl1otd1D7R}/_buildManifest.js +0 -0
  355. /package/.next/standalone/.next/static/{K8qIdwvKoIWbwQ_f01mnM → 0spgxl3lP26Fl1otd1D7R}/_ssgManifest.js +0 -0
@@ -159,13 +159,26 @@ export function resolveCredentials(flags = {}, deps = {}) {
159
159
  if (url && apiKey) return { url, apiKey, source: "env" };
160
160
  }
161
161
 
162
- // 3. Login file (~/.chorus/daemon.json)
162
+ // 3. Login file (~/.chorus/daemon.json): the flat top-level url/apiKey, else the
163
+ // first agents[] entry. The flat top-level agent config is DEPRECATED — `chorus
164
+ // init` now writes credentials only into agents[] — so fall back to agents[0]
165
+ // so this single-credential resolver (install/daemon-setup gate, legacy flat
166
+ // daemon) still resolves from an agents[]-only daemon.json.
163
167
  tried.push(`login file (${loginPath}, run \`chorus login\`)`);
164
168
  {
165
169
  const file = readJson(loginPath);
166
170
  if (file) {
167
- const url = nonEmpty(file.url);
168
- const apiKey = nonEmpty(file.apiKey);
171
+ let url = nonEmpty(file.url);
172
+ let apiKey = nonEmpty(file.apiKey);
173
+ if (!(url && apiKey) && Array.isArray(file.agents)) {
174
+ const a0 = file.agents.find(
175
+ (a) => a && typeof a === "object" && nonEmpty(a.url) && nonEmpty(a.apiKey),
176
+ );
177
+ if (a0) {
178
+ url = nonEmpty(a0.url);
179
+ apiKey = nonEmpty(a0.apiKey);
180
+ }
181
+ }
169
182
  if (url && apiKey) return { url, apiKey, source: "login-file" };
170
183
  }
171
184
  }
@@ -194,3 +207,172 @@ export function resolveCredentials(flags = {}, deps = {}) {
194
207
  " • login: chorus login (persists to ~/.chorus/daemon.json)\n"
195
208
  );
196
209
  }
210
+
211
+ /**
212
+ * @typedef {Object} McpCredentials
213
+ * @property {string} url
214
+ * @property {string} apiKey
215
+ * @property {string} label Diagnostic label for the acting identity ("flag" /
216
+ * "env" / a `~/.chorus/daemon.json` agent name/label / the flat-resolution source).
217
+ */
218
+
219
+ /**
220
+ * Resolve the url + `cho_` API key AND the acting agent identity for the
221
+ * `chorus mcp` command group. Unlike `resolveCredentials`, this understands the
222
+ * multi-agent `agents[]` model and refuses to guess which agent to act as.
223
+ *
224
+ * PROFILE identity (AWS-CLI style): a caller can name WHICH agent to act as by
225
+ * `--agent <name|uuid>` (explicit flag) or the `CHORUS_AGENT_PROFILE` env var,
226
+ * and this resolves that agent's key from `~/.chorus/daemon.json` — the secret
227
+ * never has to be threaded through the caller's environment. A profile matches
228
+ * an `agents[]` entry by its `agentUuid`, `agentName`, or the back-compat
229
+ * `label`/`name` aliases (exact). Ambiguous (matches >1 entry) → hard error.
230
+ *
231
+ * Precedence (owner decision: PREFER profile, fall back to url+key mode when no
232
+ * profile resolves — the key stays written in daemon.json, url+key is the
233
+ * fallback so the CLI-absent curl path still works):
234
+ * 1. Explicit `--agent <name|uuid>` flag → deliberate profile selection from
235
+ * `agents[]`, PREFERRED over an explicit url+key pair (no match → hard error
236
+ * listing agents). With NO `agents[]` it rides along an explicit `--url/--api-key`
237
+ * pair (else the env pair) as the label, else it is a usage error.
238
+ * 2. Explicit `--url` + `--api-key` flags (no `--agent`) → used directly
239
+ * (identity is explicit); a `CHORUS_AGENT_PROFILE` name rides along as the label.
240
+ * 3. `CHORUS_AGENT_PROFILE` env → ambient profile selection from `agents[]`.
241
+ * A match wins over the url+key env pair; NO match falls through (the
242
+ * profile "doesn't exist" → url-mode fallback), an ambiguous match throws.
243
+ * 4. `CHORUS_URL` + `CHORUS_API_KEY` env pair → used directly (url-mode
244
+ * fallback / legacy plugin-hook path); a profile name rides as the label.
245
+ * 5. Exactly one agent in `agents[]` + nothing specified → that agent.
246
+ * 6. More than one agent + nothing specified → hard error (never pick
247
+ * silently), listing the available agents.
248
+ * 7. No `agents[]` → flat resolution via `resolveCredentials`.
249
+ *
250
+ * Each selected agent's `url`/`apiKey` merges over the top-level per-field
251
+ * defaults (`resolveCredentialDefaults`), so an agent that omits a field
252
+ * inherits it.
253
+ *
254
+ * This never imports `cli/daemon-config.mjs` (which imports THIS module) — it
255
+ * reads `agents[]` directly to stay cycle-free; only url/apiKey/label matter for
256
+ * MCP, so per-agent agentType/permissionMode validation is intentionally skipped.
257
+ *
258
+ * @param {{ url?: string, apiKey?: string, agent?: string }} flags
259
+ * @param {ResolveDeps} [deps]
260
+ * @returns {McpCredentials}
261
+ * @throws {Error} on ambiguity, a missing `--agent` label, or nothing resolvable.
262
+ */
263
+ export function resolveMcpCredentials(flags = {}, deps = {}) {
264
+ const env = deps.env ?? process.env;
265
+ const readJson = deps.readJson ?? readJsonSafe;
266
+ const loginPath = deps.loginPath ?? loginFilePath();
267
+ const flagAgent = nonEmpty(flags.agent);
268
+ const envProfile = nonEmpty(env.CHORUS_AGENT_PROFILE);
269
+ // The profile name a caller asked for, whatever its source — used as the
270
+ // diagnostic label when creds ultimately come from explicit flags / the env pair.
271
+ const wanted = flagAgent ?? envProfile;
272
+
273
+ const envPair = () => {
274
+ const url = nonEmpty(env.CHORUS_URL);
275
+ const apiKey = nonEmpty(env.CHORUS_API_KEY);
276
+ return url && apiKey ? { url, apiKey } : null;
277
+ };
278
+ const flagPair = () => {
279
+ const url = nonEmpty(flags.url);
280
+ const apiKey = nonEmpty(flags.apiKey);
281
+ return url && apiKey ? { url, apiKey } : null;
282
+ };
283
+
284
+ // Read agents[] once and pre-resolve every entry (label, its match keys, and
285
+ // its effective url/apiKey merged over the top-level per-field defaults).
286
+ const file = readJson(loginPath);
287
+ const agentEntries =
288
+ file && Array.isArray(file.agents)
289
+ ? file.agents.filter((a) => a && typeof a === "object")
290
+ : [];
291
+ const hasAgents = agentEntries.length > 0;
292
+ const defaults = hasAgents ? resolveCredentialDefaults(flags, deps) : { url: undefined, apiKey: undefined };
293
+ const labelOf = (entry, i) =>
294
+ nonEmpty(entry.agentName) ?? nonEmpty(entry.label) ?? nonEmpty(entry.name) ?? `agents[${i}]`;
295
+ const resolved = agentEntries.map((entry, i) => ({
296
+ label: labelOf(entry, i),
297
+ // A profile may name an entry by its uuid, its display name, or the
298
+ // back-compat label/name aliases.
299
+ keys: [entry.agentUuid, entry.agentName, entry.label, entry.name]
300
+ .map((k) => nonEmpty(k))
301
+ .filter((k) => k !== undefined),
302
+ url: nonEmpty(entry.url) ?? defaults.url,
303
+ apiKey: nonEmpty(entry.apiKey) ?? defaults.apiKey,
304
+ }));
305
+ const labels = resolved.map((a) => a.label).join(", ");
306
+ const pick = (a) => {
307
+ if (!a.url || !a.apiKey) {
308
+ throw new Error(
309
+ `Agent "${a.label}" in ${loginPath} is missing a url or apiKey (and no top-level default supplies it).`,
310
+ );
311
+ }
312
+ return { url: a.url, apiKey: a.apiKey, label: a.label };
313
+ };
314
+ const matchesFor = (name) => resolved.filter((a) => a.keys.includes(name));
315
+ const selectOrThrow = (name, source) => {
316
+ const matches = matchesFor(name);
317
+ if (matches.length === 1) return pick(matches[0]);
318
+ if (matches.length > 1) {
319
+ throw new Error(
320
+ `${source} "${name}" is ambiguous in ${loginPath} — it matches ${matches.length} agents ` +
321
+ `(${matches.map((m) => m.label).join(", ")}). Use the agent UUID to disambiguate.`,
322
+ );
323
+ }
324
+ return null; // no match
325
+ };
326
+
327
+ // 1. Explicit --agent flag: a deliberate profile selection — PREFERRED over an
328
+ // explicit url+key flag pair (owner: "prefer profile"). With NO agents[] to
329
+ // match, it rides an explicit flag pair (else the env pair), using the name
330
+ // as the diagnostic label; with neither it is a usage error.
331
+ if (flagAgent) {
332
+ if (hasAgents) {
333
+ const hit = selectOrThrow(flagAgent, "--agent");
334
+ if (hit) return hit;
335
+ throw new Error(`--agent "${flagAgent}" not found in ${loginPath} agents[]. Available: ${labels}.`);
336
+ }
337
+ const pair = flagPair() ?? envPair();
338
+ if (pair) return { url: pair.url, apiKey: pair.apiKey, label: flagAgent };
339
+ throw new Error(
340
+ `--agent "${flagAgent}" was given but ${loginPath} declares no agents[]. ` +
341
+ `Remove --agent, or configure an agents[] list.`,
342
+ );
343
+ }
344
+
345
+ // 2. Explicit url+key flag pair (no --agent) — identity is explicit.
346
+ {
347
+ const pair = flagPair();
348
+ if (pair) return { url: pair.url, apiKey: pair.apiKey, label: wanted ?? "flag" };
349
+ }
350
+
351
+ // 3. CHORUS_AGENT_PROFILE env: ambient profile selection. A match wins over the
352
+ // url+key env pair; a no-match falls through to url-mode (profile "doesn't
353
+ // exist"); an ambiguous match throws.
354
+ if (envProfile && hasAgents) {
355
+ const hit = selectOrThrow(envProfile, "CHORUS_AGENT_PROFILE");
356
+ if (hit) return hit;
357
+ // no match → fall through to the url-mode fallback below
358
+ }
359
+
360
+ // 4. Env pair (url-mode fallback). Carry the profile name as the label if set.
361
+ {
362
+ const pair = envPair();
363
+ if (pair) return { url: pair.url, apiKey: pair.apiKey, label: wanted ?? "env" };
364
+ }
365
+
366
+ // 5/6. agents[] with nothing specified: auto-single, else hard error.
367
+ if (hasAgents) {
368
+ if (resolved.length === 1) return pick(resolved[0]);
369
+ throw new Error(
370
+ `Multiple agents are configured in ${loginPath} (${labels}). ` +
371
+ `Specify which one to act as with --agent <name|uuid> or CHORUS_AGENT_PROFILE.`,
372
+ );
373
+ }
374
+
375
+ // 7. No agents[] → flat resolution (throws the detailed "could not resolve" error).
376
+ const flat = resolveCredentials(flags, deps);
377
+ return { url: flat.url, apiKey: flat.apiKey, label: flat.source };
378
+ }
@@ -1,6 +1,6 @@
1
1
  // cli/daemon-agent.mjs
2
2
  // Pure resolution + validation of the daemon's `--agent <type>` selection.
3
- // `claude-code` (the default), `codex`, and `kiro` are all implemented backends
3
+ // `claude-code` (the default), `codex`, `kiro`, and `dsh` are recognized backends
4
4
  // (add-daemon-codex-backend cashed in the reserved `codex` slot;
5
5
  // add-daemon-kiro-backend adds `kiro`). Resolving an unknown value is a hard
6
6
  // error (no silent fallback).
@@ -16,10 +16,19 @@
16
16
  import { readFileSync } from "node:fs";
17
17
  import { loginFilePath } from "./credentials.mjs";
18
18
 
19
- /** The agent backends the daemon recognizes. All are implemented (claude-code
20
- * via ClaudeSpawner, codex via CodexSpawner, kiro via KiroSpawner see
21
- * spawner-select.mjs). */
22
- export const KNOWN_AGENTS = ["claude-code", "codex", "kiro"];
19
+ /** The agent backends the daemon recognizes. Existing spawners cover claude-code,
20
+ * codex, and kiro; dsh registration is the base contract for its bridge.
21
+ *
22
+ * `offline` is a NON-wakeable classification, not a real backend: an agent whose
23
+ * key is parked in daemon.json purely so `chorus mcp` can proxy through it, while
24
+ * the daemon builds NO spawner and dispatches NO wake for it. It is accepted here
25
+ * (and by-name in agent-backend-prompt via this list) so an agents[] entry may set
26
+ * `agentType: "offline"` and pass resolveAgentConfigs' KNOWN_AGENTS validation. The
27
+ * fail-closed no-wake handling lives in spawner-select.mjs (selectSpawner returns
28
+ * an OfflineSpawner that refuses to spawn) — an offline value MUST NOT fall through
29
+ * to the claude-code default and wake it. `chorus agents add` maps every non-wakeable
30
+ * selected agent (opencode/openclaw/pi/dsh) to this classification. */
31
+ export const KNOWN_AGENTS = ["claude-code", "codex", "kiro", "dsh", "offline"];
23
32
 
24
33
  /** The default agent backend when neither --agent nor CHORUS_AGENT is set. */
25
34
  export const DEFAULT_AGENT = "claude-code";
@@ -35,6 +44,12 @@ export const DEFAULT_AGENT = "claude-code";
35
44
  export function backendCli(agentType) {
36
45
  if (agentType === "codex") return { name: "codex", envVar: "CHORUS_CODEX_PATH" };
37
46
  if (agentType === "kiro") return { name: "kiro-cli", envVar: "CHORUS_KIRO_PATH" };
47
+ if (agentType === "dsh") return { name: "dsh-jsonrpc-agent", envVar: "CHORUS_DSH_PATH" };
48
+ // `offline` has no CLI to resolve — it is never woken (see backendClientType).
49
+ // The daemon does not probe a binary for it; this explicit descriptor keeps the
50
+ // return sensible if some banner path ever reads it (CHORUS_AGENT selects the
51
+ // backend), instead of mislabeling it as `claude`.
52
+ if (agentType === "offline") return { name: "offline", envVar: "CHORUS_AGENT" };
38
53
  return { name: "claude", envVar: "CHORUS_CLAUDE_PATH" };
39
54
  }
40
55
 
@@ -49,6 +64,16 @@ export function backendCli(agentType) {
49
64
  export function backendClientType(agentType) {
50
65
  if (agentType === "codex") return "codex";
51
66
  if (agentType === "kiro") return "kiro";
67
+ if (agentType === "dsh") return "dsh";
68
+ // `offline` is a non-wakeable classification — the daemon SHALL NOT register it
69
+ // as a wakeable connection (daemon-multi-agent spec). It must therefore NOT
70
+ // fall through to the `claude_code` default (which would make an offline agent
71
+ // present as a wakeable claude_code connection). Return the distinct `offline`
72
+ // string: the runtime fan-out skips registering it at all, and this value is
73
+ // intentionally OUTSIDE the server's DAEMON_CLIENT_TYPES allowlist, so any
74
+ // future path that DID try to register it fails closed (server rejects) rather
75
+ // than silently registering it as claude_code.
76
+ if (agentType === "offline") return "offline";
52
77
  return "claude_code";
53
78
  }
54
79
 
@@ -19,7 +19,7 @@ import { backendCli } from "./daemon-agent.mjs";
19
19
  * @property {string} agentUuid authenticated agent uuid.
20
20
  * @property {"yolo"|"chorus"} permissionMode
21
21
  * @property {string} credentialSource resolved credential source (flag/env/login-file/…).
22
- * @property {string} agentType local agent backend (claude-code | codex) — drives the CLI row label.
22
+ * @property {string} agentType local agent backend (claude-code | codex | kiro | dsh) — drives the CLI row label.
23
23
  * @property {string|null} cliPath resolved path of the SELECTED backend's CLI, or null when not found.
24
24
  * @property {string} [connection] connection state line (default "connecting…").
25
25
  * @property {string} [configPath] absolute path to the daemon.json the CLI reads.
@@ -42,8 +42,8 @@ export function bannerRows(info) {
42
42
  info.permissionMode === "yolo"
43
43
  ? "YOLO ⚠ (full autonomy — Bash/write/any command)"
44
44
  : "chorus-only (Chorus MCP tools only)";
45
- // The CLI row names the SELECTED backend (claude-code "claude", codex →
46
- // "codex") so a `--agent codex` run never mislabels itself as claude.
45
+ // The CLI row names the selected backend so non-Claude runs are never
46
+ // mislabeled and their own executable override is actionable.
47
47
  const cli = backendCli(info.agentType);
48
48
  const cliValue = info.cliPath
49
49
  ? `found: ${info.cliPath}`
@@ -306,13 +306,19 @@ function positiveInt(value) {
306
306
  * @typedef {Object} AgentConfig One fully-resolved agent runtime config.
307
307
  * @property {string} url Chorus server URL for this agent.
308
308
  * @property {string} apiKey This agent's `cho_` API key.
309
- * @property {string} agentType Backend: claude-code | codex | kiro.
309
+ * @property {string} agentType Backend: claude-code | codex | kiro | dsh | offline.
310
+ * @property {boolean} [daemonWake] Wake opt-in for a wakeable backend; only
311
+ * `false` disables (absent/true ⇒ woken).
310
312
  * @property {Array<string|undefined>} cwds Served paths (`undefined` ⇒ process cwd).
311
313
  * @property {"yolo"|"chorus"} permissionMode Woken-agent permission posture.
312
314
  * @property {number} maxConcurrency This agent's wake-queue cap.
313
315
  * @property {number} sigintTimeoutMs Interrupt escalation window (ms).
314
316
  * @property {string[]} browseRoots Directory-discovery allowlist.
315
317
  * @property {string} label Diagnostic label ("agent" or "agents[i]").
318
+ * @property {string} [agentUuid] This agent's Chorus UUID — exported to a
319
+ * woken session as CHORUS_AGENT_PROFILE so its
320
+ * hooks/skills resolve the key from daemon.json.
321
+ * @property {string} [agentName] This agent's Chorus display name (profile alias).
316
322
  */
317
323
 
318
324
  /**
@@ -365,6 +371,8 @@ export function resolveAgentConfigs(flags = {}, deps = {}) {
365
371
  sigintTimeoutMs: resolveSigintTimeoutMs(flags, deps),
366
372
  browseRoots: resolveBrowseRoots(flags, deps),
367
373
  label: "agent",
374
+ agentUuid: nonEmptyStr(file?.agentUuid),
375
+ agentName: nonEmptyStr(file?.agentName),
368
376
  },
369
377
  ];
370
378
  }
@@ -433,6 +441,23 @@ export function resolveAgentConfigs(flags = {}, deps = {}) {
433
441
  const browseRoots =
434
442
  entry.browseRoots !== undefined ? cleanCwdList(entry.browseRoots, home) : defaultBrowseRoots;
435
443
 
436
- return { url, apiKey, agentType, cwds, permissionMode, maxConcurrency, sigintTimeoutMs, browseRoots, label };
444
+ // daemonWake: per-agent opt-in for daemon waking (pass-through boolean). Only
445
+ // `=== false` disables waking; absent (undefined) or true ⇒ woken, so agent
446
+ // entries written before this field existed keep being woken. Orthogonal to
447
+ // agentType (offline is never woken regardless).
448
+ return {
449
+ url,
450
+ apiKey,
451
+ agentType,
452
+ cwds,
453
+ permissionMode,
454
+ maxConcurrency,
455
+ sigintTimeoutMs,
456
+ browseRoots,
457
+ daemonWake: entry.daemonWake,
458
+ label,
459
+ agentUuid: nonEmptyStr(entry.agentUuid),
460
+ agentName: nonEmptyStr(entry.agentName),
461
+ };
437
462
  });
438
463
  }
@@ -27,9 +27,11 @@ import { updateDaemonConfig, appendAgentConfig, prompt as defaultPrompt } from "
27
27
  import { validateAndFetchIdentity } from "./chorus-client.mjs";
28
28
  import { normalizeCwd, cleanCwdList } from "./daemon-config.mjs";
29
29
  import { KNOWN_AGENTS, DEFAULT_AGENT } from "./daemon-agent.mjs";
30
+ import { AGENT_MENU, promptAgentBackend } from "./agent-backend-prompt.mjs";
30
31
  import { agentNotFoundWarningLine } from "./daemon-banner.mjs";
31
32
  import { resolveClaudePath } from "./claude-spawner.mjs";
32
33
  import { resolveCodexPath } from "./codex-spawner.mjs";
34
+ import { resolveDshPath } from "./dsh-spawner.mjs";
33
35
  import { resolveKiroPath } from "./kiro-spawner.mjs";
34
36
  import { readFileSync } from "node:fs";
35
37
 
@@ -160,12 +162,20 @@ export async function resolveInstallCredentials(flags = {}, env = {}, opts = {})
160
162
  );
161
163
  continue;
162
164
  }
163
- const res = appendAgent({ url: u, apiKey: k, agentUuid: id.uuid, agentName: id.name });
165
+ // Which backend for this agent? Explicit --agent wins; otherwise the menu
166
+ // (we're already on a TTY here). undefined → omit agentType so the entry
167
+ // inherits the daemon default at resolve time (never a literal claude-code).
168
+ let at = nonEmpty(flags.agent);
169
+ if (!at) at = await promptAgentBackend({ ask, log, isTTY });
170
+ const agentObj = { url: u, apiKey: k, agentUuid: id.uuid, agentName: id.name };
171
+ if (at) agentObj.agentType = at;
172
+ const res = appendAgent(agentObj);
164
173
  if (!res.ok) {
165
174
  errLog(`[Chorus] agent ${id.name} (${id.uuid}) is already configured — skipping.`);
166
175
  continue;
167
176
  }
168
- log(`[Chorus] added agent ${id.name} (${id.uuid}) this daemon now serves ${res.agents.length} agents.`);
177
+ const backendNote = at ? ` (backend: ${at})` : "";
178
+ log(`[Chorus] added agent ${id.name} (${id.uuid})${backendNote} — this daemon now serves ${res.agents.length} agents.`);
169
179
  }
170
180
  }
171
181
 
@@ -242,7 +252,6 @@ export async function resolveInstallCwds(flags = {}, opts = {}) {
242
252
  const first = nonEmpty(await ask(`Working directory [${defaultCwd}] (Enter to accept the default): `));
243
253
  collected.push(first ?? defaultCwd);
244
254
  // subsequent adds
245
- // eslint-disable-next-line no-constant-condition
246
255
  while (true) {
247
256
  const next = nonEmpty(await ask("Add another working directory (blank to finish): "));
248
257
  if (!next) break;
@@ -280,25 +289,23 @@ export async function resolveInstallBrowseRoots(flags = {}, opts = {}) {
280
289
  return { browseRoots };
281
290
  }
282
291
 
283
- /**
284
- * The interactive agent-backend menu. Order mirrors KNOWN_AGENTS with claude-code
285
- * first (it is the default). Kept beside the resolver so the numbered prompt and
286
- * the accepted values never drift.
287
- */
288
- const AGENT_MENU = [
289
- { value: "claude-code", label: "Claude Code (default)" },
290
- { value: "codex", label: "Codex CLI" },
291
- { value: "kiro", label: "Kiro CLI" },
292
- ];
292
+ // The interactive agent-backend menu (`AGENT_MENU`) now lives in
293
+ // ./agent-backend-prompt.mjs as the single source of truth shared with the
294
+ // add/login flows (imported above), so every backend prompt advertises the same
295
+ // list and never drifts. resolveInstallAgent keeps its own inline menu render
296
+ // below (its empty→DEFAULT_AGENT semantics differ from promptAgentBackend's
297
+ // empty→undefined) but reads the same AGENT_MENU rows.
293
298
 
294
299
  /** Probe the selected backend's CLI on PATH. Returns the resolved path or null.
295
300
  * Injectable per backend so the check is testable without a real PATH. */
296
301
  function probeAgentCli(agent, probes = {}) {
297
302
  const findClaude = probes.resolveClaudePath ?? resolveClaudePath;
298
303
  const findCodex = probes.resolveCodexPath ?? resolveCodexPath;
304
+ const findDsh = probes.resolveDshPath ?? resolveDshPath;
299
305
  const findKiro = probes.resolveKiroPath ?? resolveKiroPath;
300
306
  if (agent === "codex") return findCodex();
301
307
  if (agent === "kiro") return findKiro();
308
+ if (agent === "dsh") return findDsh();
302
309
  return findClaude();
303
310
  }
304
311
 
@@ -331,7 +338,7 @@ function probeAgentCli(agent, probes = {}) {
331
338
  * loginPath?: string,
332
339
  * writeConfig?: (partial: Record<string, unknown>) => string,
333
340
  * prompt?: typeof defaultPrompt,
334
- * probes?: { resolveClaudePath?: Function, resolveCodexPath?: Function, resolveKiroPath?: Function },
341
+ * probes?: { resolveClaudePath?: Function, resolveCodexPath?: Function, resolveKiroPath?: Function, resolveDshPath?: Function },
335
342
  * log?: (m: string) => void,
336
343
  * errLog?: (m: string) => void,
337
344
  * }} [opts]
@@ -4,10 +4,12 @@
4
4
  // the existing server endpoints accept, so the two daemon hosts — the chorus CLI daemon
5
5
  // (`cli/daemon.mjs`) and the OpenClaw plugin — cannot drift in the wire contract.
6
6
  //
7
- // The five operations and their EXACT server payload shapes (verified against
8
- // src/app/api/daemon/*/route.ts — the server is NOT changed by this work):
7
+ // The operations and payload fields this client supports (verified against
8
+ // src/app/api/daemon/*/route.ts):
9
9
  // turnAdvance → POST /api/daemon/turn-advance
10
- // { connectionUuid, sessionId, status, entityType?, entityUuid?,
10
+ // { connectionUuid, sessionId, status, turnUuid?,
11
+ // backendSessionId?, entityType?, entityUuid?,
12
+ // interruptedReason?, transcriptRelayError?, usage?,
11
13
  // coalescedCount? }
12
14
  // transcript → POST /api/daemon/transcript
13
15
  // { sessionId, messages: [{ role, text }] }
@@ -71,7 +73,7 @@ const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
71
73
  * logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
72
74
  * }} opts
73
75
  * @returns {{
74
- * turnAdvance: (p: { sessionId: string, backendSessionId?: string|null, status: string, entityType?: string|null, entityUuid?: string|null, coalescedCount?: number }) => Promise<DaemonRestResult>,
76
+ * turnAdvance: (p: { sessionId: string, turnUuid?: string|null, backendSessionId?: string|null, status: string, entityType?: string|null, entityUuid?: string|null, coalescedCount?: number }) => Promise<DaemonRestResult>,
75
77
  * transcript: (p: { sessionId: string, messages: Array<{ role: string, text: string }> }) => Promise<DaemonRestResult>,
76
78
  * executionState: (p: { executions: Array<Record<string, unknown>> }) => Promise<DaemonRestResult>,
77
79
  * reportInterrupt: (p: { entityType: string, entityUuid: string, reason: string }) => Promise<DaemonRestResult>,
@@ -111,7 +113,7 @@ export function createDaemonRestClient(opts) {
111
113
  * established op-prefixed message.
112
114
  * @returns {Promise<DaemonRestResult>}
113
115
  */
114
- async function post(op, path, body, successLog, context = "") {
116
+ async function post(op, path, body, successLog, context = "", readData = false) {
115
117
  let response;
116
118
  try {
117
119
  response = await fetchImpl(`${url}${path}`, {
@@ -131,8 +133,19 @@ export function createDaemonRestClient(opts) {
131
133
  logger.warn(`[Chorus] ${error}`);
132
134
  return { ok: false, status: response.status, error };
133
135
  }
136
+ let data;
137
+ if (readData) {
138
+ try {
139
+ const parsed = await response.json();
140
+ data = parsed && typeof parsed === "object" ? parsed.data : undefined;
141
+ } catch (err) {
142
+ // Mixed-version fallback: older servers may return an empty successful body.
143
+ // Keep the lifecycle report successful, but make the missing correlation visible.
144
+ logger.warn(`[Chorus] ${op} response correlation unavailable: ${err}`);
145
+ }
146
+ }
134
147
  if (successLog) logger.info(`[Chorus] ${successLog}`);
135
- return { ok: true, status: response.status };
148
+ return { ok: true, status: response.status, ...(data !== undefined ? { data } : {}) };
136
149
  }
137
150
 
138
151
  return {
@@ -148,7 +161,7 @@ export function createDaemonRestClient(opts) {
148
161
  * the turn's usage. Both ride the terminal edge only. Requires the connectionUuid (the
149
162
  * server addresses the turn against a connection the agent owns).
150
163
  */
151
- async turnAdvance({ sessionId, status, entityType, entityUuid, interruptedReason, transcriptRelayError, usage, backendSessionId, coalescedCount }) {
164
+ async turnAdvance({ sessionId, turnUuid, status, entityType, entityUuid, interruptedReason, transcriptRelayError, usage, backendSessionId, coalescedCount }) {
152
165
  const connectionUuid = getConnectionUuid();
153
166
  if (!connectionUuid) {
154
167
  const error = `cannot advance turn for session ${sessionId} → ${status} — no connection uuid yet`;
@@ -164,6 +177,7 @@ export function createDaemonRestClient(opts) {
164
177
  connectionUuid,
165
178
  sessionId,
166
179
  status,
180
+ ...(turnUuid ? { turnUuid } : {}),
167
181
  // Only sent when BOTH are present, so the server never gets a partial linkage.
168
182
  ...(entityType && entityUuid ? { entityType, entityUuid } : {}),
169
183
  // Only meaningful alongside status=interrupted; never sent otherwise.
@@ -182,12 +196,21 @@ export function createDaemonRestClient(opts) {
182
196
  ? { coalescedCount }
183
197
  : {}),
184
198
  };
185
- return post(
199
+ const result = await post(
186
200
  "turn-advance",
187
201
  "/api/daemon/turn-advance",
188
202
  body,
189
203
  `advanced turn for session ${sessionId} → ${status}`,
204
+ "",
205
+ status === "running",
190
206
  );
207
+ const resolvedTurnUuid =
208
+ typeof result.data?.turn?.uuid === "string" ? result.data.turn.uuid : null;
209
+ if (status !== "running") return result;
210
+ const { data: _rawData, ...baseResult } = result;
211
+ return resolvedTurnUuid
212
+ ? { ...baseResult, data: { turnUuid: resolvedTurnUuid } }
213
+ : baseResult;
191
214
  },
192
215
 
193
216
  /**