@chorus-aidlc/chorus 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (659) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +463 -346
  3. package/.next/standalone/.next/app-path-routes-manifest.json +50 -36
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +27 -27
  6. package/.next/standalone/.next/routes-manifest.json +25 -0
  7. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +2 -2
  8. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
  10. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +2 -2
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -3
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +2 -2
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +2 -2
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  40. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +3 -3
  41. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
  42. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  43. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -8
  44. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  45. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  46. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  47. package/.next/standalone/.next/server/app/_not-found.html +1 -1
  48. package/.next/standalone/.next/server/app/_not-found.rsc +5 -5
  49. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  50. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  51. package/.next/standalone/.next/server/app/admin/companies/new.html +1 -1
  52. package/.next/standalone/.next/server/app/admin/companies/new.rsc +5 -5
  53. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  54. package/.next/standalone/.next/server/app/admin/companies.html +1 -1
  55. package/.next/standalone/.next/server/app/admin/companies.rsc +5 -5
  56. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  57. package/.next/standalone/.next/server/app/admin.html +1 -1
  58. package/.next/standalone/.next/server/app/admin.rsc +5 -5
  59. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route.js +1 -1
  60. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  61. package/.next/standalone/.next/server/app/api/admin/companies/route.js +1 -1
  62. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/admin/login/route.js +1 -1
  64. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/api/admin/session/route.js +1 -1
  66. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/agent-connections/route.js +1 -0
  68. package/.next/standalone/.next/server/app/api/agent-connections/route.js.nft.json +1 -0
  69. package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -0
  70. package/.next/standalone/.next/server/app/api/agents/[uuid]/route.js +1 -1
  71. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
  73. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +1 -1
  74. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/agents/route.js +1 -1
  76. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route.js +1 -1
  78. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/api-keys/route.js +1 -1
  80. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  81. package/.next/standalone/.next/server/app/api/auth/callback/route.js +1 -1
  82. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  83. package/.next/standalone/.next/server/app/api/auth/check-default/route.js +1 -1
  84. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/auth/company-oidc/route.js +1 -1
  86. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/auth/default-login/route.js +1 -1
  88. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/auth/identify/route.js +1 -1
  90. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  91. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/auth/me/route.js +1 -1
  93. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/auth/refresh/route.js +1 -1
  95. package/.next/standalone/.next/server/app/api/auth/refresh/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/auth/session/route.js +1 -1
  97. package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/auth/sync-token/route.js +1 -1
  99. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  100. package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
  101. package/.next/standalone/.next/server/app/api/comments/route.js.nft.json +1 -1
  102. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/daemon/control/route.js +1 -0
  104. package/.next/standalone/.next/server/app/api/daemon/control/route.js.nft.json +1 -0
  105. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -0
  106. package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js +1 -0
  107. package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +1 -0
  108. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -0
  109. package/.next/standalone/.next/server/app/api/daemon/executions/route.js +1 -0
  110. package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -0
  111. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -0
  112. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -0
  113. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -0
  114. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -0
  115. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js +1 -0
  116. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +1 -0
  117. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -0
  118. package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -0
  119. package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +1 -0
  120. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -0
  121. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -0
  122. package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -0
  123. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -0
  124. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -0
  125. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -0
  126. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -0
  127. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -0
  128. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -0
  129. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -0
  130. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -0
  131. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +1 -0
  132. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -0
  133. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -0
  134. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -0
  135. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -0
  136. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -0
  137. package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -0
  138. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -0
  139. package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js +1 -1
  140. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js +1 -0
  142. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -0
  143. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -0
  144. package/.next/standalone/.next/server/app/api/events/notifications/route.js +6 -2
  145. package/.next/standalone/.next/server/app/api/events/notifications/route.js.nft.json +1 -1
  146. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/events/route.js +7 -3
  148. package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
  149. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/health/route.js +1 -1
  151. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
  153. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +1 -1
  154. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
  156. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +1 -1
  157. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
  159. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +1 -1
  160. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js +1 -1
  162. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -1
  163. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
  165. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +1 -1
  166. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
  168. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +1 -1
  169. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/api/mcp/route.js +5 -41
  171. package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
  172. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
  174. package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
  175. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  176. package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
  177. package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +1 -1
  178. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  179. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js +1 -1
  180. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +1 -1
  181. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  182. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js +1 -1
  183. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +1 -1
  184. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  185. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js +1 -1
  186. package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +1 -1
  187. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  188. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js +1 -1
  189. package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +1 -1
  190. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  191. package/.next/standalone/.next/server/app/api/notifications/route.js +1 -1
  192. package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
  193. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  194. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js +1 -1
  195. package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +1 -1
  196. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  197. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js +1 -1
  198. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  199. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js +1 -1
  200. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  201. package/.next/standalone/.next/server/app/api/project-groups/route.js +1 -1
  202. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  203. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route.js +1 -1
  204. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  205. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
  206. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
  207. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  208. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js +1 -1
  209. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  210. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js +1 -1
  211. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  212. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
  213. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
  214. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  215. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
  216. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
  217. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  218. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
  219. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  220. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
  221. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  222. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
  223. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  224. package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js +1 -1
  225. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  226. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js +1 -1
  227. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  228. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
  229. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
  230. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  231. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
  232. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
  233. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  234. package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
  235. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  236. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
  237. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  238. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
  239. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  240. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
  241. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  242. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
  243. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  244. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
  245. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  246. package/.next/standalone/.next/server/app/api/search/route.js +1 -1
  247. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  248. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
  249. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +1 -1
  250. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  251. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
  252. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +1 -1
  253. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  254. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
  255. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +1 -1
  256. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  257. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
  258. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +1 -1
  259. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  260. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
  261. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +1 -1
  262. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  263. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
  264. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +1 -1
  265. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  266. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
  267. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +1 -1
  268. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  269. package/.next/standalone/.next/server/app/index.html +1 -1
  270. package/.next/standalone/.next/server/app/index.rsc +5 -5
  271. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  272. package/.next/standalone/.next/server/app/login/admin.html +1 -1
  273. package/.next/standalone/.next/server/app/login/admin.rsc +5 -5
  274. package/.next/standalone/.next/server/app/login/callback/page.js +2 -2
  275. package/.next/standalone/.next/server/app/login/callback/page.js.nft.json +1 -1
  276. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  277. package/.next/standalone/.next/server/app/login/callback.html +1 -1
  278. package/.next/standalone/.next/server/app/login/callback.rsc +5 -5
  279. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  280. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  281. package/.next/standalone/.next/server/app/login/pick-workspace.html +1 -1
  282. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +5 -5
  283. package/.next/standalone/.next/server/app/login/silent-refresh/page_client-reference-manifest.js +1 -1
  284. package/.next/standalone/.next/server/app/login/silent-refresh.html +1 -1
  285. package/.next/standalone/.next/server/app/login/silent-refresh.rsc +5 -5
  286. package/.next/standalone/.next/server/app/login.html +1 -1
  287. package/.next/standalone/.next/server/app/login.rsc +5 -5
  288. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  289. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  290. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  291. package/.next/standalone/.next/server/app/onboarding.html +1 -1
  292. package/.next/standalone/.next/server/app/onboarding.rsc +6 -6
  293. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  294. package/.next/standalone/.next/server/app/projects.html +1 -1
  295. package/.next/standalone/.next/server/app/projects.rsc +7 -7
  296. package/.next/standalone/.next/server/app/settings.html +1 -1
  297. package/.next/standalone/.next/server/app/settings.rsc +7 -7
  298. package/.next/standalone/.next/server/app-paths-manifest.json +50 -36
  299. package/.next/standalone/.next/server/chunks/1064.js +1 -0
  300. package/.next/standalone/.next/server/chunks/1596.js +13 -0
  301. package/.next/standalone/.next/server/chunks/2213.js +1 -0
  302. package/.next/standalone/.next/server/chunks/2618.js +1 -1
  303. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  304. package/.next/standalone/.next/server/chunks/3219.js +2 -0
  305. package/.next/standalone/.next/server/chunks/3371.js +1 -0
  306. package/.next/standalone/.next/server/chunks/3419.js +1 -0
  307. package/.next/standalone/.next/server/chunks/369.js +1 -0
  308. package/.next/standalone/.next/server/chunks/4638.js +1 -0
  309. package/.next/standalone/.next/server/chunks/4711.js +530 -0
  310. package/.next/standalone/.next/server/chunks/5039.js +1 -0
  311. package/.next/standalone/.next/server/chunks/5300.js +1 -1
  312. package/.next/standalone/.next/server/chunks/5631.js +1 -0
  313. package/.next/standalone/.next/server/chunks/6044.js +1 -1
  314. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  315. package/.next/standalone/.next/server/chunks/6207.js +1 -1
  316. package/.next/standalone/.next/server/chunks/6461.js +1 -0
  317. package/.next/standalone/.next/server/chunks/6712.js +1 -0
  318. package/.next/standalone/.next/server/chunks/7002.js +1 -1
  319. package/.next/standalone/.next/server/chunks/7063.js +2 -2
  320. package/.next/standalone/.next/server/chunks/7258.js +37 -0
  321. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  322. package/.next/standalone/.next/server/chunks/7578.js +2 -2
  323. package/.next/standalone/.next/server/chunks/7867.js +1 -0
  324. package/.next/standalone/.next/server/chunks/7897.js +1 -0
  325. package/.next/standalone/.next/server/chunks/8012.js +1 -0
  326. package/.next/standalone/.next/server/chunks/8245.js +31 -0
  327. package/.next/standalone/.next/server/chunks/8322.js +1 -1
  328. package/.next/standalone/.next/server/chunks/9015.js +1 -1
  329. package/.next/standalone/.next/server/chunks/920.js +1 -1
  330. package/.next/standalone/.next/server/chunks/937.js +16 -2
  331. package/.next/standalone/.next/server/chunks/9629.js +1 -0
  332. package/.next/standalone/.next/server/chunks/9725.js +1 -0
  333. package/.next/standalone/.next/server/instrumentation.js +1 -1
  334. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  335. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  336. package/.next/standalone/.next/server/next-font-manifest.js +1 -1
  337. package/.next/standalone/.next/server/next-font-manifest.json +1 -1
  338. package/.next/standalone/.next/server/pages/404.html +1 -1
  339. package/.next/standalone/.next/server/pages/500.html +1 -1
  340. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  341. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  342. package/.next/standalone/.next/server/src/middleware.js +1 -1
  343. package/.next/standalone/.next/static/519aK55QLHaVN7b1TVDkB/_buildManifest.js +1 -0
  344. package/.next/standalone/.next/static/chunks/1217-323cc20b73ebfde9.js +1 -0
  345. package/.next/standalone/.next/static/chunks/{11207-8f4b154804f5a66f.js → 15183-5734d279b26e9414.js} +2 -2
  346. package/.next/standalone/.next/static/chunks/1879-7a8b283283218df2.js +1 -0
  347. package/.next/standalone/.next/static/chunks/19276-50b367d7b93d5f34.js +1 -0
  348. package/.next/standalone/.next/static/chunks/23466-e1176a6d814f4897.js +1 -0
  349. package/.next/standalone/.next/static/chunks/38040-a8687f86dd8e9d67.js +1 -0
  350. package/.next/standalone/.next/static/chunks/{4860.e071c0b9e32bd75f.js → 4860.43f5ad8a3aaed0e8.js} +1 -1
  351. package/.next/standalone/.next/static/chunks/58245-b2ea112ace9624d2.js +1 -0
  352. package/.next/standalone/.next/static/chunks/59296-783831c43aa0162e.js +1 -0
  353. package/.next/standalone/.next/static/chunks/60648-36ccbee4ce232d52.js +1 -0
  354. package/.next/standalone/.next/static/chunks/60694-68232120903209df.js +1 -0
  355. package/.next/standalone/.next/static/chunks/64648-81f03be6f9793ab9.js +1 -0
  356. package/.next/standalone/.next/static/chunks/{94655-1c75e0590a66215e.js → 66969-12f0b22c51f5a410.js} +1 -1
  357. package/.next/standalone/.next/static/chunks/70536-b8bf71098ae11f07.js +1 -0
  358. package/.next/standalone/.next/static/chunks/71350-88c2649fc693c1e8.js +1 -0
  359. package/.next/standalone/.next/static/chunks/78389-b32edc6bd5c570a9.js +1 -0
  360. package/.next/standalone/.next/static/chunks/78584-eb2fa8cf2f266329.js +1 -0
  361. package/.next/standalone/.next/static/chunks/78917-150ed14a99844aab.js +1 -0
  362. package/.next/standalone/.next/static/chunks/8574-b9739eb8d054c793.js +1 -0
  363. package/.next/standalone/.next/static/chunks/{99373.4c336ea9ad07311e.js → 99373.0768feb3a08c7da3.js} +1 -1
  364. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-0a28456fea4ce95a.js +1 -0
  365. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-a79969c5c9aadacd.js +1 -0
  366. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-4bc556c2fc8f3d24.js +1 -0
  367. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-e00752a72c31663f.js +1 -0
  368. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-ef82b871895245ea.js +1 -0
  369. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-2c9bcbd11ddb8661.js +1 -0
  370. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-630b168598513ce8.js +1 -0
  371. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-99639479cc98965f.js +1 -0
  372. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-335f2450e44a0fba.js +1 -0
  373. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-4a191d69b2b6e880.js +1 -0
  374. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-0faebb478be4c85d.js +1 -0
  375. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-f198303c176c6e02.js → page-583e58d4d689d38b.js} +1 -1
  376. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-2e8fcb72687100df.js +1 -0
  377. package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
  378. package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-4bc556c2fc8f3d24.js +1 -0
  379. package/.next/standalone/.next/static/chunks/app/api/admin/login/route-4bc556c2fc8f3d24.js +1 -0
  380. package/.next/standalone/.next/static/chunks/app/api/admin/session/route-4bc556c2fc8f3d24.js +1 -0
  381. package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-4bc556c2fc8f3d24.js +1 -0
  382. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
  383. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-4bc556c2fc8f3d24.js +1 -0
  384. package/.next/standalone/.next/static/chunks/app/api/agents/route-4bc556c2fc8f3d24.js +1 -0
  385. package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
  386. package/.next/standalone/.next/static/chunks/app/api/api-keys/route-4bc556c2fc8f3d24.js +1 -0
  387. package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-4bc556c2fc8f3d24.js +1 -0
  388. package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-4bc556c2fc8f3d24.js +1 -0
  389. package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-4bc556c2fc8f3d24.js +1 -0
  390. package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-4bc556c2fc8f3d24.js +1 -0
  391. package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-4bc556c2fc8f3d24.js +1 -0
  392. package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-4bc556c2fc8f3d24.js +1 -0
  393. package/.next/standalone/.next/static/chunks/app/api/auth/me/route-4bc556c2fc8f3d24.js +1 -0
  394. package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-4bc556c2fc8f3d24.js +1 -0
  395. package/.next/standalone/.next/static/chunks/app/api/auth/session/route-4bc556c2fc8f3d24.js +1 -0
  396. package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-4bc556c2fc8f3d24.js +1 -0
  397. package/.next/standalone/.next/static/chunks/app/api/comments/route-4bc556c2fc8f3d24.js +1 -0
  398. package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-4bc556c2fc8f3d24.js +1 -0
  399. package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-4bc556c2fc8f3d24.js +1 -0
  400. package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-4bc556c2fc8f3d24.js +1 -0
  401. package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-4bc556c2fc8f3d24.js +1 -0
  402. package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-4bc556c2fc8f3d24.js +1 -0
  403. package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-4bc556c2fc8f3d24.js +1 -0
  404. package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-4bc556c2fc8f3d24.js +1 -0
  405. package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-4bc556c2fc8f3d24.js +1 -0
  406. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-4bc556c2fc8f3d24.js +1 -0
  407. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-4bc556c2fc8f3d24.js +1 -0
  408. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-4bc556c2fc8f3d24.js +1 -0
  409. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-4bc556c2fc8f3d24.js +1 -0
  410. package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
  411. package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-4bc556c2fc8f3d24.js +1 -0
  412. package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-4bc556c2fc8f3d24.js +1 -0
  413. package/.next/standalone/.next/static/chunks/app/api/events/route-4bc556c2fc8f3d24.js +1 -0
  414. package/.next/standalone/.next/static/chunks/app/api/health/route-4bc556c2fc8f3d24.js +1 -0
  415. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-4bc556c2fc8f3d24.js +1 -0
  416. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-4bc556c2fc8f3d24.js +1 -0
  417. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-4bc556c2fc8f3d24.js +1 -0
  418. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-4bc556c2fc8f3d24.js +1 -0
  419. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-4bc556c2fc8f3d24.js +1 -0
  420. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
  421. package/.next/standalone/.next/static/chunks/app/api/mcp/route-4bc556c2fc8f3d24.js +1 -0
  422. package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-4bc556c2fc8f3d24.js +1 -0
  423. package/.next/standalone/.next/static/chunks/app/api/mentionables/route-4bc556c2fc8f3d24.js +1 -0
  424. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-4bc556c2fc8f3d24.js +1 -0
  425. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-4bc556c2fc8f3d24.js +1 -0
  426. package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-4bc556c2fc8f3d24.js +1 -0
  427. package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-4bc556c2fc8f3d24.js +1 -0
  428. package/.next/standalone/.next/static/chunks/app/api/notifications/route-4bc556c2fc8f3d24.js +1 -0
  429. package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-4bc556c2fc8f3d24.js +1 -0
  430. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-4bc556c2fc8f3d24.js +1 -0
  431. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
  432. package/.next/standalone/.next/static/chunks/app/api/project-groups/route-4bc556c2fc8f3d24.js +1 -0
  433. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-4bc556c2fc8f3d24.js +1 -0
  434. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-4bc556c2fc8f3d24.js +1 -0
  435. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-4bc556c2fc8f3d24.js +1 -0
  436. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-4bc556c2fc8f3d24.js +1 -0
  437. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-4bc556c2fc8f3d24.js +1 -0
  438. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-4bc556c2fc8f3d24.js +1 -0
  439. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-4bc556c2fc8f3d24.js +1 -0
  440. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-4bc556c2fc8f3d24.js +1 -0
  441. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-4bc556c2fc8f3d24.js +1 -0
  442. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
  443. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-4bc556c2fc8f3d24.js +1 -0
  444. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-4bc556c2fc8f3d24.js +1 -0
  445. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-4bc556c2fc8f3d24.js +1 -0
  446. package/.next/standalone/.next/static/chunks/app/api/projects/route-4bc556c2fc8f3d24.js +1 -0
  447. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-4bc556c2fc8f3d24.js +1 -0
  448. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-4bc556c2fc8f3d24.js +1 -0
  449. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-4bc556c2fc8f3d24.js +1 -0
  450. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-4bc556c2fc8f3d24.js +1 -0
  451. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
  452. package/.next/standalone/.next/static/chunks/app/api/search/route-4bc556c2fc8f3d24.js +1 -0
  453. package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
  454. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-4bc556c2fc8f3d24.js +1 -0
  455. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-4bc556c2fc8f3d24.js +1 -0
  456. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-4bc556c2fc8f3d24.js +1 -0
  457. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-4bc556c2fc8f3d24.js +1 -0
  458. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
  459. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-4bc556c2fc8f3d24.js +1 -0
  460. package/.next/standalone/.next/static/chunks/app/layout-9963339572e2e64e.js +1 -0
  461. package/.next/standalone/.next/static/chunks/app/onboarding/page-e9a69a0c537c704f.js +1 -0
  462. package/.next/standalone/.next/static/chunks/{webpack-5bb5740df10ed622.js → webpack-87284a4533d77eaf.js} +1 -1
  463. package/.next/standalone/.next/static/css/{84edd78de243cde6.css → b496025c9cd768cc.css} +1 -1
  464. package/.next/standalone/.next/static/css/e78b3c856420a09f.css +1 -0
  465. package/.next/standalone/.next/static/media/013b72fa676f92e0-s.woff2 +0 -0
  466. package/.next/standalone/.next/static/media/2b5b02fc7e511755-s.woff2 +0 -0
  467. package/.next/standalone/.next/static/media/65f03d54ccadf4a8-s.woff2 +0 -0
  468. package/.next/standalone/.next/static/media/7d4881bb7e1bf84d-s.p.woff2 +0 -0
  469. package/.next/standalone/.next/static/media/b9408752a0c24fb9-s.woff2 +0 -0
  470. package/.next/standalone/.next/static/media/e038a29029a234f2-s.woff2 +0 -0
  471. package/.next/standalone/package.json +3 -1
  472. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  473. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  474. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +1 -1
  475. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
  476. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +2 -1
  477. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
  478. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
  479. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  480. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  481. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
  482. package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
  483. package/.next/standalone/public/skill/chorus/SKILL.md +1 -1
  484. package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
  485. package/.next/standalone/public/skill/idea-chorus/SKILL.md +2 -1
  486. package/.next/standalone/public/skill/package.json +1 -1
  487. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
  488. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
  489. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
  490. package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
  491. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
  492. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
  493. package/README.md +27 -0
  494. package/README.zh.md +27 -0
  495. package/chorus.mjs +120 -16
  496. package/cli/backfill.mjs +190 -0
  497. package/cli/chorus-client.mjs +154 -0
  498. package/cli/claude-spawner.mjs +415 -0
  499. package/cli/client-args.mjs +146 -0
  500. package/cli/control-handler.mjs +180 -0
  501. package/cli/credentials.mjs +155 -0
  502. package/cli/daemon-agent.mjs +38 -0
  503. package/cli/daemon-banner.mjs +80 -0
  504. package/cli/daemon-config.mjs +84 -0
  505. package/cli/daemon-lifecycle.mjs +191 -0
  506. package/cli/daemon-permission-mode.mjs +68 -0
  507. package/cli/daemon-rest-client.mjs +272 -0
  508. package/cli/daemon.mjs +572 -0
  509. package/cli/event-router.mjs +248 -0
  510. package/cli/interrupt-reporter.mjs +87 -0
  511. package/cli/lineage.mjs +155 -0
  512. package/cli/login.mjs +151 -0
  513. package/cli/mcp-config.mjs +58 -0
  514. package/cli/process-killer.mjs +205 -0
  515. package/cli/prompts.mjs +273 -0
  516. package/cli/sse-listener.mjs +258 -0
  517. package/cli/turn-reporter.mjs +75 -0
  518. package/cli/upload-hooks.mjs +400 -0
  519. package/cli/wake-queue.mjs +121 -0
  520. package/cli/waker.mjs +475 -0
  521. package/package.json +3 -1
  522. package/prisma/migrations/20260615082309_add_daemon_connection/migration.sql +37 -0
  523. package/prisma/migrations/20260616152622_add_daemon_task_execution/migration.sql +28 -0
  524. package/prisma/migrations/20260617013334_generalize_daemon_execution_to_any_resource/migration.sql +38 -0
  525. package/prisma/migrations/20260618022828_add_daemon_execution_interrupted/migration.sql +2 -0
  526. package/prisma/migrations/20260619055322_daemon_session_conversation/migration.sql +77 -0
  527. package/prisma/schema.prisma +366 -188
  528. package/.next/standalone/.next/server/chunks/1059.js +0 -1
  529. package/.next/standalone/.next/server/chunks/1165.js +0 -1
  530. package/.next/standalone/.next/server/chunks/1615.js +0 -31
  531. package/.next/standalone/.next/server/chunks/162.js +0 -16
  532. package/.next/standalone/.next/server/chunks/179.js +0 -158
  533. package/.next/standalone/.next/server/chunks/1871.js +0 -1
  534. package/.next/standalone/.next/server/chunks/2909.js +0 -98
  535. package/.next/standalone/.next/server/chunks/324.js +0 -1
  536. package/.next/standalone/.next/server/chunks/3555.js +0 -1
  537. package/.next/standalone/.next/server/chunks/4090.js +0 -13
  538. package/.next/standalone/.next/server/chunks/4343.js +0 -1
  539. package/.next/standalone/.next/server/chunks/4879.js +0 -1
  540. package/.next/standalone/.next/server/chunks/4913.js +0 -1
  541. package/.next/standalone/.next/server/chunks/5541.js +0 -1
  542. package/.next/standalone/.next/server/chunks/5561.js +0 -7
  543. package/.next/standalone/.next/server/chunks/6643.js +0 -1
  544. package/.next/standalone/.next/server/chunks/6767.js +0 -1
  545. package/.next/standalone/.next/server/chunks/7228.js +0 -2
  546. package/.next/standalone/.next/server/chunks/7462.js +0 -255
  547. package/.next/standalone/.next/server/chunks/7859.js +0 -1
  548. package/.next/standalone/.next/server/chunks/8277.js +0 -1
  549. package/.next/standalone/.next/server/chunks/8637.js +0 -1
  550. package/.next/standalone/.next/server/chunks/896.js +0 -1
  551. package/.next/standalone/.next/server/chunks/9269.js +0 -1
  552. package/.next/standalone/.next/server/chunks/9615.js +0 -1
  553. package/.next/standalone/.next/static/AKJHlhCKd44_-khht8nN0/_buildManifest.js +0 -1
  554. package/.next/standalone/.next/static/chunks/20051-c242544dafd3a690.js +0 -1
  555. package/.next/standalone/.next/static/chunks/21932-bce5ba937d1603e1.js +0 -1
  556. package/.next/standalone/.next/static/chunks/23095-5bf481236249fdd8.js +0 -1
  557. package/.next/standalone/.next/static/chunks/23466-842c126491b753bc.js +0 -1
  558. package/.next/standalone/.next/static/chunks/45436-c5427023f3f386a1.js +0 -1
  559. package/.next/standalone/.next/static/chunks/49852-5337f139a2f87c46.js +0 -1
  560. package/.next/standalone/.next/static/chunks/52206-7c1b0c695c8035eb.js +0 -1
  561. package/.next/standalone/.next/static/chunks/55469-ed5ff019ff71ef59.js +0 -1
  562. package/.next/standalone/.next/static/chunks/59296-50e66102d44d9677.js +0 -1
  563. package/.next/standalone/.next/static/chunks/60524-9811b38c62fed16e.js +0 -1
  564. package/.next/standalone/.next/static/chunks/68855-5c15991e7cf8dc8a.js +0 -1
  565. package/.next/standalone/.next/static/chunks/70093-0ff6fd59445b5cb9.js +0 -1
  566. package/.next/standalone/.next/static/chunks/74030-3a6a6b75e47f5b96.js +0 -1
  567. package/.next/standalone/.next/static/chunks/78917-ff0fda86a96cfa60.js +0 -1
  568. package/.next/standalone/.next/static/chunks/95627-8d9f6d2d88f7a641.js +0 -1
  569. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-5915ccd1a77ebcf8.js +0 -1
  570. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-94d102d945410b55.js +0 -1
  571. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-cd9411c54c8f5b35.js +0 -1
  572. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-56c45b910f914895.js +0 -1
  573. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-2e000a7010d1e9ea.js +0 -1
  574. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-75e42d130404ca2b.js +0 -1
  575. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-d7747749ae6192d8.js +0 -1
  576. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-26488809d26e1daa.js +0 -1
  577. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-8f91ed174c14d5f0.js +0 -1
  578. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-fcc9baa42e6de4d4.js +0 -1
  579. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-5233748464280e9d.js +0 -1
  580. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-ab87cbb18d0ee538.js +0 -1
  581. package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-cd9411c54c8f5b35.js +0 -1
  582. package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-cd9411c54c8f5b35.js +0 -1
  583. package/.next/standalone/.next/static/chunks/app/api/admin/login/route-cd9411c54c8f5b35.js +0 -1
  584. package/.next/standalone/.next/static/chunks/app/api/admin/session/route-cd9411c54c8f5b35.js +0 -1
  585. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-cd9411c54c8f5b35.js +0 -1
  586. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-cd9411c54c8f5b35.js +0 -1
  587. package/.next/standalone/.next/static/chunks/app/api/agents/route-cd9411c54c8f5b35.js +0 -1
  588. package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-cd9411c54c8f5b35.js +0 -1
  589. package/.next/standalone/.next/static/chunks/app/api/api-keys/route-cd9411c54c8f5b35.js +0 -1
  590. package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-cd9411c54c8f5b35.js +0 -1
  591. package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-cd9411c54c8f5b35.js +0 -1
  592. package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-cd9411c54c8f5b35.js +0 -1
  593. package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-cd9411c54c8f5b35.js +0 -1
  594. package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-cd9411c54c8f5b35.js +0 -1
  595. package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-cd9411c54c8f5b35.js +0 -1
  596. package/.next/standalone/.next/static/chunks/app/api/auth/me/route-cd9411c54c8f5b35.js +0 -1
  597. package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-cd9411c54c8f5b35.js +0 -1
  598. package/.next/standalone/.next/static/chunks/app/api/auth/session/route-cd9411c54c8f5b35.js +0 -1
  599. package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-cd9411c54c8f5b35.js +0 -1
  600. package/.next/standalone/.next/static/chunks/app/api/comments/route-cd9411c54c8f5b35.js +0 -1
  601. package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-cd9411c54c8f5b35.js +0 -1
  602. package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-cd9411c54c8f5b35.js +0 -1
  603. package/.next/standalone/.next/static/chunks/app/api/events/route-cd9411c54c8f5b35.js +0 -1
  604. package/.next/standalone/.next/static/chunks/app/api/health/route-cd9411c54c8f5b35.js +0 -1
  605. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-cd9411c54c8f5b35.js +0 -1
  606. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-cd9411c54c8f5b35.js +0 -1
  607. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-cd9411c54c8f5b35.js +0 -1
  608. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-cd9411c54c8f5b35.js +0 -1
  609. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-cd9411c54c8f5b35.js +0 -1
  610. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-cd9411c54c8f5b35.js +0 -1
  611. package/.next/standalone/.next/static/chunks/app/api/mcp/route-cd9411c54c8f5b35.js +0 -1
  612. package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-cd9411c54c8f5b35.js +0 -1
  613. package/.next/standalone/.next/static/chunks/app/api/mentionables/route-cd9411c54c8f5b35.js +0 -1
  614. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-cd9411c54c8f5b35.js +0 -1
  615. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-cd9411c54c8f5b35.js +0 -1
  616. package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-cd9411c54c8f5b35.js +0 -1
  617. package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-cd9411c54c8f5b35.js +0 -1
  618. package/.next/standalone/.next/static/chunks/app/api/notifications/route-cd9411c54c8f5b35.js +0 -1
  619. package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-cd9411c54c8f5b35.js +0 -1
  620. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-cd9411c54c8f5b35.js +0 -1
  621. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-cd9411c54c8f5b35.js +0 -1
  622. package/.next/standalone/.next/static/chunks/app/api/project-groups/route-cd9411c54c8f5b35.js +0 -1
  623. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-cd9411c54c8f5b35.js +0 -1
  624. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-cd9411c54c8f5b35.js +0 -1
  625. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-cd9411c54c8f5b35.js +0 -1
  626. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-cd9411c54c8f5b35.js +0 -1
  627. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-cd9411c54c8f5b35.js +0 -1
  628. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-cd9411c54c8f5b35.js +0 -1
  629. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-cd9411c54c8f5b35.js +0 -1
  630. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-cd9411c54c8f5b35.js +0 -1
  631. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-cd9411c54c8f5b35.js +0 -1
  632. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-cd9411c54c8f5b35.js +0 -1
  633. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-cd9411c54c8f5b35.js +0 -1
  634. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-cd9411c54c8f5b35.js +0 -1
  635. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-cd9411c54c8f5b35.js +0 -1
  636. package/.next/standalone/.next/static/chunks/app/api/projects/route-cd9411c54c8f5b35.js +0 -1
  637. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-cd9411c54c8f5b35.js +0 -1
  638. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-cd9411c54c8f5b35.js +0 -1
  639. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-cd9411c54c8f5b35.js +0 -1
  640. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-cd9411c54c8f5b35.js +0 -1
  641. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-cd9411c54c8f5b35.js +0 -1
  642. package/.next/standalone/.next/static/chunks/app/api/search/route-cd9411c54c8f5b35.js +0 -1
  643. package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-cd9411c54c8f5b35.js +0 -1
  644. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-cd9411c54c8f5b35.js +0 -1
  645. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-cd9411c54c8f5b35.js +0 -1
  646. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-cd9411c54c8f5b35.js +0 -1
  647. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-cd9411c54c8f5b35.js +0 -1
  648. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-cd9411c54c8f5b35.js +0 -1
  649. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-cd9411c54c8f5b35.js +0 -1
  650. package/.next/standalone/.next/static/chunks/app/layout-482dee7dace72c88.js +0 -1
  651. package/.next/standalone/.next/static/chunks/app/onboarding/page-d9dbd817391b462b.js +0 -1
  652. package/.next/standalone/.next/static/css/4279f38594ac772a.css +0 -1
  653. package/.next/standalone/.next/static/media/0f1bdadaf30e2d5f-s.woff2 +0 -0
  654. package/.next/standalone/.next/static/media/2c34d62a75506231-s.woff2 +0 -0
  655. package/.next/standalone/.next/static/media/601f5c280d60caca-s.woff2 +0 -0
  656. package/.next/standalone/.next/static/media/a115172161b307bb-s.woff2 +0 -0
  657. package/.next/standalone/.next/static/media/d100b2a099e34044-s.woff2 +0 -0
  658. package/.next/standalone/.next/static/media/f5271587012faf78-s.p.woff2 +0 -0
  659. /package/.next/standalone/.next/static/{AKJHlhCKd44_-khht8nN0 → 519aK55QLHaVN7b1TVDkB}/_ssgManifest.js +0 -0
@@ -0,0 +1,146 @@
1
+ // cli/client-args.mjs
2
+ // Argument parsing + help text for the `chorus` client subcommands (`daemon`,
3
+ // `login`). Extracted from chorus.mjs so it is pure and unit-testable — the
4
+ // entry-point module runs side effects (server launch, process.exit) at import
5
+ // time and cannot be imported into a test. chorus.mjs imports these helpers.
6
+ //
7
+ // Zero dependencies — ships verbatim in the npm package alongside chorus.mjs.
8
+
9
+ /**
10
+ * The daemon lifecycle sub-actions (background-mode control). `run` (the
11
+ * default long-lived daemon) is intentionally NOT in this set — it is the
12
+ * absence of a recognized sub-action token.
13
+ */
14
+ export const DAEMON_ACTIONS = new Set(["stop", "status", "restart", "logs"]);
15
+
16
+ /** Known agent backends. Only `claude-code` is implemented; the rest reserve
17
+ * the extension point (see daemon-agent-selection). Exported for the resolver
18
+ * the --agent task wires in; parsing here does not validate the value. */
19
+ export const KNOWN_AGENTS = new Set(["claude-code"]);
20
+
21
+ /**
22
+ * Parse the client-subcommand flags out of an arg list. Recognizes the
23
+ * pre-existing `--url` / `--api-key` / `--sigint-timeout` (space and `=` forms)
24
+ * and boolean `--yolo`, plus the new `--agent <type>` (space + `=`), boolean
25
+ * `--chorus-only`, `--verbose`, `-d`/`--detach`, and `--help`/`-h`.
26
+ *
27
+ * Only keys that appear are set, so callers can distinguish "unset" from
28
+ * "false" (important for layered env/flag precedence downstream).
29
+ *
30
+ * @param {string[]} argv
31
+ * @returns {{
32
+ * url?: string, apiKey?: string, yolo?: boolean, sigintTimeout?: string,
33
+ * agent?: string, chorusOnly?: boolean, verbose?: boolean, detach?: boolean,
34
+ * help?: boolean,
35
+ * }}
36
+ */
37
+ export function parseClientFlags(argv) {
38
+ const out = {};
39
+ for (let i = 0; i < argv.length; i++) {
40
+ const a = argv[i];
41
+ if (a === "--url") out.url = argv[i + 1];
42
+ else if (a.startsWith("--url=")) out.url = a.slice("--url=".length);
43
+ else if (a === "--api-key") out.apiKey = argv[i + 1];
44
+ else if (a.startsWith("--api-key=")) out.apiKey = a.slice("--api-key=".length);
45
+ else if (a === "--yolo") out.yolo = true;
46
+ else if (a === "--sigint-timeout") out.sigintTimeout = argv[i + 1];
47
+ else if (a.startsWith("--sigint-timeout=")) out.sigintTimeout = a.slice("--sigint-timeout=".length);
48
+ else if (a === "--agent") out.agent = argv[i + 1];
49
+ else if (a.startsWith("--agent=")) out.agent = a.slice("--agent=".length);
50
+ else if (a === "--chorus-only") out.chorusOnly = true;
51
+ else if (a === "--verbose") out.verbose = true;
52
+ else if (a === "-d" || a === "--detach") out.detach = true;
53
+ else if (a === "--help" || a === "-h") out.help = true;
54
+ }
55
+ return out;
56
+ }
57
+
58
+ /**
59
+ * Determine the daemon lifecycle sub-action from the args following `daemon`.
60
+ * The sub-action MUST be the very FIRST token (`chorus daemon stop`), so we
61
+ * inspect only `rest[0]` — not any non-flag token. Checking the first
62
+ * positional anywhere would misread a flag *value* that happens to equal an
63
+ * action verb (`daemon --url stop` → "stop"); pinning to `rest[0]` avoids that.
64
+ * Anything else (no args, a flag-leading list like `daemon -d` / `daemon --url …`,
65
+ * or an unknown leading token) is the normal long-lived daemon (`run`).
66
+ *
67
+ * @param {string[]} rest argv after the `daemon` subcommand token
68
+ * @returns {"run"|"stop"|"status"|"restart"|"logs"}
69
+ */
70
+ export function parseDaemonAction(rest) {
71
+ const first = rest[0];
72
+ if (first && DAEMON_ACTIONS.has(first)) return /** @type any */ (first);
73
+ return "run";
74
+ }
75
+
76
+ /**
77
+ * Help text for `chorus daemon [--help]`. Pure — takes the version so the
78
+ * caller (which already read package.json) does no IO here.
79
+ * @param {string} version
80
+ * @returns {string}
81
+ */
82
+ export function daemonHelpText(version) {
83
+ return `
84
+ Chorus daemon v${version} — connect to a remote Chorus server, subscribe to the
85
+ agent notification stream, and wake a local headless agent on task dispatch.
86
+
87
+ USAGE
88
+ chorus daemon [options] Run the daemon (foreground)
89
+ chorus daemon -d [options] Run the daemon in the background (detached)
90
+ chorus daemon stop Stop the background daemon
91
+ chorus daemon status Show whether the background daemon is running
92
+ chorus daemon restart Restart the background daemon
93
+ chorus daemon logs Show the background daemon log
94
+
95
+ OPTIONS
96
+ --url <url> Remote Chorus server URL (env: CHORUS_URL)
97
+ --api-key <cho_...> Agent API key (env: CHORUS_API_KEY)
98
+ --agent <type> Local agent backend to wake (env: CHORUS_AGENT)
99
+ (default: claude-code; only claude-code is implemented)
100
+ --yolo Full autonomy for the woken agent (env: CHORUS_YOLO=1)
101
+ (--dangerously-skip-permissions: Bash, file writes, any
102
+ command). This is the DEFAULT permission mode.
103
+ --chorus-only Restrict the woken agent to Chorus (env: CHORUS_CHORUS_ONLY=1)
104
+ MCP tools only (no Bash / file edits) — reclaims the
105
+ safe posture from the default yolo.
106
+ -d, --detach Run detached in the background (pidfile + logfile)
107
+ --verbose More detailed per-wake logging
108
+ --sigint-timeout <ms> Grace window after SIGINT before a forceful kill
109
+ (env: CHORUS_DAEMON_SIGINT_TIMEOUT; default 10000)
110
+ -h, --help Show this help message
111
+
112
+ CREDENTIALS
113
+ Resolution order: flags > CHORUS_URL/CHORUS_API_KEY env >
114
+ ~/.chorus/daemon.json (from 'chorus login') > Claude Code plugin config.
115
+ On a TTY with no resolvable credentials, the daemon prompts to complete them.
116
+
117
+ EXAMPLES
118
+ chorus daemon # Foreground, default yolo (TTY confirms once)
119
+ chorus daemon --chorus-only # Restrict the woken agent to Chorus tools
120
+ chorus daemon -d # Background; see 'chorus daemon logs'
121
+ chorus daemon stop # Stop the background daemon
122
+ `;
123
+ }
124
+
125
+ /**
126
+ * Help text for `chorus login [--help]`.
127
+ * @param {string} version
128
+ * @returns {string}
129
+ */
130
+ export function loginHelpText(version) {
131
+ return `
132
+ Chorus login v${version} — authenticate as an agent and save credentials to
133
+ ~/.chorus/daemon.json (0600) for later use by 'chorus daemon'.
134
+
135
+ USAGE
136
+ chorus login [options] Validate a key and persist credentials
137
+
138
+ OPTIONS
139
+ --url <url> Remote Chorus server URL (env: CHORUS_URL)
140
+ --api-key <cho_...> Agent API key (env: CHORUS_API_KEY)
141
+ -h, --help Show this help message
142
+
143
+ With no flags, login prompts interactively for the URL and a masked API key,
144
+ validates them against the server, and on success saves the credentials.
145
+ `;
146
+ }
@@ -0,0 +1,180 @@
1
+ // cli/control-handler.mjs
2
+ // Daemon-side handler for reverse control commands (子3 — daemon-interrupt-resume,
3
+ // Tech Design "Architecture" / q1=a double-check). The SSE listener forks a
4
+ // `type:"control"` event here (NOT to the wake router) — see sse-listener.mjs.
5
+ //
6
+ // The single safety property this module enforces is the DOUBLE-CHECK (q1=a): act
7
+ // ONLY when BOTH hold —
8
+ // 1. event.targetConnectionUuid === this daemon's OWN registered connectionUuid, AND
9
+ // 2. the waker's in-memory execution registry holds a RUNNING child for the
10
+ // command's `${entityType}:${entityUuid}`.
11
+ // On either mismatch the command is IGNORED and LOGGED (memory: no-silent-errors),
12
+ // so a stale / recycled connection uuid can never make the daemon kill the wrong
13
+ // subprocess (Tech Design "Risks": mis-kill after a reconnect).
14
+ //
15
+ // On a verified match it (a) sets a per-entity "interrupting" flag on the waker so
16
+ // the waker reports the resulting exit as interrupted(reason="user") rather than a
17
+ // crash, then (b) invokes the injected killer (process-killer.killProcessTree) on
18
+ // the live child. The kill is fire-and-forget from the listener's perspective; this
19
+ // handler never throws into the SSE loop.
20
+ //
21
+ // Plain ESM, zero new deps. The killer + connectionUuid getter are injected so the
22
+ // handler is unit-testable without a real subprocess or SSE stream.
23
+
24
+ import { killProcessTree } from "./process-killer.mjs";
25
+
26
+ const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
27
+
28
+ /**
29
+ * Build the `onControl(event)` callback the SseListener invokes for a
30
+ * `type:"control"` event.
31
+ *
32
+ * @param {{
33
+ * waker: {
34
+ * executions: Map<string, { entityType: string, entityUuid: string, child?: any, status: string }>,
35
+ * markInterrupting?: (entityType: string, entityUuid: string) => void,
36
+ * },
37
+ * getConnectionUuid: () => (string|null), This daemon's registered connection uuid
38
+ * (null until the SSE handshake reports it).
39
+ * killer?: (child: any, opts: any) => Promise<any>, Injectable; defaults to killProcessTree.
40
+ * sigintTimeoutMs?: number, Layered-resolved escalation window.
41
+ * redispatchResume?: (entityType: string, entityUuid: string) => void, Re-run a wake
42
+ * for a resumed entity (子3); injected by the daemon.
43
+ * deliverTurn?: (turnUuid?: string) => void, Dispatch a PRECISE pending turn by uuid
44
+ * (子2 — origin-only live delivery). On a
45
+ * `deliver_turn` control event (after the Check-1
46
+ * connection match) the handler invokes this with
47
+ * the event's `turnUuid` so ONLY that one new
48
+ * pending `human_instruction` turn runs — not a
49
+ * connection-wide sweep that would also drag every
50
+ * other still-pending turn along. Injected by the
51
+ * daemon (`backfill.pendingTurnsOnly`); the
52
+ * arg-less form (reconnect) still sweeps all.
53
+ * logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
54
+ * }} deps
55
+ * @returns {(event: any) => void} The onControl callback (synchronous, non-throwing).
56
+ */
57
+ export function createControlHandler(deps) {
58
+ const waker = deps.waker;
59
+ const getConnectionUuid = deps.getConnectionUuid;
60
+ const killer = deps.killer ?? killProcessTree;
61
+ const sigintTimeoutMs = deps.sigintTimeoutMs;
62
+ const redispatchResume = deps.redispatchResume;
63
+ const deliverTurn = deps.deliverTurn;
64
+ const logger = deps.logger ?? NOOP_LOGGER;
65
+
66
+ /** Registry key for a resource — MUST match waker.#execKey. */
67
+ const execKey = (entityType, entityUuid) => `${entityType}:${entityUuid}`;
68
+
69
+ /**
70
+ * Handle one control event. Synchronous + non-throwing: it performs the
71
+ * double-check and kicks off the (async) kill fire-and-forget, returning
72
+ * immediately so the SSE consumer never blocks. `interrupt` (kill), `resume`
73
+ * (re-dispatch wake), and `deliver_turn` (origin-only live delivery — trigger the
74
+ * pending-turns sweep) are acted on; any other/unknown command is ignored + logged
75
+ * (forward-compatible).
76
+ * @param {{ type?: string, command?: string, targetConnectionUuid?: string, entityType?: string, entityUuid?: string }} event
77
+ */
78
+ return function onControl(event) {
79
+ try {
80
+ if (!event || event.type !== "control") {
81
+ logger.warn(`[Chorus] control-handler received non-control event; ignoring`);
82
+ return;
83
+ }
84
+ if (
85
+ event.command !== "interrupt" &&
86
+ event.command !== "resume" &&
87
+ event.command !== "deliver_turn"
88
+ ) {
89
+ // Forward-compatible: the wire enum may grow.
90
+ logger.warn(`[Chorus] control command "${event.command}" not supported; ignoring`);
91
+ return;
92
+ }
93
+
94
+ const { command, targetConnectionUuid, entityType, entityUuid } = event;
95
+
96
+ // --- Check 1: connection-uuid match (applies to every command) ---
97
+ const myConnectionUuid = getConnectionUuid?.() ?? null;
98
+ if (!myConnectionUuid || targetConnectionUuid !== myConnectionUuid) {
99
+ // Not ours (stale/recycled uuid, or handshake not yet complete). Ignore.
100
+ logger.info(
101
+ `[Chorus] control: ignoring ${command} for connection ${targetConnectionUuid} ` +
102
+ `(this daemon is ${myConnectionUuid ?? "<unregistered>"})`
103
+ );
104
+ return;
105
+ }
106
+
107
+ // --- deliver_turn: origin-only live delivery (子2). The session's origin connection
108
+ // (THIS one — Check 1 passed) was pinged that a SPECIFIC new pending
109
+ // `human_instruction` turn (`event.turnUuid`) awaits. Dispatch ONLY that turn — not
110
+ // a connection-wide sweep, which would also drag every other still-pending turn of
111
+ // this connection along (the multi-wake bug). No entity is carried on the wire (the
112
+ // turn is read by uuid), and there is NO running-child requirement (mirrors
113
+ // `resume`); the read resolves the text from the persisted turn. Idempotent with
114
+ // reconnect backfill via the shared `seen` set (key turn:{uuid}). A `deliver_turn`
115
+ // missing `turnUuid` (older server) falls back to the full sweep so it still runs. ---
116
+ if (command === "deliver_turn") {
117
+ const turnUuid = typeof event.turnUuid === "string" ? event.turnUuid : undefined;
118
+ logger.info(
119
+ `[Chorus] control: deliver_turn for connection ${targetConnectionUuid} ` +
120
+ (turnUuid ? `(turn ${turnUuid})` : "(no turnUuid — full sweep fallback)"),
121
+ );
122
+ try {
123
+ deliverTurn?.(turnUuid);
124
+ } catch (err) {
125
+ logger.warn(`[Chorus] control: deliver_turn failed: ${err}`);
126
+ }
127
+ return;
128
+ }
129
+
130
+ if (typeof entityType !== "string" || typeof entityUuid !== "string") {
131
+ logger.warn(`[Chorus] control: ${command} missing entityType/entityUuid; ignoring`);
132
+ return;
133
+ }
134
+
135
+ // --- resume: re-dispatch the wake for this entity (子3). No running-child
136
+ // check — the subprocess is gone (it was interrupted); the wake path will
137
+ // re-spawn and `--resume` the existing session. ---
138
+ if (command === "resume") {
139
+ logger.info(`[Chorus] control: resuming ${entityType}:${entityUuid} (re-dispatch wake)`);
140
+ try {
141
+ redispatchResume?.(entityType, entityUuid);
142
+ } catch (err) {
143
+ logger.warn(`[Chorus] control: resume re-dispatch failed for ${entityType}:${entityUuid}: ${err}`);
144
+ }
145
+ return;
146
+ }
147
+
148
+ // --- interrupt path: Check 2 — in-memory entity ownership (running child) ---
149
+ const key = execKey(entityType, entityUuid);
150
+ const entry = waker?.executions?.get(key);
151
+ if (!entry || entry.status !== "running" || !entry.child) {
152
+ // Either we never ran this entity, it's only queued (no child yet), or the
153
+ // wake already finished (race: interrupt arrived after exit). Safe no-op.
154
+ logger.info(
155
+ `[Chorus] control: no running subprocess for ${key} on this daemon; ignoring interrupt`
156
+ );
157
+ return;
158
+ }
159
+
160
+ // --- Both checks passed: mark interrupting (so the waker reports reason=user),
161
+ // then kill the tree. ---
162
+ logger.info(`[Chorus] control: interrupting running subprocess for ${key} (pid=${entry.child.pid})`);
163
+ try {
164
+ waker.markInterrupting?.(entityType, entityUuid);
165
+ } catch (err) {
166
+ logger.warn(`[Chorus] control: markInterrupting failed for ${key}: ${err}`);
167
+ }
168
+
169
+ // Fire-and-forget the kill: the waker observes the child's exit and reports
170
+ // the interrupted state. The killer never throws, but guard the promise
171
+ // anyway so a rejection can't surface as an unhandled rejection.
172
+ Promise.resolve(killer(entry.child, { sigintTimeoutMs, logger })).catch((err) => {
173
+ logger.warn(`[Chorus] control: killProcessTree rejected for ${key}: ${err}`);
174
+ });
175
+ } catch (err) {
176
+ // Absolute backstop — a control event must never crash the SSE loop.
177
+ logger.error(`[Chorus] control-handler unexpected error: ${err}`);
178
+ }
179
+ };
180
+ }
@@ -0,0 +1,155 @@
1
+ // cli/credentials.mjs
2
+ // Layered resolution of the Chorus server URL + `cho_` API key for the daemon
3
+ // and login subcommands. Plain ESM, zero dependencies — ships verbatim in the
4
+ // npm package alongside chorus.mjs (see package.json `files`).
5
+ //
6
+ // Precedence (first complete pair wins):
7
+ // 1. explicit flags --url / --api-key
8
+ // 2. environment CHORUS_URL / CHORUS_API_KEY
9
+ // 3. login file ~/.chorus/daemon.json (written by `chorus login`)
10
+ // 4. plugin fallback ~/.claude/settings.json → .env.CHORUS_URL / .env.CHORUS_API_KEY
11
+ //
12
+ // The CC chorus plugin does NOT persist credentials to a file — it reads
13
+ // CHORUS_URL / CHORUS_API_KEY from the environment, which users configure in
14
+ // the `env` block of ~/.claude/settings.json. Tier 4 reads that block as a
15
+ // best-effort last resort (file may be absent or differently shaped — read
16
+ // defensively). Verified against the 0.10.0 plugin: bin/*.sh all read the two
17
+ // env vars; .chorus/state.json holds session state, never credentials.
18
+
19
+ import { readFileSync } from "node:fs";
20
+ import { homedir } from "node:os";
21
+ import { join } from "node:path";
22
+
23
+ /** Absolute path to the login file written by `chorus login`. */
24
+ export function loginFilePath() {
25
+ return join(homedir(), ".chorus", "daemon.json");
26
+ }
27
+
28
+ /** Absolute path to the Claude Code user settings file (plugin fallback source). */
29
+ export function claudeSettingsPath() {
30
+ return join(homedir(), ".claude", "settings.json");
31
+ }
32
+
33
+ /**
34
+ * Read a JSON file, returning `null` on any error (missing / unreadable /
35
+ * malformed). Never throws — callers treat a null as "source absent".
36
+ * @param {string} path
37
+ * @returns {Record<string, unknown> | null}
38
+ */
39
+ function readJsonSafe(path) {
40
+ try {
41
+ const raw = readFileSync(path, "utf8");
42
+ const parsed = JSON.parse(raw);
43
+ return parsed && typeof parsed === "object" ? parsed : null;
44
+ } catch {
45
+ return null;
46
+ }
47
+ }
48
+
49
+ /** A non-empty string, or undefined. Trims; empty/whitespace → undefined. */
50
+ function nonEmpty(value) {
51
+ if (typeof value !== "string") return undefined;
52
+ const trimmed = value.trim();
53
+ return trimmed.length > 0 ? trimmed : undefined;
54
+ }
55
+
56
+ /**
57
+ * Read the recorded yolo acknowledgement (`yoloAckAt`) from the login file, if
58
+ * present. Returns the ISO-8601 string, or null when the file is absent /
59
+ * unreadable / carries no ack. Never throws (a missing ack just means "not yet
60
+ * confirmed"). The ack lives in the same `~/.chorus/daemon.json` as the
61
+ * credentials — there is no separate ack file (daemon-permission-mode spec).
62
+ *
63
+ * @param {{ readJson?: (p: string) => (Record<string, unknown>|null), loginPath?: string }} [deps]
64
+ * @returns {string | null}
65
+ */
66
+ export function readYoloAck(deps = {}) {
67
+ const readJson = deps.readJson ?? readJsonSafe;
68
+ const loginPath = deps.loginPath ?? loginFilePath();
69
+ const file = readJson(loginPath);
70
+ return file ? nonEmpty(file.yoloAckAt) ?? null : null;
71
+ }
72
+
73
+ /**
74
+ * @typedef {Object} ResolvedCredentials
75
+ * @property {string} url
76
+ * @property {string} apiKey
77
+ * @property {"flag"|"env"|"login-file"|"plugin-fallback"} source
78
+ */
79
+
80
+ /**
81
+ * @typedef {Object} ResolveDeps Injectable IO for tests (no real disk/env).
82
+ * @property {Record<string, string|undefined>} [env]
83
+ * @property {(path: string) => (Record<string, unknown>|null)} [readJson]
84
+ * @property {string} [loginPath]
85
+ * @property {string} [settingsPath]
86
+ */
87
+
88
+ /**
89
+ * Resolve credentials from the four layered sources, in fixed precedence.
90
+ *
91
+ * @param {{ url?: string, apiKey?: string }} flags Explicit --url / --api-key.
92
+ * @param {ResolveDeps} [deps]
93
+ * @returns {ResolvedCredentials}
94
+ * @throws {Error} when no source yields a complete url+apiKey pair. The message
95
+ * lists every source that was tried and how to supply credentials.
96
+ */
97
+ export function resolveCredentials(flags = {}, deps = {}) {
98
+ const env = deps.env ?? process.env;
99
+ const readJson = deps.readJson ?? readJsonSafe;
100
+ const loginPath = deps.loginPath ?? loginFilePath();
101
+ const settingsPath = deps.settingsPath ?? claudeSettingsPath();
102
+
103
+ const tried = [];
104
+
105
+ // 1. Explicit flags
106
+ tried.push("--url/--api-key flags");
107
+ {
108
+ const url = nonEmpty(flags.url);
109
+ const apiKey = nonEmpty(flags.apiKey);
110
+ if (url && apiKey) return { url, apiKey, source: "flag" };
111
+ }
112
+
113
+ // 2. Environment variables
114
+ tried.push("CHORUS_URL / CHORUS_API_KEY environment variables");
115
+ {
116
+ const url = nonEmpty(env.CHORUS_URL);
117
+ const apiKey = nonEmpty(env.CHORUS_API_KEY);
118
+ if (url && apiKey) return { url, apiKey, source: "env" };
119
+ }
120
+
121
+ // 3. Login file (~/.chorus/daemon.json)
122
+ tried.push(`login file (${loginPath}, run \`chorus login\`)`);
123
+ {
124
+ const file = readJson(loginPath);
125
+ if (file) {
126
+ const url = nonEmpty(file.url);
127
+ const apiKey = nonEmpty(file.apiKey);
128
+ if (url && apiKey) return { url, apiKey, source: "login-file" };
129
+ }
130
+ }
131
+
132
+ // 4. Plugin fallback (~/.claude/settings.json → env block)
133
+ tried.push(`Claude Code plugin config (${settingsPath} → env.CHORUS_URL/CHORUS_API_KEY)`);
134
+ {
135
+ const settings = readJson(settingsPath);
136
+ const envBlock =
137
+ settings && typeof settings.env === "object" && settings.env !== null
138
+ ? /** @type {Record<string, unknown>} */ (settings.env)
139
+ : null;
140
+ if (envBlock) {
141
+ const url = nonEmpty(envBlock.CHORUS_URL);
142
+ const apiKey = nonEmpty(envBlock.CHORUS_API_KEY);
143
+ if (url && apiKey) return { url, apiKey, source: "plugin-fallback" };
144
+ }
145
+ }
146
+
147
+ throw new Error(
148
+ "Could not resolve Chorus credentials (url + cho_ API key). Tried, in order:\n" +
149
+ tried.map((t, i) => ` ${i + 1}. ${t}`).join("\n") +
150
+ "\n\nSupply credentials with one of:\n" +
151
+ " • flags: chorus daemon --url <https://...> --api-key <cho_...>\n" +
152
+ " • env: CHORUS_URL=<https://...> CHORUS_API_KEY=<cho_...> chorus daemon\n" +
153
+ " • login: chorus login (persists to ~/.chorus/daemon.json)\n"
154
+ );
155
+ }
@@ -0,0 +1,38 @@
1
+ // cli/daemon-agent.mjs
2
+ // Pure resolution + validation of the daemon's `--agent <type>` selection. The
3
+ // flag/env exist to RESERVE the extension point for future agent backends
4
+ // (e.g. codex); only `claude-code` is implemented in this change. Resolving an
5
+ // unknown value is a hard error (no silent fallback). Zero dependencies.
6
+
7
+ /** The agent backends the daemon recognizes. Only `claude-code` is implemented. */
8
+ export const KNOWN_AGENTS = ["claude-code"];
9
+
10
+ /** The default agent backend when neither --agent nor CHORUS_AGENT is set. */
11
+ export const DEFAULT_AGENT = "claude-code";
12
+
13
+ /**
14
+ * Resolve the agent type from flag → env → default, and validate it.
15
+ * Precedence: explicit `--agent` flag > CHORUS_AGENT env > DEFAULT_AGENT.
16
+ *
17
+ * @param {{ agent?: string }} flags
18
+ * @param {Record<string, string|undefined>} env
19
+ * @returns {{ ok: true, agent: string } | { ok: false, value: string, error: string }}
20
+ * `ok:false` carries the offending value and a human-actionable error naming
21
+ * the accepted types — the caller exits non-zero and prints `error`.
22
+ */
23
+ export function resolveAgentType(flags, env) {
24
+ const raw =
25
+ (typeof flags.agent === "string" && flags.agent.trim()) ||
26
+ (typeof env.CHORUS_AGENT === "string" && env.CHORUS_AGENT.trim()) ||
27
+ DEFAULT_AGENT;
28
+ if (!KNOWN_AGENTS.includes(raw)) {
29
+ return {
30
+ ok: false,
31
+ value: raw,
32
+ error:
33
+ `Unknown --agent "${raw}". Accepted: ${KNOWN_AGENTS.join(", ")}. ` +
34
+ `(Only ${DEFAULT_AGENT} is implemented; the flag reserves the slot for future agents.)`,
35
+ };
36
+ }
37
+ return { ok: true, agent: raw };
38
+ }
@@ -0,0 +1,80 @@
1
+ // cli/daemon-banner.mjs
2
+ // Pure formatter for the daemon's boxed startup banner — one screen summarizing
3
+ // the daemon's posture. No IO: `formatBanner(info)` returns a string the caller
4
+ // writes. Degrades box-drawing to plain lines when `isTTY` is false so piped /
5
+ // redirected output stays clean and never depends on terminal width.
6
+ //
7
+ // SECURITY: the banner shows the credential SOURCE, never the raw API key
8
+ // (owner decision: no masking needed because the key is simply not displayed).
9
+ // Zero dependencies — ships in the npm package alongside chorus.mjs.
10
+
11
+ /**
12
+ * @typedef {Object} BannerInfo
13
+ * @property {string} version chorus CLI version.
14
+ * @property {string} url remote server URL.
15
+ * @property {string} agentName authenticated agent name.
16
+ * @property {string} agentUuid authenticated agent uuid.
17
+ * @property {"yolo"|"chorus"} permissionMode
18
+ * @property {string} credentialSource resolved credential source (flag/env/login-file/…).
19
+ * @property {string} agentType local agent backend (e.g. claude-code).
20
+ * @property {string|null} claudePath resolved claude path, or null when not found.
21
+ * @property {string} [connection] connection state line (default "connecting…").
22
+ */
23
+
24
+ /** Right-pad to width (banner box alignment). */
25
+ function pad(s, width) {
26
+ return s.length >= width ? s : s + " ".repeat(width - s.length);
27
+ }
28
+
29
+ /**
30
+ * Build the banner's labelled rows (label, value) in display order. Pure — also
31
+ * used by tests to assert content independently of the box framing.
32
+ * @param {BannerInfo} info
33
+ * @returns {Array<[string, string]>}
34
+ */
35
+ export function bannerRows(info) {
36
+ const permission =
37
+ info.permissionMode === "yolo"
38
+ ? "YOLO ⚠ (full autonomy — Bash/write/any command)"
39
+ : "chorus-only (Chorus MCP tools only)";
40
+ const claude = info.claudePath ? `found: ${info.claudePath}` : "NOT FOUND — install `claude` or set CHORUS_CLAUDE_PATH";
41
+ return [
42
+ ["Version", `chorus v${info.version}`],
43
+ ["Server", info.url],
44
+ ["Agent", `${info.agentName} (${info.agentUuid})`],
45
+ ["Agent type", info.agentType],
46
+ ["Permission", permission],
47
+ ["Credentials", `source: ${info.credentialSource}`],
48
+ ["Connection", info.connection ?? "connecting…"],
49
+ ["claude CLI", claude],
50
+ ];
51
+ }
52
+
53
+ /**
54
+ * Format the startup banner. On a TTY, draws a Unicode box; otherwise emits
55
+ * plain `label: value` lines (no box-drawing chars, no width math) so piped
56
+ * output is clean. Never throws.
57
+ * @param {BannerInfo} info
58
+ * @param {{ isTTY?: boolean }} [opts]
59
+ * @returns {string}
60
+ */
61
+ export function formatBanner(info, opts = {}) {
62
+ const rows = bannerRows(info);
63
+ const isTTY = opts.isTTY ?? false;
64
+
65
+ if (!isTTY) {
66
+ // Plain mode: stable, greppable, no box-drawing.
67
+ const lines = ["Chorus daemon", ...rows.map(([k, v]) => ` ${k}: ${v}`)];
68
+ return lines.join("\n") + "\n";
69
+ }
70
+
71
+ const labelW = Math.max(...rows.map(([k]) => k.length));
72
+ const body = rows.map(([k, v]) => `${pad(k, labelW)} ${v}`);
73
+ const title = "Chorus daemon";
74
+ const innerW = Math.max(title.length, ...body.map((l) => l.length));
75
+ const top = "┌" + "─".repeat(innerW + 2) + "┐";
76
+ const bottom = "└" + "─".repeat(innerW + 2) + "┘";
77
+ const sep = "├" + "─".repeat(innerW + 2) + "┤";
78
+ const line = (s) => `│ ${pad(s, innerW)} │`;
79
+ return [top, line(title), sep, ...body.map(line), bottom].join("\n") + "\n";
80
+ }