@chorus-aidlc/chorus 0.16.3 → 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 (351) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +386 -386
  3. package/.next/standalone/.next/app-path-routes-manifest.json +50 -50
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +24 -24
  6. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
  7. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
  8. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  32. package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
  33. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  35. package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
  36. package/.next/standalone/.next/server/app/admin/companies/new.rsc +1 -1
  37. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  38. package/.next/standalone/.next/server/app/admin/companies.html +2 -2
  39. package/.next/standalone/.next/server/app/admin/companies.rsc +1 -1
  40. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  41. package/.next/standalone/.next/server/app/admin.html +2 -2
  42. package/.next/standalone/.next/server/app/admin.rsc +1 -1
  43. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  44. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/api/agent-connections/route.js.nft.json +1 -1
  48. package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
  51. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +1 -1
  52. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  55. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  58. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  60. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
  65. package/.next/standalone/.next/server/app/api/comments/route.js.nft.json +1 -1
  66. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js.nft.json +1 -1
  68. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -1
  75. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -1
  77. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +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.js.nft.json +1 -1
  82. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -1
  84. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -1
  85. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
  87. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -1
  88. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route.js.nft.json +1 -1
  90. package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/daemon-directory-requests/route.js.nft.json +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.js +1 -1
  94. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -1
  95. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js +1 -1
  97. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -1
  100. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -1
  103. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -1
  104. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -1
  106. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -1
  107. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js +1 -1
  110. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/events/notifications/route.js +1 -1
  113. package/.next/standalone/.next/server/app/api/events/notifications/route.js.nft.json +1 -1
  114. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/events/route.js +1 -1
  116. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  117. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  120. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
  123. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
  126. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +1 -1
  127. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js +1 -1
  129. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
  132. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +1 -1
  133. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
  135. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +1 -1
  136. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js +1 -1
  140. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js.nft.json +1 -1
  141. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/mcp/route.js +1 -1
  143. package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
  146. package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
  147. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
  149. package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js +1 -1
  152. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +1 -1
  153. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js +1 -1
  155. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js +1 -1
  158. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +1 -1
  159. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js +1 -1
  161. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +1 -1
  162. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/api/notifications/route.js +1 -1
  164. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  165. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js +1 -1
  167. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +1 -1
  168. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  169. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  171. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  172. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  175. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route.js.nft.json +1 -1
  177. package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
  178. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  179. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
  180. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  181. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  183. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
  184. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
  185. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  186. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
  187. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
  188. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  189. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  190. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  191. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  192. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js +1 -1
  193. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js.nft.json +1 -1
  194. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  195. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  196. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  197. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
  198. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
  199. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  200. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
  201. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
  202. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  203. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route.js.nft.json +1 -1
  204. package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
  205. package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
  206. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  207. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  208. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  209. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  210. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  211. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  212. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  213. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  214. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  215. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  216. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
  217. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +1 -1
  218. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  219. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
  220. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +1 -1
  221. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  222. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
  223. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +1 -1
  224. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  225. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
  226. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +1 -1
  227. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  228. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
  229. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +1 -1
  230. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  231. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
  232. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +1 -1
  233. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  234. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
  235. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +1 -1
  236. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  237. package/.next/standalone/.next/server/app/index.html +2 -2
  238. package/.next/standalone/.next/server/app/index.rsc +1 -1
  239. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  240. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  241. package/.next/standalone/.next/server/app/login/admin.rsc +1 -1
  242. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  243. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  244. package/.next/standalone/.next/server/app/login/callback.rsc +1 -1
  245. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  246. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  247. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  248. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +1 -1
  249. package/.next/standalone/.next/server/app/login.html +2 -2
  250. package/.next/standalone/.next/server/app/login.rsc +1 -1
  251. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  252. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  253. package/.next/standalone/.next/server/app/onboarding.rsc +2 -2
  254. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  255. package/.next/standalone/.next/server/app/projects.html +2 -2
  256. package/.next/standalone/.next/server/app/projects.rsc +2 -2
  257. package/.next/standalone/.next/server/app/settings.html +2 -2
  258. package/.next/standalone/.next/server/app/settings.rsc +3 -3
  259. package/.next/standalone/.next/server/app-paths-manifest.json +50 -50
  260. package/.next/standalone/.next/server/chunks/2572.js +1 -1
  261. package/.next/standalone/.next/server/chunks/2618.js +1 -1
  262. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  263. package/.next/standalone/.next/server/chunks/4827.js +1 -1
  264. package/.next/standalone/.next/server/chunks/5205.js +1 -0
  265. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  266. package/.next/standalone/.next/server/chunks/5351.js +3 -2
  267. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  268. package/.next/standalone/.next/server/chunks/6506.js +2 -2
  269. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  270. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  271. package/.next/standalone/.next/server/chunks/920.js +1 -1
  272. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  273. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  274. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  275. package/.next/standalone/.next/server/middleware-manifest.json +1 -1
  276. package/.next/standalone/.next/server/pages/404.html +2 -2
  277. package/.next/standalone/.next/server/pages/500.html +1 -1
  278. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  279. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  280. package/.next/standalone/.next/static/chunks/{11595.97e534422c57aee1.js → 11595.a6268c75ca8a2163.js} +1 -1
  281. package/.next/standalone/.next/static/chunks/{19887-c0bb297a78a1c7cd.js → 19887-b805e1dcee8c367b.js} +1 -1
  282. package/.next/standalone/.next/static/chunks/{33456.6dc44a6aca1a01fd.js → 33456.16ff7edf00137539.js} +1 -1
  283. package/.next/standalone/.next/static/chunks/{4860.7873ebc9ba435c8c.js → 4860.9e06848eb531e667.js} +1 -1
  284. package/.next/standalone/.next/static/chunks/{94643-01be319472d751b3.js → 94643-ffa140f765c73daf.js} +1 -1
  285. package/.next/standalone/.next/static/chunks/{99373.d0e808c18408b8da.js → 99373.81b79c91858f9099.js} +1 -1
  286. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/{page-6b3fb08d53826d02.js → page-b9eb4e0692996657.js} +1 -1
  287. package/.next/standalone/.next/static/chunks/{webpack-fa066d7ff9ab2b29.js → webpack-4d1cc14b13e247b6.js} +1 -1
  288. package/.next/standalone/package.json +1 -1
  289. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  290. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  291. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +1 -1
  292. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
  293. package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
  294. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  295. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
  296. package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +1 -1
  297. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
  298. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  299. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  300. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
  301. package/.next/standalone/public/dsh-credentials.sh +137 -0
  302. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  303. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
  304. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
  305. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
  306. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +1 -1
  307. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +1 -1
  308. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
  309. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
  310. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
  311. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +1 -1
  312. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  313. package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
  314. package/.next/standalone/public/skill/chorus/SKILL.md +1 -1
  315. package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
  316. package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
  317. package/.next/standalone/public/skill/docs-chorus/SKILL.md +1 -1
  318. package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
  319. package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +1 -1
  320. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
  321. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
  322. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
  323. package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
  324. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
  325. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
  326. package/.next/standalone/public/test-dsh-credentials.sh +55 -0
  327. package/README.ja.md +3 -1
  328. package/README.ko.md +3 -1
  329. package/README.md +3 -1
  330. package/README.zh.md +3 -1
  331. package/cli/agent-backend-prompt.mjs +93 -0
  332. package/cli/client-args.mjs +11 -5
  333. package/cli/daemon-agent.mjs +6 -5
  334. package/cli/daemon-banner.mjs +3 -3
  335. package/cli/daemon-config.mjs +1 -1
  336. package/cli/daemon-install-config.mjs +21 -14
  337. package/cli/daemon-rest-client.mjs +31 -8
  338. package/cli/daemon.mjs +47 -6
  339. package/cli/dsh-managed-config.mjs +407 -0
  340. package/cli/dsh-spawner.mjs +438 -0
  341. package/cli/login.mjs +26 -4
  342. package/cli/spawner-select.mjs +10 -1
  343. package/cli/turn-reporter.mjs +5 -2
  344. package/cli/upload-hooks.mjs +31 -1
  345. package/cli/waker.mjs +49 -6
  346. package/package.json +1 -1
  347. package/prisma/migrations/20260818024700_add_turn_backend_session_id/migration.sql +1 -0
  348. package/prisma/schema.prisma +3 -0
  349. package/.next/standalone/.next/server/chunks/1114.js +0 -1
  350. /package/.next/standalone/.next/static/{K8qIdwvKoIWbwQ_f01mnM → 6sHDgeKioa0SJR1MAbcYG}/_buildManifest.js +0 -0
  351. /package/.next/standalone/.next/static/{K8qIdwvKoIWbwQ_f01mnM → 6sHDgeKioa0SJR1MAbcYG}/_ssgManifest.js +0 -0
@@ -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]
@@ -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
  /**
package/cli/daemon.mjs CHANGED
@@ -41,6 +41,8 @@ import { Waker } from "./waker.mjs";
41
41
  import { LineageResolver } from "./lineage.mjs";
42
42
  import { resolveClaudePath } from "./claude-spawner.mjs";
43
43
  import { resolveCodexPath } from "./codex-spawner.mjs";
44
+ import { resolveDshPath } from "./dsh-spawner.mjs";
45
+ import { prepareManagedDshConfig } from "./dsh-managed-config.mjs";
44
46
  import { resolveKiroPath } from "./kiro-spawner.mjs";
45
47
  import { selectSpawner } from "./spawner-select.mjs";
46
48
  import {
@@ -152,7 +154,13 @@ export function buildDaemon(creds, deps = {}) {
152
154
  // (construction byte-identical to before); codex → CodexSpawner. `creds` are
153
155
  // passed through so the Codex backend can export the daemon key into the woken
154
156
  // process env (the Claude backend ignores creds — it gets its key via --mcp-config).
155
- const spawner = deps.spawner ?? selectSpawner(agentType, { logger, permissionMode, creds });
157
+ const spawner = deps.spawner ?? selectSpawner(agentType, {
158
+ logger,
159
+ permissionMode,
160
+ creds,
161
+ bundleVersion: deps.bundleVersion,
162
+ prepareManagedConfigFn: deps.prepareManagedDshConfig,
163
+ });
156
164
  const maxConcurrency = deps.maxConcurrency ?? 4;
157
165
 
158
166
  // ===== Multi-path: the SET of cwds this daemon serves (T3 — FR-5) =====
@@ -742,6 +750,7 @@ export async function runDaemon(flags = {}, deps = {}) {
742
750
  // banner shows the right binary instead of always probing for `claude`.
743
751
  const findClaude = deps.resolveClaudePath ?? resolveClaudePath;
744
752
  const findCodex = deps.resolveCodexPath ?? resolveCodexPath;
753
+ const findDsh = deps.resolveDshPath ?? resolveDshPath;
745
754
  const findKiro = deps.resolveKiroPath ?? resolveKiroPath;
746
755
  const verbose = flags.verbose === true || env.CHORUS_VERBOSE === "1";
747
756
 
@@ -786,6 +795,9 @@ export async function runDaemon(flags = {}, deps = {}) {
786
795
  writeConfig: deps.writeConfig,
787
796
  readJson: deps.readJson,
788
797
  loginPath: deps.loginPath,
798
+ prepareManagedDshConfig: deps.prepareManagedDshConfig,
799
+ bundleVersion: version,
800
+ resolveDshPath: findDsh,
789
801
  };
790
802
 
791
803
  const action = flags.action ?? "run";
@@ -884,6 +896,8 @@ export async function runDaemon(flags = {}, deps = {}) {
884
896
  mcpClient: deps.mcpClient,
885
897
  lineage: deps.lineage,
886
898
  build: deps.build,
899
+ bundleVersion: version,
900
+ prepareManagedDshConfig: deps.prepareManagedDshConfig,
887
901
  });
888
902
 
889
903
  const shutdownMulti = () => {
@@ -924,11 +938,16 @@ export async function runDaemon(flags = {}, deps = {}) {
924
938
  // Detect the SELECTED backend's executable (non-fatal): the daemon still
925
939
  // subscribes when it's missing; a wake surfaces the error visibly when one
926
940
  // arrives. The resolved path (or absence) is shown in the banner below. Each
927
- // backend probes its own binary codex resolveCodexPath, kiro
928
- // resolveKiroPath, otherwise resolveClaudePath so a `--agent kiro` run probes
929
- // (and the banner reports) `kiro-cli`, not `claude`.
941
+ // backend probes its own binary, including dsh-jsonrpc-agent for dsh, so the
942
+ // startup banner and warning report the selected runtime rather than Claude.
930
943
  const cliPath =
931
- agentType === "codex" ? findCodex() : agentType === "kiro" ? findKiro() : findClaude();
944
+ agentType === "codex"
945
+ ? findCodex()
946
+ : agentType === "kiro"
947
+ ? findKiro()
948
+ : agentType === "dsh"
949
+ ? findDsh()
950
+ : findClaude();
932
951
 
933
952
  // The daemon.json the layered config readers (credentials, sigint timeout, cwds)
934
953
  // consult. Surfacing its absolute path + presence in the banner makes it obvious
@@ -987,6 +1006,8 @@ export async function runDaemon(flags = {}, deps = {}) {
987
1006
  sigintTimeoutMs,
988
1007
  cwds,
989
1008
  browseRoots,
1009
+ bundleVersion: version,
1010
+ prepareManagedDshConfig: deps.prepareManagedDshConfig,
990
1011
  });
991
1012
 
992
1013
  // Graceful shutdown on signals.
@@ -1171,7 +1192,7 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
1171
1192
  // CHORUS_AGENT env / a prior stored choice; probes the selected CLI and warns
1172
1193
  // (non-fatal) when it is missing. An unknown --agent was already rejected by
1173
1194
  // resolveAgentType above, so this phase never fails.
1174
- await installCfg.resolveInstallAgent(flags, env, {
1195
+ const installAgent = await installCfg.resolveInstallAgent(flags, env, {
1175
1196
  isTTY,
1176
1197
  skip,
1177
1198
  writeConfig: pfDeps?.writeConfig ?? updateDaemonConfig,
@@ -1181,6 +1202,26 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
1181
1202
  log,
1182
1203
  errLog,
1183
1204
  });
1205
+ if (
1206
+ installAgent.agent === "dsh" &&
1207
+ !String(env.CHORUS_DSH_CONFIG ?? "").trim() &&
1208
+ !String(env.DSH_CORDIS_CONFIG ?? "").trim()
1209
+ ) {
1210
+ try {
1211
+ await (pfDeps?.prepareManagedDshConfig ?? prepareManagedDshConfig)({
1212
+ env,
1213
+ bundleVersion: pfDeps?.bundleVersion,
1214
+ dshPath: installAgent.cliPath ?? pfDeps?.resolveDshPath?.(),
1215
+ creds: credResult.creds,
1216
+ });
1217
+ } catch (error) {
1218
+ errLog(
1219
+ `[Chorus] install aborted — dsh managed composition preparation failed: ` +
1220
+ `${error instanceof Error ? error.message : String(error)}`,
1221
+ );
1222
+ return 1;
1223
+ }
1224
+ }
1184
1225
 
1185
1226
  const spec = {
1186
1227
  ...svc.resolveServicePaths(),