@chorus-aidlc/chorus 0.18.0 → 0.18.1
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 +320 -318
- package/.next/standalone/.next/app-path-routes-manifest.json +33 -33
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +30 -30
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/directory-request/report/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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/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_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_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
- 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]/agent-cwds/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/agent-cwd-options/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 +3 -3
- 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 +33 -33
- package/.next/standalone/.next/server/chunks/1318.js +1 -1
- package/.next/standalone/.next/server/chunks/{5201.js → 1416.js} +2 -2
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/{4810.js → 2195.js} +1 -1
- package/.next/standalone/.next/server/chunks/2460.js +1 -0
- package/.next/standalone/.next/server/chunks/2572.js +2 -2
- package/.next/standalone/.next/server/chunks/2758.js +1 -0
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3112.js +1 -1
- package/.next/standalone/.next/server/chunks/3419.js +1 -1
- package/.next/standalone/.next/server/chunks/4066.js +1 -0
- package/.next/standalone/.next/server/chunks/5245.js +1 -1
- package/.next/standalone/.next/server/chunks/5453.js +1 -1
- package/.next/standalone/.next/server/chunks/5489.js +1 -1
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6506.js +1 -1
- package/.next/standalone/.next/server/chunks/6737.js +1 -1
- package/.next/standalone/.next/server/chunks/6753.js +3 -3
- 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/7578.js +2 -2
- package/.next/standalone/.next/server/chunks/7675.js +1 -0
- package/.next/standalone/.next/server/chunks/7789.js +1 -0
- package/.next/standalone/.next/server/chunks/{3619.js → 8030.js} +2 -2
- 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/chunks/9931.js +1 -1
- package/.next/standalone/.next/server/instrumentation.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/chunks/11595.f080a1d100972212.js +1 -0
- package/.next/standalone/.next/static/chunks/14628-283d3983d1fb36c9.js +1 -0
- package/.next/standalone/.next/static/chunks/{29305-f587e7e81bc0b200.js → 17562-56f932146e9e6c94.js} +4 -4
- package/.next/standalone/.next/static/chunks/25080-25ad29e64c855338.js +1 -0
- package/.next/standalone/.next/static/chunks/28698-7fb271ffc6e63a26.js +1 -0
- package/.next/standalone/.next/static/chunks/32736-aeaaa1e4c4d5529b.js +1 -0
- package/.next/standalone/.next/static/chunks/33456.20313bd67a5c41cc.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.3b555a398cdffb19.js +1 -0
- package/.next/standalone/.next/static/chunks/75257-99c0ce24b436847b.js +1 -0
- package/.next/standalone/.next/static/chunks/79919-0c6dcda1dd8646f0.js +1 -0
- package/.next/standalone/.next/static/chunks/91328-f501e3c3ca519a92.js +1 -0
- package/.next/standalone/.next/static/chunks/94643-e54eff17e941a93b.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.b8a95d1bec5ad4e7.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-f3c6431432d42c7c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-b45c42c536eff64b.js → page-5d723f974bdad33b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-8d3b1f4d8b76d66c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-800a979f12b73f27.js → page-57c698dea2fa6e29.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-34de35f75aa71f6d.js → page-d2bb622855e746f1.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-fc255dc3612032b9.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-e8030824994edf35.js → page-f032ee8a80d1f56a.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-46a0ddfd0421b0a8.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-349b0977f3c6209a.js → page-3a83748ce0ae1c4f.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-be43cb06112fce12.js → page-8af9bb9f96ab0258.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-b02939820affdae5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/page-d2c0c7951114e763.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-cfb63dd1b416c92e.js → webpack-de8a36d232a91d6b.js} +1 -1
- package/.next/standalone/.next/static/css/44f13b43a3de716d.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/chorus-api.sh +1 -1
- package/.next/standalone/public/chorus-plugin/bin/on-pre-spawn-agent.sh +22 -9
- package/.next/standalone/public/chorus-plugin/bin/on-subagent-start.sh +44 -29
- package/.next/standalone/public/chorus-plugin/bin/on-subagent-stop.sh +100 -29
- package/.next/standalone/public/chorus-plugin/bin/test-syntax.sh +6 -2
- package/.next/standalone/public/chorus-plugin/bin/tests/test-subagent-session-name.sh +599 -0
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +1 -1
- 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/spec-lite/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +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-cli/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
- 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 +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +1 -1
- 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-spec-lite/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
- package/README.ja.md +1 -1
- package/README.ko.md +1 -1
- package/README.md +1 -1
- package/README.zh.md +1 -1
- package/chorus.mjs +30 -2
- package/cli/child-exit.mjs +77 -0
- package/cli/claude-spawner.mjs +4 -1
- package/cli/codex-spawner.mjs +4 -1
- package/cli/control-handler.mjs +104 -6
- package/cli/daemon-rest-client.mjs +98 -29
- package/cli/daemon.mjs +5 -1
- package/cli/dsh-spawner.mjs +4 -1
- package/cli/kiro-spawner.mjs +4 -1
- package/cli/pi-spawner.mjs +4 -1
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/109.js +0 -1
- package/.next/standalone/.next/server/chunks/1496.js +0 -1
- package/.next/standalone/.next/server/chunks/731.js +0 -1
- package/.next/standalone/.next/server/chunks/7857.js +0 -1
- package/.next/standalone/.next/static/chunks/11595.0afa1a540f681fb4.js +0 -1
- package/.next/standalone/.next/static/chunks/22705-324a191727ae45b7.js +0 -1
- package/.next/standalone/.next/static/chunks/33456.4a5f4712a7e78d8f.js +0 -1
- package/.next/standalone/.next/static/chunks/44216-3876e84f5b02d355.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.5719e32b95be2d93.js +0 -1
- package/.next/standalone/.next/static/chunks/6528-a8a562ef7d26bb43.js +0 -1
- package/.next/standalone/.next/static/chunks/67439-7b339b28ed0ecfc6.js +0 -1
- package/.next/standalone/.next/static/chunks/79919-ae8bd8d8ec1e38ce.js +0 -1
- package/.next/standalone/.next/static/chunks/82203-4ce5926624df7ed0.js +0 -1
- package/.next/standalone/.next/static/chunks/94643-37ac7b8ef8ea5e75.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.6c1509bfaf599741.js +0 -1
- package/.next/standalone/.next/static/chunks/99775-697e82ee04eac6b1.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-2fda722cdace8147.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-792aba7fd6b6daa3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-a16002aa2a911619.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-4f7f1ddbaf79be8f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-6916e1abab42a6e6.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-c0090caae202eae5.js +0 -1
- package/.next/standalone/.next/static/css/75c761a5428611fa.css +0 -1
- /package/.next/standalone/.next/static/{IxKVu5zkFPTjSKAUR99yH → dot63ILT878Tloqi7Czj_}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{IxKVu5zkFPTjSKAUR99yH → dot63ILT878Tloqi7Czj_}/_ssgManifest.js +0 -0
|
@@ -283,7 +283,7 @@ cmd_mcp_tool() {
|
|
|
283
283
|
# Step 1: Initialize MCP session
|
|
284
284
|
local init_payload
|
|
285
285
|
init_payload=$(cat <<JSONEOF
|
|
286
|
-
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"chorus-hook","version":"0.18.
|
|
286
|
+
{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2025-03-26","capabilities":{},"clientInfo":{"name":"chorus-hook","version":"0.18.1"}}}
|
|
287
287
|
JSONEOF
|
|
288
288
|
)
|
|
289
289
|
|
package/README.ja.md
CHANGED
package/README.ko.md
CHANGED
package/README.md
CHANGED
|
@@ -63,7 +63,7 @@ The labels under each stage are the **permissions** an actor needs there — gra
|
|
|
63
63
|
Two commands. No database, no Docker, no config files.
|
|
64
64
|
|
|
65
65
|
```bash
|
|
66
|
-
npm install -g @chorus-aidlc/chorus@0.18.
|
|
66
|
+
npm install -g @chorus-aidlc/chorus@0.18.1
|
|
67
67
|
chorus
|
|
68
68
|
```
|
|
69
69
|
|
package/README.zh.md
CHANGED
package/chorus.mjs
CHANGED
|
@@ -315,11 +315,39 @@ function isPortOccupied(host, tcpPort, timeoutMs = 1000) {
|
|
|
315
315
|
});
|
|
316
316
|
}
|
|
317
317
|
|
|
318
|
+
// Publicly known placeholder secrets (GitHub #559). Must stay identical to
|
|
319
|
+
// KNOWN_INSECURE_SECRETS in src/lib/secret-check.ts and
|
|
320
|
+
// CHORUS_KNOWN_INSECURE_SECRETS in docker/ensure-secret.sh (parity-tested).
|
|
321
|
+
const KNOWN_INSECURE_SECRETS = [
|
|
322
|
+
"chorus-docker-secret-change-in-production",
|
|
323
|
+
"chorus-local-secret",
|
|
324
|
+
"your-secret-key-change-in-production",
|
|
325
|
+
"change-me-to-a-random-secret",
|
|
326
|
+
];
|
|
327
|
+
|
|
318
328
|
function ensureSecret() {
|
|
319
329
|
const secretPath = join(dataDir, ".secret");
|
|
320
|
-
|
|
330
|
+
const fromEnv = process.env.NEXTAUTH_SECRET;
|
|
331
|
+
if (fromEnv) {
|
|
332
|
+
if (!KNOWN_INSECURE_SECRETS.includes(fromEnv.trim())) return;
|
|
333
|
+
// A pasted placeholder is treated exactly like "unset": fall through to the
|
|
334
|
+
// persisted / generated secret instead of signing JWTs with a public value.
|
|
335
|
+
console.error(
|
|
336
|
+
"WARNING: NEXTAUTH_SECRET is set to a publicly known placeholder (GitHub #559); ignoring it and using the persisted secret in " +
|
|
337
|
+
secretPath
|
|
338
|
+
);
|
|
339
|
+
}
|
|
321
340
|
if (existsSync(secretPath)) {
|
|
322
|
-
|
|
341
|
+
// Fail closed, matching docker/ensure-secret.sh: a persisted file that is
|
|
342
|
+
// empty or holds a publicly known placeholder must never be exported.
|
|
343
|
+
const persisted = readFileSync(secretPath, "utf8").trim();
|
|
344
|
+
if (!persisted || KNOWN_INSECURE_SECRETS.includes(persisted)) {
|
|
345
|
+
console.error(
|
|
346
|
+
`ERROR: the secret persisted at ${secretPath} is ${persisted ? "a publicly known placeholder" : "empty"} (GitHub #559); refusing to start — delete the file to regenerate, or set NEXTAUTH_SECRET explicitly.`
|
|
347
|
+
);
|
|
348
|
+
process.exit(1);
|
|
349
|
+
}
|
|
350
|
+
process.env.NEXTAUTH_SECRET = persisted;
|
|
323
351
|
return;
|
|
324
352
|
}
|
|
325
353
|
const secret = createHash("sha256")
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
// cli/child-exit.mjs
|
|
2
|
+
// One shared settlement path for every spawner's child process, so the five
|
|
3
|
+
// backends (pi / claude / codex / kiro / dsh) cannot drift on "when is the wake
|
|
4
|
+
// over?".
|
|
5
|
+
//
|
|
6
|
+
// WHY THIS EXISTS — `close` is not the same event as "the agent finished".
|
|
7
|
+
// Node emits `exit` when the child process itself is reaped, but `close` only
|
|
8
|
+
// once every stdio stream the child was given has been closed. A child that
|
|
9
|
+
// leaves a DETACHED DESCENDANT behind (a backgrounded server, a `nohup`'d
|
|
10
|
+
// helper) hands that descendant the SAME inherited pipes, so the pipes stay
|
|
11
|
+
// open after the child is long gone and `close` may never fire. A spawner that
|
|
12
|
+
// waits only for `close` therefore keeps reporting a finished wake as still
|
|
13
|
+
// `running` — the phantom `running` turn. Settling on `exit` fixes that.
|
|
14
|
+
//
|
|
15
|
+
// !!! THE GRACE IS NOT A WAKE TIMEOUT AND NOT A WATCHDOG !!!
|
|
16
|
+
// `stdioGraceMs` only starts counting AFTER the child process has ALREADY
|
|
17
|
+
// EXITED, and it bounds one thing only: how long we wait for that dead
|
|
18
|
+
// process's pipes to drain so a final stdout chunk is still parsed. It places
|
|
19
|
+
// no limit whatsoever on how long an agent may run — a wake that runs for
|
|
20
|
+
// hours is never interrupted, cancelled or "timed out" by this module. No
|
|
21
|
+
// wake-duration limit is introduced anywhere here; do not repurpose this timer
|
|
22
|
+
// into one.
|
|
23
|
+
|
|
24
|
+
/** Grace for an already-exited process's pipes to drain. NOT a wake timeout. */
|
|
25
|
+
export const DEFAULT_STDIO_GRACE_MS = 2000;
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Resolve once with the child's exit code as soon as the process is KNOWN to be gone.
|
|
29
|
+
*
|
|
30
|
+
* • `close` first → resolve immediately (today's behaviour, zero regression).
|
|
31
|
+
* • `exit` first → wait up to `stdioGraceMs` for `close` (so a last stdout chunk
|
|
32
|
+
* is still parsed), then resolve with the exit code anyway.
|
|
33
|
+
*
|
|
34
|
+
* Settles exactly once and NEVER rejects. The grace timer is `unref`'d so it can
|
|
35
|
+
* never hold the daemon's event loop open.
|
|
36
|
+
*
|
|
37
|
+
* @param {import("node:child_process").ChildProcess} child
|
|
38
|
+
* @param {{ stdioGraceMs?: number, logger?: { warn?: (msg: string) => void }, label?: string }} [options]
|
|
39
|
+
* @returns {Promise<number | null>} the exit code (`null` when the child was signalled)
|
|
40
|
+
*/
|
|
41
|
+
export function awaitChildSettled(child, options = {}) {
|
|
42
|
+
const { stdioGraceMs = DEFAULT_STDIO_GRACE_MS, logger, label = "child" } = options;
|
|
43
|
+
|
|
44
|
+
return new Promise((resolve) => {
|
|
45
|
+
let settled = false;
|
|
46
|
+
let timer = null;
|
|
47
|
+
|
|
48
|
+
const settle = (code) => {
|
|
49
|
+
if (settled) return;
|
|
50
|
+
settled = true;
|
|
51
|
+
if (timer) {
|
|
52
|
+
clearTimeout(timer);
|
|
53
|
+
timer = null;
|
|
54
|
+
}
|
|
55
|
+
resolve(code ?? null);
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
child.on?.("close", (code) => settle(code));
|
|
59
|
+
|
|
60
|
+
child.on?.("exit", (code) => {
|
|
61
|
+
if (settled || timer) return;
|
|
62
|
+
// The process is gone; give its (possibly descendant-held) pipes a bounded
|
|
63
|
+
// moment to drain, then settle regardless. See the header: not a timeout.
|
|
64
|
+
timer = setTimeout(() => {
|
|
65
|
+
timer = null;
|
|
66
|
+
if (settled) return;
|
|
67
|
+
logger?.warn?.(
|
|
68
|
+
`[Chorus] ${label} exited (code ${code ?? null}) but stdio stayed open for ` +
|
|
69
|
+
`${stdioGraceMs}ms; settling on exit`
|
|
70
|
+
);
|
|
71
|
+
settle(code);
|
|
72
|
+
}, stdioGraceMs);
|
|
73
|
+
// Never keep the daemon's event loop alive for a dead process's pipes.
|
|
74
|
+
timer?.unref?.();
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}
|
package/cli/claude-spawner.mjs
CHANGED
|
@@ -28,6 +28,7 @@ import { validateAgentCliConfig, overlayAgentEnv, getAgentEnv, assertConfiguredS
|
|
|
28
28
|
import { existsSync, statSync } from "node:fs";
|
|
29
29
|
import { homedir } from "node:os";
|
|
30
30
|
import { win32 as pathWin32, posix as pathPosix, join as pathJoin } from "node:path";
|
|
31
|
+
import { awaitChildSettled } from "./child-exit.mjs";
|
|
31
32
|
|
|
32
33
|
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
33
34
|
|
|
@@ -447,7 +448,9 @@ export class ClaudeSpawner {
|
|
|
447
448
|
resolve({ sessionId: observedSessionId, backendSessionId: id, exitCode: null, isNew });
|
|
448
449
|
});
|
|
449
450
|
|
|
450
|
-
|
|
451
|
+
// Settle on process exit, not only on stdio close: a detached descendant can
|
|
452
|
+
// inherit the pipes and keep `close` from ever firing (see cli/child-exit.mjs).
|
|
453
|
+
awaitChildSettled(child, { logger: this.logger, label: "claude" }).then((code) => {
|
|
451
454
|
if (code !== 0) {
|
|
452
455
|
this.logger.warn(`[Chorus] claude exited with code ${code}`);
|
|
453
456
|
}
|
package/cli/codex-spawner.mjs
CHANGED
|
@@ -33,6 +33,7 @@ import { readFileSync, statSync } from "node:fs";
|
|
|
33
33
|
import { homedir } from "node:os";
|
|
34
34
|
import { join, win32 as pathWin32, posix as pathPosix } from "node:path";
|
|
35
35
|
import { parseNdjsonChunk } from "./claude-spawner.mjs";
|
|
36
|
+
import { awaitChildSettled } from "./child-exit.mjs";
|
|
36
37
|
import { getThreadId as defaultGetThreadId, setThreadId as defaultSetThreadId } from "./codex-session-map.mjs";
|
|
37
38
|
import {
|
|
38
39
|
getCodexUsageSnapshot as defaultGetUsageSnapshot,
|
|
@@ -370,7 +371,9 @@ export class CodexSpawner {
|
|
|
370
371
|
resolve({ sessionId: anchor, backendSessionId: observedThreadId, exitCode: null, isNew });
|
|
371
372
|
});
|
|
372
373
|
|
|
373
|
-
|
|
374
|
+
// Settle on process exit, not only on stdio close: a detached descendant can
|
|
375
|
+
// inherit the pipes and keep `close` from ever firing (see cli/child-exit.mjs).
|
|
376
|
+
awaitChildSettled(child, { logger: this.logger, label: "codex" }).then((code) => {
|
|
374
377
|
if (code !== 0) {
|
|
375
378
|
this.logger.warn(`[Chorus] codex exited with code ${code}`);
|
|
376
379
|
}
|
package/cli/control-handler.mjs
CHANGED
|
@@ -12,6 +12,17 @@
|
|
|
12
12
|
// so a stale / recycled connection uuid can never make the daemon kill the wrong
|
|
13
13
|
// subprocess (Tech Design "Risks": mis-kill after a reconnect).
|
|
14
14
|
//
|
|
15
|
+
// When Check-2 fails for an `interrupt` (no live child here) the command is NOT
|
|
16
|
+
// silently dropped (fix-phantom-running-turn, Tech Design "D — a no-child interrupt
|
|
17
|
+
// reports the truth"): the handler logs the miss AND fire-and-forgets one
|
|
18
|
+
// `advanceTurn({ status: "interrupted", interruptedReason: "user" })` so a server-side
|
|
19
|
+
// `running` turn with no daemon child behind it converges instead of hanging forever.
|
|
20
|
+
// The session business key is derived without any lookup, and therefore only for the
|
|
21
|
+
// two control entity types where the derivation is an identity (`idea`,
|
|
22
|
+
// `daemon_session` → sessionId === entityUuid). `task` / `proposal` / `document` keep
|
|
23
|
+
// the pure-log behaviour: their session is anchored on the resource's DIRECT idea,
|
|
24
|
+
// which the daemon cannot resolve locally, and guessing would converge the wrong turn.
|
|
25
|
+
//
|
|
15
26
|
// On a verified match it (a) sets a per-entity "interrupting" flag on the waker so
|
|
16
27
|
// the waker reports the resulting exit as interrupted(reason="user") rather than a
|
|
17
28
|
// crash, then (b) invokes the injected killer (process-killer.killProcessTree) on
|
|
@@ -25,6 +36,16 @@ import { killProcessTree } from "./process-killer.mjs";
|
|
|
25
36
|
|
|
26
37
|
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
27
38
|
|
|
39
|
+
/**
|
|
40
|
+
* Control entity types whose session business key is the entityUuid itself, so a
|
|
41
|
+
* no-child interrupt can report the turn terminal WITHOUT any REST lookup:
|
|
42
|
+
* • `idea` — the session anchor IS the direct idea uuid.
|
|
43
|
+
* • `daemon_session` — the ad-hoc session's own business id.
|
|
44
|
+
* Every other member of CONTROL_ENTITY_TYPES (`task`, `proposal`, `document`) is
|
|
45
|
+
* anchored on that resource's DIRECT idea, which is not derivable locally.
|
|
46
|
+
*/
|
|
47
|
+
const SELF_ANCHORED_ENTITY_TYPES = new Set(["idea", "daemon_session"]);
|
|
48
|
+
|
|
28
49
|
/**
|
|
29
50
|
* Build the `onControl(event)` callback the SseListener invokes for a
|
|
30
51
|
* `type:"control"` event.
|
|
@@ -56,6 +77,15 @@ const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
|
56
77
|
* other still-pending turn along. Injected by the
|
|
57
78
|
* daemon (`backfill.pendingTurnsOnly`); the
|
|
58
79
|
* arg-less form (reconnect) still sweeps all.
|
|
80
|
+
* advanceTurn?: (params: { sessionId: string, status: string, interruptedReason?: string,
|
|
81
|
+
* entityType?: string|null, entityUuid?: string|null }) => any,
|
|
82
|
+
* The SAME `createTurnReporter(...)` instance the
|
|
83
|
+
* waker uses (injected by `cli/daemon.mjs`; no
|
|
84
|
+
* second transport, no new endpoint). Invoked
|
|
85
|
+
* fire-and-forget ONLY when an `interrupt` finds no
|
|
86
|
+
* live child for a self-anchored entity type, to
|
|
87
|
+
* close a server-side `running` turn that nothing
|
|
88
|
+
* else would ever close.
|
|
59
89
|
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
60
90
|
* }} deps
|
|
61
91
|
* @returns {(event: any) => void} The onControl callback (synchronous, non-throwing).
|
|
@@ -67,6 +97,7 @@ export function createControlHandler(deps) {
|
|
|
67
97
|
const sigintTimeoutMs = deps.sigintTimeoutMs;
|
|
68
98
|
const redispatchResume = deps.redispatchResume;
|
|
69
99
|
const deliverTurn = deps.deliverTurn;
|
|
100
|
+
const advanceTurn = deps.advanceTurn;
|
|
70
101
|
const handleDirectoryRequest = deps.handleDirectoryRequest;
|
|
71
102
|
const reportDirectoryRequest = deps.reportDirectoryRequest;
|
|
72
103
|
const logger = deps.logger ?? NOOP_LOGGER;
|
|
@@ -202,11 +233,76 @@ export function createControlHandler(deps) {
|
|
|
202
233
|
}
|
|
203
234
|
|
|
204
235
|
// --- interrupt path: Check 2 — in-memory entity ownership (running child) ---
|
|
236
|
+
//
|
|
237
|
+
// The registry is keyed by the WAKE's own resource (`task:T`), while a
|
|
238
|
+
// conversation's control key is its session anchor (`idea:A`). A wake on a CHILD
|
|
239
|
+
// resource of idea A runs on session A (waker: `sessionId = directIdeaUuid`), so an
|
|
240
|
+
// `idea:A` interrupt must also find a running `task:T` / `proposal:P` / `document:D`
|
|
241
|
+
// entry whose `directIdeaUuid` is A — the same rule the UI's `executionMatchesSession`
|
|
242
|
+
// applies. Without this the exact-key lookup misses, we report a turn miss, the
|
|
243
|
+
// server's FIFO resolution grabs the SIBLING wake's `running` turn, and NOTHING is
|
|
244
|
+
// killed: the UI would say interrupted while the agent keeps working.
|
|
205
245
|
const key = execKey(entityType, entityUuid);
|
|
206
|
-
|
|
246
|
+
let entry = waker?.executions?.get(key);
|
|
247
|
+
// The entity the kill actually targets — normally the command's own, but a sibling
|
|
248
|
+
// wake when the match below re-points it.
|
|
249
|
+
let killEntityType = entityType;
|
|
250
|
+
let killEntityUuid = entityUuid;
|
|
251
|
+
let killKey = key;
|
|
252
|
+
if ((!entry || entry.status !== "running" || !entry.child) && entityType === "idea") {
|
|
253
|
+
for (const candidate of waker?.executions?.values() ?? []) {
|
|
254
|
+
if (
|
|
255
|
+
candidate.status === "running" &&
|
|
256
|
+
candidate.child &&
|
|
257
|
+
candidate.directIdeaUuid === entityUuid
|
|
258
|
+
) {
|
|
259
|
+
killEntityType = candidate.entityType;
|
|
260
|
+
killEntityUuid = candidate.entityUuid;
|
|
261
|
+
killKey = execKey(killEntityType, killEntityUuid);
|
|
262
|
+
logger.info(
|
|
263
|
+
`[Chorus] control: no direct child for ${key}, but sibling wake ${killKey} ` +
|
|
264
|
+
`runs on this session; interrupting that instead`
|
|
265
|
+
);
|
|
266
|
+
entry = candidate;
|
|
267
|
+
break;
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
}
|
|
207
271
|
if (!entry || entry.status !== "running" || !entry.child) {
|
|
208
272
|
// Either we never ran this entity, it's only queued (no child yet), or the
|
|
209
|
-
// wake already finished (race: interrupt arrived after exit).
|
|
273
|
+
// wake already finished (race: interrupt arrived after exit). There is nothing
|
|
274
|
+
// to kill — but the SERVER may still hold a `running` turn for this session
|
|
275
|
+
// that nothing else will ever close (the phantom-running-turn bug). Report it
|
|
276
|
+
// terminal so the UI converges. Only for the self-anchored entity types; for
|
|
277
|
+
// the rest we cannot know the session locally, so keep the old pure log.
|
|
278
|
+
if (SELF_ANCHORED_ENTITY_TYPES.has(entityType)) {
|
|
279
|
+
logger.info(
|
|
280
|
+
`[Chorus] control: no running subprocess for ${key} on this daemon; ` +
|
|
281
|
+
`reporting the turn as interrupted(user)`
|
|
282
|
+
);
|
|
283
|
+
// Fire-and-forget: createTurnReporter never throws and logs its own
|
|
284
|
+
// failures, but guard both the synchronous throw and the rejection so
|
|
285
|
+
// nothing escapes into the SSE loop. A server with no `running` turn
|
|
286
|
+
// answers not_found — a harmless no-op (losing race).
|
|
287
|
+
try {
|
|
288
|
+
Promise.resolve(
|
|
289
|
+
advanceTurn?.({
|
|
290
|
+
sessionId: entityUuid,
|
|
291
|
+
status: "interrupted",
|
|
292
|
+
interruptedReason: "user",
|
|
293
|
+
entityType,
|
|
294
|
+
entityUuid,
|
|
295
|
+
})
|
|
296
|
+
).catch((err) => {
|
|
297
|
+
logger.warn(
|
|
298
|
+
`[Chorus] control: interrupted-turn report rejected for ${key}: ${err}`
|
|
299
|
+
);
|
|
300
|
+
});
|
|
301
|
+
} catch (err) {
|
|
302
|
+
logger.warn(`[Chorus] control: interrupted-turn report failed for ${key}: ${err}`);
|
|
303
|
+
}
|
|
304
|
+
return;
|
|
305
|
+
}
|
|
210
306
|
logger.info(
|
|
211
307
|
`[Chorus] control: no running subprocess for ${key} on this daemon; ignoring interrupt`
|
|
212
308
|
);
|
|
@@ -215,18 +311,20 @@ export function createControlHandler(deps) {
|
|
|
215
311
|
|
|
216
312
|
// --- Both checks passed: mark interrupting (so the waker reports reason=user),
|
|
217
313
|
// then kill the tree. ---
|
|
218
|
-
logger.info(`[Chorus] control: interrupting running subprocess for ${
|
|
314
|
+
logger.info(`[Chorus] control: interrupting running subprocess for ${killKey} (pid=${entry.child.pid})`);
|
|
219
315
|
try {
|
|
220
|
-
|
|
316
|
+
// Flag the entity whose wake we are actually killing — a sibling re-point must
|
|
317
|
+
// mark THAT wake interrupting, or its exit would be reported as a crash.
|
|
318
|
+
waker.markInterrupting?.(killEntityType, killEntityUuid);
|
|
221
319
|
} catch (err) {
|
|
222
|
-
logger.warn(`[Chorus] control: markInterrupting failed for ${
|
|
320
|
+
logger.warn(`[Chorus] control: markInterrupting failed for ${killKey}: ${err}`);
|
|
223
321
|
}
|
|
224
322
|
|
|
225
323
|
// Fire-and-forget the kill: the waker observes the child's exit and reports
|
|
226
324
|
// the interrupted state. The killer never throws, but guard the promise
|
|
227
325
|
// anyway so a rejection can't surface as an unhandled rejection.
|
|
228
326
|
Promise.resolve(killer(entry.child, { sigintTimeoutMs, logger })).catch((err) => {
|
|
229
|
-
logger.warn(`[Chorus] control: killProcessTree rejected for ${
|
|
327
|
+
logger.warn(`[Chorus] control: killProcessTree rejected for ${killKey}: ${err}`);
|
|
230
328
|
});
|
|
231
329
|
} catch (err) {
|
|
232
330
|
// Absolute backstop — a control event must never crash the SSE loop.
|