@chorus-aidlc/chorus 0.16.4 → 0.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +511 -511
- package/.next/standalone/.next/app-path-routes-manifest.json +47 -47
- package/.next/standalone/.next/build-manifest.json +6 -6
- package/.next/standalone/.next/prerender-manifest.json +42 -42
- package/.next/standalone/.next/react-loadable-manifest.json +1 -1
- package/.next/standalone/.next/required-server-files.json +4 -4
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +3 -3
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page.js +2 -2
- 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 +5 -5
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page.js.nft.json +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 +2 -2
- package/.next/standalone/.next/server/app/admin/companies/new/page.js.nft.json +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 +7 -7
- package/.next/standalone/.next/server/app/admin/companies/page.js +2 -2
- package/.next/standalone/.next/server/app/admin/companies/page.js.nft.json +1 -1
- 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 +7 -7
- package/.next/standalone/.next/server/app/admin/page.js +2 -2
- package/.next/standalone/.next/server/app/admin/page.js.nft.json +1 -1
- 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 +7 -7
- 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_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route.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.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_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_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_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route.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.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.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.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.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.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.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.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_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_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 +9 -3
- 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.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 +5 -5
- 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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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_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/favicon.ico/route.js +1 -1
- package/.next/standalone/.next/server/app/index.html +2 -2
- package/.next/standalone/.next/server/app/index.rsc +6 -6
- package/.next/standalone/.next/server/app/login/admin/page.js +2 -2
- package/.next/standalone/.next/server/app/login/admin/page.js.nft.json +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 +6 -6
- package/.next/standalone/.next/server/app/login/callback/page.js +2 -2
- package/.next/standalone/.next/server/app/login/callback/page.js.nft.json +1 -1
- 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 +6 -6
- package/.next/standalone/.next/server/app/login/page.js +2 -2
- package/.next/standalone/.next/server/app/login/page.js.nft.json +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.js +2 -2
- package/.next/standalone/.next/server/app/login/pick-workspace/page.js.nft.json +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 +6 -6
- package/.next/standalone/.next/server/app/login.html +2 -2
- package/.next/standalone/.next/server/app/login.rsc +6 -6
- 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 +6 -6
- package/.next/standalone/.next/server/app/page.js +2 -2
- 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 +7 -7
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +7 -7
- package/.next/standalone/.next/server/app-paths-manifest.json +47 -47
- package/.next/standalone/.next/server/chunks/1073.js +1 -0
- package/.next/standalone/.next/server/chunks/1114.js +1 -0
- package/.next/standalone/.next/server/chunks/1267.js +1 -0
- package/.next/standalone/.next/server/chunks/1318.js +1 -1
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/2570.js +2 -2
- package/.next/standalone/.next/server/chunks/2572.js +1 -1
- package/.next/standalone/.next/server/chunks/2940.js +1 -1
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3197.js +1 -1
- package/.next/standalone/.next/server/chunks/378.js +4 -4
- 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/{5351.js → 5737.js} +13 -9
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6145.js +1 -0
- package/.next/standalone/.next/server/chunks/6487.js +1 -0
- package/.next/standalone/.next/server/chunks/6506.js +1 -1
- package/.next/standalone/.next/server/chunks/6515.js +2 -2
- package/.next/standalone/.next/server/chunks/6753.js +3 -3
- package/.next/standalone/.next/server/chunks/679.js +1 -1
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/7530.js +1 -1
- package/.next/standalone/.next/server/chunks/7770.js +1 -0
- package/.next/standalone/.next/server/chunks/{4394.js → 7822.js} +1 -1
- package/.next/standalone/.next/server/chunks/8454.js +1 -1
- package/.next/standalone/.next/server/chunks/8586.js +1 -0
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/9213.js +1 -1
- package/.next/standalone/.next/server/chunks/9378.js +1 -1
- package/.next/standalone/.next/server/chunks/9931.js +1 -0
- 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/middleware-react-loadable-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +1 -1
- 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/server/src/middleware.js +2 -2
- package/.next/standalone/.next/static/chunks/{11595.a6268c75ca8a2163.js → 11595.32f7dedc4fd7e3e1.js} +1 -1
- package/.next/standalone/.next/static/chunks/11998-27dcf858173fc015.js +1 -0
- package/.next/standalone/.next/static/chunks/12070-426bb88f5179812b.js +1 -0
- package/.next/standalone/.next/static/chunks/17409-67dbc0a3f4cbc207.js +1 -0
- package/.next/standalone/.next/static/chunks/26494-5a04e150431b0233.js +1 -0
- package/.next/standalone/.next/static/chunks/{31308-fda6febfb2882a28.js → 31308-bb4a97b3f39c22dd.js} +1 -1
- package/.next/standalone/.next/static/chunks/{33456.16ff7edf00137539.js → 33456.87f86ce6041405e0.js} +1 -1
- package/.next/standalone/.next/static/chunks/38366.fb931fab9c756890.js +1 -0
- package/.next/standalone/.next/static/chunks/4166-85352630c29e2c2b.js +1 -0
- package/.next/standalone/.next/static/chunks/{4860.9e06848eb531e667.js → 4860.9457e021394e9399.js} +1 -1
- package/.next/standalone/.next/static/chunks/{65096-f756aac39efad7a3.js → 65096-8295f53f97c40d47.js} +1 -1
- package/.next/standalone/.next/static/chunks/65807-086d83649f593a5a.js +1 -0
- package/.next/standalone/.next/static/chunks/79919-56796c262f51fa82.js +1 -0
- package/.next/standalone/.next/static/chunks/94643-87ee1ede6d955937.js +1 -0
- package/.next/standalone/.next/static/chunks/{99373.81b79c91858f9099.js → 99373.aed267aa48c5bdd0.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-9219c4de1012f0fb.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/{page-974781e4886529f8.js → page-82e90e222d6bc547.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/activity/page-f1eccb50d38d8982.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-f4810f1b9f39d1ae.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-721d2152f1a28c88.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-9bcff40805f39b25.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-fdd617457730a116.js → page-f31ad2eebe257628.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-a4fb04068539c4ce.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-b1d2af10e9bc7e09.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-2cb245b0602a3c85.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-58b48aa0a11603c3.js → page-53ce4468844cc84f.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-286faced32c6133f.js → page-1c374d19e8046d9a.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/page-31d6f8e82c7f5366.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-32bff791b19a0a58.js +1 -0
- package/.next/standalone/.next/static/chunks/app/_not-found/{page-166b410da84336d4.js → page-b9d672df79b35e87.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/[uuid]/{page-b2458ed001dc8177.js → page-56118c51122ad639.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/new/page-4e20deb41357171c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/companies/page-0632f245bf9c1c27.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/layout-725ab2331c642f36.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/{page-0cc8cf246db43e5d.js → page-5a0271dd2b8b36fd.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/{layout-985054e973f66999.js → layout-098288cec4490c5d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/login/admin/page-c8e40259e5d3d9e0.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/callback/page-527652f6c1a39274.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/{page-9b34375d1b5579d7.js → page-0a16a64855b771ef.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-47375a86e2375202.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/{page-5c82cf3abd856301.js → page-d082f9b60ad03057.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/{page-79e2d32e69788bd2.js → page-91dbf7dfd85f805f.js} +1 -1
- package/.next/standalone/.next/static/chunks/main-app-1a7cacecc8900a4d.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-4d1cc14b13e247b6.js → webpack-e2e0ef50652d5791.js} +1 -1
- package/.next/standalone/.next/static/css/1d9cf83f50b6db00.css +1 -0
- package/.next/standalone/package.json +2 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +44 -1
- package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +4 -3
- package/.next/standalone/public/chorus-plugin/bin/tests/test-mcp-cli-delegation.sh +244 -0
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +19 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +57 -0
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +85 -42
- package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +3 -3
- package/.next/standalone/public/dsh-credentials.sh +20 -127
- package/.next/standalone/public/install-codex.sh +21 -406
- package/.next/standalone/public/install-kiro.sh +20 -344
- package/.next/standalone/public/install-opencode.sh +20 -275
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-cli/SKILL.md +57 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +2 -2
- 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 +2 -2
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +85 -42
- 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 +2 -2
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +3 -3
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +44 -1
- package/.next/standalone/public/kiro-plugin/bin/on-agent-spawn.sh +6 -4
- package/.next/standalone/public/kiro-plugin/manifest.txt +42 -0
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +19 -1
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/docs-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +2 -2
- package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/.next/standalone/public/test-dsh-credentials.sh +22 -38
- package/.next/standalone/public/test-install-codex.sh +31 -79
- package/.next/standalone/server.js +1 -1
- package/README.ja.md +4 -2
- package/README.ko.md +4 -2
- package/README.md +4 -2
- package/README.zh.md +4 -2
- package/chorus.mjs +35 -1
- package/cli/agent-backend-prompt.mjs +3 -2
- package/cli/agents.mjs +329 -0
- package/cli/chorus-client.mjs +69 -0
- package/cli/claude-spawner.mjs +56 -15
- package/cli/codex-spawner.mjs +11 -6
- package/cli/credentials.mjs +190 -4
- package/cli/daemon-agent.mjs +26 -2
- package/cli/daemon-config.mjs +27 -2
- package/cli/daemon-service.mjs +120 -33
- package/cli/daemon.mjs +128 -22
- package/cli/dsh-spawner.mjs +7 -0
- package/cli/init/adapters.mjs +137 -0
- package/cli/init/agent-type-map.mjs +60 -0
- package/cli/init/chorus-plugin-consts.mjs +16 -0
- package/cli/init/codex-mcp-config.mjs +183 -0
- package/cli/init/contracts.mjs +122 -0
- package/cli/init/detect.mjs +97 -0
- package/cli/init/file-template.mjs +248 -0
- package/cli/init/install-methods.mjs +569 -0
- package/cli/init/registry.mjs +74 -0
- package/cli/init/run-command.mjs +30 -0
- package/cli/init/select.mjs +111 -0
- package/cli/init/steps/credential-seed.mjs +751 -0
- package/cli/init/steps/daemon-setup.mjs +246 -0
- package/cli/init/steps/plugin-install.mjs +37 -0
- package/cli/init-args.mjs +140 -0
- package/cli/init.mjs +243 -0
- package/cli/kiro-spawner.mjs +5 -0
- package/cli/mcp-args.mjs +280 -0
- package/cli/mcp.mjs +164 -0
- package/cli/spawner-select.mjs +45 -2
- package/cli/waker.mjs +89 -38
- package/package.json +2 -1
- package/.next/standalone/.env +0 -18
- package/.next/standalone/.next/server/chunks/3594.js +0 -1
- package/.next/standalone/.next/server/chunks/4545.js +0 -1
- package/.next/standalone/.next/server/chunks/5205.js +0 -1
- package/.next/standalone/.next/server/chunks/6207.js +0 -1
- package/.next/standalone/.next/server/chunks/6667.js +0 -1
- package/.next/standalone/.next/server/chunks/6995.js +0 -1
- package/.next/standalone/.next/server/chunks/7091.js +0 -1
- package/.next/standalone/.next/server/chunks/9793.js +0 -1
- package/.next/standalone/.next/static/chunks/19887-b805e1dcee8c367b.js +0 -1
- package/.next/standalone/.next/static/chunks/29108-5a11eea003f4cc11.js +0 -1
- package/.next/standalone/.next/static/chunks/38366.e6e0132b8ba873d6.js +0 -1
- package/.next/standalone/.next/static/chunks/53073-a7ed20af6538a178.js +0 -1
- package/.next/standalone/.next/static/chunks/6603-e70ddeab6ad09c50.js +0 -1
- package/.next/standalone/.next/static/chunks/78917-1b59cbb806b3ecfc.js +0 -1
- package/.next/standalone/.next/static/chunks/82751-3e161e1d8dbda3ac.js +0 -1
- package/.next/standalone/.next/static/chunks/94643-ffa140f765c73daf.js +0 -1
- package/.next/standalone/.next/static/chunks/99366-425e9ef22e60e3e2.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-b742c51c0a764daf.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/activity/page-20632dbec5a6dbc0.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-f636e00c28f425ea.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c004f1a194af7fa5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-425acbe9ade5fa83.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-b9eb4e0692996657.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-d5b222f379b2e8ca.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0a6c2d0e1b68e0e4.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/page-9d79e285b6fd2f8d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-1507a761e67c2aa9.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/new/page-e35dce890d6dfd8d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/page-ef720c2b0856166c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/layout-c66ce38cbd88982a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/admin/page-f032b6db3bd20a2c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/callback/page-ec23211506e688ee.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-7e4664af2c787d08.js +0 -1
- package/.next/standalone/.next/static/chunks/main-app-ec87f2c9ef083ff1.js +0 -1
- package/.next/standalone/.next/static/css/5f52bd39b284ccdf.css +0 -1
- /package/.next/standalone/.next/static/{6sHDgeKioa0SJR1MAbcYG → _s4RZW3efB1g0lrKgLiZ7}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{6sHDgeKioa0SJR1MAbcYG → _s4RZW3efB1g0lrKgLiZ7}/_ssgManifest.js +0 -0
package/cli/agents.mjs
ADDED
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
// cli/agents.mjs
|
|
2
|
+
// `chorus agents` — manage this machine's configured agents (the ~/.chorus/daemon.json
|
|
3
|
+
// agents[]): `list` (default), `add` (detect + install plugin + seed creds — the flow
|
|
4
|
+
// formerly reached via `chorus init`, delegated to runInit), and `remove <name|uuid>`.
|
|
5
|
+
// Listing lets a user/agent discover the valid `CHORUS_AGENT_PROFILE` /
|
|
6
|
+
// `chorus mcp --agent <name|uuid>` values without hand-reading the JSON. The `cho_`
|
|
7
|
+
// API key is NEVER emitted by list/remove — not masked, omitted entirely.
|
|
8
|
+
//
|
|
9
|
+
// Peer of the other `chorus` subcommands (login / daemon / mcp); dispatched from
|
|
10
|
+
// chorus.mjs before the server boot path, so every `chorus agents …` help/list/remove
|
|
11
|
+
// path never starts the embedded PostgreSQL.
|
|
12
|
+
|
|
13
|
+
import { readFileSync } from "node:fs";
|
|
14
|
+
import { loginFilePath } from "./credentials.mjs";
|
|
15
|
+
import { updateDaemonConfig } from "./login.mjs";
|
|
16
|
+
|
|
17
|
+
/** Read + parse a JSON file, returning null on any error (missing/malformed). */
|
|
18
|
+
function readJsonSafe(path) {
|
|
19
|
+
try {
|
|
20
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
21
|
+
return parsed && typeof parsed === "object" ? parsed : null;
|
|
22
|
+
} catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** A non-empty trimmed string, or undefined. */
|
|
28
|
+
function nonEmpty(value) {
|
|
29
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/** Compact host for the table (host[:port] only — never userinfo); never throws. */
|
|
33
|
+
function hostOf(url) {
|
|
34
|
+
if (!url) return "";
|
|
35
|
+
try {
|
|
36
|
+
return new URL(url).host;
|
|
37
|
+
} catch {
|
|
38
|
+
return "";
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Safe url for machine (--json) output: the origin only (scheme://host[:port]).
|
|
44
|
+
* Strips any userinfo / path / query so an accidental credential embedded in the
|
|
45
|
+
* url can never surface. Returns null when absent or unparseable (never echoes
|
|
46
|
+
* the raw string). Defense-in-depth — the stored API key lives in a separate
|
|
47
|
+
* `apiKey` field this command never reads.
|
|
48
|
+
*/
|
|
49
|
+
function originOf(url) {
|
|
50
|
+
if (!url) return null;
|
|
51
|
+
try {
|
|
52
|
+
return new URL(url).origin;
|
|
53
|
+
} catch {
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/** Group help for `chorus agents` (list / add / remove). */
|
|
59
|
+
export function agentsHelpText(version = "") {
|
|
60
|
+
const v = version ? ` v${version}` : "";
|
|
61
|
+
return `\
|
|
62
|
+
Chorus${v} — manage this machine's configured agents
|
|
63
|
+
|
|
64
|
+
USAGE
|
|
65
|
+
chorus agents [list] List configured agents (name, UUID, backend)
|
|
66
|
+
chorus agents --json Machine-readable list (API keys never included)
|
|
67
|
+
chorus agents add [flags] Configure agent(s): detect, install plugin, seed
|
|
68
|
+
credentials (formerly \`chorus init\`; same flags —
|
|
69
|
+
see \`chorus agents add --help\`)
|
|
70
|
+
chorus agents remove <name|uuid> Remove a configured agent from ~/.chorus/daemon.json
|
|
71
|
+
|
|
72
|
+
Each listed UUID or name is a valid value for \`chorus mcp --agent <name|uuid>\` or the
|
|
73
|
+
CHORUS_AGENT_PROFILE environment variable. The API key is never printed.
|
|
74
|
+
`;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Build the redacted agent rows from a parsed daemon.json object.
|
|
79
|
+
* @param {Record<string, unknown>|null} file
|
|
80
|
+
* @returns {Array<{index:number, name?:string, uuid?:string, agentType?:string, url?:string, daemonWake?:unknown, flat?:boolean}>}
|
|
81
|
+
*/
|
|
82
|
+
export function collectAgents(file) {
|
|
83
|
+
if (!file) return [];
|
|
84
|
+
const rows = [];
|
|
85
|
+
if (Array.isArray(file.agents)) {
|
|
86
|
+
file.agents.forEach((a, i) => {
|
|
87
|
+
if (a && typeof a === "object") {
|
|
88
|
+
rows.push({
|
|
89
|
+
index: i,
|
|
90
|
+
name: nonEmpty(a.agentName) ?? nonEmpty(a.name) ?? nonEmpty(a.label),
|
|
91
|
+
uuid: nonEmpty(a.agentUuid),
|
|
92
|
+
agentType: nonEmpty(a.agentType),
|
|
93
|
+
url: nonEmpty(a.url) ?? nonEmpty(file.url),
|
|
94
|
+
daemonWake: a.daemonWake,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
// Flat single-agent config (no agents[]): synthesize one row from the
|
|
100
|
+
// deprecated top-level fields so it still shows up.
|
|
101
|
+
if (rows.length === 0 && (nonEmpty(file.apiKey) || nonEmpty(file.agentUuid))) {
|
|
102
|
+
rows.push({
|
|
103
|
+
index: 0,
|
|
104
|
+
name: nonEmpty(file.agentName),
|
|
105
|
+
uuid: nonEmpty(file.agentUuid),
|
|
106
|
+
agentType: nonEmpty(file.agent),
|
|
107
|
+
url: nonEmpty(file.url),
|
|
108
|
+
flat: true,
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
return rows;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* List configured agents (the `chorus agents` / `chorus agents list` body).
|
|
116
|
+
* Returns an exit code (never calls process.exit).
|
|
117
|
+
* @param {string[]} argv flags after the (optional) `list` sub-verb.
|
|
118
|
+
* @param {object} [opts]
|
|
119
|
+
* @returns {number}
|
|
120
|
+
*/
|
|
121
|
+
function listAgents(argv = [], opts = {}) {
|
|
122
|
+
const out = opts.stdout ?? process.stdout;
|
|
123
|
+
const err = opts.stderr ?? process.stderr;
|
|
124
|
+
const env = opts.env ?? process.env;
|
|
125
|
+
const readJson = opts.readJson ?? readJsonSafe;
|
|
126
|
+
const loginPath = opts.loginPath ?? loginFilePath();
|
|
127
|
+
const version = opts.version ?? "";
|
|
128
|
+
|
|
129
|
+
let json = false;
|
|
130
|
+
for (const tok of argv) {
|
|
131
|
+
if (tok === "--help" || tok === "-h") {
|
|
132
|
+
out.write(agentsHelpText(version));
|
|
133
|
+
return 0;
|
|
134
|
+
}
|
|
135
|
+
if (tok === "--json") {
|
|
136
|
+
json = true;
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
err.write(`error: unknown flag: ${tok}\n\n${agentsHelpText(version)}`);
|
|
140
|
+
return 2;
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
const rows = collectAgents(readJson(loginPath));
|
|
144
|
+
const active = nonEmpty(env.CHORUS_AGENT_PROFILE);
|
|
145
|
+
const isActive = (r) => active !== undefined && (r.uuid === active || r.name === active);
|
|
146
|
+
|
|
147
|
+
if (json) {
|
|
148
|
+
// Redacted objects — the apiKey is intentionally never included.
|
|
149
|
+
const payload = rows.map((r) => ({
|
|
150
|
+
index: r.index,
|
|
151
|
+
name: r.name ?? null,
|
|
152
|
+
uuid: r.uuid ?? null,
|
|
153
|
+
agentType: r.agentType ?? null,
|
|
154
|
+
url: originOf(r.url),
|
|
155
|
+
daemonWake: r.daemonWake ?? null,
|
|
156
|
+
active: isActive(r),
|
|
157
|
+
}));
|
|
158
|
+
out.write(`${JSON.stringify(payload, null, 2)}\n`);
|
|
159
|
+
return 0;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
if (rows.length === 0) {
|
|
163
|
+
out.write(
|
|
164
|
+
`No agents configured in ${loginPath}.\n` +
|
|
165
|
+
"Run `chorus agents add` (or `chorus login`) to add one.\n",
|
|
166
|
+
);
|
|
167
|
+
return 0;
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
out.write(`Agents in ${loginPath}:\n`);
|
|
171
|
+
for (const r of rows) {
|
|
172
|
+
const mark = isActive(r) ? "* " : " ";
|
|
173
|
+
const name = r.name ?? "(unnamed)";
|
|
174
|
+
const uuid = r.uuid ?? "(no uuid)";
|
|
175
|
+
const bits = [r.agentType ?? "?"];
|
|
176
|
+
if (r.daemonWake === false) bits.push("wake:off");
|
|
177
|
+
const host = hostOf(r.url);
|
|
178
|
+
if (host) bits.push(host);
|
|
179
|
+
out.write(`${mark}[${r.index}] ${name} ${uuid} (${bits.join(", ")})\n`);
|
|
180
|
+
}
|
|
181
|
+
if (active) {
|
|
182
|
+
out.write(
|
|
183
|
+
rows.some(isActive)
|
|
184
|
+
? `\n* = active (CHORUS_AGENT_PROFILE="${active}")\n`
|
|
185
|
+
: `\n(note: CHORUS_AGENT_PROFILE="${active}" is set but matches no agent above)\n`,
|
|
186
|
+
);
|
|
187
|
+
}
|
|
188
|
+
out.write(
|
|
189
|
+
"\nPass a UUID or name to `chorus mcp --agent <name|uuid>` or set CHORUS_AGENT_PROFILE.\n" +
|
|
190
|
+
"API keys are never shown.\n",
|
|
191
|
+
);
|
|
192
|
+
return 0;
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
/** Usage for `chorus agents remove`. */
|
|
196
|
+
function removeHelpText() {
|
|
197
|
+
return "USAGE\n chorus agents remove <name|uuid> Remove a configured agent from ~/.chorus/daemon.json\n";
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* `chorus agents remove <name|uuid>` — drop the matching `agents[]` entry.
|
|
202
|
+
* Merge-safe: rewrites daemon.json replacing `agents[]` with the filtered array,
|
|
203
|
+
* preserving every other agent and all top-level fields. The API key is NEVER
|
|
204
|
+
* printed. dependency-injected (readJson/writeConfig/loginPath) for tests.
|
|
205
|
+
* @param {string[]} argv args after the `remove` word (argv[0] = target).
|
|
206
|
+
* @param {object} [opts]
|
|
207
|
+
* @returns {number}
|
|
208
|
+
*/
|
|
209
|
+
export function removeAgent(argv = [], opts = {}) {
|
|
210
|
+
const out = opts.stdout ?? process.stdout;
|
|
211
|
+
const err = opts.stderr ?? process.stderr;
|
|
212
|
+
const readJson = opts.readJson ?? readJsonSafe;
|
|
213
|
+
const loginPath = opts.loginPath ?? loginFilePath();
|
|
214
|
+
const writeConfig = opts.writeConfig ?? ((partial) => updateDaemonConfig(partial, { path: loginPath }));
|
|
215
|
+
|
|
216
|
+
const first = argv[0];
|
|
217
|
+
if (first === "--help" || first === "-h") {
|
|
218
|
+
out.write(removeHelpText());
|
|
219
|
+
return 0;
|
|
220
|
+
}
|
|
221
|
+
const target = nonEmpty(first);
|
|
222
|
+
if (!target) {
|
|
223
|
+
err.write("error: `chorus agents remove` requires an agent name or UUID.\n" + removeHelpText());
|
|
224
|
+
return 2;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
const file = readJson(loginPath);
|
|
228
|
+
const agents = file && Array.isArray(file.agents) ? file.agents.filter((a) => a && typeof a === "object") : [];
|
|
229
|
+
const keysOf = (a) => [a.agentUuid, a.agentName, a.label, a.name].map(nonEmpty).filter((k) => k !== undefined);
|
|
230
|
+
const matches = [];
|
|
231
|
+
agents.forEach((a, i) => {
|
|
232
|
+
if (keysOf(a).includes(target)) matches.push(i);
|
|
233
|
+
});
|
|
234
|
+
|
|
235
|
+
if (matches.length === 0) {
|
|
236
|
+
err.write(`error: no configured agent matches "${target}" in ${loginPath}.\n`);
|
|
237
|
+
if (agents.length) {
|
|
238
|
+
err.write("Configured agents:\n");
|
|
239
|
+
agents.forEach((a, i) =>
|
|
240
|
+
err.write(` [${i}] ${nonEmpty(a.agentName) ?? "(unnamed)"} ${nonEmpty(a.agentUuid) ?? "(no uuid)"}\n`),
|
|
241
|
+
);
|
|
242
|
+
} else {
|
|
243
|
+
err.write("(none configured)\n");
|
|
244
|
+
}
|
|
245
|
+
return 1;
|
|
246
|
+
}
|
|
247
|
+
if (matches.length > 1) {
|
|
248
|
+
err.write(
|
|
249
|
+
`error: "${target}" is ambiguous — it matches ${matches.length} agents. Use the agent UUID to disambiguate.\n`,
|
|
250
|
+
);
|
|
251
|
+
return 2;
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
const idx = matches[0];
|
|
255
|
+
const removed = agents[idx];
|
|
256
|
+
const remaining = agents.filter((_, i) => i !== idx);
|
|
257
|
+
// Replace agents[] wholesale (updateDaemonConfig shallow-merges the patch, so a
|
|
258
|
+
// new `agents` array overwrites the old one) — preserves every top-level field.
|
|
259
|
+
writeConfig({ agents: remaining });
|
|
260
|
+
|
|
261
|
+
out.write(
|
|
262
|
+
`Removed agent ${nonEmpty(removed.agentName) ?? "(unnamed)"} (${nonEmpty(removed.agentUuid) ?? "no uuid"}) ` +
|
|
263
|
+
`from ${loginPath}. ${remaining.length} agent(s) remain.\n`,
|
|
264
|
+
);
|
|
265
|
+
// dsh: $DSH_HOME/.env holds a single shared url+key (not per-agent) and is left
|
|
266
|
+
// untouched. dsh maps to the "offline" daemon agentType bucket — surface the note there.
|
|
267
|
+
if (nonEmpty(removed.agentType) === "offline") {
|
|
268
|
+
out.write(
|
|
269
|
+
"Note: any dsh $DSH_HOME/.env credentials were left untouched (a single shared file) — clear them manually if needed.\n",
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
// Claude Code: `chorus agents add` may have written CHORUS_* into the user-global
|
|
273
|
+
// ~/.claude/settings.json env block. Reverse cleanup is out of scope — leave it in place
|
|
274
|
+
// (a later re-add overwrites it idempotently) but tell the operator, mirroring the dsh note.
|
|
275
|
+
if (nonEmpty(removed.agentType) === "claude-code") {
|
|
276
|
+
out.write(
|
|
277
|
+
"Note: any CHORUS_* keys written into ~/.claude/settings.json were left untouched — clear them manually if needed.\n",
|
|
278
|
+
);
|
|
279
|
+
}
|
|
280
|
+
// Codex: `chorus agents add` may have written CHORUS_* into ~/.codex/.env (and a keyless
|
|
281
|
+
// [mcp_servers.chorus] block that references CHORUS_API_KEY via bearer_token_env_var in
|
|
282
|
+
// ~/.codex/config.toml — no literal key). Reverse cleanup is out of scope — leave it, tell the operator.
|
|
283
|
+
if (nonEmpty(removed.agentType) === "codex") {
|
|
284
|
+
out.write(
|
|
285
|
+
"Note: any CHORUS_* env written into ~/.codex/.env " +
|
|
286
|
+
"(and the keyless [mcp_servers.chorus] block in ~/.codex/config.toml, which references the key via bearer_token_env_var) were left untouched — clear them manually if needed.\n",
|
|
287
|
+
);
|
|
288
|
+
}
|
|
289
|
+
return 0;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Run `chorus agents [list|add|remove] …`. Dispatches the sub-verb:
|
|
294
|
+
* (none) / `list` → list configured agents
|
|
295
|
+
* `add [flags]` → runInit (the flow formerly reached via `chorus init`)
|
|
296
|
+
* `remove <n|uuid>` → removeAgent
|
|
297
|
+
* A group-level `--help`/`-h` prints the group usage. Never boots the server.
|
|
298
|
+
* Returns an exit code (or a Promise thereof for `add`).
|
|
299
|
+
* @param {string[]} argv argv AFTER the `agents` word.
|
|
300
|
+
* @param {object} [opts]
|
|
301
|
+
* @returns {number | Promise<number>}
|
|
302
|
+
*/
|
|
303
|
+
export function runAgents(argv = [], opts = {}) {
|
|
304
|
+
const out = opts.stdout ?? process.stdout;
|
|
305
|
+
const err = opts.stderr ?? process.stderr;
|
|
306
|
+
const version = opts.version ?? "";
|
|
307
|
+
const first = argv[0];
|
|
308
|
+
|
|
309
|
+
if (first === "--help" || first === "-h") {
|
|
310
|
+
out.write(agentsHelpText(version));
|
|
311
|
+
return 0;
|
|
312
|
+
}
|
|
313
|
+
if (first === "add") {
|
|
314
|
+
// Delegate to the existing init flow (renamed entry). Dynamic import keeps the
|
|
315
|
+
// list/remove paths from loading the heavier init subsystem.
|
|
316
|
+
const runInit = opts.runInit ?? (async (a, o) => (await import("./init.mjs")).runInit(a, o));
|
|
317
|
+
return runInit(argv.slice(1), { version });
|
|
318
|
+
}
|
|
319
|
+
if (first === "remove") {
|
|
320
|
+
return removeAgent(argv.slice(1), opts);
|
|
321
|
+
}
|
|
322
|
+
// An unknown positional sub-verb (not `list`, not a flag) is a usage error.
|
|
323
|
+
if (first !== undefined && first !== "list" && !first.startsWith("-")) {
|
|
324
|
+
err.write(`error: unknown \`chorus agents\` subcommand: ${first}\n\n${agentsHelpText(version)}`);
|
|
325
|
+
return 2;
|
|
326
|
+
}
|
|
327
|
+
// Bare `chorus agents`, explicit `list`, or list flags (--json/--help handled inside).
|
|
328
|
+
return listAgents(first === "list" ? argv.slice(1) : argv, opts);
|
|
329
|
+
}
|
package/cli/chorus-client.mjs
CHANGED
|
@@ -76,6 +76,56 @@ export class ChorusClient {
|
|
|
76
76
|
}
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
+
/**
|
|
80
|
+
* Like {@link callTool} but returns the tool result's text content VERBATIM,
|
|
81
|
+
* never JSON-parsed — the byte-faithful form the `chorus mcp call` CLI prints
|
|
82
|
+
* to stay a drop-in for `chorus-api.sh mcp-tool` (which emits
|
|
83
|
+
* `.result.content[].text`). `text` is the newline-join of every `content[]`
|
|
84
|
+
* block whose `type` is `text`. Lazy-connects; retries once on a stateless
|
|
85
|
+
* 404 / session-expired error, mirroring {@link callTool}.
|
|
86
|
+
* @param {string} name
|
|
87
|
+
* @param {Record<string, unknown>} [args]
|
|
88
|
+
* @returns {Promise<{ isError: boolean, text: string }>}
|
|
89
|
+
*/
|
|
90
|
+
async callToolRaw(name, args = {}) {
|
|
91
|
+
if (!this.client || this.status !== "connected") await this.connect();
|
|
92
|
+
try {
|
|
93
|
+
return await this.#doCallToolRaw(name, args);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
if (this.#isSessionExpired(err)) {
|
|
96
|
+
this.logger.warn("MCP session expired, reconnecting...");
|
|
97
|
+
this.status = "reconnecting";
|
|
98
|
+
this.client = null;
|
|
99
|
+
this.transport = null;
|
|
100
|
+
await this.connect();
|
|
101
|
+
return await this.#doCallToolRaw(name, args);
|
|
102
|
+
}
|
|
103
|
+
throw err;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* List the tools this connection's API key is permitted to see. Lazy-connects;
|
|
109
|
+
* retries once on a stateless 404 / session-expired error.
|
|
110
|
+
* @returns {Promise<Array<{ name: string, description: string }>>}
|
|
111
|
+
*/
|
|
112
|
+
async listTools() {
|
|
113
|
+
if (!this.client || this.status !== "connected") await this.connect();
|
|
114
|
+
try {
|
|
115
|
+
return await this.#doListTools();
|
|
116
|
+
} catch (err) {
|
|
117
|
+
if (this.#isSessionExpired(err)) {
|
|
118
|
+
this.logger.warn("MCP session expired, reconnecting...");
|
|
119
|
+
this.status = "reconnecting";
|
|
120
|
+
this.client = null;
|
|
121
|
+
this.transport = null;
|
|
122
|
+
await this.connect();
|
|
123
|
+
return await this.#doListTools();
|
|
124
|
+
}
|
|
125
|
+
throw err;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
79
129
|
async disconnect() {
|
|
80
130
|
if (this.client) {
|
|
81
131
|
try {
|
|
@@ -89,6 +139,25 @@ export class ChorusClient {
|
|
|
89
139
|
this.status = "disconnected";
|
|
90
140
|
}
|
|
91
141
|
|
|
142
|
+
/** @param {string} name @param {Record<string, unknown>} args */
|
|
143
|
+
async #doCallToolRaw(name, args) {
|
|
144
|
+
if (!this.client) throw new Error("MCP client not connected");
|
|
145
|
+
const result = await this.client.callTool({ name, arguments: args });
|
|
146
|
+
const blocks = /** @type {Array<{type:string,text?:string}>} */ (result.content ?? []);
|
|
147
|
+
const text = blocks
|
|
148
|
+
.filter((c) => c.type === "text")
|
|
149
|
+
.map((c) => c.text ?? "")
|
|
150
|
+
.join("\n");
|
|
151
|
+
return { isError: Boolean(result.isError), text };
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
async #doListTools() {
|
|
155
|
+
if (!this.client) throw new Error("MCP client not connected");
|
|
156
|
+
const result = await this.client.listTools();
|
|
157
|
+
const tools = /** @type {Array<{name:string,description?:string}>} */ (result.tools ?? []);
|
|
158
|
+
return tools.map((t) => ({ name: t.name, description: t.description ?? "" }));
|
|
159
|
+
}
|
|
160
|
+
|
|
92
161
|
/** @param {string} name @param {Record<string, unknown>} args */
|
|
93
162
|
async #doCallTool(name, args) {
|
|
94
163
|
if (!this.client) throw new Error("MCP client not connected");
|
package/cli/claude-spawner.mjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
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.
|
|
6
|
+
// Verified against Claude Code CLI 2.1.251:
|
|
7
7
|
// • `-p/--print` + `--output-format stream-json` emits NDJSON (one JSON object
|
|
8
8
|
// per line); every line carries `session_id`.
|
|
9
9
|
// • `--session-id <uuid>` sets the session id for a fresh run, and
|
|
@@ -32,6 +32,28 @@ const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
|
32
32
|
/** Matches a canonical lowercase UUID (any version). Chorus idea uuids are v4. */
|
|
33
33
|
const UUID_RE = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/;
|
|
34
34
|
|
|
35
|
+
/** Backend-neutral failure classification consumed by the wake orchestrator. */
|
|
36
|
+
export const SESSION_CONFLICT_FAILURE = "session_conflict";
|
|
37
|
+
|
|
38
|
+
const STDERR_BUFFER_LIMIT = 64 * 1024;
|
|
39
|
+
const SESSION_CONFLICT_RE = /\bsession id\b[^\r\n]{0,200}\bis already in use\b/i;
|
|
40
|
+
const CLAUDE_PROJECT_KEY_CAP = 200;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Claude Code 2.1.251's Java-style signed 32-bit string hash, rendered as the
|
|
44
|
+
* absolute value in base36. Iterating by index intentionally hashes UTF-16 code
|
|
45
|
+
* units (including each surrogate in an astral character) rather than code points.
|
|
46
|
+
* @param {string} value
|
|
47
|
+
* @returns {string}
|
|
48
|
+
*/
|
|
49
|
+
function projectKeyHash(value) {
|
|
50
|
+
let hash = 0;
|
|
51
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
52
|
+
hash = ((hash << 5) - hash + value.charCodeAt(index)) | 0;
|
|
53
|
+
}
|
|
54
|
+
return Math.abs(hash).toString(36);
|
|
55
|
+
}
|
|
56
|
+
|
|
35
57
|
/**
|
|
36
58
|
* True iff `id` is a well-formed, lowercase UUID. The daemon anchors the Claude
|
|
37
59
|
* session id on a Chorus idea uuid (already lowercase v4); we validate before
|
|
@@ -45,22 +67,27 @@ export function isValidSessionId(id) {
|
|
|
45
67
|
}
|
|
46
68
|
|
|
47
69
|
/**
|
|
48
|
-
* Claude Code's transcript directory for a working directory. Verified against
|
|
49
|
-
*
|
|
50
|
-
*
|
|
51
|
-
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
70
|
+
* Claude Code's transcript directory for a working directory. Verified against
|
|
71
|
+
* Claude Code 2.1.251's live Linux install and on-disk transcripts: every
|
|
72
|
+
* non-ASCII-alphanumeric UTF-16 code unit becomes `-`. That includes separators,
|
|
73
|
+
* dots, spaces, underscores, and non-ASCII characters; existing hyphens remain
|
|
74
|
+
* byte-identical because replacing `-` with `-` is a no-op. Escaped keys longer
|
|
75
|
+
* than 200 characters use the first 200 characters plus `-` and the base36
|
|
76
|
+
* Java-style signed 32-bit hash of the original cwd. The same expression produces
|
|
77
|
+
* the established Windows fixture, though the Windows on-disk layout remains
|
|
78
|
+
* best-effort until verified on a Windows Claude installation.
|
|
54
79
|
* @param {string} cwd Absolute working directory.
|
|
55
80
|
* @param {NodeJS.Platform} [platform]
|
|
56
81
|
* @returns {string}
|
|
57
82
|
*/
|
|
58
83
|
export function escapeCwd(cwd, platform = process.platform) {
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
84
|
+
// `platform` remains in the signature for fixture/API compatibility. Claude's
|
|
85
|
+
// observed sanitizer is platform-independent; platform path syntax supplies
|
|
86
|
+
// the differing separator/drive characters that this expression normalizes.
|
|
87
|
+
void platform;
|
|
88
|
+
const escaped = cwd.replace(/[^a-zA-Z0-9]/g, "-");
|
|
89
|
+
if (escaped.length <= CLAUDE_PROJECT_KEY_CAP) return escaped;
|
|
90
|
+
return `${escaped.slice(0, CLAUDE_PROJECT_KEY_CAP)}-${projectKeyHash(cwd)}`;
|
|
64
91
|
}
|
|
65
92
|
|
|
66
93
|
/**
|
|
@@ -284,7 +311,8 @@ export class ClaudeSpawner {
|
|
|
284
311
|
* so the waker can store the handle in its execution registry for the interrupt
|
|
285
312
|
* path BEFORE this promise resolves. It is invoked once, synchronously, only on a
|
|
286
313
|
* successful spawn; a spawn failure never calls it.
|
|
287
|
-
* @returns {Promise<{ sessionId: string, backendSessionId: string|null, exitCode: number|null, isNew: boolean
|
|
314
|
+
* @returns {Promise<{ sessionId: string, backendSessionId: string|null, exitCode: number|null, isNew: boolean,
|
|
315
|
+
* failureClassification?: "session_conflict" }>}
|
|
288
316
|
* `backendSessionId` is the Claude `--resume` anchor (the input `sessionId`) on a
|
|
289
317
|
* terminal resolution after a spawn, so the conversation UI can offer a resumable
|
|
290
318
|
* id — mirrors codex-spawner's shape. `null` on the pre-spawn failure paths (no
|
|
@@ -329,6 +357,10 @@ export class ClaudeSpawner {
|
|
|
329
357
|
if (this.creds) {
|
|
330
358
|
if (this.creds.url) childEnv.CHORUS_URL = this.creds.url;
|
|
331
359
|
if (this.creds.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
|
|
360
|
+
// Identity profile for the woken session — its hooks/skills pass this to
|
|
361
|
+
// `chorus mcp --agent`, which resolves the key from ~/.chorus/daemon.json.
|
|
362
|
+
if (this.creds.agentUuid || this.creds.agentName)
|
|
363
|
+
childEnv.CHORUS_AGENT_PROFILE = this.creds.agentUuid || this.creds.agentName;
|
|
332
364
|
}
|
|
333
365
|
|
|
334
366
|
return new Promise((resolve) => {
|
|
@@ -365,6 +397,8 @@ export class ClaudeSpawner {
|
|
|
365
397
|
}
|
|
366
398
|
|
|
367
399
|
let stdoutBuf = "";
|
|
400
|
+
let stderrBuf = "";
|
|
401
|
+
let sessionConflictSeen = false;
|
|
368
402
|
let observedSessionId = id;
|
|
369
403
|
|
|
370
404
|
child.stdout?.setEncoding?.("utf8");
|
|
@@ -388,7 +422,10 @@ export class ClaudeSpawner {
|
|
|
388
422
|
|
|
389
423
|
child.stderr?.setEncoding?.("utf8");
|
|
390
424
|
child.stderr?.on("data", (chunk) => {
|
|
391
|
-
const
|
|
425
|
+
const rawText = String(chunk);
|
|
426
|
+
stderrBuf = (stderrBuf + rawText).slice(-STDERR_BUFFER_LIMIT);
|
|
427
|
+
if (SESSION_CONFLICT_RE.test(stderrBuf)) sessionConflictSeen = true;
|
|
428
|
+
const text = rawText.trim();
|
|
392
429
|
if (text) this.logger.warn(`[Chorus] claude stderr: ${text}`);
|
|
393
430
|
});
|
|
394
431
|
|
|
@@ -407,7 +444,11 @@ export class ClaudeSpawner {
|
|
|
407
444
|
}
|
|
408
445
|
// backendSessionId is the `--resume` anchor (`id`), NOT observedSessionId (see
|
|
409
446
|
// the process-error handler above for why the anchor is the resumable value).
|
|
410
|
-
|
|
447
|
+
const result = { sessionId: observedSessionId, backendSessionId: id, exitCode: code, isNew };
|
|
448
|
+
if (code !== null && code !== 0 && sessionConflictSeen) {
|
|
449
|
+
result.failureClassification = SESSION_CONFLICT_FAILURE;
|
|
450
|
+
}
|
|
451
|
+
resolve(result);
|
|
411
452
|
});
|
|
412
453
|
|
|
413
454
|
// Guard against an ASYNC stdin error (EPIPE): if claude exits/closes
|
package/cli/codex-spawner.mjs
CHANGED
|
@@ -14,12 +14,13 @@
|
|
|
14
14
|
// `resume <thread_id>`. (serde: ThreadEvent tag="type", rename="thread.started";
|
|
15
15
|
// ThreadStartedEvent.thread_id: String — codex-rs/exec/src/exec_events.rs.)
|
|
16
16
|
// • No `--mcp-config`: Codex reads MCP servers from the user's ~/.codex/config.toml.
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
// tooling
|
|
22
|
-
// (Multi-agent: two Codex agents with different keys each need their own
|
|
17
|
+
// `chorus agents add` writes [mcp_servers.chorus] with bearer_token_env_var =
|
|
18
|
+
// "CHORUS_API_KEY" — a KEYLESS reference (no literal key in config.toml), and Codex
|
|
19
|
+
// resolves that env var into `Authorization: Bearer <key>` at connect. So the
|
|
20
|
+
// CHORUS_API_KEY the daemon exports into the child env below DOES reach Codex's MCP
|
|
21
|
+
// auth (as well as the plugin's shell tooling — chorus-api.sh / SessionStart hooks);
|
|
22
|
+
// never argv. (Multi-agent: two Codex agents with different keys each need their own
|
|
23
|
+
// CODEX_HOME so their config.toml + ~/.codex/.env don't collide.)
|
|
23
24
|
// • Permission is a SANDBOX mode, not a tool allowlist.
|
|
24
25
|
//
|
|
25
26
|
// Reuses claude-spawner's platform-neutral helpers: parseNdjsonChunk (NDJSON
|
|
@@ -276,6 +277,10 @@ export class CodexSpawner {
|
|
|
276
277
|
if (this.creds) {
|
|
277
278
|
if (this.creds.url) childEnv.CHORUS_URL = this.creds.url;
|
|
278
279
|
if (this.creds.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
|
|
280
|
+
// Identity profile for the woken session — its hooks/skills pass this to
|
|
281
|
+
// `chorus mcp --agent`, which resolves the key from ~/.chorus/daemon.json.
|
|
282
|
+
if (this.creds.agentUuid || this.creds.agentName)
|
|
283
|
+
childEnv.CHORUS_AGENT_PROFILE = this.creds.agentUuid || this.creds.agentName;
|
|
279
284
|
}
|
|
280
285
|
|
|
281
286
|
return new Promise((resolve) => {
|