@chorus-aidlc/chorus 0.17.2 → 0.18.0
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 +357 -355
- package/.next/standalone/.next/app-path-routes-manifest.json +44 -44
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +18 -18
- 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 +1 -1
- 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 +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/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 +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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.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 +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 +2 -2
- 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 +2 -2
- 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 +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/login.html +2 -2
- package/.next/standalone/.next/server/app/login.rsc +2 -2
- 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 +2 -2
- package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
- 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 +3 -3
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +4 -4
- package/.next/standalone/.next/server/app-paths-manifest.json +44 -44
- package/.next/standalone/.next/server/chunks/109.js +1 -0
- package/.next/standalone/.next/server/chunks/1318.js +1 -1
- package/.next/standalone/.next/server/chunks/1496.js +1 -0
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/2572.js +1 -1
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3112.js +1 -1
- package/.next/standalone/.next/server/chunks/{2536.js → 3619.js} +3 -3
- package/.next/standalone/.next/server/chunks/{6080.js → 4810.js} +1 -1
- package/.next/standalone/.next/server/chunks/4827.js +1 -1
- package/.next/standalone/.next/server/chunks/5245.js +1 -1
- 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/6515.js +2 -2
- package/.next/standalone/.next/server/chunks/6737.js +1 -0
- package/.next/standalone/.next/server/chunks/6753.js +3 -3
- package/.next/standalone/.next/server/chunks/679.js +1 -1
- package/.next/standalone/.next/server/chunks/731.js +1 -0
- 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/7857.js +1 -0
- 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/chunks/9931.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/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.0afa1a540f681fb4.js +1 -0
- package/.next/standalone/.next/static/chunks/22705-324a191727ae45b7.js +1 -0
- package/.next/standalone/.next/static/chunks/{31308-32614efb88305738.js → 31308-bb4a97b3f39c22dd.js} +1 -1
- package/.next/standalone/.next/static/chunks/33456.4a5f4712a7e78d8f.js +1 -0
- package/.next/standalone/.next/static/chunks/44216-3876e84f5b02d355.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.5719e32b95be2d93.js +1 -0
- package/.next/standalone/.next/static/chunks/6528-a8a562ef7d26bb43.js +1 -0
- package/.next/standalone/.next/static/chunks/67439-7b339b28ed0ecfc6.js +1 -0
- package/.next/standalone/.next/static/chunks/79919-ae8bd8d8ec1e38ce.js +1 -0
- package/.next/standalone/.next/static/chunks/82203-4ce5926624df7ed0.js +1 -0
- package/.next/standalone/.next/static/chunks/94643-37ac7b8ef8ea5e75.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.6c1509bfaf599741.js +1 -0
- package/.next/standalone/.next/static/chunks/99775-697e82ee04eac6b1.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-2fda722cdace8147.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-eecb38fa4b8eb4e8.js → page-b45c42c536eff64b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-792aba7fd6b6daa3.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-cd7ec77596304a07.js → page-800a979f12b73f27.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-97a9e6f949002004.js → page-34de35f75aa71f6d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-a16002aa2a911619.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-cec15f4b835d34fc.js → page-e8030824994edf35.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-4f7f1ddbaf79be8f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-4ee117e690fda56f.js → page-349b0977f3c6209a.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-7fbc46dfb7b22bd3.js → page-be43cb06112fce12.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-6916e1abab42a6e6.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/{page-4fce966dc96d4ff1.js → page-c0090caae202eae5.js} +1 -1
- package/.next/standalone/.next/static/chunks/{webpack-1bfc783412a06fc5.js → webpack-cfb63dd1b416c92e.js} +1 -1
- package/.next/standalone/.next/static/css/75c761a5428611fa.css +1 -0
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +2 -2
- package/.next/standalone/public/chorus-plugin/agents/code-reviewer.md +1 -0
- package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +12 -3
- package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +4 -0
- package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +1 -1
- package/.next/standalone/public/chorus-plugin/bin/on-post-submit-for-verify.sh +3 -3
- package/.next/standalone/public/chorus-plugin/bin/on-post-submit-proposal.sh +3 -3
- package/.next/standalone/public/chorus-plugin/bin/on-post-verify-task.sh +2 -2
- package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +39 -64
- package/.next/standalone/public/chorus-plugin/bin/resolve-spec-mode.sh +107 -0
- package/.next/standalone/public/chorus-plugin/bin/tests/test-resolver-drift.sh +46 -0
- package/.next/standalone/public/chorus-plugin/bin/tests/test-skill-harness-fidelity-negative.sh +328 -0
- package/.next/standalone/public/chorus-plugin/bin/tests/test-skill-harness-fidelity.sh +372 -0
- package/.next/standalone/public/chorus-plugin/bin/tests/test-spec-mode-resolution.sh +83 -0
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +11 -6
- package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +14 -9
- 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 +27 -31
- package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +11 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +14 -7
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +6 -4
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +10 -8
- package/.next/standalone/public/chorus-plugin/skills/spec-lite/SKILL.md +147 -0
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +49 -34
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-code-reviewer.json +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json +2 -1
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-task-reviewer.json +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-cli/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +9 -7
- 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 +35 -27
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +9 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +14 -7
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +2 -2
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +8 -8
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-spec-lite/SKILL.md +147 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +39 -25
- package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +11 -6
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
- package/.next/standalone/public/kiro-plugin/bin/on-agent-spawn.sh +41 -0
- package/.next/standalone/public/kiro-plugin/bin/on-post-submit-for-verify.sh +3 -3
- package/.next/standalone/public/kiro-plugin/bin/on-post-submit-proposal.sh +3 -3
- package/.next/standalone/public/kiro-plugin/bin/on-post-verify-task.sh +2 -2
- package/.next/standalone/public/kiro-plugin/bin/resolve-spec-mode.sh +107 -0
- package/.next/standalone/public/kiro-plugin/manifest.txt +2 -0
- package/.next/standalone/public/skill/chorus/SKILL.md +11 -1
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -0
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +11 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +5 -2
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +5 -3
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +4 -0
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +23 -7
- package/README.ja.md +3 -3
- package/README.ko.md +3 -3
- package/README.md +3 -3
- package/README.zh.md +3 -3
- package/cli/agent-cli-config.mjs +323 -0
- package/cli/agent-launcher.mjs +45 -17
- package/cli/claude-spawner.mjs +22 -13
- package/cli/codex-spawner.mjs +23 -15
- package/cli/credentials.mjs +7 -0
- package/cli/daemon-agent.mjs +1 -1
- package/cli/daemon-config.mjs +14 -0
- package/cli/daemon.mjs +34 -9
- package/cli/dsh-managed-config.mjs +219 -293
- package/cli/dsh-spawner.mjs +53 -27
- package/cli/init/steps/credential-seed.mjs +1 -1
- package/cli/kiro-spawner.mjs +22 -15
- package/cli/launch-diagnostics.mjs +67 -0
- package/cli/login.mjs +17 -1
- package/cli/pi-spawner.mjs +19 -12
- package/cli/prompts.mjs +52 -2
- package/cli/spawner-select.mjs +6 -11
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/1114.js +0 -1
- package/.next/standalone/.next/server/chunks/2953.js +0 -1
- package/.next/standalone/.next/server/chunks/5162.js +0 -1
- package/.next/standalone/.next/server/chunks/6689.js +0 -1
- package/.next/standalone/.next/server/chunks/9667.js +0 -1
- package/.next/standalone/.next/static/chunks/11595.b81c0bf7732c3b62.js +0 -1
- package/.next/standalone/.next/static/chunks/24808-e3d95efc7ec039c5.js +0 -1
- package/.next/standalone/.next/static/chunks/33456.cfc9aa607a62e879.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.41351a823cf400e4.js +0 -1
- package/.next/standalone/.next/static/chunks/51468-194d894e563580dd.js +0 -1
- package/.next/standalone/.next/static/chunks/61570-527701d072d00a24.js +0 -1
- package/.next/standalone/.next/static/chunks/65066-6da35d5cb080c7f5.js +0 -1
- package/.next/standalone/.next/static/chunks/72875-0987d09cd8406614.js +0 -1
- package/.next/standalone/.next/static/chunks/75936-79860953212592fd.js +0 -1
- package/.next/standalone/.next/static/chunks/79919-e02963faee5cb563.js +0 -1
- package/.next/standalone/.next/static/chunks/94643-e8f5fa25e2340cc8.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.633f7c25e64bcdac.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-bb5ef11586301c72.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-725373108da1b08c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-7d2f4713697eb0a7.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0225f87552b977d9.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-8b30678a58e7b2ee.js +0 -1
- package/.next/standalone/.next/static/css/1d9cf83f50b6db00.css +0 -1
- /package/.next/standalone/.next/static/{WSN4XeA1kUCI6CeEHcaT_ → IxKVu5zkFPTjSKAUR99yH}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{WSN4XeA1kUCI6CeEHcaT_ → IxKVu5zkFPTjSKAUR99yH}/_ssgManifest.js +0 -0
package/cli/dsh-spawner.mjs
CHANGED
|
@@ -2,6 +2,8 @@
|
|
|
2
2
|
// session are created per wake; no dsh session state is persisted by Chorus.
|
|
3
3
|
|
|
4
4
|
import { spawn } from "node:child_process";
|
|
5
|
+
import { safeSpawnError, redactedSetupError } from "./launch-diagnostics.mjs";
|
|
6
|
+
import { validateAgentCliConfig, overlayAgentEnv, getAgentEnv, assertConfiguredShimArgs } from "./agent-cli-config.mjs";
|
|
5
7
|
import { randomUUID } from "node:crypto";
|
|
6
8
|
import { statSync } from "node:fs";
|
|
7
9
|
import { win32 as pathWin32, posix as pathPosix } from "node:path";
|
|
@@ -28,20 +30,21 @@ function isFile(path) {
|
|
|
28
30
|
}
|
|
29
31
|
}
|
|
30
32
|
|
|
31
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Resolve the external `dsh` CLI (the profile launcher — dsh 0.1.2-rc.1 removed
|
|
35
|
+
* the standalone `dsh-jsonrpc-agent` bin). CHORUS_DSH_PATH overrides PATH.
|
|
36
|
+
*/
|
|
32
37
|
export function resolveDshPath(deps = {}) {
|
|
33
38
|
const env = deps.env ?? process.env;
|
|
34
39
|
const platform = deps.platform ?? process.platform;
|
|
35
40
|
const fileProbe = deps.isFile ?? isFile;
|
|
36
|
-
const override = nonEmpty(env
|
|
41
|
+
const override = nonEmpty(getAgentEnv(env, "CHORUS_DSH_PATH", platform));
|
|
37
42
|
if (override && fileProbe(override)) return override;
|
|
38
43
|
|
|
39
44
|
const windows = platform === "win32";
|
|
40
45
|
const path = windows ? pathWin32 : pathPosix;
|
|
41
|
-
const names = windows
|
|
42
|
-
|
|
43
|
-
: ["dsh-jsonrpc-agent"];
|
|
44
|
-
const dirs = (env.PATH || env.Path || "").split(path.delimiter).filter(Boolean);
|
|
46
|
+
const names = windows ? ["dsh.cmd", "dsh.exe", "dsh"] : ["dsh"];
|
|
47
|
+
const dirs = (getAgentEnv(env, "PATH", platform) || env.Path || "").split(path.delimiter).filter(Boolean);
|
|
45
48
|
for (const dir of dirs) {
|
|
46
49
|
for (const name of names) {
|
|
47
50
|
const candidate = path.join(dir, name);
|
|
@@ -51,9 +54,14 @@ export function resolveDshPath(deps = {}) {
|
|
|
51
54
|
return null;
|
|
52
55
|
}
|
|
53
56
|
|
|
54
|
-
/**
|
|
55
|
-
|
|
56
|
-
|
|
57
|
+
/**
|
|
58
|
+
* An operator-supplied managed home override. When set, the daemon boots
|
|
59
|
+
* `dsh --profile sdk` against this pre-composed DSH_HOME and skips managed
|
|
60
|
+
* profile preparation entirely (the escape hatch replacing the old
|
|
61
|
+
* DSH_CORDIS_CONFIG override — which is gone with the removed cordis.yml model).
|
|
62
|
+
*/
|
|
63
|
+
export function resolveDshHome(env = process.env, platform = process.platform) {
|
|
64
|
+
return nonEmpty(getAgentEnv(env, "CHORUS_DSH_HOME", platform)) ?? nonEmpty(getAgentEnv(env, "DSH_HOME", platform));
|
|
57
65
|
}
|
|
58
66
|
|
|
59
67
|
/** Windows npm command shims need cmd.exe while retaining argv isolation. */
|
|
@@ -61,7 +69,7 @@ export function resolveDshSpawnCommand(dshPath, platform = process.platform, env
|
|
|
61
69
|
const lower = dshPath.toLowerCase();
|
|
62
70
|
if (platform === "win32" && (lower.endsWith(".cmd") || lower.endsWith(".bat"))) {
|
|
63
71
|
return {
|
|
64
|
-
command: env
|
|
72
|
+
command: getAgentEnv(env, "COMSPEC", platform) || "cmd.exe",
|
|
65
73
|
argv: ["/d", "/s", "/c", dshPath],
|
|
66
74
|
};
|
|
67
75
|
}
|
|
@@ -133,7 +141,8 @@ export class DshSpawner {
|
|
|
133
141
|
this.logger = opts.logger ?? NOOP_LOGGER;
|
|
134
142
|
this.creds = opts.creds ?? null;
|
|
135
143
|
this.platform = opts.platform ?? process.platform;
|
|
136
|
-
this.
|
|
144
|
+
this.cliConfig = validateAgentCliConfig(opts.cliConfig, "dsh", opts.label);
|
|
145
|
+
this.env = overlayAgentEnv(opts.env ?? process.env, this.cliConfig.env, this.platform);
|
|
137
146
|
this.bundleVersion = opts.bundleVersion ?? null;
|
|
138
147
|
this.prepareManagedConfigFn = opts.prepareManagedConfigFn ?? prepareManagedDshConfig;
|
|
139
148
|
this.timeoutMs = opts.timeoutMs ?? positiveInt(this.env.CHORUS_DSH_TIMEOUT_MS, DEFAULT_DSH_TIMEOUT_MS);
|
|
@@ -143,8 +152,9 @@ export class DshSpawner {
|
|
|
143
152
|
}
|
|
144
153
|
|
|
145
154
|
async wake({ prompt, sessionId: anchor, cwd, onMessage, onChild }) {
|
|
146
|
-
|
|
147
|
-
let
|
|
155
|
+
const dshPath = this.dshPath ?? this.resolveDshPathFn({ env: this.env, platform: this.platform });
|
|
156
|
+
let dshHome = resolveDshHome(this.env, this.platform);
|
|
157
|
+
let patchPath = null;
|
|
148
158
|
const result = (backendSessionId, exitCode) => ({
|
|
149
159
|
sessionId: backendSessionId || anchor || "",
|
|
150
160
|
backendSessionId: backendSessionId || null,
|
|
@@ -154,37 +164,41 @@ export class DshSpawner {
|
|
|
154
164
|
|
|
155
165
|
if (!dshPath) {
|
|
156
166
|
this.logger.error(
|
|
157
|
-
"[Chorus] cannot locate `dsh
|
|
167
|
+
"[Chorus] cannot locate the `dsh` CLI; install DeepSeek Harness (dsh) or set CHORUS_DSH_PATH",
|
|
158
168
|
);
|
|
159
169
|
return result(null, null);
|
|
160
170
|
}
|
|
161
|
-
|
|
171
|
+
assertConfiguredShimArgs(dshPath, this.cliConfig.args, this.platform);
|
|
172
|
+
if (!dshHome) {
|
|
162
173
|
try {
|
|
163
174
|
const managed = await this.prepareManagedConfigFn({
|
|
164
175
|
env: this.env,
|
|
176
|
+
platform: this.platform,
|
|
165
177
|
bundleVersion: this.bundleVersion,
|
|
166
178
|
dshPath,
|
|
167
179
|
creds: this.creds,
|
|
168
180
|
});
|
|
169
|
-
|
|
170
|
-
|
|
181
|
+
dshHome = managed.home;
|
|
182
|
+
patchPath = managed.patchPath ?? null;
|
|
171
183
|
} catch (error) {
|
|
172
|
-
|
|
184
|
+
const detail = redactedSetupError(error);
|
|
185
|
+
this.logger.error(`[Chorus] cannot prepare managed dsh profile: ${detail}`);
|
|
173
186
|
return result(null, null);
|
|
174
187
|
}
|
|
188
|
+
} else {
|
|
189
|
+
this.logger.info("[Chorus] using existing DSH_HOME profile, skipping managed preparation");
|
|
175
190
|
}
|
|
176
191
|
|
|
177
192
|
const dshSessionId = `chorus-${this.uuidFn().replaceAll("-", "")}`;
|
|
178
193
|
const provider =
|
|
179
|
-
nonEmpty(this.env.
|
|
194
|
+
nonEmpty(getAgentEnv(this.env, "CHORUS_DSH_PROVIDER", this.platform)) ?? nonEmpty(getAgentEnv(this.env, "DSH_PROVIDER", this.platform)) ?? "deepseek-official";
|
|
180
195
|
const model =
|
|
181
|
-
nonEmpty(this.env.
|
|
182
|
-
const childEnv = {
|
|
183
|
-
...this.env,
|
|
196
|
+
nonEmpty(getAgentEnv(this.env, "CHORUS_DSH_MODEL", this.platform)) ?? nonEmpty(getAgentEnv(this.env, "DSH_MODEL", this.platform)) ?? "deepseek-v4-flash";
|
|
197
|
+
const childEnv = overlayAgentEnv(this.env, {
|
|
184
198
|
CHORUS_DAEMON_HEADLESS: "1",
|
|
185
|
-
|
|
199
|
+
DSH_HOME: dshHome,
|
|
186
200
|
DSH_CWD: cwd || process.cwd(),
|
|
187
|
-
};
|
|
201
|
+
}, this.platform);
|
|
188
202
|
if (this.creds?.url) childEnv.CHORUS_URL = this.creds.url;
|
|
189
203
|
if (this.creds?.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
|
|
190
204
|
// Identity profile — the dsh doc-mirror wrapper passes this to `chorus mcp
|
|
@@ -195,7 +209,19 @@ export class DshSpawner {
|
|
|
195
209
|
if (this.creds?.agentUuid || this.creds?.agentName)
|
|
196
210
|
childEnv.CHORUS_AGENT_PROFILE = this.creds.agentUuid || this.creds.agentName;
|
|
197
211
|
|
|
198
|
-
|
|
212
|
+
// `dsh --profile sdk` boots the managed profile from DSH_HOME. The Chorus
|
|
213
|
+
// rows auto-apply as a bundle layer, so `--patch` is added only for a
|
|
214
|
+
// non-default provider overlay. resolveDshSpawnCommand keeps the win32 .cmd
|
|
215
|
+
// wrapper prefix; the launcher argv follows it.
|
|
216
|
+
const launch = resolveDshSpawnCommand(dshPath, this.platform, childEnv);
|
|
217
|
+
const command = launch.command;
|
|
218
|
+
const argv = [
|
|
219
|
+
...launch.argv,
|
|
220
|
+
"--profile",
|
|
221
|
+
"sdk",
|
|
222
|
+
...(patchPath ? ["--patch", patchPath] : []),
|
|
223
|
+
...this.cliConfig.args,
|
|
224
|
+
];
|
|
199
225
|
let child;
|
|
200
226
|
try {
|
|
201
227
|
child = this.spawnImpl(command, argv, {
|
|
@@ -207,7 +233,7 @@ export class DshSpawner {
|
|
|
207
233
|
windowsHide: true,
|
|
208
234
|
});
|
|
209
235
|
} catch (error) {
|
|
210
|
-
this.logger.error(`[Chorus] failed to start dsh runtime: ${
|
|
236
|
+
this.logger.error(`[Chorus] failed to start dsh runtime: ${safeSpawnError(error)}`);
|
|
211
237
|
return result(dshSessionId, null);
|
|
212
238
|
}
|
|
213
239
|
|
|
@@ -349,7 +375,7 @@ export class DshSpawner {
|
|
|
349
375
|
if (line) this.logger.warn(`[dsh] ${line}`);
|
|
350
376
|
}
|
|
351
377
|
});
|
|
352
|
-
child.on?.("error", (error) => fail(`dsh runtime process error: ${
|
|
378
|
+
child.on?.("error", (error) => fail(`dsh runtime process error: ${safeSpawnError(error)}`));
|
|
353
379
|
child.on?.("close", (code) => {
|
|
354
380
|
closeSeen = true;
|
|
355
381
|
exitCode = code;
|
|
@@ -68,7 +68,7 @@ function nonEmpty(value) {
|
|
|
68
68
|
* Whether an init selection id is the DeepSeek Harness (dsh). dsh needs a SECOND
|
|
69
69
|
* credential sink beyond ~/.chorus/daemon.json — see {@link writeDshCredentialsEnv}.
|
|
70
70
|
* We gate on the selection id, NOT the daemon agentType: dsh maps to the shared
|
|
71
|
-
* "offline" agentType (agent-type-map.mjs) alongside opencode/openclaw
|
|
71
|
+
* "offline" agentType (agent-type-map.mjs) alongside opencode/openclaw, so the
|
|
72
72
|
* agentType cannot single dsh out. The id can.
|
|
73
73
|
* @param {string} id
|
|
74
74
|
*/
|
package/cli/kiro-spawner.mjs
CHANGED
|
@@ -28,6 +28,8 @@
|
|
|
28
28
|
// no-op here (this task owns spawn/resume/trust/interrupt + sessionId capture).
|
|
29
29
|
|
|
30
30
|
import { spawn } from "node:child_process";
|
|
31
|
+
import { safeSpawnError } from "./launch-diagnostics.mjs";
|
|
32
|
+
import { validateAgentCliConfig, overlayAgentEnv, getAgentEnv, assertConfiguredShimArgs } from "./agent-cli-config.mjs";
|
|
31
33
|
import { readdirSync, readFileSync, statSync } from "node:fs";
|
|
32
34
|
import { homedir } from "node:os";
|
|
33
35
|
import { win32 as pathWin32, posix as pathPosix, join } from "node:path";
|
|
@@ -37,8 +39,8 @@ import { reconstructTranscript as defaultReconstructTranscript } from "./kiro-tr
|
|
|
37
39
|
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
38
40
|
|
|
39
41
|
/** Directory Kiro persists its CLI session store under (per-cwd conversations). */
|
|
40
|
-
export function kiroSessionsDir() {
|
|
41
|
-
return join(homedir(), ".kiro", "sessions", "cli");
|
|
42
|
+
export function kiroSessionsDir(env = process.env, platform = process.platform) {
|
|
43
|
+
return join(getAgentEnv(env, "HOME", platform) || getAgentEnv(env, "USERPROFILE", platform) || homedir(), ".kiro", "sessions", "cli");
|
|
42
44
|
}
|
|
43
45
|
|
|
44
46
|
/**
|
|
@@ -96,14 +98,15 @@ export function resolveKiroPath(deps = {}) {
|
|
|
96
98
|
}
|
|
97
99
|
});
|
|
98
100
|
|
|
99
|
-
|
|
100
|
-
|
|
101
|
+
const override = getAgentEnv(env, "CHORUS_KIRO_PATH", platform);
|
|
102
|
+
if (override && isFile(override)) {
|
|
103
|
+
return override;
|
|
101
104
|
}
|
|
102
105
|
|
|
103
106
|
const isWin = platform === "win32";
|
|
104
107
|
const p = isWin ? pathWin32 : pathPosix;
|
|
105
108
|
const names = isWin ? ["kiro-cli.cmd", "kiro-cli.exe", "kiro-cli"] : ["kiro-cli"];
|
|
106
|
-
const pathVar = env
|
|
109
|
+
const pathVar = getAgentEnv(env, "PATH", platform) || env.Path || "";
|
|
107
110
|
const dirs = pathVar.split(p.delimiter).filter(Boolean);
|
|
108
111
|
for (const dir of dirs) {
|
|
109
112
|
for (const name of names) {
|
|
@@ -126,7 +129,7 @@ export function resolveSpawnCommand(kiroPath, args, platform = process.platform,
|
|
|
126
129
|
const isWin = platform === "win32";
|
|
127
130
|
const lower = kiroPath.toLowerCase();
|
|
128
131
|
if (isWin && (lower.endsWith(".cmd") || lower.endsWith(".bat"))) {
|
|
129
|
-
const comspec = env
|
|
132
|
+
const comspec = getAgentEnv(env, "COMSPEC", platform) || "cmd.exe";
|
|
130
133
|
return { command: comspec, argv: ["/d", "/s", "/c", kiroPath, ...args] };
|
|
131
134
|
}
|
|
132
135
|
return { command: kiroPath, argv: args };
|
|
@@ -229,6 +232,8 @@ export class KiroSpawner {
|
|
|
229
232
|
this.permissionMode = opts.permissionMode ?? "chorus";
|
|
230
233
|
this.creds = opts.creds ?? null;
|
|
231
234
|
this.platform = opts.platform ?? process.platform;
|
|
235
|
+
this.cliConfig = validateAgentCliConfig(opts.cliConfig, "kiro", opts.label);
|
|
236
|
+
this.env = overlayAgentEnv(opts.env ?? process.env, this.cliConfig.env, this.platform);
|
|
232
237
|
this.getSessionIdFn = opts.getSessionIdFn ?? defaultGetSessionId;
|
|
233
238
|
this.setSessionIdFn = opts.setSessionIdFn ?? defaultSetSessionId;
|
|
234
239
|
this.resolveKiroPathFn = opts.resolveKiroPathFn ?? resolveKiroPath;
|
|
@@ -260,15 +265,16 @@ export class KiroSpawner {
|
|
|
260
265
|
const knownSessionId = anchor ? this.getSessionIdFn(anchor) : null;
|
|
261
266
|
const isNew = !knownSessionId;
|
|
262
267
|
|
|
263
|
-
const kiroPath = this.kiroPath ?? this.resolveKiroPathFn();
|
|
268
|
+
const kiroPath = this.kiroPath ?? this.resolveKiroPathFn({ env: this.env, platform: this.platform });
|
|
264
269
|
if (!kiroPath) {
|
|
265
270
|
// No crash — surface visibly and resolve with a failure result.
|
|
266
271
|
this.logger.error("[Chorus] cannot locate the `kiro-cli` executable on PATH; skipping wake");
|
|
267
272
|
return { sessionId: anchor, exitCode: null, isNew };
|
|
268
273
|
}
|
|
269
274
|
|
|
270
|
-
|
|
271
|
-
const {
|
|
275
|
+
assertConfiguredShimArgs(kiroPath, this.cliConfig.args, this.platform);
|
|
276
|
+
const args = [...buildKiroArgs({ isNew, sessionId: knownSessionId, permissionMode: this.permissionMode }), ...this.cliConfig.args];
|
|
277
|
+
const { command, argv } = resolveSpawnCommand(kiroPath, args, this.platform, this.env);
|
|
272
278
|
|
|
273
279
|
// POSIX: detached process group so the interrupt path can group-kill the tree
|
|
274
280
|
// (kiro-cli forks child shells for tools). Windows uses taskkill /T. stdio
|
|
@@ -277,7 +283,7 @@ export class KiroSpawner {
|
|
|
277
283
|
|
|
278
284
|
// Export the daemon's authoritative connection pair. CHORUS_API_KEY is also
|
|
279
285
|
// referenced by the plugin's MCP config; neither value is placed in argv.
|
|
280
|
-
const childEnv = { ...
|
|
286
|
+
const childEnv = { ...this.env, CHORUS_DAEMON_HEADLESS: "1" };
|
|
281
287
|
if (this.creds) {
|
|
282
288
|
if (this.creds.url) childEnv.CHORUS_URL = this.creds.url;
|
|
283
289
|
if (this.creds.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
|
|
@@ -303,8 +309,8 @@ export class KiroSpawner {
|
|
|
303
309
|
detached,
|
|
304
310
|
windowsHide: true,
|
|
305
311
|
});
|
|
306
|
-
} catch (
|
|
307
|
-
this.logger.error(`[Chorus] failed to spawn kiro-cli: ${
|
|
312
|
+
} catch (error) {
|
|
313
|
+
this.logger.error(`[Chorus] failed to spawn kiro-cli: ${safeSpawnError(error)}`);
|
|
308
314
|
resolve({ sessionId: anchor, exitCode: null, isNew });
|
|
309
315
|
return;
|
|
310
316
|
}
|
|
@@ -332,8 +338,8 @@ export class KiroSpawner {
|
|
|
332
338
|
if (text) this.logger.warn(`[Chorus] kiro-cli stderr: ${text}`);
|
|
333
339
|
});
|
|
334
340
|
|
|
335
|
-
child.on("error", (
|
|
336
|
-
this.logger.error(`[Chorus] kiro-cli process error: ${
|
|
341
|
+
child.on("error", (error) => {
|
|
342
|
+
this.logger.error(`[Chorus] kiro-cli process error: ${safeSpawnError(error)}`);
|
|
337
343
|
resolve({ sessionId: knownSessionId || anchor, exitCode: null, isNew });
|
|
338
344
|
});
|
|
339
345
|
|
|
@@ -376,6 +382,7 @@ export class KiroSpawner {
|
|
|
376
382
|
this.reconstructTranscript({
|
|
377
383
|
sessionId: observedSessionId ?? "",
|
|
378
384
|
cwd: runCwd,
|
|
385
|
+
dir: kiroSessionsDir(this.env, this.platform),
|
|
379
386
|
onMessage,
|
|
380
387
|
stdout: stdoutBuf,
|
|
381
388
|
logger: this.logger,
|
|
@@ -407,7 +414,7 @@ export class KiroSpawner {
|
|
|
407
414
|
/** Snapshot the store, swallowing any failure (best-effort id capture). */
|
|
408
415
|
#safeSnapshot(cwd) {
|
|
409
416
|
try {
|
|
410
|
-
return this.snapshotSessionsFn(cwd, { logger: this.logger });
|
|
417
|
+
return this.snapshotSessionsFn(cwd, { logger: this.logger, dir: kiroSessionsDir(this.env, this.platform) });
|
|
411
418
|
} catch (err) {
|
|
412
419
|
this.logger.warn(`[Chorus] kiro session snapshot failed (${err}) — id capture degraded`);
|
|
413
420
|
return new Map();
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// Child-process error messages, paths, argv, code and syscall are untrusted.
|
|
2
|
+
// Only emit known classifications for spawn failures; never echo raw fields.
|
|
3
|
+
const SPAWN_CODES = new Map([
|
|
4
|
+
["ENOENT", "executable or working directory not found; check PATH and cwd"],
|
|
5
|
+
["EACCES", "permission denied; check executable and directory permissions"],
|
|
6
|
+
["EPERM", "operation not permitted; check process permissions"],
|
|
7
|
+
["ENOEXEC", "invalid executable format; check the installed binary"],
|
|
8
|
+
["ENOTDIR", "path component is not a directory; check executable path and cwd"],
|
|
9
|
+
["EINVAL", "invalid process options; check executable and launch configuration"],
|
|
10
|
+
["E2BIG", "argument/environment size limit exceeded; reduce configuration size"],
|
|
11
|
+
["ENOMEM", "insufficient memory to start process"],
|
|
12
|
+
["EAGAIN", "process resource limit reached; retry or check system limits"],
|
|
13
|
+
["EMFILE", "process file descriptor limit reached"],
|
|
14
|
+
["ENFILE", "system file descriptor limit reached"],
|
|
15
|
+
["ETIMEDOUT", "process startup timed out"],
|
|
16
|
+
]);
|
|
17
|
+
|
|
18
|
+
export function safeSpawnError(error) {
|
|
19
|
+
const code = error?.code;
|
|
20
|
+
return typeof code === "string" && SPAWN_CODES.has(code)
|
|
21
|
+
? `${code}: ${SPAWN_CODES.get(code)}`
|
|
22
|
+
: "unclassified startup failure; check executable installation, PATH, cwd and permissions";
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Setup stderr can embed arbitrary argv/env in JSON, escaped nested errors,
|
|
26
|
+
// URLs, or encodings we cannot enumerate. Substring replacement is NOT a safe
|
|
27
|
+
// output boundary. Classify known problems, but render only these fixed strings
|
|
28
|
+
// (never captures, original text, paths, codes, or even a "redacted" remainder).
|
|
29
|
+
// Keep the patterns recognizable in our own output: setup and spawner both call
|
|
30
|
+
// this helper, and the second boundary must retain the first one's useful hints.
|
|
31
|
+
const SETUP_HINTS = [
|
|
32
|
+
[/version mismatch/i, "version mismatch; check dsh runtime and Chorus bundle compatibility"],
|
|
33
|
+
[/no adapter registered/i, "no adapter registered; check that the selected provider adapter is installed"],
|
|
34
|
+
[/invalid plugin graph/i, "invalid plugin graph; rebuild the sdk profile and check plugin compatibility"],
|
|
35
|
+
[/bad key|unauthorized|authentication failed/i, "authentication failed; check provider and Chorus credentials"],
|
|
36
|
+
[/ERR_PNPM.*offline|package registry unavailable/i, "package registry unavailable; check network access and pnpm registry configuration"],
|
|
37
|
+
[/bundle version/i, "bundle version required; check the installed Chorus version"],
|
|
38
|
+
[/requires the dsh CLI|dsh CLI was not found|dsh CLI required/i, "dsh CLI required; install dsh or set CHORUS_DSH_PATH"],
|
|
39
|
+
[/missing.*bundle layer/i, "missing Chorus bundle layer; rebuild the managed sdk profile"],
|
|
40
|
+
[/did not install|Chorus bundle not installed/i, "Chorus bundle not installed; check package installation and rebuild the managed sdk profile"],
|
|
41
|
+
[/did not complete JSON-RPC initialization/i, "did not complete JSON-RPC initialization; check the dsh sdk profile and runtime compatibility"],
|
|
42
|
+
[/unexpected server identity/i, "unexpected server identity; check that the sdk profile loads the expected dsh runtime"],
|
|
43
|
+
];
|
|
44
|
+
const SETUP_CODES = new Map([
|
|
45
|
+
...SPAWN_CODES,
|
|
46
|
+
["ENOSPC", "disk full; free space for the managed profile"],
|
|
47
|
+
["EROFS", "read-only filesystem; use a writable managed profile home"],
|
|
48
|
+
]);
|
|
49
|
+
const SETUP_FALLBACK = "unclassified setup failure; check dsh installation, sdk profile, provider adapter, package registry and filesystem permissions (raw details withheld)";
|
|
50
|
+
|
|
51
|
+
export function redactedSetupError(error) {
|
|
52
|
+
const text = error instanceof Error ? error.message : typeof error === "string" ? error : "";
|
|
53
|
+
const stages = [];
|
|
54
|
+
if (/profile installation failed/i.test(text)) stages.push("dsh managed profile installation failed");
|
|
55
|
+
if (/composition validation failed/i.test(text)) stages.push("dsh managed composition validation failed");
|
|
56
|
+
if (/non-default provider/i.test(text)) {
|
|
57
|
+
stages.push("a non-default provider is configured; the managed sdk profile mounts only the deepseek-official adapter; pre-compose its adapter and point CHORUS_DSH_HOME at your own sdk profile");
|
|
58
|
+
}
|
|
59
|
+
const hints = [];
|
|
60
|
+
for (const [code, hint] of SETUP_CODES) {
|
|
61
|
+
if (error?.code === code || new RegExp(`\\b${code}\\b`).test(text)) hints.push(`${code}: ${hint}`);
|
|
62
|
+
}
|
|
63
|
+
for (const [pattern, hint] of SETUP_HINTS) {
|
|
64
|
+
if (pattern.test(text)) hints.push(hint);
|
|
65
|
+
}
|
|
66
|
+
return [...stages, hints.length ? hints.join("; ") : SETUP_FALLBACK].join(": ");
|
|
67
|
+
}
|
package/cli/login.mjs
CHANGED
|
@@ -10,6 +10,7 @@ import { createInterface } from "node:readline";
|
|
|
10
10
|
import { loginFilePath } from "./credentials.mjs";
|
|
11
11
|
import { validateAndFetchIdentity } from "./chorus-client.mjs";
|
|
12
12
|
import { promptAgentBackend } from "./agent-backend-prompt.mjs";
|
|
13
|
+
import { rejectSharedCliConfig } from "./agent-cli-config.mjs";
|
|
13
14
|
|
|
14
15
|
/**
|
|
15
16
|
* Prompt for a line of input. When `mask` is true, typed characters are not
|
|
@@ -177,9 +178,12 @@ export function appendAgentConfig(agentObj, deps = {}) {
|
|
|
177
178
|
// treat as empty
|
|
178
179
|
}
|
|
179
180
|
|
|
181
|
+
// Refuse already-misplaced customization before any write (even duplicates).
|
|
182
|
+
rejectSharedCliConfig(current);
|
|
180
183
|
const existingAgents =
|
|
181
184
|
Array.isArray(current.agents) ? current.agents.filter((a) => a && typeof a === "object") : [];
|
|
182
185
|
|
|
186
|
+
let migratedFlat = false;
|
|
183
187
|
/** @type {object[]} */
|
|
184
188
|
let agents;
|
|
185
189
|
if (existingAgents.length > 0) {
|
|
@@ -192,6 +196,12 @@ export function appendAgentConfig(agentObj, deps = {}) {
|
|
|
192
196
|
if (Array.isArray(current.cwds)) flat.cwds = current.cwds;
|
|
193
197
|
if (nonEmpty(current.agentName)) flat.agentName = current.agentName;
|
|
194
198
|
if (nonEmpty(current.agentUuid)) flat.agentUuid = current.agentUuid;
|
|
199
|
+
// Move by presence, not validity: later validation must attribute malformed
|
|
200
|
+
// values to the original agent rather than lose them or leave shared keys.
|
|
201
|
+
for (const field of ["args", "env"]) {
|
|
202
|
+
if (Object.hasOwn(current, field)) flat[field] = current[field];
|
|
203
|
+
}
|
|
204
|
+
migratedFlat = true;
|
|
195
205
|
agents = [flat];
|
|
196
206
|
} else {
|
|
197
207
|
agents = [];
|
|
@@ -206,7 +216,13 @@ export function appendAgentConfig(agentObj, deps = {}) {
|
|
|
206
216
|
}
|
|
207
217
|
|
|
208
218
|
agents.push(agentObj);
|
|
209
|
-
|
|
219
|
+
// JSON serialization omits undefined keys; the existing temp-file rename
|
|
220
|
+
// commits the fold and top-level removal together in one atomic write.
|
|
221
|
+
const update = { agents, ...(migratedFlat ? { args: undefined, env: undefined } : {}) };
|
|
222
|
+
// A flat file without a key cannot be folded into an original agent. Do not
|
|
223
|
+
// turn that partial config into an invalid shared file by adding an agent.
|
|
224
|
+
if (!migratedFlat) rejectSharedCliConfig({ ...current, agents });
|
|
225
|
+
const writtenPath = updateDaemonConfig(update, deps);
|
|
210
226
|
return { ok: true, path: writtenPath, agents, index: agents.length - 1 };
|
|
211
227
|
}
|
|
212
228
|
|
package/cli/pi-spawner.mjs
CHANGED
|
@@ -38,6 +38,8 @@
|
|
|
38
38
|
// PATH-walk / .cmd-shim shape of the other spawners' path resolution.
|
|
39
39
|
|
|
40
40
|
import { spawn } from "node:child_process";
|
|
41
|
+
import { safeSpawnError } from "./launch-diagnostics.mjs";
|
|
42
|
+
import { validateAgentCliConfig, overlayAgentEnv, getAgentEnv, assertConfiguredShimArgs } from "./agent-cli-config.mjs";
|
|
41
43
|
import { statSync } from "node:fs";
|
|
42
44
|
import { win32 as pathWin32, posix as pathPosix } from "node:path";
|
|
43
45
|
import { parseNdjsonChunk } from "./claude-spawner.mjs";
|
|
@@ -83,14 +85,15 @@ export function resolvePiPath(deps = {}) {
|
|
|
83
85
|
}
|
|
84
86
|
});
|
|
85
87
|
|
|
86
|
-
|
|
87
|
-
|
|
88
|
+
const override = getAgentEnv(env, "CHORUS_PI_PATH", platform);
|
|
89
|
+
if (override && isFile(override)) {
|
|
90
|
+
return override;
|
|
88
91
|
}
|
|
89
92
|
|
|
90
93
|
const isWin = platform === "win32";
|
|
91
94
|
const p = isWin ? pathWin32 : pathPosix;
|
|
92
95
|
const names = isWin ? ["pi.cmd", "pi.exe", "pi"] : ["pi"];
|
|
93
|
-
const pathVar = env
|
|
96
|
+
const pathVar = getAgentEnv(env, "PATH", platform) || env.Path || "";
|
|
94
97
|
const dirs = pathVar.split(p.delimiter).filter(Boolean);
|
|
95
98
|
for (const dir of dirs) {
|
|
96
99
|
for (const name of names) {
|
|
@@ -113,7 +116,7 @@ export function resolveSpawnCommand(piPath, args, platform = process.platform, e
|
|
|
113
116
|
const isWin = platform === "win32";
|
|
114
117
|
const lower = piPath.toLowerCase();
|
|
115
118
|
if (isWin && (lower.endsWith(".cmd") || lower.endsWith(".bat"))) {
|
|
116
|
-
const comspec = env
|
|
119
|
+
const comspec = getAgentEnv(env, "COMSPEC", platform) || "cmd.exe";
|
|
117
120
|
return { command: comspec, argv: ["/d", "/s", "/c", piPath, ...args] };
|
|
118
121
|
}
|
|
119
122
|
return { command: piPath, argv: args };
|
|
@@ -150,6 +153,8 @@ export class PiSpawner {
|
|
|
150
153
|
this.permissionMode = opts.permissionMode ?? "chorus";
|
|
151
154
|
this.creds = opts.creds ?? null;
|
|
152
155
|
this.platform = opts.platform ?? process.platform;
|
|
156
|
+
this.cliConfig = validateAgentCliConfig(opts.cliConfig, "pi", opts.label);
|
|
157
|
+
this.env = overlayAgentEnv(opts.env ?? process.env, this.cliConfig.env, this.platform);
|
|
153
158
|
this.resolvePiPathFn = opts.resolvePiPathFn ?? resolvePiPath;
|
|
154
159
|
}
|
|
155
160
|
|
|
@@ -174,7 +179,7 @@ export class PiSpawner {
|
|
|
174
179
|
const anchor = typeof sessionId === "string" ? sessionId : "";
|
|
175
180
|
const isNewFlag = Boolean(isNew);
|
|
176
181
|
|
|
177
|
-
const piPath = this.piPath ?? this.resolvePiPathFn();
|
|
182
|
+
const piPath = this.piPath ?? this.resolvePiPathFn({ env: this.env, platform: this.platform });
|
|
178
183
|
if (!piPath) {
|
|
179
184
|
// No crash — surface visibly and resolve with a failure result (matches the
|
|
180
185
|
// other spawners' "skipping wake" convention: exitCode null, no throw).
|
|
@@ -182,8 +187,10 @@ export class PiSpawner {
|
|
|
182
187
|
return { sessionId: anchor, backendSessionId: null, exitCode: null, isNew: isNewFlag };
|
|
183
188
|
}
|
|
184
189
|
|
|
185
|
-
|
|
186
|
-
const
|
|
190
|
+
assertConfiguredShimArgs(piPath, this.cliConfig.args, this.platform);
|
|
191
|
+
const fixed = buildPiArgs({ sessionId: anchor });
|
|
192
|
+
const args = [...fixed.slice(0, -1), ...this.cliConfig.args, fixed.at(-1)];
|
|
193
|
+
const { command, argv } = resolveSpawnCommand(piPath, args, this.platform, this.env);
|
|
187
194
|
|
|
188
195
|
// POSIX: detached process group so the interrupt path can group-kill the tree
|
|
189
196
|
// (pi may fork child shells / subagents). Windows uses taskkill /T. stdio stays
|
|
@@ -193,7 +200,7 @@ export class PiSpawner {
|
|
|
193
200
|
// Export the daemon's resolved connection pair for the chorus-pi extension's
|
|
194
201
|
// Chorus tooling. Explicitly overwrite inherited values so the extension and the
|
|
195
202
|
// daemon cannot disagree about which Chorus instance this wake belongs to.
|
|
196
|
-
const childEnv = { ...
|
|
203
|
+
const childEnv = { ...this.env, CHORUS_DAEMON_HEADLESS: "1" };
|
|
197
204
|
if (this.creds) {
|
|
198
205
|
if (this.creds.url) childEnv.CHORUS_URL = this.creds.url;
|
|
199
206
|
if (this.creds.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
|
|
@@ -214,8 +221,8 @@ export class PiSpawner {
|
|
|
214
221
|
detached,
|
|
215
222
|
windowsHide: true,
|
|
216
223
|
});
|
|
217
|
-
} catch (
|
|
218
|
-
this.logger.error(`[Chorus] failed to spawn pi: ${
|
|
224
|
+
} catch (error) {
|
|
225
|
+
this.logger.error(`[Chorus] failed to spawn pi: ${safeSpawnError(error)}`);
|
|
219
226
|
resolve({ sessionId: anchor, backendSessionId: null, exitCode: null, isNew: isNewFlag });
|
|
220
227
|
return;
|
|
221
228
|
}
|
|
@@ -256,8 +263,8 @@ export class PiSpawner {
|
|
|
256
263
|
if (text) this.logger.warn(`[Chorus] pi stderr: ${text}`);
|
|
257
264
|
});
|
|
258
265
|
|
|
259
|
-
child.on("error", (
|
|
260
|
-
this.logger.error(`[Chorus] pi process error: ${
|
|
266
|
+
child.on("error", (error) => {
|
|
267
|
+
this.logger.error(`[Chorus] pi process error: ${safeSpawnError(error)}`);
|
|
261
268
|
resolve({ sessionId: anchor, backendSessionId: anchor || null, exitCode: null, isNew: isNewFlag });
|
|
262
269
|
});
|
|
263
270
|
|
package/cli/prompts.mjs
CHANGED
|
@@ -26,6 +26,13 @@
|
|
|
26
26
|
* @property {string} actorUuid
|
|
27
27
|
* @property {string} actorName
|
|
28
28
|
* @property {{type: string, uuid: string, name: string} | null} [orchestrator]
|
|
29
|
+
* @property {{agentUuid: string, agentName: string, ideaUuid: string} | null} [wakerSession]
|
|
30
|
+
* Derived, NON-persisted waker-session anchor (wake-carry-waker-session-anchor, T1). Present
|
|
31
|
+
* only for an agent-caused wake on an idea/task-anchored resource whose waking agent has a
|
|
32
|
+
* live, ONLINE-origin session for that idea — it tells the woken peer that replying on this
|
|
33
|
+
* resource reaches the waker's existing live session. A SIBLING of `orchestrator`
|
|
34
|
+
* (actor-scoped vs assignment-scoped): either, both, or neither may be present. The server
|
|
35
|
+
* supplies it on the `chorus_get_notifications` projection; the router threads it here.
|
|
29
36
|
* @property {string} [instructionText] Free-text body of a `human_instruction` wake
|
|
30
37
|
* (子1 — daemon-session-conversation). The server denormalizes the canonical turn
|
|
31
38
|
* promptText onto the wake notification so the daemon reads it in the
|
|
@@ -64,6 +71,37 @@ function orchestratorGuidance(n) {
|
|
|
64
71
|
);
|
|
65
72
|
}
|
|
66
73
|
|
|
74
|
+
/**
|
|
75
|
+
* Waker-session advisory, appended to a wake body whenever the notification carries a
|
|
76
|
+
* `wakerSession` anchor (wake-carry-waker-session-anchor, T2). It tells the woken peer WHERE
|
|
77
|
+
* the waking agent's live conversation is: replying by commenting on THIS resource lands the
|
|
78
|
+
* reply back in that agent's existing idea-anchored session, keeping the exchange on one
|
|
79
|
+
* thread instead of scattering into a fresh one.
|
|
80
|
+
*
|
|
81
|
+
* It is deliberately ADVISORY, not routing — the server surfaces the anchor only when it
|
|
82
|
+
* resolved a live, ONLINE-origin waker session (an offline/missing waker degrades to
|
|
83
|
+
* notify-only and the field is null); there is no automatic subscription and nothing is
|
|
84
|
+
* force-delivered. The wording must NOT promise a guaranteed channel.
|
|
85
|
+
*
|
|
86
|
+
* A SIBLING of `orchestratorGuidance`: independent, appended alongside it in buildPrompt, so
|
|
87
|
+
* either/both/neither may render on one wake and they may name different agents. Its OpenClaw
|
|
88
|
+
* twin is `buildWakerSessionGuidance` in packages/openclaw-plugin/src/event-router.ts —
|
|
89
|
+
* KEEP THE TWO WORDINGS IN SYNC.
|
|
90
|
+
* @param {NotificationDetail} n
|
|
91
|
+
*/
|
|
92
|
+
function wakerSessionGuidance(n) {
|
|
93
|
+
if (!n.wakerSession) return null;
|
|
94
|
+
const { agentName, agentUuid } = n.wakerSession;
|
|
95
|
+
return (
|
|
96
|
+
`@[${agentName}](agent:${agentUuid}) woke you and has a live session open on this ` +
|
|
97
|
+
`resource. If you reply by commenting on this same resource, your reply reaches that ` +
|
|
98
|
+
`agent's live session, keeping the exchange on one thread. This is advisory, not an ` +
|
|
99
|
+
`enforced server route — there is no automatic subscription and nothing is force-delivered; ` +
|
|
100
|
+
`replying here is simply where a reply lands via the normal return path. Prefer replying ` +
|
|
101
|
+
`on this resource over opening a new session.`
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
|
|
67
105
|
/**
|
|
68
106
|
* Shared headless preamble prepended to EVERY wake prompt (add-daemon-headless-
|
|
69
107
|
* interaction-guard). A daemon-woken session is a headless `claude -p` run with no
|
|
@@ -121,7 +159,12 @@ export function buildPrompt(n) {
|
|
|
121
159
|
const body = buildPromptBody(n);
|
|
122
160
|
if (body == null) return null;
|
|
123
161
|
const handoff = orchestratorGuidance(n);
|
|
124
|
-
|
|
162
|
+
const anchor = wakerSessionGuidance(n);
|
|
163
|
+
return (
|
|
164
|
+
`${HEADLESS_PREAMBLE}\n\n${body}` +
|
|
165
|
+
(handoff ? `\n\n${handoff}` : "") +
|
|
166
|
+
(anchor ? `\n\n${anchor}` : "")
|
|
167
|
+
);
|
|
125
168
|
}
|
|
126
169
|
|
|
127
170
|
/**
|
|
@@ -208,7 +251,14 @@ export function buildBatchPrompt(notifications) {
|
|
|
208
251
|
? `\n(${g.count} ${n.action} events on this ${entityType} arrived — showing the newest ` +
|
|
209
252
|
`below; earlier ones are re-derivable via the entity's own chorus_get_* tools.)`
|
|
210
253
|
: "";
|
|
211
|
-
|
|
254
|
+
// Per-wake waker-session advisory (wake-carry-waker-session-anchor, T2). The anchor is
|
|
255
|
+
// ACTOR-scoped, so it belongs to each event individually — different queued wakes may
|
|
256
|
+
// carry different (or no) waker sessions. Appending it only in buildPrompt would silently
|
|
257
|
+
// drop it in this coalesced busy-worker batch, the feature's core scenario; so surface it
|
|
258
|
+
// per block here too, keyed off the collapsed group's newest notification.
|
|
259
|
+
const anchor = wakerSessionGuidance(n);
|
|
260
|
+
const anchorBlock = anchor ? `\n\n${anchor}` : "";
|
|
261
|
+
return `${header}${collapseNote}\n\n${g.body}${anchorBlock}`;
|
|
212
262
|
});
|
|
213
263
|
|
|
214
264
|
return [HEADLESS_PREAMBLE, backlogPreamble, ...rendered].join("\n\n");
|
package/cli/spawner-select.mjs
CHANGED
|
@@ -59,7 +59,7 @@ export class OfflineSpawner {
|
|
|
59
59
|
* @returns {import("./codex-spawner.mjs").Spawner}
|
|
60
60
|
*/
|
|
61
61
|
export function selectSpawner(agentType, opts = {}) {
|
|
62
|
-
const { logger
|
|
62
|
+
const { logger } = opts;
|
|
63
63
|
if (agentType === "offline") {
|
|
64
64
|
// Fail-closed: an offline agent has no local backend. Return the no-op spawner
|
|
65
65
|
// explicitly so we NEVER fall through to the claude-code default below and wake
|
|
@@ -67,23 +67,18 @@ export function selectSpawner(agentType, opts = {}) {
|
|
|
67
67
|
return new OfflineSpawner({ logger });
|
|
68
68
|
}
|
|
69
69
|
if (agentType === "codex") {
|
|
70
|
-
return new CodexSpawner(
|
|
70
|
+
return new CodexSpawner(opts);
|
|
71
71
|
}
|
|
72
72
|
if (agentType === "kiro") {
|
|
73
|
-
return new KiroSpawner(
|
|
73
|
+
return new KiroSpawner(opts);
|
|
74
74
|
}
|
|
75
75
|
if (agentType === "dsh") {
|
|
76
|
-
return new DshSpawner(
|
|
77
|
-
logger,
|
|
78
|
-
creds,
|
|
79
|
-
bundleVersion: opts.bundleVersion,
|
|
80
|
-
prepareManagedConfigFn: opts.prepareManagedConfigFn,
|
|
81
|
-
});
|
|
76
|
+
return new DshSpawner(opts);
|
|
82
77
|
}
|
|
83
78
|
if (agentType === "pi") {
|
|
84
79
|
// pi is a first-class wakeable backend — an explicit branch so it NEVER falls
|
|
85
80
|
// through to the claude-code default below (nor is treated as offline).
|
|
86
|
-
return new PiSpawner(
|
|
81
|
+
return new PiSpawner(opts);
|
|
87
82
|
}
|
|
88
|
-
return new ClaudeSpawner(
|
|
83
|
+
return new ClaudeSpawner(opts);
|
|
89
84
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chorus-aidlc/chorus",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.18.0",
|
|
4
4
|
"description": "The Agent Harness for AI-Human Collaboration — session lifecycle, task state, sub-agent orchestration, observability, and failure recovery",
|
|
5
5
|
"homepage": "https://github.com/Chorus-AIDLC/Chorus",
|
|
6
6
|
"repository": {
|