@chorus-aidlc/chorus 0.11.1 → 0.12.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +405 -391
- package/.next/standalone/.next/app-path-routes-manifest.json +33 -31
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +27 -27
- package/.next/standalone/.next/react-loadable-manifest.json +3 -3
- package/.next/standalone/.next/routes-manifest.json +8 -0
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +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 +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +3 -3
- 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 +3 -3
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +1 -1
- package/.next/standalone/.next/server/app/admin/companies.rsc +3 -3
- 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 +3 -3
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route_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.js.nft.json +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 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route.js +6 -4
- 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 -5
- package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/keepalive/route.js +1 -0
- package/.next/standalone/.next/server/app/api/keepalive/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/keepalive/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/mcp/route.js +5 -5
- package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/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 +4 -4
- package/.next/standalone/.next/server/app/login/admin/page.js +2 -2
- package/.next/standalone/.next/server/app/login/admin/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +1 -1
- package/.next/standalone/.next/server/app/login/admin.rsc +3 -3
- 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 +4 -4
- package/.next/standalone/.next/server/app/login/page.js +2 -2
- package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page.js +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 +4 -4
- package/.next/standalone/.next/server/app/login/silent-refresh/page.js +1 -1
- 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 +4 -4
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +4 -4
- 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 +4 -4
- package/.next/standalone/.next/server/app/page.js +2 -2
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- 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 +5 -5
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +5 -5
- package/.next/standalone/.next/server/app-paths-manifest.json +33 -31
- package/.next/standalone/.next/server/chunks/{5201.js → 1343.js} +2 -2
- package/.next/standalone/.next/server/chunks/1463.js +1 -0
- package/.next/standalone/.next/server/chunks/1596.js +2 -2
- package/.next/standalone/.next/server/chunks/2618.js +1 -1
- package/.next/standalone/.next/server/chunks/2622.js +1 -0
- package/.next/standalone/.next/server/chunks/2779.js +31 -0
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3219.js +1 -1
- package/.next/standalone/.next/server/chunks/3419.js +1 -1
- package/.next/standalone/.next/server/chunks/4292.js +1 -0
- package/.next/standalone/.next/server/chunks/4872.js +1 -0
- package/.next/standalone/.next/server/chunks/5300.js +1 -1
- package/.next/standalone/.next/server/chunks/5538.js +1 -0
- 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/7063.js +2 -2
- package/.next/standalone/.next/server/chunks/7064.js +1 -0
- package/.next/standalone/.next/server/chunks/7160.js +1 -0
- package/.next/standalone/.next/server/chunks/7364.js +1 -0
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/7427.js +1 -0
- package/.next/standalone/.next/server/chunks/7515.js +1 -0
- package/.next/standalone/.next/server/chunks/7578.js +2 -2
- package/.next/standalone/.next/server/chunks/{4711.js → 796.js} +6 -6
- package/.next/standalone/.next/server/chunks/8732.js +1 -0
- package/.next/standalone/.next/server/chunks/9161.js +1 -0
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/9273.js +1 -0
- package/.next/standalone/.next/server/chunks/937.js +3 -3
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/standalone/.next/server/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/GmBblfxcDziUENBiEap4B/_buildManifest.js +1 -0
- package/.next/standalone/.next/static/chunks/10344-2e9a9d767e2e8ed1.js +1 -0
- package/.next/standalone/.next/static/chunks/16467-dd4f928e725306c1.js +1 -0
- package/.next/standalone/.next/static/chunks/20081-a2bf5c9f24d5d589.js +1 -0
- package/.next/standalone/.next/static/chunks/2280-f48bf99ea9d88ece.js +1 -0
- package/.next/standalone/.next/static/chunks/26394-4af487a51dd62832.js +1 -0
- package/.next/standalone/.next/static/chunks/27378-9328bcc96ae9872e.js +1 -0
- package/.next/standalone/.next/static/chunks/{33187.13c12f5c0821ac57.js → 33187.1328c15b9dab78a8.js} +1 -1
- package/.next/standalone/.next/static/chunks/37784-95dee37276b1067b.js +1 -0
- package/.next/standalone/.next/static/chunks/46983-8bf90f1ffeb55957.js +1 -0
- package/.next/standalone/.next/static/chunks/46999-f53da8f53fe1b8a9.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.e3d0dd79a4d37626.js +1 -0
- package/.next/standalone/.next/static/chunks/54637-71d281d649ea3a17.js +1 -0
- package/.next/standalone/.next/static/chunks/64187-cff8a4b5e96fa8f9.js +10 -0
- package/.next/standalone/.next/static/chunks/78917-aa5bbff9248799a4.js +1 -0
- package/.next/standalone/.next/static/chunks/80904-973284d1fe916c38.js +1 -0
- package/.next/standalone/.next/static/chunks/85573-fb4d2cbd67612d47.js +1 -0
- package/.next/standalone/.next/static/chunks/88561-0b14e1564419f215.js +1 -0
- package/.next/standalone/.next/static/chunks/89035-faf398b7bbc7d2ed.js +1 -0
- package/.next/standalone/.next/static/chunks/89644-2fee0373b890e8e3.js +1 -0
- package/.next/standalone/.next/static/chunks/{93346-5489d90bc2d57190.js → 93346-b3e1ebe948fc623f.js} +1 -1
- package/.next/standalone/.next/static/chunks/{97784-7b90a17294840e32.js → 97784-42081b75f8cc6da8.js} +1 -1
- package/.next/standalone/.next/static/chunks/97868-55f18a05fe483d85.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.cc6319fa4cf36081.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-b3a497ba5eb08036.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-2944c6c9bc48a7d6.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-d786f0c18a9c4f06.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c68f1eda3779b448.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-e0935445535c28cb.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-f824632ff61a9fa7.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-dbcb6e50fc4816c6.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-1295bc505e727383.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-ceeec49af0396432.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-1286afe43c086d6a.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-583e58d4d689d38b.js → page-fec019d974ef8d4e.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-0fb1d51016f6bd56.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/session/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/comments/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/repoint/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/health/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/keepalive/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/search/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-f1b0daea9f947caf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/layout-e3a49e06950a057f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/callback/{page-0edd93f50cb4f6ea.js → page-6cad93f5c610b047.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/login/page-d2513f477211dd6f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/{page-e0444ad8b50121f5.js → page-597e0f3377f18d29.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/login/silent-refresh/{page-a9960ea858db6752.js → page-a26d1af61578c96e.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-2936274fb252329e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/page-075afd218994d377.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-039590181c63871d.js → webpack-ed3555ea61243391.js} +1 -1
- package/.next/standalone/.next/static/css/6e8fd46b062fd4fc.css +1 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +4 -0
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +4 -0
- package/README.md +49 -15
- package/README.zh.md +49 -15
- package/chorus.mjs +30 -14
- package/cli/client-args.mjs +18 -2
- package/cli/codex-session-map.mjs +117 -0
- package/cli/codex-spawner.mjs +312 -0
- package/cli/daemon-agent.mjs +32 -6
- package/cli/daemon-banner.mjs +54 -6
- package/cli/daemon-config.mjs +118 -0
- package/cli/daemon.mjs +348 -167
- package/cli/event-router.mjs +273 -12
- package/cli/login.mjs +77 -34
- package/cli/server-signal-handlers.mjs +41 -0
- package/cli/spawner-select.mjs +30 -0
- package/cli/sse-listener.mjs +56 -6
- package/cli/upload-hooks.mjs +73 -8
- package/cli/waker.mjs +36 -8
- package/package.json +1 -1
- package/prisma/migrations/20260622115159_add_daemon_connection_cwd/migration.sql +9 -0
- package/prisma/migrations/20260623020208_task_pinned_target_instance/migration.sql +3 -0
- package/prisma/migrations/20260624142248_add_agent_instance/migration.sql +31 -0
- package/prisma/migrations/20260624165025_drop_task_target_host_cwd/migration.sql +10 -0
- package/prisma/schema.prisma +69 -3
- package/.next/standalone/.next/server/chunks/1064.js +0 -1
- package/.next/standalone/.next/server/chunks/2213.js +0 -1
- package/.next/standalone/.next/server/chunks/3371.js +0 -1
- package/.next/standalone/.next/server/chunks/369.js +0 -1
- package/.next/standalone/.next/server/chunks/4958.js +0 -1
- package/.next/standalone/.next/server/chunks/5039.js +0 -1
- package/.next/standalone/.next/server/chunks/5631.js +0 -1
- package/.next/standalone/.next/server/chunks/6461.js +0 -1
- package/.next/standalone/.next/server/chunks/6712.js +0 -1
- package/.next/standalone/.next/server/chunks/7867.js +0 -1
- package/.next/standalone/.next/server/chunks/7897.js +0 -1
- package/.next/standalone/.next/server/chunks/8012.js +0 -1
- package/.next/standalone/.next/server/chunks/8245.js +0 -31
- package/.next/standalone/.next/server/chunks/9629.js +0 -1
- package/.next/standalone/.next/server/chunks/9725.js +0 -1
- package/.next/standalone/.next/static/GQvpOux3M9CaxkMjL9GAI/_buildManifest.js +0 -1
- package/.next/standalone/.next/static/chunks/1217-323cc20b73ebfde9.js +0 -1
- package/.next/standalone/.next/static/chunks/16984-8ab5580b8e63a200.js +0 -1
- package/.next/standalone/.next/static/chunks/1879-7a8b283283218df2.js +0 -1
- package/.next/standalone/.next/static/chunks/19276-50b367d7b93d5f34.js +0 -1
- package/.next/standalone/.next/static/chunks/23466-e1176a6d814f4897.js +0 -1
- package/.next/standalone/.next/static/chunks/38040-a8687f86dd8e9d67.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.8bdb37c964f92e48.js +0 -1
- package/.next/standalone/.next/static/chunks/59296-783831c43aa0162e.js +0 -1
- package/.next/standalone/.next/static/chunks/60648-36ccbee4ce232d52.js +0 -1
- package/.next/standalone/.next/static/chunks/60694-68232120903209df.js +0 -1
- package/.next/standalone/.next/static/chunks/64648-ece4e2a59672cf63.js +0 -1
- package/.next/standalone/.next/static/chunks/66205-8d7eae6a0f0a032d.js +0 -1
- package/.next/standalone/.next/static/chunks/66969-12f0b22c51f5a410.js +0 -1
- package/.next/standalone/.next/static/chunks/70536-b8bf71098ae11f07.js +0 -1
- package/.next/standalone/.next/static/chunks/76803-7ac4024b2ae89843.js +0 -1
- package/.next/standalone/.next/static/chunks/78389-b32edc6bd5c570a9.js +0 -1
- package/.next/standalone/.next/static/chunks/78584-eb2fa8cf2f266329.js +0 -1
- package/.next/standalone/.next/static/chunks/78917-150ed14a99844aab.js +0 -1
- package/.next/standalone/.next/static/chunks/84541-1f4c2a40f7722667.js +0 -10
- package/.next/standalone/.next/static/chunks/8574-b9739eb8d054c793.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.12370329b9ab6beb.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-0a28456fea4ce95a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-a79969c5c9aadacd.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-a28f0eaa6f4ac94a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-ef82b871895245ea.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-2c9bcbd11ddb8661.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-630b168598513ce8.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-99639479cc98965f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-335f2450e44a0fba.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-4a191d69b2b6e880.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-0faebb478be4c85d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-2e8fcb72687100df.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/session/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/comments/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/health/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/search/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-4bc556c2fc8f3d24.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-9963339572e2e64e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/page-c64b8d40a0781b4c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-e9a69a0c537c704f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/page-8b4baa950c78ffe7.js +0 -1
- package/.next/standalone/.next/static/css/1d9aaac01758b297.css +0 -1
- /package/.next/standalone/.next/static/{GQvpOux3M9CaxkMjL9GAI → GmBblfxcDziUENBiEap4B}/_ssgManifest.js +0 -0
package/cli/daemon.mjs
CHANGED
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
// NOT done here — the no-op UploadHooks reserve those seams for the derived
|
|
13
13
|
// observability idea.
|
|
14
14
|
|
|
15
|
-
import { resolveCredentials } from "./credentials.mjs";
|
|
15
|
+
import { resolveCredentials, loginFilePath } from "./credentials.mjs";
|
|
16
16
|
import { prompt, writeLoginFile } from "./login.mjs";
|
|
17
17
|
import {
|
|
18
18
|
resolvePermissionMode,
|
|
19
19
|
yoloWarningLine,
|
|
20
20
|
} from "./daemon-permission-mode.mjs";
|
|
21
|
-
import { resolveAgentType } from "./daemon-agent.mjs";
|
|
22
|
-
import { formatBanner } from "./daemon-banner.mjs";
|
|
21
|
+
import { resolveAgentType, backendClientType } from "./daemon-agent.mjs";
|
|
22
|
+
import { formatBanner, agentNotFoundWarningLine } from "./daemon-banner.mjs";
|
|
23
23
|
import { ChorusClient, validateAndFetchIdentity } from "./chorus-client.mjs";
|
|
24
24
|
import { SseListener } from "./sse-listener.mjs";
|
|
25
25
|
import { createBackfill } from "./backfill.mjs";
|
|
@@ -27,7 +27,9 @@ import { EventRouter } from "./event-router.mjs";
|
|
|
27
27
|
import { WakeQueue } from "./wake-queue.mjs";
|
|
28
28
|
import { Waker } from "./waker.mjs";
|
|
29
29
|
import { LineageResolver } from "./lineage.mjs";
|
|
30
|
-
import {
|
|
30
|
+
import { resolveClaudePath } from "./claude-spawner.mjs";
|
|
31
|
+
import { resolveCodexPath } from "./codex-spawner.mjs";
|
|
32
|
+
import { selectSpawner } from "./spawner-select.mjs";
|
|
31
33
|
import {
|
|
32
34
|
createExecutionUploadHooks,
|
|
33
35
|
createTranscriptUploadHooks,
|
|
@@ -37,14 +39,14 @@ import { WAKE_ACTIONS } from "./prompts.mjs";
|
|
|
37
39
|
import { createInterruptReporter } from "./interrupt-reporter.mjs";
|
|
38
40
|
import { createTurnReporter } from "./turn-reporter.mjs";
|
|
39
41
|
import { createControlHandler } from "./control-handler.mjs";
|
|
40
|
-
import { resolveSigintTimeoutMs } from "./daemon-config.mjs";
|
|
42
|
+
import { resolveSigintTimeoutMs, resolveDaemonCwds } from "./daemon-config.mjs";
|
|
41
43
|
import {
|
|
42
44
|
startBackground,
|
|
43
45
|
stopDaemon,
|
|
44
46
|
isRunning,
|
|
45
47
|
readLog,
|
|
46
48
|
} from "./daemon-lifecycle.mjs";
|
|
47
|
-
import { readFileSync } from "node:fs";
|
|
49
|
+
import { readFileSync, existsSync } from "node:fs";
|
|
48
50
|
import { dirname, join } from "node:path";
|
|
49
51
|
import { fileURLToPath } from "node:url";
|
|
50
52
|
|
|
@@ -81,7 +83,8 @@ function defaultLogger() {
|
|
|
81
83
|
* fetchImpl?: typeof fetch,
|
|
82
84
|
* sseListener?: any,
|
|
83
85
|
* spawner?: any,
|
|
84
|
-
* cwd?: string,
|
|
86
|
+
* cwd?: string, Single served path (back-compat); maps to a one-element cwd set.
|
|
87
|
+
* cwds?: Array<string|undefined>, The SET of paths this daemon serves (T3 多路径). Each entry registers one independent connection bound to that cwd; `undefined` ⇒ process cwd. Takes precedence over `cwd`.
|
|
85
88
|
* hooks?: any,
|
|
86
89
|
* makeSseListener?: (opts: any) => any,
|
|
87
90
|
* maxConcurrency?: number,
|
|
@@ -94,45 +97,19 @@ function defaultLogger() {
|
|
|
94
97
|
export function buildDaemon(creds, deps = {}) {
|
|
95
98
|
const logger = deps.logger ?? defaultLogger();
|
|
96
99
|
const permissionMode = deps.permissionMode ?? "chorus";
|
|
100
|
+
// The resolved agent backend selects which spawner the daemon injects
|
|
101
|
+
// (add-daemon-codex-backend). Defaults to claude-code, matching the prior
|
|
102
|
+
// hard-wired ClaudeSpawner. The spawn path below is backend-agnostic — it only
|
|
103
|
+
// ever calls the shared wake(...) contract.
|
|
104
|
+
const agentType = deps.agentType ?? "claude-code";
|
|
97
105
|
// Per-wake verbose logging (daemon-startup-output), threaded into the Waker.
|
|
98
|
-
// agentType is currently display-only (banner/logs) — the spawn path is
|
|
99
|
-
// claude-code regardless (daemon-agent-selection reserves the slot only).
|
|
100
106
|
const verbose = deps.verbose ?? false;
|
|
101
107
|
// Escalation window for the interrupt killer (子3). Pre-resolved by runDaemon via
|
|
102
108
|
// the layered resolver; falls back to the resolver's default here when not given,
|
|
103
109
|
// so a daemon built directly (integration tests) still gets a sane value.
|
|
104
110
|
const sigintTimeoutMs = deps.sigintTimeoutMs ?? resolveSigintTimeoutMs();
|
|
105
|
-
//
|
|
106
|
-
//
|
|
107
|
-
// connectionState holds the connection uuid learned from the SSE handshake;
|
|
108
|
-
// declared here so the reporter (which needs it to address the execution row)
|
|
109
|
-
// can read it lazily. It is assigned by onConnectionId below.
|
|
110
|
-
/** @type {{ connectionUuid: string|null }} */
|
|
111
|
-
const connectionState = { connectionUuid: null };
|
|
112
|
-
const reportInterrupt =
|
|
113
|
-
deps.reportInterrupt ??
|
|
114
|
-
createInterruptReporter({
|
|
115
|
-
url: creds.url,
|
|
116
|
-
apiKey: creds.apiKey,
|
|
117
|
-
getConnectionUuid: () => connectionState.connectionUuid,
|
|
118
|
-
logger,
|
|
119
|
-
fetchImpl: deps.fetchImpl,
|
|
120
|
-
});
|
|
121
|
-
// Turn-lifecycle reporter (子1 — daemon-session-conversation): REST POST with the
|
|
122
|
-
// daemon's Bearer key (zero new deps), injectable for tests. The waker calls it on a
|
|
123
|
-
// wake's spawn (→ running) and exit (→ ended) to advance the server-side
|
|
124
|
-
// DaemonSessionTurn the notification chokepoint created. Reads the connectionUuid
|
|
125
|
-
// lazily from the same box the SSE handshake fills.
|
|
126
|
-
const advanceTurn =
|
|
127
|
-
deps.advanceTurn ??
|
|
128
|
-
createTurnReporter({
|
|
129
|
-
url: creds.url,
|
|
130
|
-
apiKey: creds.apiKey,
|
|
131
|
-
getConnectionUuid: () => connectionState.connectionUuid,
|
|
132
|
-
logger,
|
|
133
|
-
fetchImpl: deps.fetchImpl,
|
|
134
|
-
});
|
|
135
|
-
|
|
111
|
+
// ===== Shared deps (one set per daemon process) =====
|
|
112
|
+
// These are process-wide — independent of how many paths (cwds) the daemon serves.
|
|
136
113
|
const mcpClient =
|
|
137
114
|
deps.mcpClient ?? new ChorusClient({ url: creds.url, apiKey: creds.apiKey, logger });
|
|
138
115
|
// Lineage resolution is a plain REST call (Bearer agent key) per notification —
|
|
@@ -140,151 +117,292 @@ export function buildDaemon(creds, deps = {}) {
|
|
|
140
117
|
const lineage =
|
|
141
118
|
deps.lineage ??
|
|
142
119
|
new LineageResolver({ url: creds.url, apiKey: creds.apiKey, logger, fetchImpl: deps.fetchImpl });
|
|
143
|
-
|
|
120
|
+
// Inject the spawner for the resolved backend. claude-code → ClaudeSpawner
|
|
121
|
+
// (construction byte-identical to before); codex → CodexSpawner. `creds` are
|
|
122
|
+
// passed through so the Codex backend can export the daemon key into the woken
|
|
123
|
+
// process env (the Claude backend ignores creds — it gets its key via --mcp-config).
|
|
124
|
+
const spawner = deps.spawner ?? selectSpawner(agentType, { logger, permissionMode, creds });
|
|
125
|
+
// The WakeQueue serializes per DIRECT idea (keyFor's key). It is shared across all
|
|
126
|
+
// path-connections: serialization-per-idea still holds, and maxConcurrency caps the
|
|
127
|
+
// whole process's in-flight wakes rather than per-cwd — the right global budget.
|
|
144
128
|
const queue = new WakeQueue({ maxConcurrency: deps.maxConcurrency ?? 4, logger });
|
|
145
129
|
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
//
|
|
150
|
-
//
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
//
|
|
160
|
-
//
|
|
161
|
-
//
|
|
162
|
-
//
|
|
163
|
-
//
|
|
164
|
-
//
|
|
165
|
-
//
|
|
166
|
-
//
|
|
167
|
-
//
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
130
|
+
// ===== Multi-path: the SET of cwds this daemon serves (T3 — FR-5) =====
|
|
131
|
+
// Each declared path becomes one INDEPENDENT connection (own SSE self-report + own
|
|
132
|
+
// Waker bound to that cwd + own router/backfill/control). The daemon process's OWN
|
|
133
|
+
// cwd never changes (NFR-3). `undefined` ⇒ "serve the process default cwd" (single-
|
|
134
|
+
// path / HARD-1 default). `deps.cwds` (a list) takes precedence; `deps.cwd` (a single
|
|
135
|
+
// value, still injected by integration tests) maps to a one-element set; otherwise a
|
|
136
|
+
// single `[undefined]` connection at the process cwd — exactly today's behavior. This
|
|
137
|
+
// is JUST a list of paths; it carries NO path↔project binding (DEC-5: cwd ⟂ project).
|
|
138
|
+
const cwdSet =
|
|
139
|
+
Array.isArray(deps.cwds) && deps.cwds.length > 0
|
|
140
|
+
? deps.cwds
|
|
141
|
+
: [deps.cwd];
|
|
142
|
+
|
|
143
|
+
// ===== All-conflict exit latch (add-daemon-connection-conflict-skip, Q3) =====
|
|
144
|
+
// Each declared connection resolves to exactly one terminal outcome: REGISTERED
|
|
145
|
+
// (saw connection_registered → onConnectionId) or CONFLICTED (saw
|
|
146
|
+
// connection_conflict → onConflict). When EVERY declared connection has resolved
|
|
147
|
+
// AND none registered (≥1 conflicted, 0 survived), the daemon has nothing to serve,
|
|
148
|
+
// so we settle `allConflict` — runDaemon races this against waitForever and returns
|
|
149
|
+
// a non-zero exit. The latch is evaluated only after all connections resolve (R5):
|
|
150
|
+
// a path still mid-handshake leaves `resolved < total`, so a partial conflict never
|
|
151
|
+
// triggers the exit. A connection that registers (even after some conflicted) flips
|
|
152
|
+
// `anyRegistered`, so the exit never fires while at least one path serves.
|
|
153
|
+
const totalConnections = cwdSet.length;
|
|
154
|
+
let resolvedConnections = 0;
|
|
155
|
+
let anyRegistered = false;
|
|
156
|
+
let settleAllConflict; // resolver, wired into the promise below
|
|
157
|
+
// A promise that settles ONLY in the all-paths-conflicted case. It never rejects and
|
|
158
|
+
// never settles otherwise (a serving daemon simply keeps waiting on waitForever).
|
|
159
|
+
const allConflict = new Promise((resolve) => {
|
|
160
|
+
settleAllConflict = resolve;
|
|
161
|
+
});
|
|
162
|
+
// Record one connection's terminal outcome and, once all have resolved, decide whether
|
|
163
|
+
// the whole daemon should exit. Idempotent per connection BY CONSTRUCTION: the guard
|
|
164
|
+
// lives here (flips the connection's own `outcome.resolved`) so a reconnect's repeated
|
|
165
|
+
// connection_registered — or any future caller — can never double-count, no matter the
|
|
166
|
+
// call site. The first terminal signal for a connection wins; later ones are no-ops.
|
|
167
|
+
function recordConnectionOutcome(outcome, registered) {
|
|
168
|
+
if (outcome.resolved) return;
|
|
169
|
+
outcome.resolved = true;
|
|
170
|
+
resolvedConnections += 1;
|
|
171
|
+
if (registered) anyRegistered = true;
|
|
172
|
+
if (resolvedConnections === totalConnections && !anyRegistered) {
|
|
173
|
+
settleAllConflict();
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
/**
|
|
178
|
+
* Build ONE independent path-connection bound to `cwd` (one SSE stream → one
|
|
179
|
+
* DaemonConnection row, keyed by that cwd server-side). All per-connection state —
|
|
180
|
+
* its connectionUuid box, reporters, hooks, Waker(cwd), router, backfill, control
|
|
181
|
+
* handler, and SseListener(cwd) — lives in this closure so two connections never
|
|
182
|
+
* share a connectionUuid or a dedup set. `index` selects the per-connection injected
|
|
183
|
+
* test dep (sseListener/makeSseListener) when an array was supplied (a single value
|
|
184
|
+
* is reused for connection 0, mirroring the historical single-connection injection).
|
|
185
|
+
* @param {string|undefined} cwd
|
|
186
|
+
* @param {number} index
|
|
187
|
+
*/
|
|
188
|
+
function buildConnection(cwd, index) {
|
|
189
|
+
// connectionState holds the connectionUuid learned from THIS stream's SSE handshake;
|
|
190
|
+
// the reporters, hooks, and control handler read it lazily so construction order
|
|
191
|
+
// doesn't matter. Per-connection so each path's wakes report against the right row.
|
|
192
|
+
/** @type {{ connectionUuid: string|null }} */
|
|
193
|
+
const connectionState = { connectionUuid: null };
|
|
194
|
+
|
|
195
|
+
// Per-connection terminal-outcome bookkeeping (add-daemon-connection-conflict-skip).
|
|
196
|
+
// `resolved` guards recordConnectionOutcome against double-counting a reconnect's
|
|
197
|
+
// repeated connection_registered. `skipped` marks a cwd surrendered to a live
|
|
198
|
+
// different-process daemon — purely informational (the listener is torn down, so it
|
|
199
|
+
// simply never reconnects), kept on the returned object for inspection/tests.
|
|
200
|
+
const outcome = { resolved: false, skipped: false };
|
|
201
|
+
|
|
202
|
+
// Interrupt reporter (子3): REST POST with the daemon's Bearer key. Injectable for
|
|
203
|
+
// tests (shared across connections when injected — tests use a single connection).
|
|
204
|
+
const reportInterrupt =
|
|
205
|
+
deps.reportInterrupt ??
|
|
206
|
+
createInterruptReporter({
|
|
172
207
|
url: creds.url,
|
|
173
208
|
apiKey: creds.apiKey,
|
|
174
209
|
getConnectionUuid: () => connectionState.connectionUuid,
|
|
175
|
-
getSnapshot: () => waker?.buildExecutionSnapshot() ?? [],
|
|
176
210
|
logger,
|
|
177
211
|
fetchImpl: deps.fetchImpl,
|
|
178
|
-
})
|
|
179
|
-
|
|
212
|
+
});
|
|
213
|
+
// Turn-lifecycle reporter (子1): advances the server-side DaemonSessionTurn on
|
|
214
|
+
// spawn (→ running) and exit (→ ended), reading the connectionUuid lazily.
|
|
215
|
+
const advanceTurn =
|
|
216
|
+
deps.advanceTurn ??
|
|
217
|
+
createTurnReporter({
|
|
180
218
|
url: creds.url,
|
|
181
219
|
apiKey: creds.apiKey,
|
|
220
|
+
getConnectionUuid: () => connectionState.connectionUuid,
|
|
182
221
|
logger,
|
|
183
222
|
fetchImpl: deps.fetchImpl,
|
|
184
|
-
})
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
223
|
+
});
|
|
224
|
+
|
|
225
|
+
/** @type {Waker|undefined} */
|
|
226
|
+
let waker;
|
|
227
|
+
|
|
228
|
+
// Execution + transcript upload hooks (子1), merged. Bound to THIS connection's
|
|
229
|
+
// connectionState + waker so snapshots attribute to the right connection row.
|
|
230
|
+
const hooks =
|
|
231
|
+
deps.hooks ??
|
|
232
|
+
mergeUploadHooks(
|
|
233
|
+
createExecutionUploadHooks({
|
|
234
|
+
url: creds.url,
|
|
235
|
+
apiKey: creds.apiKey,
|
|
236
|
+
getConnectionUuid: () => connectionState.connectionUuid,
|
|
237
|
+
getSnapshot: () => waker?.buildExecutionSnapshot() ?? [],
|
|
238
|
+
logger,
|
|
239
|
+
fetchImpl: deps.fetchImpl,
|
|
240
|
+
}),
|
|
241
|
+
createTranscriptUploadHooks({
|
|
242
|
+
url: creds.url,
|
|
243
|
+
apiKey: creds.apiKey,
|
|
244
|
+
logger,
|
|
245
|
+
fetchImpl: deps.fetchImpl,
|
|
246
|
+
}),
|
|
247
|
+
{ logger }
|
|
248
|
+
);
|
|
249
|
+
|
|
250
|
+
// One dedup set per connection, shared by its router (live SSE) and its reconnect
|
|
251
|
+
// backfill, so a notification handled live is never re-woken on reconnect.
|
|
252
|
+
const seen = new Set();
|
|
253
|
+
// The Waker is bound to THIS connection's cwd: it uses cwd BOTH to probe the
|
|
254
|
+
// transcript (new-vs-resume) and to spawn, so they never diverge (Module Contract
|
|
255
|
+
// 1 — resolveCwd is the single source). `cwd` is `undefined` for the single-path /
|
|
256
|
+
// old-daemon default, which the Waker degrades to process.cwd() (HARD-1).
|
|
257
|
+
waker = new Waker({ creds, lineage, spawner, cwd, hooks, logger, reportInterrupt, advanceTurn, verbose });
|
|
258
|
+
// The router reads THIS connection's own uuid lazily (same source the control handler
|
|
259
|
+
// uses) to suppress a DIRECTED (pinned) wake stamped for a different connection
|
|
260
|
+
// (fix-pinned-wake-directed-delivery, T2). Null until the SSE handshake assigns it — a
|
|
261
|
+
// targeted wake arriving in that window is treated as "not mine" → suppressed (delivery
|
|
262
|
+
// covered by the deliver_turn ping to the actual target + the reconnect pending backfill).
|
|
263
|
+
const router = new EventRouter({
|
|
264
|
+
mcpClient,
|
|
265
|
+
waker,
|
|
266
|
+
queue,
|
|
267
|
+
wakeActions: WAKE_ACTIONS,
|
|
268
|
+
seen,
|
|
269
|
+
getConnectionUuid: () => connectionState.connectionUuid,
|
|
270
|
+
logger,
|
|
271
|
+
});
|
|
231
272
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
url: creds.url,
|
|
249
|
-
apiKey: creds.apiKey,
|
|
250
|
-
getConnectionUuid: () => connectionState.connectionUuid,
|
|
251
|
-
dispatchPendingTurn: (turn) => router.dispatchPendingTurn?.(turn),
|
|
252
|
-
fetchImpl: deps.fetchImpl,
|
|
253
|
-
});
|
|
273
|
+
// Reverse control channel (子3) + resume re-dispatch + origin-only deliver_turn —
|
|
274
|
+
// all scoped to THIS connection's uuid/router/backfill (see the original wiring
|
|
275
|
+
// comments retained on the shared helpers). The control handler verifies a control
|
|
276
|
+
// event against this connection's own connectionUuid before acting.
|
|
277
|
+
const redispatchResume = (entityType, entityUuid) => {
|
|
278
|
+
router.dispatchResume?.({ entityType, entityUuid });
|
|
279
|
+
};
|
|
280
|
+
const deliverTurn = (turnUuid) => backfill?.pendingTurnsOnly?.(turnUuid);
|
|
281
|
+
const onControl = createControlHandler({
|
|
282
|
+
waker,
|
|
283
|
+
getConnectionUuid: () => connectionState.connectionUuid,
|
|
284
|
+
sigintTimeoutMs,
|
|
285
|
+
redispatchResume,
|
|
286
|
+
deliverTurn,
|
|
287
|
+
logger,
|
|
288
|
+
});
|
|
254
289
|
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
290
|
+
// Reconnect + pending-turn backfill, pinned to THIS connection's sessions (the
|
|
291
|
+
// server scopes getPendingTurnsForConnection by originConnectionUuid — i.e. the
|
|
292
|
+
// cwd this connection serves — so a multi-path daemon's backfill never re-runs
|
|
293
|
+
// another cwd's turns).
|
|
294
|
+
const backfill = createBackfill({
|
|
295
|
+
mcpClient,
|
|
296
|
+
dispatch: (event) => router.dispatch(event),
|
|
297
|
+
seen,
|
|
298
|
+
logger,
|
|
258
299
|
url: creds.url,
|
|
259
300
|
apiKey: creds.apiKey,
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
onConnectionId: (connectionUuid) => {
|
|
264
|
-
connectionState.connectionUuid = connectionUuid;
|
|
265
|
-
logger.info(`[Chorus] registered as connection ${connectionUuid}`);
|
|
266
|
-
},
|
|
267
|
-
// Reverse control channel: a `type:"control"` event is forked here, NEVER to
|
|
268
|
-
// onEvent/router/queue — so it can never spawn a wake (子3).
|
|
269
|
-
onControl,
|
|
270
|
-
onReconnect: backfill,
|
|
271
|
-
logger,
|
|
301
|
+
getConnectionUuid: () => connectionState.connectionUuid,
|
|
302
|
+
dispatchPendingTurn: (turn) => router.dispatchPendingTurn?.(turn),
|
|
303
|
+
fetchImpl: deps.fetchImpl,
|
|
272
304
|
});
|
|
273
305
|
|
|
306
|
+
// Per-connection SSE listener, self-reporting THIS connection's cwd so the server
|
|
307
|
+
// registers it as a distinct (agent, clientType, host, cwd) row. Test injection:
|
|
308
|
+
// - `deps.sseListener` is a CONCRETE instance — there is only one, so it stands in
|
|
309
|
+
// for connection 0 only (a single-path daemon, the historical injection shape).
|
|
310
|
+
// - `deps.makeSseListener` is a FACTORY — it is invoked PER connection (so a
|
|
311
|
+
// multi-path test gets one mock listener per cwd). An array form also works:
|
|
312
|
+
// one factory/instance per connection by index.
|
|
313
|
+
const injectedListener = Array.isArray(deps.sseListener)
|
|
314
|
+
? deps.sseListener[index]
|
|
315
|
+
: index === 0
|
|
316
|
+
? deps.sseListener
|
|
317
|
+
: undefined;
|
|
318
|
+
const makeSse =
|
|
319
|
+
(Array.isArray(deps.makeSseListener) ? deps.makeSseListener[index] : deps.makeSseListener) ??
|
|
320
|
+
((o) => new SseListener(o));
|
|
321
|
+
const sseListener =
|
|
322
|
+
injectedListener ??
|
|
323
|
+
makeSse({
|
|
324
|
+
url: creds.url,
|
|
325
|
+
apiKey: creds.apiKey,
|
|
326
|
+
// Self-report the SELECTED backend so the connection registry + presence UI
|
|
327
|
+
// label a codex daemon as `codex` (not the hardcoded `claude_code`).
|
|
328
|
+
clientType: backendClientType(agentType),
|
|
329
|
+
// The working directory THIS connection serves (T3). `undefined` ⇒ the listener
|
|
330
|
+
// reports its process cwd (single-path / HARD-1). It is just the served path.
|
|
331
|
+
cwd,
|
|
332
|
+
onEvent: (event) => router.dispatch(event),
|
|
333
|
+
onConnectionId: (connectionUuid) => {
|
|
334
|
+
connectionState.connectionUuid = connectionUuid;
|
|
335
|
+
logger.info(
|
|
336
|
+
`[Chorus] registered as connection ${connectionUuid}` +
|
|
337
|
+
(cwd ? ` (cwd=${cwd})` : "")
|
|
338
|
+
);
|
|
339
|
+
// Terminal outcome: this path registered. recordConnectionOutcome is idempotent
|
|
340
|
+
// per connection, so a reconnect's repeated connection_registered counts once.
|
|
341
|
+
recordConnectionOutcome(outcome, true);
|
|
342
|
+
},
|
|
343
|
+
// Connection conflict (add-daemon-connection-conflict-skip, Q3/Q4): the server
|
|
344
|
+
// refused to register THIS cwd because a live different-process daemon already
|
|
345
|
+
// holds the same (agent, host, cwd). Warn prominently, tear the listener down
|
|
346
|
+
// (disconnect clears the reconnect timer + aborts), and mark the path skipped —
|
|
347
|
+
// it is never reconnected/re-probed for the process lifetime. Takeover happens
|
|
348
|
+
// only on the NEXT daemon start/restart. Independent closures mean skipping this
|
|
349
|
+
// path never disturbs another connection's dispatch/control.
|
|
350
|
+
onConflict: (event) => {
|
|
351
|
+
const conflictCwd = (event && event.cwd) ?? cwd ?? process.cwd();
|
|
352
|
+
const conflictHost = (event && event.host) || "this host";
|
|
353
|
+
logger.warn(
|
|
354
|
+
`[Chorus] ⚠ connection conflict: a live daemon already serves ` +
|
|
355
|
+
`(host=${conflictHost}, cwd=${conflictCwd}) — skipping this path. ` +
|
|
356
|
+
`Stop the other daemon (or wait for it to go offline) and restart to take it over.`
|
|
357
|
+
);
|
|
358
|
+
outcome.skipped = true;
|
|
359
|
+
// Tear down THIS path's listener: no reconnect, no re-probe (Q4).
|
|
360
|
+
sseListener.disconnect?.();
|
|
361
|
+
// Terminal outcome: this path conflicted (idempotent — counts once).
|
|
362
|
+
recordConnectionOutcome(outcome, false);
|
|
363
|
+
},
|
|
364
|
+
onControl,
|
|
365
|
+
onReconnect: backfill,
|
|
366
|
+
logger,
|
|
367
|
+
});
|
|
368
|
+
|
|
369
|
+
return { cwd, connectionState, waker, router, backfill, sseListener, hooks, outcome };
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Build one connection per declared cwd. The order is the declaration order; the
|
|
373
|
+
// FIRST connection's pieces are aliased onto the returned object for backward
|
|
374
|
+
// compatibility (existing tests/inspection read daemon.waker / .router / .sseListener).
|
|
375
|
+
const connections = cwdSet.map((cwd, i) => buildConnection(cwd, i));
|
|
376
|
+
const primary = connections[0];
|
|
377
|
+
|
|
274
378
|
return {
|
|
275
379
|
mcpClient,
|
|
276
380
|
lineage,
|
|
277
381
|
spawner,
|
|
278
382
|
queue,
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
383
|
+
// Back-compat single-connection aliases (the common single-path case). The full
|
|
384
|
+
// set is exposed as `connections` for multi-path inspection/tests.
|
|
385
|
+
waker: primary.waker,
|
|
386
|
+
router: primary.router,
|
|
387
|
+
sseListener: primary.sseListener,
|
|
388
|
+
connections,
|
|
389
|
+
// Settles ONLY when every declared connection resolved and none registered
|
|
390
|
+
// (all paths already served by a live daemon — Q3). runDaemon races this against
|
|
391
|
+
// waitForever to exit non-zero. Never settles for a serving daemon.
|
|
392
|
+
allConflict,
|
|
282
393
|
async start() {
|
|
283
|
-
|
|
284
|
-
|
|
394
|
+
// Connect every path-connection. Each fires its own onConnect hook + SSE connect;
|
|
395
|
+
// the daemon process cwd is untouched (NFR-3).
|
|
396
|
+
for (const c of connections) {
|
|
397
|
+
await c.hooks.onConnect?.({ host: creds.url });
|
|
398
|
+
await c.sseListener.connect();
|
|
399
|
+
}
|
|
285
400
|
},
|
|
286
401
|
async stop() {
|
|
287
|
-
|
|
402
|
+
for (const c of connections) {
|
|
403
|
+
c.sseListener.disconnect?.();
|
|
404
|
+
}
|
|
405
|
+
// The MCP client is process-wide (shared) — disconnect it once.
|
|
288
406
|
await mcpClient.disconnect?.();
|
|
289
407
|
},
|
|
290
408
|
};
|
|
@@ -319,7 +437,11 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
319
437
|
const askPrompt = deps.prompt ?? prompt;
|
|
320
438
|
const writeCreds = deps.writeLoginFile ?? writeLoginFile;
|
|
321
439
|
const version = deps.version ?? readVersion();
|
|
440
|
+
// Backend executable resolvers — injectable for tests. The SELECTED backend's
|
|
441
|
+
// resolver runs below (claude-code → findClaude, codex → findCodex), so the
|
|
442
|
+
// banner shows the right binary instead of always probing for `claude`.
|
|
322
443
|
const findClaude = deps.resolveClaudePath ?? resolveClaudePath;
|
|
444
|
+
const findCodex = deps.resolveCodexPath ?? resolveCodexPath;
|
|
323
445
|
const verbose = flags.verbose === true || env.CHORUS_VERBOSE === "1";
|
|
324
446
|
|
|
325
447
|
// Resolve the agent backend (default claude-code). An unknown --agent /
|
|
@@ -358,6 +480,13 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
358
480
|
// --sigint-timeout flag > CHORUS_DAEMON_SIGINT_TIMEOUT env > ~/.chorus/daemon.json > 10000.
|
|
359
481
|
const sigintTimeoutMs = resolveSigintTimeoutMs({ sigintTimeout: flags.sigintTimeout }, { env });
|
|
360
482
|
|
|
483
|
+
// The SET of working directories this daemon serves (T3 — 单 daemon 多路径引擎).
|
|
484
|
+
// Layered: --cwd flag(s) > CHORUS_DAEMON_CWDS env > ~/.chorus/daemon.json `cwds`
|
|
485
|
+
// > [undefined] (single connection at the process cwd). A single `[undefined]`
|
|
486
|
+
// is exactly today's single-path behavior. JUST a list of paths — no project
|
|
487
|
+
// binding (DEC-5: cwd ⟂ project). The daemon process's own cwd never changes.
|
|
488
|
+
const cwds = resolveDaemonCwds({ cwd: flags.cwd }, { env });
|
|
489
|
+
|
|
361
490
|
// Foreground preflight: resolve/complete credentials + resolve the permission
|
|
362
491
|
// posture (confirming yolo on a TTY). Reuses the same pfDeps bundle the detach
|
|
363
492
|
// path uses. Returns a numeric exit code on failure, or
|
|
@@ -366,10 +495,18 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
366
495
|
if (typeof pf === "number") return pf;
|
|
367
496
|
const { creds, identity, permissionMode } = pf;
|
|
368
497
|
|
|
369
|
-
// Detect the
|
|
370
|
-
// it's missing; a wake surfaces the error visibly when one
|
|
371
|
-
// resolved path (or absence) is shown in the banner below.
|
|
372
|
-
|
|
498
|
+
// Detect the SELECTED backend's executable (non-fatal): the daemon still
|
|
499
|
+
// subscribes when it's missing; a wake surfaces the error visibly when one
|
|
500
|
+
// arrives. The resolved path (or absence) is shown in the banner below. codex
|
|
501
|
+
// → resolveCodexPath, otherwise resolveClaudePath — so a `--agent codex` run
|
|
502
|
+
// probes (and the banner reports) `codex`, not `claude`.
|
|
503
|
+
const cliPath = agentType === "codex" ? findCodex() : findClaude();
|
|
504
|
+
|
|
505
|
+
// The daemon.json the layered config readers (credentials, sigint timeout, cwds)
|
|
506
|
+
// consult. Surfacing its absolute path + presence in the banner makes it obvious
|
|
507
|
+
// which file to edit for `cwds` / `sigintTimeoutMs` and whether one exists at all.
|
|
508
|
+
const configPath = loginFilePath();
|
|
509
|
+
const configExists = existsSync(configPath);
|
|
373
510
|
|
|
374
511
|
// Boxed startup banner — one screen replacing the scattered [Chorus] lines.
|
|
375
512
|
log(
|
|
@@ -382,8 +519,10 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
382
519
|
permissionMode,
|
|
383
520
|
credentialSource: creds.source,
|
|
384
521
|
agentType,
|
|
385
|
-
|
|
522
|
+
cliPath,
|
|
386
523
|
connection: "connecting…",
|
|
524
|
+
configPath,
|
|
525
|
+
configExists,
|
|
387
526
|
},
|
|
388
527
|
{ isTTY: isTTY && Boolean(process.stdout.isTTY) }
|
|
389
528
|
)
|
|
@@ -393,6 +532,23 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
393
532
|
if (permissionMode === "yolo") {
|
|
394
533
|
errLog(`[Chorus] ${yoloWarningLine()}`);
|
|
395
534
|
}
|
|
535
|
+
// A missing backend binary is non-fatal (the daemon still subscribes), but the
|
|
536
|
+
// banner row alone is easy to miss in a systemd journal — emit one loud ⚠ line
|
|
537
|
+
// on stderr so the operator sees it at startup, not only when a wake fails. The
|
|
538
|
+
// warning names the SELECTED backend (claude / CHORUS_CLAUDE_PATH or codex /
|
|
539
|
+
// CHORUS_CODEX_PATH).
|
|
540
|
+
if (cliPath === null) {
|
|
541
|
+
errLog(`[Chorus] ${agentNotFoundWarningLine(agentType)}`);
|
|
542
|
+
}
|
|
543
|
+
|
|
544
|
+
// Surface the served paths so an operator sees a multi-path daemon at a glance.
|
|
545
|
+
// A single `[undefined]` (the default) prints the process cwd it falls back to.
|
|
546
|
+
const servedPaths = cwds.map((c) => c ?? process.cwd());
|
|
547
|
+
if (servedPaths.length > 1) {
|
|
548
|
+
log(`[Chorus] serving ${servedPaths.length} paths: ${servedPaths.join(", ")}`);
|
|
549
|
+
} else {
|
|
550
|
+
log(`[Chorus] serving path: ${servedPaths[0]}`);
|
|
551
|
+
}
|
|
396
552
|
|
|
397
553
|
const daemon = build(creds, {
|
|
398
554
|
logger: { info: log, warn: errLog, error: errLog },
|
|
@@ -400,6 +556,7 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
400
556
|
agentType,
|
|
401
557
|
verbose,
|
|
402
558
|
sigintTimeoutMs,
|
|
559
|
+
cwds,
|
|
403
560
|
});
|
|
404
561
|
|
|
405
562
|
// Graceful shutdown on signals.
|
|
@@ -414,8 +571,32 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
414
571
|
await daemon.start();
|
|
415
572
|
log("[Chorus] daemon running. Waiting for task dispatches (Ctrl+C to stop).");
|
|
416
573
|
|
|
417
|
-
// Keep the process alive for the long-lived SSE subscription
|
|
418
|
-
|
|
574
|
+
// Keep the process alive for the long-lived SSE subscription, but exit non-zero if
|
|
575
|
+
// EVERY declared path turns out to be already served by a live daemon
|
|
576
|
+
// (add-daemon-connection-conflict-skip, Q3). `daemon.allConflict` settles only in
|
|
577
|
+
// that all-paths-conflicted case; otherwise we wait forever on the subscription. A
|
|
578
|
+
// sentinel distinguishes the two so a waitForever that never settles can't be mistaken
|
|
579
|
+
// for the conflict exit.
|
|
580
|
+
const ALL_CONFLICT = Symbol("all-conflict");
|
|
581
|
+
const waitForever = deps.waitForever ?? (() => new Promise(() => {}));
|
|
582
|
+
// `daemon.allConflict` is present on the real buildDaemon output; guard for injected
|
|
583
|
+
// test fakes that don't provide it (those never settle the conflict branch). A
|
|
584
|
+
// never-settling fallback keeps the race purely waitForever-driven in that case.
|
|
585
|
+
const allConflictSignal =
|
|
586
|
+
daemon.allConflict ?? new Promise(() => {});
|
|
587
|
+
const outcome = await Promise.race([
|
|
588
|
+
waitForever().then(() => 0),
|
|
589
|
+
allConflictSignal.then(() => ALL_CONFLICT),
|
|
590
|
+
]);
|
|
591
|
+
if (outcome === ALL_CONFLICT) {
|
|
592
|
+
const n = servedPaths.length;
|
|
593
|
+
errLog(
|
|
594
|
+
`[Chorus] all ${n} declared ${n === 1 ? "path is" : "paths are"} already served by a live daemon — nothing to do. ` +
|
|
595
|
+
`Stop the other daemon(s) or remove the conflicting path(s), then restart.`
|
|
596
|
+
);
|
|
597
|
+
await daemon.stop();
|
|
598
|
+
return 1;
|
|
599
|
+
}
|
|
419
600
|
return 0;
|
|
420
601
|
}
|
|
421
602
|
|