@chorus-aidlc/chorus 0.13.0 → 0.13.2
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 +392 -406
- package/.next/standalone/.next/app-path-routes-manifest.json +41 -43
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +27 -51
- package/.next/standalone/.next/react-loadable-manifest.json +2 -2
- package/.next/standalone/.next/routes-manifest.json +0 -6
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +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 +1 -1
- 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]/graph/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +1 -1
- 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 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route_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_client-reference-manifest.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_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route.js +4 -4
- 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 +6 -6
- package/.next/standalone/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route.js +1 -0
- package/.next/standalone/.next/server/app/api/{auth/refresh → ideas/conversational}/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/mcp/route.js +2 -2
- package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/session/route.js +1 -0
- package/.next/standalone/.next/server/app/api/session/route.js.nft.json +1 -0
- package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -0
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +1 -1
- package/.next/standalone/.next/server/app/index.rsc +3 -3
- package/.next/standalone/.next/server/app/login/admin/page.js +2 -2
- package/.next/standalone/.next/server/app/login/admin/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +1 -1
- package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
- 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 +3 -3
- package/.next/standalone/.next/server/app/login/page.js +2 -2
- package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.html +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +3 -3
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +3 -3
- 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 +3 -3
- package/.next/standalone/.next/server/app/page.js +2 -2
- package/.next/standalone/.next/server/app/page.js.nft.json +1 -1
- 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 +4 -4
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +4 -4
- package/.next/standalone/.next/server/app-paths-manifest.json +41 -43
- package/.next/standalone/.next/server/chunks/1463.js +1 -1
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/{7258.js → 2516.js} +1 -1
- 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 +1 -1
- package/.next/standalone/.next/server/chunks/3371.js +1 -0
- package/.next/standalone/.next/server/chunks/3373.js +1 -1
- package/.next/standalone/.next/server/chunks/3419.js +1 -1
- package/.next/standalone/.next/server/chunks/4827.js +1 -0
- package/.next/standalone/.next/server/chunks/4958.js +1 -0
- package/.next/standalone/.next/server/chunks/5300.js +1 -1
- package/.next/standalone/.next/server/chunks/5631.js +1 -0
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6207.js +1 -1
- package/.next/standalone/.next/server/chunks/6496.js +1 -0
- package/.next/standalone/.next/server/chunks/679.js +1 -1
- package/.next/standalone/.next/server/chunks/6817.js +1 -0
- package/.next/standalone/.next/server/chunks/{178.js → 704.js} +3 -3
- package/.next/standalone/.next/server/chunks/7364.js +1 -1
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/7578.js +1 -1
- package/.next/standalone/.next/server/chunks/8448.js +1 -0
- package/.next/standalone/.next/server/chunks/{8267.js → 8481.js} +1 -1
- package/.next/standalone/.next/server/chunks/8577.js +153 -0
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/9726.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/middleware-react-loadable-manifest.js +1 -1
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/server/src/middleware.js +5 -5
- package/.next/standalone/.next/static/CIg9Mtv4fKIeKqPY5Rczv/_buildManifest.js +1 -0
- package/.next/standalone/.next/static/chunks/15653-31c406c41bf58048.js +1 -0
- package/.next/standalone/.next/static/chunks/1892-9c03d4d3560ff572.js +1 -0
- package/.next/standalone/.next/static/chunks/225-7b0507c29df705f1.js +1 -0
- package/.next/standalone/.next/static/chunks/24459-3bc9657d71c77b47.js +1 -0
- package/.next/standalone/.next/static/chunks/38296-316ba18af72385fb.js +1 -0
- package/.next/standalone/.next/static/chunks/38366.62260b57e5f4b09d.js +1 -0
- package/.next/standalone/.next/static/chunks/46055-f786ace4b994dc40.js +1 -0
- package/.next/standalone/.next/static/chunks/{4860.c3c83713d1f163a5.js → 4860.18e9c1a01636e309.js} +1 -1
- package/.next/standalone/.next/static/chunks/{49965-fa11628d5ac8fbbe.js → 52064-74d81c8d682deb6b.js} +1 -1
- package/.next/standalone/.next/static/chunks/57362-9ece5cc290dab705.js +1 -0
- package/.next/standalone/.next/static/chunks/{14655-4f3bc7f3044c42c1.js → 58037-55d7422c6b808356.js} +1 -1
- package/.next/standalone/.next/static/chunks/63820-551bca4e19d0119c.js +1 -0
- package/.next/standalone/.next/static/chunks/68255-05c42a26602c6b37.js +1 -0
- package/.next/standalone/.next/static/chunks/75752-cc8fafe132943baa.js +1 -0
- package/.next/standalone/.next/static/chunks/80350-20c953d484f262ff.js +1 -0
- package/.next/standalone/.next/static/chunks/84169-71a87d06871ec9df.js +1 -0
- package/.next/standalone/.next/static/chunks/94743-aff8a51a7f7970a9.js +1 -0
- package/.next/standalone/.next/static/chunks/96752-ad15cc38599f12e2.js +1 -0
- package/.next/standalone/.next/static/chunks/{36493-5326c14a7240edc8.js → 97306-8834e12cdbeed920.js} +1 -1
- package/.next/standalone/.next/static/chunks/{99373.2b68fce200cc323e.js → 99373.c4a36dcd46ec841e.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-a3747bde1ddaba52.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-87b79c98e46fbd04.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-b2db3da2d7945904.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-0467d744b84aa2c2.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-7ebb779f0db4c58b.js → page-7abff55f9bfebab3.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-b3b2b2ba3d60893e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-0aff1fa7a814188c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-6dbfbe5d97855e42.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-b8fbcac7224342db.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-0a04a31e1b383094.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-e2a69b645ec9ae13.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-0bc22273214e522f.js → page-b760877bfcd12dff.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-111aed4d3319d64b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/agents/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/comments/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/repoint/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/events/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/health/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/ideas/conversational/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/resource-graph/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/projects/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/search/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/session/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-47e1d397c5fcef9e.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/callback/page-39a43f6d0245f8ca.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/page-acda3a31dc6a8280.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-10683852baf17426.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/{page-500aded75bf11ed6.js → page-8e20c8aa8ff90326.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/page-000b1349c8d5b652.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-7483083a976ed3d7.js → webpack-3551a4c7f9bfe638.js} +1 -1
- package/.next/standalone/.next/static/css/a80bf83b9122bfc5.css +1 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +3 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +11 -1
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +3 -1
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +3 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +11 -1
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +3 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/README.md +15 -2
- package/README.zh.md +15 -2
- package/cli/client-args.mjs +31 -9
- package/cli/control-handler.mjs +22 -5
- package/cli/daemon-lifecycle.mjs +192 -25
- package/cli/daemon-rest-client.mjs +6 -2
- package/cli/daemon-service.mjs +422 -0
- package/cli/daemon.mjs +181 -13
- package/cli/event-router.mjs +29 -10
- package/cli/prompts.mjs +61 -0
- package/cli/turn-reporter.mjs +26 -5
- package/cli/wake-queue.mjs +30 -0
- package/cli/waker.mjs +91 -22
- package/package.json +1 -1
- package/prisma/migrations/20260704023331_add_turn_interrupted_state/migration.sql +2 -0
- package/prisma/migrations/20260707104706_add_idea_is_container/migration.sql +2 -0
- package/prisma/schema.prisma +10 -2
- package/.next/standalone/.next/server/app/api/auth/refresh/route.js +0 -1
- package/.next/standalone/.next/server/app/api/auth/refresh/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/auth/session/route.js +0 -1
- package/.next/standalone/.next/server/app/api/auth/session/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/auth/session/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/api/keepalive/route.js +0 -1
- package/.next/standalone/.next/server/app/api/keepalive/route.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/api/keepalive/route_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/login/silent-refresh/page.js +0 -2
- package/.next/standalone/.next/server/app/login/silent-refresh/page.js.nft.json +0 -1
- package/.next/standalone/.next/server/app/login/silent-refresh/page_client-reference-manifest.js +0 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.html +0 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.meta +0 -7
- package/.next/standalone/.next/server/app/login/silent-refresh.rsc +0 -24
- package/.next/standalone/.next/server/chunks/298.js +0 -1
- package/.next/standalone/.next/server/chunks/6813.js +0 -1
- package/.next/standalone/.next/server/chunks/7421.js +0 -1
- package/.next/standalone/.next/server/chunks/7515.js +0 -1
- package/.next/standalone/.next/server/chunks/7912.js +0 -1
- package/.next/standalone/.next/server/chunks/8821.js +0 -1
- package/.next/standalone/.next/server/chunks/9273.js +0 -1
- package/.next/standalone/.next/server/chunks/937.js +0 -153
- package/.next/standalone/.next/static/W3KEB0tOAICVtfAUfR_M9/_buildManifest.js +0 -1
- package/.next/standalone/.next/static/chunks/10919-7f63b2801a92b8c6.js +0 -1
- package/.next/standalone/.next/static/chunks/1891-d4a9e756fefba3a9.js +0 -1
- package/.next/standalone/.next/static/chunks/20081-a2bf5c9f24d5d589.js +0 -1
- package/.next/standalone/.next/static/chunks/26394-4af487a51dd62832.js +0 -1
- package/.next/standalone/.next/static/chunks/2987-c15f09093b821b24.js +0 -1
- package/.next/standalone/.next/static/chunks/37784-95dee37276b1067b.js +0 -1
- package/.next/standalone/.next/static/chunks/43741-aeea04ab873ac4e9.js +0 -1
- package/.next/standalone/.next/static/chunks/49852-5337f139a2f87c46.js +0 -1
- package/.next/standalone/.next/static/chunks/56812-a6fe5225adc0b2ff.js +0 -1
- package/.next/standalone/.next/static/chunks/64894-71b047ae8ef2f3d8.js +0 -1
- package/.next/standalone/.next/static/chunks/78966.075119c3a72135ed.js +0 -1
- package/.next/standalone/.next/static/chunks/8796-69e708cb8603d8b4.js +0 -1
- package/.next/standalone/.next/static/chunks/91666-3fd4f3512a53ff20.js +0 -1
- package/.next/standalone/.next/static/chunks/97263-018d631416efa5cd.js +0 -1
- package/.next/standalone/.next/static/chunks/97868-55f18a05fe483d85.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-6061b60d52262d3c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-78ab05c72bcd04fd.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-478cce81afbfc145.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-494b80e61b485870.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-bfbfc5005de2be13.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-fbb4dd4124525f97.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-164fe175720b24a1.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-2742c745a90f843f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-f2313bf05387b39b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-955e8fd8d7b0b7c8.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-960ab78b5055780c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/[uuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/companies/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/login/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/admin/session/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agent-connections/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/[uuid]/sessions/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/agents/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/[uuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/api-keys/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/callback/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/check-default/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/company-oidc/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/default-login/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/identify/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/logout/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/me/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/refresh/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/session/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/auth/sync-token/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/comments/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/control/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/execution-state/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/executions/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/pending-turns/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/report-interrupt/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/resume/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/transcript/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon/turn-advance/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/instruction/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/repoint/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/[sessionUuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/ad-hoc/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/daemon-sessions/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/documents/[uuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/entities/[type]/[uuid]/root-idea/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/notifications/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/events/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/health/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/claim/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/preview/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/move/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/parent/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/release/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/ideas/[uuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/keepalive/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mcp/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/me/assignments/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/mentionables/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/archive/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/[uuid]/read/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/preferences/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/read-all/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/notifications/unread-count/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/dashboard/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/[uuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/project-groups/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/activity/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/available/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/documents/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/group/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/ideas/tracker/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/proposals/summary/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/resource-graph/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/stats/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/dependencies/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/[uuid]/tasks/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/projects/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/approve/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/close/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/reject/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/revoke/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/proposals/[uuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/search/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/sessions/[uuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/claim/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/dependencies/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/release/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/api/tasks/[uuid]/sessions/route-31ae6abada6e6a64.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/callback/page-6cad93f5c610b047.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/page-d2513f477211dd6f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-597e0f3377f18d29.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/silent-refresh/page-a26d1af61578c96e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/page-075afd218994d377.js +0 -1
- package/.next/standalone/.next/static/css/ed6baccd62b81c4e.css +0 -1
- /package/.next/standalone/.next/static/{W3KEB0tOAICVtfAUfR_M9 → CIg9Mtv4fKIeKqPY5Rczv}/_ssgManifest.js +0 -0
|
@@ -4,7 +4,7 @@ description: Chorus Development workflow — claim tasks, report work, self-chec
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.13.2"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -269,4 +269,6 @@ chorus_add_comment({ targetType: "task", targetUuid: "<task-uuid>", content: "Re
|
|
|
269
269
|
## Next
|
|
270
270
|
|
|
271
271
|
- After submitting for verification, an Admin reviews using the `review-chorus` skill (`<BASE_URL>/skill/review-chorus/SKILL.md`)
|
|
272
|
+
- **Human "Start Development" wake:** a `start_development` wake (the human clicked **Start Development** on the idea-detail panel) means: claim and execute ALL remaining tasks of the idea's approved proposal in dependency order — loop this workflow until no claimable task remains, leaving `to_verify` and other-session tasks untouched.
|
|
273
|
+
- **Human "Yolo" wake:** a `yolo_requested` wake (the human clicked **Yolo** on the idea-detail panel) means: drive the WHOLE idea to done via the yolo skill (the full-auto AI-DLC pipeline), not just the execute stage — read the idea's current state and resume from whatever phase it is in. Unlike `start_development` it is stage-adaptive, and it must never merge or push a PR without explicit human approval.
|
|
272
274
|
- For platform overview and shared tools, see `chorus` skill (`<BASE_URL>/skill/chorus/SKILL.md`)
|
|
@@ -4,7 +4,7 @@ description: Chorus Idea workflow — claim ideas, run elaboration rounds, and p
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.13.2"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -283,6 +283,14 @@ When a new direction surfaces (during elaboration, brainstorm, or review), decid
|
|
|
283
283
|
|
|
284
284
|
This is a soft heuristic, not a rule — use judgment. Cycle prevention is automatic: you cannot set a parent that is the idea itself or one of its descendants. Parent and child must be in the same project (cross-project lineage is not supported yet). Deleting a parent re-parents its children to top-level (it never cascades).
|
|
285
285
|
|
|
286
|
+
### Theme ideas
|
|
287
|
+
|
|
288
|
+
A **theme** is an idea that only *groups* related children under a shared direction — it is not a deliverable itself. Set `isContainer: true` on `chorus_pm_create_idea` / `chorus_edit_idea` (or the detail-panel toggle) to make one; it is freely reversible. The one rule that matters: **a theme cannot create a proposal** — to deliver its direction, derive a child idea (`parentUuid = <theme>`) and write the proposal on the child. A theme may still elaborate (its elaboration is shared context for children), and its status/progress rolls up from its children. Everything else is self-documented on the tool params.
|
|
289
|
+
|
|
290
|
+
#### Theme decompose (daemon-assisted)
|
|
291
|
+
|
|
292
|
+
When a theme is created via the conversational "help me break this into child ideas" entry, don't create children immediately — **propose then create**: (1) edit the theme + optionally one short scope-elaboration round; (2) propose the candidate children as an elaboration round (`chorus_pm_start_elaboration`), one single-select question per candidate, for the user to accept/decline in the panel; (3) on the answer re-wake, create each accepted child with `chorus_pm_create_idea` (`parentUuid = <theme>`, left in `open`).
|
|
293
|
+
|
|
286
294
|
---
|
|
287
295
|
|
|
288
296
|
## Tips
|
|
@@ -299,4 +307,6 @@ This is a soft heuristic, not a rule — use judgment. Cycle prevention is autom
|
|
|
299
307
|
|
|
300
308
|
- Once elaboration is resolved, use the `proposal-chorus` skill (`<BASE_URL>/skill/proposal-chorus/SKILL.md`) to create a Proposal with document and task drafts
|
|
301
309
|
- **Human "Verify Elaborate" handoff:** when a human clicks **Verify Elaborate** on the idea-detail panel, Chorus resolves the elaboration and wakes the Idea's assigned daemon agent to write the proposal — so the woken agent picks up this idea→proposal handoff automatically (no human-authored proposal needed).
|
|
310
|
+
- **Human "Start Development" handoff:** once the proposal is approved and unfinished tasks remain, the idea-detail panel shows a **Start Development** button (enabled while the assignee agent is online). A `start_development` wake means: claim and execute ALL remaining tasks of the idea's approved proposal in dependency order until none are claimable — not just one task.
|
|
311
|
+
- **Human "Yolo" handoff:** the idea-detail panel also shows a **Yolo** button at ANY incomplete stage (enabled while the assignee agent is online), confirmed via a dialog before it fires. A `yolo_requested` wake means: drive the WHOLE idea to done via the yolo skill (the full-auto AI-DLC pipeline) — read the idea's current state first and resume from whatever phase it is in (self-elaborate + write the proposal if not yet resolved; execute if a proposal is approved with open tasks; etc.), never assuming a fixed stage. Complete through done + the completion report, but never merge or push a PR without explicit human approval.
|
|
302
312
|
- For platform overview and shared tools, see the `chorus` skill (`<BASE_URL>/skill/chorus/SKILL.md`)
|
|
@@ -4,7 +4,7 @@ description: Chorus Proposal workflow — create proposals with document and tas
|
|
|
4
4
|
license: AGPL-3.0
|
|
5
5
|
metadata:
|
|
6
6
|
author: chorus
|
|
7
|
-
version: "0.
|
|
7
|
+
version: "0.13.2"
|
|
8
8
|
category: project-management
|
|
9
9
|
mcp_server: chorus
|
|
10
10
|
---
|
|
@@ -83,6 +83,8 @@ chorus_pm_create_proposal({
|
|
|
83
83
|
|
|
84
84
|
**Multiple Ideas:** You can combine multiple ideas into one proposal by passing multiple UUIDs in `inputUuids`.
|
|
85
85
|
|
|
86
|
+
> **A theme cannot be a proposal input** — `chorus_pm_create_proposal` rejects any input idea with `isContainer = true`. Derive a child idea from the theme and write the proposal on the child instead. (See the theme-ideas section of the `idea-chorus` skill.)
|
|
87
|
+
|
|
86
88
|
### Step 2: Add Document Drafts
|
|
87
89
|
|
|
88
90
|
Add document drafts one at a time:
|
package/README.md
CHANGED
|
@@ -104,9 +104,12 @@ The `chorus daemon` connects your local machine to a remote Chorus server as an
|
|
|
104
104
|
chorus login # Authenticate (opens browser)
|
|
105
105
|
chorus daemon # Start daemon in foreground
|
|
106
106
|
chorus daemon -d # Start daemon in background (detached)
|
|
107
|
-
chorus daemon
|
|
107
|
+
chorus daemon install # Install as a boot-autostart service (Linux) — recommended
|
|
108
|
+
chorus daemon uninstall # Remove the installed service
|
|
109
|
+
chorus daemon stop # Stop the daemon (delegates to systemd when installed)
|
|
110
|
+
chorus daemon stop --force # Force-clean the pidfile if a stuck pid blocks stop
|
|
108
111
|
chorus daemon status # Check daemon status
|
|
109
|
-
chorus daemon restart # Restart
|
|
112
|
+
chorus daemon restart # Restart the daemon
|
|
110
113
|
chorus daemon logs # View daemon logs
|
|
111
114
|
```
|
|
112
115
|
|
|
@@ -114,12 +117,22 @@ chorus daemon logs # View daemon logs
|
|
|
114
117
|
|
|
115
118
|
- **Claude Code & Codex backends** — Auto-detects the `claude` (or `codex`) CLI on your PATH; pick with `--agent codex`
|
|
116
119
|
- **Background mode** — Run with `-d` flag; manage with `stop/restart/logs`
|
|
120
|
+
- **Boot-autostart service** — `chorus daemon install` generates a correct `systemd --user` unit and starts it (see below); `status/stop/restart/logs` then transparently delegate to systemd
|
|
117
121
|
- **Permission modes** — Default is full access (yolo); use `--chorus-only` to restrict to Chorus MCP tools only
|
|
118
122
|
- **Multi-path** — Serve several working directories from one daemon with repeatable `--cwd` (see below)
|
|
119
123
|
- **Interactive setup** — Prompts for credentials on first start if not already configured
|
|
120
124
|
|
|
121
125
|
The daemon requires authentication. Run `chorus login` first, or it will prompt for credentials interactively on first start (if running in a terminal).
|
|
122
126
|
|
|
127
|
+
#### Run at boot / login — `chorus daemon install`
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
chorus daemon install --cwd ~/work/repo-a --cwd ~/work/repo-b # install + start now, autostart at login
|
|
131
|
+
chorus daemon uninstall # disable + remove the service
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
On Linux, `install` generates a `systemd --user` unit that runs the daemon in the **foreground** (`Type=simple`, no `-d`) so systemd owns the process directly, then `daemon-reload` + `enable --now`. It captures the `--cwd`/`--agent`/`--chorus-only` flags you pass. Do **not** hand-write a `Type=forking` unit around `chorus daemon -d` — the daemon self-daemonizes, which systemd can't track and which loops on restart; let `install` write the right unit. On macOS/Windows, `install` prints a correct template you install manually. Run `chorus login` first so the unit can see your credentials. See [docs/DAEMON.md](docs/DAEMON.md) for details.
|
|
135
|
+
|
|
123
136
|
#### Serve multiple working directories
|
|
124
137
|
|
|
125
138
|
One daemon can serve several local working directories at once — each declared path registers as an independent connection (its own session + wake loop) under the same agent. A path is **just** a directory the daemon serves; it carries no project binding.
|
package/README.zh.md
CHANGED
|
@@ -95,9 +95,12 @@ DATABASE_URL=postgresql://user:pass@host:5432/chorus chorus
|
|
|
95
95
|
chorus login # 认证(打开浏览器)
|
|
96
96
|
chorus daemon # 前台启动 daemon
|
|
97
97
|
chorus daemon -d # 后台启动 daemon(分离模式)
|
|
98
|
-
chorus daemon
|
|
98
|
+
chorus daemon install # 安装为开机自启服务(Linux)—— 推荐
|
|
99
|
+
chorus daemon uninstall # 卸载已安装的服务
|
|
100
|
+
chorus daemon stop # 停止 daemon(已安装服务时委派给 systemd)
|
|
101
|
+
chorus daemon stop --force # pid 卡死时强制清理 pidfile
|
|
99
102
|
chorus daemon status # 查看 daemon 状态
|
|
100
|
-
chorus daemon restart #
|
|
103
|
+
chorus daemon restart # 重启 daemon
|
|
101
104
|
chorus daemon logs # 查看 daemon 日志
|
|
102
105
|
```
|
|
103
106
|
|
|
@@ -105,12 +108,22 @@ chorus daemon logs # 查看 daemon 日志
|
|
|
105
108
|
|
|
106
109
|
- **Claude Code 与 Codex 后端** — 自动检测 PATH 中的 `claude`(或 `codex`)CLI;用 `--agent codex` 选择
|
|
107
110
|
- **后台模式** — 使用 `-d` 标志后台运行;用 `stop/restart/logs` 管理
|
|
111
|
+
- **开机自启服务** — `chorus daemon install` 生成正确的 `systemd --user` unit 并启动(见下文);此后 `status/stop/restart/logs` 会自动委派给 systemd
|
|
108
112
|
- **权限模式** — 默认完全访问(yolo);使用 `--chorus-only` 限制为仅 Chorus MCP 工具
|
|
109
113
|
- **多路径** — 用可重复的 `--cwd` 让单个 daemon 同时服务多个工作目录(见下文)
|
|
110
114
|
- **交互式设置** — 首次启动时如未配置凭证会提示输入
|
|
111
115
|
|
|
112
116
|
daemon 需要先认证。首次使用请先运行 `chorus login`,或者 daemon 会在首次启动时交互式提示输入凭证(如果在终端中运行)。
|
|
113
117
|
|
|
118
|
+
#### 开机 / 登录时自启 —— `chorus daemon install`
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
chorus daemon install --cwd ~/work/repo-a --cwd ~/work/repo-b # 立即安装并启动,登录时自启
|
|
122
|
+
chorus daemon uninstall # 停用并移除该服务
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
在 Linux 上,`install` 会生成一个 `systemd --user` unit,让 daemon 以**前台**方式运行(`Type=simple`,不带 `-d`),从而由 systemd 直接接管进程,然后 `daemon-reload` + `enable --now`。它会捕获你传入的 `--cwd`/`--agent`/`--chorus-only` 参数。**不要**手写 `Type=forking` + `chorus daemon -d` 的 unit —— daemon 会自我 daemon 化,systemd 追踪不到,重启时会陷入死循环;交给 `install` 写正确的 unit。在 macOS/Windows 上,`install` 会打印一份可手动安装的正确模板。请先运行 `chorus login`,让 unit 能读到凭证。详见 [docs/DAEMON.md](docs/DAEMON.md)。
|
|
126
|
+
|
|
114
127
|
#### 服务多个工作目录
|
|
115
128
|
|
|
116
129
|
一个 daemon 可以同时服务多个本地工作目录——每个声明的路径会注册为一条独立连接(各自拥有会话与唤起循环),归属同一个 Agent。路径**仅仅**是 daemon 服务的目录,不携带任何项目绑定。
|
package/cli/client-args.mjs
CHANGED
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* default long-lived daemon) is intentionally NOT in this set — it is the
|
|
12
12
|
* absence of a recognized sub-action token.
|
|
13
13
|
*/
|
|
14
|
-
export const DAEMON_ACTIONS = new Set(["stop", "status", "restart", "logs"]);
|
|
14
|
+
export const DAEMON_ACTIONS = new Set(["stop", "status", "restart", "logs", "install", "uninstall"]);
|
|
15
15
|
|
|
16
16
|
/** Known agent backends. Only `claude-code` is implemented; the rest reserve
|
|
17
17
|
* the extension point (see daemon-agent-selection). Exported for the resolver
|
|
@@ -22,7 +22,8 @@ export const KNOWN_AGENTS = new Set(["claude-code"]);
|
|
|
22
22
|
* Parse the client-subcommand flags out of an arg list. Recognizes the
|
|
23
23
|
* pre-existing `--url` / `--api-key` / `--sigint-timeout` (space and `=` forms)
|
|
24
24
|
* and boolean `--yolo`, plus the new `--agent <type>` (space + `=`), boolean
|
|
25
|
-
* `--chorus-only`, `--verbose`, `-d`/`--detach`,
|
|
25
|
+
* `--chorus-only`, `--verbose`, `-d`/`--detach`, `--force` (stop's forced
|
|
26
|
+
* pidfile cleanup), and `--help`/`-h`.
|
|
26
27
|
*
|
|
27
28
|
* Only keys that appear are set, so callers can distinguish "unset" from
|
|
28
29
|
* "false" (important for layered env/flag precedence downstream).
|
|
@@ -37,7 +38,7 @@ export const KNOWN_AGENTS = new Set(["claude-code"]);
|
|
|
37
38
|
* @returns {{
|
|
38
39
|
* url?: string, apiKey?: string, yolo?: boolean, sigintTimeout?: string,
|
|
39
40
|
* agent?: string, chorusOnly?: boolean, verbose?: boolean, detach?: boolean,
|
|
40
|
-
* cwd?: string[], help?: boolean,
|
|
41
|
+
* cwd?: string[], force?: boolean, help?: boolean,
|
|
41
42
|
* }}
|
|
42
43
|
*/
|
|
43
44
|
export function parseClientFlags(argv) {
|
|
@@ -61,6 +62,7 @@ export function parseClientFlags(argv) {
|
|
|
61
62
|
else if (a === "--chorus-only") out.chorusOnly = true;
|
|
62
63
|
else if (a === "--verbose") out.verbose = true;
|
|
63
64
|
else if (a === "-d" || a === "--detach") out.detach = true;
|
|
65
|
+
else if (a === "--force") out.force = true;
|
|
64
66
|
else if (a === "--help" || a === "-h") out.help = true;
|
|
65
67
|
}
|
|
66
68
|
return out;
|
|
@@ -76,7 +78,7 @@ export function parseClientFlags(argv) {
|
|
|
76
78
|
* or an unknown leading token) is the normal long-lived daemon (`run`).
|
|
77
79
|
*
|
|
78
80
|
* @param {string[]} rest argv after the `daemon` subcommand token
|
|
79
|
-
* @returns {"run"|"stop"|"status"|"restart"|"logs"}
|
|
81
|
+
* @returns {"run"|"stop"|"status"|"restart"|"logs"|"install"|"uninstall"}
|
|
80
82
|
*/
|
|
81
83
|
export function parseDaemonAction(rest) {
|
|
82
84
|
const first = rest[0];
|
|
@@ -98,10 +100,18 @@ agent notification stream, and wake a local headless agent on task dispatch.
|
|
|
98
100
|
USAGE
|
|
99
101
|
chorus daemon [options] Run the daemon (foreground)
|
|
100
102
|
chorus daemon -d [options] Run the daemon in the background (detached)
|
|
101
|
-
chorus daemon
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
chorus daemon
|
|
103
|
+
chorus daemon install [options] Install as a boot-autostart service and
|
|
104
|
+
start it now (Linux systemd --user;
|
|
105
|
+
macOS/Windows print a template + steps)
|
|
106
|
+
chorus daemon uninstall Remove the installed service (Linux) /
|
|
107
|
+
print removal steps (macOS/Windows)
|
|
108
|
+
chorus daemon stop Stop the daemon (delegates to the service
|
|
109
|
+
manager when installed, else the pidfile)
|
|
110
|
+
chorus daemon stop --force Force-clean the pidfile when a stuck or
|
|
111
|
+
unverifiable pid blocks a normal stop
|
|
112
|
+
chorus daemon status Show whether the daemon is running
|
|
113
|
+
chorus daemon restart Restart the daemon
|
|
114
|
+
chorus daemon logs Show the daemon log (journal when installed)
|
|
105
115
|
|
|
106
116
|
OPTIONS
|
|
107
117
|
--url <url> Remote Chorus server URL (env: CHORUS_URL)
|
|
@@ -130,11 +140,23 @@ CREDENTIALS
|
|
|
130
140
|
~/.chorus/daemon.json (from 'chorus login') > Claude Code plugin config.
|
|
131
141
|
On a TTY with no resolvable credentials, the daemon prompts to complete them.
|
|
132
142
|
|
|
143
|
+
SERVICE (install)
|
|
144
|
+
'chorus daemon install' is the recommended way to run the daemon permanently.
|
|
145
|
+
On Linux it generates a systemd --user unit that runs the daemon in the
|
|
146
|
+
FOREGROUND (Type=simple, no -d) so systemd owns the process directly: it
|
|
147
|
+
starts at login, restarts on failure, and 'systemctl --user stop' shuts it
|
|
148
|
+
down gracefully. Do NOT hand-write a Type=forking unit around 'chorus daemon
|
|
149
|
+
-d' — the daemon self-daemonizes, which systemd cannot track and which loops
|
|
150
|
+
on restart. The install captures the --cwd / --agent / --chorus-only flags you
|
|
151
|
+
pass. On macOS/Windows install prints a correct template you install manually.
|
|
152
|
+
|
|
133
153
|
EXAMPLES
|
|
134
154
|
chorus daemon # Foreground, default yolo (TTY confirms once)
|
|
135
155
|
chorus daemon --chorus-only # Restrict the woken agent to Chorus tools
|
|
136
156
|
chorus daemon -d # Background; see 'chorus daemon logs'
|
|
137
|
-
chorus daemon
|
|
157
|
+
chorus daemon install --cwd ~/proj # Install + start as a boot service (Linux)
|
|
158
|
+
chorus daemon uninstall # Remove the installed service
|
|
159
|
+
chorus daemon stop # Stop the daemon
|
|
138
160
|
`;
|
|
139
161
|
}
|
|
140
162
|
|
package/cli/control-handler.mjs
CHANGED
|
@@ -38,8 +38,13 @@ const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
|
38
38
|
* (null until the SSE handshake reports it).
|
|
39
39
|
* killer?: (child: any, opts: any) => Promise<any>, Injectable; defaults to killProcessTree.
|
|
40
40
|
* sigintTimeoutMs?: number, Layered-resolved escalation window.
|
|
41
|
-
* redispatchResume?: (entityType: string, entityUuid: string) => void,
|
|
42
|
-
* for a resumed entity (子3); injected
|
|
41
|
+
* redispatchResume?: (entityType: string, entityUuid: string, resumeReason?: string) => void,
|
|
42
|
+
* Re-run a wake for a resumed entity (子3); injected
|
|
43
|
+
* by the daemon. `resumeReason` ("user" | "crash",
|
|
44
|
+
* add-crash-execution-resume) is the row's prior
|
|
45
|
+
* interruptedReason from the control event — it
|
|
46
|
+
* selects the continue-instruction variant; absent
|
|
47
|
+
* or unknown degrades to the user-resume prompt.
|
|
43
48
|
* deliverTurn?: (turnUuid?: string) => void, Dispatch a PRECISE pending turn by uuid
|
|
44
49
|
* (子2 — origin-only live delivery). On a
|
|
45
50
|
* `deliver_turn` control event (after the Check-1
|
|
@@ -134,11 +139,23 @@ export function createControlHandler(deps) {
|
|
|
134
139
|
|
|
135
140
|
// --- resume: re-dispatch the wake for this entity (子3). No running-child
|
|
136
141
|
// check — the subprocess is gone (it was interrupted); the wake path will
|
|
137
|
-
// re-spawn and `--resume` the existing session.
|
|
142
|
+
// re-spawn and `--resume` the existing session. `resumeReason` (the row's
|
|
143
|
+
// prior interruptedReason, add-crash-execution-resume) is threaded through
|
|
144
|
+
// so the wake prompt can state a crash explicitly; anything but the two
|
|
145
|
+
// known values (or an older server sending none) degrades to undefined →
|
|
146
|
+
// the existing user-resume prompt. ---
|
|
138
147
|
if (command === "resume") {
|
|
139
|
-
|
|
148
|
+
const resumeReason =
|
|
149
|
+
event.resumeReason === "user" || event.resumeReason === "crash"
|
|
150
|
+
? event.resumeReason
|
|
151
|
+
: undefined;
|
|
152
|
+
logger.info(
|
|
153
|
+
`[Chorus] control: resuming ${entityType}:${entityUuid} (re-dispatch wake` +
|
|
154
|
+
(resumeReason ? `, reason=${resumeReason}` : "") +
|
|
155
|
+
`)`
|
|
156
|
+
);
|
|
140
157
|
try {
|
|
141
|
-
redispatchResume?.(entityType, entityUuid);
|
|
158
|
+
redispatchResume?.(entityType, entityUuid, resumeReason);
|
|
142
159
|
} catch (err) {
|
|
143
160
|
logger.warn(`[Chorus] control: resume re-dispatch failed for ${entityType}:${entityUuid}: ${err}`);
|
|
144
161
|
}
|
package/cli/daemon-lifecycle.mjs
CHANGED
|
@@ -7,10 +7,11 @@
|
|
|
7
7
|
// are unit-testable from a single host.
|
|
8
8
|
//
|
|
9
9
|
// State files live alongside the credentials in ~/.chorus:
|
|
10
|
-
// pidfile ~/.chorus/daemon.pid (
|
|
10
|
+
// pidfile ~/.chorus/daemon.pid (JSON {pid, startedAt?, argsHint?}; legacy
|
|
11
|
+
// bare-number files from older CLIs still read)
|
|
11
12
|
// logfile ~/.chorus/daemon.log (its redirected stdout+stderr)
|
|
12
13
|
|
|
13
|
-
import { spawn } from "node:child_process";
|
|
14
|
+
import { spawn, spawnSync } from "node:child_process";
|
|
14
15
|
import {
|
|
15
16
|
existsSync,
|
|
16
17
|
mkdirSync,
|
|
@@ -32,6 +33,7 @@ function defaultIO() {
|
|
|
32
33
|
unlinkSync,
|
|
33
34
|
writeFileSync,
|
|
34
35
|
spawn,
|
|
36
|
+
spawnSync,
|
|
35
37
|
// process.kill with signal 0 is the portable liveness probe (no signal sent).
|
|
36
38
|
kill: (pid, sig) => process.kill(pid, sig),
|
|
37
39
|
platform: process.platform,
|
|
@@ -50,48 +52,183 @@ export function logFilePath(io = defaultIO()) {
|
|
|
50
52
|
}
|
|
51
53
|
|
|
52
54
|
/**
|
|
53
|
-
*
|
|
55
|
+
* The cmdline marker every legacy (pre-identity) chorus daemon carries — the
|
|
56
|
+
* fallback identity check when the pidfile recorded no argsHint.
|
|
57
|
+
*/
|
|
58
|
+
const DAEMON_CMD_MARKER = "daemon";
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Read the recorded pidfile as a structured record, or null when absent /
|
|
62
|
+
* unreadable / malformed. Two on-disk formats:
|
|
63
|
+
* - JSON `{pid, startedAt?, argsHint?}` (current — written by startBackground)
|
|
64
|
+
* - bare pid number (legacy — pre-identity CLIs) → `{ pid, legacy: true }`
|
|
54
65
|
* @param {object} [io]
|
|
55
|
-
* @returns {number|null}
|
|
66
|
+
* @returns {{ pid: number, startedAt?: string, argsHint?: string, legacy?: boolean }|null}
|
|
56
67
|
*/
|
|
57
|
-
export function
|
|
68
|
+
export function readPidRecord(io = defaultIO()) {
|
|
58
69
|
const path = pidFilePath(io);
|
|
59
70
|
try {
|
|
60
71
|
if (!io.existsSync(path)) return null;
|
|
61
|
-
const raw = io.readFileSync(path, "utf8");
|
|
62
|
-
|
|
63
|
-
|
|
72
|
+
const raw = String(io.readFileSync(path, "utf8")).trim();
|
|
73
|
+
if (raw.startsWith("{")) {
|
|
74
|
+
const parsed = JSON.parse(raw);
|
|
75
|
+
const pid = Number.parseInt(String(parsed.pid), 10);
|
|
76
|
+
if (!Number.isInteger(pid) || pid <= 0) return null;
|
|
77
|
+
const record = { pid };
|
|
78
|
+
if (typeof parsed.startedAt === "string" && parsed.startedAt) record.startedAt = parsed.startedAt;
|
|
79
|
+
if (typeof parsed.argsHint === "string" && parsed.argsHint) record.argsHint = parsed.argsHint;
|
|
80
|
+
return record;
|
|
81
|
+
}
|
|
82
|
+
const pid = Number.parseInt(raw, 10);
|
|
83
|
+
return Number.isInteger(pid) && pid > 0 ? { pid, legacy: true } : null;
|
|
64
84
|
} catch {
|
|
65
85
|
return null;
|
|
66
86
|
}
|
|
67
87
|
}
|
|
68
88
|
|
|
69
89
|
/**
|
|
70
|
-
*
|
|
71
|
-
*
|
|
90
|
+
* Read the recorded pid, or null when absent / unreadable / malformed.
|
|
91
|
+
* Thin compatibility wrapper over readPidRecord.
|
|
92
|
+
* @param {object} [io]
|
|
93
|
+
* @returns {number|null}
|
|
94
|
+
*/
|
|
95
|
+
export function readPid(io = defaultIO()) {
|
|
96
|
+
return readPidRecord(io)?.pid ?? null;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Query the identity (command line + start time) of the process currently
|
|
101
|
+
* occupying `pid`. One subprocess invocation, argument arrays only (no
|
|
102
|
+
* `shell:true`), pure JS:
|
|
103
|
+
* - POSIX: `ps -p <pid> -o lstart=,args=` (lstart is second-resolution and
|
|
104
|
+
* stable across probes of the same process). busybox `ps` rejects `-p` and
|
|
105
|
+
* `-o lstart` → retry `ps -o pid=,args=` (full-table) and filter by the
|
|
106
|
+
* pid column for cmdline-only verification.
|
|
107
|
+
* - Windows: PowerShell `Get-CimInstance Win32_Process` (wmic is deprecated).
|
|
72
108
|
* @param {number} pid @param {object} [io]
|
|
109
|
+
* @returns {{ cmdline: string, startedAt: string|null }|null} null = query failed
|
|
73
110
|
*/
|
|
74
|
-
export function
|
|
75
|
-
if (!Number.isInteger(pid) || pid <= 0) return
|
|
111
|
+
export function queryProcessIdentity(pid, io = defaultIO()) {
|
|
112
|
+
if (!Number.isInteger(pid) || pid <= 0) return null;
|
|
76
113
|
try {
|
|
77
|
-
io.
|
|
78
|
-
|
|
114
|
+
if (io.platform === "win32") {
|
|
115
|
+
const r = io.spawnSync(
|
|
116
|
+
"powershell",
|
|
117
|
+
[
|
|
118
|
+
"-NoProfile",
|
|
119
|
+
"-Command",
|
|
120
|
+
`Get-CimInstance Win32_Process -Filter 'ProcessId=${pid}' | Select-Object CommandLine,CreationDate | ConvertTo-Json`,
|
|
121
|
+
],
|
|
122
|
+
{ encoding: "utf8", windowsHide: true }
|
|
123
|
+
);
|
|
124
|
+
if (!r || r.status !== 0 || !r.stdout) return null;
|
|
125
|
+
const parsed = JSON.parse(r.stdout);
|
|
126
|
+
if (!parsed || typeof parsed.CommandLine !== "string") return null;
|
|
127
|
+
return { cmdline: parsed.CommandLine, startedAt: parsed.CreationDate ? String(parsed.CreationDate) : null };
|
|
128
|
+
}
|
|
129
|
+
// POSIX: lstart= + args= in one call. Output shape (no headers):
|
|
130
|
+
// "Thu Jul 2 21:22:55 2026 /usr/bin/node /x/chorus.mjs daemon"
|
|
131
|
+
// lstart is a fixed 5-field prefix (dow mon dd hh:mm:ss yyyy).
|
|
132
|
+
const full = io.spawnSync("ps", ["-p", String(pid), "-o", "lstart=,args="], { encoding: "utf8" });
|
|
133
|
+
if (full && full.status === 0 && full.stdout && full.stdout.trim()) {
|
|
134
|
+
const line = full.stdout.trim();
|
|
135
|
+
const fields = line.split(/\s+/);
|
|
136
|
+
if (fields.length >= 6) {
|
|
137
|
+
const startedAt = fields.slice(0, 5).join(" ");
|
|
138
|
+
const cmdline = fields.slice(5).join(" ");
|
|
139
|
+
if (cmdline) return { cmdline, startedAt };
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// busybox fallback: busybox ps rejects -p AND -o lstart (it only knows -o
|
|
143
|
+
// and -T), so list every process as "pid args" and filter by the pid
|
|
144
|
+
// column ourselves. Cmdline verification still possible; no start time.
|
|
145
|
+
const argsOnly = io.spawnSync("ps", ["-o", "pid=,args="], { encoding: "utf8" });
|
|
146
|
+
if (argsOnly && argsOnly.status === 0 && argsOnly.stdout) {
|
|
147
|
+
for (const line of argsOnly.stdout.split("\n")) {
|
|
148
|
+
const m = line.trim().match(/^(\d+)\s+(.+)$/);
|
|
149
|
+
if (m && Number.parseInt(m[1], 10) === pid) {
|
|
150
|
+
return { cmdline: m[2].trim(), startedAt: null };
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return null;
|
|
155
|
+
} catch {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* Is the process recorded by `record` still OUR live daemon? Identity-verified
|
|
162
|
+
* probe (fix-daemon-stale-pid-identity): pid existence alone is not enough —
|
|
163
|
+
* after a reboot the OS recycles pids, and a foreign owner surfaces as EPERM,
|
|
164
|
+
* which the old probe misread as "daemon alive". Decision table (tech design):
|
|
165
|
+
* - ESRCH / invalid pid → false (stale)
|
|
166
|
+
* - pid exists (OK or EPERM):
|
|
167
|
+
* identity recorded → argsHint (when recorded) decides ALONE: cmdline
|
|
168
|
+
* contains it → true, else false. startedAt only
|
|
169
|
+
* decides when no argsHint was recorded; query
|
|
170
|
+
* failed → true (never auto-clean an identity we
|
|
171
|
+
* could not verify)
|
|
172
|
+
* legacy record → cmdline contains the daemon marker → true;
|
|
173
|
+
* foreign cmdline → false; query failed → EPERM
|
|
174
|
+
* proves it is not ours (same-user daemon) → false,
|
|
175
|
+
* while a signalable pid stays conservatively true
|
|
176
|
+
* Accepts a bare pid (number) for backward compatibility → treated as legacy.
|
|
177
|
+
* @param {number|{pid:number,startedAt?:string,argsHint?:string,legacy?:boolean}} record
|
|
178
|
+
* @param {object} [io]
|
|
179
|
+
*/
|
|
180
|
+
export function processAlive(record, io = defaultIO()) {
|
|
181
|
+
const rec = typeof record === "number" ? { pid: record, legacy: true } : record;
|
|
182
|
+
if (!rec || !Number.isInteger(rec.pid) || rec.pid <= 0) return false;
|
|
183
|
+
let eperm = false;
|
|
184
|
+
try {
|
|
185
|
+
io.kill(rec.pid, 0);
|
|
79
186
|
} catch (err) {
|
|
80
|
-
|
|
187
|
+
if (!err || err.code !== "EPERM") return false;
|
|
188
|
+
eperm = true;
|
|
81
189
|
}
|
|
190
|
+
// The pid exists. Verify the occupant is still our daemon.
|
|
191
|
+
const identity = queryProcessIdentity(rec.pid, io);
|
|
192
|
+
const hasRecordedIdentity = Boolean(rec.startedAt || rec.argsHint);
|
|
193
|
+
if (hasRecordedIdentity) {
|
|
194
|
+
if (identity === null) return true; // unverifiable → conservative: running
|
|
195
|
+
// Collapse whitespace on both sides: the ps parse re-joins fields with
|
|
196
|
+
// single spaces, so an argsHint containing consecutive spaces must not
|
|
197
|
+
// read as a mismatch (false-stale is the dangerous direction).
|
|
198
|
+
const liveCmd = identity.cmdline.replace(/\s+/g, " ");
|
|
199
|
+
const hint = rec.argsHint ? rec.argsHint.replace(/\s+/g, " ") : null;
|
|
200
|
+
// argsHint decides ALONE when recorded (fix-daemon-stop-ntp-false-stale):
|
|
201
|
+
// startedAt strings are clock-derived (POSIX lstart is recomputed from
|
|
202
|
+
// btime + start ticks at query time), so an NTP step after spawn shifts
|
|
203
|
+
// them for the SAME process — it must never veto a matching argsHint, or
|
|
204
|
+
// a boot-autostarted daemon becomes unstoppable once chrony corrects the
|
|
205
|
+
// clock. startedAt still decides for records without an argsHint.
|
|
206
|
+
if (hint) return liveCmd.includes(hint);
|
|
207
|
+
if (rec.startedAt && identity.startedAt !== null && identity.startedAt !== rec.startedAt) return false;
|
|
208
|
+
return true;
|
|
209
|
+
}
|
|
210
|
+
// Legacy record (no identity metadata): cmdline-marker fallback.
|
|
211
|
+
if (identity === null) {
|
|
212
|
+
// EPERM on a legacy record already proves the process belongs to another
|
|
213
|
+
// user — the CLI and daemon always run as the same user (q3=a self-heal,
|
|
214
|
+
// covers busybox systems where ps cannot report identity).
|
|
215
|
+
return !eperm;
|
|
216
|
+
}
|
|
217
|
+
return identity.cmdline.includes(DAEMON_CMD_MARKER);
|
|
82
218
|
}
|
|
83
219
|
|
|
84
220
|
/**
|
|
85
221
|
* Current daemon status from the pidfile.
|
|
86
222
|
* @param {object} [io]
|
|
87
223
|
* @returns {{ running: boolean, pid: number|null, stale: boolean }}
|
|
88
|
-
* `stale` = a pidfile exists but its pid is dead
|
|
224
|
+
* `stale` = a pidfile exists but its pid is dead OR its identity no longer
|
|
225
|
+
* matches (pid recycled after a reboot / crash).
|
|
89
226
|
*/
|
|
90
227
|
export function isRunning(io = defaultIO()) {
|
|
91
|
-
const
|
|
92
|
-
if (
|
|
93
|
-
const alive = processAlive(
|
|
94
|
-
return { running: alive, pid, stale: !alive };
|
|
228
|
+
const record = readPidRecord(io);
|
|
229
|
+
if (record == null) return { running: false, pid: null, stale: false };
|
|
230
|
+
const alive = processAlive(record, io);
|
|
231
|
+
return { running: alive, pid: record.pid, stale: !alive };
|
|
95
232
|
}
|
|
96
233
|
|
|
97
234
|
/** Ensure ~/.chorus exists for the pid/log files. */
|
|
@@ -145,22 +282,43 @@ export function startBackground(spec, io = defaultIO()) {
|
|
|
145
282
|
// Let the parent exit without waiting on the child (POSIX + Windows).
|
|
146
283
|
child.unref?.();
|
|
147
284
|
|
|
285
|
+
// Record the child's IDENTITY alongside its pid so later probes can tell
|
|
286
|
+
// "our daemon" from "a reboot-recycled pid" (fix-daemon-stale-pid-identity).
|
|
287
|
+
// argsHint: a distinguishing substring of the spawned command line. startedAt:
|
|
288
|
+
// the same query the probe uses (string-equality comparison, no clock math);
|
|
289
|
+
// a failed post-spawn query degrades to a record without startedAt.
|
|
290
|
+
const record = { pid: child.pid };
|
|
291
|
+
const argsHint = (spec.args ?? []).join(" ").trim();
|
|
292
|
+
if (argsHint) record.argsHint = argsHint;
|
|
293
|
+
const identity = queryProcessIdentity(child.pid, io);
|
|
294
|
+
if (identity?.startedAt) record.startedAt = identity.startedAt;
|
|
295
|
+
|
|
148
296
|
ensureDir(pidFile, io);
|
|
149
|
-
io.writeFileSync(pidFile, `${
|
|
297
|
+
io.writeFileSync(pidFile, `${JSON.stringify(record)}\n`, { mode: 0o600 });
|
|
150
298
|
return { started: true, pid: child.pid, logFile, pidFile };
|
|
151
299
|
}
|
|
152
300
|
|
|
153
301
|
/**
|
|
154
302
|
* Stop the recorded background daemon: signal it, then remove the pidfile.
|
|
155
|
-
*
|
|
156
|
-
*
|
|
303
|
+
*
|
|
304
|
+
* `opts.force` (the `chorus daemon stop --force` escape hatch): best-effort
|
|
305
|
+
* SIGTERM (failure ignored), then unlink the pidfile UNCONDITIONALLY — for
|
|
306
|
+
* stuck states the identity probe cannot resolve (e.g. an unverifiable pid the
|
|
307
|
+
* operator knows is not the daemon).
|
|
308
|
+
* @param {object} [io] @param {{ force?: boolean }} [opts]
|
|
309
|
+
* @returns {{ stopped: boolean, pid: number|null, reason: "stopped"|"not-running"|"stale-cleared"|"forced"|"error", message: string }}
|
|
157
310
|
*/
|
|
158
|
-
export function stopDaemon(io = defaultIO()) {
|
|
311
|
+
export function stopDaemon(io = defaultIO(), opts = {}) {
|
|
159
312
|
const pidFile = pidFilePath(io);
|
|
160
313
|
const status = isRunning(io);
|
|
161
314
|
if (status.pid == null) {
|
|
162
315
|
return { stopped: false, pid: null, reason: "not-running", message: "no daemon is running (no pidfile)" };
|
|
163
316
|
}
|
|
317
|
+
if (opts.force) {
|
|
318
|
+
try { io.kill(status.pid, "SIGTERM"); } catch { /* best-effort by design */ }
|
|
319
|
+
try { io.unlinkSync(pidFile); } catch { /* best-effort */ }
|
|
320
|
+
return { stopped: true, pid: status.pid, reason: "forced", message: `forced cleanup: signalled pid ${status.pid} (best-effort) and removed the pidfile` };
|
|
321
|
+
}
|
|
164
322
|
if (!status.running) {
|
|
165
323
|
// Stale pidfile — clean it up, report clearly (no silent failure).
|
|
166
324
|
try { io.unlinkSync(pidFile); } catch { /* best-effort */ }
|
|
@@ -169,7 +327,16 @@ export function stopDaemon(io = defaultIO()) {
|
|
|
169
327
|
try {
|
|
170
328
|
io.kill(status.pid, "SIGTERM");
|
|
171
329
|
} catch (err) {
|
|
172
|
-
|
|
330
|
+
// Keep the pidfile: deleting a record we could not act on risks orphaning a
|
|
331
|
+
// genuinely live daemon. The message names the recovery path instead.
|
|
332
|
+
return {
|
|
333
|
+
stopped: false,
|
|
334
|
+
pid: status.pid,
|
|
335
|
+
reason: "error",
|
|
336
|
+
message:
|
|
337
|
+
`failed to signal pid ${status.pid}: ${err instanceof Error ? err.message : String(err)}` +
|
|
338
|
+
` — the pid may have been recycled by the OS; if you are sure no daemon is running: chorus daemon stop --force`,
|
|
339
|
+
};
|
|
173
340
|
}
|
|
174
341
|
try { io.unlinkSync(pidFile); } catch { /* best-effort */ }
|
|
175
342
|
return { stopped: true, pid: status.pid, reason: "stopped", message: `stopped daemon (pid ${status.pid})` };
|