@chorus-aidlc/chorus 0.14.3 → 0.14.5

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 (299) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +232 -232
  3. package/.next/standalone/.next/app-path-routes-manifest.json +38 -38
  4. package/.next/standalone/.next/build-manifest.json +2 -2
  5. package/.next/standalone/.next/prerender-manifest.json +40 -40
  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/execution-state/route.js.nft.json +1 -1
  71. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -1
  73. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -1
  75. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -1
  76. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +1 -1
  78. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +1 -1
  80. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -1
  82. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -1
  83. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
  85. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -1
  86. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -1
  88. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -1
  89. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js +1 -1
  91. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js.nft.json +1 -1
  92. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  93. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -1
  94. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +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.js +1 -1
  97. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -1
  98. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -1
  100. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -1
  101. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js +1 -1
  104. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -1
  105. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/events/notifications/route.js +1 -1
  107. package/.next/standalone/.next/server/app/api/events/notifications/route.js.nft.json +1 -1
  108. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/events/route.js +1 -1
  110. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  111. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  114. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +1 -1
  115. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
  117. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +1 -1
  118. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
  120. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +1 -1
  121. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js +1 -1
  123. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -1
  124. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
  126. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +1 -1
  127. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
  129. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +1 -1
  130. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route.js.nft.json +1 -1
  132. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js +1 -1
  134. package/.next/standalone/.next/server/app/api/ideas/conversational/route.js.nft.json +1 -1
  135. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/mcp/route.js +1 -1
  137. package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
  138. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
  140. package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
  141. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
  143. package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +1 -1
  144. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js +1 -1
  146. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +1 -1
  147. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js +1 -1
  149. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +1 -1
  150. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js +1 -1
  152. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +1 -1
  153. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js +1 -1
  155. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +1 -1
  156. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/api/notifications/route.js +1 -1
  158. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  159. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js +1 -1
  161. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +1 -1
  162. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  165. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  168. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  169. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  171. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  175. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
  176. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
  177. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  178. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
  179. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
  180. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  181. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  183. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  184. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js +1 -1
  185. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js.nft.json +1 -1
  186. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  187. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  189. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
  190. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
  191. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  192. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
  193. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
  194. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  195. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  196. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  197. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  198. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  199. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  200. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  201. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  202. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  203. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  204. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  205. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
  206. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +1 -1
  207. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  208. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
  209. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +1 -1
  210. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  211. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
  212. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +1 -1
  213. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  214. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
  215. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +1 -1
  216. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  217. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
  218. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +1 -1
  219. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  220. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
  221. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +1 -1
  222. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  223. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
  224. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +1 -1
  225. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  226. package/.next/standalone/.next/server/app/index.html +2 -2
  227. package/.next/standalone/.next/server/app/index.rsc +1 -1
  228. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  229. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  230. package/.next/standalone/.next/server/app/login/admin.rsc +1 -1
  231. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  232. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  233. package/.next/standalone/.next/server/app/login/callback.rsc +1 -1
  234. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  235. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  236. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  237. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +1 -1
  238. package/.next/standalone/.next/server/app/login.html +2 -2
  239. package/.next/standalone/.next/server/app/login.rsc +1 -1
  240. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  241. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  242. package/.next/standalone/.next/server/app/onboarding.rsc +1 -1
  243. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  244. package/.next/standalone/.next/server/app/projects.html +2 -2
  245. package/.next/standalone/.next/server/app/projects.rsc +1 -1
  246. package/.next/standalone/.next/server/app/settings.html +2 -2
  247. package/.next/standalone/.next/server/app/settings.rsc +1 -1
  248. package/.next/standalone/.next/server/app-paths-manifest.json +38 -38
  249. package/.next/standalone/.next/server/chunks/4827.js +1 -1
  250. package/.next/standalone/.next/server/chunks/{1114.js → 5205.js} +1 -1
  251. package/.next/standalone/.next/server/middleware-manifest.json +1 -1
  252. package/.next/standalone/.next/server/pages/404.html +2 -2
  253. package/.next/standalone/.next/server/pages/500.html +1 -1
  254. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  255. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  256. package/.next/standalone/package.json +1 -1
  257. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  258. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  259. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +1 -1
  260. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
  261. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  262. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
  263. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
  264. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  265. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  266. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
  267. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  268. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
  269. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
  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-proposal/SKILL.md +1 -1
  272. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
  273. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
  274. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +1 -1
  275. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  276. package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
  277. package/.next/standalone/public/skill/chorus/SKILL.md +1 -1
  278. package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
  279. package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
  280. package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
  281. package/.next/standalone/public/skill/package.json +1 -1
  282. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
  283. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
  284. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
  285. package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
  286. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
  287. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
  288. package/README.md +2 -0
  289. package/cli/claude-spawner.mjs +11 -8
  290. package/cli/client-args.mjs +15 -8
  291. package/cli/codex-spawner.mjs +46 -11
  292. package/cli/daemon-agent.mjs +56 -6
  293. package/cli/daemon-install-config.mjs +129 -0
  294. package/cli/daemon.mjs +23 -1
  295. package/cli/kiro-spawner.mjs +8 -6
  296. package/cli/spawner-select.mjs +1 -6
  297. package/package.json +1 -1
  298. /package/.next/standalone/.next/static/{3R5zOQKwCZOVs9-BjIVqk → BxliSfXbsNMoQV8HnV4m6}/_buildManifest.js +0 -0
  299. /package/.next/standalone/.next/static/{3R5zOQKwCZOVs9-BjIVqk → BxliSfXbsNMoQV8HnV4m6}/_ssgManifest.js +0 -0
@@ -4,7 +4,7 @@ description: Chorus Development workflow — claim tasks, report work, manage se
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.14.3"
7
+ version: "0.14.5"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Idea workflow — claim ideas, run elaboration rounds, and p
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.14.3"
7
+ version: "0.14.5"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Opt-in OpenSpec-mode authoring for Chorus PM workflows in Kiro CLI.
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.14.3"
7
+ version: "0.14.5"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Proposal workflow — create proposals with document and tas
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.14.3"
7
+ version: "0.14.5"
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.14.3"
7
+ version: "0.14.5"
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.14.3"
7
+ version: "0.14.5"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Full-auto AI-DLC pipeline — from prompt to done. Automates the en
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.14.3"
7
+ version: "0.14.5"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -240,7 +240,7 @@ cmd_mcp_tool() {
240
240
  # Step 1: Initialize MCP session
241
241
  local init_payload
242
242
  init_payload=$(cat <<JSONEOF
243
- {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"chorus-hook","version":"0.14.3"}}}
243
+ {"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"chorus-hook","version":"0.14.5"}}}
244
244
  JSONEOF
245
245
  )
246
246
 
@@ -4,7 +4,7 @@ description: Optional divergent-then-convergent dialogue for fuzzy ideas. Invoke
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.14.3"
7
+ version: "0.14.5"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus AI Agent collaboration platform — overview, common tools,
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.14.3"
7
+ version: "0.14.5"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Read-only adversarial Chorus code-review gateway — independently
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.14.3"
7
+ version: "0.14.5"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Development workflow — claim tasks, report work, self-chec
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.14.3"
7
+ version: "0.14.5"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -4,7 +4,7 @@ description: Chorus Idea workflow — claim ideas, run elaboration rounds, and p
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.14.3"
7
+ version: "0.14.5"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "chorus-skill",
3
- "version": "0.14.3",
3
+ "version": "0.14.5",
4
4
  "description": "Chorus AI Agent collaboration platform skill. Supports PM, Developer, and Admin roles via MCP tools for the Idea-Proposal-Task workflow.",
5
5
  "author": "chorus",
6
6
  "license": "AGPL-3.0",
@@ -4,7 +4,7 @@ description: Chorus Proposal workflow — create proposals with document and tas
4
4
  license: AGPL-3.0
5
5
  metadata:
6
6
  author: chorus
7
- version: "0.14.3"
7
+ version: "0.14.5"
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.14.3"
7
+ version: "0.14.5"
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.14.3"
7
+ version: "0.14.5"
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.14.3"
7
+ version: "0.14.5"
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.14.3"
7
+ version: "0.14.5"
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.14.3"
7
+ version: "0.14.5"
8
8
  category: project-management
9
9
  mcp_server: chorus
10
10
  ---
package/README.md CHANGED
@@ -159,6 +159,7 @@ With no `--cwd`, the daemon serves the single directory it was launched from.
159
159
  "agentUuid": "00000000-0000-0000-0000-000000000000",
160
160
  "agentName": "My Daemon Agent",
161
161
  "cwds": ["~/work/repo-a", "~/work/repo-b"],
162
+ "agent": "codex",
162
163
  "sigintTimeoutMs": 10000
163
164
  }
164
165
  ```
@@ -169,6 +170,7 @@ With no `--cwd`, the daemon serves the single directory it was launched from.
169
170
  | `apiKey` | string | Agent API key (`cho_…`) | `--api-key` flag → `CHORUS_API_KEY` → file |
170
171
  | `agentUuid` / `agentName` | string | Authenticated identity (recorded at login) | written by `chorus login` |
171
172
  | `cwds` | string[] | Working directories the daemon serves (multi-path) | `--cwd` flag(s) → `CHORUS_DAEMON_CWDS` → file → launch dir |
173
+ | `agent` | string | Local agent backend to wake (`claude-code` / `codex` / `kiro`) | `--agent` flag → `CHORUS_AGENT` → file → `claude-code` |
172
174
  | `sigintTimeoutMs` | number | Grace window (ms) after SIGINT before a forceful kill (default `10000`) | `--sigint-timeout` flag → `CHORUS_DAEMON_SIGINT_TIMEOUT` → file → `10000` |
173
175
  | `yoloAckAt` | string | Internal — timestamp of a TTY yolo confirmation (managed automatically) | — |
174
176
 
@@ -241,6 +241,8 @@ export function parseNdjsonChunk(buffer, chunk, onObject, onWarn = () => {}) {
241
241
  * @property {(o: object) => { stdin: any, stdout: any, stderr: any, on: Function, kill?: Function }} [spawnImpl]
242
242
  * @property {{info(m:string):void,warn(m:string):void,error(m:string):void}} [logger]
243
243
  * @property {PermissionMode} [permissionMode] How much the woken Claude may do (default "chorus").
244
+ * @property {{ url: string, apiKey: string }} [creds] Daemon credentials exported
245
+ * to the child for plugin hooks and shell-based Chorus tooling.
244
246
  * @property {NodeJS.Platform} [platform] Injectable for tests; gates `detached` (POSIX-only).
245
247
  */
246
248
 
@@ -255,6 +257,7 @@ export class ClaudeSpawner {
255
257
  this.spawnImpl = opts.spawnImpl ?? spawn;
256
258
  this.logger = opts.logger ?? NOOP_LOGGER;
257
259
  this.permissionMode = opts.permissionMode ?? "chorus";
260
+ this.creds = opts.creds ?? null;
258
261
  // POSIX spawns `detached: true` (process-group leader) so the interrupt path
259
262
  // can group-kill the tree; Windows does not. Injectable so a POSIX test host
260
263
  // can exercise the Windows branch and vice versa.
@@ -318,6 +321,11 @@ export class ClaudeSpawner {
318
321
  // stream and observe the exit. On Windows `detached` is NOT used: taskkill /T
319
322
  // walks the tree by pid, and detached there only spawns a new console window.
320
323
  const detached = (this.platform ?? process.platform) !== "win32";
324
+ const childEnv = { ...process.env, CHORUS_DAEMON_HEADLESS: "1" };
325
+ if (this.creds) {
326
+ if (this.creds.url) childEnv.CHORUS_URL = this.creds.url;
327
+ if (this.creds.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
328
+ }
321
329
 
322
330
  return new Promise((resolve) => {
323
331
  let child;
@@ -325,14 +333,9 @@ export class ClaudeSpawner {
325
333
  child = this.spawnImpl(command, argv, {
326
334
  cwd: cwd ?? process.cwd(),
327
335
  stdio: ["pipe", "pipe", "pipe"],
328
- // Mark the child as a headless daemon-woken session (add-daemon-headless-
329
- // interaction-guard). Merged OVER the inherited env so PATH, the Bedrock /
330
- // credential vars, CLAUDE_CONFIG_DIR, etc. all survive — only this one var is
331
- // added. It is a machine-checkable signal (the wake prompt also states it in
332
- // text); this change only LAYS IT DOWN — no code here reads it back. Set
333
- // unconditionally: the spawner only ever runs headless daemon wakes, so both
334
- // "chorus" and "yolo" permission modes get it.
335
- env: { ...process.env, CHORUS_DAEMON_HEADLESS: "1" },
336
+ // Preserve the inherited runtime environment while giving hooks and
337
+ // shell-based Chorus tooling the daemon's authoritative connection pair.
338
+ env: childEnv,
336
339
  // No shell:true — command is either the real executable or cmd.exe
337
340
  // with the script as an argv element. Avoids shell word-splitting /
338
341
  // injection; .cmd is handled explicitly via cmd.exe above.
@@ -120,6 +120,8 @@ OPTIONS
120
120
  --api-key <cho_...> Agent API key (env: CHORUS_API_KEY)
121
121
  --agent <type> Local agent backend to wake (env: CHORUS_AGENT)
122
122
  (claude-code | codex | kiro; default: claude-code)
123
+ (Also configurable as "agent":"…" in ~/.chorus/daemon.json;
124
+ 'chorus daemon install' prompts for it interactively.)
123
125
  --yolo Full autonomy for the woken agent (env: CHORUS_YOLO=1)
124
126
  (--dangerously-skip-permissions: Bash, file writes, any
125
127
  command). This is the DEFAULT permission mode.
@@ -133,9 +135,12 @@ OPTIONS
133
135
  from. (Also configurable as "cwds":[…] in ~/.chorus/daemon.json.)
134
136
  -d, --detach Run detached in the background (pidfile + logfile)
135
137
  -y, --yes Non-interactive install: skip all 'chorus daemon
136
- install' prompts (credentials still resolved, persisted,
137
- and validated; install aborts if none resolve). A non-TTY
138
- install behaves as if --yes were passed.
138
+ install' prompts (credentials, served cwds, and agent
139
+ backend). Credentials are still resolved, persisted, and
140
+ validated; install aborts if none resolve. The agent
141
+ backend defaults to claude-code unless --agent/CHORUS_AGENT
142
+ is set or one is already stored. A non-TTY install behaves
143
+ as if --yes were passed.
139
144
  --verbose More detailed per-wake logging
140
145
  --sigint-timeout <ms> Grace window after SIGINT before a forceful kill
141
146
  (env: CHORUS_DAEMON_SIGINT_TIMEOUT; default 10000)
@@ -155,11 +160,13 @@ SERVICE (install)
155
160
  -d' — the daemon self-daemonizes, which systemd cannot track and which loops
156
161
  on restart. Before writing the unit, install resolves + persists + validates
157
162
  your credentials into ~/.chorus/daemon.json (so the clean boot environment can
158
- authenticate) and configures the served working directories there too (prompting
159
- interactively for one or more when none are set pass -y/--yes or run non-TTY to
160
- skip prompts). The unit captures --agent / --chorus-only but NOT --cwd (cwds live
161
- in daemon.json). On macOS/Windows install prints a correct template you install
162
- manually.
163
+ authenticate), configures the served working directories there too, and prompts
164
+ for the agent backend to wake (claude-code | codex | kiro Enter accepts the
165
+ claude-code default), then checks that backend's CLI is on PATH. Pass -y/--yes or
166
+ run non-TTY to skip all prompts (credentials are still validated). The served
167
+ cwds AND the chosen agent live in daemon.json — the unit captures only
168
+ --chorus-only, NOT --cwd or --agent. On macOS/Windows install prints a correct
169
+ template you install manually.
163
170
 
164
171
  EXAMPLES
165
172
  chorus daemon # Foreground, default yolo (TTY confirms once)
@@ -13,17 +13,18 @@
13
13
  // it and persist anchor→thread_id (codex-session-map.mjs) so a later wake can
14
14
  // `resume <thread_id>`. (serde: ThreadEvent tag="type", rename="thread.started";
15
15
  // ThreadStartedEvent.thread_id: String — codex-rs/exec/src/exec_events.rs.)
16
- // • No `--mcp-config`: MCP comes from the user's ~/.codex/config.toml; the daemon
17
- // key reaches it via the configured bearer_token_env_var (default
18
- // CHORUS_API_KEY) exported into the child ENV — never argv.
16
+ // • No `--mcp-config`: MCP comes from the user's ~/.codex/config.toml. The daemon
17
+ // exports its resolved URL for SessionStart hooks and its key for the configured
18
+ // bearer_token_env_var (default CHORUS_API_KEY) — never argv.
19
19
  // • Permission is a SANDBOX mode, not a tool allowlist.
20
20
  //
21
21
  // Reuses claude-spawner's platform-neutral helpers: parseNdjsonChunk (NDJSON
22
22
  // stream parse) and the PATH-walk shape of resolveClaudePath.
23
23
 
24
24
  import { spawn } from "node:child_process";
25
- import { statSync } from "node:fs";
26
- import { win32 as pathWin32, posix as pathPosix } from "node:path";
25
+ import { readFileSync, statSync } from "node:fs";
26
+ import { homedir } from "node:os";
27
+ import { join, win32 as pathWin32, posix as pathPosix } from "node:path";
27
28
  import { parseNdjsonChunk } from "./claude-spawner.mjs";
28
29
  import { getThreadId as defaultGetThreadId, setThreadId as defaultSetThreadId } from "./codex-session-map.mjs";
29
30
  import {
@@ -34,6 +35,25 @@ import {
34
35
 
35
36
  const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
36
37
 
38
+ /**
39
+ * Check whether the user's Codex config declares the Chorus MCP server.
40
+ * This is diagnostic only: a missing or unreadable config must never block a wake.
41
+ * @param {{ env?: NodeJS.ProcessEnv, readFile?: typeof readFileSync, home?: string }} [deps]
42
+ * @returns {boolean}
43
+ */
44
+ export function hasChorusMcpServer(deps = {}) {
45
+ const env = deps.env ?? process.env;
46
+ const readFile = deps.readFile ?? readFileSync;
47
+ const home = deps.home ?? homedir();
48
+ const configPath = join(env.CODEX_HOME || join(home, ".codex"), "config.toml");
49
+ try {
50
+ const config = readFile(configPath, "utf8");
51
+ return /^\s*\[mcp_servers\.chorus\]\s*(?:#.*)?$/m.test(config);
52
+ } catch {
53
+ return false;
54
+ }
55
+ }
56
+
37
57
  /**
38
58
  * @typedef {Object} Spawner
39
59
  * @property {(params: {
@@ -165,13 +185,14 @@ export function resolveSpawnCommand(codexPath, args, platform = process.platform
165
185
  * @property {(o: object) => any} [spawnImpl] Injectable spawn (tests).
166
186
  * @property {{info(m:string):void,warn(m:string):void,error(m:string):void}} [logger]
167
187
  * @property {"chorus"|"yolo"} [permissionMode] Maps to a Codex sandbox posture.
168
- * @property {{ url: string, apiKey: string }} [creds] Daemon creds apiKey is exported
169
- * into the child env under the user config's bearer_token_env_var (default CHORUS_API_KEY).
188
+ * @property {{ url: string, apiKey: string }} [creds] Daemon creds exported into
189
+ * the child env for SessionStart hooks and the user-configured MCP bearer token.
170
190
  * @property {NodeJS.Platform} [platform] Injectable for tests; gates POSIX `detached`.
171
191
  * @property {(anchor: string) => string|null} [getThreadIdFn] Injectable session-map read.
172
192
  * @property {(anchor: string, threadId: string) => void} [setThreadIdFn] Injectable session-map write.
173
193
  * @property {(anchor: string, threadId: string) => object|null} [getUsageSnapshotFn]
174
194
  * @property {(anchor: string, threadId: string, usage: object) => void} [setUsageSnapshotFn]
195
+ * @property {() => boolean} [hasChorusMcpServerFn] Injectable config probe.
175
196
  */
176
197
 
177
198
  export class CodexSpawner {
@@ -189,6 +210,8 @@ export class CodexSpawner {
189
210
  this.getUsageSnapshotFn = opts.getUsageSnapshotFn ?? defaultGetUsageSnapshot;
190
211
  this.setUsageSnapshotFn = opts.setUsageSnapshotFn ?? defaultSetUsageSnapshot;
191
212
  this.resolveCodexPathFn = opts.resolveCodexPathFn ?? resolveCodexPath;
213
+ this.hasChorusMcpServerFn = opts.hasChorusMcpServerFn ?? hasChorusMcpServer;
214
+ this.mcpConfigChecked = false;
192
215
  }
193
216
 
194
217
  /**
@@ -225,6 +248,15 @@ export class CodexSpawner {
225
248
  return { sessionId: anchor, exitCode: null, isNew };
226
249
  }
227
250
 
251
+ if (!this.mcpConfigChecked) {
252
+ this.mcpConfigChecked = true;
253
+ if (!this.hasChorusMcpServerFn()) {
254
+ this.logger.warn(
255
+ "[Chorus] Codex config has no [mcp_servers.chorus] entry; wake will continue without Chorus MCP tools",
256
+ );
257
+ }
258
+ }
259
+
228
260
  const args = buildCodexArgs({ isNew, threadId: knownThreadId, permissionMode: this.permissionMode });
229
261
  const { command, argv } = resolveSpawnCommand(codexPath, args, this.platform);
230
262
 
@@ -233,11 +265,14 @@ export class CodexSpawner {
233
265
  // stays piped — prompt over stdin + NDJSON stdout parse are unaffected.
234
266
  const detached = this.platform !== "win32";
235
267
 
236
- // Daemon key via ENV under the var the user's [mcp_servers.chorus] references
237
- // (bearer_token_env_var, default CHORUS_API_KEY) NEVER argv. Merged over the
238
- // inherited env so PATH / model auth (Bedrock profile) / CODEX_HOME survive.
268
+ // Export the daemon's resolved connection pair for both Codex MCP auth and
269
+ // SessionStart hooks. Explicitly overwrite inherited values so the hook and
270
+ // daemon cannot disagree about which Chorus instance this wake belongs to.
239
271
  const childEnv = { ...process.env, CHORUS_DAEMON_HEADLESS: "1" };
240
- if (this.creds && this.creds.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
272
+ if (this.creds) {
273
+ if (this.creds.url) childEnv.CHORUS_URL = this.creds.url;
274
+ if (this.creds.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
275
+ }
241
276
 
242
277
  return new Promise((resolve) => {
243
278
  let child;
@@ -3,7 +3,18 @@
3
3
  // `claude-code` (the default), `codex`, and `kiro` are all implemented 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
- // error (no silent fallback). Zero dependencies.
6
+ // error (no silent fallback).
7
+ //
8
+ // Resolution is layered like resolveSigintTimeoutMs / resolveDaemonCwds in
9
+ // daemon-config.mjs — first defined source wins:
10
+ // --agent flag > CHORUS_AGENT env > ~/.chorus/daemon.json `agent` > claude-code.
11
+ // The config-file layer lets an operator persist a default backend (e.g.
12
+ // `"agent": "codex"`) once instead of re-passing --agent / re-exporting the env
13
+ // on every start. IO (file read) is injectable so this stays unit-testable
14
+ // without real disk.
15
+
16
+ import { readFileSync } from "node:fs";
17
+ import { loginFilePath } from "./credentials.mjs";
7
18
 
8
19
  /** The agent backends the daemon recognizes. All are implemented (claude-code
9
20
  * via ClaudeSpawner, codex via CodexSpawner, kiro via KiroSpawner — see
@@ -42,19 +53,58 @@ export function backendClientType(agentType) {
42
53
  }
43
54
 
44
55
  /**
45
- * Resolve the agent type from flag env default, and validate it.
46
- * Precedence: explicit `--agent` flag > CHORUS_AGENT env > DEFAULT_AGENT.
56
+ * Read a JSON file, returning `null` on any error (missing / unreadable /
57
+ * malformed). Never throws mirrors daemon-config.mjs readJsonSafe.
58
+ * @param {string} path
59
+ * @returns {Record<string, unknown> | null}
60
+ */
61
+ function readJsonSafe(path) {
62
+ try {
63
+ const parsed = JSON.parse(readFileSync(path, "utf8"));
64
+ return parsed && typeof parsed === "object" ? parsed : null;
65
+ } catch {
66
+ return null;
67
+ }
68
+ }
69
+
70
+ /** A non-empty trimmed string, or undefined. */
71
+ function nonEmpty(value) {
72
+ return typeof value === "string" && value.trim() ? value.trim() : undefined;
73
+ }
74
+
75
+ /**
76
+ * Resolve the agent type from flag → env → config file → default, and validate it.
77
+ * Precedence (first defined source wins, mirroring resolveSigintTimeoutMs /
78
+ * resolveDaemonCwds): explicit `--agent` flag > CHORUS_AGENT env >
79
+ * ~/.chorus/daemon.json `agent` > DEFAULT_AGENT.
80
+ *
81
+ * An unknown value from ANY source (flag, env, or file) is a hard error — no
82
+ * silent fallback. The config file lets an operator persist a default backend
83
+ * without re-passing --agent on every start.
47
84
  *
48
85
  * @param {{ agent?: string }} flags
49
86
  * @param {Record<string, string|undefined>} env
87
+ * @param {{
88
+ * readJson?: (path: string) => (Record<string, unknown>|null),
89
+ * loginPath?: string,
90
+ * }} [deps]
50
91
  * @returns {{ ok: true, agent: string } | { ok: false, value: string, error: string }}
51
92
  * `ok:false` carries the offending value and a human-actionable error naming
52
93
  * the accepted types — the caller exits non-zero and prints `error`.
53
94
  */
54
- export function resolveAgentType(flags, env) {
95
+ export function resolveAgentType(flags, env, deps = {}) {
96
+ const readJson = deps.readJson ?? readJsonSafe;
97
+ const loginPath = deps.loginPath ?? loginFilePath();
98
+
99
+ const fromFile = () => {
100
+ const file = readJson(loginPath);
101
+ return file ? nonEmpty(file.agent) : undefined;
102
+ };
103
+
55
104
  const raw =
56
- (typeof flags.agent === "string" && flags.agent.trim()) ||
57
- (typeof env.CHORUS_AGENT === "string" && env.CHORUS_AGENT.trim()) ||
105
+ nonEmpty(flags.agent) ||
106
+ nonEmpty(env.CHORUS_AGENT) ||
107
+ fromFile() ||
58
108
  DEFAULT_AGENT;
59
109
  if (!KNOWN_AGENTS.includes(raw)) {
60
110
  return {
@@ -26,6 +26,11 @@ import { resolveCredentials, loginFilePath } from "./credentials.mjs";
26
26
  import { updateDaemonConfig, prompt as defaultPrompt } from "./login.mjs";
27
27
  import { validateAndFetchIdentity } from "./chorus-client.mjs";
28
28
  import { normalizeCwd, cleanCwdList } from "./daemon-config.mjs";
29
+ import { KNOWN_AGENTS, DEFAULT_AGENT } from "./daemon-agent.mjs";
30
+ import { agentNotFoundWarningLine } from "./daemon-banner.mjs";
31
+ import { resolveClaudePath } from "./claude-spawner.mjs";
32
+ import { resolveCodexPath } from "./codex-spawner.mjs";
33
+ import { resolveKiroPath } from "./kiro-spawner.mjs";
29
34
  import { readFileSync } from "node:fs";
30
35
 
31
36
  /** A non-empty trimmed string, or undefined. */
@@ -211,3 +216,127 @@ export async function resolveInstallCwds(flags = {}, opts = {}) {
211
216
  if (finalCwds.length > 0) writeConfig({ cwds: finalCwds });
212
217
  return { cwds: finalCwds };
213
218
  }
219
+
220
+ /**
221
+ * The interactive agent-backend menu. Order mirrors KNOWN_AGENTS with claude-code
222
+ * first (it is the default). Kept beside the resolver so the numbered prompt and
223
+ * the accepted values never drift.
224
+ */
225
+ const AGENT_MENU = [
226
+ { value: "claude-code", label: "Claude Code (default)" },
227
+ { value: "codex", label: "Codex CLI" },
228
+ { value: "kiro", label: "Kiro CLI" },
229
+ ];
230
+
231
+ /** Probe the selected backend's CLI on PATH. Returns the resolved path or null.
232
+ * Injectable per backend so the check is testable without a real PATH. */
233
+ function probeAgentCli(agent, probes = {}) {
234
+ const findClaude = probes.resolveClaudePath ?? resolveClaudePath;
235
+ const findCodex = probes.resolveCodexPath ?? resolveCodexPath;
236
+ const findKiro = probes.resolveKiroPath ?? resolveKiroPath;
237
+ if (agent === "codex") return findCodex();
238
+ if (agent === "kiro") return findKiro();
239
+ return findClaude();
240
+ }
241
+
242
+ /**
243
+ * Determine which local agent backend the installed daemon wakes and persist it
244
+ * to ~/.chorus/daemon.json `agent` (the single source of truth — the unit carries
245
+ * no --agent, exactly like `cwds`). AFTER resolving, probe the selected backend's
246
+ * CLI on PATH and warn (non-fatal) when it is missing, so the operator learns at
247
+ * install time rather than when the first wake fails.
248
+ *
249
+ * Resolution (first defined source wins):
250
+ * 1. --agent flag — the operator's explicit choice.
251
+ * 2. CHORUS_AGENT env — matches the daemon's own resolution precedence.
252
+ * 3. existing daemon.json `agent` — a prior valid choice is kept (re-install is
253
+ * idempotent and does not re-prompt); an invalid stored value is ignored.
254
+ * 4. TTY + !skip — interactive numbered menu (Enter = claude-code default).
255
+ * 5. non-TTY / skip — DEFAULT_AGENT (claude-code), persisted so the config
256
+ * is explicit about the backend the boot service runs.
257
+ *
258
+ * Never fails: --agent / CHORUS_AGENT are already validated upstream by
259
+ * resolveAgentType (runDaemon rejects an unknown value before dispatch), the menu
260
+ * is constrained to KNOWN_AGENTS, and default/stored-invalid fall back to
261
+ * claude-code. Returns the resolved `{ agent, cliPath, cliFound }`. Never throws.
262
+ *
263
+ * @param {{ agent?: string }} flags
264
+ * @param {Record<string, string|undefined>} [env]
265
+ * @param {{
266
+ * isTTY?: boolean, skip?: boolean,
267
+ * readJson?: (path: string) => (Record<string, unknown>|null),
268
+ * loginPath?: string,
269
+ * writeConfig?: (partial: Record<string, unknown>) => string,
270
+ * prompt?: typeof defaultPrompt,
271
+ * probes?: { resolveClaudePath?: Function, resolveCodexPath?: Function, resolveKiroPath?: Function },
272
+ * log?: (m: string) => void,
273
+ * errLog?: (m: string) => void,
274
+ * }} [opts]
275
+ * @returns {Promise<{ agent: string, cliPath: string|null, cliFound: boolean }>}
276
+ */
277
+ export async function resolveInstallAgent(flags = {}, env = {}, opts = {}) {
278
+ const isTTY = opts.isTTY ?? false;
279
+ const skip = opts.skip ?? false;
280
+ const readJson = opts.readJson ?? readJsonSafe;
281
+ const loginPath = opts.loginPath ?? loginFilePath();
282
+ const writeConfig = opts.writeConfig ?? updateDaemonConfig;
283
+ const ask = opts.prompt ?? defaultPrompt;
284
+ const log = opts.log ?? (() => {});
285
+ const errLog = opts.errLog ?? (() => {});
286
+
287
+ // Only a KNOWN backend is ever accepted; anything else is treated as absent.
288
+ const known = (v) => (v && KNOWN_AGENTS.includes(v) ? v : undefined);
289
+
290
+ let agent;
291
+ let persist = true; // write unless we reuse an already-stored value (no-op)
292
+
293
+ // 1/2. Explicit --agent flag or CHORUS_AGENT env (both pre-validated upstream).
294
+ agent = known(nonEmpty(flags.agent)) ?? known(nonEmpty(env.CHORUS_AGENT));
295
+
296
+ // 3. Existing daemon.json `agent` — a prior valid choice is authoritative; keep
297
+ // it and do not re-prompt (re-install stays idempotent). Skip the re-write.
298
+ if (!agent) {
299
+ const file = readJson(loginPath);
300
+ const stored = known(file ? nonEmpty(file.agent) : undefined);
301
+ if (stored) {
302
+ agent = stored;
303
+ persist = false; // already on disk — no-op write avoided
304
+ }
305
+ }
306
+
307
+ // 4. Interactive numbered menu on a TTY (Enter accepts the claude-code default).
308
+ if (!agent && isTTY && !skip) {
309
+ log("[Chorus] Which local agent backend should this daemon wake?");
310
+ for (let i = 0; i < AGENT_MENU.length; i += 1) {
311
+ log(`[Chorus] ${i + 1}) ${AGENT_MENU[i].label}`);
312
+ }
313
+ const answer = nonEmpty(await ask(`Select [1-${AGENT_MENU.length}] (Enter for 1): `));
314
+ if (!answer) {
315
+ agent = DEFAULT_AGENT;
316
+ } else {
317
+ const n = Number(answer);
318
+ const byNumber = Number.isInteger(n) && n >= 1 && n <= AGENT_MENU.length ? AGENT_MENU[n - 1].value : undefined;
319
+ // Also accept the value typed by name (e.g. "codex") for muscle memory.
320
+ agent = byNumber ?? known(answer) ?? DEFAULT_AGENT;
321
+ }
322
+ }
323
+
324
+ // 5. Non-TTY / skip with nothing configured → the default, persisted so the boot
325
+ // service config is explicit about the backend it runs.
326
+ if (!agent) agent = DEFAULT_AGENT;
327
+
328
+ if (persist) writeConfig({ agent });
329
+
330
+ // Probe the selected backend's CLI (non-fatal). A missing binary warns loudly so
331
+ // the operator fixes PATH before the first wake, but never blocks the install.
332
+ const cliPath = probeAgentCli(agent, opts.probes);
333
+ const cliFound = cliPath !== null;
334
+ if (cliFound) {
335
+ log(`[Chorus] agent backend: ${agent} (found CLI at ${cliPath}).`);
336
+ } else {
337
+ log(`[Chorus] agent backend: ${agent}.`);
338
+ errLog(`[Chorus] ${agentNotFoundWarningLine(agent)}`);
339
+ }
340
+
341
+ return { agent, cliPath, cliFound };
342
+ }