@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
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
// cli/event-router.mjs
|
|
2
|
+
// Routes incoming SSE notification events to wakes. Plain ESM adaptation of
|
|
3
|
+
// packages/openclaw-plugin/src/event-router.ts — but instead of OpenClaw's
|
|
4
|
+
// runEmbeddedAgent, it enqueues onto the per-root-idea WakeQueue so the daemon
|
|
5
|
+
// spawns headless Claude with correct serialization.
|
|
6
|
+
//
|
|
7
|
+
// Flow: SSE `new_notification` → fetch full detail via MCP → if it's a wake
|
|
8
|
+
// action, resolve the root-idea key and enqueue the wake. Never throws into the
|
|
9
|
+
// SSE loop.
|
|
10
|
+
|
|
11
|
+
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
12
|
+
|
|
13
|
+
export class EventRouter {
|
|
14
|
+
/**
|
|
15
|
+
* @param {{
|
|
16
|
+
* mcpClient: { callTool: (name: string, args?: Record<string, unknown>) => Promise<any> },
|
|
17
|
+
* waker: { keyFor: (n: any) => Promise<{ key: string, rootIdeaUuid: string|null, directIdeaUuid: string|null }>, wake: (n: any, key: string, attribution?: any) => Promise<void>, markQueued?: (n: any, key: string, attribution?: any) => void },
|
|
18
|
+
* queue: { enqueue: (key: string, task: () => Promise<void>) => void },
|
|
19
|
+
* wakeActions: Set<string>,
|
|
20
|
+
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
21
|
+
* }} opts
|
|
22
|
+
*/
|
|
23
|
+
constructor(opts) {
|
|
24
|
+
this.mcp = opts.mcpClient;
|
|
25
|
+
this.waker = opts.waker;
|
|
26
|
+
this.queue = opts.queue;
|
|
27
|
+
this.wakeActions = opts.wakeActions;
|
|
28
|
+
this.logger = opts.logger ?? NOOP_LOGGER;
|
|
29
|
+
// Shared dedup set: the daemon passes the SAME Set to the reconnect backfill
|
|
30
|
+
// so a notification handled live is never re-woken on reconnect, and a
|
|
31
|
+
// duplicate live delivery is dropped. Keyed by notificationUuid, marked at
|
|
32
|
+
// dispatch time (before any async work) so concurrent dispatches for the
|
|
33
|
+
// same uuid collapse to one wake.
|
|
34
|
+
this.seen = opts.seen ?? new Set();
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Handle one SSE event. Synchronous + non-throwing: it kicks off async
|
|
39
|
+
* fetch/route work and returns immediately so the SSE consumer never blocks.
|
|
40
|
+
* @param {{ type?: string, notificationUuid?: string }} event
|
|
41
|
+
*/
|
|
42
|
+
dispatch(event) {
|
|
43
|
+
if (event?.type !== "new_notification") {
|
|
44
|
+
return; // count_update etc. — ignore quietly
|
|
45
|
+
}
|
|
46
|
+
if (!event.notificationUuid) {
|
|
47
|
+
this.logger.warn("[Chorus] new_notification missing notificationUuid, skipping");
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (this.seen.has(event.notificationUuid)) {
|
|
51
|
+
return; // already handled (e.g. live delivery then reconnect backfill)
|
|
52
|
+
}
|
|
53
|
+
this.seen.add(event.notificationUuid);
|
|
54
|
+
this.#fetchAndRoute(event.notificationUuid).catch((err) => {
|
|
55
|
+
this.logger.error(`[Chorus] failed to route notification ${event.notificationUuid}: ${err}`);
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** @param {string} notificationUuid */
|
|
60
|
+
async #fetchAndRoute(notificationUuid) {
|
|
61
|
+
const result = await this.mcp.callTool("chorus_get_notifications", {
|
|
62
|
+
status: "unread",
|
|
63
|
+
limit: 50,
|
|
64
|
+
autoMarkRead: false,
|
|
65
|
+
});
|
|
66
|
+
const notifications = result?.notifications;
|
|
67
|
+
if (!Array.isArray(notifications)) {
|
|
68
|
+
this.logger.warn("[Chorus] could not fetch notifications list");
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
const n = notifications.find((x) => x?.uuid === notificationUuid);
|
|
72
|
+
if (!n) {
|
|
73
|
+
this.logger.warn(`[Chorus] notification ${notificationUuid} not in unread list`);
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
if (!this.wakeActions.has(n.action)) {
|
|
77
|
+
this.logger.info(`[Chorus] action "${n.action}" is not a wake action — ignoring`);
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// 子2 — daemon-instruction-injection: a `human_instruction` is NOT woken from the
|
|
82
|
+
// notification path. Its live delivery is the origin-only `deliver_turn` control ping
|
|
83
|
+
// (precise `turnUuid` → pending-turns sweep), and its recovery is the reconnect
|
|
84
|
+
// pending-turn backfill — BOTH keyed on `turn:{uuid}` in the shared `seen` set. The
|
|
85
|
+
// `new_notification` SSE event ALSO arrives here (the action is in WAKE_ACTIONS so the
|
|
86
|
+
// reconnect notification backfill can re-derive autonomous wakes), but acting on it
|
|
87
|
+
// here would run the SAME instruction a SECOND time under a DIFFERENT dedup key
|
|
88
|
+
// (`notificationUuid` vs `turn:{uuid}`) — the double-execution bug — and would fan the
|
|
89
|
+
// wake out to EVERY connection of the agent rather than the session's origin. So the
|
|
90
|
+
// notification path explicitly defers `human_instruction` to the turn-keyed paths.
|
|
91
|
+
if (n.action === "human_instruction") {
|
|
92
|
+
this.logger.info(
|
|
93
|
+
`[Chorus] human_instruction ${notificationUuid} is delivered via deliver_turn / pending-turn backfill — not the notification path; ignoring here`
|
|
94
|
+
);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
await this.#resolveAndEnqueue(n, notificationUuid);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Re-dispatch a RESUME (子3 — daemon-interrupt-resume): the reverse control
|
|
103
|
+
* channel delivered a `command:"resume"` for an entity, so re-run its wake. Unlike
|
|
104
|
+
* a notification this is NOT fetched from the unread list and has no
|
|
105
|
+
* notificationUuid — it is a synthetic, entity-generic `resource_resumed` wake.
|
|
106
|
+
* It flows through the SAME keyFor → markQueued → enqueue path as any wake, so the
|
|
107
|
+
* per-direct-idea serialization holds and the spawner's on-disk transcript probe
|
|
108
|
+
* naturally selects `claude --resume <directIdeaUuid>` (the session already
|
|
109
|
+
* exists). Synchronous + non-throwing, mirroring `dispatch`.
|
|
110
|
+
* @param {{ entityType?: string, entityUuid?: string }} target
|
|
111
|
+
*/
|
|
112
|
+
dispatchResume(target) {
|
|
113
|
+
const entityType = target?.entityType;
|
|
114
|
+
const entityUuid = target?.entityUuid;
|
|
115
|
+
if (typeof entityType !== "string" || typeof entityUuid !== "string" || !entityUuid) {
|
|
116
|
+
this.logger.warn("[Chorus] resume dispatch missing entityType/entityUuid, skipping");
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
const n = { action: "resource_resumed", entityType, entityUuid };
|
|
120
|
+
this.#resolveAndEnqueue(n, `resume:${entityType}:${entityUuid}`).catch((err) => {
|
|
121
|
+
this.logger.error(`[Chorus] failed to dispatch resume for ${entityType}:${entityUuid}: ${err}`);
|
|
122
|
+
});
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Re-dispatch a backfilled PENDING TURN (子1 — daemon-session-conversation). On
|
|
127
|
+
* reconnect, the backfill re-derives unstarted turns from the TURN TABLE (the
|
|
128
|
+
* canonical source — see backfill.mjs) rather than from a possibly-lost notification
|
|
129
|
+
* ping, so a dropped delivery never loses an instruction. Each pending turn already
|
|
130
|
+
* carries its session anchor (`sessionId` + `directIdeaUuid`) and — for a
|
|
131
|
+
* `human_instruction` — its canonical free-text body (`promptText`). We re-run it
|
|
132
|
+
* through the SAME markQueued → enqueue path as a live wake, BUT skip `keyFor`'s
|
|
133
|
+
* lineage round-trip: the session key is reconstructed DIRECTLY from the turn's
|
|
134
|
+
* own ids (which are authoritative), so backfill needs no network beyond the
|
|
135
|
+
* pending-turns read. Deduped via the shared `seen` set keyed on the turn uuid so a
|
|
136
|
+
* pending turn already handled live (or by an earlier backfill) is not re-run.
|
|
137
|
+
* Synchronous + non-throwing, mirroring `dispatch`/`dispatchResume`.
|
|
138
|
+
*
|
|
139
|
+
* Only `human_instruction` pending turns are re-dispatched here: autonomous turns
|
|
140
|
+
* (task_assigned / mentioned / elaboration / resume) are re-driven by the
|
|
141
|
+
* notification backfill (their notifications are re-fetched), whereas a
|
|
142
|
+
* human_instruction's actionable payload lives ONLY on the turn — so the turn table
|
|
143
|
+
* is its sole reliable backfill source.
|
|
144
|
+
*
|
|
145
|
+
* @param {{ turnUuid?: string, sessionId?: string, directIdeaUuid?: string|null,
|
|
146
|
+
* trigger?: string, promptText?: string|null }} pending
|
|
147
|
+
*/
|
|
148
|
+
dispatchPendingTurn(pending) {
|
|
149
|
+
const turnUuid = pending?.turnUuid;
|
|
150
|
+
const sessionId = pending?.sessionId;
|
|
151
|
+
if (typeof turnUuid !== "string" || !turnUuid) {
|
|
152
|
+
this.logger.warn("[Chorus] pending-turn dispatch missing turnUuid, skipping");
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (typeof sessionId !== "string" || !sessionId) {
|
|
156
|
+
this.logger.warn(`[Chorus] pending-turn ${turnUuid} missing sessionId, skipping`);
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
// Only human_instruction is re-derived from the turn table (see doc above).
|
|
160
|
+
if (pending.trigger !== "human_instruction") {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const instruction =
|
|
164
|
+
typeof pending.promptText === "string" ? pending.promptText.trim() : "";
|
|
165
|
+
if (!instruction) {
|
|
166
|
+
this.logger.warn(
|
|
167
|
+
`[Chorus] pending human_instruction turn ${turnUuid} has no promptText — skipping`
|
|
168
|
+
);
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
// Shared dedup: a turn uuid keys the seen set so a backfilled pending turn already
|
|
172
|
+
// handled (live or earlier backfill) does not re-run. Marked BEFORE async work, as
|
|
173
|
+
// the live path does, so concurrent backfills collapse to one wake.
|
|
174
|
+
const seenKey = `turn:${turnUuid}`;
|
|
175
|
+
if (this.seen.has(seenKey)) return;
|
|
176
|
+
this.seen.add(seenKey);
|
|
177
|
+
|
|
178
|
+
const directIdeaUuid =
|
|
179
|
+
typeof pending.directIdeaUuid === "string" ? pending.directIdeaUuid : null;
|
|
180
|
+
// Reconstruct the wake's session anchor DIRECTLY from the turn's own ids (no
|
|
181
|
+
// lineage round-trip). The waker anchors the Claude session on
|
|
182
|
+
// `directIdeaUuid ?? entityUuid`, and the per-direct-idea queue keys on the same —
|
|
183
|
+
// so set entityUuid = sessionId so both align with the canonical session.
|
|
184
|
+
//
|
|
185
|
+
// Execution entity (子3 follow-up): an idea-anchored conversation reports its
|
|
186
|
+
// execution against the real idea (`idea:<directIdeaUuid>` — a valid entity); an
|
|
187
|
+
// AD-HOC conversation has no content entity, so it reports against the conversation
|
|
188
|
+
// itself (`daemon_session:<sessionId>`). Previously the ad-hoc branch reported
|
|
189
|
+
// `task:<sessionId>`, which the server DROPS (no Task with that uuid) — so the
|
|
190
|
+
// running/interrupt state never reached the UI. Because the ad-hoc anchor IS the
|
|
191
|
+
// sessionId, the execution entityUuid, the Claude `--resume` anchor, and the
|
|
192
|
+
// per-session UI match key are all the same value.
|
|
193
|
+
const n = {
|
|
194
|
+
action: "human_instruction",
|
|
195
|
+
// The session business key IS the entity anchor here: directIdeaUuid for an
|
|
196
|
+
// idea-anchored session, else the ad-hoc session id (the original entity uuid).
|
|
197
|
+
entityType: directIdeaUuid ? "idea" : "daemon_session",
|
|
198
|
+
entityUuid: directIdeaUuid ? directIdeaUuid : sessionId,
|
|
199
|
+
instructionText: instruction,
|
|
200
|
+
};
|
|
201
|
+
const key = directIdeaUuid ? `idea:${directIdeaUuid}` : `entity:daemon_session:${sessionId}`;
|
|
202
|
+
const attribution = { key, rootIdeaUuid: directIdeaUuid, directIdeaUuid };
|
|
203
|
+
|
|
204
|
+
// Mark queued (snapshot) then enqueue on the same per-direct-idea lane as a live
|
|
205
|
+
// wake — non-throwing so a missing/failed hook never breaks backfill.
|
|
206
|
+
try {
|
|
207
|
+
this.waker.markQueued?.(n, key, attribution);
|
|
208
|
+
} catch (err) {
|
|
209
|
+
this.logger.warn(`[Chorus] markQueued failed for pending turn ${turnUuid}: ${err}`);
|
|
210
|
+
}
|
|
211
|
+
this.queue.enqueue(key, () => this.waker.wake(n, key, attribution));
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* Resolve a wake's serialization key + idea attribution, mark it queued, and
|
|
216
|
+
* enqueue it on the per-direct-idea queue. Shared by the notification path
|
|
217
|
+
* (`#fetchAndRoute`) and the resume re-dispatch (`dispatchResume`). `label` is a
|
|
218
|
+
* human-readable id for logs (a notificationUuid, or a synthetic resume label).
|
|
219
|
+
* keyFor may hit the network (lineage), so it runs before enqueue; the wake itself
|
|
220
|
+
* runs on the queue. `attribution` carries both the direct idea (session anchor, in
|
|
221
|
+
* the key) and the resolved root idea (for the snapshot), threaded explicitly so
|
|
222
|
+
* the snapshot's root is never derived from the direct-idea key.
|
|
223
|
+
* @param {any} n A notification (or synthetic resume) with at least action +
|
|
224
|
+
* entityType + entityUuid.
|
|
225
|
+
* @param {string} label
|
|
226
|
+
*/
|
|
227
|
+
async #resolveAndEnqueue(n, label) {
|
|
228
|
+
let key;
|
|
229
|
+
let attribution;
|
|
230
|
+
try {
|
|
231
|
+
const resolved = await this.waker.keyFor(n);
|
|
232
|
+
key = resolved.key;
|
|
233
|
+
attribution = resolved;
|
|
234
|
+
} catch (err) {
|
|
235
|
+
this.logger.warn(`[Chorus] could not resolve wake key for ${label}: ${err}`);
|
|
236
|
+
return;
|
|
237
|
+
}
|
|
238
|
+
// Mark the resource queued (emits a snapshot) BEFORE enqueue, so the server
|
|
239
|
+
// sees it waiting even while it sits behind a same-direct-idea wake. Optional +
|
|
240
|
+
// non-throwing so a missing/failed hook never breaks routing.
|
|
241
|
+
try {
|
|
242
|
+
this.waker.markQueued?.(n, key, attribution);
|
|
243
|
+
} catch (err) {
|
|
244
|
+
this.logger.warn(`[Chorus] markQueued failed for ${label}: ${err}`);
|
|
245
|
+
}
|
|
246
|
+
this.queue.enqueue(key, () => this.waker.wake(n, key, attribution));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
// cli/interrupt-reporter.mjs
|
|
2
|
+
// Reports a wake's `interrupted` outcome (reason = "user" | "crash") back to the
|
|
3
|
+
// Chorus server (子3 — daemon-interrupt-resume). The waker calls this after a
|
|
4
|
+
// wake's subprocess exits:
|
|
5
|
+
// • interrupt-initiated exit (the control handler set the "interrupting" flag)
|
|
6
|
+
// → reason = "user"
|
|
7
|
+
// • unexpected non-zero exit with NO interrupt flag → reason = "crash"
|
|
8
|
+
// • clean exit (code 0) → nothing is reported (unchanged behavior).
|
|
9
|
+
//
|
|
10
|
+
// The outcome is recorded on the server's EXECUTION row (keyed connection + entity),
|
|
11
|
+
// NOT on the Task model — the daemon executes task / idea / proposal / document
|
|
12
|
+
// wakes, so the interrupted state is entity-generic. This module therefore reports
|
|
13
|
+
// for ANY recognized entity kind (not just tasks) and carries the daemon's own
|
|
14
|
+
// `connectionUuid` so the server can target the right execution row.
|
|
15
|
+
//
|
|
16
|
+
// Transport: the SHARED daemon REST client (`cli/daemon-rest-client.mjs`) owns the actual
|
|
17
|
+
// `POST /api/daemon/report-interrupt` request, its Bearer auth, and the no-silent-errors
|
|
18
|
+
// transport contract — this module is the thin domain wrapper that validates the
|
|
19
|
+
// entity/reason and maps the call into the client's `reportInterrupt` payload. It adds NO
|
|
20
|
+
// new npm dependency (CLAUDE.md pitfall #9) and no shell-out. It is fire-and-forget and
|
|
21
|
+
// NEVER throws into the wake path: a failure is LOGGED by the shared client (memory:
|
|
22
|
+
// no-silent-errors) and the returned result is swallowed.
|
|
23
|
+
|
|
24
|
+
import { createDaemonRestClient } from "./daemon-rest-client.mjs";
|
|
25
|
+
|
|
26
|
+
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
27
|
+
|
|
28
|
+
/** Interrupt reason values the server's report-interrupt endpoint accepts. */
|
|
29
|
+
export const INTERRUPT_REASONS = new Set(["user", "crash"]);
|
|
30
|
+
|
|
31
|
+
/** Entity kinds the server's DaemonExecution (and report-interrupt) accept. Includes
|
|
32
|
+
* `daemon_session` — an ad-hoc conversation is its own execution entity, so its
|
|
33
|
+
* interrupted/resumable state must be reportable too (else ad-hoc Interrupt→Resume is
|
|
34
|
+
* broken: the row would never go sticky `interrupted`+`user` and Resume could never
|
|
35
|
+
* fire). Mirrors the server's CONTROL_ENTITY_TYPES. */
|
|
36
|
+
const REPORTABLE_ENTITY_TYPES = new Set([
|
|
37
|
+
"task",
|
|
38
|
+
"idea",
|
|
39
|
+
"proposal",
|
|
40
|
+
"document",
|
|
41
|
+
"daemon_session",
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Build a `reportInterrupt(entityType, entityUuid, reason)` function the waker
|
|
46
|
+
* invokes when a wake's subprocess exits in an interrupted/crashed state.
|
|
47
|
+
*
|
|
48
|
+
* @param {{
|
|
49
|
+
* url: string, Chorus base URL.
|
|
50
|
+
* apiKey: string, `cho_` agent API key.
|
|
51
|
+
* getConnectionUuid: () => string|null, The daemon's registered connection uuid
|
|
52
|
+
* (learned from the SSE handshake). The
|
|
53
|
+
* server targets the execution row by
|
|
54
|
+
* connection + entity, so this is required;
|
|
55
|
+
* a null/absent value skips the report.
|
|
56
|
+
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
57
|
+
* fetchImpl?: typeof fetch, Injectable for tests.
|
|
58
|
+
* }} opts
|
|
59
|
+
* @returns {(entityType: string, entityUuid: string, reason: "user"|"crash") => Promise<void>}
|
|
60
|
+
*/
|
|
61
|
+
export function createInterruptReporter(opts) {
|
|
62
|
+
const logger = opts.logger ?? NOOP_LOGGER;
|
|
63
|
+
// The shared client owns the request, Bearer auth, the connectionUuid guard, and the
|
|
64
|
+
// surface-not-swallow transport contract. This wrapper keeps only the interrupt-domain
|
|
65
|
+
// validation (entity kind / reason) that is NOT the client's concern.
|
|
66
|
+
const client = createDaemonRestClient({
|
|
67
|
+
url: opts.url,
|
|
68
|
+
apiKey: opts.apiKey,
|
|
69
|
+
getConnectionUuid: opts.getConnectionUuid ?? (() => null),
|
|
70
|
+
fetchImpl: opts.fetchImpl,
|
|
71
|
+
logger,
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
return async function reportInterrupt(entityType, entityUuid, reason) {
|
|
75
|
+
if (!REPORTABLE_ENTITY_TYPES.has(entityType) || !entityUuid || !INTERRUPT_REASONS.has(reason)) {
|
|
76
|
+
logger.warn(
|
|
77
|
+
`[Chorus] refusing to report interrupt: bad entity/reason (${entityType}:${entityUuid}, ${reason})`,
|
|
78
|
+
);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
// The client resolves the connectionUuid lazily, validates it (logging
|
|
82
|
+
// "no connection uuid yet" when absent), POSTs the exact server payload, and logs the
|
|
83
|
+
// failure cause on a network error / non-2xx. We swallow the structured result so a
|
|
84
|
+
// failed report can never crash the wake path.
|
|
85
|
+
await client.reportInterrupt({ entityType, entityUuid, reason });
|
|
86
|
+
};
|
|
87
|
+
}
|
package/cli/lineage.mjs
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
// cli/lineage.mjs
|
|
2
|
+
// Resolves any inbound Chorus notification to its idea attribution, so the daemon
|
|
3
|
+
// can anchor one Claude session per DIRECT idea (the entity's directly-attached
|
|
4
|
+
// idea) while still reporting the ROOT idea for observability.
|
|
5
|
+
//
|
|
6
|
+
// Resolution is fully SERVER-SIDE: every notification is resolved by a single
|
|
7
|
+
// call to the standalone REST endpoint
|
|
8
|
+
// GET /api/entities/{type}/{uuid}/root-idea (Bearer <cho_ agent key>)
|
|
9
|
+
// which is the single source of truth for entity → idea attribution (it closes
|
|
10
|
+
// the document-attribution gap and defines multi-idea semantics). The endpoint
|
|
11
|
+
// returns BOTH `rootIdeaUuid` (topmost ancestor) and `directIdeaUuid` (the first
|
|
12
|
+
// idea node on the lineage — the entity's directly-attached idea). There is
|
|
13
|
+
// intentionally NO client-side lineage walk — the whole point of this change is
|
|
14
|
+
// to stop the daemon re-implementing the Chorus data model.
|
|
15
|
+
//
|
|
16
|
+
// The daemon anchors the Claude `--session-id` on the DIRECT idea (so a human can
|
|
17
|
+
// `claude --resume <idea-uuid>` to take over), and reports the ROOT idea in its
|
|
18
|
+
// execution snapshot — the two are threaded separately, never derived from each
|
|
19
|
+
// other (see waker.mjs).
|
|
20
|
+
//
|
|
21
|
+
// Uses global fetch (Node 18+), exactly like sse-listener.mjs, so it adds no
|
|
22
|
+
// dependency and reuses the same Bearer auth path. On any failure (unreachable
|
|
23
|
+
// server, non-2xx, malformed body) it returns both ids as null so the caller
|
|
24
|
+
// falls back to a per-entity session key — "no idea ancestor" is a normal,
|
|
25
|
+
// non-fatal outcome.
|
|
26
|
+
|
|
27
|
+
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
28
|
+
|
|
29
|
+
export class LineageResolver {
|
|
30
|
+
/**
|
|
31
|
+
* @param {{
|
|
32
|
+
* url: string, Chorus base URL.
|
|
33
|
+
* apiKey: string, `cho_` agent API key.
|
|
34
|
+
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
35
|
+
* fetchImpl?: typeof fetch, Injectable for tests.
|
|
36
|
+
* }} opts
|
|
37
|
+
*/
|
|
38
|
+
constructor(opts) {
|
|
39
|
+
this.url = opts.url.replace(/\/$/, "");
|
|
40
|
+
this.apiKey = opts.apiKey;
|
|
41
|
+
this.logger = opts.logger ?? NOOP_LOGGER;
|
|
42
|
+
this.fetchImpl = opts.fetchImpl ?? globalThis.fetch;
|
|
43
|
+
/**
|
|
44
|
+
* Per-run cache keyed by `${type}:${uuid}`. Holds the full attribution
|
|
45
|
+
* `{ rootIdeaUuid, directIdeaUuid }` so repeats of the same entity single-flight.
|
|
46
|
+
* @type {Map<string, { rootIdeaUuid: string|null, directIdeaUuid: string|null }>}
|
|
47
|
+
*/
|
|
48
|
+
this.cache = new Map();
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Resolve an event to its idea attribution `{ rootIdeaUuid, directIdeaUuid }`.
|
|
53
|
+
* One REST call per notification; the per-run cache single-flights repeats of
|
|
54
|
+
* the same entity. On any failure both ids are null (caller falls back to a
|
|
55
|
+
* per-entity key). Never throws.
|
|
56
|
+
* @param {{ entityType?: string, entityUuid?: string }} event
|
|
57
|
+
* @returns {Promise<{ rootIdeaUuid: string|null, directIdeaUuid: string|null }>}
|
|
58
|
+
*/
|
|
59
|
+
async resolve(event) {
|
|
60
|
+
const entityType = event?.entityType;
|
|
61
|
+
const entityUuid = event?.entityUuid;
|
|
62
|
+
if (!entityType || !entityUuid) {
|
|
63
|
+
this.logger.warn("[Chorus] lineage: event missing entityType/entityUuid");
|
|
64
|
+
return { rootIdeaUuid: null, directIdeaUuid: null };
|
|
65
|
+
}
|
|
66
|
+
// An ad-hoc conversation (`daemon_session`) has NO idea ancestor by definition, and
|
|
67
|
+
// the root-idea endpoint does not accept it (it would 400). Short-circuit to the
|
|
68
|
+
// null attribution the caller would fall back to anyway — avoiding a guaranteed-failing
|
|
69
|
+
// round-trip + a spurious warn on every ad-hoc resume. The caller then anchors the
|
|
70
|
+
// Claude session on the entity uuid (= the ad-hoc sessionId), which is exactly right.
|
|
71
|
+
if (entityType === "daemon_session") {
|
|
72
|
+
return { rootIdeaUuid: null, directIdeaUuid: null };
|
|
73
|
+
}
|
|
74
|
+
const cacheKey = `${entityType}:${entityUuid}`;
|
|
75
|
+
const cached = this.cache.get(cacheKey);
|
|
76
|
+
if (cached) return cached;
|
|
77
|
+
|
|
78
|
+
const result = await this.#resolveViaServer(entityType, entityUuid);
|
|
79
|
+
this.cache.set(cacheKey, result);
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Back-compat convenience: resolve an event to just its root idea uuid (or null).
|
|
85
|
+
* @param {{ entityType?: string, entityUuid?: string }} event
|
|
86
|
+
* @returns {Promise<string|null>}
|
|
87
|
+
*/
|
|
88
|
+
async rootIdeaFor(event) {
|
|
89
|
+
return (await this.resolve(event)).rootIdeaUuid;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Call GET /api/entities/{type}/{uuid}/root-idea and return
|
|
94
|
+
* `{ rootIdeaUuid, directIdeaUuid }` (each string | null). Returns both null on
|
|
95
|
+
* any error so the caller degrades to a per-entity session key — never throws.
|
|
96
|
+
* @param {string} entityType @param {string} entityUuid
|
|
97
|
+
* @returns {Promise<{ rootIdeaUuid: string|null, directIdeaUuid: string|null }>}
|
|
98
|
+
*/
|
|
99
|
+
async #resolveViaServer(entityType, entityUuid) {
|
|
100
|
+
const NONE = { rootIdeaUuid: null, directIdeaUuid: null };
|
|
101
|
+
const endpoint =
|
|
102
|
+
`${this.url}/api/entities/${encodeURIComponent(entityType)}/` +
|
|
103
|
+
`${encodeURIComponent(entityUuid)}/root-idea`;
|
|
104
|
+
let response;
|
|
105
|
+
try {
|
|
106
|
+
response = await this.fetchImpl(endpoint, {
|
|
107
|
+
headers: { Authorization: `Bearer ${this.apiKey}`, Accept: "application/json" },
|
|
108
|
+
});
|
|
109
|
+
} catch (err) {
|
|
110
|
+
this.logger.warn(`[Chorus] lineage: request failed for ${entityType}:${entityUuid}: ${err}`);
|
|
111
|
+
return NONE;
|
|
112
|
+
}
|
|
113
|
+
if (!response.ok) {
|
|
114
|
+
this.logger.warn(
|
|
115
|
+
`[Chorus] lineage: server returned ${response.status} for ${entityType}:${entityUuid}`
|
|
116
|
+
);
|
|
117
|
+
return NONE;
|
|
118
|
+
}
|
|
119
|
+
let body;
|
|
120
|
+
try {
|
|
121
|
+
body = await response.json();
|
|
122
|
+
} catch (err) {
|
|
123
|
+
this.logger.warn(`[Chorus] lineage: bad JSON for ${entityType}:${entityUuid}: ${err}`);
|
|
124
|
+
return NONE;
|
|
125
|
+
}
|
|
126
|
+
// API envelope: { success: true, data: { rootIdeaUuid, directIdeaUuid, lineage, ... } }.
|
|
127
|
+
const data = body && typeof body === "object" ? body.data : undefined;
|
|
128
|
+
if (!data || typeof data !== "object" || !("rootIdeaUuid" in data)) {
|
|
129
|
+
this.logger.warn(
|
|
130
|
+
`[Chorus] lineage: unexpected response shape for ${entityType}:${entityUuid}`
|
|
131
|
+
);
|
|
132
|
+
return NONE;
|
|
133
|
+
}
|
|
134
|
+
const root = data.rootIdeaUuid;
|
|
135
|
+
if (root !== null && typeof root !== "string") {
|
|
136
|
+
this.logger.warn(`[Chorus] lineage: non-string rootIdeaUuid for ${entityType}:${entityUuid}`);
|
|
137
|
+
return NONE;
|
|
138
|
+
}
|
|
139
|
+
// directIdeaUuid is the daemon's session anchor. Older servers may omit it
|
|
140
|
+
// (pre-directIdeaUuid endpoint): treat a missing/non-string value as null so
|
|
141
|
+
// the caller falls back to a per-entity key rather than misanchoring.
|
|
142
|
+
const directRaw = data.directIdeaUuid;
|
|
143
|
+
const direct = typeof directRaw === "string" ? directRaw : null;
|
|
144
|
+
if (directRaw !== undefined && directRaw !== null && typeof directRaw !== "string") {
|
|
145
|
+
this.logger.warn(
|
|
146
|
+
`[Chorus] lineage: non-string directIdeaUuid for ${entityType}:${entityUuid}`
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
this.logger.info(
|
|
150
|
+
`[Chorus] lineage: ${entityType}:${entityUuid} → root ${root ?? "none"}, direct ${direct ?? "none"}` +
|
|
151
|
+
(typeof data.resolvedVia === "string" ? ` (${data.resolvedVia})` : "")
|
|
152
|
+
);
|
|
153
|
+
return { rootIdeaUuid: root, directIdeaUuid: direct };
|
|
154
|
+
}
|
|
155
|
+
}
|
package/cli/login.mjs
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
// cli/login.mjs
|
|
2
|
+
// `chorus login` — validate a Chorus url + cho_ API key and persist them to
|
|
3
|
+
// ~/.chorus/daemon.json (0600). On validation failure, nothing is written.
|
|
4
|
+
// Plain ESM; the only dependency is the in-repo MCP SDK (via chorus-client).
|
|
5
|
+
|
|
6
|
+
import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
|
|
7
|
+
import { dirname } from "node:path";
|
|
8
|
+
import { createInterface } from "node:readline";
|
|
9
|
+
|
|
10
|
+
import { loginFilePath } from "./credentials.mjs";
|
|
11
|
+
import { validateAndFetchIdentity } from "./chorus-client.mjs";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Prompt for a line of input. When `mask` is true, typed characters are not
|
|
15
|
+
* echoed (used for the secret API key — cli-auth spec "interactive key entry
|
|
16
|
+
* is masked").
|
|
17
|
+
*
|
|
18
|
+
* @param {string} query
|
|
19
|
+
* @param {{ mask?: boolean, input?: NodeJS.ReadableStream, output?: NodeJS.WritableStream }} [opts]
|
|
20
|
+
* @returns {Promise<string>}
|
|
21
|
+
*/
|
|
22
|
+
export function prompt(query, opts = {}) {
|
|
23
|
+
const input = opts.input ?? process.stdin;
|
|
24
|
+
const output = opts.output ?? process.stdout;
|
|
25
|
+
const mask = opts.mask ?? false;
|
|
26
|
+
|
|
27
|
+
return new Promise((resolve) => {
|
|
28
|
+
const rl = createInterface({ input, output, terminal: true });
|
|
29
|
+
if (mask) {
|
|
30
|
+
// Suppress echo: intercept the readline-internal write so typed chars
|
|
31
|
+
// (and the key itself) never render. The prompt string still shows.
|
|
32
|
+
const writeToOutput = /** @type {(s: string) => void} */ (
|
|
33
|
+
rl._writeToOutput?.bind(rl)
|
|
34
|
+
);
|
|
35
|
+
rl._writeToOutput = (str) => {
|
|
36
|
+
if (str === query || str.includes("\n") || str.includes("\r")) {
|
|
37
|
+
if (writeToOutput) writeToOutput(str);
|
|
38
|
+
else output.write(str);
|
|
39
|
+
}
|
|
40
|
+
// otherwise swallow — no echo of secret characters
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
rl.question(query, (answer) => {
|
|
44
|
+
rl.close();
|
|
45
|
+
if (mask) output.write("\n");
|
|
46
|
+
resolve(answer.trim());
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Persist credentials + identity to the login file with owner-only perms.
|
|
53
|
+
*
|
|
54
|
+
* Writing the file with a fresh credential object intentionally OMITS any
|
|
55
|
+
* `yoloAckAt` that a previous file carried — a credential change (re-login)
|
|
56
|
+
* clears the yolo acknowledgement, so the next yolo TTY start re-confirms once
|
|
57
|
+
* (daemon-permission-mode spec). To preserve an existing ack across an
|
|
58
|
+
* unrelated rewrite, the caller must read it first and pass it in `data`.
|
|
59
|
+
*
|
|
60
|
+
* @param {{ url: string, apiKey: string, agentUuid: string, agentName: string, yoloAckAt?: string }} data
|
|
61
|
+
* @param {{ path?: string, write?: (p: string, c: string, o: object) => void, mkdir?: (p: string, o: object) => void }} [deps]
|
|
62
|
+
*/
|
|
63
|
+
export function writeLoginFile(data, deps = {}) {
|
|
64
|
+
const path = deps.path ?? loginFilePath();
|
|
65
|
+
const write = deps.write ?? writeFileSync;
|
|
66
|
+
const mkdir = deps.mkdir ?? mkdirSync;
|
|
67
|
+
mkdir(dirname(path), { recursive: true });
|
|
68
|
+
write(path, JSON.stringify(data, null, 2) + "\n", { mode: 0o600 });
|
|
69
|
+
return path;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Record (or refresh) the yolo acknowledgement in the existing login file,
|
|
74
|
+
* preserving the credentials already on disk. Reads the current file, merges
|
|
75
|
+
* `yoloAckAt`, and rewrites with 0600. Used by the daemon after an interactive
|
|
76
|
+
* TTY yolo confirmation — it does NOT touch url/apiKey/identity.
|
|
77
|
+
*
|
|
78
|
+
* No-silent-errors: a read/parse failure is surfaced to the caller (throws), so
|
|
79
|
+
* the daemon can log it rather than silently losing the ack.
|
|
80
|
+
*
|
|
81
|
+
* @param {string} yoloAckAt ISO-8601 timestamp of the confirmation.
|
|
82
|
+
* @param {{ path?: string, read?: (p: string) => string, write?: typeof writeLoginFile }} [deps]
|
|
83
|
+
* @returns {string} the file path written
|
|
84
|
+
*/
|
|
85
|
+
export function recordYoloAck(yoloAckAt, deps = {}) {
|
|
86
|
+
const path = deps.path ?? loginFilePath();
|
|
87
|
+
const read = deps.read ?? ((p) => readFileSync(p, "utf8"));
|
|
88
|
+
const write = deps.write ?? writeLoginFile;
|
|
89
|
+
// Start from the existing file when present, else an empty object: a TTY user
|
|
90
|
+
// whose credentials come from env / flags has no login file yet, but the ack
|
|
91
|
+
// must still persist (else they'd re-confirm yolo on every start). A file
|
|
92
|
+
// carrying only `yoloAckAt` is harmless — resolveCredentials simply falls
|
|
93
|
+
// through it, and a later `chorus login` overwrites (clearing the ack).
|
|
94
|
+
let current = {};
|
|
95
|
+
try {
|
|
96
|
+
const parsed = JSON.parse(read(path));
|
|
97
|
+
if (parsed && typeof parsed === "object") current = parsed;
|
|
98
|
+
} catch {
|
|
99
|
+
// missing / unreadable / malformed → treat as empty (start fresh)
|
|
100
|
+
}
|
|
101
|
+
return write({ ...current, yoloAckAt }, { path });
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Run the login flow: collect url + key (flags or interactive), validate
|
|
106
|
+
* against the server, and on success persist + echo identity. Returns an exit
|
|
107
|
+
* code (0 success, non-zero failure). Never throws.
|
|
108
|
+
*
|
|
109
|
+
* @param {{ url?: string, apiKey?: string }} flags
|
|
110
|
+
* @param {{
|
|
111
|
+
* validate?: typeof validateAndFetchIdentity,
|
|
112
|
+
* write?: typeof writeLoginFile,
|
|
113
|
+
* prompt?: typeof prompt,
|
|
114
|
+
* log?: (m: string) => void,
|
|
115
|
+
* errLog?: (m: string) => void,
|
|
116
|
+
* }} [deps]
|
|
117
|
+
* @returns {Promise<number>}
|
|
118
|
+
*/
|
|
119
|
+
export async function runLogin(flags = {}, deps = {}) {
|
|
120
|
+
const validate = deps.validate ?? validateAndFetchIdentity;
|
|
121
|
+
const write = deps.write ?? writeLoginFile;
|
|
122
|
+
const ask = deps.prompt ?? prompt;
|
|
123
|
+
const log = deps.log ?? ((m) => process.stdout.write(m + "\n"));
|
|
124
|
+
const errLog = deps.errLog ?? ((m) => process.stderr.write(m + "\n"));
|
|
125
|
+
|
|
126
|
+
let url = typeof flags.url === "string" && flags.url.trim() ? flags.url.trim() : "";
|
|
127
|
+
let apiKey = typeof flags.apiKey === "string" && flags.apiKey.trim() ? flags.apiKey.trim() : "";
|
|
128
|
+
|
|
129
|
+
if (!url) url = await ask("Chorus URL: ");
|
|
130
|
+
if (!apiKey) apiKey = await ask("Chorus API key (cho_...): ", { mask: true });
|
|
131
|
+
|
|
132
|
+
if (!url || !apiKey) {
|
|
133
|
+
errLog("Login aborted: both a URL and an API key are required.");
|
|
134
|
+
return 1;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
let identity;
|
|
138
|
+
try {
|
|
139
|
+
identity = await validate({ url, apiKey });
|
|
140
|
+
} catch (err) {
|
|
141
|
+
const msg = err instanceof Error ? err.message : String(err);
|
|
142
|
+
errLog(`Login failed: ${msg}`);
|
|
143
|
+
errLog("Credentials were NOT saved.");
|
|
144
|
+
return 1;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
const path = write({ url, apiKey, agentUuid: identity.uuid, agentName: identity.name });
|
|
148
|
+
log(`Logged in as ${identity.name} (${identity.uuid}).`);
|
|
149
|
+
log(`Credentials saved to ${path}.`);
|
|
150
|
+
return 0;
|
|
151
|
+
}
|