@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/event-router.mjs
CHANGED
|
@@ -10,6 +10,27 @@
|
|
|
10
10
|
|
|
11
11
|
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
12
12
|
|
|
13
|
+
// Map a Notification.action to its DaemonSessionTurn trigger category — the daemon-side
|
|
14
|
+
// MIRROR of the server's NOTIFICATION_ACTION_TO_TURN_TRIGGER (src/services/notification-turn.ts).
|
|
15
|
+
// Used ONLY to match a re-read wake notification back to a DIRECTED autonomous pending turn
|
|
16
|
+
// (the deliver_turn re-dispatch rebuilds the prompt from the notification, T2). Kept narrow
|
|
17
|
+
// to the three triggers a `deliver_turn` ping can carry for an autonomous wake; every other
|
|
18
|
+
// action collapses to the `task_assigned` trigger exactly as the server does, so a
|
|
19
|
+
// task_assigned turn matches its task_reopened/task_verified/idea_claimed/proposal_* origins.
|
|
20
|
+
const ACTION_TO_TURN_TRIGGER = {
|
|
21
|
+
mentioned: "mentioned",
|
|
22
|
+
elaboration_verified: "elaboration_verified",
|
|
23
|
+
elaboration_requested: "elaboration",
|
|
24
|
+
elaboration_answered: "elaboration",
|
|
25
|
+
human_instruction: "human_instruction",
|
|
26
|
+
task_assigned: "task_assigned",
|
|
27
|
+
task_reopened: "task_assigned",
|
|
28
|
+
task_verified: "task_assigned",
|
|
29
|
+
idea_claimed: "task_assigned",
|
|
30
|
+
proposal_approved: "task_assigned",
|
|
31
|
+
proposal_rejected: "task_assigned",
|
|
32
|
+
};
|
|
33
|
+
|
|
13
34
|
export class EventRouter {
|
|
14
35
|
/**
|
|
15
36
|
* @param {{
|
|
@@ -17,6 +38,15 @@ export class EventRouter {
|
|
|
17
38
|
* waker: { keyFor: (n: any) => Promise<{ key: string, rootIdeaUuid: string|null, directIdeaUuid: string|null }>, wake: (n: any, key: string, attribution?: any) => Promise<void>, markQueued?: (n: any, key: string, attribution?: any) => void },
|
|
18
39
|
* queue: { enqueue: (key: string, task: () => Promise<void>) => void },
|
|
19
40
|
* wakeActions: Set<string>,
|
|
41
|
+
* getConnectionUuid?: () => (string|null), This daemon's registered connection uuid
|
|
42
|
+
* (null until the SSE handshake reports it).
|
|
43
|
+
* Same self-identity source the control handler
|
|
44
|
+
* uses — wired in cli/daemon.mjs. Used to suppress
|
|
45
|
+
* a DIRECTED (pinned) wake whose stamped target is
|
|
46
|
+
* NOT this connection (fix-pinned-wake-directed-
|
|
47
|
+
* delivery). Absent ⇒ no targeting (no suppression
|
|
48
|
+
* ever) — preserves the pre-change behavior for any
|
|
49
|
+
* caller that does not wire it.
|
|
20
50
|
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
21
51
|
* }} opts
|
|
22
52
|
*/
|
|
@@ -25,6 +55,12 @@ export class EventRouter {
|
|
|
25
55
|
this.waker = opts.waker;
|
|
26
56
|
this.queue = opts.queue;
|
|
27
57
|
this.wakeActions = opts.wakeActions;
|
|
58
|
+
// This daemon's own connection uuid (lazy — read at routing time, not construction,
|
|
59
|
+
// since the SSE handshake assigns it after the router is built). Defaults to a getter
|
|
60
|
+
// returning null so an un-wired router behaves as before (a stamped target is then
|
|
61
|
+
// never "mine", but only `human_instruction`/directed paths stamp one — un-pinned wakes
|
|
62
|
+
// carry no target and are unaffected).
|
|
63
|
+
this.getConnectionUuid = opts.getConnectionUuid ?? (() => null);
|
|
28
64
|
this.logger = opts.logger ?? NOOP_LOGGER;
|
|
29
65
|
// Shared dedup set: the daemon passes the SAME Set to the reconnect backfill
|
|
30
66
|
// so a notification handled live is never re-woken on reconnect, and a
|
|
@@ -37,7 +73,18 @@ export class EventRouter {
|
|
|
37
73
|
/**
|
|
38
74
|
* Handle one SSE event. Synchronous + non-throwing: it kicks off async
|
|
39
75
|
* fetch/route work and returns immediately so the SSE consumer never blocks.
|
|
40
|
-
*
|
|
76
|
+
*
|
|
77
|
+
* DIRECTED-DELIVERY TRANSPORT FIELDS (fix-pinned-wake-directed-delivery): a live
|
|
78
|
+
* `new_notification` event for a PINNED autonomous wake carries two TRANSPORT-ONLY fields
|
|
79
|
+
* stamped by the server (NOT persisted, NOT on `chorus_get_notifications`):
|
|
80
|
+
* - `targetConnectionUuid` — the resolved ONLINE target connection for a directed wake;
|
|
81
|
+
* null for un-pinned / notify-only wakes.
|
|
82
|
+
* - `suppressWake` — true ONLY for an offline-pin wake (a pin matched NO online
|
|
83
|
+
* connection) so EVERY daemon suppresses (Q2 notify-only); false otherwise.
|
|
84
|
+
* They are threaded to `#fetchAndRoute` so the broadcast-suppression decision can be made
|
|
85
|
+
* there. A reconnect-backfill synthetic event omits both (so a backfilled wake behaves as
|
|
86
|
+
* un-pinned → online-first; the directed target is covered by its own `deliver_turn` ping).
|
|
87
|
+
* @param {{ type?: string, notificationUuid?: string, targetConnectionUuid?: string|null, suppressWake?: boolean }} event
|
|
41
88
|
*/
|
|
42
89
|
dispatch(event) {
|
|
43
90
|
if (event?.type !== "new_notification") {
|
|
@@ -51,13 +98,25 @@ export class EventRouter {
|
|
|
51
98
|
return; // already handled (e.g. live delivery then reconnect backfill)
|
|
52
99
|
}
|
|
53
100
|
this.seen.add(event.notificationUuid);
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
101
|
+
// Snapshot the transport-only directed-delivery fields off the EVENT (NOT the fetched
|
|
102
|
+
// notification — the server stamps them on the SSE envelope only).
|
|
103
|
+
const targetConnectionUuid =
|
|
104
|
+
typeof event.targetConnectionUuid === "string" ? event.targetConnectionUuid : null;
|
|
105
|
+
const suppressWake = event.suppressWake === true;
|
|
106
|
+
this.#fetchAndRoute(event.notificationUuid, { targetConnectionUuid, suppressWake }).catch(
|
|
107
|
+
(err) => {
|
|
108
|
+
this.logger.error(`[Chorus] failed to route notification ${event.notificationUuid}: ${err}`);
|
|
109
|
+
}
|
|
110
|
+
);
|
|
57
111
|
}
|
|
58
112
|
|
|
59
|
-
/**
|
|
60
|
-
|
|
113
|
+
/**
|
|
114
|
+
* @param {string} notificationUuid
|
|
115
|
+
* @param {{ targetConnectionUuid?: string|null, suppressWake?: boolean }} [transport]
|
|
116
|
+
* Transport-only directed-delivery fields snapshotted off the SSE event (see `dispatch`).
|
|
117
|
+
* Omitted/empty (e.g. reconnect backfill) ⇒ un-pinned behavior (no suppression).
|
|
118
|
+
*/
|
|
119
|
+
async #fetchAndRoute(notificationUuid, transport = {}) {
|
|
61
120
|
const result = await this.mcp.callTool("chorus_get_notifications", {
|
|
62
121
|
status: "unread",
|
|
63
122
|
limit: 50,
|
|
@@ -95,6 +154,59 @@ export class EventRouter {
|
|
|
95
154
|
return;
|
|
96
155
|
}
|
|
97
156
|
|
|
157
|
+
// DIRECTED-DELIVERY BROADCAST SUPPRESSION (fix-pinned-wake-directed-delivery, T2). The
|
|
158
|
+
// notification SSE stream is per-AGENT, so EVERY online (host, cwd) connection of the
|
|
159
|
+
// agent receives the same `new_notification`. A pinned autonomous wake (mention /
|
|
160
|
+
// task_assigned / elaboration_verified resolved to a specific online instance) must wake
|
|
161
|
+
// ONLY that instance — the others must ignore their broadcast copy. The decision uses the
|
|
162
|
+
// transport-only fields the server stamped on THIS event (read in `dispatch`):
|
|
163
|
+
//
|
|
164
|
+
// 1. suppressWake === true → OFFLINE-PIN (Q2): a real pin matched NO online connection.
|
|
165
|
+
// Wake NO instance, agent-wide, even though this connection may be online and would
|
|
166
|
+
// otherwise broadcast→online-first. This is the ONE place that realizes the design's
|
|
167
|
+
// "no online target → every connection suppresses → notify-only" intent. Without this
|
|
168
|
+
// explicit flag an offline-pin is indistinguishable from an un-pinned wake (both carry
|
|
169
|
+
// targetConnectionUuid:null) and would be silently re-woken — the bug this guards.
|
|
170
|
+
//
|
|
171
|
+
// 2. targetConnectionUuid set AND !== my connection uuid → a DIRECTED wake for a
|
|
172
|
+
// DIFFERENT instance. Suppress: the resolved target wakes from its own copy (and via
|
|
173
|
+
// the precise deliver_turn ping); this connection must not also wake (the agent-wide
|
|
174
|
+
// fan-out is the headline bug). Pre-handshake (my uuid still null) counts as "not mine"
|
|
175
|
+
// → suppress, since this daemon cannot prove it is the target; delivery to the actual
|
|
176
|
+
// target is covered by the deliver_turn ping + reconnect pending-turn backfill.
|
|
177
|
+
//
|
|
178
|
+
// 3. targetConnectionUuid set AND === my connection uuid → I am the resolved target →
|
|
179
|
+
// wake (acting on this broadcast copy, which carries the full prompt context). The
|
|
180
|
+
// target's own deliver_turn→pending-turn delivery is deduped against this via the
|
|
181
|
+
// shared `seen` set (the pending re-dispatch keys turn:{uuid}; whichever runs first
|
|
182
|
+
// marks the other seen) so the target wakes exactly ONCE.
|
|
183
|
+
//
|
|
184
|
+
// 4. no target AND not suppressed → UN-PINNED (or a fully-offline `none` agent): wake
|
|
185
|
+
// exactly as before this change (broadcast → online-first). BYTE-IDENTICAL — the path
|
|
186
|
+
// below is untouched for this case.
|
|
187
|
+
if (transport.suppressWake === true) {
|
|
188
|
+
this.logger.info(
|
|
189
|
+
`[Chorus] wake ${notificationUuid} (${n.action}) is an OFFLINE-PIN (pin matched no online instance) — notify-only, suppressing wake on every connection`
|
|
190
|
+
);
|
|
191
|
+
return;
|
|
192
|
+
}
|
|
193
|
+
const target =
|
|
194
|
+
typeof transport.targetConnectionUuid === "string" ? transport.targetConnectionUuid : null;
|
|
195
|
+
if (target) {
|
|
196
|
+
const me = this.getConnectionUuid();
|
|
197
|
+
if (target !== me) {
|
|
198
|
+
this.logger.info(
|
|
199
|
+
`[Chorus] wake ${notificationUuid} (${n.action}) is directed to connection ${target}` +
|
|
200
|
+
` — not this daemon (${me ?? "<unregistered>"}); suppressing broadcast wake`
|
|
201
|
+
);
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
// target === me: I am the resolved target — fall through and wake (deduped below).
|
|
205
|
+
this.logger.info(
|
|
206
|
+
`[Chorus] wake ${notificationUuid} (${n.action}) is directed to THIS connection (${me}) — waking`
|
|
207
|
+
);
|
|
208
|
+
}
|
|
209
|
+
|
|
98
210
|
await this.#resolveAndEnqueue(n, notificationUuid);
|
|
99
211
|
}
|
|
100
212
|
|
|
@@ -136,11 +248,21 @@ export class EventRouter {
|
|
|
136
248
|
* pending turn already handled live (or by an earlier backfill) is not re-run.
|
|
137
249
|
* Synchronous + non-throwing, mirroring `dispatch`/`dispatchResume`.
|
|
138
250
|
*
|
|
139
|
-
*
|
|
140
|
-
*
|
|
141
|
-
*
|
|
142
|
-
* human_instruction
|
|
143
|
-
*
|
|
251
|
+
* DELIVERY SCOPE (fix-pinned-wake-directed-delivery, T2 — widened): a `deliver_turn` ping
|
|
252
|
+
* now also fires for a DIRECTED autonomous wake (`mentioned` / `task_assigned` /
|
|
253
|
+
* `elaboration_verified`), so this entrypoint re-dispatches those too — not only
|
|
254
|
+
* `human_instruction`. Unlike `human_instruction`, an autonomous turn has
|
|
255
|
+
* `promptText = null` (only human_instruction carries canonical free text), so its wake
|
|
256
|
+
* prompt CANNOT be rebuilt from the turn — it is rebuilt from the wake NOTIFICATION
|
|
257
|
+
* (re-read via `chorus_get_notifications`) for the turn's session. See the
|
|
258
|
+
* `#redispatchAutonomousTurn` helper.
|
|
259
|
+
*
|
|
260
|
+
* DEDUP (the two delivery routes for a DIRECTED target collapse to ONE wake): the
|
|
261
|
+
* target's BROADCAST copy (handled in `#fetchAndRoute`, keyed `notificationUuid` in the
|
|
262
|
+
* shared `seen` set when `target === me`) and THIS `deliver_turn`→pending delivery (keyed
|
|
263
|
+
* `turn:{uuid}`) both reach the target. They share the same `seen` set; the autonomous
|
|
264
|
+
* re-dispatch additionally marks the MATCHED notification's `notificationUuid` so whichever
|
|
265
|
+
* route runs first claims the other's key, and the second is dropped — exactly once.
|
|
144
266
|
*
|
|
145
267
|
* @param {{ turnUuid?: string, sessionId?: string, directIdeaUuid?: string|null,
|
|
146
268
|
* trigger?: string, promptText?: string|null }} pending
|
|
@@ -156,7 +278,36 @@ export class EventRouter {
|
|
|
156
278
|
this.logger.warn(`[Chorus] pending-turn ${turnUuid} missing sessionId, skipping`);
|
|
157
279
|
return;
|
|
158
280
|
}
|
|
159
|
-
//
|
|
281
|
+
// A DIRECTED autonomous turn (mentioned / task_assigned / elaboration_verified) is
|
|
282
|
+
// delivered by the deliver_turn ping too (T2). Its prompt must be rebuilt from the
|
|
283
|
+
// notification (promptText is null), so it takes a separate async path. resume /
|
|
284
|
+
// elaboration are not delivered by deliver_turn (resume is synthetic; elaboration
|
|
285
|
+
// request/answer rides the notification broadcast), so they are not re-dispatched here.
|
|
286
|
+
if (
|
|
287
|
+
pending.trigger === "mentioned" ||
|
|
288
|
+
pending.trigger === "task_assigned" ||
|
|
289
|
+
pending.trigger === "elaboration_verified"
|
|
290
|
+
) {
|
|
291
|
+
// Shared dedup, marked BEFORE async work (mirrors the human_instruction path and
|
|
292
|
+
// `dispatch`) so concurrent deliveries collapse to one wake.
|
|
293
|
+
const seenKey = `turn:${turnUuid}`;
|
|
294
|
+
if (this.seen.has(seenKey)) return;
|
|
295
|
+
this.seen.add(seenKey);
|
|
296
|
+
const directIdeaUuid =
|
|
297
|
+
typeof pending.directIdeaUuid === "string" ? pending.directIdeaUuid : null;
|
|
298
|
+
this.#redispatchAutonomousTurn({
|
|
299
|
+
turnUuid,
|
|
300
|
+
sessionId,
|
|
301
|
+
directIdeaUuid,
|
|
302
|
+
trigger: pending.trigger,
|
|
303
|
+
}).catch((err) => {
|
|
304
|
+
this.logger.error(
|
|
305
|
+
`[Chorus] failed to re-dispatch autonomous pending turn ${turnUuid}: ${err}`
|
|
306
|
+
);
|
|
307
|
+
});
|
|
308
|
+
return;
|
|
309
|
+
}
|
|
310
|
+
// Only human_instruction is re-derived from the turn table directly (see doc above).
|
|
160
311
|
if (pending.trigger !== "human_instruction") {
|
|
161
312
|
return;
|
|
162
313
|
}
|
|
@@ -211,6 +362,116 @@ export class EventRouter {
|
|
|
211
362
|
this.queue.enqueue(key, () => this.waker.wake(n, key, attribution));
|
|
212
363
|
}
|
|
213
364
|
|
|
365
|
+
/**
|
|
366
|
+
* Re-dispatch a DIRECTED autonomous pending turn (mentioned / task_assigned /
|
|
367
|
+
* elaboration_verified) delivered by the `deliver_turn` ping (T2 — fix-pinned-wake-
|
|
368
|
+
* directed-delivery). Unlike `human_instruction`, the turn carries `promptText = null`,
|
|
369
|
+
* so the wake prompt must be rebuilt from the wake NOTIFICATION — `buildPrompt` (run
|
|
370
|
+
* inside `waker.wake`) needs `entityType` / `entityUuid` / `entityTitle` / `actorName` /
|
|
371
|
+
* `message`, none of which live on the turn. We re-read the unread notifications (the
|
|
372
|
+
* same `chorus_get_notifications` the router already uses) and pick the wake notification
|
|
373
|
+
* for THIS turn's session + trigger.
|
|
374
|
+
*
|
|
375
|
+
* PROMPT-CONTEXT CONSTRAINT (Tech Design): in the normal live case the target is online,
|
|
376
|
+
* so it ALSO received the broadcast — which `#fetchAndRoute` already woke (and marked the
|
|
377
|
+
* notification `seen`). This path then finds that notification already `seen` and dedups
|
|
378
|
+
* away → exactly one wake. In the rare missed-broadcast case (the ping arrived but the
|
|
379
|
+
* broadcast copy did not), this path is the one that wakes, with the prompt rebuilt from
|
|
380
|
+
* the re-read notification. If no matching unread notification exists at all (e.g. it was
|
|
381
|
+
* already read), there is no autonomous context to rebuild — log and skip (the durable
|
|
382
|
+
* net is the reconnect notification backfill, which re-derives autonomous wakes).
|
|
383
|
+
*
|
|
384
|
+
* DEDUP across the two routes: this matched notification's `uuid` is the SAME key the
|
|
385
|
+
* broadcast path marks in the shared `seen` set, so whichever route runs first claims it
|
|
386
|
+
* and the other is dropped. The `turn:{uuid}` key was already marked by the caller.
|
|
387
|
+
*
|
|
388
|
+
* @param {{ turnUuid: string, sessionId: string, directIdeaUuid: string|null, trigger: string }} pending
|
|
389
|
+
*/
|
|
390
|
+
async #redispatchAutonomousTurn(pending) {
|
|
391
|
+
const { turnUuid, sessionId, directIdeaUuid, trigger } = pending;
|
|
392
|
+
let result;
|
|
393
|
+
try {
|
|
394
|
+
result = await this.mcp.callTool("chorus_get_notifications", {
|
|
395
|
+
status: "unread",
|
|
396
|
+
limit: 50,
|
|
397
|
+
autoMarkRead: false,
|
|
398
|
+
});
|
|
399
|
+
} catch (err) {
|
|
400
|
+
this.logger.warn(
|
|
401
|
+
`[Chorus] autonomous pending turn ${turnUuid}: notification re-read failed: ${err}`
|
|
402
|
+
);
|
|
403
|
+
return;
|
|
404
|
+
}
|
|
405
|
+
const notifications = result?.notifications;
|
|
406
|
+
if (!Array.isArray(notifications)) {
|
|
407
|
+
this.logger.warn(
|
|
408
|
+
`[Chorus] autonomous pending turn ${turnUuid}: no notifications array to rebuild prompt from`
|
|
409
|
+
);
|
|
410
|
+
return;
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Candidate wake notifications: unread, wake-action, mapping to THIS turn's trigger.
|
|
414
|
+
// ACTION_TO_TURN_TRIGGER mirrors the server's action→trigger collapse, so e.g. a
|
|
415
|
+
// task_assigned turn matches task_reopened/task_verified/idea_claimed/proposal_* origins.
|
|
416
|
+
const candidates = notifications.filter(
|
|
417
|
+
(x) => x && typeof x.uuid === "string" && ACTION_TO_TURN_TRIGGER[x.action] === trigger
|
|
418
|
+
);
|
|
419
|
+
|
|
420
|
+
// Match the wake notification for THIS turn by its session ANCHOR. The anchor is the
|
|
421
|
+
// turn's direct idea (idea-anchored session) or, lacking one, its session id; a CROSS-CWD
|
|
422
|
+
// mention keys the per-instance session `${directIdeaUuid}::${connectionUuid}` with
|
|
423
|
+
// directIdeaUuid=null, so the idea prefix before "::" is also a valid anchor. We never run
|
|
424
|
+
// lineage on the daemon — these are the anchors the server itself keyed the session on.
|
|
425
|
+
const ideaPrefix =
|
|
426
|
+
directIdeaUuid == null && sessionId.includes("::") ? sessionId.split("::")[0] : null;
|
|
427
|
+
const anchors = new Set(
|
|
428
|
+
[directIdeaUuid, sessionId, ideaPrefix].filter((a) => typeof a === "string" && a)
|
|
429
|
+
);
|
|
430
|
+
let match = candidates.find((x) => anchors.has(x.entityUuid));
|
|
431
|
+
|
|
432
|
+
// MISSED-BROADCAST RECOVERY (the rare path this re-dispatch exists for): when the wake's
|
|
433
|
+
// notification entity is NOT the session anchor (a lineage-anchored task_assigned, a
|
|
434
|
+
// comment-on-task mention, or a cross-cwd mention whose entity is a child of the idea),
|
|
435
|
+
// the anchor equality above can't match without a lineage round-trip. If there is exactly
|
|
436
|
+
// ONE unread candidate for this trigger, it is unambiguously this turn's wake — recover it.
|
|
437
|
+
// With 2+ candidates we cannot disambiguate safely, so we defer to the reconnect
|
|
438
|
+
// notification backfill rather than risk waking the wrong one.
|
|
439
|
+
if (!match && candidates.length === 1) {
|
|
440
|
+
match = candidates[0];
|
|
441
|
+
this.logger.info(
|
|
442
|
+
`[Chorus] autonomous pending turn ${turnUuid} (${trigger}): no anchor match, recovering the ` +
|
|
443
|
+
`single unread ${trigger} notification ${match.uuid} (missed-broadcast recovery)`
|
|
444
|
+
);
|
|
445
|
+
}
|
|
446
|
+
if (!match || typeof match.uuid !== "string") {
|
|
447
|
+
this.logger.info(
|
|
448
|
+
`[Chorus] autonomous pending turn ${turnUuid} (${trigger}): no unambiguous unread wake ` +
|
|
449
|
+
`notification for session ${sessionId} (${candidates.length} candidate(s)) — skipping ` +
|
|
450
|
+
`(covered by reconnect notification backfill)`
|
|
451
|
+
);
|
|
452
|
+
return;
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
// Cross-route dedup: claim the broadcast's key. If the broadcast already woke it (target
|
|
456
|
+
// === me path), it is already seen → drop this delivery (exactly one wake). Otherwise we
|
|
457
|
+
// claim it so a later broadcast copy is dropped by `dispatch`'s seen check.
|
|
458
|
+
if (this.seen.has(match.uuid)) {
|
|
459
|
+
this.logger.info(
|
|
460
|
+
`[Chorus] autonomous pending turn ${turnUuid}: broadcast copy ${match.uuid} already handled — deduped`
|
|
461
|
+
);
|
|
462
|
+
return;
|
|
463
|
+
}
|
|
464
|
+
this.seen.add(match.uuid);
|
|
465
|
+
|
|
466
|
+
// Rebuild + enqueue through the SAME resolve→markQueued→enqueue path as a live broadcast
|
|
467
|
+
// wake, so the prompt (buildPrompt inside waker.wake), session anchor, and serialization
|
|
468
|
+
// are byte-identical to the broadcast route. `match` is a full NotificationDetail.
|
|
469
|
+
this.logger.info(
|
|
470
|
+
`[Chorus] autonomous pending turn ${turnUuid} (${trigger}): waking from re-read notification ${match.uuid}`
|
|
471
|
+
);
|
|
472
|
+
await this.#resolveAndEnqueue(match, match.uuid);
|
|
473
|
+
}
|
|
474
|
+
|
|
214
475
|
/**
|
|
215
476
|
* Resolve a wake's serialization key + idea attribution, mark it queued, and
|
|
216
477
|
* enqueue it on the per-direct-idea queue. Shared by the notification path
|
package/cli/login.mjs
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
// ~/.chorus/daemon.json (0600). On validation failure, nothing is written.
|
|
4
4
|
// Plain ESM; the only dependency is the in-repo MCP SDK (via chorus-client).
|
|
5
5
|
|
|
6
|
-
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
6
|
+
import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
7
7
|
import { dirname } from "node:path";
|
|
8
8
|
import { createInterface } from "node:readline";
|
|
9
9
|
|
|
@@ -49,56 +49,99 @@ export function prompt(query, opts = {}) {
|
|
|
49
49
|
}
|
|
50
50
|
|
|
51
51
|
/**
|
|
52
|
-
*
|
|
52
|
+
* Field-level merge update of the login file (`~/.chorus/daemon.json`) — the
|
|
53
|
+
* single read → merge → write(0600) helper every config writer routes through.
|
|
54
|
+
*
|
|
55
|
+
* Reads any existing file, shallow-merges `partial` over it (partial keys win,
|
|
56
|
+
* every other pre-existing field is preserved), and writes the result back with
|
|
57
|
+
* owner-only permissions. A shallow merge is correct because every field is a
|
|
58
|
+
* scalar or a flat array (`cwds`) — there are no nested objects to deep-merge.
|
|
53
59
|
*
|
|
54
|
-
*
|
|
55
|
-
* `
|
|
56
|
-
*
|
|
57
|
-
* (
|
|
58
|
-
*
|
|
60
|
+
* The write is atomic: the JSON is written to a sibling `<path>.tmp` at 0600 and
|
|
61
|
+
* then `rename()`d over the target, so a crash mid-write never truncates the
|
|
62
|
+
* live file. A missing / unreadable / malformed existing file is treated as an
|
|
63
|
+
* empty object (defensive parse), so a re-login still produces a valid file
|
|
64
|
+
* rather than aborting on a corrupt one.
|
|
59
65
|
*
|
|
60
|
-
*
|
|
61
|
-
*
|
|
66
|
+
* Because writes now merge, NO field is ever silently dropped — in particular a
|
|
67
|
+
* `chorus login` preserves any pre-existing `cwds` / `yoloAckAt` /
|
|
68
|
+
* `sigintTimeoutMs` (daemon-config-field-merge change; supersedes the prior
|
|
69
|
+
* "credential change clears the yolo acknowledgement" behavior).
|
|
70
|
+
*
|
|
71
|
+
* @param {Record<string, unknown>} partial The fields to set/overwrite.
|
|
72
|
+
* @param {{
|
|
73
|
+
* path?: string,
|
|
74
|
+
* read?: (p: string) => string,
|
|
75
|
+
* write?: (p: string, c: string, o: object) => void,
|
|
76
|
+
* mkdir?: (p: string, o: object) => void,
|
|
77
|
+
* rename?: (from: string, to: string) => void,
|
|
78
|
+
* }} [deps]
|
|
79
|
+
* @returns {string} the file path written
|
|
62
80
|
*/
|
|
63
|
-
export function
|
|
81
|
+
export function updateDaemonConfig(partial, deps = {}) {
|
|
64
82
|
const path = deps.path ?? loginFilePath();
|
|
83
|
+
const read = deps.read ?? ((p) => readFileSync(p, "utf8"));
|
|
65
84
|
const write = deps.write ?? writeFileSync;
|
|
66
85
|
const mkdir = deps.mkdir ?? mkdirSync;
|
|
86
|
+
const rename = deps.rename ?? renameSync;
|
|
87
|
+
|
|
88
|
+
// Defensive read: missing / unreadable / malformed → start from empty so a
|
|
89
|
+
// re-login over a corrupt file still writes a valid one (no silent abort).
|
|
90
|
+
let current = {};
|
|
91
|
+
try {
|
|
92
|
+
const parsed = JSON.parse(read(path));
|
|
93
|
+
// Only a plain object is a valid config; arrays / scalars → start fresh.
|
|
94
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) current = parsed;
|
|
95
|
+
} catch {
|
|
96
|
+
// treat as empty
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const merged = { ...current, ...partial };
|
|
67
100
|
mkdir(dirname(path), { recursive: true });
|
|
68
|
-
write
|
|
101
|
+
// Atomic write: temp file (0600) in the same dir, then rename over target.
|
|
102
|
+
const tmp = `${path}.tmp`;
|
|
103
|
+
write(tmp, JSON.stringify(merged, null, 2) + "\n", { mode: 0o600 });
|
|
104
|
+
rename(tmp, path);
|
|
69
105
|
return path;
|
|
70
106
|
}
|
|
71
107
|
|
|
72
108
|
/**
|
|
73
|
-
*
|
|
74
|
-
*
|
|
75
|
-
*
|
|
76
|
-
*
|
|
109
|
+
* Persist credentials + identity to the login file with owner-only perms.
|
|
110
|
+
*
|
|
111
|
+
* Thin wrapper over {@link updateDaemonConfig}: it field-merges the given
|
|
112
|
+
* credential/identity fields over any existing file, so every OTHER pre-existing
|
|
113
|
+
* field (`cwds`, `yoloAckAt`, `sigintTimeoutMs`, …) is preserved across a
|
|
114
|
+
* `chorus login` or a daemon-start credential completion. It no longer omits
|
|
115
|
+
* `yoloAckAt` — a credential write never discards the recorded yolo ack.
|
|
116
|
+
*
|
|
117
|
+
* The `deps` seams (`path`, `write`, `mkdir`) are kept for callers/tests that
|
|
118
|
+
* inject IO; `write` is the low-level `(path, content, opts)` writer.
|
|
119
|
+
*
|
|
120
|
+
* @param {{ url: string, apiKey: string, agentUuid: string, agentName: string }} data
|
|
121
|
+
* @param {{ path?: string, write?: (p: string, c: string, o: object) => void, mkdir?: (p: string, o: object) => void, read?: (p: string) => string, rename?: (from: string, to: string) => void }} [deps]
|
|
122
|
+
*/
|
|
123
|
+
export function writeLoginFile(data, deps = {}) {
|
|
124
|
+
return updateDaemonConfig(data, deps);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Record (or refresh) the yolo acknowledgement in the login file, preserving
|
|
129
|
+
* everything already on disk. Delegates to {@link updateDaemonConfig}, which
|
|
130
|
+
* reads the current file, merges `yoloAckAt`, and rewrites with 0600. Used by
|
|
131
|
+
* the daemon after an interactive TTY yolo confirmation — it does NOT touch
|
|
132
|
+
* url/apiKey/identity.
|
|
77
133
|
*
|
|
78
|
-
*
|
|
79
|
-
* the
|
|
134
|
+
* A TTY user whose credentials come from env / flags has no login file yet, but
|
|
135
|
+
* the ack must still persist (else they'd re-confirm yolo on every start). A
|
|
136
|
+
* file carrying only `yoloAckAt` is harmless — resolveCredentials simply falls
|
|
137
|
+
* through it.
|
|
80
138
|
*
|
|
81
139
|
* @param {string} yoloAckAt ISO-8601 timestamp of the confirmation.
|
|
82
|
-
* @param {{ path?: string, read?: (p: string) => string, write?:
|
|
140
|
+
* @param {{ path?: string, read?: (p: string) => string, write?: (p: string, c: string, o: object) => void, mkdir?: (p: string, o: object) => void, rename?: (from: string, to: string) => void }} [deps]
|
|
83
141
|
* @returns {string} the file path written
|
|
84
142
|
*/
|
|
85
143
|
export function recordYoloAck(yoloAckAt, deps = {}) {
|
|
86
|
-
|
|
87
|
-
const read = deps.read ?? ((p) => readFileSync(p, "utf8"));
|
|
88
|
-
const write = deps.write ?? writeLoginFile;
|
|
89
|
-
// Start from the existing file when present, else an empty object: a TTY user
|
|
90
|
-
// whose credentials come from env / flags has no login file yet, but the ack
|
|
91
|
-
// must still persist (else they'd re-confirm yolo on every start). A file
|
|
92
|
-
// carrying only `yoloAckAt` is harmless — resolveCredentials simply falls
|
|
93
|
-
// through it, and a later `chorus login` overwrites (clearing the ack).
|
|
94
|
-
let current = {};
|
|
95
|
-
try {
|
|
96
|
-
const parsed = JSON.parse(read(path));
|
|
97
|
-
if (parsed && typeof parsed === "object") current = parsed;
|
|
98
|
-
} catch {
|
|
99
|
-
// missing / unreadable / malformed → treat as empty (start fresh)
|
|
100
|
-
}
|
|
101
|
-
return write({ ...current, yoloAckAt }, { path });
|
|
144
|
+
return updateDaemonConfig({ yoloAckAt }, deps);
|
|
102
145
|
}
|
|
103
146
|
|
|
104
147
|
/**
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
// cli/server-signal-handlers.mjs
|
|
2
|
+
// The Chorus CLI entry (`chorus.mjs`) is dual-purpose: with no subcommand it
|
|
3
|
+
// launches the embedded Next.js server (with a PGlite child); with `daemon` /
|
|
4
|
+
// `login` it dispatches a client subcommand that connects OUT to a remote
|
|
5
|
+
// server. The server-launch path installs three process-signal handlers — a
|
|
6
|
+
// SIGINT/SIGTERM graceful-shutdown handler and an `exit` handler that
|
|
7
|
+
// force-kills the PGlite child — but those are MEANINGLESS (and actively
|
|
8
|
+
// harmful) on a client-subcommand process: a `chorus daemon` never starts
|
|
9
|
+
// PGlite, and the server's SIGINT/SIGTERM handler would otherwise pre-empt the
|
|
10
|
+
// daemon's OWN graceful shutdown (it runs first, in registration order, and
|
|
11
|
+
// calls `process.exit(0)` synchronously). See the idea / design docs.
|
|
12
|
+
//
|
|
13
|
+
// This module is intentionally PURE — it runs no side effects at import — so a
|
|
14
|
+
// unit test can import the function in isolation and drive it with a fake
|
|
15
|
+
// `process`-like object, without executing `chorus.mjs`'s import-time side
|
|
16
|
+
// effects (subcommand dispatch, server-config parsing) and without delivering a
|
|
17
|
+
// real fatal signal to the test runner.
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Install the server-only process-signal handlers, but ONLY for the server
|
|
21
|
+
* launch path (no client subcommand). When invoked as a client subcommand
|
|
22
|
+
* (`chorus daemon` / `chorus login`), this registers NOTHING and returns false,
|
|
23
|
+
* so the process terminates exclusively through the subcommand's own handler
|
|
24
|
+
* (e.g. the daemon's graceful `daemon.stop()`).
|
|
25
|
+
*
|
|
26
|
+
* @param {object} params
|
|
27
|
+
* @param {boolean} params.isSubcommand true when a client subcommand is running.
|
|
28
|
+
* @param {{ on(event: string, listener: (...args: any[]) => void): unknown }} params.processRef
|
|
29
|
+
* the process to attach listeners to (real `process`, or a fake in tests).
|
|
30
|
+
* @param {(...args: any[]) => void} params.shutdown SIGINT/SIGTERM handler.
|
|
31
|
+
* @param {(...args: any[]) => void} params.cleanupExit `exit` handler (PGlite SIGKILL).
|
|
32
|
+
* @returns {boolean} true if the server handlers were installed, false if skipped.
|
|
33
|
+
*/
|
|
34
|
+
export function installServerSignalHandlers({ isSubcommand, processRef, shutdown, cleanupExit }) {
|
|
35
|
+
// Client subcommand → install none of the server's signal handlers.
|
|
36
|
+
if (isSubcommand) return false;
|
|
37
|
+
processRef.on("SIGINT", shutdown);
|
|
38
|
+
processRef.on("SIGTERM", shutdown);
|
|
39
|
+
processRef.on("exit", cleanupExit);
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
// cli/spawner-select.mjs
|
|
2
|
+
// Backend selection seam: maps the resolved agent type (daemon-agent.mjs) to a
|
|
3
|
+
// concrete Spawner instance. This is the ONLY place the daemon branches on the
|
|
4
|
+
// backend — the wake pipeline above it (queue, waker, directed delivery, headless
|
|
5
|
+
// guard, reporters) stays backend-agnostic and drives whichever spawner is
|
|
6
|
+
// injected purely through the shared wake(...) contract.
|
|
7
|
+
//
|
|
8
|
+
// The function is TOTAL: resolveAgentType has already rejected unknown values
|
|
9
|
+
// before this runs, so an unrecognized type here is not a user error path — we
|
|
10
|
+
// fall back to the safe default (claude-code) rather than throw.
|
|
11
|
+
|
|
12
|
+
import { ClaudeSpawner } from "./claude-spawner.mjs";
|
|
13
|
+
import { CodexSpawner } from "./codex-spawner.mjs";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Construct the spawner backend for `agentType`.
|
|
17
|
+
* @param {string} agentType "claude-code" | "codex" (already validated upstream).
|
|
18
|
+
* @param {{ logger?: any, permissionMode?: "chorus"|"yolo", creds?: { url: string, apiKey: string } }} [opts]
|
|
19
|
+
* @returns {import("./codex-spawner.mjs").Spawner}
|
|
20
|
+
*/
|
|
21
|
+
export function selectSpawner(agentType, opts = {}) {
|
|
22
|
+
const { logger, permissionMode, creds } = opts;
|
|
23
|
+
if (agentType === "codex") {
|
|
24
|
+
return new CodexSpawner({ logger, permissionMode, creds });
|
|
25
|
+
}
|
|
26
|
+
// Default / "claude-code": construction byte-identical to the prior daemon
|
|
27
|
+
// (ClaudeSpawner takes only { logger, permissionMode } — creds are not used by
|
|
28
|
+
// the Claude backend, which gets its key via the --mcp-config file).
|
|
29
|
+
return new ClaudeSpawner({ logger, permissionMode });
|
|
30
|
+
}
|