@chorus-aidlc/chorus 0.10.0 → 0.11.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 +463 -346
- package/.next/standalone/.next/app-path-routes-manifest.json +50 -36
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +27 -27
- package/.next/standalone/.next/routes-manifest.json +25 -0
- 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]/proposals/[proposalUuid]/page.js +2 -3
- 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 -8
- 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 +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +5 -5
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +5 -5
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +1 -1
- package/.next/standalone/.next/server/app/admin/companies.rsc +5 -5
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +1 -1
- package/.next/standalone/.next/server/app/admin.rsc +5 -5
- 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 -0
- package/.next/standalone/.next/server/app/api/agent-connections/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -0
- 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_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/refresh/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/refresh/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/session/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/session/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/control/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/control/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/executions/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -0
- 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 -0
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/events/notifications/route.js +6 -2
- 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 +7 -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/mcp/route.js +5 -41
- 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/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]/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]/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/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.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/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/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 +1 -1
- package/.next/standalone/.next/server/app/index.rsc +5 -5
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +1 -1
- package/.next/standalone/.next/server/app/login/admin.rsc +5 -5
- 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 +1 -1
- package/.next/standalone/.next/server/app/login/callback.rsc +5 -5
- 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 +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +5 -5
- package/.next/standalone/.next/server/app/login/silent-refresh/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.html +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.rsc +5 -5
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +5 -5
- 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 +1 -1
- package/.next/standalone/.next/server/app/onboarding.rsc +6 -6
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects.html +1 -1
- package/.next/standalone/.next/server/app/projects.rsc +7 -7
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +7 -7
- package/.next/standalone/.next/server/app-paths-manifest.json +50 -36
- package/.next/standalone/.next/server/chunks/1064.js +1 -0
- package/.next/standalone/.next/server/chunks/1596.js +13 -0
- package/.next/standalone/.next/server/chunks/2213.js +1 -0
- 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/3219.js +2 -0
- package/.next/standalone/.next/server/chunks/3371.js +1 -0
- package/.next/standalone/.next/server/chunks/3419.js +1 -0
- package/.next/standalone/.next/server/chunks/369.js +1 -0
- package/.next/standalone/.next/server/chunks/4638.js +1 -0
- package/.next/standalone/.next/server/chunks/4711.js +530 -0
- package/.next/standalone/.next/server/chunks/5039.js +1 -0
- package/.next/standalone/.next/server/chunks/5300.js +1 -1
- package/.next/standalone/.next/server/chunks/5631.js +1 -0
- package/.next/standalone/.next/server/chunks/6044.js +1 -1
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6207.js +1 -1
- package/.next/standalone/.next/server/chunks/6461.js +1 -0
- package/.next/standalone/.next/server/chunks/6712.js +1 -0
- package/.next/standalone/.next/server/chunks/7002.js +1 -1
- package/.next/standalone/.next/server/chunks/7063.js +2 -2
- package/.next/standalone/.next/server/chunks/7258.js +37 -0
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/7578.js +2 -2
- package/.next/standalone/.next/server/chunks/7867.js +1 -0
- package/.next/standalone/.next/server/chunks/7897.js +1 -0
- package/.next/standalone/.next/server/chunks/8012.js +1 -0
- package/.next/standalone/.next/server/chunks/8245.js +31 -0
- package/.next/standalone/.next/server/chunks/8322.js +1 -1
- package/.next/standalone/.next/server/chunks/9015.js +1 -1
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/937.js +16 -2
- package/.next/standalone/.next/server/chunks/9629.js +1 -0
- package/.next/standalone/.next/server/chunks/9725.js +1 -0
- package/.next/standalone/.next/server/instrumentation.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/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 +1 -1
- 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 +1 -1
- package/.next/standalone/.next/static/519aK55QLHaVN7b1TVDkB/_buildManifest.js +1 -0
- package/.next/standalone/.next/static/chunks/1217-323cc20b73ebfde9.js +1 -0
- package/.next/standalone/.next/static/chunks/{11207-8f4b154804f5a66f.js → 15183-5734d279b26e9414.js} +2 -2
- package/.next/standalone/.next/static/chunks/1879-7a8b283283218df2.js +1 -0
- package/.next/standalone/.next/static/chunks/19276-50b367d7b93d5f34.js +1 -0
- package/.next/standalone/.next/static/chunks/23466-e1176a6d814f4897.js +1 -0
- package/.next/standalone/.next/static/chunks/38040-a8687f86dd8e9d67.js +1 -0
- package/.next/standalone/.next/static/chunks/{4860.e071c0b9e32bd75f.js → 4860.43f5ad8a3aaed0e8.js} +1 -1
- package/.next/standalone/.next/static/chunks/58245-b2ea112ace9624d2.js +1 -0
- package/.next/standalone/.next/static/chunks/59296-783831c43aa0162e.js +1 -0
- package/.next/standalone/.next/static/chunks/60648-36ccbee4ce232d52.js +1 -0
- package/.next/standalone/.next/static/chunks/60694-68232120903209df.js +1 -0
- package/.next/standalone/.next/static/chunks/64648-81f03be6f9793ab9.js +1 -0
- package/.next/standalone/.next/static/chunks/{94655-1c75e0590a66215e.js → 66969-12f0b22c51f5a410.js} +1 -1
- package/.next/standalone/.next/static/chunks/70536-b8bf71098ae11f07.js +1 -0
- package/.next/standalone/.next/static/chunks/71350-88c2649fc693c1e8.js +1 -0
- package/.next/standalone/.next/static/chunks/78389-b32edc6bd5c570a9.js +1 -0
- package/.next/standalone/.next/static/chunks/78584-eb2fa8cf2f266329.js +1 -0
- package/.next/standalone/.next/static/chunks/78917-150ed14a99844aab.js +1 -0
- package/.next/standalone/.next/static/chunks/8574-b9739eb8d054c793.js +1 -0
- package/.next/standalone/.next/static/chunks/{99373.4c336ea9ad07311e.js → 99373.0768feb3a08c7da3.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-0a28456fea4ce95a.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-a79969c5c9aadacd.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-e00752a72c31663f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-ef82b871895245ea.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-2c9bcbd11ddb8661.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-630b168598513ce8.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-99639479cc98965f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-335f2450e44a0fba.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-4a191d69b2b6e880.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-0faebb478be4c85d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-f198303c176c6e02.js → page-583e58d4d689d38b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-2e8fcb72687100df.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/session/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/comments/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/health/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/search/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/layout-9963339572e2e64e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/page-e9a69a0c537c704f.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-5bb5740df10ed622.js → webpack-87284a4533d77eaf.js} +1 -1
- package/.next/standalone/.next/static/css/{84edd78de243cde6.css → b496025c9cd768cc.css} +1 -1
- package/.next/standalone/.next/static/css/e78b3c856420a09f.css +1 -0
- package/.next/standalone/.next/static/media/013b72fa676f92e0-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/2b5b02fc7e511755-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/65f03d54ccadf4a8-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/7d4881bb7e1bf84d-s.p.woff2 +0 -0
- package/.next/standalone/.next/static/media/b9408752a0c24fb9-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/e038a29029a234f2-s.woff2 +0 -0
- package/.next/standalone/package.json +3 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +2 -1
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +2 -1
- package/.next/standalone/public/skill/package.json +1 -1
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/README.md +27 -0
- package/README.zh.md +27 -0
- package/chorus.mjs +120 -16
- package/cli/backfill.mjs +190 -0
- package/cli/chorus-client.mjs +154 -0
- package/cli/claude-spawner.mjs +415 -0
- package/cli/client-args.mjs +146 -0
- package/cli/control-handler.mjs +180 -0
- package/cli/credentials.mjs +155 -0
- package/cli/daemon-agent.mjs +38 -0
- package/cli/daemon-banner.mjs +80 -0
- package/cli/daemon-config.mjs +84 -0
- package/cli/daemon-lifecycle.mjs +191 -0
- package/cli/daemon-permission-mode.mjs +68 -0
- package/cli/daemon-rest-client.mjs +272 -0
- package/cli/daemon.mjs +572 -0
- package/cli/event-router.mjs +248 -0
- package/cli/interrupt-reporter.mjs +87 -0
- package/cli/lineage.mjs +155 -0
- package/cli/login.mjs +151 -0
- package/cli/mcp-config.mjs +58 -0
- package/cli/process-killer.mjs +205 -0
- package/cli/prompts.mjs +273 -0
- package/cli/sse-listener.mjs +258 -0
- package/cli/turn-reporter.mjs +75 -0
- package/cli/upload-hooks.mjs +400 -0
- package/cli/wake-queue.mjs +121 -0
- package/cli/waker.mjs +475 -0
- package/package.json +3 -1
- package/prisma/migrations/20260615082309_add_daemon_connection/migration.sql +37 -0
- package/prisma/migrations/20260616152622_add_daemon_task_execution/migration.sql +28 -0
- package/prisma/migrations/20260617013334_generalize_daemon_execution_to_any_resource/migration.sql +38 -0
- package/prisma/migrations/20260618022828_add_daemon_execution_interrupted/migration.sql +2 -0
- package/prisma/migrations/20260619055322_daemon_session_conversation/migration.sql +77 -0
- package/prisma/schema.prisma +366 -188
- package/.next/standalone/.next/server/chunks/1059.js +0 -1
- package/.next/standalone/.next/server/chunks/1165.js +0 -1
- package/.next/standalone/.next/server/chunks/1615.js +0 -31
- package/.next/standalone/.next/server/chunks/162.js +0 -16
- package/.next/standalone/.next/server/chunks/179.js +0 -158
- package/.next/standalone/.next/server/chunks/1871.js +0 -1
- package/.next/standalone/.next/server/chunks/2909.js +0 -98
- package/.next/standalone/.next/server/chunks/324.js +0 -1
- package/.next/standalone/.next/server/chunks/3555.js +0 -1
- package/.next/standalone/.next/server/chunks/4090.js +0 -13
- package/.next/standalone/.next/server/chunks/4343.js +0 -1
- package/.next/standalone/.next/server/chunks/4879.js +0 -1
- package/.next/standalone/.next/server/chunks/4913.js +0 -1
- package/.next/standalone/.next/server/chunks/5541.js +0 -1
- package/.next/standalone/.next/server/chunks/5561.js +0 -7
- package/.next/standalone/.next/server/chunks/6643.js +0 -1
- package/.next/standalone/.next/server/chunks/6767.js +0 -1
- package/.next/standalone/.next/server/chunks/7228.js +0 -2
- package/.next/standalone/.next/server/chunks/7462.js +0 -255
- package/.next/standalone/.next/server/chunks/7859.js +0 -1
- package/.next/standalone/.next/server/chunks/8277.js +0 -1
- package/.next/standalone/.next/server/chunks/8637.js +0 -1
- package/.next/standalone/.next/server/chunks/896.js +0 -1
- package/.next/standalone/.next/server/chunks/9269.js +0 -1
- package/.next/standalone/.next/server/chunks/9615.js +0 -1
- package/.next/standalone/.next/static/AKJHlhCKd44_-khht8nN0/_buildManifest.js +0 -1
- package/.next/standalone/.next/static/chunks/20051-c242544dafd3a690.js +0 -1
- package/.next/standalone/.next/static/chunks/21932-bce5ba937d1603e1.js +0 -1
- package/.next/standalone/.next/static/chunks/23095-5bf481236249fdd8.js +0 -1
- package/.next/standalone/.next/static/chunks/23466-842c126491b753bc.js +0 -1
- package/.next/standalone/.next/static/chunks/45436-c5427023f3f386a1.js +0 -1
- package/.next/standalone/.next/static/chunks/49852-5337f139a2f87c46.js +0 -1
- package/.next/standalone/.next/static/chunks/52206-7c1b0c695c8035eb.js +0 -1
- package/.next/standalone/.next/static/chunks/55469-ed5ff019ff71ef59.js +0 -1
- package/.next/standalone/.next/static/chunks/59296-50e66102d44d9677.js +0 -1
- package/.next/standalone/.next/static/chunks/60524-9811b38c62fed16e.js +0 -1
- package/.next/standalone/.next/static/chunks/68855-5c15991e7cf8dc8a.js +0 -1
- package/.next/standalone/.next/static/chunks/70093-0ff6fd59445b5cb9.js +0 -1
- package/.next/standalone/.next/static/chunks/74030-3a6a6b75e47f5b96.js +0 -1
- package/.next/standalone/.next/static/chunks/78917-ff0fda86a96cfa60.js +0 -1
- package/.next/standalone/.next/static/chunks/95627-8d9f6d2d88f7a641.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-5915ccd1a77ebcf8.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-94d102d945410b55.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-56c45b910f914895.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-2e000a7010d1e9ea.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-75e42d130404ca2b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-d7747749ae6192d8.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-26488809d26e1daa.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-8f91ed174c14d5f0.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-fcc9baa42e6de4d4.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-5233748464280e9d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-ab87cbb18d0ee538.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/session/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/comments/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/health/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/search/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-482dee7dace72c88.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-d9dbd817391b462b.js +0 -1
- package/.next/standalone/.next/static/css/4279f38594ac772a.css +0 -1
- package/.next/standalone/.next/static/media/0f1bdadaf30e2d5f-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/2c34d62a75506231-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/601f5c280d60caca-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/a115172161b307bb-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/d100b2a099e34044-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/f5271587012faf78-s.p.woff2 +0 -0
- /package/.next/standalone/.next/static/{AKJHlhCKd44_-khht8nN0 → 519aK55QLHaVN7b1TVDkB}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
// cli/client-args.mjs
|
|
2
|
+
// Argument parsing + help text for the `chorus` client subcommands (`daemon`,
|
|
3
|
+
// `login`). Extracted from chorus.mjs so it is pure and unit-testable — the
|
|
4
|
+
// entry-point module runs side effects (server launch, process.exit) at import
|
|
5
|
+
// time and cannot be imported into a test. chorus.mjs imports these helpers.
|
|
6
|
+
//
|
|
7
|
+
// Zero dependencies — ships verbatim in the npm package alongside chorus.mjs.
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The daemon lifecycle sub-actions (background-mode control). `run` (the
|
|
11
|
+
* default long-lived daemon) is intentionally NOT in this set — it is the
|
|
12
|
+
* absence of a recognized sub-action token.
|
|
13
|
+
*/
|
|
14
|
+
export const DAEMON_ACTIONS = new Set(["stop", "status", "restart", "logs"]);
|
|
15
|
+
|
|
16
|
+
/** Known agent backends. Only `claude-code` is implemented; the rest reserve
|
|
17
|
+
* the extension point (see daemon-agent-selection). Exported for the resolver
|
|
18
|
+
* the --agent task wires in; parsing here does not validate the value. */
|
|
19
|
+
export const KNOWN_AGENTS = new Set(["claude-code"]);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Parse the client-subcommand flags out of an arg list. Recognizes the
|
|
23
|
+
* pre-existing `--url` / `--api-key` / `--sigint-timeout` (space and `=` forms)
|
|
24
|
+
* and boolean `--yolo`, plus the new `--agent <type>` (space + `=`), boolean
|
|
25
|
+
* `--chorus-only`, `--verbose`, `-d`/`--detach`, and `--help`/`-h`.
|
|
26
|
+
*
|
|
27
|
+
* Only keys that appear are set, so callers can distinguish "unset" from
|
|
28
|
+
* "false" (important for layered env/flag precedence downstream).
|
|
29
|
+
*
|
|
30
|
+
* @param {string[]} argv
|
|
31
|
+
* @returns {{
|
|
32
|
+
* url?: string, apiKey?: string, yolo?: boolean, sigintTimeout?: string,
|
|
33
|
+
* agent?: string, chorusOnly?: boolean, verbose?: boolean, detach?: boolean,
|
|
34
|
+
* help?: boolean,
|
|
35
|
+
* }}
|
|
36
|
+
*/
|
|
37
|
+
export function parseClientFlags(argv) {
|
|
38
|
+
const out = {};
|
|
39
|
+
for (let i = 0; i < argv.length; i++) {
|
|
40
|
+
const a = argv[i];
|
|
41
|
+
if (a === "--url") out.url = argv[i + 1];
|
|
42
|
+
else if (a.startsWith("--url=")) out.url = a.slice("--url=".length);
|
|
43
|
+
else if (a === "--api-key") out.apiKey = argv[i + 1];
|
|
44
|
+
else if (a.startsWith("--api-key=")) out.apiKey = a.slice("--api-key=".length);
|
|
45
|
+
else if (a === "--yolo") out.yolo = true;
|
|
46
|
+
else if (a === "--sigint-timeout") out.sigintTimeout = argv[i + 1];
|
|
47
|
+
else if (a.startsWith("--sigint-timeout=")) out.sigintTimeout = a.slice("--sigint-timeout=".length);
|
|
48
|
+
else if (a === "--agent") out.agent = argv[i + 1];
|
|
49
|
+
else if (a.startsWith("--agent=")) out.agent = a.slice("--agent=".length);
|
|
50
|
+
else if (a === "--chorus-only") out.chorusOnly = true;
|
|
51
|
+
else if (a === "--verbose") out.verbose = true;
|
|
52
|
+
else if (a === "-d" || a === "--detach") out.detach = true;
|
|
53
|
+
else if (a === "--help" || a === "-h") out.help = true;
|
|
54
|
+
}
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Determine the daemon lifecycle sub-action from the args following `daemon`.
|
|
60
|
+
* The sub-action MUST be the very FIRST token (`chorus daemon stop`), so we
|
|
61
|
+
* inspect only `rest[0]` — not any non-flag token. Checking the first
|
|
62
|
+
* positional anywhere would misread a flag *value* that happens to equal an
|
|
63
|
+
* action verb (`daemon --url stop` → "stop"); pinning to `rest[0]` avoids that.
|
|
64
|
+
* Anything else (no args, a flag-leading list like `daemon -d` / `daemon --url …`,
|
|
65
|
+
* or an unknown leading token) is the normal long-lived daemon (`run`).
|
|
66
|
+
*
|
|
67
|
+
* @param {string[]} rest argv after the `daemon` subcommand token
|
|
68
|
+
* @returns {"run"|"stop"|"status"|"restart"|"logs"}
|
|
69
|
+
*/
|
|
70
|
+
export function parseDaemonAction(rest) {
|
|
71
|
+
const first = rest[0];
|
|
72
|
+
if (first && DAEMON_ACTIONS.has(first)) return /** @type any */ (first);
|
|
73
|
+
return "run";
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Help text for `chorus daemon [--help]`. Pure — takes the version so the
|
|
78
|
+
* caller (which already read package.json) does no IO here.
|
|
79
|
+
* @param {string} version
|
|
80
|
+
* @returns {string}
|
|
81
|
+
*/
|
|
82
|
+
export function daemonHelpText(version) {
|
|
83
|
+
return `
|
|
84
|
+
Chorus daemon v${version} — connect to a remote Chorus server, subscribe to the
|
|
85
|
+
agent notification stream, and wake a local headless agent on task dispatch.
|
|
86
|
+
|
|
87
|
+
USAGE
|
|
88
|
+
chorus daemon [options] Run the daemon (foreground)
|
|
89
|
+
chorus daemon -d [options] Run the daemon in the background (detached)
|
|
90
|
+
chorus daemon stop Stop the background daemon
|
|
91
|
+
chorus daemon status Show whether the background daemon is running
|
|
92
|
+
chorus daemon restart Restart the background daemon
|
|
93
|
+
chorus daemon logs Show the background daemon log
|
|
94
|
+
|
|
95
|
+
OPTIONS
|
|
96
|
+
--url <url> Remote Chorus server URL (env: CHORUS_URL)
|
|
97
|
+
--api-key <cho_...> Agent API key (env: CHORUS_API_KEY)
|
|
98
|
+
--agent <type> Local agent backend to wake (env: CHORUS_AGENT)
|
|
99
|
+
(default: claude-code; only claude-code is implemented)
|
|
100
|
+
--yolo Full autonomy for the woken agent (env: CHORUS_YOLO=1)
|
|
101
|
+
(--dangerously-skip-permissions: Bash, file writes, any
|
|
102
|
+
command). This is the DEFAULT permission mode.
|
|
103
|
+
--chorus-only Restrict the woken agent to Chorus (env: CHORUS_CHORUS_ONLY=1)
|
|
104
|
+
MCP tools only (no Bash / file edits) — reclaims the
|
|
105
|
+
safe posture from the default yolo.
|
|
106
|
+
-d, --detach Run detached in the background (pidfile + logfile)
|
|
107
|
+
--verbose More detailed per-wake logging
|
|
108
|
+
--sigint-timeout <ms> Grace window after SIGINT before a forceful kill
|
|
109
|
+
(env: CHORUS_DAEMON_SIGINT_TIMEOUT; default 10000)
|
|
110
|
+
-h, --help Show this help message
|
|
111
|
+
|
|
112
|
+
CREDENTIALS
|
|
113
|
+
Resolution order: flags > CHORUS_URL/CHORUS_API_KEY env >
|
|
114
|
+
~/.chorus/daemon.json (from 'chorus login') > Claude Code plugin config.
|
|
115
|
+
On a TTY with no resolvable credentials, the daemon prompts to complete them.
|
|
116
|
+
|
|
117
|
+
EXAMPLES
|
|
118
|
+
chorus daemon # Foreground, default yolo (TTY confirms once)
|
|
119
|
+
chorus daemon --chorus-only # Restrict the woken agent to Chorus tools
|
|
120
|
+
chorus daemon -d # Background; see 'chorus daemon logs'
|
|
121
|
+
chorus daemon stop # Stop the background daemon
|
|
122
|
+
`;
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Help text for `chorus login [--help]`.
|
|
127
|
+
* @param {string} version
|
|
128
|
+
* @returns {string}
|
|
129
|
+
*/
|
|
130
|
+
export function loginHelpText(version) {
|
|
131
|
+
return `
|
|
132
|
+
Chorus login v${version} — authenticate as an agent and save credentials to
|
|
133
|
+
~/.chorus/daemon.json (0600) for later use by 'chorus daemon'.
|
|
134
|
+
|
|
135
|
+
USAGE
|
|
136
|
+
chorus login [options] Validate a key and persist credentials
|
|
137
|
+
|
|
138
|
+
OPTIONS
|
|
139
|
+
--url <url> Remote Chorus server URL (env: CHORUS_URL)
|
|
140
|
+
--api-key <cho_...> Agent API key (env: CHORUS_API_KEY)
|
|
141
|
+
-h, --help Show this help message
|
|
142
|
+
|
|
143
|
+
With no flags, login prompts interactively for the URL and a masked API key,
|
|
144
|
+
validates them against the server, and on success saves the credentials.
|
|
145
|
+
`;
|
|
146
|
+
}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
// cli/control-handler.mjs
|
|
2
|
+
// Daemon-side handler for reverse control commands (子3 — daemon-interrupt-resume,
|
|
3
|
+
// Tech Design "Architecture" / q1=a double-check). The SSE listener forks a
|
|
4
|
+
// `type:"control"` event here (NOT to the wake router) — see sse-listener.mjs.
|
|
5
|
+
//
|
|
6
|
+
// The single safety property this module enforces is the DOUBLE-CHECK (q1=a): act
|
|
7
|
+
// ONLY when BOTH hold —
|
|
8
|
+
// 1. event.targetConnectionUuid === this daemon's OWN registered connectionUuid, AND
|
|
9
|
+
// 2. the waker's in-memory execution registry holds a RUNNING child for the
|
|
10
|
+
// command's `${entityType}:${entityUuid}`.
|
|
11
|
+
// On either mismatch the command is IGNORED and LOGGED (memory: no-silent-errors),
|
|
12
|
+
// so a stale / recycled connection uuid can never make the daemon kill the wrong
|
|
13
|
+
// subprocess (Tech Design "Risks": mis-kill after a reconnect).
|
|
14
|
+
//
|
|
15
|
+
// On a verified match it (a) sets a per-entity "interrupting" flag on the waker so
|
|
16
|
+
// the waker reports the resulting exit as interrupted(reason="user") rather than a
|
|
17
|
+
// crash, then (b) invokes the injected killer (process-killer.killProcessTree) on
|
|
18
|
+
// the live child. The kill is fire-and-forget from the listener's perspective; this
|
|
19
|
+
// handler never throws into the SSE loop.
|
|
20
|
+
//
|
|
21
|
+
// Plain ESM, zero new deps. The killer + connectionUuid getter are injected so the
|
|
22
|
+
// handler is unit-testable without a real subprocess or SSE stream.
|
|
23
|
+
|
|
24
|
+
import { killProcessTree } from "./process-killer.mjs";
|
|
25
|
+
|
|
26
|
+
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Build the `onControl(event)` callback the SseListener invokes for a
|
|
30
|
+
* `type:"control"` event.
|
|
31
|
+
*
|
|
32
|
+
* @param {{
|
|
33
|
+
* waker: {
|
|
34
|
+
* executions: Map<string, { entityType: string, entityUuid: string, child?: any, status: string }>,
|
|
35
|
+
* markInterrupting?: (entityType: string, entityUuid: string) => void,
|
|
36
|
+
* },
|
|
37
|
+
* getConnectionUuid: () => (string|null), This daemon's registered connection uuid
|
|
38
|
+
* (null until the SSE handshake reports it).
|
|
39
|
+
* killer?: (child: any, opts: any) => Promise<any>, Injectable; defaults to killProcessTree.
|
|
40
|
+
* sigintTimeoutMs?: number, Layered-resolved escalation window.
|
|
41
|
+
* redispatchResume?: (entityType: string, entityUuid: string) => void, Re-run a wake
|
|
42
|
+
* for a resumed entity (子3); injected by the daemon.
|
|
43
|
+
* deliverTurn?: (turnUuid?: string) => void, Dispatch a PRECISE pending turn by uuid
|
|
44
|
+
* (子2 — origin-only live delivery). On a
|
|
45
|
+
* `deliver_turn` control event (after the Check-1
|
|
46
|
+
* connection match) the handler invokes this with
|
|
47
|
+
* the event's `turnUuid` so ONLY that one new
|
|
48
|
+
* pending `human_instruction` turn runs — not a
|
|
49
|
+
* connection-wide sweep that would also drag every
|
|
50
|
+
* other still-pending turn along. Injected by the
|
|
51
|
+
* daemon (`backfill.pendingTurnsOnly`); the
|
|
52
|
+
* arg-less form (reconnect) still sweeps all.
|
|
53
|
+
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
54
|
+
* }} deps
|
|
55
|
+
* @returns {(event: any) => void} The onControl callback (synchronous, non-throwing).
|
|
56
|
+
*/
|
|
57
|
+
export function createControlHandler(deps) {
|
|
58
|
+
const waker = deps.waker;
|
|
59
|
+
const getConnectionUuid = deps.getConnectionUuid;
|
|
60
|
+
const killer = deps.killer ?? killProcessTree;
|
|
61
|
+
const sigintTimeoutMs = deps.sigintTimeoutMs;
|
|
62
|
+
const redispatchResume = deps.redispatchResume;
|
|
63
|
+
const deliverTurn = deps.deliverTurn;
|
|
64
|
+
const logger = deps.logger ?? NOOP_LOGGER;
|
|
65
|
+
|
|
66
|
+
/** Registry key for a resource — MUST match waker.#execKey. */
|
|
67
|
+
const execKey = (entityType, entityUuid) => `${entityType}:${entityUuid}`;
|
|
68
|
+
|
|
69
|
+
/**
|
|
70
|
+
* Handle one control event. Synchronous + non-throwing: it performs the
|
|
71
|
+
* double-check and kicks off the (async) kill fire-and-forget, returning
|
|
72
|
+
* immediately so the SSE consumer never blocks. `interrupt` (kill), `resume`
|
|
73
|
+
* (re-dispatch wake), and `deliver_turn` (origin-only live delivery — trigger the
|
|
74
|
+
* pending-turns sweep) are acted on; any other/unknown command is ignored + logged
|
|
75
|
+
* (forward-compatible).
|
|
76
|
+
* @param {{ type?: string, command?: string, targetConnectionUuid?: string, entityType?: string, entityUuid?: string }} event
|
|
77
|
+
*/
|
|
78
|
+
return function onControl(event) {
|
|
79
|
+
try {
|
|
80
|
+
if (!event || event.type !== "control") {
|
|
81
|
+
logger.warn(`[Chorus] control-handler received non-control event; ignoring`);
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
if (
|
|
85
|
+
event.command !== "interrupt" &&
|
|
86
|
+
event.command !== "resume" &&
|
|
87
|
+
event.command !== "deliver_turn"
|
|
88
|
+
) {
|
|
89
|
+
// Forward-compatible: the wire enum may grow.
|
|
90
|
+
logger.warn(`[Chorus] control command "${event.command}" not supported; ignoring`);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const { command, targetConnectionUuid, entityType, entityUuid } = event;
|
|
95
|
+
|
|
96
|
+
// --- Check 1: connection-uuid match (applies to every command) ---
|
|
97
|
+
const myConnectionUuid = getConnectionUuid?.() ?? null;
|
|
98
|
+
if (!myConnectionUuid || targetConnectionUuid !== myConnectionUuid) {
|
|
99
|
+
// Not ours (stale/recycled uuid, or handshake not yet complete). Ignore.
|
|
100
|
+
logger.info(
|
|
101
|
+
`[Chorus] control: ignoring ${command} for connection ${targetConnectionUuid} ` +
|
|
102
|
+
`(this daemon is ${myConnectionUuid ?? "<unregistered>"})`
|
|
103
|
+
);
|
|
104
|
+
return;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// --- deliver_turn: origin-only live delivery (子2). The session's origin connection
|
|
108
|
+
// (THIS one — Check 1 passed) was pinged that a SPECIFIC new pending
|
|
109
|
+
// `human_instruction` turn (`event.turnUuid`) awaits. Dispatch ONLY that turn — not
|
|
110
|
+
// a connection-wide sweep, which would also drag every other still-pending turn of
|
|
111
|
+
// this connection along (the multi-wake bug). No entity is carried on the wire (the
|
|
112
|
+
// turn is read by uuid), and there is NO running-child requirement (mirrors
|
|
113
|
+
// `resume`); the read resolves the text from the persisted turn. Idempotent with
|
|
114
|
+
// reconnect backfill via the shared `seen` set (key turn:{uuid}). A `deliver_turn`
|
|
115
|
+
// missing `turnUuid` (older server) falls back to the full sweep so it still runs. ---
|
|
116
|
+
if (command === "deliver_turn") {
|
|
117
|
+
const turnUuid = typeof event.turnUuid === "string" ? event.turnUuid : undefined;
|
|
118
|
+
logger.info(
|
|
119
|
+
`[Chorus] control: deliver_turn for connection ${targetConnectionUuid} ` +
|
|
120
|
+
(turnUuid ? `(turn ${turnUuid})` : "(no turnUuid — full sweep fallback)"),
|
|
121
|
+
);
|
|
122
|
+
try {
|
|
123
|
+
deliverTurn?.(turnUuid);
|
|
124
|
+
} catch (err) {
|
|
125
|
+
logger.warn(`[Chorus] control: deliver_turn failed: ${err}`);
|
|
126
|
+
}
|
|
127
|
+
return;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
if (typeof entityType !== "string" || typeof entityUuid !== "string") {
|
|
131
|
+
logger.warn(`[Chorus] control: ${command} missing entityType/entityUuid; ignoring`);
|
|
132
|
+
return;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
// --- resume: re-dispatch the wake for this entity (子3). No running-child
|
|
136
|
+
// check — the subprocess is gone (it was interrupted); the wake path will
|
|
137
|
+
// re-spawn and `--resume` the existing session. ---
|
|
138
|
+
if (command === "resume") {
|
|
139
|
+
logger.info(`[Chorus] control: resuming ${entityType}:${entityUuid} (re-dispatch wake)`);
|
|
140
|
+
try {
|
|
141
|
+
redispatchResume?.(entityType, entityUuid);
|
|
142
|
+
} catch (err) {
|
|
143
|
+
logger.warn(`[Chorus] control: resume re-dispatch failed for ${entityType}:${entityUuid}: ${err}`);
|
|
144
|
+
}
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
// --- interrupt path: Check 2 — in-memory entity ownership (running child) ---
|
|
149
|
+
const key = execKey(entityType, entityUuid);
|
|
150
|
+
const entry = waker?.executions?.get(key);
|
|
151
|
+
if (!entry || entry.status !== "running" || !entry.child) {
|
|
152
|
+
// Either we never ran this entity, it's only queued (no child yet), or the
|
|
153
|
+
// wake already finished (race: interrupt arrived after exit). Safe no-op.
|
|
154
|
+
logger.info(
|
|
155
|
+
`[Chorus] control: no running subprocess for ${key} on this daemon; ignoring interrupt`
|
|
156
|
+
);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// --- Both checks passed: mark interrupting (so the waker reports reason=user),
|
|
161
|
+
// then kill the tree. ---
|
|
162
|
+
logger.info(`[Chorus] control: interrupting running subprocess for ${key} (pid=${entry.child.pid})`);
|
|
163
|
+
try {
|
|
164
|
+
waker.markInterrupting?.(entityType, entityUuid);
|
|
165
|
+
} catch (err) {
|
|
166
|
+
logger.warn(`[Chorus] control: markInterrupting failed for ${key}: ${err}`);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Fire-and-forget the kill: the waker observes the child's exit and reports
|
|
170
|
+
// the interrupted state. The killer never throws, but guard the promise
|
|
171
|
+
// anyway so a rejection can't surface as an unhandled rejection.
|
|
172
|
+
Promise.resolve(killer(entry.child, { sigintTimeoutMs, logger })).catch((err) => {
|
|
173
|
+
logger.warn(`[Chorus] control: killProcessTree rejected for ${key}: ${err}`);
|
|
174
|
+
});
|
|
175
|
+
} catch (err) {
|
|
176
|
+
// Absolute backstop — a control event must never crash the SSE loop.
|
|
177
|
+
logger.error(`[Chorus] control-handler unexpected error: ${err}`);
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// cli/credentials.mjs
|
|
2
|
+
// Layered resolution of the Chorus server URL + `cho_` API key for the daemon
|
|
3
|
+
// and login subcommands. Plain ESM, zero dependencies — ships verbatim in the
|
|
4
|
+
// npm package alongside chorus.mjs (see package.json `files`).
|
|
5
|
+
//
|
|
6
|
+
// Precedence (first complete pair wins):
|
|
7
|
+
// 1. explicit flags --url / --api-key
|
|
8
|
+
// 2. environment CHORUS_URL / CHORUS_API_KEY
|
|
9
|
+
// 3. login file ~/.chorus/daemon.json (written by `chorus login`)
|
|
10
|
+
// 4. plugin fallback ~/.claude/settings.json → .env.CHORUS_URL / .env.CHORUS_API_KEY
|
|
11
|
+
//
|
|
12
|
+
// The CC chorus plugin does NOT persist credentials to a file — it reads
|
|
13
|
+
// CHORUS_URL / CHORUS_API_KEY from the environment, which users configure in
|
|
14
|
+
// the `env` block of ~/.claude/settings.json. Tier 4 reads that block as a
|
|
15
|
+
// best-effort last resort (file may be absent or differently shaped — read
|
|
16
|
+
// defensively). Verified against the 0.10.0 plugin: bin/*.sh all read the two
|
|
17
|
+
// env vars; .chorus/state.json holds session state, never credentials.
|
|
18
|
+
|
|
19
|
+
import { readFileSync } from "node:fs";
|
|
20
|
+
import { homedir } from "node:os";
|
|
21
|
+
import { join } from "node:path";
|
|
22
|
+
|
|
23
|
+
/** Absolute path to the login file written by `chorus login`. */
|
|
24
|
+
export function loginFilePath() {
|
|
25
|
+
return join(homedir(), ".chorus", "daemon.json");
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Absolute path to the Claude Code user settings file (plugin fallback source). */
|
|
29
|
+
export function claudeSettingsPath() {
|
|
30
|
+
return join(homedir(), ".claude", "settings.json");
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Read a JSON file, returning `null` on any error (missing / unreadable /
|
|
35
|
+
* malformed). Never throws — callers treat a null as "source absent".
|
|
36
|
+
* @param {string} path
|
|
37
|
+
* @returns {Record<string, unknown> | null}
|
|
38
|
+
*/
|
|
39
|
+
function readJsonSafe(path) {
|
|
40
|
+
try {
|
|
41
|
+
const raw = readFileSync(path, "utf8");
|
|
42
|
+
const parsed = JSON.parse(raw);
|
|
43
|
+
return parsed && typeof parsed === "object" ? parsed : null;
|
|
44
|
+
} catch {
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** A non-empty string, or undefined. Trims; empty/whitespace → undefined. */
|
|
50
|
+
function nonEmpty(value) {
|
|
51
|
+
if (typeof value !== "string") return undefined;
|
|
52
|
+
const trimmed = value.trim();
|
|
53
|
+
return trimmed.length > 0 ? trimmed : undefined;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Read the recorded yolo acknowledgement (`yoloAckAt`) from the login file, if
|
|
58
|
+
* present. Returns the ISO-8601 string, or null when the file is absent /
|
|
59
|
+
* unreadable / carries no ack. Never throws (a missing ack just means "not yet
|
|
60
|
+
* confirmed"). The ack lives in the same `~/.chorus/daemon.json` as the
|
|
61
|
+
* credentials — there is no separate ack file (daemon-permission-mode spec).
|
|
62
|
+
*
|
|
63
|
+
* @param {{ readJson?: (p: string) => (Record<string, unknown>|null), loginPath?: string }} [deps]
|
|
64
|
+
* @returns {string | null}
|
|
65
|
+
*/
|
|
66
|
+
export function readYoloAck(deps = {}) {
|
|
67
|
+
const readJson = deps.readJson ?? readJsonSafe;
|
|
68
|
+
const loginPath = deps.loginPath ?? loginFilePath();
|
|
69
|
+
const file = readJson(loginPath);
|
|
70
|
+
return file ? nonEmpty(file.yoloAckAt) ?? null : null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* @typedef {Object} ResolvedCredentials
|
|
75
|
+
* @property {string} url
|
|
76
|
+
* @property {string} apiKey
|
|
77
|
+
* @property {"flag"|"env"|"login-file"|"plugin-fallback"} source
|
|
78
|
+
*/
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* @typedef {Object} ResolveDeps Injectable IO for tests (no real disk/env).
|
|
82
|
+
* @property {Record<string, string|undefined>} [env]
|
|
83
|
+
* @property {(path: string) => (Record<string, unknown>|null)} [readJson]
|
|
84
|
+
* @property {string} [loginPath]
|
|
85
|
+
* @property {string} [settingsPath]
|
|
86
|
+
*/
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Resolve credentials from the four layered sources, in fixed precedence.
|
|
90
|
+
*
|
|
91
|
+
* @param {{ url?: string, apiKey?: string }} flags Explicit --url / --api-key.
|
|
92
|
+
* @param {ResolveDeps} [deps]
|
|
93
|
+
* @returns {ResolvedCredentials}
|
|
94
|
+
* @throws {Error} when no source yields a complete url+apiKey pair. The message
|
|
95
|
+
* lists every source that was tried and how to supply credentials.
|
|
96
|
+
*/
|
|
97
|
+
export function resolveCredentials(flags = {}, deps = {}) {
|
|
98
|
+
const env = deps.env ?? process.env;
|
|
99
|
+
const readJson = deps.readJson ?? readJsonSafe;
|
|
100
|
+
const loginPath = deps.loginPath ?? loginFilePath();
|
|
101
|
+
const settingsPath = deps.settingsPath ?? claudeSettingsPath();
|
|
102
|
+
|
|
103
|
+
const tried = [];
|
|
104
|
+
|
|
105
|
+
// 1. Explicit flags
|
|
106
|
+
tried.push("--url/--api-key flags");
|
|
107
|
+
{
|
|
108
|
+
const url = nonEmpty(flags.url);
|
|
109
|
+
const apiKey = nonEmpty(flags.apiKey);
|
|
110
|
+
if (url && apiKey) return { url, apiKey, source: "flag" };
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// 2. Environment variables
|
|
114
|
+
tried.push("CHORUS_URL / CHORUS_API_KEY environment variables");
|
|
115
|
+
{
|
|
116
|
+
const url = nonEmpty(env.CHORUS_URL);
|
|
117
|
+
const apiKey = nonEmpty(env.CHORUS_API_KEY);
|
|
118
|
+
if (url && apiKey) return { url, apiKey, source: "env" };
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
// 3. Login file (~/.chorus/daemon.json)
|
|
122
|
+
tried.push(`login file (${loginPath}, run \`chorus login\`)`);
|
|
123
|
+
{
|
|
124
|
+
const file = readJson(loginPath);
|
|
125
|
+
if (file) {
|
|
126
|
+
const url = nonEmpty(file.url);
|
|
127
|
+
const apiKey = nonEmpty(file.apiKey);
|
|
128
|
+
if (url && apiKey) return { url, apiKey, source: "login-file" };
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// 4. Plugin fallback (~/.claude/settings.json → env block)
|
|
133
|
+
tried.push(`Claude Code plugin config (${settingsPath} → env.CHORUS_URL/CHORUS_API_KEY)`);
|
|
134
|
+
{
|
|
135
|
+
const settings = readJson(settingsPath);
|
|
136
|
+
const envBlock =
|
|
137
|
+
settings && typeof settings.env === "object" && settings.env !== null
|
|
138
|
+
? /** @type {Record<string, unknown>} */ (settings.env)
|
|
139
|
+
: null;
|
|
140
|
+
if (envBlock) {
|
|
141
|
+
const url = nonEmpty(envBlock.CHORUS_URL);
|
|
142
|
+
const apiKey = nonEmpty(envBlock.CHORUS_API_KEY);
|
|
143
|
+
if (url && apiKey) return { url, apiKey, source: "plugin-fallback" };
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
throw new Error(
|
|
148
|
+
"Could not resolve Chorus credentials (url + cho_ API key). Tried, in order:\n" +
|
|
149
|
+
tried.map((t, i) => ` ${i + 1}. ${t}`).join("\n") +
|
|
150
|
+
"\n\nSupply credentials with one of:\n" +
|
|
151
|
+
" • flags: chorus daemon --url <https://...> --api-key <cho_...>\n" +
|
|
152
|
+
" • env: CHORUS_URL=<https://...> CHORUS_API_KEY=<cho_...> chorus daemon\n" +
|
|
153
|
+
" • login: chorus login (persists to ~/.chorus/daemon.json)\n"
|
|
154
|
+
);
|
|
155
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
// cli/daemon-agent.mjs
|
|
2
|
+
// Pure resolution + validation of the daemon's `--agent <type>` selection. The
|
|
3
|
+
// flag/env exist to RESERVE the extension point for future agent backends
|
|
4
|
+
// (e.g. codex); only `claude-code` is implemented in this change. Resolving an
|
|
5
|
+
// unknown value is a hard error (no silent fallback). Zero dependencies.
|
|
6
|
+
|
|
7
|
+
/** The agent backends the daemon recognizes. Only `claude-code` is implemented. */
|
|
8
|
+
export const KNOWN_AGENTS = ["claude-code"];
|
|
9
|
+
|
|
10
|
+
/** The default agent backend when neither --agent nor CHORUS_AGENT is set. */
|
|
11
|
+
export const DEFAULT_AGENT = "claude-code";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Resolve the agent type from flag → env → default, and validate it.
|
|
15
|
+
* Precedence: explicit `--agent` flag > CHORUS_AGENT env > DEFAULT_AGENT.
|
|
16
|
+
*
|
|
17
|
+
* @param {{ agent?: string }} flags
|
|
18
|
+
* @param {Record<string, string|undefined>} env
|
|
19
|
+
* @returns {{ ok: true, agent: string } | { ok: false, value: string, error: string }}
|
|
20
|
+
* `ok:false` carries the offending value and a human-actionable error naming
|
|
21
|
+
* the accepted types — the caller exits non-zero and prints `error`.
|
|
22
|
+
*/
|
|
23
|
+
export function resolveAgentType(flags, env) {
|
|
24
|
+
const raw =
|
|
25
|
+
(typeof flags.agent === "string" && flags.agent.trim()) ||
|
|
26
|
+
(typeof env.CHORUS_AGENT === "string" && env.CHORUS_AGENT.trim()) ||
|
|
27
|
+
DEFAULT_AGENT;
|
|
28
|
+
if (!KNOWN_AGENTS.includes(raw)) {
|
|
29
|
+
return {
|
|
30
|
+
ok: false,
|
|
31
|
+
value: raw,
|
|
32
|
+
error:
|
|
33
|
+
`Unknown --agent "${raw}". Accepted: ${KNOWN_AGENTS.join(", ")}. ` +
|
|
34
|
+
`(Only ${DEFAULT_AGENT} is implemented; the flag reserves the slot for future agents.)`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
return { ok: true, agent: raw };
|
|
38
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// cli/daemon-banner.mjs
|
|
2
|
+
// Pure formatter for the daemon's boxed startup banner — one screen summarizing
|
|
3
|
+
// the daemon's posture. No IO: `formatBanner(info)` returns a string the caller
|
|
4
|
+
// writes. Degrades box-drawing to plain lines when `isTTY` is false so piped /
|
|
5
|
+
// redirected output stays clean and never depends on terminal width.
|
|
6
|
+
//
|
|
7
|
+
// SECURITY: the banner shows the credential SOURCE, never the raw API key
|
|
8
|
+
// (owner decision: no masking needed because the key is simply not displayed).
|
|
9
|
+
// Zero dependencies — ships in the npm package alongside chorus.mjs.
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* @typedef {Object} BannerInfo
|
|
13
|
+
* @property {string} version chorus CLI version.
|
|
14
|
+
* @property {string} url remote server URL.
|
|
15
|
+
* @property {string} agentName authenticated agent name.
|
|
16
|
+
* @property {string} agentUuid authenticated agent uuid.
|
|
17
|
+
* @property {"yolo"|"chorus"} permissionMode
|
|
18
|
+
* @property {string} credentialSource resolved credential source (flag/env/login-file/…).
|
|
19
|
+
* @property {string} agentType local agent backend (e.g. claude-code).
|
|
20
|
+
* @property {string|null} claudePath resolved claude path, or null when not found.
|
|
21
|
+
* @property {string} [connection] connection state line (default "connecting…").
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
/** Right-pad to width (banner box alignment). */
|
|
25
|
+
function pad(s, width) {
|
|
26
|
+
return s.length >= width ? s : s + " ".repeat(width - s.length);
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Build the banner's labelled rows (label, value) in display order. Pure — also
|
|
31
|
+
* used by tests to assert content independently of the box framing.
|
|
32
|
+
* @param {BannerInfo} info
|
|
33
|
+
* @returns {Array<[string, string]>}
|
|
34
|
+
*/
|
|
35
|
+
export function bannerRows(info) {
|
|
36
|
+
const permission =
|
|
37
|
+
info.permissionMode === "yolo"
|
|
38
|
+
? "YOLO ⚠ (full autonomy — Bash/write/any command)"
|
|
39
|
+
: "chorus-only (Chorus MCP tools only)";
|
|
40
|
+
const claude = info.claudePath ? `found: ${info.claudePath}` : "NOT FOUND — install `claude` or set CHORUS_CLAUDE_PATH";
|
|
41
|
+
return [
|
|
42
|
+
["Version", `chorus v${info.version}`],
|
|
43
|
+
["Server", info.url],
|
|
44
|
+
["Agent", `${info.agentName} (${info.agentUuid})`],
|
|
45
|
+
["Agent type", info.agentType],
|
|
46
|
+
["Permission", permission],
|
|
47
|
+
["Credentials", `source: ${info.credentialSource}`],
|
|
48
|
+
["Connection", info.connection ?? "connecting…"],
|
|
49
|
+
["claude CLI", claude],
|
|
50
|
+
];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Format the startup banner. On a TTY, draws a Unicode box; otherwise emits
|
|
55
|
+
* plain `label: value` lines (no box-drawing chars, no width math) so piped
|
|
56
|
+
* output is clean. Never throws.
|
|
57
|
+
* @param {BannerInfo} info
|
|
58
|
+
* @param {{ isTTY?: boolean }} [opts]
|
|
59
|
+
* @returns {string}
|
|
60
|
+
*/
|
|
61
|
+
export function formatBanner(info, opts = {}) {
|
|
62
|
+
const rows = bannerRows(info);
|
|
63
|
+
const isTTY = opts.isTTY ?? false;
|
|
64
|
+
|
|
65
|
+
if (!isTTY) {
|
|
66
|
+
// Plain mode: stable, greppable, no box-drawing.
|
|
67
|
+
const lines = ["Chorus daemon", ...rows.map(([k, v]) => ` ${k}: ${v}`)];
|
|
68
|
+
return lines.join("\n") + "\n";
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
const labelW = Math.max(...rows.map(([k]) => k.length));
|
|
72
|
+
const body = rows.map(([k, v]) => `${pad(k, labelW)} ${v}`);
|
|
73
|
+
const title = "Chorus daemon";
|
|
74
|
+
const innerW = Math.max(title.length, ...body.map((l) => l.length));
|
|
75
|
+
const top = "┌" + "─".repeat(innerW + 2) + "┐";
|
|
76
|
+
const bottom = "└" + "─".repeat(innerW + 2) + "┘";
|
|
77
|
+
const sep = "├" + "─".repeat(innerW + 2) + "┤";
|
|
78
|
+
const line = (s) => `│ ${pad(s, innerW)} │`;
|
|
79
|
+
return [top, line(title), sep, ...body.map(line), bottom].join("\n") + "\n";
|
|
80
|
+
}
|