@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.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +469 -440
- package/.next/standalone/.next/app-path-routes-manifest.json +49 -45
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +27 -27
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +3 -3
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +2 -2
- package/.next/standalone/.next/server/app/admin.rsc +2 -2
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route.js +5 -5
- package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route.js +2 -2
- package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/pin/route.js +1 -0
- package/.next/standalone/.next/server/app/api/project-visits/pin/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/project-visits/route.js +1 -0
- package/.next/standalone/.next/server/app/api/project-visits/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/project-visits/visit/route.js +1 -0
- package/.next/standalone/.next/server/app/api/project-visits/visit/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +2 -2
- package/.next/standalone/.next/server/app/index.rsc +2 -2
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +2 -2
- package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
- package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/callback.html +2 -2
- package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
- package/.next/standalone/.next/server/app/login.html +2 -2
- package/.next/standalone/.next/server/app/login.rsc +2 -2
- package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
- package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +2 -2
- package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects.html +2 -2
- package/.next/standalone/.next/server/app/projects.rsc +4 -4
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +4 -4
- package/.next/standalone/.next/server/app-paths-manifest.json +49 -45
- package/.next/standalone/.next/server/chunks/1114.js +1 -1
- package/.next/standalone/.next/server/chunks/1318.js +1 -0
- package/.next/standalone/.next/server/chunks/1559.js +1 -1
- package/.next/standalone/.next/server/chunks/2004.js +1 -0
- package/.next/standalone/.next/server/chunks/2112.js +1 -0
- package/.next/standalone/.next/server/chunks/{1286.js → 2282.js} +3 -3
- package/.next/standalone/.next/server/chunks/2570.js +2 -2
- package/.next/standalone/.next/server/chunks/2618.js +1 -1
- package/.next/standalone/.next/server/chunks/{6492.js → 2789.js} +2 -2
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3219.js +1 -1
- package/.next/standalone/.next/server/chunks/4070.js +1 -0
- package/.next/standalone/.next/server/chunks/457.js +1 -0
- package/.next/standalone/.next/server/chunks/4827.js +1 -1
- package/.next/standalone/.next/server/chunks/5245.js +1 -1
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6207.js +1 -1
- package/.next/standalone/.next/server/chunks/6449.js +1 -0
- package/.next/standalone/.next/server/chunks/6506.js +2 -2
- package/.next/standalone/.next/server/chunks/679.js +1 -1
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/7530.js +1 -1
- package/.next/standalone/.next/server/chunks/8540.js +1 -0
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/9213.js +1 -1
- package/.next/standalone/.next/server/chunks/9378.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/3R5zOQKwCZOVs9-BjIVqk/_buildManifest.js +1 -0
- package/.next/standalone/.next/static/chunks/{11595.7784dfe509c100a4.js → 11595.c580c5690d176cce.js} +1 -1
- package/.next/standalone/.next/static/chunks/14160-7bcee6e9e8bc5233.js +1 -0
- package/.next/standalone/.next/static/chunks/{32331-87ae9bc7517c7947.js → 18351-2a408c4f57ddb3a7.js} +1 -1
- package/.next/standalone/.next/static/chunks/24870-5b0be64361f5ef70.js +1 -0
- package/.next/standalone/.next/static/chunks/26232-110019cebde19691.js +1 -0
- package/.next/standalone/.next/static/chunks/31308-bb4a97b3f39c22dd.js +1 -0
- package/.next/standalone/.next/static/chunks/{33456.3bd7ba05bd39259b.js → 33456.c48dc366aa90b234.js} +1 -1
- package/.next/standalone/.next/static/chunks/{37985-e4683195e4ca2519.js → 33806-cb339e86820a87c4.js} +1 -1
- package/.next/standalone/.next/static/chunks/37035-514bbb31cd13bda1.js +1 -0
- package/.next/standalone/.next/static/chunks/{38526-7ffc4b7351c15bc4.js → 37938-c09acf52d7f85cb4.js} +1 -1
- package/.next/standalone/.next/static/chunks/{42605-029b5426175cdee9.js → 39479-5af3460208d8cc56.js} +1 -1
- package/.next/standalone/.next/static/chunks/{4860.4803e40814d50dd0.js → 4860.baf6a285246198af.js} +1 -1
- package/.next/standalone/.next/static/chunks/{21188-43211c9e40bf0d63.js → 60178-d6276df1c07d7735.js} +2 -2
- package/.next/standalone/.next/static/chunks/68326-924445654ed47e6f.js +1 -0
- package/.next/standalone/.next/static/chunks/78917-1498676a1ffe5ded.js +1 -0
- package/.next/standalone/.next/static/chunks/94470-1076452151689267.js +1 -0
- package/.next/standalone/.next/static/chunks/94643-7c7f2efab0640658.js +1 -0
- package/.next/standalone/.next/static/chunks/{99373.0457580c532530bc.js → 99373.ad871bd0bbfc5eb7.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-78259279cf6c6919.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-2af5f2f159c8e32b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-e5202e9b7669576c.js → page-59dcf0ba7ce877ec.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-d6c226fd56b5ebb5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-c231207c3674aa54.js → page-2c9d3f4c6e0ff807.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-20054b1cec8ed1d2.js → page-af35d50848f01875.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-cb6fdf592863833c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-596d97796dd55e2f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/{page-7948aa8db4813091.js → page-ed9415921188b4d3.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-ebf4c28014025b7b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-bbde7e85e3388813.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/page-6df01fa989cca27b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-e60bc39bf2957f77.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/comments/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/connection-heartbeat/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/repoint/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/health/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/wake-preview/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/conversational/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-visits/pin/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-visits/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-visits/visit/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/resource-graph/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/references/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/references/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/search/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/session/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-8cf720e8efb6ac7d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/{page-ece3f647133d446e.js → page-006bf9e9d6a991f1.js} +1 -1
- package/.next/standalone/.next/static/chunks/{webpack-96be8d6bd0d3d25f.js → webpack-af2cb28ef7bbd7c2.js} +1 -1
- package/.next/standalone/.next/static/css/f46eab37c942ff33.css +1 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/bin/on-post-verify-task.sh +2 -2
- package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +29 -5
- package/.next/standalone/public/chorus-plugin/bin/verify-document-roundtrip.sh +28 -0
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +17 -2
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +8 -4
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +2 -2
- package/.next/standalone/public/install-kiro.sh +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +2 -2
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +8 -4
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +2 -2
- package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +14 -1
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
- package/.next/standalone/public/kiro-plugin/bin/verify-document-roundtrip.sh +28 -0
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +2 -2
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +2 -2
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/package.json +1 -1
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +3 -3
- package/README.ja.md +10 -10
- package/README.ko.md +10 -10
- package/README.md +10 -10
- package/README.zh.md +10 -10
- package/cli/claude-spawner.mjs +4 -0
- package/cli/codex-spawner.mjs +41 -10
- package/cli/codex-usage-map.mjs +115 -0
- package/cli/daemon-rest-client.mjs +34 -3
- package/cli/daemon.mjs +9 -0
- package/cli/lineage.mjs +20 -0
- package/cli/sse-listener.mjs +82 -5
- package/cli/turn-reporter.mjs +17 -5
- package/cli/upload-hooks.mjs +337 -12
- package/cli/waker.mjs +68 -13
- package/package.json +1 -1
- package/prisma/migrations/20260718062756_add_project_visit/migration.sql +29 -0
- package/prisma/migrations/20260723014810_add_turn_relay_error/migration.sql +2 -0
- package/prisma/migrations/20260724031955_add_turn_token_usage/migration.sql +6 -0
- package/prisma/migrations/20260724082248_add_session_cache_rollup/migration.sql +3 -0
- package/prisma/schema.prisma +49 -0
- package/.next/standalone/.next/server/chunks/1173.js +0 -1
- package/.next/standalone/.next/server/chunks/2382.js +0 -1
- package/.next/standalone/.next/server/chunks/4797.js +0 -1
- package/.next/standalone/.next/server/chunks/7762.js +0 -1
- package/.next/standalone/.next/server/chunks/8062.js +0 -1
- package/.next/standalone/.next/server/chunks/8204.js +0 -1
- package/.next/standalone/.next/server/chunks/9979.js +0 -1
- package/.next/standalone/.next/static/C9o43aSSZ0ebgki6mQ0-b/_buildManifest.js +0 -1
- package/.next/standalone/.next/static/chunks/24537-ef5b301140cf3a58.js +0 -1
- package/.next/standalone/.next/static/chunks/27030-3ae1d0e29245b23e.js +0 -1
- package/.next/standalone/.next/static/chunks/28680-dff79c4467712199.js +0 -1
- package/.next/standalone/.next/static/chunks/43111-7a4e08dc82bb3022.js +0 -1
- package/.next/standalone/.next/static/chunks/4939-ff22e2b42ad57f7f.js +0 -1
- package/.next/standalone/.next/static/chunks/78917-c0a9a11fe437a752.js +0 -1
- package/.next/standalone/.next/static/chunks/84169-5beb288902aea242.js +0 -1
- package/.next/standalone/.next/static/chunks/84219-09970ab1b85c61f0.js +0 -1
- package/.next/standalone/.next/static/chunks/93346-1d4cd71b8713a8a6.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-00ff2f6753bb4603.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-5824e6affe244f83.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-d9323dc8b6c974f7.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-c83c5d1b4599e737.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-7bcaa11ee24b5754.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-278d30ee1dd7e315.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-5a22db5f8504e61d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/page-47a17dbadfbc75ad.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-7fbf5bc58d3dd5b0.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/comments/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/repoint/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/health/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/wake-preview/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/conversational/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/resource-graph/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/references/[uuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/references/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/search/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/session/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-55ce87d16bc689f3.js +0 -1
- package/.next/standalone/.next/static/css/5f09fa856a63632f.css +0 -1
- /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="
|
|
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
|
-

|
|
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
|
-

|
|
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
|
-

|
|
199
199
|
|
|
200
200
|
Kanban 看板随 Agent 工作进度自动更新,任务卡片在 To Do → In Progress → To Verify 之间实时流转。Presence 指示器高亮显示正在被操作的资源。
|
|
201
201
|
|
|
202
202
|
### 看板 & 任务 DAG
|
|
203
203
|
|
|
204
|
-

|
|
205
205
|
|
|
206
206
|
看板追踪任务状态,DAG 展示依赖关系和并行路径,一目了然。
|
|
207
207
|
|
|
208
208
|
### Idea & 需求细化
|
|
209
209
|
|
|
210
|
-

|
|
211
211
|
|
|
212
212
|
PM Agent 在创建 Proposal 前,通过结构化问答轮次澄清需求。面板展示 Idea 详情及已完成的细化轮次。
|
|
213
213
|
|
|
214
214
|
### 提案审阅
|
|
215
215
|
|
|
216
|
-

|
|
217
217
|
|
|
218
218
|
PM Agent 生成的 Proposal 包含文档草稿和任务 DAG 草稿,Admin 在此面板审阅并决定批准或驳回。
|
|
219
219
|
|
|
220
220
|
### 验收标准——双路验证
|
|
221
221
|
|
|
222
|
-

|
|
223
223
|
|
|
224
224
|
Dev Agent 自检 + Admin 独立审核,每条验收标准都有结构化的通过/失败证据。
|
|
225
225
|
|
|
226
226
|
### Universal Search——Cmd+K 全局搜索
|
|
227
227
|
|
|
228
|
-

|
|
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
|
-

|
|
397
397
|
|
|
398
398
|
---
|
|
399
399
|
|
package/cli/claude-spawner.mjs
CHANGED
|
@@ -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;
|
package/cli/codex-spawner.mjs
CHANGED
|
@@ -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")
|
|
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)
|
|
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(
|
|
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).
|
|
140
|
-
*
|
|
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})` : "")
|
package/cli/sse-listener.mjs
CHANGED
|
@@ -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
|
|
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 {
|
|
200
|
-
async #consumeStream(body,
|
|
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(":"))
|
|
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 (
|
|
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
|
}
|