@chorus-aidlc/chorus 0.9.4 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +481 -430
- package/.next/standalone/.next/app-path-routes-manifest.json +57 -44
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +33 -33
- package/.next/standalone/.next/routes-manifest.json +33 -17
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +3 -3
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -8
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +1 -1
- package/.next/standalone/.next/server/app/_not-found.rsc +5 -5
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +6 -6
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +1 -1
- package/.next/standalone/.next/server/app/admin/companies.rsc +6 -6
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +1 -1
- package/.next/standalone/.next/server/app/admin.rsc +6 -6
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route.js +1 -0
- package/.next/standalone/.next/server/app/api/agent-connections/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/check-default/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/check-default/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/refresh/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/refresh/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/session/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/control/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/executions/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js +1 -0
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/events/notifications/route.js +6 -2
- package/.next/standalone/.next/server/app/api/events/notifications/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/route.js +7 -3
- package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route.js +6 -42
- package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +5 -5
- package/.next/standalone/.next/server/app/login/admin/page.js +1 -1
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +1 -1
- package/.next/standalone/.next/server/app/login/admin.rsc +6 -6
- package/.next/standalone/.next/server/app/login/callback/page.js +2 -2
- package/.next/standalone/.next/server/app/login/callback/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/callback.html +1 -1
- package/.next/standalone/.next/server/app/login/callback.rsc +6 -6
- package/.next/standalone/.next/server/app/login/page.js +2 -2
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.html +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +6 -6
- package/.next/standalone/.next/server/app/login/silent-refresh/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.html +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.rsc +5 -5
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +6 -6
- package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
- package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +1 -1
- package/.next/standalone/.next/server/app/onboarding.rsc +6 -6
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects.html +1 -1
- package/.next/standalone/.next/server/app/projects.rsc +7 -7
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +7 -7
- package/.next/standalone/.next/server/app-paths-manifest.json +57 -44
- package/.next/standalone/.next/server/chunks/1064.js +1 -0
- package/.next/standalone/.next/server/chunks/1596.js +13 -0
- package/.next/standalone/.next/server/chunks/2213.js +1 -0
- package/.next/standalone/.next/server/chunks/2618.js +1 -1
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3219.js +2 -0
- package/.next/standalone/.next/server/chunks/3371.js +1 -0
- package/.next/standalone/.next/server/chunks/3419.js +1 -0
- package/.next/standalone/.next/server/chunks/369.js +1 -0
- package/.next/standalone/.next/server/chunks/4638.js +1 -0
- package/.next/standalone/.next/server/chunks/4711.js +530 -0
- package/.next/standalone/.next/server/chunks/4958.js +1 -1
- package/.next/standalone/.next/server/chunks/5039.js +1 -0
- package/.next/standalone/.next/server/chunks/5300.js +1 -1
- package/.next/standalone/.next/server/chunks/5631.js +1 -0
- package/.next/standalone/.next/server/chunks/6044.js +1 -1
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6207.js +1 -1
- package/.next/standalone/.next/server/chunks/6461.js +1 -0
- package/.next/standalone/.next/server/chunks/6712.js +1 -0
- package/.next/standalone/.next/server/chunks/7002.js +1 -1
- package/.next/standalone/.next/server/chunks/7063.js +2 -2
- package/.next/standalone/.next/server/chunks/7258.js +37 -0
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/7578.js +2 -2
- package/.next/standalone/.next/server/chunks/7867.js +1 -0
- package/.next/standalone/.next/server/chunks/7897.js +1 -0
- package/.next/standalone/.next/server/chunks/8012.js +1 -0
- package/.next/standalone/.next/server/chunks/8245.js +31 -0
- package/.next/standalone/.next/server/chunks/8322.js +1 -1
- package/.next/standalone/.next/server/chunks/8551.js +1 -1
- package/.next/standalone/.next/server/chunks/9015.js +1 -1
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/937.js +16 -2
- package/.next/standalone/.next/server/chunks/9629.js +1 -0
- package/.next/standalone/.next/server/chunks/9725.js +1 -0
- package/.next/standalone/.next/server/instrumentation.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/src/middleware.js +2 -2
- package/.next/standalone/.next/static/519aK55QLHaVN7b1TVDkB/_buildManifest.js +1 -0
- package/.next/standalone/.next/static/chunks/1217-323cc20b73ebfde9.js +1 -0
- package/.next/standalone/.next/static/chunks/{11207-8f4b154804f5a66f.js → 15183-5734d279b26e9414.js} +2 -2
- package/.next/standalone/.next/static/chunks/1879-7a8b283283218df2.js +1 -0
- package/.next/standalone/.next/static/chunks/19276-50b367d7b93d5f34.js +1 -0
- package/.next/standalone/.next/static/chunks/23466-e1176a6d814f4897.js +1 -0
- package/.next/standalone/.next/static/chunks/38040-a8687f86dd8e9d67.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.43f5ad8a3aaed0e8.js +1 -0
- package/.next/standalone/.next/static/chunks/58245-b2ea112ace9624d2.js +1 -0
- package/.next/standalone/.next/static/chunks/59296-783831c43aa0162e.js +1 -0
- package/.next/standalone/.next/static/chunks/60648-36ccbee4ce232d52.js +1 -0
- package/.next/standalone/.next/static/chunks/60694-68232120903209df.js +1 -0
- package/.next/standalone/.next/static/chunks/64648-81f03be6f9793ab9.js +1 -0
- package/.next/standalone/.next/static/chunks/{94655-1c75e0590a66215e.js → 66969-12f0b22c51f5a410.js} +1 -1
- package/.next/standalone/.next/static/chunks/70536-b8bf71098ae11f07.js +1 -0
- package/.next/standalone/.next/static/chunks/71350-88c2649fc693c1e8.js +1 -0
- package/.next/standalone/.next/static/chunks/78389-b32edc6bd5c570a9.js +1 -0
- package/.next/standalone/.next/static/chunks/78584-eb2fa8cf2f266329.js +1 -0
- package/.next/standalone/.next/static/chunks/78917-150ed14a99844aab.js +1 -0
- package/.next/standalone/.next/static/chunks/8574-b9739eb8d054c793.js +1 -0
- package/.next/standalone/.next/static/chunks/93346-5489d90bc2d57190.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.0768feb3a08c7da3.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-0a28456fea4ce95a.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/{page-63a6a5b6cf9ecf87.js → page-a79969c5c9aadacd.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-e00752a72c31663f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-ef82b871895245ea.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-2c9bcbd11ddb8661.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-630b168598513ce8.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-99639479cc98965f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-335f2450e44a0fba.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-4a191d69b2b6e880.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-0faebb478be4c85d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-c36345b80cc5bf5c.js → page-583e58d4d689d38b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-2e8fcb72687100df.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/companies/[uuid]/page-cc2fe0c5b749cd2f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/companies/new/{page-55fb2107f955c9ed.js → page-4f3b3c449c61f6d2.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/page-ef720c2b0856166c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/page-0cc8cf246db43e5d.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/session/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/comments/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/health/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/search/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-4bc556c2fc8f3d24.js +1 -0
- package/.next/standalone/.next/static/chunks/app/layout-9963339572e2e64e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/admin/page-d470135f7aab6c5e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/callback/{page-48a34c31a0f8e58c.js → page-0edd93f50cb4f6ea.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/login/page-c64b8d40a0781b4c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-e0444ad8b50121f5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/page-e9a69a0c537c704f.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-4a8c75a0d40c2106.js → webpack-87284a4533d77eaf.js} +1 -1
- package/.next/standalone/.next/static/css/{84edd78de243cde6.css → b496025c9cd768cc.css} +1 -1
- package/.next/standalone/.next/static/css/e78b3c856420a09f.css +1 -0
- package/.next/standalone/.next/static/media/013b72fa676f92e0-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/2b5b02fc7e511755-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/65f03d54ccadf4a8-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/7d4881bb7e1bf84d-s.p.woff2 +0 -0
- package/.next/standalone/.next/static/media/b9408752a0c24fb9-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/e038a29029a234f2-s.woff2 +0 -0
- package/.next/standalone/package.json +3 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +19 -3
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +2 -2
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +19 -3
- package/.next/standalone/public/skill/package.json +1 -1
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/README.md +29 -0
- package/README.zh.md +29 -0
- package/chorus.mjs +120 -16
- package/cli/backfill.mjs +190 -0
- package/cli/chorus-client.mjs +154 -0
- package/cli/claude-spawner.mjs +415 -0
- package/cli/client-args.mjs +146 -0
- package/cli/control-handler.mjs +180 -0
- package/cli/credentials.mjs +155 -0
- package/cli/daemon-agent.mjs +38 -0
- package/cli/daemon-banner.mjs +80 -0
- package/cli/daemon-config.mjs +84 -0
- package/cli/daemon-lifecycle.mjs +191 -0
- package/cli/daemon-permission-mode.mjs +68 -0
- package/cli/daemon-rest-client.mjs +272 -0
- package/cli/daemon.mjs +572 -0
- package/cli/event-router.mjs +248 -0
- package/cli/interrupt-reporter.mjs +87 -0
- package/cli/lineage.mjs +155 -0
- package/cli/login.mjs +151 -0
- package/cli/mcp-config.mjs +58 -0
- package/cli/process-killer.mjs +205 -0
- package/cli/prompts.mjs +273 -0
- package/cli/sse-listener.mjs +258 -0
- package/cli/turn-reporter.mjs +75 -0
- package/cli/upload-hooks.mjs +400 -0
- package/cli/wake-queue.mjs +121 -0
- package/cli/waker.mjs +475 -0
- package/package.json +3 -1
- package/prisma/migrations/20260611101056_add_idea_lineage/migration.sql +5 -0
- package/prisma/migrations/20260615082309_add_daemon_connection/migration.sql +37 -0
- package/prisma/migrations/20260616152622_add_daemon_task_execution/migration.sql +28 -0
- package/prisma/migrations/20260617013334_generalize_daemon_execution_to_any_resource/migration.sql +38 -0
- package/prisma/migrations/20260618022828_add_daemon_execution_interrupted/migration.sql +2 -0
- package/prisma/migrations/20260619055322_daemon_session_conversation/migration.sql +77 -0
- package/prisma/schema.prisma +368 -185
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js +0 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js +0 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/chunks/1059.js +0 -1
- package/.next/standalone/.next/server/chunks/1165.js +0 -1
- package/.next/standalone/.next/server/chunks/1615.js +0 -31
- package/.next/standalone/.next/server/chunks/162.js +0 -16
- package/.next/standalone/.next/server/chunks/1871.js +0 -1
- package/.next/standalone/.next/server/chunks/2909.js +0 -98
- package/.next/standalone/.next/server/chunks/2990.js +0 -1
- package/.next/standalone/.next/server/chunks/3139.js +0 -1
- package/.next/standalone/.next/server/chunks/324.js +0 -1
- package/.next/standalone/.next/server/chunks/3555.js +0 -1
- package/.next/standalone/.next/server/chunks/3576.js +0 -1
- package/.next/standalone/.next/server/chunks/3611.js +0 -158
- package/.next/standalone/.next/server/chunks/4090.js +0 -13
- package/.next/standalone/.next/server/chunks/4343.js +0 -1
- package/.next/standalone/.next/server/chunks/4974.js +0 -1
- package/.next/standalone/.next/server/chunks/5491.js +0 -1
- package/.next/standalone/.next/server/chunks/5541.js +0 -1
- package/.next/standalone/.next/server/chunks/5561.js +0 -7
- package/.next/standalone/.next/server/chunks/6643.js +0 -1
- package/.next/standalone/.next/server/chunks/6767.js +0 -1
- package/.next/standalone/.next/server/chunks/7228.js +0 -2
- package/.next/standalone/.next/server/chunks/7462.js +0 -255
- package/.next/standalone/.next/server/chunks/7621.js +0 -1
- package/.next/standalone/.next/server/chunks/8144.js +0 -1
- package/.next/standalone/.next/server/chunks/8637.js +0 -1
- package/.next/standalone/.next/server/chunks/896.js +0 -1
- package/.next/standalone/.next/server/chunks/9508.js +0 -2
- package/.next/standalone/.next/server/chunks/9615.js +0 -1
- package/.next/standalone/.next/static/YJZurE1onX9K-RDNIplc5/_buildManifest.js +0 -1
- package/.next/standalone/.next/static/chunks/19126-12ce8ade288ce1dc.js +0 -1
- package/.next/standalone/.next/static/chunks/19898-2a3d83a3996794cd.js +0 -1
- package/.next/standalone/.next/static/chunks/20051-d9233fd4578d66cc.js +0 -1
- package/.next/standalone/.next/static/chunks/21932-bce5ba937d1603e1.js +0 -1
- package/.next/standalone/.next/static/chunks/23466-842c126491b753bc.js +0 -1
- package/.next/standalone/.next/static/chunks/35486-592daa5c9fdf701d.js +0 -1
- package/.next/standalone/.next/static/chunks/37880-4395be5cee4112fa.js +0 -1
- package/.next/standalone/.next/static/chunks/3853-f94afe2f83089c0d.js +0 -1
- package/.next/standalone/.next/static/chunks/4842-95cf4b7efd540e89.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.1bebb2a898b170f6.js +0 -1
- package/.next/standalone/.next/static/chunks/51841-0e4e0e63b437dcfd.js +0 -1
- package/.next/standalone/.next/static/chunks/52206-6048525f57a21502.js +0 -1
- package/.next/standalone/.next/static/chunks/55469-ed5ff019ff71ef59.js +0 -1
- package/.next/standalone/.next/static/chunks/59296-4fa84fe82e2c7789.js +0 -1
- package/.next/standalone/.next/static/chunks/60011-b602fea2afba6992.js +0 -1
- package/.next/standalone/.next/static/chunks/70093-0ff6fd59445b5cb9.js +0 -1
- package/.next/standalone/.next/static/chunks/93346-c4468893138daac7.js +0 -1
- package/.next/standalone/.next/static/chunks/95627-8d9f6d2d88f7a641.js +0 -1
- package/.next/standalone/.next/static/chunks/95750-3d0d1d48995d1088.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.13c8ac5da1ddabe9.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-b55a8d6d9bd27276.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-fd10bca891f0f73a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-2e000a7010d1e9ea.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-75e42d130404ca2b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page-6a38c21b164cdc07.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/page-48c840cb3011bf97.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-7ec535fac7bbc75d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-414b398806324ad1.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-8f91ed174c14d5f0.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-f6814f25bbacdbea.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-92e8980da0d98d48.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-ab87cbb18d0ee538.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/[uuid]/page-81682b4aa6859615.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/page-bbd92a7b214ddbf5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/page-c4167418611b4a6b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/session/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/comments/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/health/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/search/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-99297f77cce24151.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-482dee7dace72c88.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/admin/page-4e72e6e4327ee7cd.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/page-dcb689dfe6e69879.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-ee9bda8bfc4e0697.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-922a196db6eb2385.js +0 -1
- package/.next/standalone/.next/static/css/bfe962487ee66da7.css +0 -1
- package/.next/standalone/.next/static/media/0f1bdadaf30e2d5f-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/2c34d62a75506231-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/601f5c280d60caca-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/a115172161b307bb-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/d100b2a099e34044-s.woff2 +0 -0
- package/.next/standalone/.next/static/media/f5271587012faf78-s.p.woff2 +0 -0
- /package/.next/standalone/.next/static/{YJZurE1onX9K-RDNIplc5 → 519aK55QLHaVN7b1TVDkB}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,400 @@
|
|
|
1
|
+
// cli/upload-hooks.mjs
|
|
2
|
+
// Execution-state upload hook for the daemon's observability layer
|
|
3
|
+
// (daemon-execution-state spec, design.md "Implementation Plan" step 3).
|
|
4
|
+
//
|
|
5
|
+
// The daemon already knows, in process memory, which tasks it is running and
|
|
6
|
+
// which are queued (the WakeQueue's scheduling state, joined with the waker's
|
|
7
|
+
// per-task lineage map). This module turns that into the snapshot the server's
|
|
8
|
+
// ingest endpoint expects and POSTs it:
|
|
9
|
+
//
|
|
10
|
+
// POST /api/daemon/execution-state
|
|
11
|
+
// { connectionUuid, executions: [{ taskUuid, rootIdeaUuid|null, status, startedAt|null }] }
|
|
12
|
+
//
|
|
13
|
+
// Reuses global fetch (Node 18+) and the daemon's existing Bearer credentials —
|
|
14
|
+
// exactly like lineage.mjs / sse-listener.mjs — so it adds ZERO new dependency
|
|
15
|
+
// (CLAUDE.md pitfall #9), no shell-out, no platform-specific paths. The POST is
|
|
16
|
+
// fire-and-forget: it never blocks or breaks the wake path, and a failed upload
|
|
17
|
+
// is LOGGED (no silent errors) and non-fatal — it never throws to the caller.
|
|
18
|
+
//
|
|
19
|
+
// `status` is constrained to "running"/"queued"; "ended" is a server-only
|
|
20
|
+
// terminal state the daemon never reports (the server rejects it).
|
|
21
|
+
//
|
|
22
|
+
// Transport: both the transcript POST and the execution-state POST go through the SHARED
|
|
23
|
+
// daemon REST client (`cli/daemon-rest-client.mjs`), which owns the request, Bearer auth,
|
|
24
|
+
// and the no-silent-errors transport contract. These hooks keep only the host-side
|
|
25
|
+
// concerns the client does not own — batching/debounce + content extraction for the
|
|
26
|
+
// transcript, and the snapshot build + serialized fire-and-forget chaining for both.
|
|
27
|
+
|
|
28
|
+
import { createDaemonRestClient } from "./daemon-rest-client.mjs";
|
|
29
|
+
|
|
30
|
+
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* @typedef {Object} SnapshotExecution
|
|
34
|
+
* @property {string} taskUuid
|
|
35
|
+
* @property {string|null} [rootIdeaUuid] null for a task with no root-idea lineage.
|
|
36
|
+
* @property {"running"|"queued"} status
|
|
37
|
+
* @property {string|null} [startedAt] ISO-8601; null while merely queued.
|
|
38
|
+
*/
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* @typedef {Object} UploadHooks
|
|
42
|
+
* @property {(info: { host: string, agentUuid?: string }) => Promise<void>} onConnect
|
|
43
|
+
* @property {(info: { rootIdeaKey: string, sessionId: string, isNew: boolean }) => Promise<void>} onSessionStart
|
|
44
|
+
* @property {(info: { rootIdeaKey: string, sessionId: string, message: any }) => Promise<void>} onTranscriptMessage
|
|
45
|
+
* @property {() => void} [onExecutionChange] Fire-and-forget: upload a fresh
|
|
46
|
+
* execution snapshot. The waker calls this on every lifecycle transition
|
|
47
|
+
* (enqueue / wake start / wake finish). No-op in the noop hooks.
|
|
48
|
+
*/
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* The default no-op hooks. Each resolves immediately and does nothing — no
|
|
52
|
+
* network, no disk. Used in tests and as a safe default where execution upload
|
|
53
|
+
* is not wired (e.g. the daemon could not learn its connectionUuid).
|
|
54
|
+
* @returns {UploadHooks}
|
|
55
|
+
*/
|
|
56
|
+
export function createNoopUploadHooks() {
|
|
57
|
+
return {
|
|
58
|
+
async onConnect() {},
|
|
59
|
+
async onSessionStart() {},
|
|
60
|
+
async onTranscriptMessage() {},
|
|
61
|
+
onExecutionChange() {},
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Compose several `UploadHooks` into one. The waker takes a SINGLE hooks object, but
|
|
67
|
+
* the daemon now has two independent concerns — execution-state snapshots and
|
|
68
|
+
* transcript relay — each built by its own factory. This merges them so each named
|
|
69
|
+
* hook fans out to every set that defines it: `onSessionStart`/`onTranscriptMessage`
|
|
70
|
+
* route to the transcript hooks, `onExecutionChange` to the execution hooks, etc. Async
|
|
71
|
+
* hooks are awaited (all in parallel); the synchronous `onExecutionChange` is called
|
|
72
|
+
* directly. Each delegate is invoked inside its own try/catch so one set throwing can
|
|
73
|
+
* never break another or the wake path (warn-not-throw).
|
|
74
|
+
*
|
|
75
|
+
* @param {...(UploadHooks|undefined|null)} hookSets
|
|
76
|
+
* @param {{ logger?: { warn(m:string):void } }} [optsLast] Last arg may be an options
|
|
77
|
+
* object (logger). Distinguished from a hook set by the absence of hook methods.
|
|
78
|
+
* @returns {UploadHooks}
|
|
79
|
+
*/
|
|
80
|
+
export function mergeUploadHooks(...args) {
|
|
81
|
+
// Allow an optional trailing `{ logger }` options object.
|
|
82
|
+
let logger = NOOP_LOGGER;
|
|
83
|
+
const sets = [];
|
|
84
|
+
for (const a of args) {
|
|
85
|
+
if (!a) continue;
|
|
86
|
+
const looksLikeHooks =
|
|
87
|
+
typeof a.onConnect === "function" ||
|
|
88
|
+
typeof a.onSessionStart === "function" ||
|
|
89
|
+
typeof a.onTranscriptMessage === "function" ||
|
|
90
|
+
typeof a.onExecutionChange === "function";
|
|
91
|
+
if (!looksLikeHooks && a.logger) {
|
|
92
|
+
logger = a.logger;
|
|
93
|
+
continue;
|
|
94
|
+
}
|
|
95
|
+
sets.push(a);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async function fanOutAsync(name, info) {
|
|
99
|
+
await Promise.all(
|
|
100
|
+
sets.map(async (s) => {
|
|
101
|
+
const fn = s[name];
|
|
102
|
+
if (typeof fn !== "function") return;
|
|
103
|
+
try {
|
|
104
|
+
await fn.call(s, info);
|
|
105
|
+
} catch (err) {
|
|
106
|
+
logger.warn(`[Chorus] ${name} hook failed: ${err}`);
|
|
107
|
+
}
|
|
108
|
+
})
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
return {
|
|
113
|
+
onConnect: (info) => fanOutAsync("onConnect", info),
|
|
114
|
+
onSessionStart: (info) => fanOutAsync("onSessionStart", info),
|
|
115
|
+
onTranscriptMessage: (info) => fanOutAsync("onTranscriptMessage", info),
|
|
116
|
+
onExecutionChange: () => {
|
|
117
|
+
for (const s of sets) {
|
|
118
|
+
if (typeof s.onExecutionChange !== "function") continue;
|
|
119
|
+
try {
|
|
120
|
+
s.onExecutionChange();
|
|
121
|
+
} catch (err) {
|
|
122
|
+
logger.warn(`[Chorus] onExecutionChange hook failed: ${err}`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
},
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// ─── Transcript upload (子1 — daemon-session-conversation) ──────────────────
|
|
130
|
+
//
|
|
131
|
+
// The daemon's stream-json consumer (claude-spawner → waker.onMessage) hands every
|
|
132
|
+
// NDJSON object to `onTranscriptMessage`. Claude Code's stream-json (verified against
|
|
133
|
+
// CLI 2.1.183) wraps each conversation message as:
|
|
134
|
+
//
|
|
135
|
+
// { "type": "assistant" | "user", "session_id": "...",
|
|
136
|
+
// "message": { "role": "assistant" | "user",
|
|
137
|
+
// "content": [ { "type": "text", "text": "..." },
|
|
138
|
+
// { "type": "thinking", ... },
|
|
139
|
+
// { "type": "tool_use", ... },
|
|
140
|
+
// { "type": "tool_result", ... } ] } }
|
|
141
|
+
//
|
|
142
|
+
// `system` (init / hooks / thinking_tokens) and `result` envelopes are NOT
|
|
143
|
+
// conversation messages. A `tool_result` block rides inside a `type:"user"` message,
|
|
144
|
+
// so filtering MUST happen at the content-BLOCK level (keep only `text`), not at the
|
|
145
|
+
// top-level type — otherwise a tool-result-only user message would leak. The server
|
|
146
|
+
// ingest stores ONLY `user`/`assistant` text (see /api/daemon/transcript), so this
|
|
147
|
+
// filter mirrors exactly what the server will persist.
|
|
148
|
+
|
|
149
|
+
/** Top-level stream-json envelope types that carry a conversation message. */
|
|
150
|
+
const CONVERSATION_TYPES = new Set(["user", "assistant"]);
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Extract the plain user/assistant TEXT from one Claude Code stream-json object,
|
|
154
|
+
* dropping everything that is not a conversation text block (system/result
|
|
155
|
+
* envelopes, thinking, tool_use, tool_result). Returns null when the object is not a
|
|
156
|
+
* keepable conversation message (so the caller can skip it). Never throws — a shape
|
|
157
|
+
* it doesn't recognize yields null rather than an error (defensive against CLI drift).
|
|
158
|
+
*
|
|
159
|
+
* @param {any} obj One parsed stream-json NDJSON object.
|
|
160
|
+
* @returns {{ role: "user"|"assistant", text: string } | null}
|
|
161
|
+
*/
|
|
162
|
+
export function extractTranscriptText(obj) {
|
|
163
|
+
if (!obj || typeof obj !== "object") return null;
|
|
164
|
+
if (!CONVERSATION_TYPES.has(obj.type)) return null;
|
|
165
|
+
|
|
166
|
+
const message = obj.message;
|
|
167
|
+
if (!message || typeof message !== "object") return null;
|
|
168
|
+
// The persisted role is the message's role; fall back to the envelope type (they
|
|
169
|
+
// agree in practice, but the envelope is the documented discriminator).
|
|
170
|
+
const role = message.role === "user" || message.role === "assistant" ? message.role : obj.type;
|
|
171
|
+
if (role !== "user" && role !== "assistant") return null;
|
|
172
|
+
|
|
173
|
+
const content = message.content;
|
|
174
|
+
let text = "";
|
|
175
|
+
if (typeof content === "string") {
|
|
176
|
+
// Some message variants carry a bare string (e.g. an echoed initial prompt).
|
|
177
|
+
text = content;
|
|
178
|
+
} else if (Array.isArray(content)) {
|
|
179
|
+
// Keep ONLY `text` blocks — drop thinking / tool_use / tool_result. Concatenate
|
|
180
|
+
// the text blocks of one message into a single transcript entry (mirrors how a
|
|
181
|
+
// reader sees the message; the server stores one row per posted message).
|
|
182
|
+
const parts = [];
|
|
183
|
+
for (const block of content) {
|
|
184
|
+
if (block && typeof block === "object" && block.type === "text" && typeof block.text === "string") {
|
|
185
|
+
parts.push(block.text);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
text = parts.join("");
|
|
189
|
+
} else {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
// A message with no text (e.g. a user message that was purely a tool_result, or an
|
|
194
|
+
// assistant message that was purely tool_use/thinking) is dropped — nothing to store.
|
|
195
|
+
if (!text.trim()) return null;
|
|
196
|
+
return { role, text };
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Build the transcript upload hooks (子1). The daemon's stream-json consumer calls
|
|
201
|
+
* `onTranscriptMessage` for every NDJSON object; this keeps only user/assistant text
|
|
202
|
+
* and batch-POSTs it to `POST /api/daemon/transcript`, targeting the current turn by
|
|
203
|
+
* the session BUSINESS KEY (`sessionId` = directIdeaUuid or the entity uuid — exactly
|
|
204
|
+
* what the waker anchors the Claude session on, and what turn-reporter advances). The
|
|
205
|
+
* server resolves the agent's `(agentUuid, sessionId)` session and appends to its
|
|
206
|
+
* most-recent turn. `onSessionStart` resets per-session batching state so a new run's
|
|
207
|
+
* messages attach to the right turn.
|
|
208
|
+
*
|
|
209
|
+
* Mirrors `createExecutionUploadHooks`: injectable `fetchImpl`, the daemon's existing
|
|
210
|
+
* Bearer creds, ZERO new deps (global fetch, Node 18+). Fire-and-forget + warn-not-throw:
|
|
211
|
+
* a failed upload is LOGGED (no-silent-errors) and never blocks/breaks the wake. Uploads
|
|
212
|
+
* are batched (debounced) so a burst of stream-json lines becomes few POSTs, and
|
|
213
|
+
* serialized on a chain so an earlier batch can't land after a later one.
|
|
214
|
+
*
|
|
215
|
+
* @param {{
|
|
216
|
+
* url: string, Chorus base URL.
|
|
217
|
+
* apiKey: string, `cho_` agent API key.
|
|
218
|
+
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
219
|
+
* fetchImpl?: typeof fetch, Injectable for tests.
|
|
220
|
+
* batchDelayMs?: number, Debounce window for coalescing messages into one POST
|
|
221
|
+
* (default 50ms). 0 → flush on the next microtask.
|
|
222
|
+
* setTimeoutImpl?: typeof setTimeout, Injectable timer for tests.
|
|
223
|
+
* clearTimeoutImpl?: typeof clearTimeout,
|
|
224
|
+
* }} opts
|
|
225
|
+
* @returns {UploadHooks}
|
|
226
|
+
*/
|
|
227
|
+
export function createTranscriptUploadHooks(opts) {
|
|
228
|
+
const logger = opts.logger ?? NOOP_LOGGER;
|
|
229
|
+
const batchDelayMs = opts.batchDelayMs ?? 50;
|
|
230
|
+
const setTimeoutImpl = opts.setTimeoutImpl ?? setTimeout;
|
|
231
|
+
const clearTimeoutImpl = opts.clearTimeoutImpl ?? clearTimeout;
|
|
232
|
+
// Transport via the shared client (transcript has no connectionUuid concern — the agent
|
|
233
|
+
// key + sessionId resolve the turn server-side, so getConnectionUuid is unused here).
|
|
234
|
+
const client = createDaemonRestClient({
|
|
235
|
+
url: opts.url,
|
|
236
|
+
apiKey: opts.apiKey,
|
|
237
|
+
fetchImpl: opts.fetchImpl,
|
|
238
|
+
logger,
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
// The session this batch belongs to (set by onSessionStart, and re-affirmed by each
|
|
242
|
+
// message's observed session id from the stream). Messages queued for one session
|
|
243
|
+
// are flushed before the session changes, so they always target the right turn.
|
|
244
|
+
let currentSessionId = null;
|
|
245
|
+
/** @type {Array<{ role: "user"|"assistant", text: string }>} */
|
|
246
|
+
let pending = [];
|
|
247
|
+
let timer = null;
|
|
248
|
+
// Serialize POSTs so an earlier batch can never land after a later one on the wire.
|
|
249
|
+
let chain = Promise.resolve();
|
|
250
|
+
|
|
251
|
+
/** POST one batch for a session via the shared client. Never throws. */
|
|
252
|
+
async function upload(sessionId, messages) {
|
|
253
|
+
if (!sessionId || messages.length === 0) return;
|
|
254
|
+
// The client POSTs `{ sessionId, messages }` to /api/daemon/transcript with Bearer
|
|
255
|
+
// auth and logs "transcript upload request failed" / "transcript upload returned N"
|
|
256
|
+
// on failure (no-silent-errors) and "transcript uploaded (N msg) ..." on success. We
|
|
257
|
+
// swallow the structured result so a failed upload never breaks the wake path.
|
|
258
|
+
await client.transcript({ sessionId, messages });
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
/** Drain `pending` for `currentSessionId` into a serialized fire-and-forget POST. */
|
|
262
|
+
function flush() {
|
|
263
|
+
if (timer !== null) {
|
|
264
|
+
clearTimeoutImpl(timer);
|
|
265
|
+
timer = null;
|
|
266
|
+
}
|
|
267
|
+
if (pending.length === 0) return;
|
|
268
|
+
const sessionId = currentSessionId;
|
|
269
|
+
const batch = pending;
|
|
270
|
+
pending = [];
|
|
271
|
+
if (!sessionId) {
|
|
272
|
+
// No session to attribute the messages to (onSessionStart never ran / no id on
|
|
273
|
+
// the stream). Drop with a visible warning rather than mis-route (no-silent).
|
|
274
|
+
logger.warn(`[Chorus] dropping ${batch.length} transcript msg — no session id yet`);
|
|
275
|
+
return;
|
|
276
|
+
}
|
|
277
|
+
const run = () => upload(sessionId, batch);
|
|
278
|
+
chain = chain.then(run, run);
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
function scheduleFlush() {
|
|
282
|
+
if (timer !== null) return;
|
|
283
|
+
if (batchDelayMs <= 0) {
|
|
284
|
+
// Microtask flush — coalesces a synchronous burst, still off the hot path.
|
|
285
|
+
timer = setTimeoutImpl(flush, 0);
|
|
286
|
+
} else {
|
|
287
|
+
timer = setTimeoutImpl(flush, batchDelayMs);
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
return {
|
|
292
|
+
async onConnect() {},
|
|
293
|
+
/**
|
|
294
|
+
* A new (or resumed) Claude run started for this session. Flush any leftover
|
|
295
|
+
* messages from a prior session, then pin the batch to this session id so
|
|
296
|
+
* subsequent messages attach to the right turn. (子1 — onSessionStart contract.)
|
|
297
|
+
* @param {{ rootIdeaKey: string, sessionId: string, isNew: boolean }} info
|
|
298
|
+
*/
|
|
299
|
+
async onSessionStart({ sessionId } = {}) {
|
|
300
|
+
// If the session changed mid-stream, flush the old session's pending batch first
|
|
301
|
+
// so its messages don't get re-tagged to the new session.
|
|
302
|
+
if (currentSessionId && currentSessionId !== sessionId) flush();
|
|
303
|
+
currentSessionId = sessionId || currentSessionId || null;
|
|
304
|
+
},
|
|
305
|
+
/**
|
|
306
|
+
* One stream-json object. Keep only user/assistant text; queue it for a batched
|
|
307
|
+
* POST. Fire-and-forget + non-throwing: any failure is logged inside `flush`/`upload`.
|
|
308
|
+
* @param {{ rootIdeaKey: string, sessionId: string, message: any }} info
|
|
309
|
+
*/
|
|
310
|
+
async onTranscriptMessage({ sessionId, message } = {}) {
|
|
311
|
+
// The stream stamps the authoritative session id on every line; prefer it so a
|
|
312
|
+
// session resolved only from the stream (not onSessionStart) is still attributed.
|
|
313
|
+
if (sessionId) currentSessionId = sessionId;
|
|
314
|
+
let extracted;
|
|
315
|
+
try {
|
|
316
|
+
extracted = extractTranscriptText(message);
|
|
317
|
+
} catch (err) {
|
|
318
|
+
logger.warn(`[Chorus] transcript extract failed: ${err}`);
|
|
319
|
+
return;
|
|
320
|
+
}
|
|
321
|
+
if (!extracted) return; // not a keepable conversation text message
|
|
322
|
+
pending.push(extracted);
|
|
323
|
+
scheduleFlush();
|
|
324
|
+
},
|
|
325
|
+
onExecutionChange() {},
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
/**
|
|
330
|
+
* Build the execution-state upload hooks. The returned `onExecutionChange()` is
|
|
331
|
+
* synchronous and non-throwing: it kicks off a fire-and-forget POST and returns
|
|
332
|
+
* immediately, so the wake path is never blocked. The transcript/session/connect
|
|
333
|
+
* hooks remain no-ops (reserved for a later observability slice).
|
|
334
|
+
*
|
|
335
|
+
* @param {{
|
|
336
|
+
* url: string, Chorus base URL.
|
|
337
|
+
* apiKey: string, `cho_` agent API key.
|
|
338
|
+
* getConnectionUuid: () => (string|null), The connection this daemon registered
|
|
339
|
+
* as (null until the SSE handshake
|
|
340
|
+
* reports it — uploads are skipped while null).
|
|
341
|
+
* getSnapshot: () => SnapshotExecution[], Builds the current snapshot from live
|
|
342
|
+
* daemon state (WakeQueue + waker lineage map).
|
|
343
|
+
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
344
|
+
* fetchImpl?: typeof fetch, Injectable for tests.
|
|
345
|
+
* }} opts
|
|
346
|
+
* @returns {UploadHooks}
|
|
347
|
+
*/
|
|
348
|
+
export function createExecutionUploadHooks(opts) {
|
|
349
|
+
const getSnapshot = opts.getSnapshot;
|
|
350
|
+
const logger = opts.logger ?? NOOP_LOGGER;
|
|
351
|
+
// Transport via the shared client. It owns the connectionUuid guard (silent skip while
|
|
352
|
+
// the SSE handshake hasn't reported it — a normal early state, not an error), the
|
|
353
|
+
// request, Bearer auth, and the failure logging ("execution-state upload request failed"
|
|
354
|
+
// / "execution-state upload returned N") + success log.
|
|
355
|
+
const client = createDaemonRestClient({
|
|
356
|
+
url: opts.url,
|
|
357
|
+
apiKey: opts.apiKey,
|
|
358
|
+
getConnectionUuid: opts.getConnectionUuid,
|
|
359
|
+
fetchImpl: opts.fetchImpl,
|
|
360
|
+
logger,
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
// Serialize uploads so two rapid transitions can't reorder on the wire (a
|
|
364
|
+
// later snapshot must not land before an earlier one). The snapshot is
|
|
365
|
+
// captured SYNCHRONOUSLY at emit time (not re-read at send time): each
|
|
366
|
+
// lifecycle transition's state is preserved even when transitions happen
|
|
367
|
+
// faster than uploads flush — so a brief "running" state is never silently
|
|
368
|
+
// collapsed into the subsequent "finished" upload.
|
|
369
|
+
let chain = Promise.resolve();
|
|
370
|
+
|
|
371
|
+
/** POST a captured snapshot via the shared client. Never throws. */
|
|
372
|
+
async function upload(executions) {
|
|
373
|
+
await client.executionState({ executions });
|
|
374
|
+
}
|
|
375
|
+
|
|
376
|
+
return {
|
|
377
|
+
async onConnect() {},
|
|
378
|
+
async onSessionStart() {},
|
|
379
|
+
async onTranscriptMessage() {},
|
|
380
|
+
/**
|
|
381
|
+
* Fire-and-forget upload of the current snapshot. Synchronous + non-throwing
|
|
382
|
+
* so it never blocks/breaks the wake path. The snapshot is captured here, at
|
|
383
|
+
* call time, then queued behind any in-flight upload; failures are logged
|
|
384
|
+
* inside `upload()`. A snapshot-build error is logged and skips the POST.
|
|
385
|
+
*/
|
|
386
|
+
onExecutionChange() {
|
|
387
|
+
let executions;
|
|
388
|
+
try {
|
|
389
|
+
executions = getSnapshot();
|
|
390
|
+
} catch (err) {
|
|
391
|
+
logger.warn(`[Chorus] execution snapshot build failed: ${err}`);
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
// Chain on both fulfill and reject so one failed upload can't wedge the
|
|
395
|
+
// chain; `upload` already swallows its own errors, this is belt-and-braces.
|
|
396
|
+
const run = () => upload(executions);
|
|
397
|
+
chain = chain.then(run, run);
|
|
398
|
+
},
|
|
399
|
+
};
|
|
400
|
+
}
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
// cli/wake-queue.mjs
|
|
2
|
+
// Per-key FIFO scheduler with a global concurrency cap. This is what makes the
|
|
3
|
+
// idea_root session anchor safe (cli-daemon spec "Per-root-idea wake
|
|
4
|
+
// serialization", design.md "Concurrency model"):
|
|
5
|
+
// • within one key (root idea) → strictly serial, FIFO. The 2nd wake waits
|
|
6
|
+
// for the 1st subprocess to exit, so we never run two
|
|
7
|
+
// `claude --resume <sameSessionId>` against one session.
|
|
8
|
+
// • across keys → concurrent, bounded by maxConcurrency.
|
|
9
|
+
// • enqueue() returns immediately — never blocks the SSE loop.
|
|
10
|
+
// • a task that throws is logged and the next task for that key proceeds (a
|
|
11
|
+
// poisoned wake must not wedge the key's queue forever).
|
|
12
|
+
// Plain ESM, zero deps, in-memory.
|
|
13
|
+
|
|
14
|
+
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
15
|
+
|
|
16
|
+
export class WakeQueue {
|
|
17
|
+
/**
|
|
18
|
+
* @param {{
|
|
19
|
+
* maxConcurrency?: number,
|
|
20
|
+
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
21
|
+
* }} [opts]
|
|
22
|
+
*/
|
|
23
|
+
constructor(opts = {}) {
|
|
24
|
+
this.maxConcurrency = opts.maxConcurrency ?? 4;
|
|
25
|
+
this.logger = opts.logger ?? NOOP_LOGGER;
|
|
26
|
+
/** @type {Map<string, Array<() => Promise<void>>>} pending tasks per key. */
|
|
27
|
+
this.pending = new Map();
|
|
28
|
+
/** @type {Set<string>} keys with a task currently running. */
|
|
29
|
+
this.running = new Set();
|
|
30
|
+
/** @type {string[]} keys waiting for a global concurrency slot. */
|
|
31
|
+
this.readyKeys = [];
|
|
32
|
+
this.activeCount = 0;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Enqueue a wake task under a key. Returns immediately. The task is a thunk
|
|
37
|
+
* returning a promise (the actual wake). Same key → serialized; different
|
|
38
|
+
* keys → concurrent up to maxConcurrency.
|
|
39
|
+
* @param {string} key
|
|
40
|
+
* @param {() => Promise<void>} task
|
|
41
|
+
*/
|
|
42
|
+
enqueue(key, task) {
|
|
43
|
+
if (!this.pending.has(key)) this.pending.set(key, []);
|
|
44
|
+
this.pending.get(key).push(task);
|
|
45
|
+
// A key becomes "ready" to claim a global slot only when it's not already
|
|
46
|
+
// running (serial-per-key) and not already queued for a slot.
|
|
47
|
+
if (!this.running.has(key) && !this.readyKeys.includes(key)) {
|
|
48
|
+
this.readyKeys.push(key);
|
|
49
|
+
}
|
|
50
|
+
this.#pump();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Number of keys with pending work (for tests/observability). */
|
|
54
|
+
get pendingKeyCount() {
|
|
55
|
+
return [...this.pending.values()].filter((q) => q.length > 0).length;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Snapshot of the keys with a task currently running (observability read).
|
|
60
|
+
* Returns a fresh array so a caller can't mutate the internal Set.
|
|
61
|
+
* @returns {string[]}
|
|
62
|
+
*/
|
|
63
|
+
runningKeys() {
|
|
64
|
+
return [...this.running];
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Snapshot of the keys that have at least one task still waiting to run —
|
|
69
|
+
* i.e. enqueued but not yet started (observability read). A key that is
|
|
70
|
+
* currently running with no further queued work is NOT pending. Returns a
|
|
71
|
+
* fresh array so a caller can't mutate internal state.
|
|
72
|
+
* @returns {string[]}
|
|
73
|
+
*/
|
|
74
|
+
pendingKeys() {
|
|
75
|
+
return [...this.pending.entries()].filter(([, q]) => q.length > 0).map(([k]) => k);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Try to start as many ready keys as the concurrency cap allows. */
|
|
79
|
+
#pump() {
|
|
80
|
+
while (this.activeCount < this.maxConcurrency && this.readyKeys.length > 0) {
|
|
81
|
+
const key = this.readyKeys.shift();
|
|
82
|
+
if (this.running.has(key)) continue; // already running under another slot
|
|
83
|
+
const queue = this.pending.get(key);
|
|
84
|
+
if (!queue || queue.length === 0) continue;
|
|
85
|
+
this.#runNext(key);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/** Run the next task for a key, then chain to the following one. */
|
|
90
|
+
#runNext(key) {
|
|
91
|
+
const queue = this.pending.get(key);
|
|
92
|
+
if (!queue || queue.length === 0) {
|
|
93
|
+
this.running.delete(key);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const task = queue.shift();
|
|
97
|
+
this.running.add(key);
|
|
98
|
+
this.activeCount++;
|
|
99
|
+
|
|
100
|
+
Promise.resolve()
|
|
101
|
+
.then(task)
|
|
102
|
+
.catch((err) => {
|
|
103
|
+
// Poisoned wake: log, do NOT let it wedge the key's queue.
|
|
104
|
+
this.logger.warn(`[Chorus] wake task for ${key} failed: ${err}`);
|
|
105
|
+
})
|
|
106
|
+
.finally(() => {
|
|
107
|
+
this.activeCount--;
|
|
108
|
+
const remaining = this.pending.get(key);
|
|
109
|
+
if (remaining && remaining.length > 0) {
|
|
110
|
+
// Same key still has work → it must run serially. Re-mark ready;
|
|
111
|
+
// #pump will pick it up (respecting the global cap).
|
|
112
|
+
if (!this.readyKeys.includes(key)) this.readyKeys.push(key);
|
|
113
|
+
this.running.delete(key); // free the key so #pump can re-claim it
|
|
114
|
+
} else {
|
|
115
|
+
this.running.delete(key);
|
|
116
|
+
this.pending.delete(key);
|
|
117
|
+
}
|
|
118
|
+
this.#pump();
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
}
|