@chorus-aidlc/chorus 0.16.3 → 0.16.4
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 +386 -386
- package/.next/standalone/.next/app-path-routes-manifest.json +50 -50
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +24 -24
- 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_client-reference-manifest.js +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 +1 -1
- 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_client-reference-manifest.js +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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +1 -1
- 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_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_client-reference-manifest.js +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 +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- 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 +2 -2
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +2 -2
- package/.next/standalone/.next/server/app/admin.rsc +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_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.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_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_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_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/connection-heartbeat/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +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/directory-request/report/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.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.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.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.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-directory-requests/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/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_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 +1 -1
- 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 +1 -1
- 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/[uuid]/wake-preview/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route.js +1 -1
- 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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/visit/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]/agent-cwds/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route.js.nft.json +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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +2 -2
- package/.next/standalone/.next/server/app/index.rsc +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 +2 -2
- package/.next/standalone/.next/server/app/login/admin.rsc +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 +2 -2
- package/.next/standalone/.next/server/app/login/callback.rsc +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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +1 -1
- package/.next/standalone/.next/server/app/login.html +2 -2
- package/.next/standalone/.next/server/app/login.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +2 -2
- package/.next/standalone/.next/server/app/onboarding.rsc +2 -2
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects.html +2 -2
- package/.next/standalone/.next/server/app/projects.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +3 -3
- package/.next/standalone/.next/server/app-paths-manifest.json +50 -50
- package/.next/standalone/.next/server/chunks/2572.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/4827.js +1 -1
- package/.next/standalone/.next/server/chunks/5205.js +1 -0
- package/.next/standalone/.next/server/chunks/5245.js +1 -1
- package/.next/standalone/.next/server/chunks/5351.js +3 -2
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6506.js +2 -2
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/7530.js +1 -1
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/9213.js +1 -1
- package/.next/standalone/.next/server/chunks/9378.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +2 -2
- 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/static/chunks/{11595.97e534422c57aee1.js → 11595.a6268c75ca8a2163.js} +1 -1
- package/.next/standalone/.next/static/chunks/{19887-c0bb297a78a1c7cd.js → 19887-b805e1dcee8c367b.js} +1 -1
- package/.next/standalone/.next/static/chunks/{33456.6dc44a6aca1a01fd.js → 33456.16ff7edf00137539.js} +1 -1
- package/.next/standalone/.next/static/chunks/{4860.7873ebc9ba435c8c.js → 4860.9e06848eb531e667.js} +1 -1
- package/.next/standalone/.next/static/chunks/{94643-01be319472d751b3.js → 94643-ffa140f765c73daf.js} +1 -1
- package/.next/standalone/.next/static/chunks/{99373.d0e808c18408b8da.js → 99373.81b79c91858f9099.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/{page-6b3fb08d53826d02.js → page-b9eb4e0692996657.js} +1 -1
- package/.next/standalone/.next/static/chunks/{webpack-fa066d7ff9ab2b29.js → webpack-4d1cc14b13e247b6.js} +1 -1
- 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 +1 -1
- package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
- package/.next/standalone/public/dsh-credentials.sh +137 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +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 +1 -1
- package/.next/standalone/public/skill/docs-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/.next/standalone/public/test-dsh-credentials.sh +55 -0
- package/README.ja.md +3 -1
- package/README.ko.md +3 -1
- package/README.md +3 -1
- package/README.zh.md +3 -1
- package/cli/agent-backend-prompt.mjs +93 -0
- package/cli/client-args.mjs +11 -5
- package/cli/daemon-agent.mjs +6 -5
- package/cli/daemon-banner.mjs +3 -3
- package/cli/daemon-config.mjs +1 -1
- package/cli/daemon-install-config.mjs +21 -14
- package/cli/daemon-rest-client.mjs +31 -8
- package/cli/daemon.mjs +47 -6
- package/cli/dsh-managed-config.mjs +407 -0
- package/cli/dsh-spawner.mjs +438 -0
- package/cli/login.mjs +26 -4
- package/cli/spawner-select.mjs +10 -1
- package/cli/turn-reporter.mjs +5 -2
- package/cli/upload-hooks.mjs +31 -1
- package/cli/waker.mjs +49 -6
- package/package.json +1 -1
- package/prisma/migrations/20260818024700_add_turn_backend_session_id/migration.sql +1 -0
- package/prisma/schema.prisma +3 -0
- package/.next/standalone/.next/server/chunks/1114.js +0 -1
- /package/.next/standalone/.next/static/{K8qIdwvKoIWbwQ_f01mnM → 6sHDgeKioa0SJR1MAbcYG}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{K8qIdwvKoIWbwQ_f01mnM → 6sHDgeKioa0SJR1MAbcYG}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// cli/agent-backend-prompt.mjs
|
|
2
|
+
// Single source of truth for the interactive "which agent backend?" menu shared
|
|
3
|
+
// by the daemon credential-capture entry points: `chorus login` (single-agent),
|
|
4
|
+
// `chorus login --add` / `chorus daemon add`, and the `chorus install` "add
|
|
5
|
+
// another agent" loop (see cli/login.mjs, cli/daemon-install-config.mjs).
|
|
6
|
+
//
|
|
7
|
+
// The same AGENT_MENU list also feeds resolveInstallAgent's daemon-level backend
|
|
8
|
+
// prompt in daemon-install-config.mjs, so every surface advertises EXACTLY the
|
|
9
|
+
// same backends and never drifts — re-advertising a backend (e.g. dsh) is a
|
|
10
|
+
// one-line edit here that all prompts pick up.
|
|
11
|
+
//
|
|
12
|
+
// promptAgentBackend deliberately differs from resolveInstallAgent's inline menu
|
|
13
|
+
// in ONE way: an empty / unrecognized answer returns `undefined` ("no explicit
|
|
14
|
+
// choice") rather than DEFAULT_AGENT, so the add/login callers can OMIT the
|
|
15
|
+
// backend field and let resolve-time inheritance apply (the daemon top-level
|
|
16
|
+
// default). resolveInstallAgent must always produce a concrete daemon-level
|
|
17
|
+
// backend, so it keeps its own empty→DEFAULT_AGENT behavior and does NOT use
|
|
18
|
+
// this helper.
|
|
19
|
+
//
|
|
20
|
+
// Lives in its own module to avoid an import cycle: daemon-install-config.mjs
|
|
21
|
+
// already imports appendAgentConfig from login.mjs, so the shared menu cannot
|
|
22
|
+
// live in either of those files.
|
|
23
|
+
|
|
24
|
+
import { KNOWN_AGENTS } from "./daemon-agent.mjs";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The interactive agent-backend menu. Order mirrors KNOWN_AGENTS with claude-code
|
|
28
|
+
* first (it is the default). Kept as the single shared list so the numbered
|
|
29
|
+
* prompt and the accepted values never drift across entry points.
|
|
30
|
+
*
|
|
31
|
+
* NOTE: the dsh JSON-RPC daemon backend is temporarily de-advertised (offline).
|
|
32
|
+
* The code path (probeAgentCli/resolveDshPath, spawner-select, dsh-spawner) is
|
|
33
|
+
* kept dormant — re-add this menu entry to bring it back online. It remains
|
|
34
|
+
* reachable by name (e.g. `--agent dsh`, or typing "dsh" at the prompt).
|
|
35
|
+
*/
|
|
36
|
+
export const AGENT_MENU = [
|
|
37
|
+
{ value: "claude-code", label: "Claude Code (default)" },
|
|
38
|
+
{ value: "codex", label: "Codex CLI" },
|
|
39
|
+
{ value: "kiro", label: "Kiro CLI" },
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
/** A non-empty trimmed string, or undefined. */
|
|
43
|
+
function nonEmpty(value) {
|
|
44
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Prompt the operator to pick an agent backend for the agent being configured,
|
|
49
|
+
* shared by the add / login / install-add flows.
|
|
50
|
+
*
|
|
51
|
+
* Returns the chosen backend value, or `undefined` when the operator makes no
|
|
52
|
+
* explicit choice — meaning "inherit the daemon default" (the caller then omits
|
|
53
|
+
* the `agentType` / top-level `agent` field). `undefined` is returned when:
|
|
54
|
+
* - `isTTY` is false (non-interactive / piped) — returns immediately, prints
|
|
55
|
+
* nothing, never blocks (mirrors resolveInstallAgent / resolveDaemonCwds);
|
|
56
|
+
* - the answer is empty (Enter);
|
|
57
|
+
* - the answer is an out-of-range number or is otherwise unrecognized.
|
|
58
|
+
*
|
|
59
|
+
* Accepts either a menu number (1..AGENT_MENU.length) or a KNOWN_AGENTS value
|
|
60
|
+
* typed by name (e.g. "codex", or "dsh" even though it is de-advertised).
|
|
61
|
+
*
|
|
62
|
+
* @param {{
|
|
63
|
+
* ask: (query: string, opts?: object) => Promise<string>,
|
|
64
|
+
* log?: (m: string) => void,
|
|
65
|
+
* isTTY?: boolean,
|
|
66
|
+
* }} deps
|
|
67
|
+
* @returns {Promise<string|undefined>}
|
|
68
|
+
*/
|
|
69
|
+
export async function promptAgentBackend({ ask, log = () => {}, isTTY = false } = {}) {
|
|
70
|
+
// Non-TTY (piped / scripted) must never block on a menu — return immediately
|
|
71
|
+
// with no output. The caller falls back to --agent or inherits the default.
|
|
72
|
+
if (!isTTY || typeof ask !== "function") return undefined;
|
|
73
|
+
|
|
74
|
+
log("[Chorus] Which agent backend should this agent use?");
|
|
75
|
+
for (let i = 0; i < AGENT_MENU.length; i += 1) {
|
|
76
|
+
log(`[Chorus] ${i + 1}) ${AGENT_MENU[i].label}`);
|
|
77
|
+
}
|
|
78
|
+
const answer = nonEmpty(
|
|
79
|
+
await ask(`Select [1-${AGENT_MENU.length}] (Enter to inherit the daemon default): `),
|
|
80
|
+
);
|
|
81
|
+
if (!answer) return undefined; // Enter → inherit default.
|
|
82
|
+
|
|
83
|
+
const n = Number(answer);
|
|
84
|
+
if (Number.isInteger(n) && n >= 1 && n <= AGENT_MENU.length) {
|
|
85
|
+
return AGENT_MENU[n - 1].value;
|
|
86
|
+
}
|
|
87
|
+
// A backend typed by name (muscle memory). KNOWN_AGENTS includes de-advertised
|
|
88
|
+
// backends (dsh), so a by-name pick can still reach them.
|
|
89
|
+
if (KNOWN_AGENTS.includes(answer)) return answer;
|
|
90
|
+
|
|
91
|
+
// Out-of-range / garbage → no explicit choice; the caller inherits the default.
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
package/cli/client-args.mjs
CHANGED
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
export const DAEMON_ACTIONS = new Set(["stop", "status", "restart", "logs", "install", "uninstall"]);
|
|
15
15
|
|
|
16
16
|
/** Known agent backends, kept in sync with the authoritative list in
|
|
17
|
-
* daemon-agent.mjs (`claude-code`, `codex`, `kiro` — all implemented). This copy
|
|
17
|
+
* daemon-agent.mjs (`claude-code`, `codex`, `kiro`, `dsh` — all implemented). This copy
|
|
18
18
|
* is informational only: parsing here does not validate the value (the resolver
|
|
19
19
|
* in daemon-agent.mjs is the single source of truth for validation). */
|
|
20
|
-
export const KNOWN_AGENTS = new Set(["claude-code", "codex", "kiro"]);
|
|
20
|
+
export const KNOWN_AGENTS = new Set(["claude-code", "codex", "kiro", "dsh"]);
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Parse the client-subcommand flags out of an arg list. Recognizes the
|
|
@@ -126,7 +126,8 @@ OPTIONS
|
|
|
126
126
|
--agent <type> Local agent backend to wake (env: CHORUS_AGENT)
|
|
127
127
|
(claude-code | codex | kiro; default: claude-code)
|
|
128
128
|
(Also configurable as "agent":"…" in ~/.chorus/daemon.json;
|
|
129
|
-
'chorus daemon install'
|
|
129
|
+
'chorus daemon install' and 'chorus login' (incl. --add)
|
|
130
|
+
prompt for it interactively on a TTY.)
|
|
130
131
|
--yolo Full autonomy for the woken agent (env: CHORUS_YOLO=1)
|
|
131
132
|
(--dangerously-skip-permissions: Bash, file writes, any
|
|
132
133
|
command). This is the DEFAULT permission mode.
|
|
@@ -205,10 +206,15 @@ OPTIONS
|
|
|
205
206
|
--api-key <cho_...> Agent API key (env: CHORUS_API_KEY)
|
|
206
207
|
--add Add this key as an ADDITIONAL agent (multi-agent daemon)
|
|
207
208
|
instead of overwriting the single credential
|
|
209
|
+
--agent <type> Agent backend for THIS agent (env: CHORUS_AGENT)
|
|
210
|
+
(claude-code | codex | kiro). On a TTY, login (and
|
|
211
|
+
--add) prompt for it when omitted; Enter inherits the
|
|
212
|
+
daemon default (claude-code) and writes no backend.
|
|
208
213
|
-h, --help Show this help message
|
|
209
214
|
|
|
210
|
-
With no flags, login prompts interactively for the URL
|
|
211
|
-
validates them against the server, and on success
|
|
215
|
+
With no flags, login prompts interactively for the URL, a masked API key, and
|
|
216
|
+
(on a TTY) the agent backend, validates them against the server, and on success
|
|
217
|
+
saves the credentials.
|
|
212
218
|
|
|
213
219
|
With --add, the validated key is appended to the daemon.json 'agents[]' array
|
|
214
220
|
so one daemon can serve several independent agents (see docs/DAEMON.md). The
|
package/cli/daemon-agent.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// cli/daemon-agent.mjs
|
|
2
2
|
// Pure resolution + validation of the daemon's `--agent <type>` selection.
|
|
3
|
-
// `claude-code` (the default), `codex`, and `
|
|
3
|
+
// `claude-code` (the default), `codex`, `kiro`, and `dsh` are recognized backends
|
|
4
4
|
// (add-daemon-codex-backend cashed in the reserved `codex` slot;
|
|
5
5
|
// add-daemon-kiro-backend adds `kiro`). Resolving an unknown value is a hard
|
|
6
6
|
// error (no silent fallback).
|
|
@@ -16,10 +16,9 @@
|
|
|
16
16
|
import { readFileSync } from "node:fs";
|
|
17
17
|
import { loginFilePath } from "./credentials.mjs";
|
|
18
18
|
|
|
19
|
-
/** The agent backends the daemon recognizes.
|
|
20
|
-
*
|
|
21
|
-
|
|
22
|
-
export const KNOWN_AGENTS = ["claude-code", "codex", "kiro"];
|
|
19
|
+
/** The agent backends the daemon recognizes. Existing spawners cover claude-code,
|
|
20
|
+
* codex, and kiro; dsh registration is the base contract for its bridge. */
|
|
21
|
+
export const KNOWN_AGENTS = ["claude-code", "codex", "kiro", "dsh"];
|
|
23
22
|
|
|
24
23
|
/** The default agent backend when neither --agent nor CHORUS_AGENT is set. */
|
|
25
24
|
export const DEFAULT_AGENT = "claude-code";
|
|
@@ -35,6 +34,7 @@ export const DEFAULT_AGENT = "claude-code";
|
|
|
35
34
|
export function backendCli(agentType) {
|
|
36
35
|
if (agentType === "codex") return { name: "codex", envVar: "CHORUS_CODEX_PATH" };
|
|
37
36
|
if (agentType === "kiro") return { name: "kiro-cli", envVar: "CHORUS_KIRO_PATH" };
|
|
37
|
+
if (agentType === "dsh") return { name: "dsh-jsonrpc-agent", envVar: "CHORUS_DSH_PATH" };
|
|
38
38
|
return { name: "claude", envVar: "CHORUS_CLAUDE_PATH" };
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -49,6 +49,7 @@ export function backendCli(agentType) {
|
|
|
49
49
|
export function backendClientType(agentType) {
|
|
50
50
|
if (agentType === "codex") return "codex";
|
|
51
51
|
if (agentType === "kiro") return "kiro";
|
|
52
|
+
if (agentType === "dsh") return "dsh";
|
|
52
53
|
return "claude_code";
|
|
53
54
|
}
|
|
54
55
|
|
package/cli/daemon-banner.mjs
CHANGED
|
@@ -19,7 +19,7 @@ import { backendCli } from "./daemon-agent.mjs";
|
|
|
19
19
|
* @property {string} agentUuid authenticated agent uuid.
|
|
20
20
|
* @property {"yolo"|"chorus"} permissionMode
|
|
21
21
|
* @property {string} credentialSource resolved credential source (flag/env/login-file/…).
|
|
22
|
-
* @property {string} agentType local agent backend (claude-code | codex) — drives the CLI row label.
|
|
22
|
+
* @property {string} agentType local agent backend (claude-code | codex | kiro | dsh) — drives the CLI row label.
|
|
23
23
|
* @property {string|null} cliPath resolved path of the SELECTED backend's CLI, or null when not found.
|
|
24
24
|
* @property {string} [connection] connection state line (default "connecting…").
|
|
25
25
|
* @property {string} [configPath] absolute path to the daemon.json the CLI reads.
|
|
@@ -42,8 +42,8 @@ export function bannerRows(info) {
|
|
|
42
42
|
info.permissionMode === "yolo"
|
|
43
43
|
? "YOLO ⚠ (full autonomy — Bash/write/any command)"
|
|
44
44
|
: "chorus-only (Chorus MCP tools only)";
|
|
45
|
-
// The CLI row names the
|
|
46
|
-
//
|
|
45
|
+
// The CLI row names the selected backend so non-Claude runs are never
|
|
46
|
+
// mislabeled and their own executable override is actionable.
|
|
47
47
|
const cli = backendCli(info.agentType);
|
|
48
48
|
const cliValue = info.cliPath
|
|
49
49
|
? `found: ${info.cliPath}`
|
package/cli/daemon-config.mjs
CHANGED
|
@@ -306,7 +306,7 @@ function positiveInt(value) {
|
|
|
306
306
|
* @typedef {Object} AgentConfig One fully-resolved agent runtime config.
|
|
307
307
|
* @property {string} url Chorus server URL for this agent.
|
|
308
308
|
* @property {string} apiKey This agent's `cho_` API key.
|
|
309
|
-
* @property {string} agentType Backend: claude-code | codex | kiro.
|
|
309
|
+
* @property {string} agentType Backend: claude-code | codex | kiro | dsh.
|
|
310
310
|
* @property {Array<string|undefined>} cwds Served paths (`undefined` ⇒ process cwd).
|
|
311
311
|
* @property {"yolo"|"chorus"} permissionMode Woken-agent permission posture.
|
|
312
312
|
* @property {number} maxConcurrency This agent's wake-queue cap.
|
|
@@ -27,9 +27,11 @@ import { updateDaemonConfig, appendAgentConfig, prompt as defaultPrompt } from "
|
|
|
27
27
|
import { validateAndFetchIdentity } from "./chorus-client.mjs";
|
|
28
28
|
import { normalizeCwd, cleanCwdList } from "./daemon-config.mjs";
|
|
29
29
|
import { KNOWN_AGENTS, DEFAULT_AGENT } from "./daemon-agent.mjs";
|
|
30
|
+
import { AGENT_MENU, promptAgentBackend } from "./agent-backend-prompt.mjs";
|
|
30
31
|
import { agentNotFoundWarningLine } from "./daemon-banner.mjs";
|
|
31
32
|
import { resolveClaudePath } from "./claude-spawner.mjs";
|
|
32
33
|
import { resolveCodexPath } from "./codex-spawner.mjs";
|
|
34
|
+
import { resolveDshPath } from "./dsh-spawner.mjs";
|
|
33
35
|
import { resolveKiroPath } from "./kiro-spawner.mjs";
|
|
34
36
|
import { readFileSync } from "node:fs";
|
|
35
37
|
|
|
@@ -160,12 +162,20 @@ export async function resolveInstallCredentials(flags = {}, env = {}, opts = {})
|
|
|
160
162
|
);
|
|
161
163
|
continue;
|
|
162
164
|
}
|
|
163
|
-
|
|
165
|
+
// Which backend for this agent? Explicit --agent wins; otherwise the menu
|
|
166
|
+
// (we're already on a TTY here). undefined → omit agentType so the entry
|
|
167
|
+
// inherits the daemon default at resolve time (never a literal claude-code).
|
|
168
|
+
let at = nonEmpty(flags.agent);
|
|
169
|
+
if (!at) at = await promptAgentBackend({ ask, log, isTTY });
|
|
170
|
+
const agentObj = { url: u, apiKey: k, agentUuid: id.uuid, agentName: id.name };
|
|
171
|
+
if (at) agentObj.agentType = at;
|
|
172
|
+
const res = appendAgent(agentObj);
|
|
164
173
|
if (!res.ok) {
|
|
165
174
|
errLog(`[Chorus] agent ${id.name} (${id.uuid}) is already configured — skipping.`);
|
|
166
175
|
continue;
|
|
167
176
|
}
|
|
168
|
-
|
|
177
|
+
const backendNote = at ? ` (backend: ${at})` : "";
|
|
178
|
+
log(`[Chorus] added agent ${id.name} (${id.uuid})${backendNote} — this daemon now serves ${res.agents.length} agents.`);
|
|
169
179
|
}
|
|
170
180
|
}
|
|
171
181
|
|
|
@@ -242,7 +252,6 @@ export async function resolveInstallCwds(flags = {}, opts = {}) {
|
|
|
242
252
|
const first = nonEmpty(await ask(`Working directory [${defaultCwd}] (Enter to accept the default): `));
|
|
243
253
|
collected.push(first ?? defaultCwd);
|
|
244
254
|
// subsequent adds
|
|
245
|
-
// eslint-disable-next-line no-constant-condition
|
|
246
255
|
while (true) {
|
|
247
256
|
const next = nonEmpty(await ask("Add another working directory (blank to finish): "));
|
|
248
257
|
if (!next) break;
|
|
@@ -280,25 +289,23 @@ export async function resolveInstallBrowseRoots(flags = {}, opts = {}) {
|
|
|
280
289
|
return { browseRoots };
|
|
281
290
|
}
|
|
282
291
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
{ value: "claude-code", label: "Claude Code (default)" },
|
|
290
|
-
{ value: "codex", label: "Codex CLI" },
|
|
291
|
-
{ value: "kiro", label: "Kiro CLI" },
|
|
292
|
-
];
|
|
292
|
+
// The interactive agent-backend menu (`AGENT_MENU`) now lives in
|
|
293
|
+
// ./agent-backend-prompt.mjs as the single source of truth shared with the
|
|
294
|
+
// add/login flows (imported above), so every backend prompt advertises the same
|
|
295
|
+
// list and never drifts. resolveInstallAgent keeps its own inline menu render
|
|
296
|
+
// below (its empty→DEFAULT_AGENT semantics differ from promptAgentBackend's
|
|
297
|
+
// empty→undefined) but reads the same AGENT_MENU rows.
|
|
293
298
|
|
|
294
299
|
/** Probe the selected backend's CLI on PATH. Returns the resolved path or null.
|
|
295
300
|
* Injectable per backend so the check is testable without a real PATH. */
|
|
296
301
|
function probeAgentCli(agent, probes = {}) {
|
|
297
302
|
const findClaude = probes.resolveClaudePath ?? resolveClaudePath;
|
|
298
303
|
const findCodex = probes.resolveCodexPath ?? resolveCodexPath;
|
|
304
|
+
const findDsh = probes.resolveDshPath ?? resolveDshPath;
|
|
299
305
|
const findKiro = probes.resolveKiroPath ?? resolveKiroPath;
|
|
300
306
|
if (agent === "codex") return findCodex();
|
|
301
307
|
if (agent === "kiro") return findKiro();
|
|
308
|
+
if (agent === "dsh") return findDsh();
|
|
302
309
|
return findClaude();
|
|
303
310
|
}
|
|
304
311
|
|
|
@@ -331,7 +338,7 @@ function probeAgentCli(agent, probes = {}) {
|
|
|
331
338
|
* loginPath?: string,
|
|
332
339
|
* writeConfig?: (partial: Record<string, unknown>) => string,
|
|
333
340
|
* prompt?: typeof defaultPrompt,
|
|
334
|
-
* probes?: { resolveClaudePath?: Function, resolveCodexPath?: Function, resolveKiroPath?: Function },
|
|
341
|
+
* probes?: { resolveClaudePath?: Function, resolveCodexPath?: Function, resolveKiroPath?: Function, resolveDshPath?: Function },
|
|
335
342
|
* log?: (m: string) => void,
|
|
336
343
|
* errLog?: (m: string) => void,
|
|
337
344
|
* }} [opts]
|
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
// the existing server endpoints accept, so the two daemon hosts — the chorus CLI daemon
|
|
5
5
|
// (`cli/daemon.mjs`) and the OpenClaw plugin — cannot drift in the wire contract.
|
|
6
6
|
//
|
|
7
|
-
// The
|
|
8
|
-
// src/app/api/daemon/*/route.ts
|
|
7
|
+
// The operations and payload fields this client supports (verified against
|
|
8
|
+
// src/app/api/daemon/*/route.ts):
|
|
9
9
|
// turnAdvance → POST /api/daemon/turn-advance
|
|
10
|
-
// { connectionUuid, sessionId, status,
|
|
10
|
+
// { connectionUuid, sessionId, status, turnUuid?,
|
|
11
|
+
// backendSessionId?, entityType?, entityUuid?,
|
|
12
|
+
// interruptedReason?, transcriptRelayError?, usage?,
|
|
11
13
|
// coalescedCount? }
|
|
12
14
|
// transcript → POST /api/daemon/transcript
|
|
13
15
|
// { sessionId, messages: [{ role, text }] }
|
|
@@ -71,7 +73,7 @@ const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
|
71
73
|
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
72
74
|
* }} opts
|
|
73
75
|
* @returns {{
|
|
74
|
-
* turnAdvance: (p: { sessionId: string, backendSessionId?: string|null, status: string, entityType?: string|null, entityUuid?: string|null, coalescedCount?: number }) => Promise<DaemonRestResult>,
|
|
76
|
+
* turnAdvance: (p: { sessionId: string, turnUuid?: string|null, backendSessionId?: string|null, status: string, entityType?: string|null, entityUuid?: string|null, coalescedCount?: number }) => Promise<DaemonRestResult>,
|
|
75
77
|
* transcript: (p: { sessionId: string, messages: Array<{ role: string, text: string }> }) => Promise<DaemonRestResult>,
|
|
76
78
|
* executionState: (p: { executions: Array<Record<string, unknown>> }) => Promise<DaemonRestResult>,
|
|
77
79
|
* reportInterrupt: (p: { entityType: string, entityUuid: string, reason: string }) => Promise<DaemonRestResult>,
|
|
@@ -111,7 +113,7 @@ export function createDaemonRestClient(opts) {
|
|
|
111
113
|
* established op-prefixed message.
|
|
112
114
|
* @returns {Promise<DaemonRestResult>}
|
|
113
115
|
*/
|
|
114
|
-
async function post(op, path, body, successLog, context = "") {
|
|
116
|
+
async function post(op, path, body, successLog, context = "", readData = false) {
|
|
115
117
|
let response;
|
|
116
118
|
try {
|
|
117
119
|
response = await fetchImpl(`${url}${path}`, {
|
|
@@ -131,8 +133,19 @@ export function createDaemonRestClient(opts) {
|
|
|
131
133
|
logger.warn(`[Chorus] ${error}`);
|
|
132
134
|
return { ok: false, status: response.status, error };
|
|
133
135
|
}
|
|
136
|
+
let data;
|
|
137
|
+
if (readData) {
|
|
138
|
+
try {
|
|
139
|
+
const parsed = await response.json();
|
|
140
|
+
data = parsed && typeof parsed === "object" ? parsed.data : undefined;
|
|
141
|
+
} catch (err) {
|
|
142
|
+
// Mixed-version fallback: older servers may return an empty successful body.
|
|
143
|
+
// Keep the lifecycle report successful, but make the missing correlation visible.
|
|
144
|
+
logger.warn(`[Chorus] ${op} response correlation unavailable: ${err}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
134
147
|
if (successLog) logger.info(`[Chorus] ${successLog}`);
|
|
135
|
-
return { ok: true, status: response.status };
|
|
148
|
+
return { ok: true, status: response.status, ...(data !== undefined ? { data } : {}) };
|
|
136
149
|
}
|
|
137
150
|
|
|
138
151
|
return {
|
|
@@ -148,7 +161,7 @@ export function createDaemonRestClient(opts) {
|
|
|
148
161
|
* the turn's usage. Both ride the terminal edge only. Requires the connectionUuid (the
|
|
149
162
|
* server addresses the turn against a connection the agent owns).
|
|
150
163
|
*/
|
|
151
|
-
async turnAdvance({ sessionId, status, entityType, entityUuid, interruptedReason, transcriptRelayError, usage, backendSessionId, coalescedCount }) {
|
|
164
|
+
async turnAdvance({ sessionId, turnUuid, status, entityType, entityUuid, interruptedReason, transcriptRelayError, usage, backendSessionId, coalescedCount }) {
|
|
152
165
|
const connectionUuid = getConnectionUuid();
|
|
153
166
|
if (!connectionUuid) {
|
|
154
167
|
const error = `cannot advance turn for session ${sessionId} → ${status} — no connection uuid yet`;
|
|
@@ -164,6 +177,7 @@ export function createDaemonRestClient(opts) {
|
|
|
164
177
|
connectionUuid,
|
|
165
178
|
sessionId,
|
|
166
179
|
status,
|
|
180
|
+
...(turnUuid ? { turnUuid } : {}),
|
|
167
181
|
// Only sent when BOTH are present, so the server never gets a partial linkage.
|
|
168
182
|
...(entityType && entityUuid ? { entityType, entityUuid } : {}),
|
|
169
183
|
// Only meaningful alongside status=interrupted; never sent otherwise.
|
|
@@ -182,12 +196,21 @@ export function createDaemonRestClient(opts) {
|
|
|
182
196
|
? { coalescedCount }
|
|
183
197
|
: {}),
|
|
184
198
|
};
|
|
185
|
-
|
|
199
|
+
const result = await post(
|
|
186
200
|
"turn-advance",
|
|
187
201
|
"/api/daemon/turn-advance",
|
|
188
202
|
body,
|
|
189
203
|
`advanced turn for session ${sessionId} → ${status}`,
|
|
204
|
+
"",
|
|
205
|
+
status === "running",
|
|
190
206
|
);
|
|
207
|
+
const resolvedTurnUuid =
|
|
208
|
+
typeof result.data?.turn?.uuid === "string" ? result.data.turn.uuid : null;
|
|
209
|
+
if (status !== "running") return result;
|
|
210
|
+
const { data: _rawData, ...baseResult } = result;
|
|
211
|
+
return resolvedTurnUuid
|
|
212
|
+
? { ...baseResult, data: { turnUuid: resolvedTurnUuid } }
|
|
213
|
+
: baseResult;
|
|
191
214
|
},
|
|
192
215
|
|
|
193
216
|
/**
|
package/cli/daemon.mjs
CHANGED
|
@@ -41,6 +41,8 @@ import { Waker } from "./waker.mjs";
|
|
|
41
41
|
import { LineageResolver } from "./lineage.mjs";
|
|
42
42
|
import { resolveClaudePath } from "./claude-spawner.mjs";
|
|
43
43
|
import { resolveCodexPath } from "./codex-spawner.mjs";
|
|
44
|
+
import { resolveDshPath } from "./dsh-spawner.mjs";
|
|
45
|
+
import { prepareManagedDshConfig } from "./dsh-managed-config.mjs";
|
|
44
46
|
import { resolveKiroPath } from "./kiro-spawner.mjs";
|
|
45
47
|
import { selectSpawner } from "./spawner-select.mjs";
|
|
46
48
|
import {
|
|
@@ -152,7 +154,13 @@ export function buildDaemon(creds, deps = {}) {
|
|
|
152
154
|
// (construction byte-identical to before); codex → CodexSpawner. `creds` are
|
|
153
155
|
// passed through so the Codex backend can export the daemon key into the woken
|
|
154
156
|
// process env (the Claude backend ignores creds — it gets its key via --mcp-config).
|
|
155
|
-
const spawner = deps.spawner ?? selectSpawner(agentType, {
|
|
157
|
+
const spawner = deps.spawner ?? selectSpawner(agentType, {
|
|
158
|
+
logger,
|
|
159
|
+
permissionMode,
|
|
160
|
+
creds,
|
|
161
|
+
bundleVersion: deps.bundleVersion,
|
|
162
|
+
prepareManagedConfigFn: deps.prepareManagedDshConfig,
|
|
163
|
+
});
|
|
156
164
|
const maxConcurrency = deps.maxConcurrency ?? 4;
|
|
157
165
|
|
|
158
166
|
// ===== Multi-path: the SET of cwds this daemon serves (T3 — FR-5) =====
|
|
@@ -742,6 +750,7 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
742
750
|
// banner shows the right binary instead of always probing for `claude`.
|
|
743
751
|
const findClaude = deps.resolveClaudePath ?? resolveClaudePath;
|
|
744
752
|
const findCodex = deps.resolveCodexPath ?? resolveCodexPath;
|
|
753
|
+
const findDsh = deps.resolveDshPath ?? resolveDshPath;
|
|
745
754
|
const findKiro = deps.resolveKiroPath ?? resolveKiroPath;
|
|
746
755
|
const verbose = flags.verbose === true || env.CHORUS_VERBOSE === "1";
|
|
747
756
|
|
|
@@ -786,6 +795,9 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
786
795
|
writeConfig: deps.writeConfig,
|
|
787
796
|
readJson: deps.readJson,
|
|
788
797
|
loginPath: deps.loginPath,
|
|
798
|
+
prepareManagedDshConfig: deps.prepareManagedDshConfig,
|
|
799
|
+
bundleVersion: version,
|
|
800
|
+
resolveDshPath: findDsh,
|
|
789
801
|
};
|
|
790
802
|
|
|
791
803
|
const action = flags.action ?? "run";
|
|
@@ -884,6 +896,8 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
884
896
|
mcpClient: deps.mcpClient,
|
|
885
897
|
lineage: deps.lineage,
|
|
886
898
|
build: deps.build,
|
|
899
|
+
bundleVersion: version,
|
|
900
|
+
prepareManagedDshConfig: deps.prepareManagedDshConfig,
|
|
887
901
|
});
|
|
888
902
|
|
|
889
903
|
const shutdownMulti = () => {
|
|
@@ -924,11 +938,16 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
924
938
|
// Detect the SELECTED backend's executable (non-fatal): the daemon still
|
|
925
939
|
// subscribes when it's missing; a wake surfaces the error visibly when one
|
|
926
940
|
// arrives. The resolved path (or absence) is shown in the banner below. Each
|
|
927
|
-
// backend probes its own binary
|
|
928
|
-
//
|
|
929
|
-
// (and the banner reports) `kiro-cli`, not `claude`.
|
|
941
|
+
// backend probes its own binary, including dsh-jsonrpc-agent for dsh, so the
|
|
942
|
+
// startup banner and warning report the selected runtime rather than Claude.
|
|
930
943
|
const cliPath =
|
|
931
|
-
agentType === "codex"
|
|
944
|
+
agentType === "codex"
|
|
945
|
+
? findCodex()
|
|
946
|
+
: agentType === "kiro"
|
|
947
|
+
? findKiro()
|
|
948
|
+
: agentType === "dsh"
|
|
949
|
+
? findDsh()
|
|
950
|
+
: findClaude();
|
|
932
951
|
|
|
933
952
|
// The daemon.json the layered config readers (credentials, sigint timeout, cwds)
|
|
934
953
|
// consult. Surfacing its absolute path + presence in the banner makes it obvious
|
|
@@ -987,6 +1006,8 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
987
1006
|
sigintTimeoutMs,
|
|
988
1007
|
cwds,
|
|
989
1008
|
browseRoots,
|
|
1009
|
+
bundleVersion: version,
|
|
1010
|
+
prepareManagedDshConfig: deps.prepareManagedDshConfig,
|
|
990
1011
|
});
|
|
991
1012
|
|
|
992
1013
|
// Graceful shutdown on signals.
|
|
@@ -1171,7 +1192,7 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1171
1192
|
// CHORUS_AGENT env / a prior stored choice; probes the selected CLI and warns
|
|
1172
1193
|
// (non-fatal) when it is missing. An unknown --agent was already rejected by
|
|
1173
1194
|
// resolveAgentType above, so this phase never fails.
|
|
1174
|
-
await installCfg.resolveInstallAgent(flags, env, {
|
|
1195
|
+
const installAgent = await installCfg.resolveInstallAgent(flags, env, {
|
|
1175
1196
|
isTTY,
|
|
1176
1197
|
skip,
|
|
1177
1198
|
writeConfig: pfDeps?.writeConfig ?? updateDaemonConfig,
|
|
@@ -1181,6 +1202,26 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1181
1202
|
log,
|
|
1182
1203
|
errLog,
|
|
1183
1204
|
});
|
|
1205
|
+
if (
|
|
1206
|
+
installAgent.agent === "dsh" &&
|
|
1207
|
+
!String(env.CHORUS_DSH_CONFIG ?? "").trim() &&
|
|
1208
|
+
!String(env.DSH_CORDIS_CONFIG ?? "").trim()
|
|
1209
|
+
) {
|
|
1210
|
+
try {
|
|
1211
|
+
await (pfDeps?.prepareManagedDshConfig ?? prepareManagedDshConfig)({
|
|
1212
|
+
env,
|
|
1213
|
+
bundleVersion: pfDeps?.bundleVersion,
|
|
1214
|
+
dshPath: installAgent.cliPath ?? pfDeps?.resolveDshPath?.(),
|
|
1215
|
+
creds: credResult.creds,
|
|
1216
|
+
});
|
|
1217
|
+
} catch (error) {
|
|
1218
|
+
errLog(
|
|
1219
|
+
`[Chorus] install aborted — dsh managed composition preparation failed: ` +
|
|
1220
|
+
`${error instanceof Error ? error.message : String(error)}`,
|
|
1221
|
+
);
|
|
1222
|
+
return 1;
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1184
1225
|
|
|
1185
1226
|
const spec = {
|
|
1186
1227
|
...svc.resolveServicePaths(),
|