@chorus-aidlc/chorus 0.16.2 → 0.16.4

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 (348) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +444 -433
  3. package/.next/standalone/.next/app-path-routes-manifest.json +42 -42
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +36 -36
  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 +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +1 -1
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
  40. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +1 -1
  43. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
  46. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  50. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  51. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
  54. package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
  55. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/admin/companies.html +2 -2
  57. package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
  58. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/admin.html +2 -2
  60. package/.next/standalone/.next/server/app/admin.rsc +2 -2
  61. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
  82. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
  90. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
  93. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/api/mcp/route.js +4 -4
  112. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  146. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  149. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  159. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/index.html +2 -2
  161. package/.next/standalone/.next/server/app/index.rsc +2 -2
  162. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  164. package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
  165. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  167. package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
  168. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  169. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  171. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
  172. package/.next/standalone/.next/server/app/login.html +2 -2
  173. package/.next/standalone/.next/server/app/login.rsc +2 -2
  174. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  175. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  176. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  177. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  178. package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
  179. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  180. package/.next/standalone/.next/server/app/projects.html +2 -2
  181. package/.next/standalone/.next/server/app/projects.rsc +4 -4
  182. package/.next/standalone/.next/server/app/settings.html +2 -2
  183. package/.next/standalone/.next/server/app/settings.rsc +4 -4
  184. package/.next/standalone/.next/server/app-paths-manifest.json +42 -42
  185. package/.next/standalone/.next/server/chunks/1318.js +1 -1
  186. package/.next/standalone/.next/server/chunks/1559.js +2 -2
  187. package/.next/standalone/.next/server/chunks/2572.js +1 -1
  188. package/.next/standalone/.next/server/chunks/2618.js +1 -1
  189. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  190. package/.next/standalone/.next/server/chunks/3594.js +1 -1
  191. package/.next/standalone/.next/server/chunks/4394.js +1 -1
  192. package/.next/standalone/.next/server/chunks/4827.js +1 -1
  193. package/.next/standalone/.next/server/chunks/5205.js +1 -1
  194. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  195. package/.next/standalone/.next/server/chunks/5351.js +4 -3
  196. package/.next/standalone/.next/server/chunks/{4011.js → 5489.js} +4 -4
  197. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  198. package/.next/standalone/.next/server/chunks/6506.js +2 -2
  199. package/.next/standalone/.next/server/chunks/6667.js +1 -1
  200. package/.next/standalone/.next/server/chunks/6995.js +1 -1
  201. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  202. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  203. package/.next/standalone/.next/server/chunks/8044.js +1 -0
  204. package/.next/standalone/.next/server/chunks/920.js +1 -1
  205. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  206. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  207. package/.next/standalone/.next/server/chunks/951.js +1 -1
  208. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  209. package/.next/standalone/.next/server/middleware-manifest.json +1 -1
  210. package/.next/standalone/.next/server/pages/404.html +2 -2
  211. package/.next/standalone/.next/server/pages/500.html +1 -1
  212. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  213. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  214. package/.next/standalone/.next/static/chunks/11595.a6268c75ca8a2163.js +1 -0
  215. package/.next/standalone/.next/static/chunks/17099-936da9caf4c119b8.js +1 -0
  216. package/.next/standalone/.next/static/chunks/18609-6c859f756d530e94.js +1 -0
  217. package/.next/standalone/.next/static/chunks/19887-b805e1dcee8c367b.js +1 -0
  218. package/.next/standalone/.next/static/chunks/20204-90d655ea14281e10.js +1 -0
  219. package/.next/standalone/.next/static/chunks/{53402-a54163001f3d953a.js → 27370-c056dee2016c9124.js} +1 -1
  220. package/.next/standalone/.next/static/chunks/{29108-b9b232255811ffa8.js → 29108-5a11eea003f4cc11.js} +1 -1
  221. package/.next/standalone/.next/static/chunks/29305-f587e7e81bc0b200.js +10 -0
  222. package/.next/standalone/.next/static/chunks/33456.16ff7edf00137539.js +1 -0
  223. package/.next/standalone/.next/static/chunks/35432-5c245212c7595169.js +1 -0
  224. package/.next/standalone/.next/static/chunks/45024-eb7c062d13d9fe08.js +1 -0
  225. package/.next/standalone/.next/static/chunks/46294-6ae5bd0480b1820f.js +1 -0
  226. package/.next/standalone/.next/static/chunks/4860.9e06848eb531e667.js +1 -0
  227. package/.next/standalone/.next/static/chunks/53073-a7ed20af6538a178.js +1 -0
  228. package/.next/standalone/.next/static/chunks/65096-f756aac39efad7a3.js +1 -0
  229. package/.next/standalone/.next/static/chunks/6603-e70ddeab6ad09c50.js +1 -0
  230. package/.next/standalone/.next/static/chunks/67580-8733964ab2c7fc0e.js +1 -0
  231. package/.next/standalone/.next/static/chunks/7777-8b1b6681256e1534.js +1 -0
  232. package/.next/standalone/.next/static/chunks/78917-1b59cbb806b3ecfc.js +1 -0
  233. package/.next/standalone/.next/static/chunks/82751-3e161e1d8dbda3ac.js +1 -0
  234. package/.next/standalone/.next/static/chunks/94643-ffa140f765c73daf.js +1 -0
  235. package/.next/standalone/.next/static/chunks/99373.81b79c91858f9099.js +1 -0
  236. package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-cea0bb3e3a295bea.js → layout-b742c51c0a764daf.js} +1 -1
  237. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-974781e4886529f8.js +1 -0
  238. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-007278623926490f.js → page-f636e00c28f425ea.js} +1 -1
  239. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c004f1a194af7fa5.js +1 -0
  240. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-425acbe9ade5fa83.js +1 -0
  241. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-f5a351c544ed23d7.js → page-fdd617457730a116.js} +1 -1
  242. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-b9eb4e0692996657.js +1 -0
  243. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0a6c2d0e1b68e0e4.js +1 -0
  244. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-58b48aa0a11603c3.js +1 -0
  245. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-286faced32c6133f.js +1 -0
  246. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-7a5ef281f6819ed4.js → page-9d79e285b6fd2f8d.js} +1 -1
  247. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-1507a761e67c2aa9.js +1 -0
  248. package/.next/standalone/.next/static/chunks/app/onboarding/page-5c82cf3abd856301.js +1 -0
  249. package/.next/standalone/.next/static/chunks/f5a9da1f-6abf712b3f684cf9.js +1 -0
  250. package/.next/standalone/.next/static/chunks/{webpack-b54e0c78eded76be.js → webpack-4d1cc14b13e247b6.js} +1 -1
  251. package/.next/standalone/.next/static/css/5f52bd39b284ccdf.css +1 -0
  252. package/.next/standalone/package.json +3 -1
  253. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  254. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  255. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +2 -1
  256. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
  257. package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
  258. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +5 -4
  259. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
  260. package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +128 -0
  261. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
  262. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  263. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  264. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
  265. package/.next/standalone/public/dsh-credentials.sh +137 -0
  266. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  267. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
  268. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
  269. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +5 -4
  270. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +1 -1
  271. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +128 -0
  272. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
  273. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
  274. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
  275. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +1 -1
  276. package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +2 -1
  277. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  278. package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
  279. package/.next/standalone/public/skill/chorus/SKILL.md +2 -1
  280. package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
  281. package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
  282. package/.next/standalone/public/skill/docs-chorus/SKILL.md +1 -1
  283. package/.next/standalone/public/skill/idea-chorus/SKILL.md +5 -4
  284. package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +128 -0
  285. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
  286. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
  287. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
  288. package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
  289. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
  290. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
  291. package/.next/standalone/public/test-dsh-credentials.sh +55 -0
  292. package/README.ja.md +3 -1
  293. package/README.ko.md +3 -1
  294. package/README.md +3 -1
  295. package/README.zh.md +3 -1
  296. package/cli/agent-backend-prompt.mjs +93 -0
  297. package/cli/client-args.mjs +11 -5
  298. package/cli/daemon-agent.mjs +6 -5
  299. package/cli/daemon-banner.mjs +3 -3
  300. package/cli/daemon-config.mjs +1 -1
  301. package/cli/daemon-install-config.mjs +21 -14
  302. package/cli/daemon-rest-client.mjs +31 -8
  303. package/cli/daemon.mjs +47 -6
  304. package/cli/dsh-managed-config.mjs +407 -0
  305. package/cli/dsh-spawner.mjs +438 -0
  306. package/cli/login.mjs +26 -4
  307. package/cli/prompts.mjs +13 -3
  308. package/cli/spawner-select.mjs +10 -1
  309. package/cli/turn-reporter.mjs +5 -2
  310. package/cli/upload-hooks.mjs +31 -1
  311. package/cli/waker.mjs +49 -6
  312. package/package.json +3 -1
  313. package/prisma/migrations/20260818024700_add_turn_backend_session_id/migration.sql +1 -0
  314. package/prisma/schema.prisma +3 -0
  315. package/.next/standalone/.next/server/chunks/2463.js +0 -1
  316. package/.next/standalone/.next/static/chunks/11595.b6f8ad33572b32fe.js +0 -1
  317. package/.next/standalone/.next/static/chunks/19887-9f459ee9e8d0855f.js +0 -1
  318. package/.next/standalone/.next/static/chunks/22987-8fd965ab4ff87546.js +0 -1
  319. package/.next/standalone/.next/static/chunks/33456.e8550ad410031e29.js +0 -1
  320. package/.next/standalone/.next/static/chunks/35432-ee83da56c49ef6f8.js +0 -1
  321. package/.next/standalone/.next/static/chunks/38296-316ba18af72385fb.js +0 -1
  322. package/.next/standalone/.next/static/chunks/4860.b405fc235b36271b.js +0 -1
  323. package/.next/standalone/.next/static/chunks/53073-5fd399cb25a11740.js +0 -1
  324. package/.next/standalone/.next/static/chunks/6603-07faab08560f7ecd.js +0 -1
  325. package/.next/standalone/.next/static/chunks/6698-1c55791b2d0820d5.js +0 -1
  326. package/.next/standalone/.next/static/chunks/66980-652990fcf3212c94.js +0 -10
  327. package/.next/standalone/.next/static/chunks/75137-c9e8422c9d4e1f52.js +0 -1
  328. package/.next/standalone/.next/static/chunks/7777-5dad34f6bdc13482.js +0 -1
  329. package/.next/standalone/.next/static/chunks/78917-7354d3b6908da7d1.js +0 -1
  330. package/.next/standalone/.next/static/chunks/82751-de255af4418d53e4.js +0 -1
  331. package/.next/standalone/.next/static/chunks/83285-db8ae107944eb6df.js +0 -1
  332. package/.next/standalone/.next/static/chunks/86155-c9b7c2c08d3fa80e.js +0 -1
  333. package/.next/standalone/.next/static/chunks/89836-b5ab6a0b32c54f42.js +0 -1
  334. package/.next/standalone/.next/static/chunks/94643-6d31df78aa3074b5.js +0 -1
  335. package/.next/standalone/.next/static/chunks/96170-75da13decdb6f73f.js +0 -1
  336. package/.next/standalone/.next/static/chunks/99373.9dce8f30802824fc.js +0 -1
  337. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-7462c5eb92130796.js +0 -1
  338. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-b6ecaf52f6b81ec7.js +0 -1
  339. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-82404154708e48a9.js +0 -1
  340. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-3cd46bec9383b191.js +0 -1
  341. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-6abc7d1785e2b999.js +0 -1
  342. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-7f87113e5d8bcf6e.js +0 -1
  343. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-30ab1573c4bd466f.js +0 -1
  344. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-b21d4184d9ca0b25.js +0 -1
  345. package/.next/standalone/.next/static/chunks/app/onboarding/page-3b6c54f887108635.js +0 -1
  346. package/.next/standalone/.next/static/css/893d99a21153c9b0.css +0 -1
  347. /package/.next/standalone/.next/static/{YTZwWTfE0BsJnjCDYCEHi → 6sHDgeKioa0SJR1MAbcYG}/_buildManifest.js +0 -0
  348. /package/.next/standalone/.next/static/{YTZwWTfE0BsJnjCDYCEHi → 6sHDgeKioa0SJR1MAbcYG}/_ssgManifest.js +0 -0
@@ -0,0 +1,128 @@
1
+ ---
2
+ name: orchestrate-chorus
3
+ description: Multi-agent orchestration playbook — coordinate OTHER agents and humans across the AI-DLC lifecycle by delegating ideas and tasks, running independent reviewers, and gatekeeping at the Reversed-Conversation gates.
4
+ license: AGPL-3.0
5
+ metadata:
6
+ author: chorus
7
+ version: "0.16.4"
8
+ category: project-management
9
+ mcp_server: chorus
10
+ ---
11
+
12
+ # Orchestrate Skill
13
+
14
+ This skill is for an **orchestrator** (typically an Admin-preset agent) that coordinates *other* agents and humans across the AI-DLC lifecycle instead of doing all the work itself. The orchestrator decomposes work, hands each piece to a chosen owner, runs independent reviewers as quality gates, and gatekeeps the human-owned approval/verify gates — but never ships on its own.
15
+
16
+ It complements the other skills rather than replacing them:
17
+
18
+ - `yolo-chorus` (`<BASE_URL>/skill/yolo-chorus/SKILL.md`) — **one** agent drives the whole pipeline solo. Orchestration is the opposite: **many** agents, each owning a piece, coordinated by you.
19
+ - `idea-chorus`, `proposal-chorus`, `develop-chorus`, `review-chorus`, `quick-dev-chorus` — a single stage you execute yourself. Orchestration is the layer *above* those: you decide who runs each stage.
20
+
21
+ ---
22
+
23
+ ## When to use this skill
24
+
25
+ Use it when **more than one agent (or agent + human) will touch the work** and someone has to keep them coherent:
26
+
27
+ - You own a **theme / epic / container idea** that decomposes into several independent child ideas, and you want to hand each child to a specific worker (the motivating case: a theme owner gives one child to Codex, another to a Claude dev agent, another to a human).
28
+ - An approved proposal has a **task DAG** and you want several developer agents working the unblocked tasks in parallel waves.
29
+ - You need an **independent adversarial review** of someone else's proposal / task / feature before it advances.
30
+ - You are the responsible owner and must keep **one accountable assignee per idea** while work fans out.
31
+
32
+ Prerequisite: delegating ideas needs `idea:admin`; delegating tasks needs `proposal:write`. Run `chorus_checkin()` first to confirm your permission set.
33
+
34
+ ---
35
+
36
+ ## Delegation primitives
37
+
38
+ ### Assign an idea — `chorus_pm_assign_idea` (`idea:admin`)
39
+
40
+ Hand a whole idea to a chosen agent or user. Parameters:
41
+
42
+ | Param | Meaning |
43
+ |-------|---------|
44
+ | `ideaUuid` | The idea to delegate |
45
+ | `assigneeType` | `"agent"` or `"user"` |
46
+ | `assigneeUuid` | The chosen agent/user UUID (resolve names with `chorus_search_mentionables`) |
47
+ | `instanceUuid` | *(optional, agent targets only)* pin the work to one durable AgentInstance — the `(agent, host, cwd)` place — so wakes land where the code lives |
48
+
49
+ Behavior you must understand:
50
+
51
+ - **The assignee is woken and advances from the idea's *current* stage** — it does **NOT** re-claim. If the idea is `open` it moves to `elaborating`; any other status is preserved. The assignee picks up wherever the idea already is (elaboration, ready-for-proposal, etc.).
52
+ - **Agent targets must hold `idea:write`** (via a preset such as `pm_agent`/`admin_agent`, or an explicit permission) or the call is rejected. **User targets must be in your company.** `instanceUuid` is rejected for user targets.
53
+ - **Silent takeover.** Reassigning an already-owned idea simply moves ownership to the new assignee — there is one owner at a time, no confirmation prompt. Use this deliberately, not by accident.
54
+
55
+ ### Assign a task — `chorus_pm_assign_task` (`proposal:write`)
56
+
57
+ Hand a single task to a developer agent. Parameters: `taskUuid`, `agentUuid` (must hold `task:write`), optional `instanceUuid`. The task must be `open` or `assigned`. The assignee is woken to execute it. Use this to distribute the tasks of an approved proposal.
58
+
59
+ ### Derive child ideas and fan them out
60
+
61
+ The theme-decomposition case, end to end:
62
+
63
+ 1. Read the container/theme idea and its context (`chorus_get_idea`, `chorus_get_documents`, `chorus_get_comments`).
64
+ 2. For each independent slice, create a child idea with `chorus_pm_create_idea` (link it back to the parent in the body / via `references[]`).
65
+ 3. Assign each child to a distinct owner with `chorus_pm_assign_idea` — e.g. one child to Codex, one to a Claude dev agent, one to a human. Each child now has its **own single owner** and advances independently.
66
+ 4. @mention each assignee and the theme owner so the delegation is visible.
67
+
68
+ ---
69
+
70
+ ## Independent review as an adversarial gate
71
+
72
+ Chorus uses three read-only adversarial reviewers as quality gates. As orchestrator you run them at the three gates and act on the verdict — this is your primary quality lever when you are not writing the code yourself.
73
+
74
+ | Reviewer skill | Run after | Reviews |
75
+ |----------------|-----------|---------|
76
+ | `proposal-reviewer-chorus` | a proposal is submitted | proposal draft quality (VERDICT on the proposal) |
77
+ | `task-reviewer-chorus` | a task is submitted for verify | one task vs its acceptance criteria (VERDICT on the task) |
78
+ | `code-reviewer-chorus` | the idea's last task is verified | the idea's **aggregate** code change — the final ship gateway (VERDICT on the idea) |
79
+
80
+ Spawn a read-only sub-agent that loads the matching reviewer skill and the target UUID (pass the `ideaUuid` for code review); if your harness has no sub-agent primitive, run the reviewer's procedure inline yourself. Each posts exactly one `VERDICT: PASS` / `PASS WITH NOTES` / `FAIL` comment. Verdicts are **advisory** — they do not auto-approve, auto-verify, or hard-block; you read the BLOCKERs and decide. A `FAIL` means route the BLOCKERs back for a fix before advancing (for a code-review FAIL, add fix tasks to the *approved* proposal via `quick-dev-chorus` and re-run once they are `done`). The **Independent Review** section of the core `chorus` skill (`<BASE_URL>/skill/chorus/SKILL.md`) is the canonical description of this pattern.
81
+
82
+ ---
83
+
84
+ ## Choosing a collaboration mode
85
+
86
+ Pick the lightest mode that fits the shape of the work:
87
+
88
+ | Mode | Use when | How you run it |
89
+ |------|----------|----------------|
90
+ | **Single-owner drives one idea** | The work is one coherent feature | Assign the idea once (`chorus_pm_assign_idea`); that owner runs idea → proposal → tasks; you gatekeep the gates |
91
+ | **Fan-out children to N agents** | A theme decomposes into independent slices | Derive child ideas, assign each to a distinct owner; children run in parallel, each single-owner |
92
+ | **Parallel task waves** | One approved proposal with a task DAG | Assign the currently-unblocked tasks (`chorus_pm_assign_task`) to several dev agents; as tasks reach `done`, assign the next wave |
93
+ | **Review-only** | Work is already produced elsewhere | Spawn the relevant reviewer, read the VERDICT, and gatekeep — no new delegation |
94
+
95
+ Guidance: start narrow. If a single owner can hold the whole feature in their head, prefer **single-owner** — coordination overhead is not free. Reach for **fan-out** only when slices are genuinely independent (separate scope, separable elaboration). Use **parallel task waves** only after a proposal is approved and its DAG is real; respect dependencies — `to_verify` does **not** unblock downstream, only `done` does.
96
+
97
+ ---
98
+
99
+ ## Single-owner & concurrency discipline
100
+
101
+ - **One responsible assignee per idea at a time.** This mirrors the daemon's single-owner semantics: the idea is the authoritative pin root, and its owner's proposals/tasks/wakes inherit that identity. Don't leave an idea ambiguously "owned by the team."
102
+ - **Don't race duplicate sessions on the same work.** Two daemon sessions (or two agents) driving the same idea/task will collide on status transitions and produce conflicting wakes. Assign, then let one owner run.
103
+ - **Pin with `instanceUuid` when the work is tied to a place.** If a child idea's code lives on a specific host/cwd, pin the assignment to that AgentInstance so every downstream wake lands there instead of a random daemon.
104
+
105
+ ---
106
+
107
+ ## Reversed-Conversation gates (you never auto-ship)
108
+
109
+ Chorus is **AI proposes, humans verify**. As orchestrator you enforce that, you do not bypass it:
110
+
111
+ - **Elaboration gate (gateway resolve/skip).** When a child idea you assigned to another agent has its elaboration answered, you can close the elaboration gate yourself via `chorus_pm_validate_elaboration` (or `chorus_pm_skip_elaboration` for a trivially clear idea) even though you are not the assignee — holding `idea:admin` is enough. This is the MCP parity of the UI Verify-Elaborate: it wakes the **assignee** agent to write the proposal. You gatekeep the gate; the assignee still authors the proposal (Reversed-Conversation preserved).
112
+ - **Proposal gate.** When a delegated owner submits a proposal, STOP. Run the proposal reviewer, then hand the approve/reject decision to the human owner. Do not self-approve just because you *can* (`proposal:admin`).
113
+ - **Verify gate.** When a task reaches `to_verify`, STOP. Run the task reviewer, then let the human verify. Permission to verify is not authorization to rubber-stamp your own coordinated work.
114
+ - **Never merge or push.** The orchestrator drives work up to "PR ready" and hands it back to the human — it does not merge, push, or otherwise ship autonomously.
115
+
116
+ @mention the owner at each gate so the handoff is explicit and auditable.
117
+
118
+ ---
119
+
120
+ ## Derive a child idea vs add a task vs assign directly
121
+
122
+ | Do this | When |
123
+ |---------|------|
124
+ | **Derive a new child idea** (`chorus_pm_create_idea` + assign) | The slice is genuinely separate scope that deserves its own elaboration, proposal, and owner — a theme decomposition, or a parallelizable sub-feature. |
125
+ | **Add a task to an approved proposal** (`chorus_create_tasks` with `proposalUuid`) | The work is a discrete unit of the **same** feature that already has a proposal — e.g. code-review fix tasks, or a follow-up step in an existing DAG. |
126
+ | **Assign the existing idea/task directly** (`chorus_pm_assign_idea` / `chorus_pm_assign_task`) | The work is already scoped and just needs a (different) owner or executor — reassignment, taking over a stalled idea, or distributing existing tasks. |
127
+
128
+ Rule of thumb: **new scope → child idea; same-proposal unit → task; only the owner changes → assign.**
@@ -4,7 +4,7 @@ description: Chorus Proposal workflow — create proposals with document and tas
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.16.0"
7
+ version: "0.16.4"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Read-only adversarial Chorus proposal reviewer — audits PRD/task
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.16.2"
7
+ version: "0.16.4"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Quick Task workflow — skip Idea→Proposal, create tasks directly
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.16.0"
7
+ version: "0.16.4"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Review workflow — approve/reject proposals, verify tasks,
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.16.0"
7
+ version: "0.16.4"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Read-only adversarial Chorus task reviewer — independently verifi
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.16.2"
7
+ version: "0.16.4"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Full-auto AI-DLC pipeline — drive a single prompt from Idea throu
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.16.0"
7
+ version: "0.16.4"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -0,0 +1,55 @@
1
+ #!/usr/bin/env bash
2
+ # Tests for public/dsh-credentials.sh — write/merge/mode/idempotency/validation.
3
+ # Runs the real script against disposable $DSH_HOME dirs. Bash 3.2 compatible.
4
+ set -uo pipefail
5
+
6
+ HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
7
+ SCRIPT="$HERE/dsh-credentials.sh"
8
+ fail=0
9
+
10
+ ok() { printf 'ok %s\n' "$1"; }
11
+ no() { printf 'FAIL %s\n' "$1"; fail=1; }
12
+
13
+ # run the script with a clean env (no ambient CHORUS_*), stdin from /dev/null.
14
+ run() {
15
+ local home="$1"; shift
16
+ env -u CHORUS_URL -u CHORUS_API_KEY DSH_HOME="$home" "$@" bash "$SCRIPT" </dev/null >/dev/null 2>&1
17
+ }
18
+
19
+ # 1. writes both keys, preserves unrelated lines, mode 0600, normalizes URL
20
+ T="$(mktemp -d)"; printf 'DEEPSEEK_API_KEY=sk-keep\nOTHER=1\n' > "$T/.env"
21
+ run "$T" CHORUS_URL="https://c.example/api/mcp/" CHORUS_API_KEY="cho_test123"
22
+ grep -qx 'CHORUS_URL=https://c.example' "$T/.env" && ok "writes+normalizes CHORUS_URL" || no "writes+normalizes CHORUS_URL"
23
+ grep -qx 'CHORUS_API_KEY=cho_test123' "$T/.env" && ok "writes CHORUS_API_KEY" || no "writes CHORUS_API_KEY"
24
+ grep -qx 'DEEPSEEK_API_KEY=sk-keep' "$T/.env" && ok "preserves DEEPSEEK line" || no "preserves DEEPSEEK line"
25
+ grep -qx 'OTHER=1' "$T/.env" && ok "preserves OTHER line" || no "preserves OTHER line"
26
+ [ "$(stat -c '%a' "$T/.env" 2>/dev/null || stat -f '%A' "$T/.env")" = "600" ] && ok "mode 0600" || no "mode 0600"
27
+
28
+ # 2. idempotent: re-run replaces, no duplicate lines
29
+ run "$T" CHORUS_URL="https://c.example" CHORUS_API_KEY="cho_new"
30
+ [ "$(grep -c '^CHORUS_URL=' "$T/.env")" = "1" ] && ok "no duplicate CHORUS_URL" || no "no duplicate CHORUS_URL"
31
+ [ "$(grep -c '^CHORUS_API_KEY=' "$T/.env")" = "1" ] && ok "no duplicate CHORUS_API_KEY" || no "no duplicate CHORUS_API_KEY"
32
+ grep -qx 'CHORUS_API_KEY=cho_new' "$T/.env" && ok "replaced key value" || no "replaced key value"
33
+ rm -rf "$T"
34
+
35
+ # 3. drops a prior `export CHORUS_*` form too, keeps others
36
+ T="$(mktemp -d)"; printf 'export CHORUS_URL=https://old\nexport CHORUS_API_KEY=cho_old\nKEEP=2\n' > "$T/.env"
37
+ run "$T" CHORUS_URL="https://c.example" CHORUS_API_KEY="cho_fresh"
38
+ grep -q 'export CHORUS_URL' "$T/.env" && no "drops export CHORUS_URL" || ok "drops export CHORUS_URL"
39
+ grep -q 'export CHORUS_API_KEY' "$T/.env" && no "drops export CHORUS_API_KEY" || ok "drops export CHORUS_API_KEY"
40
+ grep -qx 'KEEP=2' "$T/.env" && ok "KEEP preserved" || no "KEEP preserved"
41
+ rm -rf "$T"
42
+
43
+ # 4. validation: missing creds (no TTY) / bad URL / bad key all exit non-zero, write nothing
44
+ T="$(mktemp -d)"
45
+ run "$T" && no "missing creds exits non-zero" || ok "missing creds exits non-zero"
46
+ [ ! -f "$T/.env" ] && ok "no .env written on failure" || no "no .env written on failure"
47
+ run "$T" CHORUS_URL="ftp://x" CHORUS_API_KEY="cho_x" && no "bad URL exits non-zero" || ok "bad URL exits non-zero"
48
+ run "$T" CHORUS_URL="https://x" CHORUS_API_KEY="nope" && no "bad key exits non-zero" || ok "bad key exits non-zero"
49
+ rm -rf "$T"
50
+
51
+ # 5. --help exits 0
52
+ bash "$SCRIPT" --help >/dev/null 2>&1 && ok "--help exits 0" || no "--help exits 0"
53
+
54
+ if [ "$fail" -eq 0 ]; then printf '\nALL PASS\n'; else printf '\nFAILURES\n'; fi
55
+ exit "$fail"
package/README.ja.md CHANGED
@@ -38,6 +38,8 @@ Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Veri
38
38
 
39
39
  ## 最近の更新
40
40
 
41
+ **[v0.16.4](https://chorus-ai.dev/blog/chorus-v0.16.4-release/)** — DeepSeek Harness(dsh)が 6 つ目の接続方法に。`@chorus-aidlc/chorus-dsh` バンドルが Chorus のスキル・ペルソナ・MCP 設定を任意の dsh プロファイルに追加します。現時点は対話的な利用のみ、デーモンウェイクは後日対応。
42
+
41
43
  **[v0.16.1](https://chorus-ai.dev/blog/chorus-v0.16.1-release/)** — 1 つの `chorus daemon` が、互いに独立した複数のエージェントを同時に扱えるようになりました。各エージェントは `agents[]` 配列で自分のキー・作業ディレクトリ・バックエンド・権限を持ちます。エージェント同士は @メンションで作業を渡し合え、各ウェイクはそのエージェント自身のプロジェクトディレクトリに届きます。
42
44
 
43
45
  **[v0.16.0](https://chorus-ai.dev/blog/chorus-v0.16.0-release/)** — エージェントをドキュメントサイト([doc.chorus-ai.dev](https://doc.chorus-ai.dev))へ案内する `docs` スキルを追加し、記憶に頼らず現在のドキュメントを読んで回答するようにしました。
@@ -99,7 +101,7 @@ PM エージェントが要件を分析し、PRD と課題 DAG を含む提案
99
101
 
100
102
  ## AI エージェントを接続する
101
103
 
102
- 最も手早い方法は、アプリ内のセットアップウィザードです:**Settings → Setup Guide** を開いてください。ウィザードが API キーを作成し、お使いのクライアント(Claude Code、Codex、Kiro、OpenCode、OpenClaw、Pi、その他 MCP 互換のエージェント)向けの正確なコマンドを表示します。
104
+ 最も手早い方法は、アプリ内のセットアップウィザードです:**Settings → Setup Guide** を開いてください。ウィザードが API キーを作成し、お使いのクライアント(Claude Code、Codex、Kiro、dsh、OpenCode、OpenClaw、Pi、その他 MCP 互換のエージェント)向けの正確なコマンドを表示します。
103
105
 
104
106
  クライアントごとの詳細なガイド → **[エージェントプラットフォーム](https://doc.chorus-ai.dev/ja/reference/agents/)**。
105
107
 
package/README.ko.md CHANGED
@@ -38,6 +38,8 @@ Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Veri
38
38
 
39
39
  ## 최근 업데이트
40
40
 
41
+ **[v0.16.4](https://chorus-ai.dev/blog/chorus-v0.16.4-release/)** — DeepSeek Harness(dsh)가 여섯 번째 연결 방식으로 추가됩니다: `@chorus-aidlc/chorus-dsh` 번들이 Chorus의 스킬·페르소나·MCP 설정을 임의의 dsh 프로파일에 추가합니다. 현재는 대화식 사용만, 데몬 웨이크는 추후 지원.
42
+
41
43
  **[v0.16.1](https://chorus-ai.dev/blog/chorus-v0.16.1-release/)** — 이제 하나의 `chorus daemon`이 서로 독립적인 여러 에이전트를 동시에 서비스합니다. 각 에이전트는 `agents[]` 배열로 자신의 키·작업 디렉터리·백엔드·권한을 가집니다. 에이전트끼리 @멘션으로 작업을 넘길 수 있고, 각 웨이크는 해당 에이전트 자신의 프로젝트 디렉터리에 도착합니다.
42
44
 
43
45
  **[v0.16.0](https://chorus-ai.dev/blog/chorus-v0.16.0-release/)** — 에이전트를 문서 사이트([doc.chorus-ai.dev](https://doc.chorus-ai.dev))로 안내하는 `docs` 스킬을 추가해, 기억에 의존하지 않고 현재 문서를 읽고 답하도록 했습니다.
@@ -99,7 +101,7 @@ PM 에이전트가 요구사항을 분석해 PRD와 작업 DAG를 생성하며,
99
101
 
100
102
  ## 에이전트 연결하기
101
103
 
102
- 가장 빠른 방법은 앱 내 마법사입니다: **Settings → Setup Guide**를 여세요. 마법사가 API 키를 만들고, 사용하는 클라이언트(Claude Code, Codex, Kiro, OpenCode, OpenClaw, Pi, 또는 그 밖의 MCP 호환 에이전트)에 맞는 정확한 명령을 보여줍니다.
104
+ 가장 빠른 방법은 앱 내 마법사입니다: **Settings → Setup Guide**를 여세요. 마법사가 API 키를 만들고, 사용하는 클라이언트(Claude Code, Codex, Kiro, dsh, OpenCode, OpenClaw, Pi, 또는 그 밖의 MCP 호환 에이전트)에 맞는 정확한 명령을 보여줍니다.
103
105
 
104
106
  클라이언트별 전체 가이드 → **[에이전트 플랫폼](https://doc.chorus-ai.dev/ko/reference/agents/)**.
105
107
 
package/README.md CHANGED
@@ -38,6 +38,8 @@ The labels under each stage are the **permissions** an actor needs there — gra
38
38
 
39
39
  ## What's New
40
40
 
41
+ **[v0.16.4](https://chorus-ai.dev/blog/chorus-v0.16.4-release/)** — DeepSeek Harness (dsh) is the sixth way to connect: the `@chorus-aidlc/chorus-dsh` bundle drops Chorus's skills, persona, and MCP config into any dsh profile. Interactive for now; daemon wake comes later.
42
+
41
43
  **[v0.16.1](https://chorus-ai.dev/blog/chorus-v0.16.1-release/)** — One `chorus daemon` now serves many independent agents at once — each with its own key, working directories, backend, and permissions via an `agents[]` array — and agents can hand work to each other by @-mention, with each wake landing in that agent's own project directory.
42
44
 
43
45
  **[v0.16.0](https://chorus-ai.dev/blog/chorus-v0.16.0-release/)** — A `docs` skill that points agents at the live docs site ([doc.chorus-ai.dev](https://doc.chorus-ai.dev)), so they answer from the current docs instead of reciting from memory.
@@ -99,7 +101,7 @@ Task cards flow between To Do → In Progress → To Verify as agents work, with
99
101
 
100
102
  ## Connect an Agent
101
103
 
102
- The fastest path is the in-app wizard: open **Settings → Setup Guide**. It creates the API key and shows the exact commands for your client — Claude Code, Codex, Kiro, OpenCode, OpenClaw, Pi, or any MCP-compatible agent.
104
+ The fastest path is the in-app wizard: open **Settings → Setup Guide**. It creates the API key and shows the exact commands for your client — Claude Code, Codex, Kiro, dsh, OpenCode, OpenClaw, Pi, or any MCP-compatible agent.
103
105
 
104
106
  Full per-client guides → **[Agent platforms](https://doc.chorus-ai.dev/reference/agents/)**.
105
107
 
package/README.zh.md CHANGED
@@ -29,6 +29,8 @@ Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Veri
29
29
 
30
30
  ## 最近更新
31
31
 
32
+ **[v0.16.4](https://chorus-ai.dev/zh/blog/chorus-v0.16.4-release/)** — DeepSeek Harness(dsh)成为第六种接入方式:`@chorus-aidlc/chorus-dsh` bundle 把 Chorus 的 skill、persona 和 MCP 配置装进任意 dsh profile。目前仅交互式使用,daemon 唤醒稍后支持。
33
+
32
34
  **[v0.16.1](https://chorus-ai.dev/zh/blog/chorus-v0.16.1-release/)** — 一个 `chorus daemon` 现在可以同时服务多个互相独立的 agent,每个都有自己的密钥、工作目录、后端和权限(通过 `agents[]` 配置);agent 之间还能通过 @ 把活递给对方,每次唤醒都落在该 agent 自己的项目目录里。
33
35
 
34
36
  **[v0.16.0](https://chorus-ai.dev/zh/blog/chorus-v0.16.0-release/)** — 新增 `docs` skill,引导 Agent 查阅文档站点([doc.chorus-ai.dev](https://doc.chorus-ai.dev)),基于当前文档作答,而不是凭记忆复述。
@@ -90,7 +92,7 @@ Kanban 看板随 Agent 工作进度自动更新,任务卡片在 To Do → In P
90
92
 
91
93
  ## 连接 Agent
92
94
 
93
- 最快的方式是应用内的 setup 向导:打开 **Settings → Setup Guide**。它会创建 API Key,并给出适配你所用客户端的完整命令,无论是 Claude Code、Codex、Kiro、OpenCode、OpenClaw、Pi,还是任何兼容 MCP 的 agent。
95
+ 最快的方式是应用内的 setup 向导:打开 **Settings → Setup Guide**。它会创建 API Key,并给出适配你所用客户端的完整命令,无论是 Claude Code、Codex、Kiro、dsh、OpenCode、OpenClaw、Pi,还是任何兼容 MCP 的 agent。
94
96
 
95
97
  按客户端分的完整接入指南 → **[Agent 接入平台](https://doc.chorus-ai.dev/zh/reference/agents/)**。
96
98
 
@@ -0,0 +1,93 @@
1
+ // cli/agent-backend-prompt.mjs
2
+ // Single source of truth for the interactive "which agent backend?" menu shared
3
+ // by the daemon credential-capture entry points: `chorus login` (single-agent),
4
+ // `chorus login --add` / `chorus daemon add`, and the `chorus install` "add
5
+ // another agent" loop (see cli/login.mjs, cli/daemon-install-config.mjs).
6
+ //
7
+ // The same AGENT_MENU list also feeds resolveInstallAgent's daemon-level backend
8
+ // prompt in daemon-install-config.mjs, so every surface advertises EXACTLY the
9
+ // same backends and never drifts — re-advertising a backend (e.g. dsh) is a
10
+ // one-line edit here that all prompts pick up.
11
+ //
12
+ // promptAgentBackend deliberately differs from resolveInstallAgent's inline menu
13
+ // in ONE way: an empty / unrecognized answer returns `undefined` ("no explicit
14
+ // choice") rather than DEFAULT_AGENT, so the add/login callers can OMIT the
15
+ // backend field and let resolve-time inheritance apply (the daemon top-level
16
+ // default). resolveInstallAgent must always produce a concrete daemon-level
17
+ // backend, so it keeps its own empty→DEFAULT_AGENT behavior and does NOT use
18
+ // this helper.
19
+ //
20
+ // Lives in its own module to avoid an import cycle: daemon-install-config.mjs
21
+ // already imports appendAgentConfig from login.mjs, so the shared menu cannot
22
+ // live in either of those files.
23
+
24
+ import { KNOWN_AGENTS } from "./daemon-agent.mjs";
25
+
26
+ /**
27
+ * The interactive agent-backend menu. Order mirrors KNOWN_AGENTS with claude-code
28
+ * first (it is the default). Kept as the single shared list so the numbered
29
+ * prompt and the accepted values never drift across entry points.
30
+ *
31
+ * NOTE: the dsh JSON-RPC daemon backend is temporarily de-advertised (offline).
32
+ * The code path (probeAgentCli/resolveDshPath, spawner-select, dsh-spawner) is
33
+ * kept dormant — re-add this menu entry to bring it back online. It remains
34
+ * reachable by name (e.g. `--agent dsh`, or typing "dsh" at the prompt).
35
+ */
36
+ export const AGENT_MENU = [
37
+ { value: "claude-code", label: "Claude Code (default)" },
38
+ { value: "codex", label: "Codex CLI" },
39
+ { value: "kiro", label: "Kiro CLI" },
40
+ ];
41
+
42
+ /** A non-empty trimmed string, or undefined. */
43
+ function nonEmpty(value) {
44
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
45
+ }
46
+
47
+ /**
48
+ * Prompt the operator to pick an agent backend for the agent being configured,
49
+ * shared by the add / login / install-add flows.
50
+ *
51
+ * Returns the chosen backend value, or `undefined` when the operator makes no
52
+ * explicit choice — meaning "inherit the daemon default" (the caller then omits
53
+ * the `agentType` / top-level `agent` field). `undefined` is returned when:
54
+ * - `isTTY` is false (non-interactive / piped) — returns immediately, prints
55
+ * nothing, never blocks (mirrors resolveInstallAgent / resolveDaemonCwds);
56
+ * - the answer is empty (Enter);
57
+ * - the answer is an out-of-range number or is otherwise unrecognized.
58
+ *
59
+ * Accepts either a menu number (1..AGENT_MENU.length) or a KNOWN_AGENTS value
60
+ * typed by name (e.g. "codex", or "dsh" even though it is de-advertised).
61
+ *
62
+ * @param {{
63
+ * ask: (query: string, opts?: object) => Promise<string>,
64
+ * log?: (m: string) => void,
65
+ * isTTY?: boolean,
66
+ * }} deps
67
+ * @returns {Promise<string|undefined>}
68
+ */
69
+ export async function promptAgentBackend({ ask, log = () => {}, isTTY = false } = {}) {
70
+ // Non-TTY (piped / scripted) must never block on a menu — return immediately
71
+ // with no output. The caller falls back to --agent or inherits the default.
72
+ if (!isTTY || typeof ask !== "function") return undefined;
73
+
74
+ log("[Chorus] Which agent backend should this agent use?");
75
+ for (let i = 0; i < AGENT_MENU.length; i += 1) {
76
+ log(`[Chorus] ${i + 1}) ${AGENT_MENU[i].label}`);
77
+ }
78
+ const answer = nonEmpty(
79
+ await ask(`Select [1-${AGENT_MENU.length}] (Enter to inherit the daemon default): `),
80
+ );
81
+ if (!answer) return undefined; // Enter → inherit default.
82
+
83
+ const n = Number(answer);
84
+ if (Number.isInteger(n) && n >= 1 && n <= AGENT_MENU.length) {
85
+ return AGENT_MENU[n - 1].value;
86
+ }
87
+ // A backend typed by name (muscle memory). KNOWN_AGENTS includes de-advertised
88
+ // backends (dsh), so a by-name pick can still reach them.
89
+ if (KNOWN_AGENTS.includes(answer)) return answer;
90
+
91
+ // Out-of-range / garbage → no explicit choice; the caller inherits the default.
92
+ return undefined;
93
+ }
@@ -14,10 +14,10 @@
14
14
  export const DAEMON_ACTIONS = new Set(["stop", "status", "restart", "logs", "install", "uninstall"]);
15
15
 
16
16
  /** Known agent backends, kept in sync with the authoritative list in
17
- * daemon-agent.mjs (`claude-code`, `codex`, `kiro` — all implemented). This copy
17
+ * daemon-agent.mjs (`claude-code`, `codex`, `kiro`, `dsh` — all implemented). This copy
18
18
  * is informational only: parsing here does not validate the value (the resolver
19
19
  * in daemon-agent.mjs is the single source of truth for validation). */
20
- export const KNOWN_AGENTS = new Set(["claude-code", "codex", "kiro"]);
20
+ export const KNOWN_AGENTS = new Set(["claude-code", "codex", "kiro", "dsh"]);
21
21
 
22
22
  /**
23
23
  * Parse the client-subcommand flags out of an arg list. Recognizes the
@@ -126,7 +126,8 @@ OPTIONS
126
126
  --agent <type> Local agent backend to wake (env: CHORUS_AGENT)
127
127
  (claude-code | codex | kiro; default: claude-code)
128
128
  (Also configurable as "agent":"…" in ~/.chorus/daemon.json;
129
- 'chorus daemon install' prompts for it interactively.)
129
+ 'chorus daemon install' and 'chorus login' (incl. --add)
130
+ prompt for it interactively on a TTY.)
130
131
  --yolo Full autonomy for the woken agent (env: CHORUS_YOLO=1)
131
132
  (--dangerously-skip-permissions: Bash, file writes, any
132
133
  command). This is the DEFAULT permission mode.
@@ -205,10 +206,15 @@ OPTIONS
205
206
  --api-key <cho_...> Agent API key (env: CHORUS_API_KEY)
206
207
  --add Add this key as an ADDITIONAL agent (multi-agent daemon)
207
208
  instead of overwriting the single credential
209
+ --agent <type> Agent backend for THIS agent (env: CHORUS_AGENT)
210
+ (claude-code | codex | kiro). On a TTY, login (and
211
+ --add) prompt for it when omitted; Enter inherits the
212
+ daemon default (claude-code) and writes no backend.
208
213
  -h, --help Show this help message
209
214
 
210
- With no flags, login prompts interactively for the URL and a masked API key,
211
- validates them against the server, and on success saves the credentials.
215
+ With no flags, login prompts interactively for the URL, a masked API key, and
216
+ (on a TTY) the agent backend, validates them against the server, and on success
217
+ saves the credentials.
212
218
 
213
219
  With --add, the validated key is appended to the daemon.json 'agents[]' array
214
220
  so one daemon can serve several independent agents (see docs/DAEMON.md). The
@@ -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,9 @@
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
+ export const KNOWN_AGENTS = ["claude-code", "codex", "kiro", "dsh"];
23
22
 
24
23
  /** The default agent backend when neither --agent nor CHORUS_AGENT is set. */
25
24
  export const DEFAULT_AGENT = "claude-code";
@@ -35,6 +34,7 @@ export const DEFAULT_AGENT = "claude-code";
35
34
  export function backendCli(agentType) {
36
35
  if (agentType === "codex") return { name: "codex", envVar: "CHORUS_CODEX_PATH" };
37
36
  if (agentType === "kiro") return { name: "kiro-cli", envVar: "CHORUS_KIRO_PATH" };
37
+ if (agentType === "dsh") return { name: "dsh-jsonrpc-agent", envVar: "CHORUS_DSH_PATH" };
38
38
  return { name: "claude", envVar: "CHORUS_CLAUDE_PATH" };
39
39
  }
40
40
 
@@ -49,6 +49,7 @@ export function backendCli(agentType) {
49
49
  export function backendClientType(agentType) {
50
50
  if (agentType === "codex") return "codex";
51
51
  if (agentType === "kiro") return "kiro";
52
+ if (agentType === "dsh") return "dsh";
52
53
  return "claude_code";
53
54
  }
54
55
 
@@ -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,7 +306,7 @@ 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.
310
310
  * @property {Array<string|undefined>} cwds Served paths (`undefined` ⇒ process cwd).
311
311
  * @property {"yolo"|"chorus"} permissionMode Woken-agent permission posture.
312
312
  * @property {number} maxConcurrency This agent's wake-queue cap.
@@ -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]