@chorus-aidlc/chorus 0.14.1 → 0.14.3

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 (523) hide show
  1. package/.next/standalone/.next/BUILD_ID +1 -1
  2. package/.next/standalone/.next/app-build-manifest.json +469 -440
  3. package/.next/standalone/.next/app-path-routes-manifest.json +49 -45
  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/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.js +2 -2
  112. package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
  113. package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
  114. package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
  115. package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
  116. package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
  117. package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
  118. package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
  119. package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
  120. package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
  121. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
  122. package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
  123. package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
  124. package/.next/standalone/.next/server/app/api/project-visits/pin/route.js +1 -0
  125. package/.next/standalone/.next/server/app/api/project-visits/pin/route.js.nft.json +1 -0
  126. package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -0
  127. package/.next/standalone/.next/server/app/api/project-visits/route.js +1 -0
  128. package/.next/standalone/.next/server/app/api/project-visits/route.js.nft.json +1 -0
  129. package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -0
  130. package/.next/standalone/.next/server/app/api/project-visits/visit/route.js +1 -0
  131. package/.next/standalone/.next/server/app/api/project-visits/visit/route.js.nft.json +1 -0
  132. package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -0
  133. package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
  134. package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
  135. package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
  136. package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
  137. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
  138. package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
  139. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
  140. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
  141. package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
  142. package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
  143. package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
  144. package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
  145. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
  146. package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
  147. package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
  148. package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
  149. package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
  150. package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
  151. package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
  152. package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
  153. package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
  154. package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
  155. package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
  156. package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
  157. package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
  158. package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
  159. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
  160. package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
  161. package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
  162. package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
  163. package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
  164. package/.next/standalone/.next/server/app/index.html +2 -2
  165. package/.next/standalone/.next/server/app/index.rsc +2 -2
  166. package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
  167. package/.next/standalone/.next/server/app/login/admin.html +2 -2
  168. package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
  169. package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
  170. package/.next/standalone/.next/server/app/login/callback.html +2 -2
  171. package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
  172. package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
  173. package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
  174. package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
  175. package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
  176. package/.next/standalone/.next/server/app/login.html +2 -2
  177. package/.next/standalone/.next/server/app/login.rsc +2 -2
  178. package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
  179. package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
  180. package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
  181. package/.next/standalone/.next/server/app/onboarding.html +2 -2
  182. package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
  183. package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
  184. package/.next/standalone/.next/server/app/projects.html +2 -2
  185. package/.next/standalone/.next/server/app/projects.rsc +4 -4
  186. package/.next/standalone/.next/server/app/settings.html +2 -2
  187. package/.next/standalone/.next/server/app/settings.rsc +4 -4
  188. package/.next/standalone/.next/server/app-paths-manifest.json +49 -45
  189. package/.next/standalone/.next/server/chunks/1114.js +1 -1
  190. package/.next/standalone/.next/server/chunks/1318.js +1 -0
  191. package/.next/standalone/.next/server/chunks/1559.js +1 -1
  192. package/.next/standalone/.next/server/chunks/2004.js +1 -0
  193. package/.next/standalone/.next/server/chunks/2112.js +1 -0
  194. package/.next/standalone/.next/server/chunks/{1286.js → 2282.js} +3 -3
  195. package/.next/standalone/.next/server/chunks/2570.js +2 -2
  196. package/.next/standalone/.next/server/chunks/2618.js +1 -1
  197. package/.next/standalone/.next/server/chunks/{6492.js → 2789.js} +2 -2
  198. package/.next/standalone/.next/server/chunks/2961.js +1 -1
  199. package/.next/standalone/.next/server/chunks/3219.js +1 -1
  200. package/.next/standalone/.next/server/chunks/4070.js +1 -0
  201. package/.next/standalone/.next/server/chunks/457.js +1 -0
  202. package/.next/standalone/.next/server/chunks/4827.js +1 -1
  203. package/.next/standalone/.next/server/chunks/5245.js +1 -1
  204. package/.next/standalone/.next/server/chunks/6113.js +1 -1
  205. package/.next/standalone/.next/server/chunks/6207.js +1 -1
  206. package/.next/standalone/.next/server/chunks/6449.js +1 -0
  207. package/.next/standalone/.next/server/chunks/6506.js +2 -2
  208. package/.next/standalone/.next/server/chunks/679.js +1 -1
  209. package/.next/standalone/.next/server/chunks/7368.js +1 -1
  210. package/.next/standalone/.next/server/chunks/7530.js +1 -1
  211. package/.next/standalone/.next/server/chunks/8540.js +1 -0
  212. package/.next/standalone/.next/server/chunks/920.js +1 -1
  213. package/.next/standalone/.next/server/chunks/9213.js +1 -1
  214. package/.next/standalone/.next/server/chunks/9378.js +1 -1
  215. package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
  216. package/.next/standalone/.next/server/middleware-manifest.json +5 -5
  217. package/.next/standalone/.next/server/pages/404.html +2 -2
  218. package/.next/standalone/.next/server/pages/500.html +1 -1
  219. package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
  220. package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
  221. package/.next/standalone/.next/static/3R5zOQKwCZOVs9-BjIVqk/_buildManifest.js +1 -0
  222. package/.next/standalone/.next/static/chunks/{11595.7784dfe509c100a4.js → 11595.c580c5690d176cce.js} +1 -1
  223. package/.next/standalone/.next/static/chunks/14160-7bcee6e9e8bc5233.js +1 -0
  224. package/.next/standalone/.next/static/chunks/{32331-87ae9bc7517c7947.js → 18351-2a408c4f57ddb3a7.js} +1 -1
  225. package/.next/standalone/.next/static/chunks/24870-5b0be64361f5ef70.js +1 -0
  226. package/.next/standalone/.next/static/chunks/26232-110019cebde19691.js +1 -0
  227. package/.next/standalone/.next/static/chunks/31308-bb4a97b3f39c22dd.js +1 -0
  228. package/.next/standalone/.next/static/chunks/{33456.3bd7ba05bd39259b.js → 33456.c48dc366aa90b234.js} +1 -1
  229. package/.next/standalone/.next/static/chunks/{37985-e4683195e4ca2519.js → 33806-cb339e86820a87c4.js} +1 -1
  230. package/.next/standalone/.next/static/chunks/37035-514bbb31cd13bda1.js +1 -0
  231. package/.next/standalone/.next/static/chunks/{38526-7ffc4b7351c15bc4.js → 37938-c09acf52d7f85cb4.js} +1 -1
  232. package/.next/standalone/.next/static/chunks/{42605-029b5426175cdee9.js → 39479-5af3460208d8cc56.js} +1 -1
  233. package/.next/standalone/.next/static/chunks/{4860.4803e40814d50dd0.js → 4860.baf6a285246198af.js} +1 -1
  234. package/.next/standalone/.next/static/chunks/{21188-43211c9e40bf0d63.js → 60178-d6276df1c07d7735.js} +2 -2
  235. package/.next/standalone/.next/static/chunks/68326-924445654ed47e6f.js +1 -0
  236. package/.next/standalone/.next/static/chunks/78917-1498676a1ffe5ded.js +1 -0
  237. package/.next/standalone/.next/static/chunks/94470-1076452151689267.js +1 -0
  238. package/.next/standalone/.next/static/chunks/94643-7c7f2efab0640658.js +1 -0
  239. package/.next/standalone/.next/static/chunks/{99373.0457580c532530bc.js → 99373.ad871bd0bbfc5eb7.js} +1 -1
  240. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-78259279cf6c6919.js +1 -0
  241. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-2af5f2f159c8e32b.js +1 -0
  242. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-8cf720e8efb6ac7d.js +1 -0
  243. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-e5202e9b7669576c.js → page-59dcf0ba7ce877ec.js} +1 -1
  244. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-d6c226fd56b5ebb5.js +1 -0
  245. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-c231207c3674aa54.js → page-2c9d3f4c6e0ff807.js} +1 -1
  246. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-20054b1cec8ed1d2.js → page-af35d50848f01875.js} +1 -1
  247. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-cb6fdf592863833c.js +1 -0
  248. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-596d97796dd55e2f.js +1 -0
  249. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/{page-7948aa8db4813091.js → page-ed9415921188b4d3.js} +1 -1
  250. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-ebf4c28014025b7b.js +1 -0
  251. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-bbde7e85e3388813.js +1 -0
  252. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/page-6df01fa989cca27b.js +1 -0
  253. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-e60bc39bf2957f77.js +1 -0
  254. package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  255. package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-8cf720e8efb6ac7d.js +1 -0
  256. package/.next/standalone/.next/static/chunks/app/api/admin/login/route-8cf720e8efb6ac7d.js +1 -0
  257. package/.next/standalone/.next/static/chunks/app/api/admin/session/route-8cf720e8efb6ac7d.js +1 -0
  258. package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-8cf720e8efb6ac7d.js +1 -0
  259. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  260. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-8cf720e8efb6ac7d.js +1 -0
  261. package/.next/standalone/.next/static/chunks/app/api/agents/route-8cf720e8efb6ac7d.js +1 -0
  262. package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  263. package/.next/standalone/.next/static/chunks/app/api/api-keys/route-8cf720e8efb6ac7d.js +1 -0
  264. package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-8cf720e8efb6ac7d.js +1 -0
  265. package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-8cf720e8efb6ac7d.js +1 -0
  266. package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-8cf720e8efb6ac7d.js +1 -0
  267. package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-8cf720e8efb6ac7d.js +1 -0
  268. package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-8cf720e8efb6ac7d.js +1 -0
  269. package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-8cf720e8efb6ac7d.js +1 -0
  270. package/.next/standalone/.next/static/chunks/app/api/auth/me/route-8cf720e8efb6ac7d.js +1 -0
  271. package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-8cf720e8efb6ac7d.js +1 -0
  272. package/.next/standalone/.next/static/chunks/app/api/comments/route-8cf720e8efb6ac7d.js +1 -0
  273. package/.next/standalone/.next/static/chunks/app/api/daemon/connection-heartbeat/route-8cf720e8efb6ac7d.js +1 -0
  274. package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-8cf720e8efb6ac7d.js +1 -0
  275. package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-8cf720e8efb6ac7d.js +1 -0
  276. package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-8cf720e8efb6ac7d.js +1 -0
  277. package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-8cf720e8efb6ac7d.js +1 -0
  278. package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-8cf720e8efb6ac7d.js +1 -0
  279. package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-8cf720e8efb6ac7d.js +1 -0
  280. package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-8cf720e8efb6ac7d.js +1 -0
  281. package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-8cf720e8efb6ac7d.js +1 -0
  282. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-8cf720e8efb6ac7d.js +1 -0
  283. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/repoint/route-8cf720e8efb6ac7d.js +1 -0
  284. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-8cf720e8efb6ac7d.js +1 -0
  285. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-8cf720e8efb6ac7d.js +1 -0
  286. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-8cf720e8efb6ac7d.js +1 -0
  287. package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  288. package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-8cf720e8efb6ac7d.js +1 -0
  289. package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-8cf720e8efb6ac7d.js +1 -0
  290. package/.next/standalone/.next/static/chunks/app/api/events/route-8cf720e8efb6ac7d.js +1 -0
  291. package/.next/standalone/.next/static/chunks/app/api/health/route-8cf720e8efb6ac7d.js +1 -0
  292. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-8cf720e8efb6ac7d.js +1 -0
  293. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-8cf720e8efb6ac7d.js +1 -0
  294. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-8cf720e8efb6ac7d.js +1 -0
  295. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-8cf720e8efb6ac7d.js +1 -0
  296. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-8cf720e8efb6ac7d.js +1 -0
  297. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  298. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/wake-preview/route-8cf720e8efb6ac7d.js +1 -0
  299. package/.next/standalone/.next/static/chunks/app/api/ideas/conversational/route-8cf720e8efb6ac7d.js +1 -0
  300. package/.next/standalone/.next/static/chunks/app/api/mcp/route-8cf720e8efb6ac7d.js +1 -0
  301. package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-8cf720e8efb6ac7d.js +1 -0
  302. package/.next/standalone/.next/static/chunks/app/api/mentionables/route-8cf720e8efb6ac7d.js +1 -0
  303. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-8cf720e8efb6ac7d.js +1 -0
  304. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-8cf720e8efb6ac7d.js +1 -0
  305. package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-8cf720e8efb6ac7d.js +1 -0
  306. package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-8cf720e8efb6ac7d.js +1 -0
  307. package/.next/standalone/.next/static/chunks/app/api/notifications/route-8cf720e8efb6ac7d.js +1 -0
  308. package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-8cf720e8efb6ac7d.js +1 -0
  309. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-8cf720e8efb6ac7d.js +1 -0
  310. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  311. package/.next/standalone/.next/static/chunks/app/api/project-groups/route-8cf720e8efb6ac7d.js +1 -0
  312. package/.next/standalone/.next/static/chunks/app/api/project-visits/pin/route-8cf720e8efb6ac7d.js +1 -0
  313. package/.next/standalone/.next/static/chunks/app/api/project-visits/route-8cf720e8efb6ac7d.js +1 -0
  314. package/.next/standalone/.next/static/chunks/app/api/project-visits/visit/route-8cf720e8efb6ac7d.js +1 -0
  315. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-8cf720e8efb6ac7d.js +1 -0
  316. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-8cf720e8efb6ac7d.js +1 -0
  317. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-8cf720e8efb6ac7d.js +1 -0
  318. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-8cf720e8efb6ac7d.js +1 -0
  319. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-8cf720e8efb6ac7d.js +1 -0
  320. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-8cf720e8efb6ac7d.js +1 -0
  321. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-8cf720e8efb6ac7d.js +1 -0
  322. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-8cf720e8efb6ac7d.js +1 -0
  323. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-8cf720e8efb6ac7d.js +1 -0
  324. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/resource-graph/route-8cf720e8efb6ac7d.js +1 -0
  325. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  326. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-8cf720e8efb6ac7d.js +1 -0
  327. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-8cf720e8efb6ac7d.js +1 -0
  328. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-8cf720e8efb6ac7d.js +1 -0
  329. package/.next/standalone/.next/static/chunks/app/api/projects/route-8cf720e8efb6ac7d.js +1 -0
  330. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-8cf720e8efb6ac7d.js +1 -0
  331. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-8cf720e8efb6ac7d.js +1 -0
  332. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-8cf720e8efb6ac7d.js +1 -0
  333. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-8cf720e8efb6ac7d.js +1 -0
  334. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  335. package/.next/standalone/.next/static/chunks/app/api/references/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  336. package/.next/standalone/.next/static/chunks/app/api/references/route-8cf720e8efb6ac7d.js +1 -0
  337. package/.next/standalone/.next/static/chunks/app/api/search/route-8cf720e8efb6ac7d.js +1 -0
  338. package/.next/standalone/.next/static/chunks/app/api/session/route-8cf720e8efb6ac7d.js +1 -0
  339. package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  340. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-8cf720e8efb6ac7d.js +1 -0
  341. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-8cf720e8efb6ac7d.js +1 -0
  342. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-8cf720e8efb6ac7d.js +1 -0
  343. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-8cf720e8efb6ac7d.js +1 -0
  344. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
  345. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-8cf720e8efb6ac7d.js +1 -0
  346. package/.next/standalone/.next/static/chunks/app/onboarding/{page-ece3f647133d446e.js → page-006bf9e9d6a991f1.js} +1 -1
  347. package/.next/standalone/.next/static/chunks/{webpack-96be8d6bd0d3d25f.js → webpack-af2cb28ef7bbd7c2.js} +1 -1
  348. package/.next/standalone/.next/static/css/f46eab37c942ff33.css +1 -0
  349. package/.next/standalone/package.json +1 -1
  350. package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
  351. package/.next/standalone/public/chorus-plugin/bin/on-post-verify-task.sh +2 -2
  352. package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +29 -5
  353. package/.next/standalone/public/chorus-plugin/bin/verify-document-roundtrip.sh +28 -0
  354. package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
  355. package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +17 -2
  356. package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +2 -2
  357. package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
  358. package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +8 -4
  359. package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
  360. package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
  361. package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
  362. package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +2 -2
  363. package/.next/standalone/public/install-kiro.sh +1 -1
  364. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
  365. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +2 -2
  366. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
  367. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +8 -4
  368. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
  369. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
  370. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
  371. package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +2 -2
  372. package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +14 -1
  373. package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
  374. package/.next/standalone/public/kiro-plugin/bin/verify-document-roundtrip.sh +28 -0
  375. package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
  376. package/.next/standalone/public/skill/chorus/SKILL.md +2 -2
  377. package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
  378. package/.next/standalone/public/skill/develop-chorus/SKILL.md +2 -2
  379. package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
  380. package/.next/standalone/public/skill/package.json +1 -1
  381. package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
  382. package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
  383. package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
  384. package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
  385. package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
  386. package/.next/standalone/public/skill/yolo-chorus/SKILL.md +3 -3
  387. package/README.ja.md +10 -10
  388. package/README.ko.md +10 -10
  389. package/README.md +10 -10
  390. package/README.zh.md +10 -10
  391. package/cli/claude-spawner.mjs +4 -0
  392. package/cli/codex-spawner.mjs +41 -10
  393. package/cli/codex-usage-map.mjs +115 -0
  394. package/cli/daemon-rest-client.mjs +34 -3
  395. package/cli/daemon.mjs +9 -0
  396. package/cli/lineage.mjs +20 -0
  397. package/cli/sse-listener.mjs +82 -5
  398. package/cli/turn-reporter.mjs +17 -5
  399. package/cli/upload-hooks.mjs +337 -12
  400. package/cli/waker.mjs +68 -13
  401. package/package.json +1 -1
  402. package/prisma/migrations/20260718062756_add_project_visit/migration.sql +29 -0
  403. package/prisma/migrations/20260723014810_add_turn_relay_error/migration.sql +2 -0
  404. package/prisma/migrations/20260724031955_add_turn_token_usage/migration.sql +6 -0
  405. package/prisma/migrations/20260724082248_add_session_cache_rollup/migration.sql +3 -0
  406. package/prisma/schema.prisma +49 -0
  407. package/.next/standalone/.next/server/chunks/1173.js +0 -1
  408. package/.next/standalone/.next/server/chunks/2382.js +0 -1
  409. package/.next/standalone/.next/server/chunks/4797.js +0 -1
  410. package/.next/standalone/.next/server/chunks/7762.js +0 -1
  411. package/.next/standalone/.next/server/chunks/8062.js +0 -1
  412. package/.next/standalone/.next/server/chunks/8204.js +0 -1
  413. package/.next/standalone/.next/server/chunks/9979.js +0 -1
  414. package/.next/standalone/.next/static/C9o43aSSZ0ebgki6mQ0-b/_buildManifest.js +0 -1
  415. package/.next/standalone/.next/static/chunks/24537-ef5b301140cf3a58.js +0 -1
  416. package/.next/standalone/.next/static/chunks/27030-3ae1d0e29245b23e.js +0 -1
  417. package/.next/standalone/.next/static/chunks/28680-dff79c4467712199.js +0 -1
  418. package/.next/standalone/.next/static/chunks/43111-7a4e08dc82bb3022.js +0 -1
  419. package/.next/standalone/.next/static/chunks/4939-ff22e2b42ad57f7f.js +0 -1
  420. package/.next/standalone/.next/static/chunks/78917-c0a9a11fe437a752.js +0 -1
  421. package/.next/standalone/.next/static/chunks/84169-5beb288902aea242.js +0 -1
  422. package/.next/standalone/.next/static/chunks/84219-09970ab1b85c61f0.js +0 -1
  423. package/.next/standalone/.next/static/chunks/93346-1d4cd71b8713a8a6.js +0 -1
  424. package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-00ff2f6753bb4603.js +0 -1
  425. package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-5824e6affe244f83.js +0 -1
  426. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-55ce87d16bc689f3.js +0 -1
  427. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-d9323dc8b6c974f7.js +0 -1
  428. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-c83c5d1b4599e737.js +0 -1
  429. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-7bcaa11ee24b5754.js +0 -1
  430. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-278d30ee1dd7e315.js +0 -1
  431. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-5a22db5f8504e61d.js +0 -1
  432. package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/page-47a17dbadfbc75ad.js +0 -1
  433. package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-7fbf5bc58d3dd5b0.js +0 -1
  434. package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-55ce87d16bc689f3.js +0 -1
  435. package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-55ce87d16bc689f3.js +0 -1
  436. package/.next/standalone/.next/static/chunks/app/api/admin/login/route-55ce87d16bc689f3.js +0 -1
  437. package/.next/standalone/.next/static/chunks/app/api/admin/session/route-55ce87d16bc689f3.js +0 -1
  438. package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-55ce87d16bc689f3.js +0 -1
  439. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-55ce87d16bc689f3.js +0 -1
  440. package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-55ce87d16bc689f3.js +0 -1
  441. package/.next/standalone/.next/static/chunks/app/api/agents/route-55ce87d16bc689f3.js +0 -1
  442. package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-55ce87d16bc689f3.js +0 -1
  443. package/.next/standalone/.next/static/chunks/app/api/api-keys/route-55ce87d16bc689f3.js +0 -1
  444. package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-55ce87d16bc689f3.js +0 -1
  445. package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-55ce87d16bc689f3.js +0 -1
  446. package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-55ce87d16bc689f3.js +0 -1
  447. package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-55ce87d16bc689f3.js +0 -1
  448. package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-55ce87d16bc689f3.js +0 -1
  449. package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-55ce87d16bc689f3.js +0 -1
  450. package/.next/standalone/.next/static/chunks/app/api/auth/me/route-55ce87d16bc689f3.js +0 -1
  451. package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-55ce87d16bc689f3.js +0 -1
  452. package/.next/standalone/.next/static/chunks/app/api/comments/route-55ce87d16bc689f3.js +0 -1
  453. package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-55ce87d16bc689f3.js +0 -1
  454. package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-55ce87d16bc689f3.js +0 -1
  455. package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-55ce87d16bc689f3.js +0 -1
  456. package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-55ce87d16bc689f3.js +0 -1
  457. package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-55ce87d16bc689f3.js +0 -1
  458. package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-55ce87d16bc689f3.js +0 -1
  459. package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-55ce87d16bc689f3.js +0 -1
  460. package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-55ce87d16bc689f3.js +0 -1
  461. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-55ce87d16bc689f3.js +0 -1
  462. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/repoint/route-55ce87d16bc689f3.js +0 -1
  463. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-55ce87d16bc689f3.js +0 -1
  464. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-55ce87d16bc689f3.js +0 -1
  465. package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-55ce87d16bc689f3.js +0 -1
  466. package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-55ce87d16bc689f3.js +0 -1
  467. package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-55ce87d16bc689f3.js +0 -1
  468. package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-55ce87d16bc689f3.js +0 -1
  469. package/.next/standalone/.next/static/chunks/app/api/events/route-55ce87d16bc689f3.js +0 -1
  470. package/.next/standalone/.next/static/chunks/app/api/health/route-55ce87d16bc689f3.js +0 -1
  471. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-55ce87d16bc689f3.js +0 -1
  472. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-55ce87d16bc689f3.js +0 -1
  473. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-55ce87d16bc689f3.js +0 -1
  474. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-55ce87d16bc689f3.js +0 -1
  475. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-55ce87d16bc689f3.js +0 -1
  476. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-55ce87d16bc689f3.js +0 -1
  477. package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/wake-preview/route-55ce87d16bc689f3.js +0 -1
  478. package/.next/standalone/.next/static/chunks/app/api/ideas/conversational/route-55ce87d16bc689f3.js +0 -1
  479. package/.next/standalone/.next/static/chunks/app/api/mcp/route-55ce87d16bc689f3.js +0 -1
  480. package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-55ce87d16bc689f3.js +0 -1
  481. package/.next/standalone/.next/static/chunks/app/api/mentionables/route-55ce87d16bc689f3.js +0 -1
  482. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-55ce87d16bc689f3.js +0 -1
  483. package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-55ce87d16bc689f3.js +0 -1
  484. package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-55ce87d16bc689f3.js +0 -1
  485. package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-55ce87d16bc689f3.js +0 -1
  486. package/.next/standalone/.next/static/chunks/app/api/notifications/route-55ce87d16bc689f3.js +0 -1
  487. package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-55ce87d16bc689f3.js +0 -1
  488. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-55ce87d16bc689f3.js +0 -1
  489. package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-55ce87d16bc689f3.js +0 -1
  490. package/.next/standalone/.next/static/chunks/app/api/project-groups/route-55ce87d16bc689f3.js +0 -1
  491. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-55ce87d16bc689f3.js +0 -1
  492. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-55ce87d16bc689f3.js +0 -1
  493. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-55ce87d16bc689f3.js +0 -1
  494. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-55ce87d16bc689f3.js +0 -1
  495. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-55ce87d16bc689f3.js +0 -1
  496. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-55ce87d16bc689f3.js +0 -1
  497. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-55ce87d16bc689f3.js +0 -1
  498. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-55ce87d16bc689f3.js +0 -1
  499. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-55ce87d16bc689f3.js +0 -1
  500. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/resource-graph/route-55ce87d16bc689f3.js +0 -1
  501. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-55ce87d16bc689f3.js +0 -1
  502. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-55ce87d16bc689f3.js +0 -1
  503. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-55ce87d16bc689f3.js +0 -1
  504. package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-55ce87d16bc689f3.js +0 -1
  505. package/.next/standalone/.next/static/chunks/app/api/projects/route-55ce87d16bc689f3.js +0 -1
  506. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-55ce87d16bc689f3.js +0 -1
  507. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-55ce87d16bc689f3.js +0 -1
  508. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-55ce87d16bc689f3.js +0 -1
  509. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-55ce87d16bc689f3.js +0 -1
  510. package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-55ce87d16bc689f3.js +0 -1
  511. package/.next/standalone/.next/static/chunks/app/api/references/[uuid]/route-55ce87d16bc689f3.js +0 -1
  512. package/.next/standalone/.next/static/chunks/app/api/references/route-55ce87d16bc689f3.js +0 -1
  513. package/.next/standalone/.next/static/chunks/app/api/search/route-55ce87d16bc689f3.js +0 -1
  514. package/.next/standalone/.next/static/chunks/app/api/session/route-55ce87d16bc689f3.js +0 -1
  515. package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-55ce87d16bc689f3.js +0 -1
  516. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-55ce87d16bc689f3.js +0 -1
  517. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-55ce87d16bc689f3.js +0 -1
  518. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-55ce87d16bc689f3.js +0 -1
  519. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-55ce87d16bc689f3.js +0 -1
  520. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-55ce87d16bc689f3.js +0 -1
  521. package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-55ce87d16bc689f3.js +0 -1
  522. package/.next/standalone/.next/static/css/5f09fa856a63632f.css +0 -1
  523. /package/.next/standalone/.next/static/{C9o43aSSZ0ebgki6mQ0-b → 3R5zOQKwCZOVs9-BjIVqk}/_ssgManifest.js +0 -0
package/README.zh.md CHANGED
@@ -1,5 +1,5 @@
1
1
  <p align="center">
2
- <img src="docs/images/chorus-slug.png" alt="Chorus" width="240" />
2
+ <img src="packages/landing/public/images/chorus-slug.png" alt="Chorus" width="240" />
3
3
  </p>
4
4
 
5
5
  <p align="center"><strong>面向 AI 与人类协作的 Agent Harness</strong></p>
@@ -171,7 +171,7 @@ daemon 启动时的横幅会打印它**实际读取的 `daemon.json` 路径**(
171
171
 
172
172
  ### 远程唤醒 Agent——派活到指定目录,实时看它跑
173
173
 
174
- ![远程唤醒 Agent](docs/images/agent-daemon-wake.gif)
174
+ ![远程唤醒 Agent](packages/landing/public/images/agent-daemon-wake.gif)
175
175
 
176
176
  把一条想法派给远程 Agent 的某个目录,打开对话窗口,就能实时看到本地的 Claude Code 接活、开跑,全程不用碰终端,也不用手动 resume。
177
177
 
@@ -183,7 +183,7 @@ Chorus 自动把整个项目整理成一张思维导图——想法、提案、
183
183
 
184
184
  ### Proposal——AI Agent 实时生成计划
185
185
 
186
- ![Proposal Presence](docs/images/proposal-presence.gif)
186
+ ![Proposal Presence](packages/landing/public/images/proposal-presence.gif)
187
187
 
188
188
  PM Agent 分析需求并实时生成包含 PRD 和任务 DAG 的提案,Presence 指示器实时显示 Agent 活动状态。
189
189
 
@@ -195,37 +195,37 @@ PM Agent 分析需求并实时生成包含 PRD 和任务 DAG 的提案,Presenc
195
195
 
196
196
  ### Kanban——任务状态实时流转
197
197
 
198
- ![Kanban Presence](docs/images/kanban-presence.gif)
198
+ ![Kanban Presence](packages/landing/public/images/kanban-presence.gif)
199
199
 
200
200
  Kanban 看板随 Agent 工作进度自动更新,任务卡片在 To Do → In Progress → To Verify 之间实时流转。Presence 指示器高亮显示正在被操作的资源。
201
201
 
202
202
  ### 看板 & 任务 DAG
203
203
 
204
- ![Kanban & Task DAG](docs/images/kanan-dag.png)
204
+ ![Kanban & Task DAG](packages/landing/public/images/kanban-dag.png)
205
205
 
206
206
  看板追踪任务状态,DAG 展示依赖关系和并行路径,一目了然。
207
207
 
208
208
  ### Idea & 需求细化
209
209
 
210
- ![Idea & Elaboration](docs/images/idea-elaborate.png)
210
+ ![Idea & Elaboration](packages/landing/public/images/idea-elaborate.png)
211
211
 
212
212
  PM Agent 在创建 Proposal 前,通过结构化问答轮次澄清需求。面板展示 Idea 详情及已完成的细化轮次。
213
213
 
214
214
  ### 提案审阅
215
215
 
216
- ![Proposal Review](docs/images/proposal.png)
216
+ ![Proposal Review](packages/landing/public/images/proposal.png)
217
217
 
218
218
  PM Agent 生成的 Proposal 包含文档草稿和任务 DAG 草稿,Admin 在此面板审阅并决定批准或驳回。
219
219
 
220
220
  ### 验收标准——双路验证
221
221
 
222
- ![Acceptance Criteria](docs/images/task-ac.png)
222
+ ![Acceptance Criteria](packages/landing/public/images/task-ac.png)
223
223
 
224
224
  Dev Agent 自检 + Admin 独立审核,每条验收标准都有结构化的通过/失败证据。
225
225
 
226
226
  ### Universal Search——Cmd+K 全局搜索
227
227
 
228
- ![Universal Search](docs/images/universal-search.png)
228
+ ![Universal Search](packages/landing/public/images/universal-search.png)
229
229
 
230
230
  Cmd+K 命令面板,支持跨 6 种实体类型搜索。支持范围筛选(全局/项目组/单项目)、按类型切换 Tab、键盘导航。Web UI 和 AI Agent(通过 `chorus_search` MCP 工具)共享同一搜索后端。
231
231
 
@@ -393,7 +393,7 @@ PGlite 在端口 5433 运行嵌入式 PostgreSQL。数据存储在 `.pglite/`,
393
393
 
394
394
  在 Web UI 的 **Settings → Agents → Create API Key** 创建 API Key。Key 以 `cho_` 开头,仅在创建时显示一次。
395
395
 
396
- ![Create API Key](docs/images/create-key.png)
396
+ ![Create API Key](packages/landing/public/images/create-key.png)
397
397
 
398
398
  ---
399
399
 
@@ -247,6 +247,10 @@ export function parseNdjsonChunk(buffer, chunk, onObject, onWarn = () => {}) {
247
247
  export class ClaudeSpawner {
248
248
  /** @param {ClaudeSpawnerOptions} [opts] */
249
249
  constructor(opts = {}) {
250
+ this.sessionDecision = {
251
+ probeIsAuthoritative: true,
252
+ takeoverCommand: "claude --resume",
253
+ };
250
254
  this.claudePath = opts.claudePath ?? null;
251
255
  this.spawnImpl = opts.spawnImpl ?? spawn;
252
256
  this.logger = opts.logger ?? NOOP_LOGGER;
@@ -26,6 +26,11 @@ import { statSync } from "node:fs";
26
26
  import { win32 as pathWin32, posix as pathPosix } from "node:path";
27
27
  import { parseNdjsonChunk } from "./claude-spawner.mjs";
28
28
  import { getThreadId as defaultGetThreadId, setThreadId as defaultSetThreadId } from "./codex-session-map.mjs";
29
+ import {
30
+ getCodexUsageSnapshot as defaultGetUsageSnapshot,
31
+ normalizeCodexUsageEvent,
32
+ setCodexUsageSnapshot as defaultSetUsageSnapshot,
33
+ } from "./codex-usage-map.mjs";
29
34
 
30
35
  const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
31
36
 
@@ -88,9 +93,11 @@ export function buildCodexArgs({ isNew, threadId, permissionMode }) {
88
93
  */
89
94
  export function extractThreadId(obj) {
90
95
  if (!obj || typeof obj !== "object") return null;
91
- if (obj.type === "thread.started" && typeof obj.thread_id === "string") return obj.thread_id;
96
+ if (obj.type === "thread.started" && typeof obj.thread_id === "string") {
97
+ return obj.thread_id.trim() || null;
98
+ }
92
99
  if (obj.type === "session_meta" && obj.payload && typeof obj.payload.id === "string") {
93
- return obj.payload.id;
100
+ return obj.payload.id.trim() || null;
94
101
  }
95
102
  return null;
96
103
  }
@@ -163,11 +170,14 @@ export function resolveSpawnCommand(codexPath, args, platform = process.platform
163
170
  * @property {NodeJS.Platform} [platform] Injectable for tests; gates POSIX `detached`.
164
171
  * @property {(anchor: string) => string|null} [getThreadIdFn] Injectable session-map read.
165
172
  * @property {(anchor: string, threadId: string) => void} [setThreadIdFn] Injectable session-map write.
173
+ * @property {(anchor: string, threadId: string) => object|null} [getUsageSnapshotFn]
174
+ * @property {(anchor: string, threadId: string, usage: object) => void} [setUsageSnapshotFn]
166
175
  */
167
176
 
168
177
  export class CodexSpawner {
169
178
  /** @param {CodexSpawnerOptions} [opts] */
170
179
  constructor(opts = {}) {
180
+ this.sessionDecision = { probeIsAuthoritative: false };
171
181
  this.codexPath = opts.codexPath ?? null;
172
182
  this.spawnImpl = opts.spawnImpl ?? spawn;
173
183
  this.logger = opts.logger ?? NOOP_LOGGER;
@@ -176,6 +186,8 @@ export class CodexSpawner {
176
186
  this.platform = opts.platform ?? process.platform;
177
187
  this.getThreadIdFn = opts.getThreadIdFn ?? defaultGetThreadId;
178
188
  this.setThreadIdFn = opts.setThreadIdFn ?? defaultSetThreadId;
189
+ this.getUsageSnapshotFn = opts.getUsageSnapshotFn ?? defaultGetUsageSnapshot;
190
+ this.setUsageSnapshotFn = opts.setUsageSnapshotFn ?? defaultSetUsageSnapshot;
179
191
  this.resolveCodexPathFn = opts.resolveCodexPathFn ?? resolveCodexPath;
180
192
  }
181
193
 
@@ -198,6 +210,13 @@ export class CodexSpawner {
198
210
  // waker's Claude transcript probe: a recorded thread id means resume.
199
211
  const knownThreadId = anchor ? this.getThreadIdFn(anchor) : null;
200
212
  const isNew = !knownThreadId;
213
+ let previousUsage = knownThreadId
214
+ ? this.getUsageSnapshotFn(anchor, knownThreadId)
215
+ : null;
216
+ // Existing threads created before this baseline store was introduced cannot
217
+ // yield a trustworthy first delta. Seed once and omit that turn's usage
218
+ // instead of publishing the entire historical cumulative total.
219
+ let needsUsageSeed = Boolean(knownThreadId && !previousUsage);
201
220
 
202
221
  const codexPath = this.codexPath ?? this.resolveCodexPathFn();
203
222
  if (!codexPath) {
@@ -249,6 +268,7 @@ export class CodexSpawner {
249
268
 
250
269
  let stdoutBuf = "";
251
270
  let observedThreadId = knownThreadId || null;
271
+ let threadIdPersisted = false;
252
272
 
253
273
  child.stdout?.setEncoding?.("utf8");
254
274
  child.stdout?.on("data", (chunk) => {
@@ -257,10 +277,27 @@ export class CodexSpawner {
257
277
  String(chunk),
258
278
  (obj) => {
259
279
  const tid = extractThreadId(obj);
260
- if (tid) observedThreadId = tid;
280
+ if (tid) {
281
+ observedThreadId = tid;
282
+ if (isNew && anchor && !threadIdPersisted) {
283
+ threadIdPersisted = true;
284
+ this.setThreadIdFn(anchor, tid);
285
+ }
286
+ }
287
+ let delivered = obj;
288
+ if (obj?.type === "turn.completed" && obj.usage) {
289
+ delivered = needsUsageSeed
290
+ ? { ...obj, usage: null }
291
+ : normalizeCodexUsageEvent(obj, previousUsage);
292
+ if (anchor && observedThreadId) {
293
+ this.setUsageSnapshotFn(anchor, observedThreadId, obj.usage);
294
+ }
295
+ previousUsage = obj.usage;
296
+ needsUsageSeed = false;
297
+ }
261
298
  if (onMessage) {
262
299
  try {
263
- onMessage(obj);
300
+ onMessage(delivered);
264
301
  } catch (err) {
265
302
  this.logger.warn(`[Chorus] onMessage handler threw: ${err}`);
266
303
  }
@@ -285,12 +322,6 @@ export class CodexSpawner {
285
322
  if (code !== 0) {
286
323
  this.logger.warn(`[Chorus] codex exited with code ${code}`);
287
324
  }
288
- // Persist anchor→thread_id only on a fresh, successful run that produced a
289
- // new id — so a later wake for this anchor resumes it. Best-effort; the
290
- // session map swallows its own IO errors.
291
- if (code === 0 && isNew && anchor && observedThreadId) {
292
- this.setThreadIdFn(anchor, observedThreadId);
293
- }
294
325
  resolve({ sessionId: observedThreadId || anchor, exitCode: code, isNew });
295
326
  });
296
327
 
@@ -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
+ }
@@ -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
@@ -43,6 +43,7 @@ import {
43
43
  import { WAKE_ACTIONS } from "./prompts.mjs";
44
44
  import { createInterruptReporter } from "./interrupt-reporter.mjs";
45
45
  import { createTurnReporter } from "./turn-reporter.mjs";
46
+ import { createDaemonRestClient } from "./daemon-rest-client.mjs";
46
47
  import { createControlHandler } from "./control-handler.mjs";
47
48
  import { resolveSigintTimeoutMs, resolveDaemonCwds } from "./daemon-config.mjs";
48
49
  import {
@@ -205,6 +206,13 @@ export function buildDaemon(creds, deps = {}) {
205
206
  // doesn't matter. Per-connection so each path's wakes report against the right row.
206
207
  /** @type {{ connectionUuid: string|null }} */
207
208
  const connectionState = { connectionUuid: null };
209
+ const daemonRestClient = createDaemonRestClient({
210
+ url: creds.url,
211
+ apiKey: creds.apiKey,
212
+ getConnectionUuid: () => connectionState.connectionUuid,
213
+ logger,
214
+ fetchImpl: deps.fetchImpl,
215
+ });
208
216
 
209
217
  // Per-connection terminal-outcome bookkeeping (add-daemon-connection-conflict-skip).
210
218
  // `resolved` guards recordConnectionOutcome against double-counting a reconnect's
@@ -389,6 +397,7 @@ export function buildDaemon(creds, deps = {}) {
389
397
  recordConnectionOutcome(outcome, false);
390
398
  },
391
399
  onControl,
400
+ acknowledgeHeartbeat: (registration) => daemonRestClient.heartbeat(registration),
392
401
  onReconnect: backfill,
393
402
  logger,
394
403
  });
package/cli/lineage.mjs CHANGED
@@ -146,6 +146,26 @@ export class LineageResolver {
146
146
  `[Chorus] lineage: non-string directIdeaUuid for ${entityType}:${entityUuid}`
147
147
  );
148
148
  }
149
+ // A non-null ROOT idea with a null/absent DIRECT idea is a lineage gap: the wake will
150
+ // anchor the execution on the entity (task/proposal), never on the idea conversation,
151
+ // so its run shows no running indicator / Interrupt on the idea chat — permanently, for
152
+ // this class of wake. The overwhelmingly likely cause is a Chorus server that predates
153
+ // the `directIdeaUuid` field on the /root-idea endpoint. Surface it as a visible WARN
154
+ // rather than folding it into the generic success `info` below (where it is
155
+ // indistinguishable from the legitimate "no idea ancestor" outcome, root=direct=null).
156
+ // Diagnostic ONLY — we do NOT substitute the root for the missing direct idea: for a
157
+ // DERIVED child idea root ≠ direct, so falling back to root would light the PARENT
158
+ // conversation and leave the child (which owns the woken session) idle. The correct fix
159
+ // is server-side; this warn points the operator straight at it.
160
+ if (root !== null && direct === null) {
161
+ this.logger.warn(
162
+ `[Chorus] lineage: ${entityType}:${entityUuid} resolved a root idea (${root}) but NO ` +
163
+ `directIdeaUuid — this wake will anchor on the entity, not the idea conversation, ` +
164
+ `so its run will not show a running indicator / Interrupt on the idea chat. Most ` +
165
+ `likely the Chorus server predates the directIdeaUuid field on /root-idea; upgrade ` +
166
+ `the server to restore child-wake → idea-conversation matching.`
167
+ );
168
+ }
149
169
  this.logger.info(
150
170
  `[Chorus] lineage: ${entityType}:${entityUuid} → root ${root ?? "none"}, direct ${direct ?? "none"}` +
151
171
  (typeof data.resolvedVia === "string" ? ` (${data.resolvedVia})` : "")
@@ -29,6 +29,7 @@ import { fileURLToPath } from "node:url";
29
29
 
30
30
  const INITIAL_DELAY_MS = 1_000;
31
31
  const MAX_DELAY_MS = 30_000;
32
+ const WATCHDOG_TIMEOUT_MS = 75_000;
32
33
 
33
34
  const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
34
35
 
@@ -78,6 +79,8 @@ const PROCESS_STARTED_AT = new Date();
78
79
  * The event carries `{ host, cwd }` of the conflicting identity.
79
80
  * @property {() => Promise<void>} [onReconnect] Called after a reconnect so the
80
81
  * caller can back-fill notifications missed during the gap.
82
+ * @property {(registration: {connectionUuid:string,connectedAt:string}) => Promise<unknown>} [acknowledgeHeartbeat]
83
+ * Best-effort REST acknowledgment for a parsed heartbeat comment.
81
84
  * @property {string} [cwd] The working directory THIS connection serves (T3 — 单
82
85
  * daemon 多路径). A multi-path daemon runs one SseListener per declared path, each
83
86
  * self-reporting its own cwd so the server registers them as distinct connections
@@ -88,6 +91,7 @@ const PROCESS_STARTED_AT = new Date();
88
91
  * @property {typeof fetch} [fetchImpl] Injectable for tests.
89
92
  * @property {number} [initialDelayMs]
90
93
  * @property {number} [maxDelayMs]
94
+ * @property {number} [watchdogTimeoutMs] Injectable for deterministic tests only.
91
95
  */
92
96
 
93
97
  export class SseListener {
@@ -100,12 +104,14 @@ export class SseListener {
100
104
  this.onControl = opts.onControl ?? (() => {});
101
105
  this.onConflict = opts.onConflict ?? (() => {});
102
106
  this.onReconnect = opts.onReconnect ?? (async () => {});
107
+ this.acknowledgeHeartbeat = opts.acknowledgeHeartbeat ?? (async () => {});
103
108
  /** @type {string|null} The connection this stream registered as (once reported). */
104
109
  this.connectionUuid = null;
105
110
  this.logger = opts.logger ?? NOOP_LOGGER;
106
111
  this.fetchImpl = opts.fetchImpl ?? globalThis.fetch;
107
112
  this.initialDelayMs = opts.initialDelayMs ?? INITIAL_DELAY_MS;
108
113
  this.maxDelayMs = opts.maxDelayMs ?? MAX_DELAY_MS;
114
+ this.watchdogTimeoutMs = opts.watchdogTimeoutMs ?? WATCHDOG_TIMEOUT_MS;
109
115
 
110
116
  // Build the self-reporting endpoint URL once and reuse it across every
111
117
  // (re)connect, so the reconnect path always re-sends the same params.
@@ -128,6 +134,7 @@ export class SseListener {
128
134
  host: hostname(),
129
135
  cwd: this.cwd,
130
136
  startedAt: PROCESS_STARTED_AT.toISOString(),
137
+ livenessAck: "v1",
131
138
  });
132
139
  this.endpoint = `${this.url}/api/events/notifications?${params.toString()}`;
133
140
 
@@ -136,14 +143,20 @@ export class SseListener {
136
143
  this.abortController = null;
137
144
  /** @type {ReturnType<typeof setTimeout> | null} */
138
145
  this.reconnectTimer = null;
146
+ /** @type {ReturnType<typeof setTimeout> | null} */
147
+ this.watchdogTimer = null;
148
+ /** @type {{connectionUuid:string,connectedAt:string}|null} */
149
+ this.activeRegistration = null;
139
150
  this.reconnectDelay = this.initialDelayMs;
140
151
  }
141
152
 
142
153
  /** Open the SSE connection. On failure, schedules a backoff reconnect. */
143
154
  async connect() {
144
155
  this.#clearReconnectTimer();
156
+ this.#clearWatchdog();
145
157
  const abortController = new AbortController();
146
158
  this.abortController = abortController;
159
+ this.activeRegistration = null;
147
160
 
148
161
  let response;
149
162
  try {
@@ -173,6 +186,7 @@ export class SseListener {
173
186
  this.status = "connected";
174
187
  this.reconnectDelay = this.initialDelayMs;
175
188
  this.logger.info("[Chorus] SSE connection established");
189
+ this.#refreshWatchdog(abortController);
176
190
 
177
191
  if (wasReconnect) {
178
192
  try {
@@ -182,22 +196,25 @@ export class SseListener {
182
196
  }
183
197
  }
184
198
 
185
- this.#consumeStream(response.body, abortController.signal);
199
+ this.#consumeStream(response.body, abortController);
186
200
  }
187
201
 
188
202
  /** Gracefully close the connection (no reconnect). */
189
203
  disconnect() {
190
204
  this.#clearReconnectTimer();
205
+ this.#clearWatchdog();
191
206
  if (this.abortController) {
192
207
  this.abortController.abort();
193
208
  this.abortController = null;
194
209
  }
195
210
  this.status = "disconnected";
211
+ this.activeRegistration = null;
196
212
  this.logger.info("[Chorus] SSE connection closed");
197
213
  }
198
214
 
199
- /** @param {ReadableStream<Uint8Array>} body @param {AbortSignal} signal */
200
- async #consumeStream(body, signal) {
215
+ /** @param {ReadableStream<Uint8Array>} body @param {AbortController} abortController */
216
+ async #consumeStream(body, abortController) {
217
+ const signal = abortController.signal;
201
218
  const decoder = new TextDecoder();
202
219
  const reader = body.getReader();
203
220
  let buffer = "";
@@ -205,6 +222,12 @@ export class SseListener {
205
222
  while (true) {
206
223
  const { done, value } = await reader.read();
207
224
  if (done || signal.aborted) break;
225
+ // Transport activity is byte arrival, not successful SSE parsing. Refresh before
226
+ // decode so comments, partial frames, and malformed payloads all prove the stream
227
+ // is still delivering bytes.
228
+ if (value && value.byteLength > 0) {
229
+ this.#refreshWatchdog(abortController);
230
+ }
208
231
  // Strip CR on ingest so CRLF transports (`\r\n\r\n` boundaries) parse the
209
232
  // same as LF — the `\n\n` boundary scan below would otherwise never match.
210
233
  buffer += decoder.decode(value, { stream: true }).replace(/\r/g, "");
@@ -219,6 +242,7 @@ export class SseListener {
219
242
  if (signal.aborted) return;
220
243
  this.logger.warn(`[Chorus] SSE stream error: ${err}`);
221
244
  } finally {
245
+ if (this.abortController === abortController) this.#clearWatchdog();
222
246
  try {
223
247
  reader.releaseLock();
224
248
  } catch {
@@ -235,7 +259,24 @@ export class SseListener {
235
259
  #processMessage(raw) {
236
260
  for (const line of raw.split("\n")) {
237
261
  // CR already stripped on ingest. Heartbeat / comment lines start with ":".
238
- if (line.startsWith(":")) continue;
262
+ if (line.startsWith(":")) {
263
+ if (line.slice(1).trim() === "heartbeat" && this.activeRegistration) {
264
+ const registration = this.activeRegistration;
265
+ Promise.resolve()
266
+ .then(() => this.acknowledgeHeartbeat(registration))
267
+ .then((result) => {
268
+ if (result && typeof result === "object" && result.ok === false) {
269
+ // The REST client already logged the transport cause. Keep listener
270
+ // behavior best-effort and avoid adding a retry loop here.
271
+ return;
272
+ }
273
+ })
274
+ .catch((err) => {
275
+ this.logger.warn(`[Chorus] heartbeat acknowledgment failed: ${err}`);
276
+ });
277
+ }
278
+ continue;
279
+ }
239
280
  if (line.startsWith("data: ")) {
240
281
  const jsonStr = line.slice(6);
241
282
  let event;
@@ -248,8 +289,16 @@ export class SseListener {
248
289
  // The server's first data event tells us which DaemonConnection this
249
290
  // stream registered as. Capture it (for execution-state attribution) and
250
291
  // do NOT forward it as a notification — it isn't one.
251
- if (event && event.type === "connection_registered" && typeof event.connectionUuid === "string") {
292
+ if (
293
+ event &&
294
+ event.type === "connection_registered" &&
295
+ typeof event.connectionUuid === "string"
296
+ ) {
252
297
  this.connectionUuid = event.connectionUuid;
298
+ this.activeRegistration =
299
+ typeof event.connectedAt === "string"
300
+ ? { connectionUuid: event.connectionUuid, connectedAt: event.connectedAt }
301
+ : null;
253
302
  try {
254
303
  this.onConnectionId(event.connectionUuid);
255
304
  } catch (err) {
@@ -305,4 +354,32 @@ export class SseListener {
305
354
  this.reconnectTimer = null;
306
355
  }
307
356
  }
357
+
358
+ /** @param {AbortController|null} abortController */
359
+ #refreshWatchdog(abortController) {
360
+ this.#clearWatchdog();
361
+ if (!abortController || abortController.signal.aborted || this.abortController !== abortController) return;
362
+ this.watchdogTimer = setTimeout(() => {
363
+ this.watchdogTimer = null;
364
+ if (
365
+ this.abortController !== abortController ||
366
+ abortController.signal.aborted ||
367
+ this.status !== "connected"
368
+ ) {
369
+ return;
370
+ }
371
+ this.logger.warn(
372
+ `[Chorus] SSE stream received no bytes for ${this.watchdogTimeoutMs}ms; reconnecting`
373
+ );
374
+ abortController.abort();
375
+ this.#scheduleReconnect();
376
+ }, this.watchdogTimeoutMs);
377
+ }
378
+
379
+ #clearWatchdog() {
380
+ if (this.watchdogTimer !== null) {
381
+ clearTimeout(this.watchdogTimer);
382
+ this.watchdogTimer = null;
383
+ }
384
+ }
308
385
  }