@chorus-aidlc/chorus 0.11.1 → 0.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +431 -418
- package/.next/standalone/.next/app-path-routes-manifest.json +41 -39
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +33 -33
- package/.next/standalone/.next/routes-manifest.json +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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/route.js +1 -1
- 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 +3 -3
- 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_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 +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 +1 -1
- 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_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 +41 -39
- 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/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3219.js +1 -1
- package/.next/standalone/.next/server/chunks/3371.js +1 -1
- package/.next/standalone/.next/server/chunks/3419.js +1 -1
- package/.next/standalone/.next/server/chunks/345.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/5581.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/7064.js +1 -0
- package/.next/standalone/.next/server/chunks/{5631.js → 7160.js} +1 -1
- 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/7897.js +1 -1
- package/.next/standalone/.next/server/chunks/{4711.js → 796.js} +6 -6
- 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/937.js +3 -3
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/pages-manifest.json +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/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/32497-886aa4d3d7bf4967.js +1 -0
- package/.next/standalone/.next/static/chunks/37784-95dee37276b1067b.js +1 -0
- package/.next/standalone/.next/static/chunks/40867-04cc0d00205eaf9b.js +1 -0
- package/.next/standalone/.next/static/chunks/42111-1935df3b0dab2095.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.f4242c493fcf182d.js +1 -0
- package/.next/standalone/.next/static/chunks/54637-71d281d649ea3a17.js +1 -0
- package/.next/standalone/.next/static/chunks/6239-d78e6f830ce0a7f8.js +1 -0
- package/.next/standalone/.next/static/chunks/64187-cff8a4b5e96fa8f9.js +10 -0
- package/.next/standalone/.next/static/chunks/78917-2b959ab0a7f610b4.js +1 -0
- package/.next/standalone/.next/static/chunks/80904-973284d1fe916c38.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/97868-9406a4014b667c2d.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.880b43de1fa6411f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-f04d5fa070f15acd.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-c4271886ef004611.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-7a8b60de97bfbd29.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-6620b9d7a2cc766f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-0a55289b2bc510c2.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-5d09141beb5d6aee.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-d5c3dde34d6291a8.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-0da08d8b425acb6a.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-44014947a679f91c.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-c64b8d40a0781b4c.js → page-e7493d55573a52f1.js} +1 -1
- 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-9a41067d4c5d29d7.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-039590181c63871d.js → webpack-1556cfd11f7e90d1.js} +1 -1
- package/.next/standalone/.next/static/css/6e8fd46b062fd4fc.css +1 -0
- package/.next/standalone/.next/static/v1yRpXkt1wNBkZMTE3tiz/_buildManifest.js +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 +47 -13
- package/README.zh.md +47 -13
- package/chorus.mjs +30 -14
- package/cli/client-args.mjs +17 -1
- package/cli/daemon-banner.mjs +11 -1
- package/cli/daemon-config.mjs +118 -0
- package/cli/daemon.mjs +216 -154
- package/cli/event-router.mjs +273 -12
- package/cli/server-signal-handlers.mjs +41 -0
- package/cli/sse-listener.mjs +27 -5
- 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/369.js +0 -1
- package/.next/standalone/.next/server/chunks/5039.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/8012.js +0 -1
- 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/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/onboarding/page-e9a69a0c537c704f.js +0 -1
- package/.next/standalone/.next/static/css/1d9aaac01758b297.css +0 -1
- /package/.next/standalone/.next/static/{GQvpOux3M9CaxkMjL9GAI → v1yRpXkt1wNBkZMTE3tiz}/_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
|
|
@@ -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
|
+
}
|
package/cli/sse-listener.mjs
CHANGED
|
@@ -8,11 +8,19 @@
|
|
|
8
8
|
// API key; data lines are `data: <json>\n\n`, heartbeats are `: ...` comments.
|
|
9
9
|
//
|
|
10
10
|
// Self-report: the listener appends ?clientType=claude_code&clientVersion=…&
|
|
11
|
-
// host=…&startedAt=… to the endpoint so the server's DaemonConnection
|
|
12
|
-
// (src/services/daemon-connection.service.ts → parseSelfReport) can
|
|
13
|
-
// client is on the other end. The CLI reports clientType=claude_code
|
|
14
|
-
// drives a local Claude Code subprocess — not a generic "daemon"). These
|
|
15
|
-
// are display-only metadata; auth remains the unchanged Bearer header.
|
|
11
|
+
// host=…&cwd=…&startedAt=… to the endpoint so the server's DaemonConnection
|
|
12
|
+
// registry (src/services/daemon-connection.service.ts → parseSelfReport) can
|
|
13
|
+
// record which client is on the other end. The CLI reports clientType=claude_code
|
|
14
|
+
// (it only drives a local Claude Code subprocess — not a generic "daemon"). These
|
|
15
|
+
// params are display-only metadata; auth remains the unchanged Bearer header.
|
|
16
|
+
//
|
|
17
|
+
// `cwd` is the working directory this daemon connection serves. Today the CLI
|
|
18
|
+
// runs single-cwd (the directory it was launched from), so it reports
|
|
19
|
+
// `process.cwd()`. The server keys the connection registry on
|
|
20
|
+
// (agentUuid, clientType, host, cwd) — so the same agent on the same host driving
|
|
21
|
+
// two different working directories registers as two independent connections
|
|
22
|
+
// instead of overwriting each other. An *older* daemon that does not send `cwd`
|
|
23
|
+
// registers as a `cwd=null` row (HARD-1: no error, behaves exactly as before).
|
|
16
24
|
|
|
17
25
|
import { readFileSync } from "node:fs";
|
|
18
26
|
import { hostname } from "node:os";
|
|
@@ -63,6 +71,12 @@ const PROCESS_STARTED_AT = new Date();
|
|
|
63
71
|
* connection + entity and interrupts the running subprocess (see control-handler.mjs).
|
|
64
72
|
* @property {() => Promise<void>} [onReconnect] Called after a reconnect so the
|
|
65
73
|
* caller can back-fill notifications missed during the gap.
|
|
74
|
+
* @property {string} [cwd] The working directory THIS connection serves (T3 — 单
|
|
75
|
+
* daemon 多路径). A multi-path daemon runs one SseListener per declared path, each
|
|
76
|
+
* self-reporting its own cwd so the server registers them as distinct connections
|
|
77
|
+
* (the registry key includes cwd). Omitted ⇒ the daemon's process cwd (single-path
|
|
78
|
+
* / HARD-1 default — identical to today). It is JUST the served path; it carries no
|
|
79
|
+
* project binding (DEC-5: cwd ⟂ project).
|
|
66
80
|
* @property {{info(m:string):void,warn(m:string):void,error(m:string):void}} [logger]
|
|
67
81
|
* @property {typeof fetch} [fetchImpl] Injectable for tests.
|
|
68
82
|
* @property {number} [initialDelayMs]
|
|
@@ -87,10 +101,18 @@ export class SseListener {
|
|
|
87
101
|
|
|
88
102
|
// Build the self-reporting endpoint URL once and reuse it across every
|
|
89
103
|
// (re)connect, so the reconnect path always re-sends the same params.
|
|
104
|
+
// Working directory THIS connection serves. A multi-path daemon (T3) constructs
|
|
105
|
+
// one SseListener per declared path, each with its own `opts.cwd`, so the server's
|
|
106
|
+
// (agentUuid, clientType, host, cwd) registry key lands them as distinct rows —
|
|
107
|
+
// same agent + same host + different cwd no longer overwrite each other. When no
|
|
108
|
+
// cwd is supplied the daemon is single-path: report the process cwd (the directory
|
|
109
|
+
// it was launched from), identical to today / an old daemon (HARD-1).
|
|
110
|
+
this.cwd = opts.cwd ?? process.cwd();
|
|
90
111
|
const params = new URLSearchParams({
|
|
91
112
|
clientType: "claude_code",
|
|
92
113
|
clientVersion: CLI_VERSION,
|
|
93
114
|
host: hostname(),
|
|
115
|
+
cwd: this.cwd,
|
|
94
116
|
startedAt: PROCESS_STARTED_AT.toISOString(),
|
|
95
117
|
});
|
|
96
118
|
this.endpoint = `${this.url}/api/events/notifications?${params.toString()}`;
|
package/cli/waker.mjs
CHANGED
|
@@ -28,7 +28,7 @@ export class Waker {
|
|
|
28
28
|
* creds: { url: string, apiKey: string },
|
|
29
29
|
* lineage: { resolve: (event: any) => Promise<{ rootIdeaUuid: string|null, directIdeaUuid: string|null }> },
|
|
30
30
|
* spawner: { wake: (params: any) => Promise<{ sessionId: string, exitCode: number|null, isNew: boolean }> },
|
|
31
|
-
* cwd?: string,
|
|
31
|
+
* cwd?: string, The connection/session-bound working directory this Waker serves; resolveCwd() is the single source the probe + spawn + resume use. `undefined` ⇒ the process default cwd (HARD-1 / single-path).
|
|
32
32
|
* hooks?: import("./upload-hooks.mjs").UploadHooks,
|
|
33
33
|
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
34
34
|
* writeMcpConfigFn?: typeof writeMcpConfig,
|
|
@@ -54,10 +54,14 @@ export class Waker {
|
|
|
54
54
|
// line per lifecycle event (arrival / spawn new-vs-resume / completion).
|
|
55
55
|
// When true, additional detail is emitted alongside those lines.
|
|
56
56
|
this.verbose = opts.verbose ?? false;
|
|
57
|
-
// The
|
|
58
|
-
//
|
|
59
|
-
//
|
|
60
|
-
|
|
57
|
+
// The connection/session-bound working directory this Waker serves (T3 — 单
|
|
58
|
+
// daemon 多路径引擎). A daemon process may run SEVERAL Wakers, one per declared
|
|
59
|
+
// path, each pinned to its own cwd; the daemon process's OWN cwd never changes
|
|
60
|
+
// (NFR-3). `opts.cwd` is that bound path; `undefined` (unspecified / old daemon /
|
|
61
|
+
// single-path default) degrades to the process cwd via resolveCwd(). Stored raw
|
|
62
|
+
// so resolveCwd() is the SINGLE place the process-default fallback is applied
|
|
63
|
+
// (Module Contract 1 — one cwd source of truth, no scattered process.cwd()).
|
|
64
|
+
this.cwd = opts.cwd;
|
|
61
65
|
this.hooks = opts.hooks;
|
|
62
66
|
this.logger = opts.logger ?? NOOP_LOGGER;
|
|
63
67
|
this.writeMcpConfigFn = opts.writeMcpConfigFn ?? writeMcpConfig;
|
|
@@ -105,6 +109,25 @@ export class Waker {
|
|
|
105
109
|
this.executions = new Map();
|
|
106
110
|
}
|
|
107
111
|
|
|
112
|
+
/**
|
|
113
|
+
* The SINGLE source of truth for this Waker's working directory (Module Contract
|
|
114
|
+
* 1 — 不变式安全 / cwd 事实源统一). transcript probing (new-vs-resume), spawn, and
|
|
115
|
+
* resume ALL resolve cwd through here, so they can never diverge — a divergence
|
|
116
|
+
* would make the on-disk transcript probe decide new-vs-resume against a different
|
|
117
|
+
* directory than the one we spawn in (`claude --resume` is cwd-bound).
|
|
118
|
+
*
|
|
119
|
+
* Returns the connection/session-bound cwd when one was declared, else the daemon
|
|
120
|
+
* process's own cwd. The process-default fallback lives ONLY here: `this.cwd` is
|
|
121
|
+
* stored raw (possibly `undefined`) and `process.cwd()` is read at exactly this one
|
|
122
|
+
* site — Module Contract 2's HARD-1 degrade path (an old daemon / unspecified cwd
|
|
123
|
+
* behaves exactly as today, spawning at the process default). No other code in the
|
|
124
|
+
* wake path reads `process.cwd()`.
|
|
125
|
+
* @returns {string}
|
|
126
|
+
*/
|
|
127
|
+
resolveCwd() {
|
|
128
|
+
return this.cwd ?? process.cwd();
|
|
129
|
+
}
|
|
130
|
+
|
|
108
131
|
/**
|
|
109
132
|
* Mark a running entity as INTERRUPTING (子3) — called by the control handler the
|
|
110
133
|
* moment an authorized interrupt is verified, BEFORE the killer signals the child.
|
|
@@ -295,7 +318,12 @@ export class Waker {
|
|
|
295
318
|
// spawn in. The spawner re-validates the id is a lowercase UUID before
|
|
296
319
|
// spawning, so a garbage id surfaces visibly rather than misanchoring.
|
|
297
320
|
const sessionId = directIdeaUuid ?? notification.entityUuid ?? null;
|
|
298
|
-
|
|
321
|
+
// Resolve the connection/session-bound cwd ONCE for this wake (Module Contract
|
|
322
|
+
// 1). The transcript probe and the spawn below BOTH use this same value, so a
|
|
323
|
+
// session's repeated wakes/probes always land the same cwd (NFR-3) — and a
|
|
324
|
+
// multi-path daemon's other Wakers (other cwds) never bleed in.
|
|
325
|
+
const cwd = this.resolveCwd();
|
|
326
|
+
const isNew = sessionId ? this.isNewSessionFn(sessionId, cwd) : true;
|
|
299
327
|
|
|
300
328
|
// Lifecycle line 2 — spawn: new vs resume, plus the (otherwise hidden)
|
|
301
329
|
// `claude --resume <id>` takeover hint so an operator can attach to the
|
|
@@ -305,7 +333,7 @@ export class Waker {
|
|
|
305
333
|
(sessionId ? ` — take over with: claude --resume ${sessionId}` : "")
|
|
306
334
|
);
|
|
307
335
|
if (this.verbose) {
|
|
308
|
-
this.logger.info(`[Chorus] cwd=${
|
|
336
|
+
this.logger.info(`[Chorus] cwd=${cwd} action=${notification.action} root=${rootIdeaUuid ?? "(none)"}`);
|
|
309
337
|
}
|
|
310
338
|
|
|
311
339
|
cfg = this.writeMcpConfigFn(this.creds);
|
|
@@ -331,7 +359,7 @@ export class Waker {
|
|
|
331
359
|
prompt,
|
|
332
360
|
sessionId,
|
|
333
361
|
isNew,
|
|
334
|
-
cwd
|
|
362
|
+
cwd,
|
|
335
363
|
mcpConfigPath: cfg.path,
|
|
336
364
|
// Capture the live child into the running execution entry the instant it
|
|
337
365
|
// spawns (子3) so the control handler can interrupt it mid-wake. Guarded so
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chorus-aidlc/chorus",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0",
|
|
4
4
|
"description": "The Agent Harness for AI-Human Collaboration — session lifecycle, task state, sub-agent orchestration, observability, and failure recovery",
|
|
5
5
|
"homepage": "https://github.com/Chorus-AIDLC/Chorus",
|
|
6
6
|
"repository": {
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
-- DropIndex
|
|
2
|
+
DROP INDEX "DaemonConnection_agentUuid_clientType_host_key";
|
|
3
|
+
|
|
4
|
+
-- AlterTable
|
|
5
|
+
ALTER TABLE "DaemonConnection" ADD COLUMN "cwd" TEXT;
|
|
6
|
+
|
|
7
|
+
-- CreateIndex
|
|
8
|
+
CREATE UNIQUE INDEX "DaemonConnection_agentUuid_clientType_host_cwd_key" ON "DaemonConnection"("agentUuid", "clientType", "host", "cwd");
|
|
9
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
-- AlterTable
|
|
2
|
+
ALTER TABLE "DaemonConnection" ADD COLUMN "agentInstanceUuid" TEXT;
|
|
3
|
+
|
|
4
|
+
-- CreateTable
|
|
5
|
+
CREATE TABLE "AgentInstance" (
|
|
6
|
+
"id" SERIAL NOT NULL,
|
|
7
|
+
"uuid" TEXT NOT NULL,
|
|
8
|
+
"companyUuid" TEXT NOT NULL,
|
|
9
|
+
"agentUuid" TEXT NOT NULL,
|
|
10
|
+
"host" TEXT NOT NULL DEFAULT '',
|
|
11
|
+
"cwd" TEXT,
|
|
12
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
13
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
14
|
+
|
|
15
|
+
CONSTRAINT "AgentInstance_pkey" PRIMARY KEY ("id")
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
-- CreateIndex
|
|
19
|
+
CREATE UNIQUE INDEX "AgentInstance_uuid_key" ON "AgentInstance"("uuid");
|
|
20
|
+
|
|
21
|
+
-- CreateIndex
|
|
22
|
+
CREATE INDEX "AgentInstance_companyUuid_idx" ON "AgentInstance"("companyUuid");
|
|
23
|
+
|
|
24
|
+
-- CreateIndex
|
|
25
|
+
CREATE INDEX "AgentInstance_agentUuid_idx" ON "AgentInstance"("agentUuid");
|
|
26
|
+
|
|
27
|
+
-- CreateIndex
|
|
28
|
+
CREATE UNIQUE INDEX "AgentInstance_companyUuid_agentUuid_host_cwd_key" ON "AgentInstance"("companyUuid", "agentUuid", "host", "cwd");
|
|
29
|
+
|
|
30
|
+
-- CreateIndex
|
|
31
|
+
CREATE INDEX "DaemonConnection_agentInstanceUuid_idx" ON "DaemonConnection"("agentInstanceUuid");
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Warnings:
|
|
3
|
+
|
|
4
|
+
- You are about to drop the column `targetCwd` on the `Task` table. All the data in the column will be lost.
|
|
5
|
+
- You are about to drop the column `targetHost` on the `Task` table. All the data in the column will be lost.
|
|
6
|
+
|
|
7
|
+
*/
|
|
8
|
+
-- AlterTable
|
|
9
|
+
ALTER TABLE "Task" DROP COLUMN "targetCwd",
|
|
10
|
+
DROP COLUMN "targetHost";
|