@chorus-aidlc/chorus 0.9.4 → 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 +481 -430
- package/.next/standalone/.next/app-path-routes-manifest.json +57 -44
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +33 -33
- package/.next/standalone/.next/routes-manifest.json +33 -17
- 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 -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 -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 +6 -6
- 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 +6 -6
- 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 +6 -6
- 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.js.nft.json +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 -0
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -0
- 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 +6 -42
- 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.js +1 -1
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +1 -1
- 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 +1 -1
- 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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page.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 +6 -6
- 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 +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 +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 +57 -44
- 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/4958.js +1 -1
- 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/8551.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 +2 -2
- 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.43f5ad8a3aaed0e8.js +1 -0
- 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/93346-5489d90bc2d57190.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.0768feb3a08c7da3.js +1 -0
- 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-63a6a5b6cf9ecf87.js → page-a79969c5c9aadacd.js} +1 -1
- 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-c36345b80cc5bf5c.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/admin/companies/[uuid]/page-cc2fe0c5b749cd2f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/companies/new/{page-55fb2107f955c9ed.js → page-4f3b3c449c61f6d2.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/page-ef720c2b0856166c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/page-0cc8cf246db43e5d.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/login/admin/page-d470135f7aab6c5e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/callback/{page-48a34c31a0f8e58c.js → page-0edd93f50cb4f6ea.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/login/page-c64b8d40a0781b4c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-e0444ad8b50121f5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/page-e9a69a0c537c704f.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-4a8c75a0d40c2106.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 +2 -2
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +19 -3
- 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 +2 -2
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +19 -3
- 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 +29 -0
- package/README.zh.md +29 -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/20260611101056_add_idea_lineage/migration.sql +5 -0
- 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 +368 -185
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js +0 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js +0 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page_client-reference-manifest.js +0 -1
- 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/1871.js +0 -1
- package/.next/standalone/.next/server/chunks/2909.js +0 -98
- package/.next/standalone/.next/server/chunks/2990.js +0 -1
- package/.next/standalone/.next/server/chunks/3139.js +0 -1
- 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/3576.js +0 -1
- package/.next/standalone/.next/server/chunks/3611.js +0 -158
- 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/4974.js +0 -1
- package/.next/standalone/.next/server/chunks/5491.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/7621.js +0 -1
- package/.next/standalone/.next/server/chunks/8144.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/9508.js +0 -2
- package/.next/standalone/.next/server/chunks/9615.js +0 -1
- package/.next/standalone/.next/static/YJZurE1onX9K-RDNIplc5/_buildManifest.js +0 -1
- package/.next/standalone/.next/static/chunks/19126-12ce8ade288ce1dc.js +0 -1
- package/.next/standalone/.next/static/chunks/19898-2a3d83a3996794cd.js +0 -1
- package/.next/standalone/.next/static/chunks/20051-d9233fd4578d66cc.js +0 -1
- package/.next/standalone/.next/static/chunks/21932-bce5ba937d1603e1.js +0 -1
- package/.next/standalone/.next/static/chunks/23466-842c126491b753bc.js +0 -1
- package/.next/standalone/.next/static/chunks/35486-592daa5c9fdf701d.js +0 -1
- package/.next/standalone/.next/static/chunks/37880-4395be5cee4112fa.js +0 -1
- package/.next/standalone/.next/static/chunks/3853-f94afe2f83089c0d.js +0 -1
- package/.next/standalone/.next/static/chunks/4842-95cf4b7efd540e89.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.1bebb2a898b170f6.js +0 -1
- package/.next/standalone/.next/static/chunks/51841-0e4e0e63b437dcfd.js +0 -1
- package/.next/standalone/.next/static/chunks/52206-6048525f57a21502.js +0 -1
- package/.next/standalone/.next/static/chunks/55469-ed5ff019ff71ef59.js +0 -1
- package/.next/standalone/.next/static/chunks/59296-4fa84fe82e2c7789.js +0 -1
- package/.next/standalone/.next/static/chunks/60011-b602fea2afba6992.js +0 -1
- package/.next/standalone/.next/static/chunks/70093-0ff6fd59445b5cb9.js +0 -1
- package/.next/standalone/.next/static/chunks/93346-c4468893138daac7.js +0 -1
- package/.next/standalone/.next/static/chunks/95627-8d9f6d2d88f7a641.js +0 -1
- package/.next/standalone/.next/static/chunks/95750-3d0d1d48995d1088.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.13c8ac5da1ddabe9.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-b55a8d6d9bd27276.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-fd10bca891f0f73a.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]/ideas/[ideaUuid]/page-6a38c21b164cdc07.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/page-48c840cb3011bf97.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-7ec535fac7bbc75d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-414b398806324ad1.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-f6814f25bbacdbea.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-92e8980da0d98d48.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-ab87cbb18d0ee538.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/[uuid]/page-81682b4aa6859615.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/page-bbd92a7b214ddbf5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/page-c4167418611b4a6b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/session/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/comments/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/health/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/search/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-482dee7dace72c88.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/admin/page-4e72e6e4327ee7cd.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/page-dcb689dfe6e69879.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-ee9bda8bfc4e0697.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-922a196db6eb2385.js +0 -1
- package/.next/standalone/.next/static/css/bfe962487ee66da7.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/{YJZurE1onX9K-RDNIplc5 → 519aK55QLHaVN7b1TVDkB}/_ssgManifest.js +0 -0
|
@@ -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
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
// cli/daemon-config.mjs
|
|
2
|
+
// Layered resolution of daemon tunables that are NOT credentials (子3 —
|
|
3
|
+
// daemon-interrupt-resume, Tech Design "Layered config"). Mirrors the precedence
|
|
4
|
+
// style of cli/credentials.mjs exactly — first defined source wins:
|
|
5
|
+
//
|
|
6
|
+
// sigintTimeoutMs: --sigint-timeout flag
|
|
7
|
+
// > CHORUS_DAEMON_SIGINT_TIMEOUT env
|
|
8
|
+
// > ~/.chorus/daemon.json `sigintTimeoutMs`
|
|
9
|
+
// > default 10000
|
|
10
|
+
//
|
|
11
|
+
// The escalation window is how long the killer waits after SIGINT before a forceful
|
|
12
|
+
// tree kill. Plain ESM, zero dependencies — ships verbatim in the npm package.
|
|
13
|
+
// IO (env / file read) is injectable so this is unit-testable without real disk.
|
|
14
|
+
|
|
15
|
+
import { readFileSync } from "node:fs";
|
|
16
|
+
import { loginFilePath } from "./credentials.mjs";
|
|
17
|
+
|
|
18
|
+
/** Built-in default escalation window (ms) — matches the spec's 10 seconds. */
|
|
19
|
+
export const DEFAULT_SIGINT_TIMEOUT_MS = 10_000;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Coerce a value to a positive finite integer of milliseconds, or undefined when it
|
|
23
|
+
* is absent / not a usable number. Accepts a number or a numeric string (env vars
|
|
24
|
+
* and JSON both arrive as strings/numbers). Zero and negatives are rejected (a
|
|
25
|
+
* non-positive window would defeat the graceful stage), as are NaN/Infinity.
|
|
26
|
+
* @param {unknown} value
|
|
27
|
+
* @returns {number | undefined}
|
|
28
|
+
*/
|
|
29
|
+
function positiveIntMs(value) {
|
|
30
|
+
if (value === undefined || value === null || value === "") return undefined;
|
|
31
|
+
const n = typeof value === "number" ? value : Number(String(value).trim());
|
|
32
|
+
if (!Number.isFinite(n) || n <= 0) return undefined;
|
|
33
|
+
return Math.floor(n);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Read a JSON file, returning `null` on any error (missing / unreadable /
|
|
38
|
+
* malformed). Never throws — mirrors credentials.mjs readJsonSafe.
|
|
39
|
+
* @param {string} path
|
|
40
|
+
* @returns {Record<string, unknown> | null}
|
|
41
|
+
*/
|
|
42
|
+
function readJsonSafe(path) {
|
|
43
|
+
try {
|
|
44
|
+
const parsed = JSON.parse(readFileSync(path, "utf8"));
|
|
45
|
+
return parsed && typeof parsed === "object" ? parsed : null;
|
|
46
|
+
} catch {
|
|
47
|
+
return null;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Resolve the SIGINT-escalation timeout (ms) from the four layered sources.
|
|
53
|
+
*
|
|
54
|
+
* @param {{ sigintTimeout?: number|string }} [flags] Explicit --sigint-timeout.
|
|
55
|
+
* @param {{
|
|
56
|
+
* env?: Record<string, string|undefined>,
|
|
57
|
+
* readJson?: (path: string) => (Record<string, unknown>|null),
|
|
58
|
+
* loginPath?: string,
|
|
59
|
+
* }} [deps]
|
|
60
|
+
* @returns {number} Always a positive integer (the default when no source applies).
|
|
61
|
+
*/
|
|
62
|
+
export function resolveSigintTimeoutMs(flags = {}, deps = {}) {
|
|
63
|
+
const env = deps.env ?? process.env;
|
|
64
|
+
const readJson = deps.readJson ?? readJsonSafe;
|
|
65
|
+
const loginPath = deps.loginPath ?? loginFilePath();
|
|
66
|
+
|
|
67
|
+
// 1. Explicit flag
|
|
68
|
+
const fromFlag = positiveIntMs(flags.sigintTimeout);
|
|
69
|
+
if (fromFlag !== undefined) return fromFlag;
|
|
70
|
+
|
|
71
|
+
// 2. Environment variable
|
|
72
|
+
const fromEnv = positiveIntMs(env.CHORUS_DAEMON_SIGINT_TIMEOUT);
|
|
73
|
+
if (fromEnv !== undefined) return fromEnv;
|
|
74
|
+
|
|
75
|
+
// 3. Login/config file (~/.chorus/daemon.json)
|
|
76
|
+
const file = readJson(loginPath);
|
|
77
|
+
if (file) {
|
|
78
|
+
const fromFile = positiveIntMs(file.sigintTimeoutMs);
|
|
79
|
+
if (fromFile !== undefined) return fromFile;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// 4. Built-in default
|
|
83
|
+
return DEFAULT_SIGINT_TIMEOUT_MS;
|
|
84
|
+
}
|