@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/upgrade.mjs
ADDED
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import * as fs from "node:fs";
|
|
2
|
+
import { dirname, posix, win32 } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
import { runUpgradeCommand, runUpgradeInstall, sanitizeUpgradeOutput, upgradeFailure } from "./upgrade-process.mjs";
|
|
5
|
+
// Eagerly load every collaborator before npm can replace this package.
|
|
6
|
+
import { upgradePlugins } from "./upgrade-plugins.mjs";
|
|
7
|
+
|
|
8
|
+
export const PACKAGE = "@chorus-aidlc/chorus";
|
|
9
|
+
const PACKAGE_ROOT = dirname(dirname(fileURLToPath(import.meta.url)));
|
|
10
|
+
const STABLE = /^(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:\+[0-9A-Za-z-]+(?:\.[0-9A-Za-z-]+)*)?$/;
|
|
11
|
+
export const upgradeHelp = `Usage: chorus upgrade [--plugins]
|
|
12
|
+
chorus update [--plugins]
|
|
13
|
+
|
|
14
|
+
Upgrade the active npm global Chorus installation to the latest stable release.
|
|
15
|
+
--plugins Also refresh Chorus plugins for configured daemon agents.
|
|
16
|
+
-h, --help Show help without checking or changing anything.
|
|
17
|
+
|
|
18
|
+
Exit 0: all requested work completed. Exit 1: failed or incomplete.
|
|
19
|
+
Source checkouts, linked installations and other package managers are unsupported.
|
|
20
|
+
`;
|
|
21
|
+
|
|
22
|
+
function newer(a, b) {
|
|
23
|
+
const aa = a.split("+")[0].split(".").map(BigInt), bb = b.split("+")[0].split(".").map(BigInt);
|
|
24
|
+
for (let i = 0; i < 3; i++) if (aa[i] !== bb[i]) return aa[i] > bb[i];
|
|
25
|
+
return false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export async function upgradeCli(deps = {}) {
|
|
29
|
+
const io = deps.fs ?? fs;
|
|
30
|
+
const platform = deps.platform ?? process.platform;
|
|
31
|
+
const p = platform === "win32" ? win32 : posix;
|
|
32
|
+
const env = deps.env ?? process.env;
|
|
33
|
+
const run = deps.run ?? runUpgradeCommand;
|
|
34
|
+
const root = deps.packageRoot ?? PACKAGE_ROOT;
|
|
35
|
+
const same = (a, b) => platform === "win32"
|
|
36
|
+
? p.normalize(a).toLowerCase() === p.normalize(b).toLowerCase()
|
|
37
|
+
: p.normalize(a) === p.normalize(b);
|
|
38
|
+
const read = (path) => JSON.parse(io.readFileSync(path, "utf8"));
|
|
39
|
+
const command = (args, timeoutMs = 30_000) => {
|
|
40
|
+
const r = run("npm", args, { env, platform, timeoutMs });
|
|
41
|
+
if (!r.ok) throw new Error(`npm ${args[0]} ${upgradeFailure(r, { env })}`);
|
|
42
|
+
return String(r.stdout).trim();
|
|
43
|
+
};
|
|
44
|
+
const explain = (error) => sanitizeUpgradeOutput(error?.message, { env });
|
|
45
|
+
let prefix, installed, current, latest;
|
|
46
|
+
try {
|
|
47
|
+
prefix = command(["prefix", "-g"]);
|
|
48
|
+
const globalRoot = command(["root", "-g"]);
|
|
49
|
+
const expectedRoot = platform === "win32" ? p.join(prefix, "node_modules") : p.join(prefix, "lib", "node_modules");
|
|
50
|
+
installed = p.join(globalRoot, "@chorus-aidlc", "chorus");
|
|
51
|
+
if (!p.isAbsolute(prefix) || !p.isAbsolute(globalRoot) ||
|
|
52
|
+
!same(io.realpathSync(globalRoot), io.realpathSync(expectedRoot)) ||
|
|
53
|
+
io.lstatSync(installed).isSymbolicLink() || io.existsSync(p.join(installed, ".git")) ||
|
|
54
|
+
!same(io.realpathSync(root), io.realpathSync(installed))) throw new Error();
|
|
55
|
+
const pkg = read(p.join(root, "package.json"));
|
|
56
|
+
const listing = JSON.parse(command(["ls", "-g", PACKAGE, "--depth=0", "--json", "--long"]));
|
|
57
|
+
const entry = listing.dependencies?.[PACKAGE];
|
|
58
|
+
if (pkg.name !== PACKAGE || !STABLE.test(pkg.version) || !entry ||
|
|
59
|
+
entry.name !== PACKAGE || entry.version !== pkg.version || !entry.path ||
|
|
60
|
+
!same(io.realpathSync(entry.path), io.realpathSync(installed)) ||
|
|
61
|
+
entry.link || entry.isLink || entry.invalid || entry.extraneous || entry.problems?.length) throw new Error();
|
|
62
|
+
// npm versions differ in which provenance fields they retain. When present,
|
|
63
|
+
// refuse file/git/link sources; repository metadata is NOT install provenance.
|
|
64
|
+
for (const meta of [pkg, entry]) {
|
|
65
|
+
const source = meta.resolved ?? meta._resolved;
|
|
66
|
+
if (source && !/^https?:\/\/[^?#]+\.tgz(?:\?.*)?$/.test(source)) throw new Error();
|
|
67
|
+
if (meta._from && !/^@chorus-aidlc\/chorus@[\w.*~^<>= |+-]+$/.test(meta._from)) throw new Error();
|
|
68
|
+
}
|
|
69
|
+
current = pkg.version;
|
|
70
|
+
} catch (error) {
|
|
71
|
+
return { complete: false, changed: false, detail: `Cannot verify this npm global installation. ${explain(error)}\nUse npm install -g @chorus-aidlc/chorus@latest with the intended npm prefix; source/link/other-manager installs are unsupported.` };
|
|
72
|
+
}
|
|
73
|
+
try {
|
|
74
|
+
latest = JSON.parse(command(["view", `${PACKAGE}@latest`, "version", "--json"]));
|
|
75
|
+
if (typeof latest !== "string" || !STABLE.test(latest)) throw new Error();
|
|
76
|
+
} catch (error) {
|
|
77
|
+
return { complete: false, changed: false, detail: `Latest stable version discovery failed (npm registry/network/timeout or invalid version). ${explain(error)}` };
|
|
78
|
+
}
|
|
79
|
+
if (!newer(latest, current)) {
|
|
80
|
+
return { complete: true, changed: false, detail: `CLI ${current} is current${current !== latest ? ` (latest stable ${latest}; no downgrade)` : ""}.` };
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
deps.log?.(`Installing CLI ${current} → ${latest}; npm progress follows (no installation timeout).`);
|
|
84
|
+
const result = await (deps.runInstall ?? deps.run ?? runUpgradeInstall)(
|
|
85
|
+
"npm", ["install", "-g", `${PACKAGE}@${latest}`, "--prefix", prefix, "--no-audit", "--no-fund", "--yes"],
|
|
86
|
+
{ env, platform, onOutput: (line) => deps.log?.(sanitizeUpgradeOutput(line, { env })) },
|
|
87
|
+
);
|
|
88
|
+
if (!result.ok) throw new Error(upgradeFailure(result, { env }));
|
|
89
|
+
} catch (error) {
|
|
90
|
+
const reason = explain(error);
|
|
91
|
+
const permission = /\bEACCES\b|\bEPERM\b|permission denied/i.test(reason)
|
|
92
|
+
? " Permission denied: use a user-owned Node installation (for example nvm), or ask the administrator to update the system npm prefix; no automatic elevation is attempted."
|
|
93
|
+
: "";
|
|
94
|
+
return { complete: false, changed: true, detail: `CLI install failed (${current} → ${latest}): ${reason}.${permission} Inspect the npm installation before retrying.` };
|
|
95
|
+
}
|
|
96
|
+
try {
|
|
97
|
+
const pkg = read(p.join(installed, "package.json"));
|
|
98
|
+
if (pkg.name !== PACKAGE || pkg.version !== latest) throw new Error();
|
|
99
|
+
} catch {
|
|
100
|
+
return { complete: false, changed: true, detail: `CLI version verification failed; expected ${latest}.` };
|
|
101
|
+
}
|
|
102
|
+
return { complete: true, changed: true, detail: `CLI upgraded ${current} → ${latest} (installed version verified).` };
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
export async function runUpgrade(argv = [], deps = {}) {
|
|
106
|
+
const log = deps.log ?? console.log;
|
|
107
|
+
if (argv.some((a) => !["--plugins", "--help", "-h"].includes(a))) {
|
|
108
|
+
log("Invalid upgrade arguments. Use chorus upgrade --help.");
|
|
109
|
+
return 1;
|
|
110
|
+
}
|
|
111
|
+
if (argv.includes("--help") || argv.includes("-h")) { log(upgradeHelp); return 0; }
|
|
112
|
+
const cli = await upgradeCli({ ...deps, log });
|
|
113
|
+
log(cli.detail);
|
|
114
|
+
let complete = cli.complete, changed = cli.changed;
|
|
115
|
+
if (complete && argv.includes("--plugins")) {
|
|
116
|
+
const results = await (deps.upgradePlugins ?? upgradePlugins)(deps);
|
|
117
|
+
for (const r of results) {
|
|
118
|
+
log(`${r.target}: ${r.complete ? "OK" : "INCOMPLETE"} — ${r.detail}`);
|
|
119
|
+
complete &&= r.complete;
|
|
120
|
+
changed ||= r.changed;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
if (changed) log("Start new agent sessions to load updated plugins; restart the Chorus daemon when convenient. Active sessions were not restarted.");
|
|
124
|
+
return complete ? 0 : 1;
|
|
125
|
+
}
|
package/cli/upload-hooks.mjs
CHANGED
|
@@ -409,7 +409,7 @@ function stripSystemReminders(s) {
|
|
|
409
409
|
* does NOT echo the user prompt (the chat UI renders that from the turn's
|
|
410
410
|
* promptText), and `reasoning` / `command_execution` / lifecycle envelopes are
|
|
411
411
|
* not conversation text — all dropped.
|
|
412
|
-
* - pi (@earendil-works/pi-coding-agent) `pi --mode
|
|
412
|
+
* - pi (@earendil-works/pi-coding-agent) `pi --mode rpc`: AgentSessionEvents (same as `--mode json`) whose
|
|
413
413
|
* authoritative final text is a `message_end` carrying a full AgentMessage
|
|
414
414
|
* (`{ role, content }`). We keep ONLY the assistant message: pi UNCONDITIONALLY
|
|
415
415
|
* re-emits the wake prompt as a `message_end` with role "user" (agent-loop.ts),
|
|
@@ -449,7 +449,7 @@ export function extractTranscriptText(obj) {
|
|
|
449
449
|
return { role: "assistant", text: itemText };
|
|
450
450
|
}
|
|
451
451
|
|
|
452
|
-
// ── pi `pi --mode
|
|
452
|
+
// ── pi `pi --mode rpc` event dialect ──
|
|
453
453
|
// pi's authoritative final text of each step is a `message_end` carrying a full
|
|
454
454
|
// AgentMessage `{ role, content }`. Keep ONLY the assistant message: pi re-emits the
|
|
455
455
|
// wake prompt as a role:"user" message_end (already stored as the turn's promptText),
|
package/cli/wake-queue.mjs
CHANGED
|
@@ -144,7 +144,11 @@ export class WakeQueue {
|
|
|
144
144
|
}
|
|
145
145
|
// Coalesce: take everything pending for this key right now as one batch.
|
|
146
146
|
// Items that arrive after this splice accumulate for the NEXT batch.
|
|
147
|
-
|
|
147
|
+
// An isolated instruction (Research) keeps the same serial lane but cannot
|
|
148
|
+
// merge with lifecycle wakes before or after it.
|
|
149
|
+
const boundary = queue.findIndex((item) => item?.isolated === true);
|
|
150
|
+
const count = boundary === 0 ? 1 : boundary > 0 ? boundary : queue.length;
|
|
151
|
+
const items = queue.splice(0, count);
|
|
148
152
|
this.running.add(key);
|
|
149
153
|
this.activeCount++;
|
|
150
154
|
|
package/cli/waker.mjs
CHANGED
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
// wake. A failure is logged and swallowed — it must never crash the daemon
|
|
20
20
|
// (no-silent-errors: visible log, no throw).
|
|
21
21
|
|
|
22
|
+
import { OPERATION_ACTIONS, isExactOperation, validateOperation } from "./operation.mjs";
|
|
22
23
|
import { buildBatchPrompt } from "./prompts.mjs";
|
|
23
24
|
import { writeMcpConfig } from "./mcp-config.mjs";
|
|
24
25
|
import { isNewSession, SESSION_CONFLICT_FAILURE } from "./claude-spawner.mjs";
|
|
@@ -108,6 +109,9 @@ export class Waker {
|
|
|
108
109
|
// (including daemon restart) starts with an empty guard.
|
|
109
110
|
/** @type {Set<string>} */
|
|
110
111
|
this.deterministicConflictGuards = new Set();
|
|
112
|
+
// Retry exact launch-abort reports after a network outage. These timers carry
|
|
113
|
+
// delivery cleanup only; the existing server turn remains the lifecycle authority.
|
|
114
|
+
this.operationRecoveryTimers = new Set();
|
|
111
115
|
// Daemon graceful-shutdown flag (fix-daemon-exit-orphan-running-turn). Set once
|
|
112
116
|
// by interruptAll() and never cleared — a shutting-down Waker is on its way out.
|
|
113
117
|
// The wake exit path reads it to report the TURN as interrupted(shutdown), and to
|
|
@@ -188,6 +192,8 @@ export class Waker {
|
|
|
188
192
|
*/
|
|
189
193
|
interruptAll() {
|
|
190
194
|
this.shuttingDown = true;
|
|
195
|
+
for (const timer of this.operationRecoveryTimers) clearTimeout(timer);
|
|
196
|
+
this.operationRecoveryTimers.clear();
|
|
191
197
|
for (const [key, entry] of this.executions) {
|
|
192
198
|
if (entry.status !== "running" || !entry.child) continue;
|
|
193
199
|
try {
|
|
@@ -366,9 +372,27 @@ export class Waker {
|
|
|
366
372
|
*/
|
|
367
373
|
async wakeBatch(notifications, key, attribution) {
|
|
368
374
|
let cfg;
|
|
375
|
+
let operationTurnUuid = null;
|
|
369
376
|
const receivedList = Array.isArray(notifications) ? notifications : [];
|
|
377
|
+
// Defense in depth for callers bypassing the router: malformed operations
|
|
378
|
+
// never clear a conflict guard, request admission or settle a pending turn.
|
|
379
|
+
try {
|
|
380
|
+
for (const n of receivedList.filter((n) => OPERATION_ACTIONS.has(n?.action))) {
|
|
381
|
+
validateOperation(n.action, n.operationPayload, {
|
|
382
|
+
sessionId: n.sessionId, directIdeaUuid: attribution?.directIdeaUuid,
|
|
383
|
+
projectUuid: n.projectUuid,
|
|
384
|
+
});
|
|
385
|
+
if (n.entityUuid !== n.directIdeaUuid || n.entityType !== "idea" ||
|
|
386
|
+
n.directIdeaUuid !== attribution?.directIdeaUuid) {
|
|
387
|
+
throw new Error("Operation protocol error: execution identity mismatch");
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
} catch (err) {
|
|
391
|
+
this.logger.warn(`[Chorus] operation remains pending and retryable: ${err}`);
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
370
394
|
const hasFreshHumanInstruction = receivedList.some(
|
|
371
|
-
(n) => n?.action === "human_instruction",
|
|
395
|
+
(n) => n?.action === "human_instruction" || OPERATION_ACTIONS.has(n?.action),
|
|
372
396
|
);
|
|
373
397
|
if (hasFreshHumanInstruction && this.deterministicConflictGuards.delete(key)) {
|
|
374
398
|
this.logger.info(
|
|
@@ -437,6 +461,8 @@ export class Waker {
|
|
|
437
461
|
const startMs = Date.now();
|
|
438
462
|
const target = entity ? `${entity.entityType}:${entity.entityUuid}` : key;
|
|
439
463
|
const sessionId = directIdeaUuid ?? first?.entityUuid ?? null;
|
|
464
|
+
const operations = list.filter(isExactOperation);
|
|
465
|
+
const operationRequestUuid = batchSize === 1 && operations.length ? first.turnUuid : null;
|
|
440
466
|
const requestedRuntimeCwd =
|
|
441
467
|
typeof first?.runtimeCwd === "string" && first.runtimeCwd
|
|
442
468
|
? first.runtimeCwd
|
|
@@ -447,6 +473,10 @@ export class Waker {
|
|
|
447
473
|
const arrivalAction =
|
|
448
474
|
batchSize > 1 ? `coalesced batch of ${batchSize}` : first?.action;
|
|
449
475
|
try {
|
|
476
|
+
if (operations.length && (!operationRequestUuid || !sessionId || batchSize !== 1)) {
|
|
477
|
+
this.logger.warn(`[Chorus] Operation requires an isolated, exact pending turn — skipping ${key}`);
|
|
478
|
+
return;
|
|
479
|
+
}
|
|
450
480
|
const prompt = buildBatchPrompt(list);
|
|
451
481
|
if (!prompt) {
|
|
452
482
|
this.logger.info(`[Chorus] no wake prompt for ${arrivalAction} on ${key} — skipping`);
|
|
@@ -475,6 +505,7 @@ export class Waker {
|
|
|
475
505
|
status: "running",
|
|
476
506
|
startedAt: new Date().toISOString(),
|
|
477
507
|
child: null,
|
|
508
|
+
...(operationRequestUuid ? { operationTurnUuid: operationRequestUuid } : {}),
|
|
478
509
|
});
|
|
479
510
|
this.#emitExecutionChange();
|
|
480
511
|
}
|
|
@@ -523,6 +554,39 @@ export class Waker {
|
|
|
523
554
|
this.logger.info(`[Chorus] cwd=${cwd} action=${arrivalAction} root=${rootIdeaUuid ?? "(none)"}`);
|
|
524
555
|
}
|
|
525
556
|
|
|
557
|
+
// The server's atomic pending->running edge rechecks Research eligibility
|
|
558
|
+
// under the same lock as development acceptance. Await admission BEFORE any
|
|
559
|
+
// backend can spawn; an offline/rejected/missing reporter must fail closed.
|
|
560
|
+
if (operations.length) {
|
|
561
|
+
if (execKey && this.interrupting.has(execKey)) {
|
|
562
|
+
await this.#retireUnstartedOperation({
|
|
563
|
+
sessionId, turnUuid: operationRequestUuid, status: "interrupted",
|
|
564
|
+
interruptedReason: "user",
|
|
565
|
+
});
|
|
566
|
+
return;
|
|
567
|
+
}
|
|
568
|
+
const admission = await this.advanceTurn({
|
|
569
|
+
sessionId, turnUuid: first.turnUuid, status: "running", coalescedCount: 1,
|
|
570
|
+
entityType: entity?.entityType ?? null,
|
|
571
|
+
entityUuid: entity?.entityUuid ?? null,
|
|
572
|
+
});
|
|
573
|
+
if (!admission?.ok || admission.data?.turnUuid !== first.turnUuid) {
|
|
574
|
+
this.logger.warn(`[Chorus] Operation admission rejected or unavailable for ${key} — no subprocess started`);
|
|
575
|
+
// A conflict may belong to an already-running consumer; never abort it.
|
|
576
|
+
// Otherwise the response may have been lost AFTER admission committed.
|
|
577
|
+
// Retire this exact unstarted request whether it is pending or running.
|
|
578
|
+
if ((execKey && this.interrupting.has(execKey)) || ![404, 409].includes(admission?.status)) {
|
|
579
|
+
await this.#retireUnstartedOperation({
|
|
580
|
+
sessionId, turnUuid: operationRequestUuid, status: "interrupted",
|
|
581
|
+
interruptedReason: execKey && this.interrupting.has(execKey) ? "user" : "crash",
|
|
582
|
+
transcriptRelayError: "Operation launch admission unavailable; no subprocess started",
|
|
583
|
+
});
|
|
584
|
+
}
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
operationTurnUuid = first.turnUuid;
|
|
588
|
+
}
|
|
589
|
+
|
|
526
590
|
cfg = this.writeMcpConfigFn(this.creds);
|
|
527
591
|
|
|
528
592
|
await this.hooks?.onSessionStart?.({ rootIdeaKey: key, sessionId: sessionId ?? "", isNew });
|
|
@@ -536,16 +600,29 @@ export class Waker {
|
|
|
536
600
|
// a spawn that never started (onChild never fired) does not attempt an illegal
|
|
537
601
|
// pending→ended transition. There is no separate turn registry — the turn is
|
|
538
602
|
// identified server-side by `sessionId`, which the waker already has here.
|
|
539
|
-
let turnAdvancedToRunning =
|
|
540
|
-
let runningTurnUuidPromise = Promise.resolve(
|
|
603
|
+
let turnAdvancedToRunning = operationTurnUuid !== null;
|
|
604
|
+
let runningTurnUuidPromise = Promise.resolve(operationTurnUuid);
|
|
605
|
+
let childStarted = false;
|
|
541
606
|
|
|
542
607
|
// Track the session id the stream reports so the transcript hook can use
|
|
543
608
|
// it even before spawner.wake() returns. (Do NOT reference the awaited
|
|
544
609
|
// `result` inside onMessage — it's in the temporal dead zone there.)
|
|
545
610
|
let observedSessionId = sessionId ?? "";
|
|
546
611
|
const onChild = (child) => {
|
|
612
|
+
childStarted = true;
|
|
547
613
|
const entry = execKey ? this.executions.get(execKey) : null;
|
|
548
614
|
if (entry && entry.status === "running") entry.child = child;
|
|
615
|
+
if (operationTurnUuid && (this.shuttingDown || (execKey && this.interrupting.has(execKey)))) {
|
|
616
|
+
// Some backends await binary discovery before onChild. A stop during
|
|
617
|
+
// that interval must still terminate the child as soon as it exists.
|
|
618
|
+
try {
|
|
619
|
+
Promise.resolve(this.killer(child, {
|
|
620
|
+
sigintTimeoutMs: this.sigintTimeoutMs, logger: this.logger,
|
|
621
|
+
})).catch((err) => this.logger.warn(`[Chorus] cancelled operation child kill failed: ${err}`));
|
|
622
|
+
} catch (err) {
|
|
623
|
+
this.logger.warn(`[Chorus] cancelled operation child kill failed: ${err}`);
|
|
624
|
+
}
|
|
625
|
+
}
|
|
549
626
|
if (sessionId && !turnAdvancedToRunning) {
|
|
550
627
|
turnAdvancedToRunning = true;
|
|
551
628
|
// Fire-and-forget; #advanceTurn swallows + logs its own failures so a
|
|
@@ -589,6 +666,14 @@ export class Waker {
|
|
|
589
666
|
onChild,
|
|
590
667
|
onMessage,
|
|
591
668
|
};
|
|
669
|
+
if (operationTurnUuid && (this.shuttingDown || (execKey && this.interrupting.has(execKey)))) {
|
|
670
|
+
await this.#retireUnstartedOperation({
|
|
671
|
+
sessionId, turnUuid: operationTurnUuid, status: "interrupted",
|
|
672
|
+
interruptedReason: execKey && this.interrupting.has(execKey) ? "user" : "shutdown",
|
|
673
|
+
transcriptRelayError: "Operation cancelled before subprocess launch",
|
|
674
|
+
});
|
|
675
|
+
return;
|
|
676
|
+
}
|
|
592
677
|
let result = await this.spawner.wake(wakeParams);
|
|
593
678
|
|
|
594
679
|
// Claude can still reject a new-session launch when its durable session exists
|
|
@@ -597,6 +682,7 @@ export class Waker {
|
|
|
597
682
|
// child for interrupt handling; onChild's gate keeps pending→running exactly once.
|
|
598
683
|
if (
|
|
599
684
|
isNew &&
|
|
685
|
+
!(operationTurnUuid && (this.shuttingDown || (execKey && this.interrupting.has(execKey)))) &&
|
|
600
686
|
result?.failureClassification === SESSION_CONFLICT_FAILURE
|
|
601
687
|
) {
|
|
602
688
|
this.logger.warn(
|
|
@@ -611,6 +697,15 @@ export class Waker {
|
|
|
611
697
|
}
|
|
612
698
|
}
|
|
613
699
|
|
|
700
|
+
if (operationTurnUuid && !childStarted) {
|
|
701
|
+
await this.#retireUnstartedOperation({
|
|
702
|
+
sessionId, turnUuid: operationTurnUuid, status: "interrupted",
|
|
703
|
+
interruptedReason: execKey && this.interrupting.has(execKey) ? "user" : "crash",
|
|
704
|
+
transcriptRelayError: "Operation subprocess did not start",
|
|
705
|
+
});
|
|
706
|
+
return;
|
|
707
|
+
}
|
|
708
|
+
|
|
614
709
|
if (result && !probeIsAuthoritative) {
|
|
615
710
|
this.logger.info(
|
|
616
711
|
`[Chorus] backend ${result.isNew ? "started new" : "resumed"} session ${result.sessionId ?? sessionId ?? "(none)"}`
|
|
@@ -746,7 +841,16 @@ export class Waker {
|
|
|
746
841
|
}
|
|
747
842
|
} catch (err) {
|
|
748
843
|
this.logger.warn(`[Chorus] wake failed for ${key}: ${err}`);
|
|
749
|
-
if (
|
|
844
|
+
if (operationRequestUuid && sessionId) {
|
|
845
|
+
// Admission succeeded but setup/spawn threw: retire this exact turn so a
|
|
846
|
+
// failed launch cannot leave an indefinitely running operation.
|
|
847
|
+
await this.#retireUnstartedOperation({
|
|
848
|
+
sessionId, turnUuid: operationRequestUuid, status: "interrupted",
|
|
849
|
+
interruptedReason: execKey && this.interrupting.has(execKey) ? "user"
|
|
850
|
+
: requestedRuntimeCwd && typeof err?.code === "string" ? "invalid_path" : "crash",
|
|
851
|
+
transcriptRelayError: String(err?.message ?? err).slice(0, 500),
|
|
852
|
+
});
|
|
853
|
+
} else if (sessionId && requestedRuntimeCwd && typeof err?.code === "string") {
|
|
750
854
|
const invalidPathTurnUuid = await this.#advanceTurn(sessionId, "running", entity);
|
|
751
855
|
await this.#advanceTurn(
|
|
752
856
|
sessionId,
|
|
@@ -785,6 +889,25 @@ export class Waker {
|
|
|
785
889
|
}
|
|
786
890
|
}
|
|
787
891
|
|
|
892
|
+
async #retireUnstartedOperation(report) {
|
|
893
|
+
try {
|
|
894
|
+
const result = await this.advanceTurn(report);
|
|
895
|
+
// Terminal retries are idempotent. A 404/409 means this exact row is gone
|
|
896
|
+
// or already settled differently; no other turn is selected or changed.
|
|
897
|
+
if (result?.ok || [404, 409].includes(result?.status)) return;
|
|
898
|
+
} catch (err) {
|
|
899
|
+
this.logger.warn(`[Chorus] Operation launch cleanup failed for ${report.turnUuid}: ${err}`);
|
|
900
|
+
}
|
|
901
|
+
if (this.shuttingDown) return; // offline reconcile / pending backfill owns restart
|
|
902
|
+
this.logger.warn(`[Chorus] Operation launch cleanup deferred for ${report.turnUuid}; retrying in 30s`);
|
|
903
|
+
const timer = setTimeout(() => {
|
|
904
|
+
this.operationRecoveryTimers.delete(timer);
|
|
905
|
+
void this.#retireUnstartedOperation(report);
|
|
906
|
+
}, 30_000);
|
|
907
|
+
timer.unref?.();
|
|
908
|
+
this.operationRecoveryTimers.add(timer);
|
|
909
|
+
}
|
|
910
|
+
|
|
788
911
|
/**
|
|
789
912
|
* Report an interrupted/crashed outcome via the injected reporter. Never throws
|
|
790
913
|
* into the wake path — a reporter failure is logged and swallowed (the reporter
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
// Windows has no POSIX process groups. Capture PID + creation-time identities
|
|
2
|
+
// before closing the backend, then inspect surviving descendants after exit.
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
|
|
5
|
+
const SNAPSHOT_SCRIPT = "$ErrorActionPreference='Stop'; $ChorusProcesses=@(Get-CimInstance Win32_Process | Where-Object { $_.ProcessId -gt 0 -and $_.CreationDate } | ForEach-Object { @{pid=[int]$_.ProcessId; parentPid=[int]$_.ParentProcessId; startedAt=$_.CreationDate.ToUniversalTime().ToString('o')} }); ConvertTo-Json -InputObject $ChorusProcesses -Compress";
|
|
6
|
+
const MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
|
|
7
|
+
const exited = child => child.exitCode != null || Boolean(child.signalCode);
|
|
8
|
+
const same = (a, b) => a && b && a.pid === b.pid && a.startedAt === b.startedAt;
|
|
9
|
+
|
|
10
|
+
/** Fixed system commands only; output, helpers and listeners share one deadline. */
|
|
11
|
+
async function command(command, args, { deadline, spawnImpl = spawn, capture = false }) {
|
|
12
|
+
if (Date.now() >= deadline) throw new Error("WINDOWS_CLEANUP_TIMEOUT");
|
|
13
|
+
return new Promise((resolve, reject) => {
|
|
14
|
+
let child, timer, settled = false, bytes = 0;
|
|
15
|
+
const chunks = [];
|
|
16
|
+
const finish = (error, code) => {
|
|
17
|
+
if (settled) return;
|
|
18
|
+
settled = true;
|
|
19
|
+
clearTimeout(timer);
|
|
20
|
+
child?.stdout?.removeListener("data", onData);
|
|
21
|
+
child?.removeListener("exit", onExit);
|
|
22
|
+
if (error) {
|
|
23
|
+
try { child?.kill?.("SIGKILL"); } catch {}
|
|
24
|
+
reject(new Error("WINDOWS_CLEANUP_COMMAND_FAILED"));
|
|
25
|
+
} else resolve({ code, output: Buffer.concat(chunks).toString("utf8") });
|
|
26
|
+
};
|
|
27
|
+
const onData = chunk => {
|
|
28
|
+
bytes += chunk.length;
|
|
29
|
+
if (bytes > MAX_OUTPUT_BYTES) return finish(true);
|
|
30
|
+
chunks.push(Buffer.from(chunk));
|
|
31
|
+
};
|
|
32
|
+
const onError = () => finish(true);
|
|
33
|
+
const onExit = code => {
|
|
34
|
+
// Queries need close to drain stdout. taskkill does not capture output.
|
|
35
|
+
if (!capture) finish(false, code);
|
|
36
|
+
};
|
|
37
|
+
const onClose = code => {
|
|
38
|
+
finish(false, code);
|
|
39
|
+
child?.removeListener("error", onError);
|
|
40
|
+
child?.stdout?.removeListener("error", onError);
|
|
41
|
+
};
|
|
42
|
+
try {
|
|
43
|
+
child = spawnImpl(command, args, { stdio: ["ignore", capture ? "pipe" : "ignore", "ignore"], windowsHide: true, shell: false });
|
|
44
|
+
child.on("error", onError);
|
|
45
|
+
child.once("exit", onExit);
|
|
46
|
+
child.once("close", onClose);
|
|
47
|
+
child.stdout?.on("error", onError);
|
|
48
|
+
if (capture) child.stdout?.on("data", onData);
|
|
49
|
+
timer = setTimeout(() => finish(true), Math.max(0, deadline - Date.now()));
|
|
50
|
+
} catch { finish(true); }
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export async function readWindowsProcessSnapshot(options) {
|
|
55
|
+
const { code, output } = await command("powershell.exe",
|
|
56
|
+
["-NoLogo", "-NoProfile", "-NonInteractive", "-Command", SNAPSHOT_SCRIPT],
|
|
57
|
+
{ ...options, capture: true });
|
|
58
|
+
if (code !== 0) throw new Error("WINDOWS_PROCESS_QUERY_FAILED");
|
|
59
|
+
let parsed;
|
|
60
|
+
try { parsed = JSON.parse(output.replace(/^\uFEFF/, "")); }
|
|
61
|
+
catch { throw new Error("WINDOWS_PROCESS_QUERY_INVALID"); }
|
|
62
|
+
const records = Array.isArray(parsed) ? parsed : [parsed];
|
|
63
|
+
if (records.length > 100_000) throw new Error("WINDOWS_PROCESS_QUERY_INVALID");
|
|
64
|
+
const seen = new Set();
|
|
65
|
+
for (const r of records) {
|
|
66
|
+
if (!r || !Number.isSafeInteger(r.pid) || r.pid < 0 ||
|
|
67
|
+
!Number.isSafeInteger(r.parentPid) || r.parentPid < 0 ||
|
|
68
|
+
typeof r.startedAt !== "string" || !Number.isFinite(Date.parse(r.startedAt)) ||
|
|
69
|
+
seen.has(r.pid)) throw new Error("WINDOWS_PROCESS_QUERY_INVALID");
|
|
70
|
+
seen.add(r.pid);
|
|
71
|
+
}
|
|
72
|
+
return records;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export class WindowsProcessTree {
|
|
76
|
+
constructor(child, { deadline, spawnImpl, snapshotImpl = readWindowsProcessSnapshot } = {}) {
|
|
77
|
+
this.child = child;
|
|
78
|
+
this.options = { deadline, spawnImpl };
|
|
79
|
+
this.snapshot = () => snapshotImpl(this.options);
|
|
80
|
+
this.owned = new Map();
|
|
81
|
+
this.capturePromise = null;
|
|
82
|
+
this.captureFailed = false;
|
|
83
|
+
this.escalated = false;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
capture() {
|
|
87
|
+
return this.capturePromise ??= (async () => {
|
|
88
|
+
try {
|
|
89
|
+
const wasRunning = !exited(this.child);
|
|
90
|
+
const records = await this.snapshot();
|
|
91
|
+
const root = records.find(r => r.pid === this.child.pid);
|
|
92
|
+
// A PID found after our ChildProcess has exited belongs to someone else.
|
|
93
|
+
if (root && !exited(this.child)) this.owned.set(root.pid, root);
|
|
94
|
+
else if (wasRunning) this.captureFailed = true;
|
|
95
|
+
else if (!root && records.some(r => r.parentPid === this.child.pid)) {
|
|
96
|
+
// No trustworthy root identity: do not guess ownership or kill.
|
|
97
|
+
this.captureFailed = true;
|
|
98
|
+
}
|
|
99
|
+
this.expand(records);
|
|
100
|
+
} catch { this.captureFailed = true; }
|
|
101
|
+
})();
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
expand(records) {
|
|
105
|
+
const current = new Map(records.map(r => [r.pid, r]));
|
|
106
|
+
let changed;
|
|
107
|
+
do {
|
|
108
|
+
changed = false;
|
|
109
|
+
for (const record of records) {
|
|
110
|
+
if (this.owned.has(record.pid)) continue;
|
|
111
|
+
const parent = this.owned.get(record.parentPid);
|
|
112
|
+
// Retain ancestry through a departed parent, but never through a reused
|
|
113
|
+
// PID. Creation ordering also rejects an older, unrelated process.
|
|
114
|
+
if (parent && (!current.has(parent.pid) || same(parent, current.get(parent.pid))) &&
|
|
115
|
+
Date.parse(record.startedAt) >= Date.parse(parent.startedAt)) {
|
|
116
|
+
this.owned.set(record.pid, record); changed = true;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
} while (changed);
|
|
120
|
+
return records.filter(r => same(r, this.owned.get(r.pid)));
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
async cleanup() {
|
|
124
|
+
await this.capture();
|
|
125
|
+
try {
|
|
126
|
+
let living = this.expand(await this.snapshot());
|
|
127
|
+
if (this.captureFailed) throw new Error("WINDOWS_TREE_UNCERTAIN");
|
|
128
|
+
if (!living.length) return { cleanupFailed: false, escalated: false };
|
|
129
|
+
// Target each surviving identity, including children whose root exited.
|
|
130
|
+
// Re-read before each taskkill to avoid killing a known reused PID.
|
|
131
|
+
for (const candidate of living) {
|
|
132
|
+
const fresh = await this.snapshot();
|
|
133
|
+
const actual = fresh.find(r => r.pid === candidate.pid);
|
|
134
|
+
this.expand(fresh);
|
|
135
|
+
if (!same(candidate, actual)) continue;
|
|
136
|
+
try {
|
|
137
|
+
this.escalated = true;
|
|
138
|
+
await command("taskkill", ["/PID", String(candidate.pid), "/T", "/F"], this.options);
|
|
139
|
+
} catch {
|
|
140
|
+
// A process can disappear during taskkill. Only the final identity
|
|
141
|
+
// probe distinguishes that race from a genuine termination failure.
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
living = this.expand(await this.snapshot());
|
|
145
|
+
if (living.length) throw new Error("WINDOWS_TREE_REMAINS");
|
|
146
|
+
return { cleanupFailed: false, escalated: true };
|
|
147
|
+
} catch {
|
|
148
|
+
// Still try to stop the exact ChildProcess if it has not exited. No
|
|
149
|
+
// unverified numeric PID is targeted on this failure path.
|
|
150
|
+
if (!exited(this.child)) { try { this.child.kill?.("SIGKILL"); } catch {} }
|
|
151
|
+
return { cleanupFailed: true, escalated: this.escalated };
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chorus-aidlc/chorus",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"description": "The Agent Harness for AI-Human Collaboration — session lifecycle, task state, sub-agent orchestration, observability, and failure recovery",
|
|
5
5
|
"homepage": "https://github.com/Chorus-AIDLC/Chorus",
|
|
6
6
|
"repository": {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
ALTER TABLE "DaemonSessionTurn" ADD COLUMN "operationPayload" JSONB;
|
package/prisma/schema.prisma
CHANGED
|
@@ -719,8 +719,9 @@ model DaemonSessionTurn {
|
|
|
719
719
|
// immutable first-wake compatibility anchor.
|
|
720
720
|
backendSessionId String?
|
|
721
721
|
seq Int // monotonic per session
|
|
722
|
-
trigger String // task_assigned | mentioned | elaboration | elaboration_verified | start_development | yolo_requested | resume | human_instruction
|
|
723
|
-
promptText String? //
|
|
722
|
+
trigger String // task_assigned | mentioned | elaboration | elaboration_verified | start_development | yolo_requested | resume | human_instruction | idea_creation_requested | research_requested
|
|
723
|
+
promptText String? // human instruction body or server-composed operation compatibility snapshot
|
|
724
|
+
operationPayload Json? // versioned dedicated operation; historical rows remain null
|
|
724
725
|
status String @default("pending") // pending | running | ended | interrupted
|
|
725
726
|
// Discriminator for the `interrupted` status: `user` = user-requested interrupt,
|
|
726
727
|
// `crash` = subprocess exited dirty, `shutdown` = daemon graceful shutdown killed
|