@chorus-aidlc/chorus 0.10.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +457 -340
- package/.next/standalone/.next/app-path-routes-manifest.json +39 -25
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +30 -30
- package/.next/standalone/.next/routes-manifest.json +25 -0
- 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 -3
- 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 +5 -5
- 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 +5 -5
- 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 +5 -5
- 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_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 -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/mcp/route.js +5 -41
- 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_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 +5 -5
- 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 +5 -5
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.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 +5 -5
- 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 +5 -5
- 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 +39 -25
- 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/5039.js +1 -0
- package/.next/standalone/.next/server/chunks/5300.js +1 -1
- package/.next/standalone/.next/server/chunks/{4913.js → 5631.js} +1 -1
- 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 +1 -1
- 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/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/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/GQvpOux3M9CaxkMjL9GAI/_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.8bdb37c964f92e48.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-ece4e2a59672cf63.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/99373.12370329b9ab6beb.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-a79969c5c9aadacd.js +1 -0
- 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-a28f0eaa6f4ac94a.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-f198303c176c6e02.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/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/onboarding/page-e9a69a0c537c704f.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-5bb5740df10ed622.js → webpack-039590181c63871d.js} +1 -1
- package/.next/standalone/.next/static/css/1d9aaac01758b297.css +1 -0
- package/.next/standalone/.next/static/css/{84edd78de243cde6.css → b496025c9cd768cc.css} +1 -1
- 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 +13 -1
- package/.next/standalone/public/chorus-plugin/agents/code-reviewer.md +167 -0
- package/.next/standalone/public/chorus-plugin/bin/on-post-verify-task.sh +97 -17
- package/.next/standalone/public/chorus-plugin/bin/tests/test-on-post-verify-task.sh +191 -1
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +7 -4
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +3 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +2 -1
- 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 +12 -3
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +40 -1
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +16 -11
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +225 -0
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +3 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +2 -1
- package/.next/standalone/public/skill/package.json +3 -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 +12 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +35 -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/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 +366 -188
- 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/179.js +0 -158
- 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/324.js +0 -1
- package/.next/standalone/.next/server/chunks/3555.js +0 -1
- 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/4879.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/7859.js +0 -1
- package/.next/standalone/.next/server/chunks/8277.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/9269.js +0 -1
- package/.next/standalone/.next/server/chunks/9615.js +0 -1
- package/.next/standalone/.next/static/AKJHlhCKd44_-khht8nN0/_buildManifest.js +0 -1
- package/.next/standalone/.next/static/chunks/20051-c242544dafd3a690.js +0 -1
- package/.next/standalone/.next/static/chunks/21932-bce5ba937d1603e1.js +0 -1
- package/.next/standalone/.next/static/chunks/23095-5bf481236249fdd8.js +0 -1
- package/.next/standalone/.next/static/chunks/23466-842c126491b753bc.js +0 -1
- package/.next/standalone/.next/static/chunks/45436-c5427023f3f386a1.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.e071c0b9e32bd75f.js +0 -1
- package/.next/standalone/.next/static/chunks/49852-5337f139a2f87c46.js +0 -1
- package/.next/standalone/.next/static/chunks/52206-7c1b0c695c8035eb.js +0 -1
- package/.next/standalone/.next/static/chunks/55469-ed5ff019ff71ef59.js +0 -1
- package/.next/standalone/.next/static/chunks/59296-50e66102d44d9677.js +0 -1
- package/.next/standalone/.next/static/chunks/60524-9811b38c62fed16e.js +0 -1
- package/.next/standalone/.next/static/chunks/68855-5c15991e7cf8dc8a.js +0 -1
- package/.next/standalone/.next/static/chunks/70093-0ff6fd59445b5cb9.js +0 -1
- package/.next/standalone/.next/static/chunks/74030-3a6a6b75e47f5b96.js +0 -1
- package/.next/standalone/.next/static/chunks/78917-ff0fda86a96cfa60.js +0 -1
- package/.next/standalone/.next/static/chunks/95627-8d9f6d2d88f7a641.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.4c336ea9ad07311e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-5915ccd1a77ebcf8.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-94d102d945410b55.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-56c45b910f914895.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]/proposals/[proposalUuid]/page-d7747749ae6192d8.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-26488809d26e1daa.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-fcc9baa42e6de4d4.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-5233748464280e9d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-ab87cbb18d0ee538.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/session/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/comments/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/health/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/search/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-cd9411c54c8f5b35.js +0 -1
- package/.next/standalone/.next/static/chunks/app/layout-482dee7dace72c88.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-d9dbd817391b462b.js +0 -1
- package/.next/standalone/.next/static/css/4279f38594ac772a.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/{AKJHlhCKd44_-khht8nN0 → GQvpOux3M9CaxkMjL9GAI}/_ssgManifest.js +0 -0
package/cli/waker.mjs
ADDED
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
// cli/waker.mjs
|
|
2
|
+
// Executes a single wake: resolve the event to its idea attribution, derive the
|
|
3
|
+
// deterministic session id (= the DIRECT idea uuid), build the --mcp-config, spawn
|
|
4
|
+
// headless Claude (new vs resume decided by probing the on-disk transcript), and
|
|
5
|
+
// fire the (no-op) upload hooks. The WakeQueue schedules these per DIRECT idea so
|
|
6
|
+
// two wakes for the same idea never run concurrently against the same session.
|
|
7
|
+
//
|
|
8
|
+
// TWO-ID CONTRACT (do not conflate): the session is anchored on the DIRECT idea
|
|
9
|
+
// (so a human can `claude --resume <idea-uuid>`), while the execution snapshot
|
|
10
|
+
// reports the ROOT idea (for the observability UI). Both ids come from one lineage
|
|
11
|
+
// resolution and are threaded SEPARATELY — the root reported in the snapshot is
|
|
12
|
+
// the server-resolved root, NEVER re-derived from the (direct-idea) serialization
|
|
13
|
+
// key.
|
|
14
|
+
//
|
|
15
|
+
// Module contract (design.md): Waker.wake(notification, key, attribution) →
|
|
16
|
+
// Promise<void>. A failure is logged and swallowed — it must never crash the
|
|
17
|
+
// daemon (no-silent-errors: visible log, no throw).
|
|
18
|
+
|
|
19
|
+
import { buildPrompt } from "./prompts.mjs";
|
|
20
|
+
import { writeMcpConfig } from "./mcp-config.mjs";
|
|
21
|
+
import { isNewSession } from "./claude-spawner.mjs";
|
|
22
|
+
|
|
23
|
+
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
24
|
+
|
|
25
|
+
export class Waker {
|
|
26
|
+
/**
|
|
27
|
+
* @param {{
|
|
28
|
+
* creds: { url: string, apiKey: string },
|
|
29
|
+
* lineage: { resolve: (event: any) => Promise<{ rootIdeaUuid: string|null, directIdeaUuid: string|null }> },
|
|
30
|
+
* spawner: { wake: (params: any) => Promise<{ sessionId: string, exitCode: number|null, isNew: boolean }> },
|
|
31
|
+
* cwd?: string, Spawn working directory; used BOTH for the transcript probe and the spawn (default process.cwd()).
|
|
32
|
+
* hooks?: import("./upload-hooks.mjs").UploadHooks,
|
|
33
|
+
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
34
|
+
* writeMcpConfigFn?: typeof writeMcpConfig,
|
|
35
|
+
* isNewSessionFn?: typeof isNewSession, Injectable for tests (disk probe).
|
|
36
|
+
* reportInterrupt?: (entityType: string, entityUuid: string, reason: "user"|"crash") => Promise<void>,
|
|
37
|
+
* Injectable interrupt reporter (子3). Called when a wake's subprocess exits in
|
|
38
|
+
* an interrupted (user) or crashed (non-zero, no interrupt flag) state. Defaults
|
|
39
|
+
* to a no-op that logs — the daemon wires the REST reporter (interrupt-reporter.mjs).
|
|
40
|
+
* advanceTurn?: (params: { sessionId: string, status: "running"|"ended", entityType?: string|null, entityUuid?: string|null }) => Promise<void>,
|
|
41
|
+
* Injectable turn-lifecycle reporter (子1 — daemon-session-conversation). Called
|
|
42
|
+
* on spawn (→ running) and on subprocess exit (→ ended) to advance the server-side
|
|
43
|
+
* DaemonSessionTurn the notification chokepoint created (status `pending`). The
|
|
44
|
+
* server resolves the turn by the session business key (`sessionId`) and stamps
|
|
45
|
+
* the weak executionUuid link from entityType/entityUuid. Defaults to a no-op that
|
|
46
|
+
* logs — the daemon wires the REST reporter (turn-reporter.mjs).
|
|
47
|
+
* }} opts
|
|
48
|
+
*/
|
|
49
|
+
constructor(opts) {
|
|
50
|
+
this.creds = opts.creds;
|
|
51
|
+
this.lineage = opts.lineage;
|
|
52
|
+
this.spawner = opts.spawner;
|
|
53
|
+
// Verbose per-wake logging (daemon-startup-output). Default: one compact
|
|
54
|
+
// line per lifecycle event (arrival / spawn new-vs-resume / completion).
|
|
55
|
+
// When true, additional detail is emitted alongside those lines.
|
|
56
|
+
this.verbose = opts.verbose ?? false;
|
|
57
|
+
// The daemon spawns in one fixed working directory; the transcript probe must
|
|
58
|
+
// use the SAME cwd as the spawn, or it would decide new-vs-resume against the
|
|
59
|
+
// wrong directory (claude scopes --resume to cwd).
|
|
60
|
+
this.cwd = opts.cwd ?? process.cwd();
|
|
61
|
+
this.hooks = opts.hooks;
|
|
62
|
+
this.logger = opts.logger ?? NOOP_LOGGER;
|
|
63
|
+
this.writeMcpConfigFn = opts.writeMcpConfigFn ?? writeMcpConfig;
|
|
64
|
+
this.isNewSessionFn = opts.isNewSessionFn ?? isNewSession;
|
|
65
|
+
// Interrupt reporter (子3): default no-op-with-log so a Waker built without one
|
|
66
|
+
// (existing tests) keeps working; the daemon injects the REST reporter.
|
|
67
|
+
this.reportInterrupt =
|
|
68
|
+
opts.reportInterrupt ??
|
|
69
|
+
(async (entityType, entityUuid, reason) => {
|
|
70
|
+
this.logger.info(
|
|
71
|
+
`[Chorus] (no reporter wired) would report ${entityType}:${entityUuid} interrupted (reason=${reason})`
|
|
72
|
+
);
|
|
73
|
+
});
|
|
74
|
+
// Turn-lifecycle reporter (子1): default no-op-with-log so a Waker built without one
|
|
75
|
+
// (existing tests) keeps working; the daemon injects the REST reporter
|
|
76
|
+
// (turn-reporter.mjs). Advances the server-side turn pending→running on spawn and
|
|
77
|
+
// running→ended on subprocess exit, identified by the session business key.
|
|
78
|
+
this.advanceTurn =
|
|
79
|
+
opts.advanceTurn ??
|
|
80
|
+
(async ({ sessionId, status }) => {
|
|
81
|
+
this.logger.info(
|
|
82
|
+
`[Chorus] (no turn reporter wired) would advance turn for session ${sessionId} → ${status}`
|
|
83
|
+
);
|
|
84
|
+
});
|
|
85
|
+
// Per-entity "interrupting" flags, set by the control handler the moment an
|
|
86
|
+
// authorized interrupt is verified for a running child (markInterrupting). The
|
|
87
|
+
// wake's exit path reads + clears it to decide reason=user vs reason=crash.
|
|
88
|
+
/** @type {Set<string>} */
|
|
89
|
+
this.interrupting = new Set();
|
|
90
|
+
|
|
91
|
+
// Per-resource execution registry — the source of truth for the execution
|
|
92
|
+
// snapshot uploaded to the server. Keyed by `${entityType}:${entityUuid}`
|
|
93
|
+
// (the wake-triggering notification's target resource), so a resource appears
|
|
94
|
+
// at most once regardless of how many notifications target it. EVERY wake is
|
|
95
|
+
// tracked — task, idea (@-mention / elaboration under an idea), proposal, and
|
|
96
|
+
// document — not only task dispatches, so the server/UI can show "this daemon
|
|
97
|
+
// is processing <resource>" for any wake. Each entry carries the rootIdeaUuid
|
|
98
|
+
// the waker ALREADY resolved (reused, never re-walked) plus the daemon-side
|
|
99
|
+
// status/startedAt.
|
|
100
|
+
// The entry also holds the live `child` ChildProcess while RUNNING (子3) so the
|
|
101
|
+
// control handler can target it for an interrupt. `child` is null while queued.
|
|
102
|
+
// buildExecutionSnapshot() maps ONLY the serializable fields and NEVER emits
|
|
103
|
+
// `child` — the handle stays daemon-local and never leaks onto the wire.
|
|
104
|
+
/** @type {Map<string, { entityType: string, entityUuid: string, rootIdeaUuid: string|null, status: "running"|"queued", startedAt: string|null, child: import("node:child_process").ChildProcess|null }>} */
|
|
105
|
+
this.executions = new Map();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* Mark a running entity as INTERRUPTING (子3) — called by the control handler the
|
|
110
|
+
* moment an authorized interrupt is verified, BEFORE the killer signals the child.
|
|
111
|
+
* The wake's exit path reads this flag to report reason="user" (vs "crash"). Keyed
|
|
112
|
+
* the same as the execution registry so a control event and a wake agree on the
|
|
113
|
+
* entity. Idempotent; never throws.
|
|
114
|
+
* @param {string} entityType @param {string} entityUuid
|
|
115
|
+
*/
|
|
116
|
+
markInterrupting(entityType, entityUuid) {
|
|
117
|
+
this.interrupting.add(this.#execKey(entityType, entityUuid));
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** Recognized wake-triggering resource kinds the server's DaemonExecution accepts. */
|
|
121
|
+
// `daemon_session` is the ad-hoc conversation's own execution entity (子3 follow-up):
|
|
122
|
+
// an ad-hoc human_instruction wake has no task/idea/proposal/document behind it, so
|
|
123
|
+
// its running/interrupted state is reported against the DaemonSession itself, keyed by
|
|
124
|
+
// the session BUSINESS id (`sessionId`) — which is ALSO the Claude `--resume` anchor for
|
|
125
|
+
// an ad-hoc session, so the execution entity, the per-session UI match key, and the
|
|
126
|
+
// resume anchor are one and the same value (no identity divergence).
|
|
127
|
+
static #EXECUTION_ENTITY_TYPES = new Set([
|
|
128
|
+
"task",
|
|
129
|
+
"idea",
|
|
130
|
+
"proposal",
|
|
131
|
+
"document",
|
|
132
|
+
"daemon_session",
|
|
133
|
+
]);
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Extract the resource an execution row keys on for this notification — its
|
|
137
|
+
* `{ entityType, entityUuid }` — or null when the notification has no reportable
|
|
138
|
+
* target (missing fields, or an entityType outside the recognized set). Every
|
|
139
|
+
* recognized wake (task/idea/proposal/document) is reported, not only tasks.
|
|
140
|
+
* @param {{ entityType?: string, entityUuid?: string }} notification
|
|
141
|
+
* @returns {{ entityType: string, entityUuid: string }|null}
|
|
142
|
+
*/
|
|
143
|
+
#entityOf(notification) {
|
|
144
|
+
const { entityType, entityUuid } = notification ?? {};
|
|
145
|
+
if (
|
|
146
|
+
typeof entityType === "string" &&
|
|
147
|
+
typeof entityUuid === "string" &&
|
|
148
|
+
entityUuid.length > 0 &&
|
|
149
|
+
Waker.#EXECUTION_ENTITY_TYPES.has(entityType)
|
|
150
|
+
) {
|
|
151
|
+
return { entityType, entityUuid };
|
|
152
|
+
}
|
|
153
|
+
return null;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Registry key for a resource. */
|
|
157
|
+
#execKey(entityType, entityUuid) {
|
|
158
|
+
return `${entityType}:${entityUuid}`;
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Build the current execution snapshot for upload: one entry per tracked
|
|
163
|
+
* resource (running or queued), carrying entityType/entityUuid, the reused
|
|
164
|
+
* rootIdeaUuid, and the daemon-side status/startedAt. Returns a fresh array each
|
|
165
|
+
* call so the caller can't mutate internal state. Never throws.
|
|
166
|
+
* @returns {Array<{ entityType: string, entityUuid: string, rootIdeaUuid: string|null, status: "running"|"queued", startedAt: string|null }>}
|
|
167
|
+
*/
|
|
168
|
+
buildExecutionSnapshot() {
|
|
169
|
+
return [...this.executions.values()].map((e) => ({
|
|
170
|
+
entityType: e.entityType,
|
|
171
|
+
entityUuid: e.entityUuid,
|
|
172
|
+
rootIdeaUuid: e.rootIdeaUuid,
|
|
173
|
+
status: e.status,
|
|
174
|
+
startedAt: e.startedAt,
|
|
175
|
+
}));
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Record the wake's resource as QUEUED and emit a fresh snapshot. Called by the
|
|
180
|
+
* router at enqueue time (before the wake runs), so the server sees the resource
|
|
181
|
+
* waiting even while it sits behind a same-direct-idea wake. The rootIdeaUuid is
|
|
182
|
+
* the SERVER-RESOLVED root from `attribution` (NOT sliced from `key`, which now
|
|
183
|
+
* carries the direct idea) — the two-id contract. A notification with no
|
|
184
|
+
* reportable resource (missing fields, or an entityType outside the recognized
|
|
185
|
+
* task/idea/proposal/document set) is ignored. Never throws.
|
|
186
|
+
* @param {{ entityType?: string, entityUuid?: string }} notification
|
|
187
|
+
* @param {string} key The serialization key from keyFor (idea:<direct> | entity:…).
|
|
188
|
+
* @param {{ rootIdeaUuid?: string|null }} [attribution] Server-resolved root idea.
|
|
189
|
+
*/
|
|
190
|
+
markQueued(notification, key, attribution) {
|
|
191
|
+
const entity = this.#entityOf(notification);
|
|
192
|
+
if (!entity) return;
|
|
193
|
+
const execKey = this.#execKey(entity.entityType, entity.entityUuid);
|
|
194
|
+
const rootIdeaUuid = attribution?.rootIdeaUuid ?? null;
|
|
195
|
+
const existing = this.executions.get(execKey);
|
|
196
|
+
// Don't downgrade a running resource to queued if a duplicate dispatch
|
|
197
|
+
// arrives while it's mid-wake; only (re)mark queued when not already running.
|
|
198
|
+
if (existing && existing.status === "running") return;
|
|
199
|
+
this.executions.set(execKey, {
|
|
200
|
+
entityType: entity.entityType,
|
|
201
|
+
entityUuid: entity.entityUuid,
|
|
202
|
+
rootIdeaUuid,
|
|
203
|
+
status: "queued",
|
|
204
|
+
startedAt: existing?.startedAt ?? null,
|
|
205
|
+
// Queued entries hold no live child yet — only the running entry does (子3).
|
|
206
|
+
child: null,
|
|
207
|
+
});
|
|
208
|
+
this.#emitExecutionChange();
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
/** Fire-and-forget snapshot upload. Never throws into the wake path. */
|
|
212
|
+
#emitExecutionChange() {
|
|
213
|
+
try {
|
|
214
|
+
this.hooks?.onExecutionChange?.();
|
|
215
|
+
} catch (err) {
|
|
216
|
+
this.logger.warn(`[Chorus] execution-change hook failed: ${err}`);
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* Resolve an event to its serialization key + idea attribution WITHOUT running
|
|
222
|
+
* the wake. Used by the router to enqueue under the right key and to pass the
|
|
223
|
+
* resolved root down to markQueued/wake (so the snapshot's root is never derived
|
|
224
|
+
* from the key). The key — and the Claude session anchor — is the DIRECT idea;
|
|
225
|
+
* falls back to a per-entity key when there's no direct idea (so unrelated
|
|
226
|
+
* entities still get their own serial lane). One lineage resolution (cached).
|
|
227
|
+
* @param {any} notification
|
|
228
|
+
* @returns {Promise<{ key: string, rootIdeaUuid: string|null, directIdeaUuid: string|null }>}
|
|
229
|
+
*/
|
|
230
|
+
async keyFor(notification) {
|
|
231
|
+
const { rootIdeaUuid, directIdeaUuid } = await this.lineage.resolve(notification);
|
|
232
|
+
const key = directIdeaUuid
|
|
233
|
+
? `idea:${directIdeaUuid}`
|
|
234
|
+
: `entity:${notification.entityType}:${notification.entityUuid}`;
|
|
235
|
+
return { key, rootIdeaUuid, directIdeaUuid };
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
/**
|
|
239
|
+
* Run one wake. Never throws.
|
|
240
|
+
* @param {import("./prompts.mjs").NotificationDetail} notification
|
|
241
|
+
* @param {string} key The serialization key (from keyFor) — anchored on the direct idea.
|
|
242
|
+
* @param {{ rootIdeaUuid?: string|null, directIdeaUuid?: string|null }} [attribution]
|
|
243
|
+
* Server-resolved ids from keyFor. `rootIdeaUuid` → execution snapshot;
|
|
244
|
+
* `directIdeaUuid` → the deterministic Claude session id (when the entity has
|
|
245
|
+
* an idea ancestor). When there is no direct idea, the session is anchored on
|
|
246
|
+
* the entity's own uuid instead (see below).
|
|
247
|
+
*/
|
|
248
|
+
async wake(notification, key, attribution) {
|
|
249
|
+
let cfg;
|
|
250
|
+
const entity = this.#entityOf(notification);
|
|
251
|
+
const execKey = entity ? this.#execKey(entity.entityType, entity.entityUuid) : null;
|
|
252
|
+
// Both ids come from the resolved `attribution` (supplied by keyFor via the
|
|
253
|
+
// router) and are threaded SEPARATELY — NEVER sliced from `key`. The ROOT idea
|
|
254
|
+
// is reported in the snapshot; the DIRECT idea is the preferred session anchor.
|
|
255
|
+
const rootIdeaUuid = attribution?.rootIdeaUuid ?? null;
|
|
256
|
+
const directIdeaUuid = attribution?.directIdeaUuid ?? null;
|
|
257
|
+
// Per-wake lifecycle logging: stamp the start so completion can report a
|
|
258
|
+
// duration. `Date.now()` is fine here (runtime metric, not a resume seed).
|
|
259
|
+
const startMs = Date.now();
|
|
260
|
+
const target = entity ? `${entity.entityType}:${entity.entityUuid}` : key;
|
|
261
|
+
try {
|
|
262
|
+
const prompt = buildPrompt(notification);
|
|
263
|
+
if (!prompt) {
|
|
264
|
+
this.logger.info(`[Chorus] no wake prompt for action "${notification.action}" — skipping`);
|
|
265
|
+
return;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// Lifecycle line 1 — arrival: which action targets which idea/task/entity.
|
|
269
|
+
this.logger.info(`[Chorus] ▶ wake: ${notification.action} → ${target}`);
|
|
270
|
+
|
|
271
|
+
// Transition this resource to RUNNING with a start timestamp and emit a
|
|
272
|
+
// fresh snapshot, so the server/UI sees it leave the queue and begin
|
|
273
|
+
// executing. Report the server-resolved ROOT idea (not the direct-idea key).
|
|
274
|
+
// `child` starts null and is filled in by the spawner's onChild the moment the
|
|
275
|
+
// subprocess spawns (子3) — so the control handler can target it for interrupt.
|
|
276
|
+
if (entity && execKey) {
|
|
277
|
+
this.executions.set(execKey, {
|
|
278
|
+
entityType: entity.entityType,
|
|
279
|
+
entityUuid: entity.entityUuid,
|
|
280
|
+
rootIdeaUuid,
|
|
281
|
+
status: "running",
|
|
282
|
+
startedAt: new Date().toISOString(),
|
|
283
|
+
child: null,
|
|
284
|
+
});
|
|
285
|
+
this.#emitExecutionChange();
|
|
286
|
+
}
|
|
287
|
+
|
|
288
|
+
// Session anchor: the DIRECT idea uuid when the entity has an idea ancestor;
|
|
289
|
+
// otherwise the entity's OWN uuid (quick task, standalone doc, non-idea
|
|
290
|
+
// proposal). Both are deterministic Chorus uuids, so the session stays
|
|
291
|
+
// human-resumable (`claude --resume <uuid>`) and same-entity wakes continue
|
|
292
|
+
// the same session — and we never drop a wake just because there's no idea
|
|
293
|
+
// (the daemon's headline `task_assigned` for a quick task must still spawn).
|
|
294
|
+
// Decide new-vs-resume by probing the on-disk transcript in the SAME cwd we
|
|
295
|
+
// spawn in. The spawner re-validates the id is a lowercase UUID before
|
|
296
|
+
// spawning, so a garbage id surfaces visibly rather than misanchoring.
|
|
297
|
+
const sessionId = directIdeaUuid ?? notification.entityUuid ?? null;
|
|
298
|
+
const isNew = sessionId ? this.isNewSessionFn(sessionId, this.cwd) : true;
|
|
299
|
+
|
|
300
|
+
// Lifecycle line 2 — spawn: new vs resume, plus the (otherwise hidden)
|
|
301
|
+
// `claude --resume <id>` takeover hint so an operator can attach to the
|
|
302
|
+
// session from this daemon's working directory.
|
|
303
|
+
this.logger.info(
|
|
304
|
+
`[Chorus] ${isNew ? "spawning new" : "resuming"} session ${sessionId ?? "(none)"}` +
|
|
305
|
+
(sessionId ? ` — take over with: claude --resume ${sessionId}` : "")
|
|
306
|
+
);
|
|
307
|
+
if (this.verbose) {
|
|
308
|
+
this.logger.info(`[Chorus] cwd=${this.cwd} action=${notification.action} root=${rootIdeaUuid ?? "(none)"}`);
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
cfg = this.writeMcpConfigFn(this.creds);
|
|
312
|
+
|
|
313
|
+
await this.hooks?.onSessionStart?.({ rootIdeaKey: key, sessionId: sessionId ?? "", isNew });
|
|
314
|
+
|
|
315
|
+
// Turn lifecycle (子1): the server created a `pending` turn for this wake at the
|
|
316
|
+
// notification chokepoint, keyed on the same session business key the daemon
|
|
317
|
+
// anchors the Claude session on (`sessionId` = directIdeaUuid, or the entity uuid
|
|
318
|
+
// for an ad-hoc session). Advance it pending→running the moment the subprocess
|
|
319
|
+
// spawns (in onChild — guaranteed to fire only on a successful spawn), and
|
|
320
|
+
// running→ended after it exits. `turnAdvancedToRunning` gates the ended report so
|
|
321
|
+
// a spawn that never started (onChild never fired) does not attempt an illegal
|
|
322
|
+
// pending→ended transition. There is no separate turn registry — the turn is
|
|
323
|
+
// identified server-side by `sessionId`, which the waker already has here.
|
|
324
|
+
let turnAdvancedToRunning = false;
|
|
325
|
+
|
|
326
|
+
// Track the session id the stream reports so the transcript hook can use
|
|
327
|
+
// it even before spawner.wake() returns. (Do NOT reference the awaited
|
|
328
|
+
// `result` inside onMessage — it's in the temporal dead zone there.)
|
|
329
|
+
let observedSessionId = sessionId ?? "";
|
|
330
|
+
const result = await this.spawner.wake({
|
|
331
|
+
prompt,
|
|
332
|
+
sessionId,
|
|
333
|
+
isNew,
|
|
334
|
+
cwd: this.cwd,
|
|
335
|
+
mcpConfigPath: cfg.path,
|
|
336
|
+
// Capture the live child into the running execution entry the instant it
|
|
337
|
+
// spawns (子3) so the control handler can interrupt it mid-wake. Guarded so
|
|
338
|
+
// a re-keyed/dropped entry never throws here. ALSO advance the server turn
|
|
339
|
+
// pending→running here (子1) — same hook keying, no parallel registry — since
|
|
340
|
+
// this is the precise moment the subprocess actually started.
|
|
341
|
+
onChild: (child) => {
|
|
342
|
+
const entry = execKey ? this.executions.get(execKey) : null;
|
|
343
|
+
if (entry && entry.status === "running") entry.child = child;
|
|
344
|
+
if (sessionId) {
|
|
345
|
+
turnAdvancedToRunning = true;
|
|
346
|
+
// Fire-and-forget; #advanceTurn swallows + logs its own failures so a
|
|
347
|
+
// turn-report error never crashes the spawn callback (no-silent-errors).
|
|
348
|
+
this.#advanceTurn(sessionId, "running", entity).catch(() => {});
|
|
349
|
+
}
|
|
350
|
+
},
|
|
351
|
+
onMessage: (message) => {
|
|
352
|
+
if (message && typeof message.session_id === "string") observedSessionId = message.session_id;
|
|
353
|
+
// Fire-and-forget transcript hook (子1): keeps only user/assistant text and
|
|
354
|
+
// batch-POSTs to /api/daemon/transcript for the current turn. Warn-not-throw
|
|
355
|
+
// inside the hook; the trailing .catch is belt-and-braces so a rejected hook
|
|
356
|
+
// promise can never surface as an unhandled rejection in the wake path.
|
|
357
|
+
this.hooks
|
|
358
|
+
?.onTranscriptMessage?.({ rootIdeaKey: key, sessionId: observedSessionId, message })
|
|
359
|
+
.catch(() => {});
|
|
360
|
+
},
|
|
361
|
+
});
|
|
362
|
+
|
|
363
|
+
// No session map to persist anymore — the id is deterministic (= direct idea
|
|
364
|
+
// uuid) and the next wake re-derives new-vs-resume from disk. Just log a
|
|
365
|
+
// non-zero exit visibly (no-silent-errors).
|
|
366
|
+
if (result && result.exitCode !== 0) {
|
|
367
|
+
this.logger.warn(
|
|
368
|
+
`[Chorus] wake for ${key} exited non-zero (${result.exitCode})`
|
|
369
|
+
);
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
// Turn lifecycle (子1): the subprocess has exited — advance the server turn
|
|
373
|
+
// running→ended, regardless of exit code (a turn ends whether the run was clean,
|
|
374
|
+
// crashed, or interrupted). Only when it actually reached `running` (a never-
|
|
375
|
+
// spawned wake left the turn `pending`; a pending→ended skip is rejected server-
|
|
376
|
+
// side as invalid_transition). Swallow-safe; never throws into the wake path.
|
|
377
|
+
if (sessionId && turnAdvancedToRunning) {
|
|
378
|
+
await this.#advanceTurn(sessionId, "ended", entity);
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// Interrupt-vs-crash reporting (子3, Tech Design "Interrupt vs crash
|
|
382
|
+
// reporting"). Decide from the per-entity "interrupting" flag the control
|
|
383
|
+
// handler may have set while the subprocess was running:
|
|
384
|
+
// • interrupting flag set → interrupted(reason="user")
|
|
385
|
+
// • no flag AND non-zero/null exit → interrupted(reason="crash")
|
|
386
|
+
// • clean exit (code 0) → nothing (unchanged)
|
|
387
|
+
// The interrupted state is entity-generic — it lives on the DaemonExecution
|
|
388
|
+
// row (keyed connection+entity), so the reporter records it for ANY recognized
|
|
389
|
+
// wake resource (task/idea/proposal/document), not only tasks.
|
|
390
|
+
if (entity && execKey) {
|
|
391
|
+
const wasInterrupting = this.interrupting.has(execKey);
|
|
392
|
+
const cleanExit = result && result.exitCode === 0;
|
|
393
|
+
if (wasInterrupting) {
|
|
394
|
+
await this.#report(entity, "user");
|
|
395
|
+
} else if (!cleanExit) {
|
|
396
|
+
// No interrupt requested but the subprocess did not exit cleanly (non-zero
|
|
397
|
+
// code, or null from a spawn/transport failure) → treat as a crash.
|
|
398
|
+
await this.#report(entity, "crash");
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
|
|
402
|
+
// Lifecycle line 3 — completion: duration + exit code, one compact line.
|
|
403
|
+
const durationMs = Date.now() - startMs;
|
|
404
|
+
this.logger.info(
|
|
405
|
+
`[Chorus] ✓ wake done: ${target} (exit=${result?.exitCode ?? "?"}, ${durationMs}ms)`
|
|
406
|
+
);
|
|
407
|
+
if (this.verbose) {
|
|
408
|
+
this.logger.info(
|
|
409
|
+
`[Chorus] action=${notification.action} session=${result?.sessionId} key=${key}`
|
|
410
|
+
);
|
|
411
|
+
}
|
|
412
|
+
} catch (err) {
|
|
413
|
+
this.logger.warn(`[Chorus] wake failed for ${key}: ${err}`);
|
|
414
|
+
} finally {
|
|
415
|
+
// Wake finished (cleanly or not): the resource leaves the active set. Drop
|
|
416
|
+
// it and emit a fresh snapshot so the server ends its running/queued row.
|
|
417
|
+
// The server reconcile is snapshot-authoritative, so absence == ended. Also
|
|
418
|
+
// clear the per-entity interrupting flag so it can never leak into a later
|
|
419
|
+
// wake of the same entity.
|
|
420
|
+
if (execKey) {
|
|
421
|
+
this.interrupting.delete(execKey);
|
|
422
|
+
if (this.executions.delete(execKey)) {
|
|
423
|
+
this.#emitExecutionChange();
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
try {
|
|
427
|
+
cfg?.cleanup?.();
|
|
428
|
+
} catch {
|
|
429
|
+
// best-effort
|
|
430
|
+
}
|
|
431
|
+
}
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* Report an interrupted/crashed outcome via the injected reporter. Never throws
|
|
436
|
+
* into the wake path — a reporter failure is logged and swallowed (the reporter
|
|
437
|
+
* itself already swallows, this is belt-and-braces).
|
|
438
|
+
* @param {{ entityType: string, entityUuid: string }} entity
|
|
439
|
+
* @param {"user"|"crash"} reason
|
|
440
|
+
*/
|
|
441
|
+
async #report(entity, reason) {
|
|
442
|
+
try {
|
|
443
|
+
await this.reportInterrupt(entity.entityType, entity.entityUuid, reason);
|
|
444
|
+
} catch (err) {
|
|
445
|
+
this.logger.warn(
|
|
446
|
+
`[Chorus] reportInterrupt failed for ${entity.entityType}:${entity.entityUuid} (${reason}): ${err}`
|
|
447
|
+
);
|
|
448
|
+
}
|
|
449
|
+
}
|
|
450
|
+
|
|
451
|
+
/**
|
|
452
|
+
* Advance the server-side DaemonSessionTurn for this wake (子1) via the injected
|
|
453
|
+
* reporter. Identified server-side by the session business key (`sessionId`); the
|
|
454
|
+
* optional `entity` ({ entityType, entityUuid }) lets the server stamp the weak
|
|
455
|
+
* executionUuid link from the live execution row. Never throws into the wake path —
|
|
456
|
+
* a reporter failure is logged and swallowed (the REST reporter already swallows;
|
|
457
|
+
* this is belt-and-braces, matching #report).
|
|
458
|
+
* @param {string} sessionId @param {"running"|"ended"} status
|
|
459
|
+
* @param {{ entityType: string, entityUuid: string }|null} entity
|
|
460
|
+
*/
|
|
461
|
+
async #advanceTurn(sessionId, status, entity) {
|
|
462
|
+
try {
|
|
463
|
+
await this.advanceTurn({
|
|
464
|
+
sessionId,
|
|
465
|
+
status,
|
|
466
|
+
entityType: entity?.entityType ?? null,
|
|
467
|
+
entityUuid: entity?.entityUuid ?? null,
|
|
468
|
+
});
|
|
469
|
+
} catch (err) {
|
|
470
|
+
this.logger.warn(
|
|
471
|
+
`[Chorus] advanceTurn failed for session ${sessionId} → ${status}: ${err}`
|
|
472
|
+
);
|
|
473
|
+
}
|
|
474
|
+
}
|
|
475
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chorus-aidlc/chorus",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.1",
|
|
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": {
|
|
@@ -22,6 +22,8 @@
|
|
|
22
22
|
},
|
|
23
23
|
"files": [
|
|
24
24
|
"chorus.mjs",
|
|
25
|
+
"cli/**/*.mjs",
|
|
26
|
+
"!cli/**/__tests__/**",
|
|
25
27
|
".next/standalone/",
|
|
26
28
|
"prisma/schema.prisma",
|
|
27
29
|
"prisma/migrations/",
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "DaemonConnection" (
|
|
3
|
+
"id" SERIAL NOT NULL,
|
|
4
|
+
"uuid" TEXT NOT NULL,
|
|
5
|
+
"companyUuid" TEXT NOT NULL,
|
|
6
|
+
"agentUuid" TEXT NOT NULL,
|
|
7
|
+
"clientType" TEXT NOT NULL,
|
|
8
|
+
"clientVersion" TEXT,
|
|
9
|
+
"host" TEXT NOT NULL DEFAULT '',
|
|
10
|
+
"startedAt" TIMESTAMP(3),
|
|
11
|
+
"status" TEXT NOT NULL DEFAULT 'online',
|
|
12
|
+
"connectedAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
13
|
+
"lastSeenAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
14
|
+
"disconnectedAt" TIMESTAMP(3),
|
|
15
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
16
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
17
|
+
|
|
18
|
+
CONSTRAINT "DaemonConnection_pkey" PRIMARY KEY ("id")
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
-- CreateIndex
|
|
22
|
+
CREATE UNIQUE INDEX "DaemonConnection_uuid_key" ON "DaemonConnection"("uuid");
|
|
23
|
+
|
|
24
|
+
-- CreateIndex
|
|
25
|
+
CREATE INDEX "DaemonConnection_companyUuid_idx" ON "DaemonConnection"("companyUuid");
|
|
26
|
+
|
|
27
|
+
-- CreateIndex
|
|
28
|
+
CREATE INDEX "DaemonConnection_agentUuid_idx" ON "DaemonConnection"("agentUuid");
|
|
29
|
+
|
|
30
|
+
-- CreateIndex
|
|
31
|
+
CREATE INDEX "DaemonConnection_status_idx" ON "DaemonConnection"("status");
|
|
32
|
+
|
|
33
|
+
-- CreateIndex
|
|
34
|
+
CREATE INDEX "DaemonConnection_lastSeenAt_idx" ON "DaemonConnection"("lastSeenAt");
|
|
35
|
+
|
|
36
|
+
-- CreateIndex
|
|
37
|
+
CREATE UNIQUE INDEX "DaemonConnection_agentUuid_clientType_host_key" ON "DaemonConnection"("agentUuid", "clientType", "host");
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
-- CreateTable
|
|
2
|
+
CREATE TABLE "DaemonTaskExecution" (
|
|
3
|
+
"id" SERIAL NOT NULL,
|
|
4
|
+
"uuid" TEXT NOT NULL,
|
|
5
|
+
"companyUuid" TEXT NOT NULL,
|
|
6
|
+
"agentUuid" TEXT NOT NULL,
|
|
7
|
+
"connectionUuid" TEXT NOT NULL,
|
|
8
|
+
"taskUuid" TEXT NOT NULL,
|
|
9
|
+
"rootIdeaUuid" TEXT,
|
|
10
|
+
"status" TEXT NOT NULL,
|
|
11
|
+
"startedAt" TIMESTAMP(3),
|
|
12
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
13
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
14
|
+
|
|
15
|
+
CONSTRAINT "DaemonTaskExecution_pkey" PRIMARY KEY ("id")
|
|
16
|
+
);
|
|
17
|
+
|
|
18
|
+
-- CreateIndex
|
|
19
|
+
CREATE UNIQUE INDEX "DaemonTaskExecution_uuid_key" ON "DaemonTaskExecution"("uuid");
|
|
20
|
+
|
|
21
|
+
-- CreateIndex
|
|
22
|
+
CREATE INDEX "DaemonTaskExecution_connectionUuid_status_idx" ON "DaemonTaskExecution"("connectionUuid", "status");
|
|
23
|
+
|
|
24
|
+
-- CreateIndex
|
|
25
|
+
CREATE INDEX "DaemonTaskExecution_companyUuid_agentUuid_idx" ON "DaemonTaskExecution"("companyUuid", "agentUuid");
|
|
26
|
+
|
|
27
|
+
-- CreateIndex
|
|
28
|
+
CREATE UNIQUE INDEX "DaemonTaskExecution_connectionUuid_taskUuid_key" ON "DaemonTaskExecution"("connectionUuid", "taskUuid");
|
package/prisma/migrations/20260617013334_generalize_daemon_execution_to_any_resource/migration.sql
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Warnings:
|
|
3
|
+
|
|
4
|
+
- You are about to drop the `DaemonTaskExecution` table. If the table is not empty, all the data it contains will be lost.
|
|
5
|
+
|
|
6
|
+
*/
|
|
7
|
+
-- DropTable
|
|
8
|
+
DROP TABLE "DaemonTaskExecution";
|
|
9
|
+
|
|
10
|
+
-- CreateTable
|
|
11
|
+
CREATE TABLE "DaemonExecution" (
|
|
12
|
+
"id" SERIAL NOT NULL,
|
|
13
|
+
"uuid" TEXT NOT NULL,
|
|
14
|
+
"companyUuid" TEXT NOT NULL,
|
|
15
|
+
"agentUuid" TEXT NOT NULL,
|
|
16
|
+
"connectionUuid" TEXT NOT NULL,
|
|
17
|
+
"entityType" TEXT NOT NULL,
|
|
18
|
+
"entityUuid" TEXT NOT NULL,
|
|
19
|
+
"rootIdeaUuid" TEXT,
|
|
20
|
+
"status" TEXT NOT NULL,
|
|
21
|
+
"startedAt" TIMESTAMP(3),
|
|
22
|
+
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
|
23
|
+
"updatedAt" TIMESTAMP(3) NOT NULL,
|
|
24
|
+
|
|
25
|
+
CONSTRAINT "DaemonExecution_pkey" PRIMARY KEY ("id")
|
|
26
|
+
);
|
|
27
|
+
|
|
28
|
+
-- CreateIndex
|
|
29
|
+
CREATE UNIQUE INDEX "DaemonExecution_uuid_key" ON "DaemonExecution"("uuid");
|
|
30
|
+
|
|
31
|
+
-- CreateIndex
|
|
32
|
+
CREATE INDEX "DaemonExecution_connectionUuid_status_idx" ON "DaemonExecution"("connectionUuid", "status");
|
|
33
|
+
|
|
34
|
+
-- CreateIndex
|
|
35
|
+
CREATE INDEX "DaemonExecution_companyUuid_agentUuid_idx" ON "DaemonExecution"("companyUuid", "agentUuid");
|
|
36
|
+
|
|
37
|
+
-- CreateIndex
|
|
38
|
+
CREATE UNIQUE INDEX "DaemonExecution_connectionUuid_entityType_entityUuid_key" ON "DaemonExecution"("connectionUuid", "entityType", "entityUuid");
|