@chorus-aidlc/chorus 0.14.2 → 0.14.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (497) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +438 -431
  3. package/.next/standalone/.next/app-path-routes-manifest.json +49 -48
  4. package/.next/standalone/.next/build-manifest.json +5 -5
  5. package/.next/standalone/.next/prerender-manifest.json +33 -33
  6. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
  7. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
  8. package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
  9. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
  10. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
  11. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
  12. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +2 -2
  13. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
  14. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
  15. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
  16. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
  17. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
  18. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
  19. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
  20. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
  21. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
  22. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
  23. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
  24. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +2 -2
  25. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
  26. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
  27. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
  28. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
  29. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
  30. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
  31. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
  32. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
  33. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
  34. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
  35. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
  36. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
  37. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
  38. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
  39. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
  40. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
  41. package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
  42. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +3 -3
  43. package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
  44. package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
  45. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
  46. package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
  47. package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
  48. package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
  49. package/.next/standalone/.next/server/app/_not-found.html +2 -2
  50. package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
  51. package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
  52. package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
  53. package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
  54. package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
  55. package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
  56. package/.next/standalone/.next/server/app/admin/companies.html +2 -2
  57. package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
  58. package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
  59. package/.next/standalone/.next/server/app/admin.html +2 -2
  60. package/.next/standalone/.next/server/app/admin.rsc +2 -2
  61. package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
  62. package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
  63. package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
  64. package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
  65. package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
  66. package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
  67. package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  68. package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
  69. package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
  70. package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
  71. package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
  72. package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
  73. package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
  74. package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
  75. package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
  76. package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
  77. package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
  78. package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
  79. package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
  80. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js +1 -0
  81. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js.nft.json +1 -0
  82. package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -0
  83. package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
  84. package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
  85. package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
  86. package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
  87. package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
  88. package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
  89. package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
  90. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
  91. package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
  92. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
  93. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
  94. package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
  95. package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
  96. package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
  97. package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
  98. package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
  99. package/.next/standalone/.next/server/app/api/events/notifications/route.js +5 -5
  100. package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
  101. package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
  102. package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
  103. package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
  104. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
  105. package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
  106. package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
  107. package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
  108. package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
  109. package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
  110. package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
  111. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  112. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
  125. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
  126. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  127. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  128. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  129. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  130. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  131. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  132. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  133. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  146. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  149. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/index.html +2 -2
  158. package/.next/standalone/.next/server/app/index.rsc +2 -2
  159. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  161. package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
  162. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  164. package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
  165. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  166. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  168. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
  169. package/.next/standalone/.next/server/app/login.html +2 -2
  170. package/.next/standalone/.next/server/app/login.rsc +2 -2
  171. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  172. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  173. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  175. package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
  176. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  177. package/.next/standalone/.next/server/app/projects.html +2 -2
  178. package/.next/standalone/.next/server/app/projects.rsc +3 -3
  179. package/.next/standalone/.next/server/app/settings.html +2 -2
  180. package/.next/standalone/.next/server/app/settings.rsc +4 -4
  181. package/.next/standalone/.next/server/app-paths-manifest.json +49 -48
  182. package/.next/standalone/.next/server/chunks/1114.js +1 -1
  183. package/.next/standalone/.next/server/chunks/1318.js +1 -1
  184. package/.next/standalone/.next/server/chunks/1559.js +1 -1
  185. package/.next/standalone/.next/server/chunks/2004.js +1 -0
  186. package/.next/standalone/.next/server/chunks/2112.js +1 -0
  187. package/.next/standalone/.next/server/chunks/{1286.js → 2282.js} +3 -3
  188. package/.next/standalone/.next/server/chunks/2570.js +2 -2
  189. package/.next/standalone/.next/server/chunks/2618.js +1 -1
  190. package/.next/standalone/.next/server/chunks/{6492.js → 2789.js} +2 -2
  191. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  192. package/.next/standalone/.next/server/chunks/3219.js +1 -1
  193. package/.next/standalone/.next/server/chunks/4070.js +1 -0
  194. package/.next/standalone/.next/server/chunks/4827.js +1 -1
  195. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  196. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  197. package/.next/standalone/.next/server/chunks/6207.js +1 -1
  198. package/.next/standalone/.next/server/chunks/6506.js +2 -2
  199. package/.next/standalone/.next/server/chunks/679.js +1 -1
  200. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  201. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  202. package/.next/standalone/.next/server/chunks/8540.js +1 -0
  203. package/.next/standalone/.next/server/chunks/920.js +1 -1
  204. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  205. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  206. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  207. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  208. package/.next/standalone/.next/server/pages/404.html +2 -2
  209. package/.next/standalone/.next/server/pages/500.html +1 -1
  210. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  211. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  212. package/.next/standalone/.next/static/WVmgQzimrMNvGtHx6Cqm1/_buildManifest.js +1 -0
  213. package/.next/standalone/.next/static/chunks/{11595.fbbfc784ff9ee566.js → 11595.c580c5690d176cce.js} +1 -1
  214. package/.next/standalone/.next/static/chunks/{13867-a95a4555fcb7b13b.js → 14160-7bcee6e9e8bc5233.js} +1 -1
  215. package/.next/standalone/.next/static/chunks/{32331-87ae9bc7517c7947.js → 18351-2a408c4f57ddb3a7.js} +1 -1
  216. package/.next/standalone/.next/static/chunks/24870-5b0be64361f5ef70.js +1 -0
  217. package/.next/standalone/.next/static/chunks/26232-110019cebde19691.js +1 -0
  218. package/.next/standalone/.next/static/chunks/{33456.b67f1146831e9f2b.js → 33456.c48dc366aa90b234.js} +1 -1
  219. package/.next/standalone/.next/static/chunks/{37985-e4683195e4ca2519.js → 33806-cb339e86820a87c4.js} +1 -1
  220. package/.next/standalone/.next/static/chunks/{38526-7ffc4b7351c15bc4.js → 37938-c09acf52d7f85cb4.js} +1 -1
  221. package/.next/standalone/.next/static/chunks/{4860.3491d748fdde968e.js → 4860.baf6a285246198af.js} +1 -1
  222. package/.next/standalone/.next/static/chunks/{33277-9926b461045318b3.js → 60178-d6276df1c07d7735.js} +2 -2
  223. package/.next/standalone/.next/static/chunks/68326-924445654ed47e6f.js +1 -0
  224. package/.next/standalone/.next/static/chunks/78917-1498676a1ffe5ded.js +1 -0
  225. package/.next/standalone/.next/static/chunks/94470-1076452151689267.js +1 -0
  226. package/.next/standalone/.next/static/chunks/94643-7c7f2efab0640658.js +1 -0
  227. package/.next/standalone/.next/static/chunks/{99373.827383575665ce2f.js → 99373.ad871bd0bbfc5eb7.js} +1 -1
  228. package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-12d81eedb519461c.js → layout-78259279cf6c6919.js} +1 -1
  229. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-8cf720e8efb6ac7d.js +1 -0
  230. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-996b8a87b4b986f1.js → page-59dcf0ba7ce877ec.js} +1 -1
  231. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-d6c226fd56b5ebb5.js +1 -0
  232. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-c231207c3674aa54.js → page-2c9d3f4c6e0ff807.js} +1 -1
  233. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-c62c7d7cf9833060.js → page-af35d50848f01875.js} +1 -1
  234. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-cb6fdf592863833c.js +1 -0
  235. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-596d97796dd55e2f.js +1 -0
  236. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/{page-7948aa8db4813091.js → page-ed9415921188b4d3.js} +1 -1
  237. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-8eea1e0cea60758f.js → page-ebf4c28014025b7b.js} +1 -1
  238. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-658f31ac6a28ec82.js → page-bbde7e85e3388813.js} +1 -1
  239. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-e60bc39bf2957f77.js +1 -0
  240. package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  241. package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-8cf720e8efb6ac7d.js +1 -0
  242. package/.next/standalone/.next/static/chunks/app/api/admin/login/route-8cf720e8efb6ac7d.js +1 -0
  243. package/.next/standalone/.next/static/chunks/app/api/admin/session/route-8cf720e8efb6ac7d.js +1 -0
  244. package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-8cf720e8efb6ac7d.js +1 -0
  245. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  246. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-8cf720e8efb6ac7d.js +1 -0
  247. package/.next/standalone/.next/static/chunks/app/api/agents/route-8cf720e8efb6ac7d.js +1 -0
  248. package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  249. package/.next/standalone/.next/static/chunks/app/api/api-keys/route-8cf720e8efb6ac7d.js +1 -0
  250. package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-8cf720e8efb6ac7d.js +1 -0
  251. package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-8cf720e8efb6ac7d.js +1 -0
  252. package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-8cf720e8efb6ac7d.js +1 -0
  253. package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-8cf720e8efb6ac7d.js +1 -0
  254. package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-8cf720e8efb6ac7d.js +1 -0
  255. package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-8cf720e8efb6ac7d.js +1 -0
  256. package/.next/standalone/.next/static/chunks/app/api/auth/me/route-8cf720e8efb6ac7d.js +1 -0
  257. package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-8cf720e8efb6ac7d.js +1 -0
  258. package/.next/standalone/.next/static/chunks/app/api/comments/route-8cf720e8efb6ac7d.js +1 -0
  259. package/.next/standalone/.next/static/chunks/app/api/daemon/connection-heartbeat/route-8cf720e8efb6ac7d.js +1 -0
  260. package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-8cf720e8efb6ac7d.js +1 -0
  261. package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-8cf720e8efb6ac7d.js +1 -0
  262. package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-8cf720e8efb6ac7d.js +1 -0
  263. package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-8cf720e8efb6ac7d.js +1 -0
  264. package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-8cf720e8efb6ac7d.js +1 -0
  265. package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-8cf720e8efb6ac7d.js +1 -0
  266. package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-8cf720e8efb6ac7d.js +1 -0
  267. package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-8cf720e8efb6ac7d.js +1 -0
  268. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-8cf720e8efb6ac7d.js +1 -0
  269. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/repoint/route-8cf720e8efb6ac7d.js +1 -0
  270. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-8cf720e8efb6ac7d.js +1 -0
  271. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-8cf720e8efb6ac7d.js +1 -0
  272. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-8cf720e8efb6ac7d.js +1 -0
  273. package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  274. package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-8cf720e8efb6ac7d.js +1 -0
  275. package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-8cf720e8efb6ac7d.js +1 -0
  276. package/.next/standalone/.next/static/chunks/app/api/events/route-8cf720e8efb6ac7d.js +1 -0
  277. package/.next/standalone/.next/static/chunks/app/api/health/route-8cf720e8efb6ac7d.js +1 -0
  278. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-8cf720e8efb6ac7d.js +1 -0
  279. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-8cf720e8efb6ac7d.js +1 -0
  280. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-8cf720e8efb6ac7d.js +1 -0
  281. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-8cf720e8efb6ac7d.js +1 -0
  282. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-8cf720e8efb6ac7d.js +1 -0
  283. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  284. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/wake-preview/route-8cf720e8efb6ac7d.js +1 -0
  285. package/.next/standalone/.next/static/chunks/app/api/ideas/conversational/route-8cf720e8efb6ac7d.js +1 -0
  286. package/.next/standalone/.next/static/chunks/app/api/mcp/route-8cf720e8efb6ac7d.js +1 -0
  287. package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-8cf720e8efb6ac7d.js +1 -0
  288. package/.next/standalone/.next/static/chunks/app/api/mentionables/route-8cf720e8efb6ac7d.js +1 -0
  289. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-8cf720e8efb6ac7d.js +1 -0
  290. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-8cf720e8efb6ac7d.js +1 -0
  291. package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-8cf720e8efb6ac7d.js +1 -0
  292. package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-8cf720e8efb6ac7d.js +1 -0
  293. package/.next/standalone/.next/static/chunks/app/api/notifications/route-8cf720e8efb6ac7d.js +1 -0
  294. package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-8cf720e8efb6ac7d.js +1 -0
  295. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-8cf720e8efb6ac7d.js +1 -0
  296. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  297. package/.next/standalone/.next/static/chunks/app/api/project-groups/route-8cf720e8efb6ac7d.js +1 -0
  298. package/.next/standalone/.next/static/chunks/app/api/project-visits/pin/route-8cf720e8efb6ac7d.js +1 -0
  299. package/.next/standalone/.next/static/chunks/app/api/project-visits/route-8cf720e8efb6ac7d.js +1 -0
  300. package/.next/standalone/.next/static/chunks/app/api/project-visits/visit/route-8cf720e8efb6ac7d.js +1 -0
  301. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-8cf720e8efb6ac7d.js +1 -0
  302. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-8cf720e8efb6ac7d.js +1 -0
  303. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-8cf720e8efb6ac7d.js +1 -0
  304. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-8cf720e8efb6ac7d.js +1 -0
  305. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-8cf720e8efb6ac7d.js +1 -0
  306. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-8cf720e8efb6ac7d.js +1 -0
  307. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-8cf720e8efb6ac7d.js +1 -0
  308. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-8cf720e8efb6ac7d.js +1 -0
  309. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-8cf720e8efb6ac7d.js +1 -0
  310. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/resource-graph/route-8cf720e8efb6ac7d.js +1 -0
  311. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  312. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-8cf720e8efb6ac7d.js +1 -0
  313. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-8cf720e8efb6ac7d.js +1 -0
  314. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-8cf720e8efb6ac7d.js +1 -0
  315. package/.next/standalone/.next/static/chunks/app/api/projects/route-8cf720e8efb6ac7d.js +1 -0
  316. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-8cf720e8efb6ac7d.js +1 -0
  317. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-8cf720e8efb6ac7d.js +1 -0
  318. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-8cf720e8efb6ac7d.js +1 -0
  319. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-8cf720e8efb6ac7d.js +1 -0
  320. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  321. package/.next/standalone/.next/static/chunks/app/api/references/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  322. package/.next/standalone/.next/static/chunks/app/api/references/route-8cf720e8efb6ac7d.js +1 -0
  323. package/.next/standalone/.next/static/chunks/app/api/search/route-8cf720e8efb6ac7d.js +1 -0
  324. package/.next/standalone/.next/static/chunks/app/api/session/route-8cf720e8efb6ac7d.js +1 -0
  325. package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  326. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-8cf720e8efb6ac7d.js +1 -0
  327. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-8cf720e8efb6ac7d.js +1 -0
  328. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-8cf720e8efb6ac7d.js +1 -0
  329. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-8cf720e8efb6ac7d.js +1 -0
  330. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  331. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-8cf720e8efb6ac7d.js +1 -0
  332. package/.next/standalone/.next/static/chunks/app/onboarding/{page-b178eb3215360d91.js → page-006bf9e9d6a991f1.js} +1 -1
  333. package/.next/standalone/.next/static/chunks/{webpack-567d9ffe31a0a5ee.js → webpack-af2cb28ef7bbd7c2.js} +1 -1
  334. package/.next/standalone/.next/static/css/f46eab37c942ff33.css +1 -0
  335. package/.next/standalone/package.json +1 -1
  336. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  337. package/.next/standalone/public/chorus-plugin/bin/on-post-verify-task.sh +1 -1
  338. package/.next/standalone/public/chorus-plugin/bin/verify-document-roundtrip.sh +28 -0
  339. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  340. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +1 -1
  341. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
  342. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  343. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +8 -4
  344. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
  345. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  346. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  347. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
  348. package/.next/standalone/public/install-kiro.sh +1 -1
  349. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  350. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
  351. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
  352. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +8 -4
  353. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
  354. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
  355. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
  356. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +1 -1
  357. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  358. package/.next/standalone/public/kiro-plugin/bin/verify-document-roundtrip.sh +28 -0
  359. package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
  360. package/.next/standalone/public/skill/chorus/SKILL.md +1 -1
  361. package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
  362. package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
  363. package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
  364. package/.next/standalone/public/skill/package.json +1 -1
  365. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
  366. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
  367. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
  368. package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
  369. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
  370. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
  371. package/README.md +2 -0
  372. package/cli/claude-spawner.mjs +4 -0
  373. package/cli/client-args.mjs +15 -8
  374. package/cli/codex-spawner.mjs +41 -10
  375. package/cli/codex-usage-map.mjs +115 -0
  376. package/cli/daemon-agent.mjs +56 -6
  377. package/cli/daemon-install-config.mjs +129 -0
  378. package/cli/daemon-rest-client.mjs +34 -3
  379. package/cli/daemon.mjs +32 -1
  380. package/cli/sse-listener.mjs +82 -5
  381. package/cli/turn-reporter.mjs +17 -5
  382. package/cli/upload-hooks.mjs +337 -12
  383. package/cli/waker.mjs +68 -13
  384. package/package.json +1 -1
  385. package/prisma/migrations/20260723014810_add_turn_relay_error/migration.sql +2 -0
  386. package/prisma/migrations/20260724031955_add_turn_token_usage/migration.sql +6 -0
  387. package/prisma/migrations/20260724082248_add_session_cache_rollup/migration.sql +3 -0
  388. package/prisma/schema.prisma +27 -0
  389. package/.next/standalone/.next/server/chunks/1173.js +0 -1
  390. package/.next/standalone/.next/server/chunks/3407.js +0 -1
  391. package/.next/standalone/.next/server/chunks/595.js +0 -1
  392. package/.next/standalone/.next/server/chunks/7762.js +0 -1
  393. package/.next/standalone/.next/static/XTQkt8fOQEK4mZkZTFQ_E/_buildManifest.js +0 -1
  394. package/.next/standalone/.next/static/chunks/24537-7d71bf10329d1be1.js +0 -1
  395. package/.next/standalone/.next/static/chunks/27030-19cd50b9d47b3be6.js +0 -1
  396. package/.next/standalone/.next/static/chunks/28680-f9c5e04f67982cb6.js +0 -1
  397. package/.next/standalone/.next/static/chunks/73510-c338cef00ca3cfaf.js +0 -1
  398. package/.next/standalone/.next/static/chunks/78917-a297b76c6daa9f5d.js +0 -1
  399. package/.next/standalone/.next/static/chunks/84219-09970ab1b85c61f0.js +0 -1
  400. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-d1c49cfe592deeb8.js +0 -1
  401. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-77771ef395e19922.js +0 -1
  402. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-d098269dcaa06de7.js +0 -1
  403. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-7bcaa11ee24b5754.js +0 -1
  404. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-7fbf5bc58d3dd5b0.js +0 -1
  405. package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-d1c49cfe592deeb8.js +0 -1
  406. package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-d1c49cfe592deeb8.js +0 -1
  407. package/.next/standalone/.next/static/chunks/app/api/admin/login/route-d1c49cfe592deeb8.js +0 -1
  408. package/.next/standalone/.next/static/chunks/app/api/admin/session/route-d1c49cfe592deeb8.js +0 -1
  409. package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-d1c49cfe592deeb8.js +0 -1
  410. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-d1c49cfe592deeb8.js +0 -1
  411. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-d1c49cfe592deeb8.js +0 -1
  412. package/.next/standalone/.next/static/chunks/app/api/agents/route-d1c49cfe592deeb8.js +0 -1
  413. package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-d1c49cfe592deeb8.js +0 -1
  414. package/.next/standalone/.next/static/chunks/app/api/api-keys/route-d1c49cfe592deeb8.js +0 -1
  415. package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-d1c49cfe592deeb8.js +0 -1
  416. package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-d1c49cfe592deeb8.js +0 -1
  417. package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-d1c49cfe592deeb8.js +0 -1
  418. package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-d1c49cfe592deeb8.js +0 -1
  419. package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-d1c49cfe592deeb8.js +0 -1
  420. package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-d1c49cfe592deeb8.js +0 -1
  421. package/.next/standalone/.next/static/chunks/app/api/auth/me/route-d1c49cfe592deeb8.js +0 -1
  422. package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-d1c49cfe592deeb8.js +0 -1
  423. package/.next/standalone/.next/static/chunks/app/api/comments/route-d1c49cfe592deeb8.js +0 -1
  424. package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-d1c49cfe592deeb8.js +0 -1
  425. package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-d1c49cfe592deeb8.js +0 -1
  426. package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-d1c49cfe592deeb8.js +0 -1
  427. package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-d1c49cfe592deeb8.js +0 -1
  428. package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-d1c49cfe592deeb8.js +0 -1
  429. package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-d1c49cfe592deeb8.js +0 -1
  430. package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-d1c49cfe592deeb8.js +0 -1
  431. package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-d1c49cfe592deeb8.js +0 -1
  432. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-d1c49cfe592deeb8.js +0 -1
  433. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/repoint/route-d1c49cfe592deeb8.js +0 -1
  434. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-d1c49cfe592deeb8.js +0 -1
  435. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-d1c49cfe592deeb8.js +0 -1
  436. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-d1c49cfe592deeb8.js +0 -1
  437. package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-d1c49cfe592deeb8.js +0 -1
  438. package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-d1c49cfe592deeb8.js +0 -1
  439. package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-d1c49cfe592deeb8.js +0 -1
  440. package/.next/standalone/.next/static/chunks/app/api/events/route-d1c49cfe592deeb8.js +0 -1
  441. package/.next/standalone/.next/static/chunks/app/api/health/route-d1c49cfe592deeb8.js +0 -1
  442. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-d1c49cfe592deeb8.js +0 -1
  443. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-d1c49cfe592deeb8.js +0 -1
  444. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-d1c49cfe592deeb8.js +0 -1
  445. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-d1c49cfe592deeb8.js +0 -1
  446. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-d1c49cfe592deeb8.js +0 -1
  447. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-d1c49cfe592deeb8.js +0 -1
  448. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/wake-preview/route-d1c49cfe592deeb8.js +0 -1
  449. package/.next/standalone/.next/static/chunks/app/api/ideas/conversational/route-d1c49cfe592deeb8.js +0 -1
  450. package/.next/standalone/.next/static/chunks/app/api/mcp/route-d1c49cfe592deeb8.js +0 -1
  451. package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-d1c49cfe592deeb8.js +0 -1
  452. package/.next/standalone/.next/static/chunks/app/api/mentionables/route-d1c49cfe592deeb8.js +0 -1
  453. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-d1c49cfe592deeb8.js +0 -1
  454. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-d1c49cfe592deeb8.js +0 -1
  455. package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-d1c49cfe592deeb8.js +0 -1
  456. package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-d1c49cfe592deeb8.js +0 -1
  457. package/.next/standalone/.next/static/chunks/app/api/notifications/route-d1c49cfe592deeb8.js +0 -1
  458. package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-d1c49cfe592deeb8.js +0 -1
  459. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-d1c49cfe592deeb8.js +0 -1
  460. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-d1c49cfe592deeb8.js +0 -1
  461. package/.next/standalone/.next/static/chunks/app/api/project-groups/route-d1c49cfe592deeb8.js +0 -1
  462. package/.next/standalone/.next/static/chunks/app/api/project-visits/pin/route-d1c49cfe592deeb8.js +0 -1
  463. package/.next/standalone/.next/static/chunks/app/api/project-visits/route-d1c49cfe592deeb8.js +0 -1
  464. package/.next/standalone/.next/static/chunks/app/api/project-visits/visit/route-d1c49cfe592deeb8.js +0 -1
  465. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-d1c49cfe592deeb8.js +0 -1
  466. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-d1c49cfe592deeb8.js +0 -1
  467. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-d1c49cfe592deeb8.js +0 -1
  468. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-d1c49cfe592deeb8.js +0 -1
  469. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-d1c49cfe592deeb8.js +0 -1
  470. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-d1c49cfe592deeb8.js +0 -1
  471. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-d1c49cfe592deeb8.js +0 -1
  472. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-d1c49cfe592deeb8.js +0 -1
  473. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-d1c49cfe592deeb8.js +0 -1
  474. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/resource-graph/route-d1c49cfe592deeb8.js +0 -1
  475. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-d1c49cfe592deeb8.js +0 -1
  476. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-d1c49cfe592deeb8.js +0 -1
  477. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-d1c49cfe592deeb8.js +0 -1
  478. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-d1c49cfe592deeb8.js +0 -1
  479. package/.next/standalone/.next/static/chunks/app/api/projects/route-d1c49cfe592deeb8.js +0 -1
  480. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-d1c49cfe592deeb8.js +0 -1
  481. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-d1c49cfe592deeb8.js +0 -1
  482. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-d1c49cfe592deeb8.js +0 -1
  483. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-d1c49cfe592deeb8.js +0 -1
  484. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-d1c49cfe592deeb8.js +0 -1
  485. package/.next/standalone/.next/static/chunks/app/api/references/[uuid]/route-d1c49cfe592deeb8.js +0 -1
  486. package/.next/standalone/.next/static/chunks/app/api/references/route-d1c49cfe592deeb8.js +0 -1
  487. package/.next/standalone/.next/static/chunks/app/api/search/route-d1c49cfe592deeb8.js +0 -1
  488. package/.next/standalone/.next/static/chunks/app/api/session/route-d1c49cfe592deeb8.js +0 -1
  489. package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-d1c49cfe592deeb8.js +0 -1
  490. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-d1c49cfe592deeb8.js +0 -1
  491. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-d1c49cfe592deeb8.js +0 -1
  492. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-d1c49cfe592deeb8.js +0 -1
  493. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-d1c49cfe592deeb8.js +0 -1
  494. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-d1c49cfe592deeb8.js +0 -1
  495. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-d1c49cfe592deeb8.js +0 -1
  496. package/.next/standalone/.next/static/css/617133917710c831.css +0 -1
  497. /package/.next/standalone/.next/static/{XTQkt8fOQEK4mZkZTFQ_E → WVmgQzimrMNvGtHx6Cqm1}/_ssgManifest.js +0 -0
@@ -0,0 +1,115 @@
1
+ // Persist the last cumulative Codex token snapshot per Chorus anchor. Codex
2
+ // `turn.completed.usage` is backed by ThreadTokenUsage.total, so resumed execs
3
+ // must subtract this baseline before publishing per-turn usage.
4
+
5
+ import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
6
+ import { homedir } from "node:os";
7
+ import { dirname, join } from "node:path";
8
+
9
+ const NOOP_LOGGER = { warn() {} };
10
+ const FIELDS = [
11
+ "input_tokens",
12
+ "cached_input_tokens",
13
+ "cache_write_input_tokens",
14
+ "output_tokens",
15
+ "reasoning_output_tokens",
16
+ ];
17
+
18
+ export function codexUsageMapPath() {
19
+ return join(homedir(), ".chorus", "codex-usage.json");
20
+ }
21
+
22
+ function tokenInt(value) {
23
+ return typeof value === "number" && Number.isFinite(value) && value >= 0
24
+ ? Math.trunc(value)
25
+ : null;
26
+ }
27
+
28
+ function sanitizeUsage(value) {
29
+ if (!value || typeof value !== "object" || Array.isArray(value)) return null;
30
+ const usage = {};
31
+ let found = false;
32
+ for (const field of FIELDS) {
33
+ const parsed = tokenInt(value[field]);
34
+ if (parsed !== null) {
35
+ usage[field] = parsed;
36
+ found = true;
37
+ }
38
+ }
39
+ return found ? usage : null;
40
+ }
41
+
42
+ function readMap(path, read, logger) {
43
+ try {
44
+ const parsed = JSON.parse(read(path));
45
+ return parsed && typeof parsed === "object" && !Array.isArray(parsed) ? parsed : {};
46
+ } catch (err) {
47
+ if (!(err && err.code === "ENOENT")) {
48
+ logger.warn(`[Chorus] codex-usage-map: read failed (${err}) - treating as empty`);
49
+ }
50
+ return {};
51
+ }
52
+ }
53
+
54
+ export function getCodexUsageSnapshot(anchor, threadId, deps = {}) {
55
+ if (!anchor || !threadId) return null;
56
+ const path = deps.path ?? codexUsageMapPath();
57
+ const read = deps.read ?? ((p) => readFileSync(p, "utf8"));
58
+ const logger = deps.logger ?? NOOP_LOGGER;
59
+ const entry = readMap(path, read, logger)[anchor];
60
+ if (!entry || entry.threadId !== threadId) return null;
61
+ return sanitizeUsage(entry.usage);
62
+ }
63
+
64
+ export function setCodexUsageSnapshot(anchor, threadId, usage, deps = {}) {
65
+ const clean = sanitizeUsage(usage);
66
+ if (!anchor || !threadId || !clean) return;
67
+ const path = deps.path ?? codexUsageMapPath();
68
+ const read = deps.read ?? ((p) => readFileSync(p, "utf8"));
69
+ const write = deps.write ?? writeFileSync;
70
+ const mkdir = deps.mkdir ?? mkdirSync;
71
+ const rename = deps.rename ?? renameSync;
72
+ const logger = deps.logger ?? NOOP_LOGGER;
73
+ try {
74
+ const map = readMap(path, read, logger);
75
+ map[anchor] = { threadId, usage: clean };
76
+ mkdir(dirname(path), { recursive: true });
77
+ const tmp = `${path}.tmp`;
78
+ write(tmp, JSON.stringify(map, null, 2) + "\n", { mode: 0o600 });
79
+ rename(tmp, path);
80
+ } catch (err) {
81
+ logger.warn(`[Chorus] codex-usage-map: persist failed (${err}) - next turn may overcount`);
82
+ }
83
+ }
84
+
85
+ function delta(current, previous) {
86
+ const now = tokenInt(current);
87
+ if (now === null) return null;
88
+ const before = tokenInt(previous);
89
+ return before !== null && now >= before ? now - before : now;
90
+ }
91
+
92
+ export function normalizeCodexUsageEvent(event, previous) {
93
+ if (!event || event.type !== "turn.completed" || !event.usage) return event;
94
+ const raw = event.usage;
95
+ const input = delta(raw.input_tokens, previous?.input_tokens);
96
+ const cacheRead = delta(raw.cached_input_tokens, previous?.cached_input_tokens);
97
+ const cacheWrite = delta(raw.cache_write_input_tokens, previous?.cache_write_input_tokens);
98
+ const exclusiveInput =
99
+ input === null ? null : Math.max(0, input - (cacheRead ?? 0) - (cacheWrite ?? 0));
100
+
101
+ return {
102
+ ...event,
103
+ usage: {
104
+ ...raw,
105
+ input_tokens: exclusiveInput,
106
+ cached_input_tokens: cacheRead,
107
+ cache_write_input_tokens: cacheWrite,
108
+ output_tokens: delta(raw.output_tokens, previous?.output_tokens),
109
+ reasoning_output_tokens: delta(
110
+ raw.reasoning_output_tokens,
111
+ previous?.reasoning_output_tokens
112
+ ),
113
+ },
114
+ };
115
+ }
@@ -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
+ }
@@ -16,6 +16,8 @@
16
16
  // startedAt|null }] }
17
17
  // reportInterrupt → POST /api/daemon/report-interrupt
18
18
  // { connectionUuid, entityType, entityUuid, reason }
19
+ // heartbeat → POST /api/daemon/connection-heartbeat
20
+ // { connectionUuid, connectedAt }
19
21
  // readPendingTurns → GET /api/daemon/pending-turns?connectionUuid=…
20
22
  // → { turns: [{ turnUuid, sessionId, directIdeaUuid, trigger,
21
23
  // promptText }] }
@@ -72,6 +74,7 @@ const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
72
74
  * transcript: (p: { sessionId: string, messages: Array<{ role: string, text: string }> }) => Promise<DaemonRestResult>,
73
75
  * executionState: (p: { executions: Array<Record<string, unknown>> }) => Promise<DaemonRestResult>,
74
76
  * reportInterrupt: (p: { entityType: string, entityUuid: string, reason: string }) => Promise<DaemonRestResult>,
77
+ * heartbeat: (p: { connectionUuid: string, connectedAt: string }) => Promise<DaemonRestResult>,
75
78
  * readPendingTurns: () => Promise<DaemonRestResult>,
76
79
  * }}
77
80
  */
@@ -136,16 +139,25 @@ export function createDaemonRestClient(opts) {
136
139
  * server resolves the turn by the session BUSINESS KEY (`sessionId`); the optional
137
140
  * `entityType`/`entityUuid` stamp the weak executionUuid link. An `interrupted`
138
141
  * status may carry `interruptedReason` (`user`/`crash`/`shutdown` — the server
139
- * rejects `offline`, which is its own reconcile verdict). Requires the
140
- * connectionUuid (the server addresses the turn against a connection the agent owns).
142
+ * rejects `offline`, which is its own reconcile verdict). A terminal edge may also
143
+ * carry `transcriptRelayError` the daemon-known reason its transcript upload
144
+ * finally failed (fix #444 follow-up), persisted as a turn annotation — and `usage`,
145
+ * the whole normalized per-turn TokenUsage object (daemon-token-usage), persisted as
146
+ * the turn's usage. Both ride the terminal edge only. Requires the connectionUuid (the
147
+ * server addresses the turn against a connection the agent owns).
141
148
  */
142
- async turnAdvance({ sessionId, status, entityType, entityUuid, interruptedReason }) {
149
+ async turnAdvance({ sessionId, status, entityType, entityUuid, interruptedReason, transcriptRelayError, usage }) {
143
150
  const connectionUuid = getConnectionUuid();
144
151
  if (!connectionUuid) {
145
152
  const error = `cannot advance turn for session ${sessionId} → ${status} — no connection uuid yet`;
146
153
  logger.warn(`[Chorus] ${error}`);
147
154
  return { ok: false, status: null, error, skipped: true };
148
155
  }
156
+ // Per-turn token usage (daemon-token-usage) is meaningful only on a TERMINAL edge —
157
+ // the daemon knows it at subprocess exit, exactly like transcriptRelayError. Guard on
158
+ // the terminal status here so a stray usage on → running is never sent (the server
159
+ // ignores it there anyway; this keeps the wire honest).
160
+ const isTerminal = status === "ended" || status === "interrupted";
149
161
  const body = {
150
162
  connectionUuid,
151
163
  sessionId,
@@ -154,6 +166,11 @@ export function createDaemonRestClient(opts) {
154
166
  ...(entityType && entityUuid ? { entityType, entityUuid } : {}),
155
167
  // Only meaningful alongside status=interrupted; never sent otherwise.
156
168
  ...(status === "interrupted" && interruptedReason ? { interruptedReason } : {}),
169
+ // Transcript-relay failure annotation (fix #444 follow-up): only sent when the
170
+ // daemon actually knows the upload failed (a truthy reason on a terminal edge).
171
+ ...(transcriptRelayError ? { transcriptRelayError } : {}),
172
+ // The whole normalized TokenUsage object, nested under `usage`, only on a terminal edge.
173
+ ...(usage && isTerminal ? { usage } : {}),
157
174
  };
158
175
  return post(
159
176
  "turn-advance",
@@ -223,6 +240,20 @@ export function createDaemonRestClient(opts) {
223
240
  );
224
241
  },
225
242
 
243
+ /**
244
+ * POST /api/daemon/connection-heartbeat — acknowledge receipt of one SSE heartbeat.
245
+ * The values come directly from the active stream's registration handshake; unlike
246
+ * other connection-scoped operations this must not resolve the uuid lazily, because
247
+ * a delayed acknowledgment must retain its original generation fence.
248
+ */
249
+ async heartbeat({ connectionUuid, connectedAt }) {
250
+ return post(
251
+ "connection-heartbeat",
252
+ "/api/daemon/connection-heartbeat",
253
+ { connectionUuid, connectedAt },
254
+ );
255
+ },
256
+
226
257
  /**
227
258
  * GET /api/daemon/pending-turns?connectionUuid=… — read this connection's unstarted
228
259
  * (pending) turns from the turn table (the reconnect-backfill / deliver_turn source).
package/cli/daemon.mjs CHANGED
@@ -17,6 +17,7 @@ import { prompt, writeLoginFile, updateDaemonConfig } from "./login.mjs";
17
17
  import {
18
18
  resolveInstallCredentials,
19
19
  resolveInstallCwds,
20
+ resolveInstallAgent,
20
21
  } from "./daemon-install-config.mjs";
21
22
  import {
22
23
  resolvePermissionMode,
@@ -43,6 +44,7 @@ import {
43
44
  import { WAKE_ACTIONS } from "./prompts.mjs";
44
45
  import { createInterruptReporter } from "./interrupt-reporter.mjs";
45
46
  import { createTurnReporter } from "./turn-reporter.mjs";
47
+ import { createDaemonRestClient } from "./daemon-rest-client.mjs";
46
48
  import { createControlHandler } from "./control-handler.mjs";
47
49
  import { resolveSigintTimeoutMs, resolveDaemonCwds } from "./daemon-config.mjs";
48
50
  import {
@@ -205,6 +207,13 @@ export function buildDaemon(creds, deps = {}) {
205
207
  // doesn't matter. Per-connection so each path's wakes report against the right row.
206
208
  /** @type {{ connectionUuid: string|null }} */
207
209
  const connectionState = { connectionUuid: null };
210
+ const daemonRestClient = createDaemonRestClient({
211
+ url: creds.url,
212
+ apiKey: creds.apiKey,
213
+ getConnectionUuid: () => connectionState.connectionUuid,
214
+ logger,
215
+ fetchImpl: deps.fetchImpl,
216
+ });
208
217
 
209
218
  // Per-connection terminal-outcome bookkeeping (add-daemon-connection-conflict-skip).
210
219
  // `resolved` guards recordConnectionOutcome against double-counting a reconnect's
@@ -389,6 +398,7 @@ export function buildDaemon(creds, deps = {}) {
389
398
  recordConnectionOutcome(outcome, false);
390
399
  },
391
400
  onControl,
401
+ acknowledgeHeartbeat: (registration) => daemonRestClient.heartbeat(registration),
392
402
  onReconnect: backfill,
393
403
  logger,
394
404
  });
@@ -768,6 +778,7 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
768
778
  const installCfg = svc.installConfig ?? {
769
779
  resolveInstallCredentials,
770
780
  resolveInstallCwds,
781
+ resolveInstallAgent,
771
782
  };
772
783
 
773
784
  const credResult = await installCfg.resolveInstallCredentials(flags, env, {
@@ -801,10 +812,30 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
801
812
  log,
802
813
  });
803
814
 
815
+ // Configure + persist the agent backend to daemon.json `agent` (single source
816
+ // of truth; the unit carries no --agent, exactly like --cwd). Prompts an
817
+ // interactive menu on a TTY (Enter = claude-code); reuses a --agent flag /
818
+ // CHORUS_AGENT env / a prior stored choice; probes the selected CLI and warns
819
+ // (non-fatal) when it is missing. An unknown --agent was already rejected by
820
+ // resolveAgentType above, so this phase never fails.
821
+ await installCfg.resolveInstallAgent(flags, env, {
822
+ isTTY,
823
+ skip,
824
+ writeConfig: pfDeps?.writeConfig ?? updateDaemonConfig,
825
+ readJson: pfDeps?.readJson,
826
+ loginPath: pfDeps?.loginPath,
827
+ prompt: pfDeps?.askPrompt,
828
+ log,
829
+ errLog,
830
+ });
831
+
804
832
  const spec = {
805
833
  ...svc.resolveServicePaths(),
806
834
  cwds: flags.cwd ?? [],
807
- agent: flags.agent,
835
+ // NOTE: agent is deliberately NOT passed into the unit. The selected backend
836
+ // is persisted to daemon.json `agent` (single source of truth) and read back
837
+ // by the daemon via resolveAgentType — mirroring how --cwd is handled. Baking
838
+ // --agent into ExecStart too would let the two sources drift.
808
839
  chorusOnly: flags.chorusOnly === true,
809
840
  workingDir: process.cwd(),
810
841
  };