@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
|
@@ -4,7 +4,7 @@ description: Full-auto AI-DLC pipeline — drive a single prompt from Idea throu
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.11.1"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -25,6 +25,7 @@ You take a natural-language description of what to build, and you handle everyth
|
|
|
25
25
|
2. **Proposal Review** — adversarial review loop against the `proposal-reviewer-chorus` skill.
|
|
26
26
|
3. **Execution** — dependency-ordered, wave-based task dispatch.
|
|
27
27
|
4. **Verification** — adversarial review loop against the `task-reviewer-chorus` skill + admin verify.
|
|
28
|
+
4.5. **Code-Review Gateway** — adversarial review loop against the `code-reviewer-chorus` skill over the Idea's aggregate change, before ship (FAIL → add fix tasks → re-run).
|
|
28
29
|
5. **Report** — completion summary + a mandatory Idea Completion Report.
|
|
29
30
|
|
|
30
31
|
```
|
|
@@ -47,6 +48,9 @@ Verification loop (up to maxTaskReviewRounds, default 3)
|
|
|
47
48
|
| PASS / PASS WITH NOTES -> mark AC + verify ; FAIL -> reopen
|
|
48
49
|
| verify unblocks dependents -> loop back to Execution
|
|
49
50
|
v
|
|
51
|
+
Code-Review Gateway (all tasks done; up to maxCodeReviewRounds, default 3)
|
|
52
|
+
| PASS / PASS WITH NOTES -> ship ; FAIL -> add fix tasks -> Execution -> re-run
|
|
53
|
+
v
|
|
50
54
|
Done --> Report summary + mandatory Idea Completion Report
|
|
51
55
|
```
|
|
52
56
|
|
|
@@ -453,6 +457,33 @@ After verifying every task in the wave, return to **Phase 3** and re-run `chorus
|
|
|
453
457
|
|
|
454
458
|
---
|
|
455
459
|
|
|
460
|
+
### Phase 4.5: Code-Review Gateway (mandatory pre-ship)
|
|
461
|
+
|
|
462
|
+
Once **every** task of the idea's proposal is verified (`done`) — Phase 3 finds no more unblocked tasks and none remain non-terminal — run the final ship-time code-review gateway **before** the Phase 5b completion report. This is the same **Independent Review pattern** as Phases 2 and 4, pointed at the `code-reviewer-chorus` skill — but it reviews the **whole Idea's aggregate code change** (across all tasks), not a single task, and posts its verdict on the **Idea**.
|
|
463
|
+
|
|
464
|
+
> **Independent Review pattern (framework-neutral).** Spawn a **read-only** sub-agent and have it load the `code-reviewer-chorus` skill (`<BASE_URL>/skill/code-reviewer-chorus/SKILL.md`), pass it the `ideaUuid` and the current review round number, and instruct it to post exactly one `VERDICT` comment on the **idea**. It reviews cross-task integration, architecture/convention consistency, security, regression/performance, and feature-level test coverage — dimensions a single-task review cannot see — and may run read-only tests/build/lint, but never writes. After it returns, read the verdict via `chorus_get_comments({ targetType: "idea", targetUuid: "<idea-uuid>" })`.
|
|
465
|
+
>
|
|
466
|
+
> - Claude Code: dispatch a read-only sub-agent with the Task/Agent tool, mounting the `code-reviewer-chorus` skill.
|
|
467
|
+
> - Codex: `spawn_agent` with the `code-reviewer-chorus` skill and the `ideaUuid`.
|
|
468
|
+
|
|
469
|
+
> **Inline self-review fallback (no sub-agents available).** Perform the review inline as the main agent: read `code-reviewer-chorus`, follow its procedure (fetch the idea, its approved proposals + documents + tasks; infer the aggregate diff from task reports + `git log/diff`; review the six whole-feature dimensions; run the project's build/test), and post your own `VERDICT` comment on the idea.
|
|
470
|
+
|
|
471
|
+
Act on the verdict:
|
|
472
|
+
|
|
473
|
+
- **`VERDICT: PASS` / `PASS WITH NOTES`** — the feature is cleared to ship. Proceed to Phase 5 / 5b.
|
|
474
|
+
- **`VERDICT: FAIL`** — do NOT ship. Read the BLOCKERs, then fix them via the **quick-dev** workflow (`<BASE_URL>/skill/quick-dev-chorus/SKILL.md`): call `chorus_create_tasks` with `proposalUuid` set to the **current approved proposal** so the fix tasks attach to it (not standalone) — do **not** reopen the already-verified tasks. Drive the fix tasks through Phase 3 → Phase 4, then re-spawn the code-reviewer for the next round. Loop bounded by `maxCodeReviewRounds` (default **3**; 0 = unlimited).
|
|
475
|
+
|
|
476
|
+
```
|
|
477
|
+
ESCALATE: "Idea '<title>' failed code review after 3 rounds. Last BLOCKERs: <list>.
|
|
478
|
+
Manual intervention needed. Idea UUID: <idea-uuid>."
|
|
479
|
+
```
|
|
480
|
+
|
|
481
|
+
**No VERDICT comment after the code-reviewer returns?** It exhausted its turn budget (it carries a larger budget than the task-reviewer because it reviews the whole feature). Respawn it once with a concise-budget hint; if still none, treat as **PASS WITH NOTES** and proceed — do not loop forever.
|
|
482
|
+
|
|
483
|
+
> The gateway is **behavioral**, consistent with the other two reviewers: its verdict is advisory and does not change the Idea's stored status; the orchestrator honors it. It runs **before** the completion report so the report is never written while a FAIL is outstanding.
|
|
484
|
+
|
|
485
|
+
---
|
|
486
|
+
|
|
456
487
|
### Phase 5: Report
|
|
457
488
|
|
|
458
489
|
When all waves complete, output a markdown summary:
|
|
@@ -485,6 +516,8 @@ When all waves complete, output a markdown summary:
|
|
|
485
516
|
|
|
486
517
|
A successful yolo run always finishes the Idea. Call `chorus_create_report` **exactly once**, with `proposalUuid` set to the **last verified proposal**. The tool's own description carries the section template — follow it. Surface the returned `documentUuid` in the Phase 5 summary table. Skipping this is a protocol violation.
|
|
487
518
|
|
|
519
|
+
> **Order:** write the completion report only **after** the Phase 4.5 code-review gateway returns PASS / PASS WITH NOTES. Never write it while a code-review FAIL is outstanding — the report is a ship-time summary, and the gateway is what clears the feature to ship.
|
|
520
|
+
|
|
488
521
|
```
|
|
489
522
|
result = chorus_create_report({
|
|
490
523
|
proposalUuid: "<last-verified-proposal-uuid>",
|
|
@@ -503,6 +536,7 @@ result = chorus_create_report({
|
|
|
503
536
|
| Project creation fails | Report the error; suggest the user create the project manually and rerun with an existing-project hint. |
|
|
504
537
|
| Proposal review FAILs after `maxProposalReviewRounds` (3) | Stop the pipeline; report the persisting BLOCKERs; recommend manual review of the proposal. |
|
|
505
538
|
| Task review FAILs after `maxTaskReviewRounds` (3) | Flag the task as escalation-needed; continue with the other tasks. |
|
|
539
|
+
| Code-review gateway FAILs after `maxCodeReviewRounds` (3) | Stop before ship; escalate the persisting feature-level BLOCKERs to a human (Idea UUID); do not write the completion report. |
|
|
506
540
|
| Reviewer returns no VERDICT | Respawn the reviewer once with a concise-budget hint; if still none, treat as PASS WITH NOTES and proceed. |
|
|
507
541
|
| Worker crashes / never submits | Log it, leave the task non-`to_verify`; re-pick it in a later wave or escalate if it stays stuck. |
|
|
508
542
|
| No unblocked tasks but some not done | Stuck DAG (failed reviews or bad dependencies). Break with an escalation report; do not loop. |
|
package/README.md
CHANGED
|
@@ -36,6 +36,10 @@ The labels under each stage are the **permissions** an actor needs at that stage
|
|
|
36
36
|
|
|
37
37
|
## What's New
|
|
38
38
|
|
|
39
|
+
**[v0.11.0](https://chorus-ai.dev/blog/chorus-v0.11.0-release/)** — The Chorus Daemon: `chorus daemon` turns your machine into a resident agent runtime that wakes a local Claude Code on each dispatch. An Agent Connections surface gives live observability and control — streaming transcripts, instruction injection, and interrupt / resume — and a "Verify Elaborate" button wakes the assigned agent to write the proposal.
|
|
40
|
+
|
|
41
|
+
**[v0.10.0](https://chorus-ai.dev/blog/chorus-v0.10.0-release/)** — Single-parent idea lineage: an idea may derive a child or be attached under another, forming a forest. The relation is intentionally weak — a parent surfaces a read-only "+N derived" rollup and does not constrain any child's elaboration, proposal, or task flow. Idea browsing consolidates onto the Dashboard (a three-way Ideas / Lineage / Stats view switch with an adaptive default); the standalone Idea List page is retired and its URLs 308-redirect to the Dashboard.
|
|
42
|
+
|
|
39
43
|
**[v0.9.4](https://chorus-ai.dev/blog/chorus-v0.9.4-release/)** — OpenClaw plugin rewritten on the OpenClaw 2026.4.27 Plugin SDK (native MCP registration, `runEmbeddedAgent` for SSE wake, reviewers as native skills); Codex plugin hooks now ship inside the package, with an installer that cleans up legacy hook copies in the user directory.
|
|
40
44
|
|
|
41
45
|
**[v0.9.0](https://chorus-ai.dev/blog/chorus-v0.9.0-release/)** — Brainstorm skill for fuzzy ideas (open-ended chat before structured Q&A) and idea-completion reports (every shipped idea gets a Summary / Decisions / Follow-ups writeup, surfaced on the idea overview).
|
|
@@ -98,6 +102,31 @@ DATABASE_URL=postgresql://user:pass@host:5432/chorus chorus
|
|
|
98
102
|
| **Docker (full stack)** | [`docker compose up`](#quick-start-with-docker-recommended) (PostgreSQL + Redis + Chorus) |
|
|
99
103
|
| **AWS CDK** | [Deploy to AWS](#deploy-to-aws) |
|
|
100
104
|
|
|
105
|
+
### `chorus daemon` — Connect as Agent Runtime
|
|
106
|
+
|
|
107
|
+
The `chorus daemon` connects your local machine to a remote Chorus server as an agent runtime and executes tasks assigned by Chorus.
|
|
108
|
+
|
|
109
|
+
> **Current version:** Only **Claude Code** is supported. Support for other agent CLIs (Codex, Copilot, etc.) is planned for future releases.
|
|
110
|
+
|
|
111
|
+
```bash
|
|
112
|
+
chorus login # Authenticate (opens browser)
|
|
113
|
+
chorus daemon # Start daemon in foreground
|
|
114
|
+
chorus daemon -d # Start daemon in background (detached)
|
|
115
|
+
chorus daemon stop # Stop background daemon
|
|
116
|
+
chorus daemon status # Check daemon status
|
|
117
|
+
chorus daemon restart # Restart background daemon
|
|
118
|
+
chorus daemon logs # View daemon logs
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
**Key features:**
|
|
122
|
+
|
|
123
|
+
- **Claude Code integration** — Auto-detects `claude` CLI on your PATH
|
|
124
|
+
- **Background mode** — Run with `-d` flag; manage with `stop/restart/logs`
|
|
125
|
+
- **Permission modes** — Default is full access (yolo); use `--chorus-only` to restrict to Chorus MCP tools only
|
|
126
|
+
- **Interactive setup** — Prompts for credentials on first start if not already configured
|
|
127
|
+
|
|
128
|
+
The daemon requires authentication. Run `chorus login` first, or it will prompt for credentials interactively on first start (if running in a terminal).
|
|
129
|
+
|
|
101
130
|
---
|
|
102
131
|
|
|
103
132
|
## Screenshots
|
package/README.zh.md
CHANGED
|
@@ -27,6 +27,10 @@ Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Veri
|
|
|
27
27
|
|
|
28
28
|
## 最近更新
|
|
29
29
|
|
|
30
|
+
**[v0.11.0](https://chorus-ai.dev/zh/blog/chorus-v0.11.0-release/)** — Chorus Daemon:`chorus daemon` 将本机变为常驻 Agent 运行时,在每次派发时唤起本地 Claude Code。Agent Connections 界面提供实时可观测与控制:流式 transcript、指令注入、打断 / 恢复;新增"完成细化"按钮,唤起被指派的 Agent 撰写提案。
|
|
31
|
+
|
|
32
|
+
**[v0.10.0](https://chorus-ai.dev/zh/blog/chorus-v0.10.0-release/)** — 单父想法血缘:一条想法可派生子想法或挂靠至另一条之下,构成森林结构。该关联为弱关联,父想法仅呈现只读的 "+N derived" 汇总,不约束子想法的细化、提案与任务流程。想法浏览统一收敛至 Dashboard(Ideas / Lineage / Stats 三档视图切换,支持自适应默认);独立的 Idea List 页面下线,原 URL 经 308 重定向至 Dashboard。
|
|
33
|
+
|
|
30
34
|
**[v0.9.4](https://chorus-ai.dev/zh/blog/chorus-v0.9.4-release/)** — OpenClaw 插件基于 OpenClaw 2026.4.27 Plugin SDK 全面重写(原生 MCP 注册、`runEmbeddedAgent` 处理 SSE 唤醒、reviewer 改为原生 skill);Codex 插件 hook 改为随插件包分发,安装器同时清理用户目录中的历史 hook 拷贝。
|
|
31
35
|
|
|
32
36
|
**[v0.9.0](https://chorus-ai.dev/zh/blog/chorus-v0.9.0-release/)** — 头脑风暴 skill 帮你把模糊的想法聊出形状(在结构化多选题前先开放式对话),想法落地后自动生成总结报告(Summary / Decisions / Follow-ups 三段式,挂在想法概览页)。
|
|
@@ -89,6 +93,31 @@ DATABASE_URL=postgresql://user:pass@host:5432/chorus chorus
|
|
|
89
93
|
| **Docker(完整版)** | [`docker compose up`](#docker-一键启动推荐)(PostgreSQL + Redis + Chorus) |
|
|
90
94
|
| **AWS CDK** | [部署到 AWS](#部署到-aws) |
|
|
91
95
|
|
|
96
|
+
### `chorus daemon` — 作为 Agent 运行时连接
|
|
97
|
+
|
|
98
|
+
`chorus daemon` 将你的本地机器作为 Agent 运行时连接到远程 Chorus 服务器并执行 Chorus 分配的任务。
|
|
99
|
+
|
|
100
|
+
> **当前版本:** 仅支持 **Claude Code**。对其他 Agent CLI(Codex、Copilot 等)的支持计划在未来版本中实现。
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
chorus login # 认证(打开浏览器)
|
|
104
|
+
chorus daemon # 前台启动 daemon
|
|
105
|
+
chorus daemon -d # 后台启动 daemon(分离模式)
|
|
106
|
+
chorus daemon stop # 停止后台 daemon
|
|
107
|
+
chorus daemon status # 查看 daemon 状态
|
|
108
|
+
chorus daemon restart # 重启后台 daemon
|
|
109
|
+
chorus daemon logs # 查看 daemon 日志
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
**主要特性:**
|
|
113
|
+
|
|
114
|
+
- **Claude Code 集成** — 自动检测 PATH 中的 `claude` CLI
|
|
115
|
+
- **后台模式** — 使用 `-d` 标志后台运行;用 `stop/restart/logs` 管理
|
|
116
|
+
- **权限模式** — 默认完全访问(yolo);使用 `--chorus-only` 限制为仅 Chorus MCP 工具
|
|
117
|
+
- **交互式设置** — 首次启动时如未配置凭证会提示输入
|
|
118
|
+
|
|
119
|
+
daemon 需要先认证。首次使用请先运行 `chorus login`,或者 daemon 会在首次启动时交互式提示输入凭证(如果在终端中运行)。
|
|
120
|
+
|
|
92
121
|
---
|
|
93
122
|
|
|
94
123
|
## 界面预览
|
package/chorus.mjs
CHANGED
|
@@ -16,6 +16,73 @@ import { fileURLToPath, pathToFileURL } from "node:url";
|
|
|
16
16
|
|
|
17
17
|
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
18
18
|
|
|
19
|
+
// ---------------------------------------------------------------------------
|
|
20
|
+
// Subcommand router (client-mode commands)
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// `chorus` with no subcommand (or the existing server flags) launches the
|
|
23
|
+
// Next.js server exactly as before. `chorus daemon` and `chorus login` are
|
|
24
|
+
// client commands that connect OUT to a remote Chorus server. Their modules are
|
|
25
|
+
// lazy-imported so the server-launch path pays no startup cost.
|
|
26
|
+
|
|
27
|
+
const SUBCOMMANDS = new Set(["daemon", "login"]);
|
|
28
|
+
|
|
29
|
+
// Client-subcommand arg parsing + help text live in cli/client-args.mjs so they
|
|
30
|
+
// are pure and unit-testable (this entry module runs side effects at import).
|
|
31
|
+
import {
|
|
32
|
+
parseClientFlags,
|
|
33
|
+
parseDaemonAction,
|
|
34
|
+
daemonHelpText,
|
|
35
|
+
loginHelpText,
|
|
36
|
+
} from "./cli/client-args.mjs";
|
|
37
|
+
|
|
38
|
+
/** Read the package version once for help/version output. */
|
|
39
|
+
function pkgVersion() {
|
|
40
|
+
return JSON.parse(readFileSync(join(__dirname, "package.json"), "utf8")).version;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
async function runSubcommand(name, rest) {
|
|
44
|
+
const flags = parseClientFlags(rest);
|
|
45
|
+
|
|
46
|
+
// Per-subcommand --help / -h fast-path: print subcommand-specific help and
|
|
47
|
+
// exit WITHOUT starting the daemon/login. (The server --help fast-path below
|
|
48
|
+
// is skipped for subcommands, so this is the only place client help is shown.)
|
|
49
|
+
if (flags.help) {
|
|
50
|
+
process.stdout.write(name === "login" ? loginHelpText(pkgVersion()) : daemonHelpText(pkgVersion()));
|
|
51
|
+
return 0;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (name === "login") {
|
|
55
|
+
const { runLogin } = await import("./cli/login.mjs");
|
|
56
|
+
return runLogin(flags);
|
|
57
|
+
}
|
|
58
|
+
if (name === "daemon") {
|
|
59
|
+
const action = parseDaemonAction(rest);
|
|
60
|
+
const { runDaemon } = await import("./cli/daemon.mjs");
|
|
61
|
+
// Lifecycle sub-actions (stop/status/restart/logs) are handled by the
|
|
62
|
+
// background-lifecycle module the daemon wires in; `run` is the normal
|
|
63
|
+
// long-lived daemon. We pass the resolved action through so a later task
|
|
64
|
+
// can dispatch it without re-parsing.
|
|
65
|
+
return runDaemon({ ...flags, action });
|
|
66
|
+
}
|
|
67
|
+
return 1;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
{
|
|
71
|
+
const sub = process.argv[2];
|
|
72
|
+
if (sub && SUBCOMMANDS.has(sub)) {
|
|
73
|
+
runSubcommand(sub, process.argv.slice(3))
|
|
74
|
+
.then((code) => process.exit(typeof code === "number" ? code : 0))
|
|
75
|
+
.catch((err) => {
|
|
76
|
+
console.error(`Fatal error in 'chorus ${sub}':`, err);
|
|
77
|
+
process.exit(1);
|
|
78
|
+
});
|
|
79
|
+
// Stop the server-launch module body from executing in this process tick.
|
|
80
|
+
// The promise above owns process lifetime from here.
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
const isSubcommand = SUBCOMMANDS.has(process.argv[2]);
|
|
85
|
+
|
|
19
86
|
// ---------------------------------------------------------------------------
|
|
20
87
|
// Dependency resolution (hoist-safe — see issue #214)
|
|
21
88
|
// ---------------------------------------------------------------------------
|
|
@@ -57,16 +124,21 @@ function hasFlag(long, short) {
|
|
|
57
124
|
return args.includes(long) || args.includes(short);
|
|
58
125
|
}
|
|
59
126
|
|
|
60
|
-
// --help / --version fast paths
|
|
61
|
-
|
|
127
|
+
// --help / --version fast paths (skipped when a client subcommand was dispatched —
|
|
128
|
+
// e.g. `chorus login --help` belongs to the subcommand, not the server)
|
|
129
|
+
if (!isSubcommand && hasFlag("--help", "-h")) {
|
|
62
130
|
const pkg = JSON.parse(readFileSync(join(__dirname, "package.json"), "utf8"));
|
|
63
131
|
process.stdout.write(`
|
|
64
132
|
Chorus v${pkg.version} — AI Agent & Human collaboration platform
|
|
65
133
|
|
|
66
134
|
USAGE
|
|
67
|
-
chorus [options]
|
|
135
|
+
chorus [options] Start the Chorus server (default)
|
|
136
|
+
chorus login [--url --api-key] Authenticate as an agent; saves ~/.chorus/daemon.json
|
|
137
|
+
chorus daemon [--url --api-key] Connect to a remote Chorus server, subscribe to the
|
|
138
|
+
agent notification stream, and wake a local headless
|
|
139
|
+
Claude Code on task dispatch
|
|
68
140
|
|
|
69
|
-
OPTIONS
|
|
141
|
+
SERVER OPTIONS
|
|
70
142
|
-p, --port <port> HTTP server port (default: 8637, env: PORT)
|
|
71
143
|
-d, --data-dir <path> Data directory for PGlite (default: ~/.chorus-data, env: CHORUS_DATA_DIR)
|
|
72
144
|
--hostname <host> Bind address (default: 0.0.0.0)
|
|
@@ -84,16 +156,38 @@ ENVIRONMENT VARIABLES
|
|
|
84
156
|
NEXTAUTH_SECRET Session signing secret (auto-generated if unset)
|
|
85
157
|
COOKIE_SECURE Set to "true" for HTTPS deployments
|
|
86
158
|
|
|
159
|
+
DAEMON / LOGIN (client mode)
|
|
160
|
+
--url <url> Remote Chorus server URL (env: CHORUS_URL)
|
|
161
|
+
--api-key <cho_...> Agent API key (env: CHORUS_API_KEY)
|
|
162
|
+
--yolo Give the woken Claude FULL permissions (env: CHORUS_YOLO=1)
|
|
163
|
+
(--dangerously-skip-permissions: Bash, file writes,
|
|
164
|
+
any command). Default is Chorus-MCP-tools-only.
|
|
165
|
+
--sigint-timeout <ms> Grace window after SIGINT before a forceful kill (env: CHORUS_DAEMON_SIGINT_TIMEOUT)
|
|
166
|
+
when an interrupt is received (default: 10000).
|
|
167
|
+
Also configurable via ~/.chorus/daemon.json sigintTimeoutMs.
|
|
168
|
+
|
|
169
|
+
Credential resolution order: flags > CHORUS_URL/CHORUS_API_KEY env >
|
|
170
|
+
~/.chorus/daemon.json (from 'chorus login') > Claude Code plugin config.
|
|
171
|
+
|
|
172
|
+
The daemon spawns the local 'claude' CLI headlessly per task dispatch; it must
|
|
173
|
+
be on PATH. Override with CHORUS_CLAUDE_PATH. By default the woken Claude may
|
|
174
|
+
use only Chorus MCP tools (comment/claim/report/status) — pass --yolo for full
|
|
175
|
+
autonomy (real code-writing AI-DLC), which is dangerous: run it sandboxed.
|
|
176
|
+
|
|
87
177
|
EXAMPLES
|
|
88
178
|
chorus # Embedded PGlite (default)
|
|
89
179
|
chorus --port 3000 # Custom port
|
|
90
180
|
chorus --data-dir /var/lib/chorus # Custom data directory
|
|
91
181
|
DATABASE_URL=postgres://... chorus --use-pglite=false # External PostgreSQL
|
|
182
|
+
chorus login # Interactive: validate key, save credentials
|
|
183
|
+
chorus daemon # Connect & wake local Claude Code (Chorus tools only)
|
|
184
|
+
chorus daemon --yolo # Full autonomy: woken Claude can run Bash / edit files
|
|
185
|
+
CHORUS_URL=https://... CHORUS_API_KEY=cho_... chorus daemon
|
|
92
186
|
`);
|
|
93
187
|
process.exit(0);
|
|
94
188
|
}
|
|
95
189
|
|
|
96
|
-
if (hasFlag("--version", "-v")) {
|
|
190
|
+
if (!isSubcommand && hasFlag("--version", "-v")) {
|
|
97
191
|
const pkg = JSON.parse(readFileSync(join(__dirname, "package.json"), "utf8"));
|
|
98
192
|
process.stdout.write(`${pkg.version}\n`);
|
|
99
193
|
process.exit(0);
|
|
@@ -103,12 +197,19 @@ if (hasFlag("--version", "-v")) {
|
|
|
103
197
|
// Configuration
|
|
104
198
|
// ---------------------------------------------------------------------------
|
|
105
199
|
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
)
|
|
110
|
-
|
|
111
|
-
|
|
200
|
+
// Server-only configuration. Guarded by `!isSubcommand` because these parse
|
|
201
|
+
// SERVER flags — notably `-d` is the server's `--data-dir` short alias, which
|
|
202
|
+
// collides with the daemon's `-d`/--detach. For `chorus daemon -d`, the
|
|
203
|
+
// subcommand dispatch above owns the process; computing `resolve(getArg("--data-dir","-d"))`
|
|
204
|
+
// here would see `-d` as a bare boolean `true` and throw `resolve(true)` on the
|
|
205
|
+
// same tick, crashing before the daemon detaches. Skipping for subcommands keeps
|
|
206
|
+
// the server-flag surface entirely out of the client-command path.
|
|
207
|
+
const port = isSubcommand ? 0 : Number(getArg("--port", "-p") ?? process.env.PORT ?? 8637);
|
|
208
|
+
const dataDir = isSubcommand
|
|
209
|
+
? ""
|
|
210
|
+
: resolve(getArg("--data-dir", "-d") ?? process.env.CHORUS_DATA_DIR ?? join(homedir(), ".chorus-data"));
|
|
211
|
+
const hostname = isSubcommand ? "" : getArg("--hostname") ?? "0.0.0.0";
|
|
212
|
+
const PGLITE_PORT = isSubcommand ? 0 : Number(getArg("--pglite-port") ?? process.env.CHORUS_PGLITE_PORT ?? 5433);
|
|
112
213
|
|
|
113
214
|
// ---------------------------------------------------------------------------
|
|
114
215
|
// Utilities
|
|
@@ -362,8 +463,11 @@ process.on("exit", () => {
|
|
|
362
463
|
// Run
|
|
363
464
|
// ---------------------------------------------------------------------------
|
|
364
465
|
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
466
|
+
// Only launch the server when no client subcommand was dispatched above.
|
|
467
|
+
if (!isSubcommand) {
|
|
468
|
+
main().catch((err) => {
|
|
469
|
+
console.error("Fatal error:", err);
|
|
470
|
+
if (pgliteProcess && !pgliteProcess.killed) pgliteProcess.kill("SIGTERM");
|
|
471
|
+
process.exit(1);
|
|
472
|
+
});
|
|
473
|
+
}
|
package/cli/backfill.mjs
ADDED
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
// cli/backfill.mjs
|
|
2
|
+
// Reconnect backfill: after the SSE stream reconnects, recover anything that
|
|
3
|
+
// arrived during the gap so a dispatch made while the daemon was briefly
|
|
4
|
+
// disconnected is not lost (cli-daemon spec "Reconnect with backfill"). Two
|
|
5
|
+
// sources, both re-driven through the SAME router/queue + shared `seen` set:
|
|
6
|
+
//
|
|
7
|
+
// 1. NOTIFICATIONS — pull unread notifications via MCP and re-emit each as a
|
|
8
|
+
// synthetic `new_notification` event (the original OpenClaw onReconnect logic).
|
|
9
|
+
// This recovers autonomous wakes (task_assigned / mentioned / elaboration / …),
|
|
10
|
+
// whose actionable payload lives on the re-fetchable notification.
|
|
11
|
+
//
|
|
12
|
+
// 2. PENDING TURNS — re-derive UNSTARTED (status `pending`) DaemonSessionTurns for
|
|
13
|
+
// this connection's origin-pinned sessions from the TURN TABLE (子1 —
|
|
14
|
+
// daemon-session-conversation), NOT from notifications. The turn is persisted at
|
|
15
|
+
// the notification chokepoint before/at notification creation, so it survives a
|
|
16
|
+
// lost delivery ping; a `human_instruction`'s free-text body lives ONLY on the
|
|
17
|
+
// turn, making the turn table its sole reliable backfill source. Read via
|
|
18
|
+
// `GET /api/daemon/pending-turns?connectionUuid=…` (Bearer agent key, global
|
|
19
|
+
// fetch — zero new deps), each re-dispatched through `router.dispatchPendingTurn`.
|
|
20
|
+
//
|
|
21
|
+
// The pending-turns READ goes through the SHARED daemon REST client
|
|
22
|
+
// (`cli/daemon-rest-client.mjs`), which owns the `GET /api/daemon/pending-turns` request,
|
|
23
|
+
// Bearer auth, the connectionUuid guard, and the no-silent-errors handling (network error
|
|
24
|
+
// / non-2xx / bad JSON / missing turns array are all logged with cause and surfaced).
|
|
25
|
+
// This module keeps only the backfill-domain concerns: the notification source, the
|
|
26
|
+
// `onlyTurnUuid` precision filter, the `seen` dedup, and re-dispatch.
|
|
27
|
+
//
|
|
28
|
+
// De-dupes against the shared `seen` set so a reconnect storm doesn't double-wake.
|
|
29
|
+
//
|
|
30
|
+
// The returned `backfill` function also exposes `backfill.pendingTurnsOnly` — the
|
|
31
|
+
// connection-scoped pending-turns sweep ALONE — so the LIVE `deliver_turn` control ping
|
|
32
|
+
// (子2 — origin-only live delivery) can reuse the EXACT same sweep without re-running the
|
|
33
|
+
// notification source. Live ping and reconnect backfill therefore converge on one sweep +
|
|
34
|
+
// one `seen` set, so a turn runs at most once regardless of which path observes it first.
|
|
35
|
+
|
|
36
|
+
import { createDaemonRestClient } from "./daemon-rest-client.mjs";
|
|
37
|
+
|
|
38
|
+
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Build an onReconnect handler that (1) re-emits missed unread notifications into
|
|
42
|
+
* `dispatch`, and (2) — when a connectionUuid + pending-turn dispatcher are wired —
|
|
43
|
+
* re-derives this connection's unstarted (pending) turns from the turn table and
|
|
44
|
+
* re-dispatches each. Both paths share the `seen` set so already-handled work is not
|
|
45
|
+
* re-run.
|
|
46
|
+
*
|
|
47
|
+
* @param {{
|
|
48
|
+
* mcpClient: { callTool: (name: string, args?: Record<string, unknown>) => Promise<unknown> },
|
|
49
|
+
* dispatch: (event: { type: string, notificationUuid: string }) => void,
|
|
50
|
+
* seen?: Set<string>,
|
|
51
|
+
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
52
|
+
* limit?: number,
|
|
53
|
+
* // 子1 — pending-turn backfill (all optional; when absent, only the notification
|
|
54
|
+
* // backfill runs, preserving the original behavior/wiring):
|
|
55
|
+
* url?: string, Chorus base URL (for the pending-turns read).
|
|
56
|
+
* apiKey?: string, `cho_` agent API key.
|
|
57
|
+
* getConnectionUuid?: () => (string|null), The daemon's registered connection uuid
|
|
58
|
+
* (learned from the SSE handshake). Null until
|
|
59
|
+
* then — the pending-turns read is skipped while null.
|
|
60
|
+
* dispatchPendingTurn?: (turn: { turnUuid: string, sessionId: string, directIdeaUuid: string|null, trigger: string, promptText: string|null }) => void,
|
|
61
|
+
* fetchImpl?: typeof fetch, Injectable for tests.
|
|
62
|
+
* }} opts
|
|
63
|
+
* @returns {() => Promise<void>}
|
|
64
|
+
*/
|
|
65
|
+
export function createBackfill(opts) {
|
|
66
|
+
const { mcpClient, dispatch } = opts;
|
|
67
|
+
const seen = opts.seen ?? new Set();
|
|
68
|
+
const logger = opts.logger ?? NOOP_LOGGER;
|
|
69
|
+
const limit = opts.limit ?? 50;
|
|
70
|
+
// 子1 pending-turn backfill wiring (optional).
|
|
71
|
+
const url = opts.url ?? null;
|
|
72
|
+
const apiKey = opts.apiKey ?? null;
|
|
73
|
+
const getConnectionUuid = opts.getConnectionUuid ?? null;
|
|
74
|
+
const dispatchPendingTurn = opts.dispatchPendingTurn ?? null;
|
|
75
|
+
// The pending-turns READ is delegated to the shared client. Built only when the
|
|
76
|
+
// pending-turn backfill is wired (url + apiKey + getConnectionUuid present); otherwise
|
|
77
|
+
// backfillPendingTurns is an early no-op (notification-only callers / older tests).
|
|
78
|
+
const pendingTurnsClient =
|
|
79
|
+
url && apiKey && getConnectionUuid
|
|
80
|
+
? createDaemonRestClient({ url, apiKey, getConnectionUuid, fetchImpl: opts.fetchImpl, logger })
|
|
81
|
+
: null;
|
|
82
|
+
|
|
83
|
+
/** Re-emit unread notifications missed during the gap (autonomous wakes). */
|
|
84
|
+
async function backfillNotifications() {
|
|
85
|
+
let result;
|
|
86
|
+
try {
|
|
87
|
+
result = /** @type {{ notifications?: Array<{ uuid: string }> }} */ (
|
|
88
|
+
await mcpClient.callTool("chorus_get_notifications", {
|
|
89
|
+
status: "unread",
|
|
90
|
+
limit,
|
|
91
|
+
autoMarkRead: false,
|
|
92
|
+
})
|
|
93
|
+
);
|
|
94
|
+
} catch (err) {
|
|
95
|
+
logger.warn(`[Chorus] backfill fetch failed: ${err}`);
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
const notifications = result?.notifications;
|
|
100
|
+
if (!Array.isArray(notifications)) {
|
|
101
|
+
logger.warn("[Chorus] backfill: no notifications array in response");
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
let redispatched = 0;
|
|
106
|
+
for (const n of notifications) {
|
|
107
|
+
if (!n || typeof n.uuid !== "string") continue;
|
|
108
|
+
// Pre-check only — do NOT mark seen here. The router (dispatch) is the
|
|
109
|
+
// single owner of marking-at-dispatch; if backfill marked first, the
|
|
110
|
+
// router's own `seen.has(...)` early-return would fire and the wake would
|
|
111
|
+
// never enqueue (every backfilled dispatch silently dropped). This
|
|
112
|
+
// pre-check is just a cheap early-out for notifications already handled.
|
|
113
|
+
if (seen.has(n.uuid)) continue;
|
|
114
|
+
redispatched++;
|
|
115
|
+
dispatch({ type: "new_notification", notificationUuid: n.uuid });
|
|
116
|
+
}
|
|
117
|
+
if (redispatched > 0) {
|
|
118
|
+
logger.info(`[Chorus] backfill re-dispatched ${redispatched} missed notification(s)`);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Re-derive this connection's UNSTARTED (pending) turns from the turn table (子1)
|
|
124
|
+
* and re-dispatch them through the router. No-op (silently skipped) when the
|
|
125
|
+
* pending-turn wiring is absent or the connectionUuid is not known yet. Never throws
|
|
126
|
+
* into the reconnect path — a failure is logged and swallowed.
|
|
127
|
+
*
|
|
128
|
+
* `onlyTurnUuid` (子2 — origin-only live delivery): when set, dispatch ONLY the turn
|
|
129
|
+
* with that uuid out of the fetched set, so a live `deliver_turn` ping runs PRECISELY
|
|
130
|
+
* the turn it announced and never drags the connection's other still-pending turns
|
|
131
|
+
* along. When omitted (the reconnect path), dispatch ALL pending turns — the lost-ping
|
|
132
|
+
* safety net that recovers everything missed during a gap.
|
|
133
|
+
*
|
|
134
|
+
* @param {string} [onlyTurnUuid]
|
|
135
|
+
*/
|
|
136
|
+
async function backfillPendingTurns(onlyTurnUuid) {
|
|
137
|
+
if (!pendingTurnsClient || !dispatchPendingTurn) {
|
|
138
|
+
// Pending-turn backfill not wired (e.g. notification-only callers / older tests).
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// The shared client reads `GET /api/daemon/pending-turns?connectionUuid=…`, skipping
|
|
142
|
+
// (no log) while the connectionUuid is not known yet — a normal early state — and
|
|
143
|
+
// surfacing a network error / non-2xx / bad JSON / missing turns array with its cause
|
|
144
|
+
// (logged) as `result.ok === false`. We just consume the parsed turns; never throw.
|
|
145
|
+
const result = await pendingTurnsClient.readPendingTurns();
|
|
146
|
+
if (!result.ok || !result.data) {
|
|
147
|
+
// Either nothing to read yet (skipped) or a logged failure — nothing to dispatch.
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
const turns = result.data.turns;
|
|
151
|
+
|
|
152
|
+
let redispatched = 0;
|
|
153
|
+
for (const t of turns) {
|
|
154
|
+
if (!t || typeof t.turnUuid !== "string") continue;
|
|
155
|
+
// Live `deliver_turn` precision: when a specific turnUuid was announced, dispatch
|
|
156
|
+
// ONLY it — skip every other pending turn of the connection (they are recovered by
|
|
157
|
+
// the arg-less reconnect sweep, not by a single-turn live ping).
|
|
158
|
+
if (onlyTurnUuid && t.turnUuid !== onlyTurnUuid) continue;
|
|
159
|
+
// The router (dispatchPendingTurn) is the single owner of marking-seen (keyed
|
|
160
|
+
// `turn:<uuid>`), exactly like the notification path — so do NOT mark here.
|
|
161
|
+
if (seen.has(`turn:${t.turnUuid}`)) continue;
|
|
162
|
+
redispatched++;
|
|
163
|
+
dispatchPendingTurn(t);
|
|
164
|
+
}
|
|
165
|
+
if (redispatched > 0) {
|
|
166
|
+
const scope = onlyTurnUuid ? `turn ${onlyTurnUuid}` : `${redispatched} pending turn(s)`;
|
|
167
|
+
logger.info(`[Chorus] backfill re-derived ${scope} from the turn table`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
async function backfill() {
|
|
172
|
+
// Run both sources. Each swallows its own errors so one failing source never
|
|
173
|
+
// aborts the other (a notification-fetch failure must not lose pending turns, and
|
|
174
|
+
// vice versa).
|
|
175
|
+
await backfillNotifications();
|
|
176
|
+
await backfillPendingTurns();
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
// Expose the CONNECTION-SCOPED pending-turns sweep on its own so the LIVE
|
|
180
|
+
// `deliver_turn` control ping (子2 — origin-only live delivery) reuses the EXACT same
|
|
181
|
+
// sweep the reconnect path runs — no second sweep, no second code path. The control
|
|
182
|
+
// handler triggers `backfill.pendingTurnsOnly()`; it shares the same `seen` set +
|
|
183
|
+
// `dispatchPendingTurn`, so a turn delivered live and also re-derived on reconnect runs
|
|
184
|
+
// at most once. Non-throwing (the inner sweep swallows + logs its own errors). The live
|
|
185
|
+
// `deliver_turn` ping passes the precise `turnUuid` so ONLY that turn runs; an arg-less
|
|
186
|
+
// call (reconnect) sweeps all pending.
|
|
187
|
+
/** @type {(onlyTurnUuid?: string) => Promise<void>} */
|
|
188
|
+
backfill.pendingTurnsOnly = backfillPendingTurns;
|
|
189
|
+
return backfill;
|
|
190
|
+
}
|