@chorus-aidlc/chorus 0.19.0 → 0.20.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +334 -335
- package/.next/standalone/.next/app-path-routes-manifest.json +30 -30
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +21 -21
- 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 +1 -1
- 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 +2 -2
- 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.js +1 -1
- 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.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 +3 -3
- 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.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route.js.nft.json +1 -1
- 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.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route.js.nft.json +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 -1
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +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 +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route.js.nft.json +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.js +2 -2
- package/.next/standalone/.next/server/app/api/events/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route.js.nft.json +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 +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route.js.nft.json +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 -1
- package/.next/standalone/.next/server/app/api/project-visits/pin/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/visit/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/references/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/references/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/session/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +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.js +1 -1
- 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 +3 -3
- 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.js +1 -1
- 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 +3 -3
- 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 +30 -30
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/186.js +1 -0
- package/.next/standalone/.next/server/chunks/2572.js +2 -2
- package/.next/standalone/.next/server/chunks/2618.js +1 -1
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3371.js +1 -0
- package/.next/standalone/.next/server/chunks/4131.js +39 -0
- package/.next/standalone/.next/server/chunks/4672.js +6 -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/5577.js +1 -0
- package/.next/standalone/.next/server/chunks/5728.js +1 -0
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6506.js +39 -3
- package/.next/standalone/.next/server/chunks/6515.js +2 -2
- package/.next/standalone/.next/server/chunks/{5489.js → 661.js} +44 -8
- package/.next/standalone/.next/server/chunks/6654.js +1 -0
- package/.next/standalone/.next/server/chunks/6737.js +1 -1
- package/.next/standalone/.next/server/chunks/6753.js +4 -4
- package/.next/standalone/.next/server/chunks/679.js +1 -1
- package/.next/standalone/.next/server/chunks/{2516.js → 7258.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 +1 -1
- package/.next/standalone/.next/server/chunks/8017.js +1 -0
- package/.next/standalone/.next/server/chunks/8177.js +1 -0
- package/.next/standalone/.next/server/chunks/8437.js +1 -0
- package/.next/standalone/.next/server/chunks/{6449.js → 8566.js} +1 -1
- 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/951.js +88 -1
- package/.next/standalone/.next/server/chunks/9670.js +1 -0
- package/.next/standalone/.next/server/chunks/9931.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/{15183-3f43af926186f7ef.js → 10488-d518e8ce8ae45724.js} +6 -6
- package/.next/standalone/.next/static/chunks/11595.4cebcf7499ef6a78.js +1 -0
- package/.next/standalone/.next/static/chunks/2069-68d93343e4ca252e.js +1 -0
- package/.next/standalone/.next/static/chunks/27370-0d04028ec8a339f0.js +1 -0
- package/.next/standalone/.next/static/chunks/27787-3566e3dd0506e241.js +1 -0
- package/.next/standalone/.next/static/chunks/33456.a5a9acba61ca3665.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.61dfcdf8c4c5c703.js +1 -0
- package/.next/standalone/.next/static/chunks/53504-3a0f6dee12a39d5d.js +1 -0
- package/.next/standalone/.next/static/chunks/56863-a2cc92f9ca49f0f8.js +1 -0
- package/.next/standalone/.next/static/chunks/63819-c52b5bc9ee32ca9b.js +1 -0
- package/.next/standalone/.next/static/chunks/69398-c2f73fe154aaee76.js +1 -0
- package/.next/standalone/.next/static/chunks/71890-e6c13ce1debd87c2.js +1 -0
- package/.next/standalone/.next/static/chunks/71921-f6754331cd35fa5a.js +1 -0
- package/.next/standalone/.next/static/chunks/{26020-7b4756ba0aa906cf.js → 76103-5d656aebd9cd5e7f.js} +1 -1
- package/.next/standalone/.next/static/chunks/7777-18527b954e3c5557.js +1 -0
- package/.next/standalone/.next/static/chunks/78847-9f65efbac984cf70.js +1 -0
- package/.next/standalone/.next/static/chunks/79919-32af2c1abfc92a30.js +1 -0
- package/.next/standalone/.next/static/chunks/83749-f797272bf30fc2f4.js +10 -0
- package/.next/standalone/.next/static/chunks/91907-a4182d1a3c870d0f.js +1 -0
- package/.next/standalone/.next/static/chunks/91997-3592827b5a069beb.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.747e181e4c952509.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-6135300353d6c6ad.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-bb9f26c107a6b113.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-31dd9042ee36b8e5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-a6bfa3b6b6893bc4.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-01e81333c9beee2d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-795b161eb0694092.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-e20e65b5df817433.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-fc2d02d552bbdbf0.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0cfa38d2de9fa9d9.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-301f21a3ae52e318.js → page-529dec4c3bcd5ba9.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-dd123990c14e9768.js → page-b211c29669eaa3e4.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-069c9738e516436b.js → page-793285a6cf214896.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-0606d1497512e155.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/companies/[uuid]/page-47e49c331996193b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/companies/new/page-c1e28205503002de.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/admin/page-b0d0ea2fa4102ff7.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/page-ee63e900cb54148c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/{page-5914ff3d878a3c34.js → page-1f3ab167cab58610.js} +1 -1
- package/.next/standalone/.next/static/chunks/{webpack-de8a36d232a91d6b.js → webpack-6151d196b2fab7e8.js} +1 -1
- package/.next/standalone/.next/static/css/09ac5931fe977492.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/skills/brainstorm/SKILL.md +5 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +16 -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 +13 -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 +9 -1
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/research/SKILL.md +51 -0
- 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 +5 -1
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus.json +1 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +5 -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 +13 -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 +9 -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-research/SKILL.md +51 -0
- 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 +5 -1
- package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +16 -1
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
- package/.next/standalone/public/kiro-plugin/manifest.txt +1 -0
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +4 -0
- package/.next/standalone/public/skill/chorus/SKILL.md +20 -2
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +12 -0
- package/.next/standalone/public/skill/package.json +1 -0
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +8 -0
- package/.next/standalone/public/skill/research-chorus/SKILL.md +51 -0
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +4 -0
- package/README.ja.md +5 -11
- package/README.ko.md +5 -11
- package/README.md +20 -11
- package/README.zh.md +20 -11
- package/chorus.mjs +7 -1
- package/cli/agent-cli-config.mjs +28 -2
- package/cli/claude-spawner.mjs +330 -18
- package/cli/codex-app-server-client.mjs +402 -0
- package/cli/codex-app-server-events.mjs +176 -0
- package/cli/codex-session-map.mjs +1 -1
- package/cli/codex-spawner.mjs +247 -241
- package/cli/control-handler.mjs +20 -0
- package/cli/daemon-rest-client.mjs +7 -4
- package/cli/event-router.mjs +65 -3
- package/cli/init/adapters.mjs +2 -2
- package/cli/init/file-template.mjs +11 -4
- package/cli/init/install-methods.mjs +3 -1
- package/cli/operation-contract.mjs +3 -0
- package/cli/operation-prompts.mjs +99 -0
- package/cli/operation.mjs +46 -0
- package/cli/pi-spawner.mjs +472 -78
- package/cli/process-killer.mjs +138 -13
- package/cli/process-stop-hooks.mjs +13 -0
- package/cli/prompts.mjs +7 -0
- package/cli/upgrade-plugins.mjs +202 -0
- package/cli/upgrade-process.mjs +159 -0
- package/cli/upgrade.mjs +125 -0
- package/cli/upload-hooks.mjs +2 -2
- package/cli/wake-queue.mjs +5 -1
- package/cli/waker.mjs +127 -4
- package/cli/windows-process-tree.mjs +154 -0
- package/package.json +1 -1
- package/prisma/migrations/20260927073000_add_daemon_operation_payload/migration.sql +1 -0
- package/prisma/schema.prisma +3 -2
- package/.next/standalone/.next/server/chunks/1318.js +0 -1
- package/.next/standalone/.next/server/chunks/1416.js +0 -88
- package/.next/standalone/.next/server/chunks/1683.js +0 -1
- package/.next/standalone/.next/server/chunks/3341.js +0 -1
- package/.next/standalone/.next/server/chunks/457.js +0 -1
- package/.next/standalone/.next/server/chunks/5300.js +0 -1
- package/.next/standalone/.next/server/chunks/6607.js +0 -1
- package/.next/standalone/.next/server/chunks/7400.js +0 -1
- package/.next/standalone/.next/server/chunks/8044.js +0 -1
- package/.next/standalone/.next/server/chunks/8185.js +0 -1
- package/.next/standalone/.next/server/chunks/8454.js +0 -1
- package/.next/standalone/.next/server/chunks/9848.js +0 -39
- package/.next/standalone/.next/static/chunks/11595.f080a1d100972212.js +0 -1
- package/.next/standalone/.next/static/chunks/17099-936da9caf4c119b8.js +0 -1
- package/.next/standalone/.next/static/chunks/17562-56f932146e9e6c94.js +0 -10
- package/.next/standalone/.next/static/chunks/18751-3616e33050e9611e.js +0 -1
- package/.next/standalone/.next/static/chunks/27370-c056dee2016c9124.js +0 -1
- package/.next/standalone/.next/static/chunks/31308-bb4a97b3f39c22dd.js +0 -1
- package/.next/standalone/.next/static/chunks/33456.20313bd67a5c41cc.js +0 -1
- package/.next/standalone/.next/static/chunks/35432-5c245212c7595169.js +0 -1
- package/.next/standalone/.next/static/chunks/44437-d13183f50281116f.js +0 -1
- package/.next/standalone/.next/static/chunks/45024-eb7c062d13d9fe08.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.3b555a398cdffb19.js +0 -1
- package/.next/standalone/.next/static/chunks/59713-426f81b6576173d8.js +0 -1
- package/.next/standalone/.next/static/chunks/60351-bdef539874e5027e.js +0 -1
- package/.next/standalone/.next/static/chunks/67580-8733964ab2c7fc0e.js +0 -1
- package/.next/standalone/.next/static/chunks/7777-8b1b6681256e1534.js +0 -1
- package/.next/standalone/.next/static/chunks/78155-db70d9684a1e77a2.js +0 -1
- package/.next/standalone/.next/static/chunks/79919-1e7e294a06f2c4a0.js +0 -1
- package/.next/standalone/.next/static/chunks/94643-e54eff17e941a93b.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.b8a95d1bec5ad4e7.js +0 -1
- package/.next/standalone/.next/static/chunks/99733-5a2e39f57fbda32d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-072a6b8f0a48b1b6.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-82e90e222d6bc547.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-198a3ff89ae871b9.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-a506de82e8997714.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-dc54fafa22d21863.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-6eb5d3cb036a78e0.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-69c6f0190623e19b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-2a52f747e6fac5a7.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-22cce567a85ea291.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-548231f8c9856489.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/[uuid]/page-56118c51122ad639.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/new/page-4e20deb41357171c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/admin/page-c8e40259e5d3d9e0.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/page-0a16a64855b771ef.js +0 -1
- package/.next/standalone/.next/static/css/44f13b43a3de716d.css +0 -1
- /package/.next/standalone/.next/static/{Pmji9kEq8T2lM6AKQkZji → kDppeym4sfPwXjGFspZG8}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{Pmji9kEq8T2lM6AKQkZji → kDppeym4sfPwXjGFspZG8}/_ssgManifest.js +0 -0
package/cli/claude-spawner.mjs
CHANGED
|
@@ -3,9 +3,25 @@
|
|
|
3
3
|
// engineering point of the daemon: parsing stream-json is plain JS and
|
|
4
4
|
// platform-neutral; the real work is spawning, and it is all Windows.
|
|
5
5
|
//
|
|
6
|
-
// Verified against Claude Code CLI 2.1.
|
|
7
|
-
//
|
|
8
|
-
//
|
|
6
|
+
// Verified against Claude Code CLI 2.1.283 (stream-json transport; frames pinned
|
|
7
|
+
// by cli/__tests__/fixtures/claude-stream-json/). Earlier facts first verified on
|
|
8
|
+
// 2.1.251 still hold:
|
|
9
|
+
// • `-p/--print` + `--input-format stream-json --output-format stream-json`
|
|
10
|
+
// is the bidirectional NDJSON protocol the Agent SDK's "Streaming Input Mode"
|
|
11
|
+
// runs on. It is documented only at the SDK level, so the exact frames the
|
|
12
|
+
// daemon relies on are pinned by live-captured fixtures. The prompt goes in as
|
|
13
|
+
// ONE `{"type":"user",...}` frame; stdin stays open for control frames and is
|
|
14
|
+
// closed after the turn's first `result` frame, after which the CLI drains its
|
|
15
|
+
// Stop hooks and exits (one process per wake, never reused).
|
|
16
|
+
// • stdout frames of type `control_request` / `control_response` /
|
|
17
|
+
// `control_cancel_request` are protocol plumbing: the spawner answers them and
|
|
18
|
+
// never forwards them to `onMessage`. `--permission-prompt-tool stdio` routes
|
|
19
|
+
// every non-allowlisted tool request to us as `control_request{can_use_tool}`,
|
|
20
|
+
// which we deny explicitly.
|
|
21
|
+
// • interrupt is `control_request{subtype:"interrupt"}`: the CLI acks it and
|
|
22
|
+
// ends the turn with `result:error_during_execution`. The spawner sends it from
|
|
23
|
+
// a process stop hook, so the shared killer's deadline bounds it (no SIGINT).
|
|
24
|
+
// • every output line carries `session_id`.
|
|
9
25
|
// • `--session-id <uuid>` sets the session id for a fresh run, and
|
|
10
26
|
// `--resume <uuid>` continues it. So we GENERATE the session id client-side
|
|
11
27
|
// and pass it in, rather than scraping it from the init event — the id is
|
|
@@ -18,9 +34,11 @@
|
|
|
18
34
|
//
|
|
19
35
|
// HEADLESS SIGNAL (add-daemon-headless-interaction-guard): wake() spawns the child
|
|
20
36
|
// with CHORUS_DAEMON_HEADLESS=1 merged over the inherited env — a machine-checkable
|
|
21
|
-
// marker that this is a daemon-woken, no-human-at-the-terminal run. buildArgs
|
|
22
|
-
//
|
|
23
|
-
//
|
|
37
|
+
// marker that this is a daemon-woken, no-human-at-the-terminal run. buildArgs adds
|
|
38
|
+
// no --append-system-prompt: the headless behavior rule is carried per-turn by the
|
|
39
|
+
// wake-prompt preamble in prompts.mjs, not at the system level. It does block
|
|
40
|
+
// AskUserQuestion at the tool layer (`--disallowedTools AskUserQuestion`), since no
|
|
41
|
+
// human can answer it in a daemon wake.
|
|
24
42
|
|
|
25
43
|
import { spawn } from "node:child_process";
|
|
26
44
|
import { safeSpawnError } from "./launch-diagnostics.mjs";
|
|
@@ -29,6 +47,7 @@ import { existsSync, statSync } from "node:fs";
|
|
|
29
47
|
import { homedir } from "node:os";
|
|
30
48
|
import { win32 as pathWin32, posix as pathPosix, join as pathJoin } from "node:path";
|
|
31
49
|
import { awaitChildSettled } from "./child-exit.mjs";
|
|
50
|
+
import { registerProcessStopHook } from "./process-stop-hooks.mjs";
|
|
32
51
|
|
|
33
52
|
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
34
53
|
|
|
@@ -195,24 +214,301 @@ export const CHORUS_MCP_SERVER_NAME = "chorus";
|
|
|
195
214
|
*/
|
|
196
215
|
|
|
197
216
|
/**
|
|
198
|
-
* Build the argv for a headless run. Prompt is NEVER here — it goes over stdin
|
|
217
|
+
* Build the argv for a headless run. Prompt is NEVER here — it goes over stdin as
|
|
218
|
+
* a stream-json user frame.
|
|
219
|
+
*
|
|
220
|
+
* `--disallowedTools` is variadic, so it is emitted BEFORE the permission flags
|
|
221
|
+
* (never last) and operator `cliConfig.args` are appended after this whole list by
|
|
222
|
+
* the caller — nothing can be swallowed as an extra tool name.
|
|
223
|
+
* `--permission-prompt-tool stdio` (chorus mode) makes the CLI ask us, over the
|
|
224
|
+
* control protocol, about every tool outside the allowlist; the spawner denies it
|
|
225
|
+
* explicitly and visibly instead of the CLI denying it silently.
|
|
199
226
|
* @param {{ sessionId: string, isNew: boolean, mcpConfigPath?: string, permissionMode?: PermissionMode }} o
|
|
200
227
|
* @returns {string[]}
|
|
201
228
|
*/
|
|
202
229
|
export function buildArgs({ sessionId, isNew, mcpConfigPath, permissionMode = "chorus" }) {
|
|
203
|
-
const args = ["-p", "--output-format", "stream-json", "--verbose"];
|
|
230
|
+
const args = ["-p", "--input-format", "stream-json", "--output-format", "stream-json", "--verbose"];
|
|
204
231
|
if (isNew) args.push("--session-id", sessionId);
|
|
205
232
|
else args.push("--resume", sessionId);
|
|
206
233
|
if (mcpConfigPath) args.push("--mcp-config", mcpConfigPath);
|
|
234
|
+
// Headless wakes have no human to answer AskUserQuestion — block it at the tool
|
|
235
|
+
// layer in every mode (daemon-headless-interaction-guard).
|
|
236
|
+
args.push("--disallowedTools", "AskUserQuestion");
|
|
207
237
|
if (permissionMode === "yolo") {
|
|
208
238
|
args.push("--dangerously-skip-permissions");
|
|
209
239
|
} else {
|
|
210
|
-
// Default: allow only this daemon's Chorus MCP tools through,
|
|
211
|
-
|
|
240
|
+
// Default: allow only this daemon's Chorus MCP tools through, and route every
|
|
241
|
+
// other tool's permission request to the spawner (which denies it explicitly).
|
|
242
|
+
args.push("--allowedTools", `mcp__${CHORUS_MCP_SERVER_NAME}__*`, "--permission-prompt-tool", "stdio");
|
|
212
243
|
}
|
|
213
244
|
return args;
|
|
214
245
|
}
|
|
215
246
|
|
|
247
|
+
/** stdout frame types the spawner consumes itself and never forwards to `onMessage`. */
|
|
248
|
+
export const CONTROL_FRAME_TYPES = new Set(["control_request", "control_response", "control_cancel_request"]);
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Model-facing message for a denied `can_use_tool` request. It reaches the model
|
|
252
|
+
* as the tool_result of the blocked call (and is listed in result.permission_denials).
|
|
253
|
+
*/
|
|
254
|
+
export const CHORUS_TOOL_DENY_MESSAGE =
|
|
255
|
+
"This tool is blocked by the Chorus daemon's --chorus-only permission policy: this headless " +
|
|
256
|
+
"wake may only use Chorus MCP tools (mcp__chorus__*). Use the Chorus MCP tools to do the work, " +
|
|
257
|
+
"or ask the human for what you need in a Chorus comment.";
|
|
258
|
+
|
|
259
|
+
/** Error text for any control request subtype the daemon does not implement. */
|
|
260
|
+
export const UNSUPPORTED_CONTROL_ERROR = "unsupported by Chorus daemon";
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* The one stream-json user frame that carries the wake prompt.
|
|
264
|
+
* @param {string} prompt
|
|
265
|
+
*/
|
|
266
|
+
export function buildUserFrame(prompt) {
|
|
267
|
+
return { type: "user", message: { role: "user", content: prompt }, parent_tool_use_id: null };
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* Per-wake stdin side of the stream-json protocol: safe NDJSON writes, the one
|
|
272
|
+
* stdin close, and answers to incoming control frames. Kept as its own unit so the
|
|
273
|
+
* protocol interrupt (stop hook) can build on the same write/close/result state.
|
|
274
|
+
*/
|
|
275
|
+
export class ClaudeControlChannel {
|
|
276
|
+
/**
|
|
277
|
+
* @param {{ stdin: any, logger: {info(m:string):void,warn(m:string):void,error(m:string):void},
|
|
278
|
+
* permissionMode: PermissionMode }} o
|
|
279
|
+
*/
|
|
280
|
+
constructor({ stdin, logger, permissionMode }) {
|
|
281
|
+
this.stdin = stdin ?? null;
|
|
282
|
+
this.logger = logger;
|
|
283
|
+
this.permissionMode = permissionMode;
|
|
284
|
+
/** True once the first `result` frame was observed. */
|
|
285
|
+
this.resultSeen = false;
|
|
286
|
+
/** True once we called end() (or the child is gone and stdin is unusable). */
|
|
287
|
+
this.stdinClosed = false;
|
|
288
|
+
/** True once the child exited or errored (no further protocol progress possible). */
|
|
289
|
+
this.exited = false;
|
|
290
|
+
/** True once the user prompt frame was written (a turn may be running). */
|
|
291
|
+
this.promptSent = false;
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
/** In-flight protocol stop (shared by repeated stop-hook invocations). */
|
|
295
|
+
#stopWork = null;
|
|
296
|
+
/** Per-channel interrupt request counter → `chorus-interrupt-<n>`. */
|
|
297
|
+
#interruptSeq = 0;
|
|
298
|
+
/** Resolver for the pending interrupt wait: `{ requestId, resolve }` or null. */
|
|
299
|
+
#interruptWait = null;
|
|
300
|
+
|
|
301
|
+
/** @returns {boolean} whether stdin can still take a write. */
|
|
302
|
+
get writable() {
|
|
303
|
+
const s = this.stdin;
|
|
304
|
+
if (this.stdinClosed || !s || typeof s.write !== "function") return false;
|
|
305
|
+
if (s.destroyed || s.writableEnded || s.writable === false) return false;
|
|
306
|
+
return true;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Write one NDJSON frame. Never throws: a closed/destroyed stdin or a synchronous
|
|
311
|
+
* write error is logged and reported as `false` (async EPIPE is caught by the
|
|
312
|
+
* stdin 'error' listener the spawner installs).
|
|
313
|
+
* @param {object} frame @param {string} what Log label.
|
|
314
|
+
* @returns {boolean}
|
|
315
|
+
*/
|
|
316
|
+
write(frame, what) {
|
|
317
|
+
if (!this.writable) {
|
|
318
|
+
this.logger.warn(`[Chorus] claude stdin is closed; dropped ${what}`);
|
|
319
|
+
return false;
|
|
320
|
+
}
|
|
321
|
+
try {
|
|
322
|
+
this.stdin.write(`${JSON.stringify(frame)}\n`);
|
|
323
|
+
return true;
|
|
324
|
+
} catch (err) {
|
|
325
|
+
this.logger.warn(`[Chorus] failed writing ${what} to claude stdin: ${err}`);
|
|
326
|
+
return false;
|
|
327
|
+
}
|
|
328
|
+
}
|
|
329
|
+
|
|
330
|
+
/**
|
|
331
|
+
* Write the wake's single user prompt frame, unless a protocol stop has already
|
|
332
|
+
* started (code-review B1). The waker's cancel-before-spawn branch calls the
|
|
333
|
+
* killer from inside `onChild`, i.e. BEFORE `wake()` reaches this write; sending
|
|
334
|
+
* the prompt after that would make the CLI run the whole cancelled turn (model
|
|
335
|
+
* calls, Chorus MCP side effects) until the forced deadline. Chosen fix (a):
|
|
336
|
+
* `#stopWork` is latched synchronously by `stop()`, so this check sees it, and
|
|
337
|
+
* with no prompt sent `stop()` skips the interrupt and goes straight to
|
|
338
|
+
* beforeClose → close stdin; the CLI then reads EOF with no input and exits
|
|
339
|
+
* without starting a turn. (Writing the frame before `onChild` was rejected:
|
|
340
|
+
* it would deliver the prompt a cancelled wake must never deliver.)
|
|
341
|
+
* @param {object} frame @returns {boolean} whether the prompt was written.
|
|
342
|
+
*/
|
|
343
|
+
sendPrompt(frame) {
|
|
344
|
+
if (this.#stopWork) {
|
|
345
|
+
this.logger.info("[Chorus] claude stop started before the prompt was written; prompt not delivered");
|
|
346
|
+
return false;
|
|
347
|
+
}
|
|
348
|
+
this.promptSent = this.write(frame, "prompt");
|
|
349
|
+
return this.promptSent;
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
/** Close stdin once; idempotent and never throws. */
|
|
353
|
+
closeStdin() {
|
|
354
|
+
if (this.stdinClosed) return;
|
|
355
|
+
this.stdinClosed = true;
|
|
356
|
+
const s = this.stdin;
|
|
357
|
+
if (!s || typeof s.end !== "function" || s.destroyed || s.writableEnded) return;
|
|
358
|
+
try {
|
|
359
|
+
s.end();
|
|
360
|
+
} catch (err) {
|
|
361
|
+
this.logger.warn(`[Chorus] failed closing claude stdin: ${err}`);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/** The child is gone or its stdin errored (EPIPE): no further writes may be attempted. */
|
|
366
|
+
markStdinUnusable() {
|
|
367
|
+
this.stdinClosed = true;
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/** The child exited or errored: stdin is unusable and a pending interrupt wait ends. */
|
|
371
|
+
markExited() {
|
|
372
|
+
this.exited = true;
|
|
373
|
+
this.markStdinUnusable();
|
|
374
|
+
this.#endInterruptWait();
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
#endInterruptWait() {
|
|
378
|
+
const wait = this.#interruptWait;
|
|
379
|
+
this.#interruptWait = null;
|
|
380
|
+
wait?.resolve();
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
/**
|
|
384
|
+
* Protocol stop (design D4), invoked by the process killer through the
|
|
385
|
+
* registered stop hook. Repeated calls share one promise.
|
|
386
|
+
* 1. Unless the prompt was never written (nothing to interrupt — see
|
|
387
|
+
* sendPrompt), a result was already seen, or stdin is already closed, write ONE
|
|
388
|
+
* `interrupt` control_request and wait for the first of: a result frame, an
|
|
389
|
+
* error control_response for that request id, child exit, or the killer's
|
|
390
|
+
* `protocolDeadline`. The deadline is the killer's own (derived from the
|
|
391
|
+
* existing sigintTimeoutMs); no other duration exists here (#569).
|
|
392
|
+
* 2. On EVERY path, including a skipped step 1: await `beforeClose` (the
|
|
393
|
+
* killer's Windows tree-identity capture, which needs the root alive and
|
|
394
|
+
* stdin open). A failure is logged and never skips step 3.
|
|
395
|
+
* 3. Close stdin if it is still open.
|
|
396
|
+
* @param {{ protocolDeadline: number, beforeClose?: () => unknown }} o
|
|
397
|
+
* @returns {Promise<void>}
|
|
398
|
+
*/
|
|
399
|
+
stop({ protocolDeadline, beforeClose }) {
|
|
400
|
+
if (this.#stopWork) return this.#stopWork;
|
|
401
|
+
this.#stopWork = (async () => {
|
|
402
|
+
try {
|
|
403
|
+
if (this.promptSent && !this.resultSeen && !this.stdinClosed) {
|
|
404
|
+
const requestId = `chorus-interrupt-${++this.#interruptSeq}`;
|
|
405
|
+
const outcome = new Promise((resolve) => { this.#interruptWait = { requestId, resolve }; });
|
|
406
|
+
if (this.write({ type: "control_request", request_id: requestId, request: { subtype: "interrupt" } }, "interrupt request")) {
|
|
407
|
+
this.logger.info(`[Chorus] interrupt: sent claude control_request ${requestId}`);
|
|
408
|
+
let timer;
|
|
409
|
+
try {
|
|
410
|
+
await Promise.race([
|
|
411
|
+
outcome,
|
|
412
|
+
// The killer-supplied protocol deadline — not a new timeout.
|
|
413
|
+
new Promise((resolve) => { timer = setTimeout(resolve, Math.max(0, protocolDeadline - Date.now())); }),
|
|
414
|
+
]);
|
|
415
|
+
} finally {
|
|
416
|
+
clearTimeout(timer);
|
|
417
|
+
}
|
|
418
|
+
}
|
|
419
|
+
this.#interruptWait = null;
|
|
420
|
+
}
|
|
421
|
+
} finally {
|
|
422
|
+
try {
|
|
423
|
+
await beforeClose?.();
|
|
424
|
+
} catch (err) {
|
|
425
|
+
this.logger.warn(`[Chorus] claude stop: beforeClose failed (continuing to close stdin): ${err}`);
|
|
426
|
+
}
|
|
427
|
+
this.closeStdin();
|
|
428
|
+
}
|
|
429
|
+
})();
|
|
430
|
+
return this.#stopWork;
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
/**
|
|
434
|
+
* Observe one stdout frame. Returns true when the frame is protocol plumbing the
|
|
435
|
+
* spawner consumed (so it must NOT be forwarded to `onMessage`). A `result`
|
|
436
|
+
* frame is forwarded, and closes stdin the first time one is seen.
|
|
437
|
+
* @param {any} frame
|
|
438
|
+
* @returns {boolean} consumed
|
|
439
|
+
*/
|
|
440
|
+
handleFrame(frame) {
|
|
441
|
+
const type = frame && typeof frame === "object" ? frame.type : undefined;
|
|
442
|
+
if (type === "result") {
|
|
443
|
+
if (!this.resultSeen) {
|
|
444
|
+
this.resultSeen = true;
|
|
445
|
+
// During a protocol stop the stop hook owns the close: it must await the
|
|
446
|
+
// killer's beforeClose (Windows tree capture) BEFORE stdin closes.
|
|
447
|
+
if (!this.#stopWork) this.closeStdin();
|
|
448
|
+
this.#endInterruptWait();
|
|
449
|
+
}
|
|
450
|
+
return false;
|
|
451
|
+
}
|
|
452
|
+
if (!CONTROL_FRAME_TYPES.has(type)) return false;
|
|
453
|
+
if (type === "control_request") this.#answerControlRequest(frame);
|
|
454
|
+
else if (type === "control_response") this.#observeControlResponse(frame);
|
|
455
|
+
// control_cancel_request: nothing pending on our side to cancel. All control
|
|
456
|
+
// frames are consumed so the transcript stream is unchanged.
|
|
457
|
+
return true;
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
/** Correlate a control_response with the pending interrupt; others are ignored. */
|
|
461
|
+
#observeControlResponse(frame) {
|
|
462
|
+
const wait = this.#interruptWait;
|
|
463
|
+
const response = frame.response;
|
|
464
|
+
if (!wait || response?.request_id !== wait.requestId) return;
|
|
465
|
+
if (response.subtype === "error") {
|
|
466
|
+
this.logger.warn(`[Chorus] claude rejected interrupt ${wait.requestId}: ${String(response.error)}`);
|
|
467
|
+
this.#endInterruptWait();
|
|
468
|
+
}
|
|
469
|
+
// A success ack keeps waiting: the interrupted turn still ends with a result
|
|
470
|
+
// (or, if it landed before the turn started, the killer's deadline decides).
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
#answerControlRequest(frame) {
|
|
474
|
+
const requestId = frame.request_id;
|
|
475
|
+
const subtype = frame.request?.subtype;
|
|
476
|
+
if (typeof requestId !== "string" || !requestId) {
|
|
477
|
+
// Nothing to correlate an answer with; surface it instead of replying blind.
|
|
478
|
+
this.logger.warn(`[Chorus] claude control request ${String(subtype)} has no request_id; not answered`);
|
|
479
|
+
return;
|
|
480
|
+
}
|
|
481
|
+
if (subtype === "can_use_tool") {
|
|
482
|
+
// Log the tool NAME only — the tool input can carry secrets.
|
|
483
|
+
const toolName = typeof frame.request.tool_name === "string" ? frame.request.tool_name : "<unknown>";
|
|
484
|
+
const why = this.permissionMode === "yolo" ? "unexpected permission prompt in yolo mode" : "--chorus-only permission mode";
|
|
485
|
+
if (!this.writable) {
|
|
486
|
+
// One coherent line: the deny could not be delivered (child finishing/gone).
|
|
487
|
+
this.logger.warn(`[Chorus] tool ${toolName} permission request arrived after claude stdin closed (${why}); no deny sent`);
|
|
488
|
+
return;
|
|
489
|
+
}
|
|
490
|
+
this.logger.warn(`[Chorus] denied tool ${toolName} (${why})`);
|
|
491
|
+
this.write(
|
|
492
|
+
{
|
|
493
|
+
type: "control_response",
|
|
494
|
+
response: { subtype: "success", request_id: requestId, response: { behavior: "deny", message: CHORUS_TOOL_DENY_MESSAGE } },
|
|
495
|
+
},
|
|
496
|
+
`permission deny for ${toolName}`
|
|
497
|
+
);
|
|
498
|
+
return;
|
|
499
|
+
}
|
|
500
|
+
if (!this.writable) {
|
|
501
|
+
this.logger.warn(`[Chorus] unsupported claude control request subtype ${String(subtype)} arrived after claude stdin closed; not answered`);
|
|
502
|
+
return;
|
|
503
|
+
}
|
|
504
|
+
this.logger.warn(`[Chorus] unsupported claude control request subtype ${String(subtype)}; answered with an error`);
|
|
505
|
+
this.write(
|
|
506
|
+
{ type: "control_response", response: { subtype: "error", request_id: requestId, error: UNSUPPORTED_CONTROL_ERROR } },
|
|
507
|
+
`control error response (${String(subtype)})`
|
|
508
|
+
);
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
|
|
216
512
|
/**
|
|
217
513
|
* Resolve the actual command + argv to spawn, given the resolved claude path
|
|
218
514
|
* and the headless args. On Windows a `.cmd`/`.bat` shim is NOT a PE executable,
|
|
@@ -299,7 +595,7 @@ export class ClaudeSpawner {
|
|
|
299
595
|
|
|
300
596
|
/**
|
|
301
597
|
* Spawn a headless Claude run. Resolves when the subprocess exits. The prompt
|
|
302
|
-
* is written to stdin (never argv) — this is what keeps long prompts off the
|
|
598
|
+
* is written to stdin as one stream-json user frame (never argv) — this is what keeps long prompts off the
|
|
303
599
|
* Windows command line and out of shell escaping/injection.
|
|
304
600
|
*
|
|
305
601
|
* The session id is supplied by the caller (the daemon passes the dispatched
|
|
@@ -395,6 +691,14 @@ export class ClaudeSpawner {
|
|
|
395
691
|
return;
|
|
396
692
|
}
|
|
397
693
|
|
|
694
|
+
const channel = new ClaudeControlChannel({ stdin: child.stdin, logger: this.logger, permissionMode: this.permissionMode });
|
|
695
|
+
// Protocol interrupt (design D4): the shared killer calls this instead of
|
|
696
|
+
// SIGINT and then force-cleans within the same deadline if the child remains.
|
|
697
|
+
// Registered before onChild so an interrupt can never see an unhooked child.
|
|
698
|
+
const unregisterStopHook = registerProcessStopHook(child, ({ deadline, protocolDeadline = deadline, beforeClose }) =>
|
|
699
|
+
channel.stop({ protocolDeadline, beforeClose })
|
|
700
|
+
);
|
|
701
|
+
|
|
398
702
|
// Hand the live child to the caller (子3) so the waker can register the handle
|
|
399
703
|
// for the interrupt path before this promise resolves. Never let a throwing
|
|
400
704
|
// callback escape into the spawn path.
|
|
@@ -418,6 +722,7 @@ export class ClaudeSpawner {
|
|
|
418
722
|
String(chunk),
|
|
419
723
|
(obj) => {
|
|
420
724
|
if (obj && typeof obj.session_id === "string") observedSessionId = obj.session_id;
|
|
725
|
+
if (channel.handleFrame(obj)) return; // control plumbing — never forwarded
|
|
421
726
|
if (onMessage) {
|
|
422
727
|
try {
|
|
423
728
|
onMessage(obj);
|
|
@@ -442,6 +747,8 @@ export class ClaudeSpawner {
|
|
|
442
747
|
child.on("error", (error) => {
|
|
443
748
|
// e.g. ENOENT if the resolved path vanished — log, don't throw.
|
|
444
749
|
this.logger.error(`[Chorus] claude process error: ${safeSpawnError(error)}`);
|
|
750
|
+
channel.markExited();
|
|
751
|
+
unregisterStopHook();
|
|
445
752
|
// backendSessionId is the `--resume` anchor (`id`), NOT observedSessionId:
|
|
446
753
|
// a fork-on-resume claude can emit a new stream session_id, but the daemon
|
|
447
754
|
// resumes and files the transcript under `id`, so `id` is the resumable value.
|
|
@@ -450,7 +757,12 @@ export class ClaudeSpawner {
|
|
|
450
757
|
|
|
451
758
|
// Settle on process exit, not only on stdio close: a detached descendant can
|
|
452
759
|
// inherit the pipes and keep `close` from ever firing (see cli/child-exit.mjs).
|
|
760
|
+
// A dead child's stdin must never be written again (late control answers).
|
|
761
|
+
child.on?.("exit", () => channel.markExited());
|
|
762
|
+
|
|
453
763
|
awaitChildSettled(child, { logger: this.logger, label: "claude" }).then((code) => {
|
|
764
|
+
channel.markExited();
|
|
765
|
+
unregisterStopHook();
|
|
454
766
|
if (code !== 0) {
|
|
455
767
|
this.logger.warn(`[Chorus] claude exited with code ${code}`);
|
|
456
768
|
}
|
|
@@ -470,15 +782,15 @@ export class ClaudeSpawner {
|
|
|
470
782
|
// daemon". The try/catch below only catches a synchronous throw.
|
|
471
783
|
child.stdin?.on?.("error", (err) => {
|
|
472
784
|
this.logger.warn(`[Chorus] claude stdin error (ignored): ${err}`);
|
|
785
|
+
channel.markStdinUnusable();
|
|
473
786
|
});
|
|
474
787
|
|
|
475
|
-
// Feed the prompt
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
}
|
|
788
|
+
// Feed the prompt as ONE stream-json user frame and keep stdin OPEN: control
|
|
789
|
+
// frames flow over it until the first `result` frame, when handleFrame()
|
|
790
|
+
// closes it and the CLI exits. No result before exit → the raw exit code
|
|
791
|
+
// settles the wake (never a synthetic success). Skipped when a stop already
|
|
792
|
+
// started (e.g. from inside onChild above) — see ClaudeControlChannel.sendPrompt.
|
|
793
|
+
channel.sendPrompt(buildUserFrame(prompt));
|
|
482
794
|
});
|
|
483
795
|
}
|
|
484
796
|
}
|