@chorus-aidlc/chorus 0.17.0 → 0.17.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +519 -519
- package/.next/standalone/.next/app-path-routes-manifest.json +44 -44
- package/.next/standalone/.next/build-manifest.json +6 -6
- package/.next/standalone/.next/prerender-manifest.json +45 -45
- package/.next/standalone/.next/react-loadable-manifest.json +1 -1
- package/.next/standalone/.next/required-server-files.json +4 -4
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/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 +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +3 -3
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -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.js +2 -2
- 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 +5 -5
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page.js.nft.json +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.js +2 -2
- package/.next/standalone/.next/server/app/admin/companies/new/page.js.nft.json +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 +7 -7
- package/.next/standalone/.next/server/app/admin/companies/page.js +2 -2
- package/.next/standalone/.next/server/app/admin/companies/page.js.nft.json +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 +7 -7
- package/.next/standalone/.next/server/app/admin/page.js +2 -2
- package/.next/standalone/.next/server/app/admin/page.js.nft.json +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 +7 -7
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route.js +1 -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.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/check-default/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route.js +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.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 +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 +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_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_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_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route.js +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 +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_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_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_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_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route_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_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/route.js +14 -6
- package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route.js +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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route.js +4 -4
- 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_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_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_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/pin/route.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.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.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.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 +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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route.js +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 +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/[uuid]/route.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.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.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/session/route.js +1 -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_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_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_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_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_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_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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/favicon.ico/route.js +1 -1
- package/.next/standalone/.next/server/app/index.html +2 -2
- package/.next/standalone/.next/server/app/index.rsc +6 -6
- package/.next/standalone/.next/server/app/login/admin/page.js +2 -2
- package/.next/standalone/.next/server/app/login/admin/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +2 -2
- package/.next/standalone/.next/server/app/login/admin.rsc +6 -6
- package/.next/standalone/.next/server/app/login/callback/page.js +2 -2
- package/.next/standalone/.next/server/app/login/callback/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/callback.html +2 -2
- package/.next/standalone/.next/server/app/login/callback.rsc +6 -6
- package/.next/standalone/.next/server/app/login/page.js +2 -2
- package/.next/standalone/.next/server/app/login/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page.js +2 -2
- package/.next/standalone/.next/server/app/login/pick-workspace/page.js.nft.json +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 +6 -6
- package/.next/standalone/.next/server/app/login.html +2 -2
- package/.next/standalone/.next/server/app/login.rsc +6 -6
- 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 +6 -6
- package/.next/standalone/.next/server/app/page.js +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 +7 -7
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +7 -7
- package/.next/standalone/.next/server/app-paths-manifest.json +44 -44
- package/.next/standalone/.next/server/chunks/1114.js +1 -1
- package/.next/standalone/.next/server/chunks/1267.js +1 -0
- package/.next/standalone/.next/server/chunks/1318.js +1 -1
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/{3831.js → 2536.js} +6 -4
- package/.next/standalone/.next/server/chunks/2570.js +2 -2
- package/.next/standalone/.next/server/chunks/2572.js +1 -1
- package/.next/standalone/.next/server/chunks/2940.js +1 -1
- package/.next/standalone/.next/server/chunks/2953.js +1 -0
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3197.js +1 -1
- package/.next/standalone/.next/server/chunks/378.js +4 -4
- package/.next/standalone/.next/server/chunks/4827.js +1 -1
- package/.next/standalone/.next/server/chunks/5162.js +1 -0
- package/.next/standalone/.next/server/chunks/5245.js +1 -1
- package/.next/standalone/.next/server/chunks/{5706.js → 6080.js} +1 -1
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6145.js +1 -0
- package/.next/standalone/.next/server/chunks/6506.js +1 -1
- package/.next/standalone/.next/server/chunks/6515.js +2 -2
- package/.next/standalone/.next/server/chunks/6689.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/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/7530.js +1 -1
- package/.next/standalone/.next/server/chunks/8454.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/chunks/9667.js +1 -0
- package/.next/standalone/.next/server/chunks/9931.js +1 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.js +1 -1
- package/.next/standalone/.next/server/next-font-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +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/server/src/middleware.js +2 -2
- package/.next/standalone/.next/static/chunks/{11595.bbe40924d18958bf.js → 11595.b81c0bf7732c3b62.js} +1 -1
- package/.next/standalone/.next/static/chunks/24808-e3d95efc7ec039c5.js +1 -0
- package/.next/standalone/.next/static/chunks/{31308-bb4a97b3f39c22dd.js → 31308-32614efb88305738.js} +1 -1
- package/.next/standalone/.next/static/chunks/{33456.5499eb8e892b110a.js → 33456.cfc9aa607a62e879.js} +1 -1
- package/.next/standalone/.next/static/chunks/38366.fb931fab9c756890.js +1 -0
- package/.next/standalone/.next/static/chunks/{4860.be77046fb2b3a2bd.js → 4860.41351a823cf400e4.js} +1 -1
- package/.next/standalone/.next/static/chunks/51468-194d894e563580dd.js +1 -0
- package/.next/standalone/.next/static/chunks/61570-527701d072d00a24.js +1 -0
- package/.next/standalone/.next/static/chunks/65066-6da35d5cb080c7f5.js +1 -0
- package/.next/standalone/.next/static/chunks/{65096-f756aac39efad7a3.js → 65096-8295f53f97c40d47.js} +1 -1
- package/.next/standalone/.next/static/chunks/72875-0987d09cd8406614.js +1 -0
- package/.next/standalone/.next/static/chunks/75936-79860953212592fd.js +1 -0
- package/.next/standalone/.next/static/chunks/{78917-a8a8dff98857c045.js → 79919-e02963faee5cb563.js} +1 -1
- package/.next/standalone/.next/static/chunks/94643-e8f5fa25e2340cc8.js +1 -0
- package/.next/standalone/.next/static/chunks/{99373.111493dc260a2a04.js → 99373.633f7c25e64bcdac.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-bb5ef11586301c72.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/{page-974781e4886529f8.js → page-82e90e222d6bc547.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/activity/page-f1eccb50d38d8982.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-eecb38fa4b8eb4e8.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-725373108da1b08c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-cd7ec77596304a07.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-97a9e6f949002004.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-7d2f4713697eb0a7.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-cec15f4b835d34fc.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0225f87552b977d9.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-15bb6e1696668512.js → page-4ee117e690fda56f.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-2bea97214b1595cc.js → page-7fbc46dfb7b22bd3.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/page-069c9738e516436b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-8b30678a58e7b2ee.js +1 -0
- package/.next/standalone/.next/static/chunks/app/_not-found/{page-166b410da84336d4.js → page-b9d672df79b35e87.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/[uuid]/{page-b2458ed001dc8177.js → page-56118c51122ad639.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/new/page-4e20deb41357171c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/companies/page-0632f245bf9c1c27.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/layout-725ab2331c642f36.js +1 -0
- package/.next/standalone/.next/static/chunks/app/admin/{page-0cc8cf246db43e5d.js → page-5a0271dd2b8b36fd.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/{layout-985054e973f66999.js → layout-098288cec4490c5d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/login/admin/page-c8e40259e5d3d9e0.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/callback/page-527652f6c1a39274.js +1 -0
- package/.next/standalone/.next/static/chunks/app/login/{page-9b34375d1b5579d7.js → page-0a16a64855b771ef.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-47375a86e2375202.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/{page-540da64d7ba16dc7.js → page-4fce966dc96d4ff1.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/{page-79e2d32e69788bd2.js → page-91dbf7dfd85f805f.js} +1 -1
- package/.next/standalone/.next/static/chunks/main-app-1a7cacecc8900a4d.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-7cbb3ba6792f1fb3.js → webpack-1bfc783412a06fc5.js} +1 -1
- package/.next/standalone/.next/static/css/1d9cf83f50b6db00.css +1 -0
- package/.next/standalone/package.json +2 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +1 -1
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +11 -1
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +2 -2
- 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 +3 -3
- 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 +11 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +2 -2
- 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 +2 -2
- 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 +3 -3
- package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +1 -1
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
- package/.next/standalone/public/kiro-plugin/manifest.txt +1 -0
- package/.next/standalone/public/skill/chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +2 -2
- package/.next/standalone/server.js +1 -1
- package/README.ja.md +5 -1
- package/README.ko.md +5 -1
- package/README.md +5 -1
- package/README.zh.md +5 -1
- package/cli/agent-backend-prompt.mjs +5 -0
- package/cli/agent-launcher.mjs +341 -0
- package/cli/agents.mjs +12 -0
- package/cli/claude-spawner.mjs +52 -15
- package/cli/credentials.mjs +107 -1
- package/cli/daemon-agent.mjs +4 -2
- package/cli/init/adapters.mjs +5 -5
- package/cli/init/agent-type-map.mjs +5 -5
- package/cli/init/contracts.mjs +2 -0
- package/cli/init/install-methods.mjs +206 -31
- package/cli/init/pi-mcp-config.mjs +166 -0
- package/cli/init/steps/credential-seed.mjs +56 -3
- package/cli/init-args.mjs +4 -1
- package/cli/init.mjs +47 -2
- package/cli/kiro-spawner.mjs +1 -0
- package/cli/pi-spawner.mjs +286 -0
- package/cli/spawner-select.mjs +7 -1
- package/cli/upload-hooks.mjs +25 -1
- package/cli/waker.mjs +89 -38
- package/package.json +2 -1
- package/.next/standalone/.env +0 -18
- package/.next/standalone/.next/server/chunks/1437.js +0 -1
- package/.next/standalone/.next/server/chunks/3045.js +0 -1
- package/.next/standalone/.next/server/chunks/4545.js +0 -1
- package/.next/standalone/.next/server/chunks/6207.js +0 -1
- package/.next/standalone/.next/server/chunks/7091.js +0 -1
- package/.next/standalone/.next/server/chunks/9449.js +0 -1
- package/.next/standalone/.next/server/chunks/9458.js +0 -1
- package/.next/standalone/.next/static/chunks/18139-e6ef4b5869593f8e.js +0 -1
- package/.next/standalone/.next/static/chunks/28856-ef2cb58fbd404ef9.js +0 -1
- package/.next/standalone/.next/static/chunks/38366.e6e0132b8ba873d6.js +0 -1
- package/.next/standalone/.next/static/chunks/66873-e3be53f41b3f2255.js +0 -1
- package/.next/standalone/.next/static/chunks/70303-aec3d52ad87602a3.js +0 -1
- package/.next/standalone/.next/static/chunks/76201-83b26515f85ce37c.js +0 -1
- package/.next/standalone/.next/static/chunks/94643-ffa140f765c73daf.js +0 -1
- package/.next/standalone/.next/static/chunks/97663-9c3ae4fd60b353db.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-40fe7d026c5a7c6d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/activity/page-20632dbec5a6dbc0.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-87d4d0fe90fca28c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-1206abaee85dc915.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-474e494097c8945f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-e902b19328092ccf.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-f273288c3530aa0f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-6568a7b08bf9a54b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-fbd3c27b68666234.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/page-9d79e285b6fd2f8d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-2bf7ceee62b574c7.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/new/page-e35dce890d6dfd8d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/companies/page-ef720c2b0856166c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/admin/layout-c66ce38cbd88982a.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/admin/page-f032b6db3bd20a2c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/callback/page-ec23211506e688ee.js +0 -1
- package/.next/standalone/.next/static/chunks/app/login/pick-workspace/page-7e4664af2c787d08.js +0 -1
- package/.next/standalone/.next/static/chunks/main-app-ec87f2c9ef083ff1.js +0 -1
- package/.next/standalone/.next/static/css/5f52bd39b284ccdf.css +0 -1
- /package/.next/standalone/.next/static/{0spgxl3lP26Fl1otd1D7R → WSN4XeA1kUCI6CeEHcaT_}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{0spgxl3lP26Fl1otd1D7R → WSN4XeA1kUCI6CeEHcaT_}/_ssgManifest.js +0 -0
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
// "claude-code" EXPLICITLY here. No caller ever passes the raw init id
|
|
13
13
|
// through to daemon.json; every write goes through agentTypeForSelection.
|
|
14
14
|
// 2. Any selection the daemon cannot wake as a first-class backend
|
|
15
|
-
// (opencode / openclaw
|
|
15
|
+
// (opencode / openclaw, and dsh while its harness is dormant/offline)
|
|
16
16
|
// maps to the non-wakeable "offline" classification. Its key is still parked
|
|
17
17
|
// in agents[] for the `chorus mcp` proxy, but the daemon builds no spawner
|
|
18
18
|
// and dispatches no wake (spawner-select.mjs fail-closes on "offline").
|
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
// woken as claude-code.
|
|
23
23
|
|
|
24
24
|
/**
|
|
25
|
-
* Selection id → daemon agentType.
|
|
25
|
+
* Selection id → daemon agentType. claude/codex/kiro/pi are wakeable backends;
|
|
26
26
|
* everything else is classified offline. `dsh` maps to offline because the dsh
|
|
27
27
|
* harness is de-advertised (offline) — re-map it here to bring it back online.
|
|
28
28
|
* @type {Readonly<Record<string, string>>}
|
|
@@ -31,9 +31,9 @@ export const SELECTION_TO_AGENT_TYPE = Object.freeze({
|
|
|
31
31
|
claude: "claude-code", // explicit rename — never pass the init id "claude" through verbatim
|
|
32
32
|
codex: "codex",
|
|
33
33
|
kiro: "kiro",
|
|
34
|
+
pi: "pi", // wakeable via PiSpawner (add-daemon-pi-backend)
|
|
34
35
|
opencode: "offline",
|
|
35
36
|
openclaw: "offline",
|
|
36
|
-
pi: "offline",
|
|
37
37
|
dsh: "offline",
|
|
38
38
|
});
|
|
39
39
|
|
|
@@ -42,7 +42,7 @@ export const SELECTION_TO_AGENT_TYPE = Object.freeze({
|
|
|
42
42
|
* daemon.json `agents[]`. Unknown ids fail closed to "offline" (never a wakeable
|
|
43
43
|
* default), so an agent is only ever woken when its backend is explicitly known.
|
|
44
44
|
* @param {string} selectionId
|
|
45
|
-
* @returns {string} a KNOWN_AGENTS agentType ("claude-code" | "codex" | "kiro" | "offline")
|
|
45
|
+
* @returns {string} a KNOWN_AGENTS agentType ("claude-code" | "codex" | "kiro" | "pi" | "offline")
|
|
46
46
|
*/
|
|
47
47
|
export function agentTypeForSelection(selectionId) {
|
|
48
48
|
return SELECTION_TO_AGENT_TYPE[selectionId] ?? "offline";
|
|
@@ -51,7 +51,7 @@ export function agentTypeForSelection(selectionId) {
|
|
|
51
51
|
/**
|
|
52
52
|
* Whether a daemon agentType is one the daemon can actually wake. "offline" is the
|
|
53
53
|
* one non-wakeable classification; every other value the init mapping produces
|
|
54
|
-
* (claude-code / codex / kiro) is wakeable.
|
|
54
|
+
* (claude-code / codex / kiro / pi) is wakeable.
|
|
55
55
|
* @param {string} agentType
|
|
56
56
|
* @returns {boolean}
|
|
57
57
|
*/
|
package/cli/init/contracts.mjs
CHANGED
|
@@ -108,6 +108,8 @@ export const FAILURE_ACTIONS = Object.freeze([OUTCOME_ACTIONS.FAILED]);
|
|
|
108
108
|
* @property {string} [agentId] The current agent id (per-agent steps only).
|
|
109
109
|
* @property {AgentAdapter} [adapter] The current agent's adapter (per-agent steps only).
|
|
110
110
|
* @property {object} flags Parsed init flags (see cli/init-args.mjs).
|
|
111
|
+
* `flags.updateInstalled` is the orchestrator-resolved, invocation-wide
|
|
112
|
+
* decision to refresh selected installed plugin payloads.
|
|
111
113
|
* @property {{ log: (m: string) => void, ask: Function, isTTY: boolean }} io
|
|
112
114
|
* @property {(path: string) => (string|null)} backup Copy a file to <path>.chorus-bak
|
|
113
115
|
* once before overwrite; returns the backup path or null if the source is absent.
|
|
@@ -66,9 +66,10 @@ function readJsonSafe(path) {
|
|
|
66
66
|
}
|
|
67
67
|
|
|
68
68
|
// ---------------------------------------------------------------------------
|
|
69
|
-
// Claude Code — VERIFIED against Claude Code 2.1.
|
|
69
|
+
// Claude Code — VERIFIED LIVE against Claude Code 2.1.250:
|
|
70
70
|
// `claude plugin marketplace add <url|path|repo>`
|
|
71
71
|
// `claude plugin install <plugin@marketplace> -y` (-y required when non-TTY)
|
|
72
|
+
// `claude plugin update <plugin@marketplace> -y`
|
|
72
73
|
// State is read from ~/.claude/plugins/installed_plugins.json (read-only).
|
|
73
74
|
// ---------------------------------------------------------------------------
|
|
74
75
|
export function installClaude(ctx) {
|
|
@@ -77,6 +78,11 @@ export function installClaude(ctx) {
|
|
|
77
78
|
const source = env.CHORUS_MARKETPLACE_SOURCE || CHORUS_MARKETPLACE_SOURCE;
|
|
78
79
|
const state = safeState(ctx);
|
|
79
80
|
if (state.pluginInstalled) {
|
|
81
|
+
if (ctx.flags?.updateInstalled) {
|
|
82
|
+
const r = run("claude", ["plugin", "update", CHORUS_PLUGIN_ID, "-y"], { env });
|
|
83
|
+
if (!r.ok) return out("claude", FAILED, `claude plugin update failed: ${errText(r)}`);
|
|
84
|
+
return out("claude", REPAIRED, `updated ${CHORUS_PLUGIN_ID} to latest via claude plugin update`);
|
|
85
|
+
}
|
|
80
86
|
return out("claude", SKIPPED, `already installed${state.version ? ` (v${state.version})` : ""}`);
|
|
81
87
|
}
|
|
82
88
|
if (!state.marketplaceRegistered) {
|
|
@@ -91,6 +97,7 @@ export function installClaude(ctx) {
|
|
|
91
97
|
// ---------------------------------------------------------------------------
|
|
92
98
|
// Codex — VERIFIED against codex-cli 0.146.1 / 0.150.1:
|
|
93
99
|
// `codex plugin marketplace add <SOURCE>` (SOURCE = local path | owner/repo[@ref] | Git URL)
|
|
100
|
+
// `codex plugin marketplace upgrade [MARKETPLACE_NAME]`
|
|
94
101
|
// `codex plugin add <PLUGIN@MARKETPLACE> --json`
|
|
95
102
|
// config.toml is backed up before the CLI mutates it.
|
|
96
103
|
//
|
|
@@ -153,6 +160,21 @@ export function installCodex(ctx) {
|
|
|
153
160
|
|
|
154
161
|
if (state.pluginInstalled) {
|
|
155
162
|
ctx.backup?.(configPath); // back up before we normalize the MCP block
|
|
163
|
+
if (ctx.flags?.updateInstalled) {
|
|
164
|
+
if (!state.marketplaceRegistered) {
|
|
165
|
+
const ra = run("codex", ["plugin", "marketplace", "add", source], { env });
|
|
166
|
+
if (!ra.ok) return out("codex", FAILED, `codex plugin marketplace add failed: ${errText(ra)}`);
|
|
167
|
+
}
|
|
168
|
+
const ru = run("codex", ["plugin", "marketplace", "upgrade", CHORUS_MARKETPLACE_NAME], { env });
|
|
169
|
+
if (!ru.ok) return out("codex", FAILED, `codex plugin marketplace upgrade failed: ${errText(ru)}`);
|
|
170
|
+
const rp = run("codex", ["plugin", "add", CHORUS_PLUGIN_ID, "--json"], { env });
|
|
171
|
+
if (!rp.ok) return out("codex", FAILED, `codex plugin add failed: ${errText(rp)}`);
|
|
172
|
+
return out(
|
|
173
|
+
"codex",
|
|
174
|
+
REPAIRED,
|
|
175
|
+
`refreshed ${CHORUS_MARKETPLACE_NAME} and reinstalled ${CHORUS_PLUGIN_ID}${ensureMcp()}`,
|
|
176
|
+
);
|
|
177
|
+
}
|
|
156
178
|
return out("codex", SKIPPED, `already installed (config.toml)${ensureMcp()}`);
|
|
157
179
|
}
|
|
158
180
|
|
|
@@ -171,8 +193,9 @@ export function installCodex(ctx) {
|
|
|
171
193
|
}
|
|
172
194
|
|
|
173
195
|
// ---------------------------------------------------------------------------
|
|
174
|
-
// opencode — VERIFIED against opencode 1.14.33:
|
|
196
|
+
// opencode — VERIFIED LIVE against opencode 1.14.33:
|
|
175
197
|
// `opencode plugin <module>` ("install plugin and update config")
|
|
198
|
+
// `--global` targets the user config; `--force` replaces an existing version.
|
|
176
199
|
// module name "opencode-chorus" from public/install-opencode.sh. opencode.json
|
|
177
200
|
// is backed up before the CLI mutates it.
|
|
178
201
|
// ---------------------------------------------------------------------------
|
|
@@ -195,15 +218,21 @@ export function installOpencode(ctx) {
|
|
|
195
218
|
const home = env.HOME || homedir();
|
|
196
219
|
const dir = env.OPENCODE_CONFIG_DIR || join(home, ".config", "opencode");
|
|
197
220
|
const state = safeState(ctx);
|
|
198
|
-
if (state.pluginInstalled
|
|
221
|
+
if (state.pluginInstalled && !ctx.flags?.updateInstalled) {
|
|
222
|
+
return out("opencode", SKIPPED, "already in opencode.json plugin list");
|
|
223
|
+
}
|
|
199
224
|
|
|
200
225
|
ctx.backup?.(join(dir, "opencode.json")); // back up before the CLI edits it
|
|
201
226
|
// `-g` writes the GLOBAL ~/.config/opencode/opencode.json (the same file
|
|
202
227
|
// readOpencodeInstallState checks); without it opencode installs project-local
|
|
203
228
|
// (cwd), which would defeat idempotency for a machine-wide `chorus init`.
|
|
204
|
-
const
|
|
229
|
+
const args = ["plugin", OPENCODE_PLUGIN_MODULE, "-g"];
|
|
230
|
+
if (state.pluginInstalled) args.push("--force");
|
|
231
|
+
const r = run("opencode", args, { env });
|
|
205
232
|
if (!r.ok) return out("opencode", FAILED, `opencode plugin install failed: ${errText(r)}`);
|
|
206
|
-
return
|
|
233
|
+
return state.pluginInstalled
|
|
234
|
+
? out("opencode", REPAIRED, `updated ${OPENCODE_PLUGIN_MODULE} to latest via opencode plugin -g --force`)
|
|
235
|
+
: out("opencode", INSTALLED, `installed ${OPENCODE_PLUGIN_MODULE} via opencode plugin -g`);
|
|
207
236
|
}
|
|
208
237
|
|
|
209
238
|
// ---------------------------------------------------------------------------
|
|
@@ -225,18 +254,35 @@ const DSH_BUNDLE = "@chorus-aidlc/chorus-dsh";
|
|
|
225
254
|
export function readDshInstallState({ env = process.env, profile } = {}) {
|
|
226
255
|
// Best-effort, per-profile idempotency probe. A dsh profile is a pnpm workspace
|
|
227
256
|
// root under $DSH_HOME (docs/CONNECT_DSH.md); a profile that has added the bundle
|
|
228
|
-
// records it in that root's package.json.
|
|
229
|
-
//
|
|
230
|
-
//
|
|
231
|
-
// detection, which does not know the user's pick) it reports not-installed.
|
|
232
|
-
if (!profile) return { marketplaceRegistered: false, pluginInstalled: false };
|
|
257
|
+
// records it in that root's package.json. Before an interactive profile has
|
|
258
|
+
// been chosen, inspect the live profiles/<name> store so runInit can include
|
|
259
|
+
// dsh in its one invocation-wide installed-plugin refresh decision.
|
|
233
260
|
const home = env.HOME || homedir();
|
|
234
261
|
const dshHome = env.DSH_HOME || join(home, ".dsh");
|
|
235
|
-
|
|
236
|
-
|
|
262
|
+
let candidates;
|
|
263
|
+
if (profile) {
|
|
264
|
+
candidates = [
|
|
265
|
+
join(dshHome, "profiles", profile, "package.json"),
|
|
266
|
+
join(dshHome, profile, "package.json"),
|
|
267
|
+
];
|
|
268
|
+
} else {
|
|
269
|
+
try {
|
|
270
|
+
candidates = readdirSync(join(dshHome, "profiles"), { withFileTypes: true })
|
|
271
|
+
.filter((entry) => entry.isDirectory())
|
|
272
|
+
.map((entry) => join(dshHome, "profiles", entry.name, "package.json"));
|
|
273
|
+
} catch {
|
|
274
|
+
candidates = [];
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
const packagePath = candidates.find((path) => {
|
|
278
|
+
const pkg = readJsonSafe(path);
|
|
279
|
+
const deps = { ...(pkg?.dependencies ?? {}), ...(pkg?.devDependencies ?? {}) };
|
|
280
|
+
return Object.prototype.hasOwnProperty.call(deps, DSH_BUNDLE);
|
|
281
|
+
});
|
|
237
282
|
return {
|
|
238
283
|
marketplaceRegistered: false, // dsh has no marketplace concept
|
|
239
|
-
pluginInstalled:
|
|
284
|
+
pluginInstalled: !!packagePath,
|
|
285
|
+
packagePath: packagePath ?? (profile ? candidates[0] : undefined),
|
|
240
286
|
};
|
|
241
287
|
}
|
|
242
288
|
|
|
@@ -276,11 +322,16 @@ export async function installDsh(ctx) {
|
|
|
276
322
|
|
|
277
323
|
// Idempotency: skip when the chosen profile already carries the bundle.
|
|
278
324
|
const state = safeState(ctx, { profile });
|
|
279
|
-
if (state.pluginInstalled
|
|
325
|
+
if (state.pluginInstalled && !ctx.flags?.updateInstalled) {
|
|
326
|
+
return out("dsh", SKIPPED, `already installed in dsh profile '${profile}'`);
|
|
327
|
+
}
|
|
328
|
+
if (state.pluginInstalled) ctx.backup?.(state.packagePath);
|
|
280
329
|
|
|
281
330
|
const r = run("dsh", ["plugin", "--profile", profile, "add", DSH_BUNDLE, "-w"], { env });
|
|
282
331
|
if (!r.ok) return out("dsh", FAILED, `dsh plugin add failed: ${errText(r)}`);
|
|
283
|
-
return
|
|
332
|
+
return state.pluginInstalled
|
|
333
|
+
? out("dsh", REPAIRED, `updated ${DSH_BUNDLE} to latest in dsh profile '${profile}'`)
|
|
334
|
+
: out("dsh", INSTALLED, `installed ${DSH_BUNDLE} into dsh profile '${profile}'`);
|
|
284
335
|
}
|
|
285
336
|
|
|
286
337
|
// ---------------------------------------------------------------------------
|
|
@@ -377,7 +428,7 @@ export function installOpenclaw(ctx) {
|
|
|
377
428
|
|
|
378
429
|
// Already installed AND enabled → nothing to do. No version probe needed: an
|
|
379
430
|
// enabled-and-loaded plugin necessarily already satisfied the host floor.
|
|
380
|
-
if (state.pluginInstalled && state.pluginEnabled) {
|
|
431
|
+
if (state.pluginInstalled && state.pluginEnabled && !ctx.flags?.updateInstalled) {
|
|
381
432
|
return out("openclaw", SKIPPED, "already installed and enabled");
|
|
382
433
|
}
|
|
383
434
|
|
|
@@ -395,18 +446,140 @@ export function installOpenclaw(ctx) {
|
|
|
395
446
|
}
|
|
396
447
|
|
|
397
448
|
// Installed-but-disabled → enable only (repair).
|
|
398
|
-
if (state.pluginInstalled) {
|
|
449
|
+
if (state.pluginInstalled && !ctx.flags?.updateInstalled) {
|
|
399
450
|
const re = run("openclaw", ["plugins", "enable", OPENCLAW_PLUGIN_ID], { env });
|
|
400
451
|
if (!re.ok) return out("openclaw", FAILED, `openclaw plugins enable failed: ${errText(re)}`);
|
|
401
452
|
return out("openclaw", REPAIRED, `enabled ${OPENCLAW_PLUGIN_ID} (was installed but disabled)`);
|
|
402
453
|
}
|
|
403
454
|
|
|
404
|
-
// Fresh → install from npm, then
|
|
455
|
+
// Fresh or accepted refresh → install from npm, then ensure enabled. Back up
|
|
456
|
+
// the mutable host config before an installed payload is refreshed.
|
|
457
|
+
if (state.pluginInstalled) {
|
|
458
|
+
const home = env.HOME || homedir();
|
|
459
|
+
const dir = env.OPENCLAW_CONFIG_DIR || join(home, ".openclaw");
|
|
460
|
+
ctx.backup?.(join(dir, "openclaw.json"));
|
|
461
|
+
}
|
|
405
462
|
const ri = run("openclaw", ["plugins", "install", OPENCLAW_NPM_SPEC], { env });
|
|
406
463
|
if (!ri.ok) return out("openclaw", FAILED, `openclaw plugins install failed: ${errText(ri)}`);
|
|
407
464
|
const re = run("openclaw", ["plugins", "enable", OPENCLAW_PLUGIN_ID], { env });
|
|
408
465
|
if (!re.ok) return out("openclaw", FAILED, `openclaw plugins enable failed: ${errText(re)}`);
|
|
409
|
-
return
|
|
466
|
+
return state.pluginInstalled
|
|
467
|
+
? out("openclaw", REPAIRED, `reinstalled latest ${OPENCLAW_NPM_SPEC} and ensured ${OPENCLAW_PLUGIN_ID} is enabled`)
|
|
468
|
+
: out("openclaw", INSTALLED, `installed ${OPENCLAW_NPM_SPEC} and enabled ${OPENCLAW_PLUGIN_ID}`);
|
|
469
|
+
}
|
|
470
|
+
|
|
471
|
+
// ---------------------------------------------------------------------------
|
|
472
|
+
// Pi — VERIFIED against docs/CONNECT_PI.md + packages/chorus-pi/README.md
|
|
473
|
+
// (chorus-pi ships to npm as @chorus-aidlc/chorus-pi):
|
|
474
|
+
// `pi install npm:pi-mcp-adapter` (the MCP adapter — exposes chorus_* tools)
|
|
475
|
+
// `pi install npm:@chorus-aidlc/chorus-pi` (the Chorus skills/agents/extension)
|
|
476
|
+
// pi installs extensions straight from an npm source (the `npm:` prefix on the
|
|
477
|
+
// spec, like OpenClaw). There is NO marketplace step and NO separate enable
|
|
478
|
+
// step (unlike claude / codex / openclaw). pi has no permission system and loads
|
|
479
|
+
// TypeScript via jiti, so the package publishes source as-is — nothing to build.
|
|
480
|
+
//
|
|
481
|
+
// TWO packages: pi reaches the Chorus MCP tools ONLY through `pi-mcp-adapter` (which reads
|
|
482
|
+
// the mcp.json `chorus agents add` writes — see credential-seed's pi branch + pi-mcp-config.mjs);
|
|
483
|
+
// chorus.ts does NOT register tools itself. So we install the adapter FIRST (the tool surface),
|
|
484
|
+
// then chorus-pi (the skills / reviewer agents / session extension). Both are idempotent.
|
|
485
|
+
//
|
|
486
|
+
// Graceful degradation: if the `pi` binary is absent we surface the exact manual
|
|
487
|
+
// commands as UNSUPPORTED guidance (never a hard FAILED — UNSUPPORTED is not a
|
|
488
|
+
// FAILURE_ACTION, so `chorus init` does not abort) and run ZERO commands. This
|
|
489
|
+
// follows the "no guessed command / no crash" rule the other adapters share.
|
|
490
|
+
//
|
|
491
|
+
// VERIFIED-gap: `@chorus-aidlc/chorus-pi` is published at the next coordinated
|
|
492
|
+
// release (A2), so the npm-install path could not be exercised end-to-end on this
|
|
493
|
+
// build host. The command shapes + graceful fallback are implemented; the spec's
|
|
494
|
+
// `pi install npm:<pkg>` form is the documented, reviewed command (pi-mcp-adapter is
|
|
495
|
+
// published — verified 2.32.1).
|
|
496
|
+
// ---------------------------------------------------------------------------
|
|
497
|
+
const PI_ADAPTER_SPEC = "npm:pi-mcp-adapter";
|
|
498
|
+
const PI_NPM_SPEC = "npm:@chorus-aidlc/chorus-pi";
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
* Read pi's install state. `pi install` records each package's source in the
|
|
502
|
+
* agent settings file (`<PI_CODING_AGENT_DIR|~/.pi/agent>/settings.json`) under a
|
|
503
|
+
* `packages[]` array — entries are either a string source (`npm:@scope/pkg`) or an
|
|
504
|
+
* object carrying that source plus filtering. We substring-match the stringified
|
|
505
|
+
* entry so detection is robust to either shape. This is the file-read probe the pi
|
|
506
|
+
* adapter previously lacked (its descriptor had no `readState`, so the runtime
|
|
507
|
+
* defaulted `pluginInstalled:false` and every re-run reported a fresh INSTALL
|
|
508
|
+
* instead of the SKIPPED/upgrade messaging the other adapters give).
|
|
509
|
+
*/
|
|
510
|
+
export function readPiInstallState({ env = process.env, readJson = readJsonSafe } = {}) {
|
|
511
|
+
const home = env.HOME || homedir();
|
|
512
|
+
const agentDir = nonEmpty(env.PI_CODING_AGENT_DIR) || join(home, ".pi", "agent");
|
|
513
|
+
const settings = readJson(join(agentDir, "settings.json"));
|
|
514
|
+
const pkgs = Array.isArray(settings?.packages) ? settings.packages : [];
|
|
515
|
+
const hasPkg = (needle) =>
|
|
516
|
+
pkgs.some((p) => (typeof p === "string" ? p : JSON.stringify(p)).includes(needle));
|
|
517
|
+
const adapterInstalled = hasPkg("pi-mcp-adapter");
|
|
518
|
+
const pluginInstalled = hasPkg("@chorus-aidlc/chorus-pi");
|
|
519
|
+
return {
|
|
520
|
+
marketplaceRegistered: false, // pi has no marketplace concept
|
|
521
|
+
pluginInstalled: pluginInstalled && adapterInstalled,
|
|
522
|
+
chorusPiInstalled: pluginInstalled,
|
|
523
|
+
adapterInstalled,
|
|
524
|
+
};
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
export function installPi(ctx) {
|
|
528
|
+
const run = ctx.run ?? runCommand;
|
|
529
|
+
const env = ctx.env ?? process.env;
|
|
530
|
+
|
|
531
|
+
// `pi` must be on PATH to run the install. Probe via PATH (NOT `run`) so an
|
|
532
|
+
// absent pi surfaces the manual commands and executes NOTHING — and, because
|
|
533
|
+
// UNSUPPORTED is not a FAILURE_ACTION, never aborts `chorus init`. Injectable
|
|
534
|
+
// for unit tests (mirrors installDsh's pnpm precheck).
|
|
535
|
+
const hasBinary = ctx.binaryOnPath ?? binaryOnPath;
|
|
536
|
+
if (!hasBinary(["pi"], { env })) {
|
|
537
|
+
return out(
|
|
538
|
+
"pi",
|
|
539
|
+
UNSUPPORTED,
|
|
540
|
+
`pi CLI not found on PATH — install the Chorus extension manually once pi is available: ` +
|
|
541
|
+
`\`pi install ${PI_ADAPTER_SPEC} && pi install ${PI_NPM_SPEC}\``,
|
|
542
|
+
);
|
|
543
|
+
}
|
|
544
|
+
|
|
545
|
+
const state = safeState(ctx);
|
|
546
|
+
const bothInstalled = state.chorusPiInstalled && state.adapterInstalled;
|
|
547
|
+
|
|
548
|
+
// Already fully installed → recognize it (parity with codex/kiro's "already
|
|
549
|
+
// installed") and do NOTHING, unless the caller explicitly asked to update.
|
|
550
|
+
if (bothInstalled && !ctx.flags?.updateInstalled) {
|
|
551
|
+
return out(
|
|
552
|
+
"pi",
|
|
553
|
+
SKIPPED,
|
|
554
|
+
`already installed (${PI_ADAPTER_SPEC} + ${PI_NPM_SPEC} in pi settings) — re-run with --update-installed to upgrade`,
|
|
555
|
+
);
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
// Update requested on an existing install → use pi's OWN updater. `pi install`
|
|
559
|
+
// of an already-recorded package only re-writes the settings entry; it does NOT
|
|
560
|
+
// pull the newer published version, so it never clears pi's "Package updates
|
|
561
|
+
// available — Run pi update --extensions" nag. `pi update --extensions` (exactly
|
|
562
|
+
// what that nag tells the user to run) refreshes installed extensions — including
|
|
563
|
+
// chorus-pi + pi-mcp-adapter — to their latest published versions.
|
|
564
|
+
if (bothInstalled) {
|
|
565
|
+
const u = run("pi", ["update", "--extensions"], { env });
|
|
566
|
+
if (!u.ok) return out("pi", FAILED, `pi update --extensions failed: ${errText(u)}`);
|
|
567
|
+
return out("pi", REPAIRED, `updated installed pi extensions to latest via \`pi update --extensions\` (incl. ${PI_NPM_SPEC})`);
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
// Fresh or partial install → install what's needed (pi install is idempotent for
|
|
571
|
+
// any already-present one). The MCP adapter is the tool surface, so install it
|
|
572
|
+
// FIRST; then the chorus-pi package.
|
|
573
|
+
const ra = run("pi", ["install", PI_ADAPTER_SPEC], { env });
|
|
574
|
+
if (!ra.ok) return out("pi", FAILED, `pi install ${PI_ADAPTER_SPEC} failed: ${errText(ra)}`);
|
|
575
|
+
const r = run("pi", ["install", PI_NPM_SPEC], { env });
|
|
576
|
+
if (!r.ok) return out("pi", FAILED, `pi install failed: ${errText(r)}`);
|
|
577
|
+
|
|
578
|
+
// A partial pre-existing install we just completed → REPAIRED; a clean first
|
|
579
|
+
// install → INSTALLED (same distinction the other adapters draw).
|
|
580
|
+
return state.chorusPiInstalled || state.adapterInstalled
|
|
581
|
+
? out("pi", REPAIRED, `reinstalled ${PI_ADAPTER_SPEC} + ${PI_NPM_SPEC} via pi install`)
|
|
582
|
+
: out("pi", INSTALLED, `installed ${PI_ADAPTER_SPEC} + ${PI_NPM_SPEC} via pi install`);
|
|
410
583
|
}
|
|
411
584
|
|
|
412
585
|
// ---------------------------------------------------------------------------
|
|
@@ -457,14 +630,16 @@ export async function installKiro(ctx) {
|
|
|
457
630
|
const chorusUrl = nonEmpty(ctx.flags?.url) ?? nonEmpty(env.CHORUS_URL);
|
|
458
631
|
|
|
459
632
|
const state = safeState(ctx);
|
|
460
|
-
if (state.pluginInstalled
|
|
633
|
+
if (state.pluginInstalled && !ctx.flags?.updateInstalled) {
|
|
634
|
+
return out("kiro", SKIPPED, `already installed (${kiroDir})`);
|
|
635
|
+
}
|
|
461
636
|
|
|
462
637
|
if (!chorusUrl) {
|
|
463
638
|
return out("kiro", FAILED, "no Chorus URL — pass --url or set CHORUS_URL so the .kiro/ template can be downloaded from the connected instance");
|
|
464
639
|
}
|
|
465
640
|
|
|
466
641
|
// Any chorus-* asset already present ⇒ this is a delta repair, not a fresh drop.
|
|
467
|
-
const repairing = !!(state.skillsPresent || state.agentPresent || state.mcpServerPresent);
|
|
642
|
+
const repairing = !!(state.pluginInstalled || state.skillsPresent || state.agentPresent || state.mcpServerPresent);
|
|
468
643
|
try {
|
|
469
644
|
const res = await installFileTemplate({
|
|
470
645
|
chorusUrl,
|
|
@@ -485,9 +660,13 @@ export async function installKiro(ctx) {
|
|
|
485
660
|
}
|
|
486
661
|
|
|
487
662
|
// ---------------------------------------------------------------------------
|
|
488
|
-
// Guided (not automated)
|
|
489
|
-
//
|
|
490
|
-
//
|
|
663
|
+
// Guided (not automated) — the fallback mechanism for an agent that has no
|
|
664
|
+
// verified native install path: surface a precise next step instead of running
|
|
665
|
+
// an unverified command (the "no guessed command" rule). NO agent currently
|
|
666
|
+
// ships as guided — claude / codex / opencode / openclaw / kiro / dsh / pi all
|
|
667
|
+
// have real installers (pi flipped to `installPi` once @chorus-aidlc/chorus-pi
|
|
668
|
+
// shipped to npm). `guided()` is kept as the mechanism for a future agent added
|
|
669
|
+
// before its install command is verified.
|
|
491
670
|
// ---------------------------------------------------------------------------
|
|
492
671
|
export function guided(agentId, detail) {
|
|
493
672
|
// Tag the returned function so adapters.mjs can tell a GUIDED (unsupported)
|
|
@@ -499,10 +678,6 @@ export function guided(agentId, detail) {
|
|
|
499
678
|
return fn;
|
|
500
679
|
}
|
|
501
680
|
|
|
502
|
-
export
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
// `chorus agents add` to install automatically, so the accurate guidance is the real
|
|
506
|
-
// manual command against that source once it's available.
|
|
507
|
-
pi: "Pi installs extensions with `pi install <source>`; Chorus does not yet publish a Pi extension for `chorus agents add` to automate, so install it manually with `pi install <source>` when a Chorus Pi source is available.",
|
|
508
|
-
};
|
|
681
|
+
// No agents are currently guided; kept as the stable export the adapter registry
|
|
682
|
+
// and tests reference. A future not-yet-verified agent adds its message here.
|
|
683
|
+
export const GUIDED_MESSAGES = {};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
// cli/init/pi-mcp-config.mjs
|
|
2
|
+
// Writes the Chorus MCP server block into pi's global MCP config
|
|
3
|
+
// (`~/.pi/agent/mcp.json` by default) so pi's `pi-mcp-adapter` exposes the
|
|
4
|
+
// `chorus_*` tools to the pi agent — the ADAPTER path (chorus.ts never registers
|
|
5
|
+
// tools itself). The Authorization header references the API key by ENV VAR
|
|
6
|
+
// (`Bearer ${CHORUS_API_KEY}`, which pi-mcp-adapter interpolates at connect time),
|
|
7
|
+
// so the `cho_` key lives in exactly ZERO files here — only the env-var reference.
|
|
8
|
+
// The URL is not a secret, so it is written as a resolved literal (an interactive pi
|
|
9
|
+
// then needs only CHORUS_API_KEY in its shell, not CHORUS_URL).
|
|
10
|
+
//
|
|
11
|
+
// This is the pi analogue of cli/init/codex-mcp-config.mjs (Codex's keyless
|
|
12
|
+
// `[mcp_servers.chorus] bearer_token_env_var`) and the CC plugin `.mcp.json`
|
|
13
|
+
// (`Authorization: Bearer ${CHORUS_URL}`-style ${VAR} interpolation). `pi install`
|
|
14
|
+
// does NOT write an mcp.json for us, so `chorus agents add` writes it here (from the
|
|
15
|
+
// credential-seed step, which already holds the resolved URL).
|
|
16
|
+
//
|
|
17
|
+
// CONFIG CONTRACT (VERIFIED against pi-mcp-adapter 2.32.1 npm readme, repo
|
|
18
|
+
// github.com/nicobailon/pi-mcp-adapter):
|
|
19
|
+
// - The adapter discovers a Pi GLOBAL override at `<Pi agent dir>/mcp.json`
|
|
20
|
+
// (`~/.pi/agent/mcp.json` by default, or `$PI_CODING_AGENT_DIR/mcp.json` when set)
|
|
21
|
+
// — the same file `pi-mcp-adapter init` writes to by default, and higher precedence
|
|
22
|
+
// than the tool-agnostic `~/.config/mcp/mcp.json`.
|
|
23
|
+
// - An `mcpServers.<name>` entry supports `type:"http"`, a `url` (raw `${VAR}` /
|
|
24
|
+
// `$env:VAR` interpolation) and `headers` (also `${VAR}` / `$env:VAR`
|
|
25
|
+
// interpolation). We use `headers.Authorization = "Bearer ${CHORUS_API_KEY}"` —
|
|
26
|
+
// the cleanest keyless form, and a one-token change from the literal-Bearer shape
|
|
27
|
+
// CONNECT_PI.md previously documented.
|
|
28
|
+
//
|
|
29
|
+
// Standard JSON merge (mcp.json is JSON, unlike Codex's TOML): every other top-level
|
|
30
|
+
// field and every OTHER `mcpServers.<name>` entry is preserved verbatim; only
|
|
31
|
+
// `mcpServers.chorus` is upserted. Any legacy literal `bearerToken` on the chorus
|
|
32
|
+
// entry is dropped and a literal `headers.Authorization` is replaced by the env-ref,
|
|
33
|
+
// so a re-run MIGRATES an old literal key off disk. Atomic 0600 temp+rename;
|
|
34
|
+
// idempotent (a re-run with the same url reproduces the file). IO is injectable for
|
|
35
|
+
// tests. The API key is NEVER written — only the env-var reference.
|
|
36
|
+
|
|
37
|
+
import { mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
|
|
38
|
+
import { homedir } from "node:os";
|
|
39
|
+
import { dirname, join } from "node:path";
|
|
40
|
+
|
|
41
|
+
const API_KEY_ENV = "CHORUS_API_KEY";
|
|
42
|
+
// A normal (non-template) string: `${CHORUS_API_KEY}` is emitted verbatim into the
|
|
43
|
+
// JSON for pi-mcp-adapter to interpolate at connect time — no literal key on disk.
|
|
44
|
+
const AUTHORIZATION_ENV_REF = "Bearer ${" + API_KEY_ENV + "}";
|
|
45
|
+
|
|
46
|
+
/** A non-empty trimmed string, or undefined. */
|
|
47
|
+
function nonEmpty(value) {
|
|
48
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Resolve the pi GLOBAL MCP config path. Honors `PI_CODING_AGENT_DIR` (pi-mcp-adapter's
|
|
53
|
+
* own override of the Pi agent dir), then `HOME` (so tests can inject a temp home), else
|
|
54
|
+
* the OS home dir — ending in `mcp.json`. VERIFIED default `~/.pi/agent/mcp.json`.
|
|
55
|
+
* @param {Record<string, string | undefined>} env
|
|
56
|
+
*/
|
|
57
|
+
export function resolvePiMcpConfigPath(env) {
|
|
58
|
+
const base = nonEmpty(env.PI_CODING_AGENT_DIR) ?? join(nonEmpty(env.HOME) ?? homedir(), ".pi", "agent");
|
|
59
|
+
return join(base, "mcp.json");
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Normalize a Chorus base URL to the MCP endpoint the same way the Codex writer
|
|
64
|
+
* (codex-mcp-config.mjs) and the hook wrapper do: a URL that already has a path segment
|
|
65
|
+
* beyond the host is used as-is; a bare host gains `/api/mcp`. Returns undefined for an
|
|
66
|
+
* empty URL.
|
|
67
|
+
* @param {string | undefined} rawUrl
|
|
68
|
+
*/
|
|
69
|
+
export function piMcpUrl(rawUrl) {
|
|
70
|
+
const u = nonEmpty(rawUrl);
|
|
71
|
+
if (!u) return undefined;
|
|
72
|
+
const trimmed = u.replace(/\/+$/, "");
|
|
73
|
+
const m = trimmed.match(/^https?:\/\/[^/]+(\/.*)?$/);
|
|
74
|
+
if (m && m[1] && m[1].length > 0) return trimmed; // already a full endpoint
|
|
75
|
+
return `${trimmed}/api/mcp`;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** True for a plain (non-array) object. */
|
|
79
|
+
function isPlainObject(v) {
|
|
80
|
+
return !!v && typeof v === "object" && !Array.isArray(v);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* Upsert `mcpServers.chorus` in pi's global mcp.json to
|
|
85
|
+
* { "type": "http", "url": "<mcp-endpoint>", "headers": { "Authorization": "Bearer ${CHORUS_API_KEY}" } }
|
|
86
|
+
* MERGE-SAFE: every other top-level field and every OTHER `mcpServers.<name>` entry is
|
|
87
|
+
* preserved verbatim; on the chorus entry itself every other key (e.g. `toolPrefix`,
|
|
88
|
+
* `includeTools`) is preserved, only `type`/`url`/`headers.Authorization` are set. A legacy
|
|
89
|
+
* literal `bearerToken` on the chorus entry is DROPPED and any literal `headers.Authorization`
|
|
90
|
+
* is replaced by the env-ref — migrating an old literal key off disk.
|
|
91
|
+
*
|
|
92
|
+
* Missing file → start from `{}`. An existing UNPARSEABLE file, a non-object root, or a
|
|
93
|
+
* present-but-non-object `mcpServers` → THROW (never clobber a file we cannot safely merge;
|
|
94
|
+
* the caller treats a throw as a write failure). Atomic 0600 temp+rename; idempotent (a re-run
|
|
95
|
+
* with the same url reproduces the file). The API key is NEVER written — only the env-var
|
|
96
|
+
* reference `${CHORUS_API_KEY}`.
|
|
97
|
+
* @param {{ configPath: string, url: string }} args
|
|
98
|
+
* @param {{
|
|
99
|
+
* read?: (p: string) => string,
|
|
100
|
+
* write?: (p: string, c: string, o: object) => void,
|
|
101
|
+
* mkdir?: (p: string, o: object) => void,
|
|
102
|
+
* rename?: (from: string, to: string) => void,
|
|
103
|
+
* }} [deps]
|
|
104
|
+
* @returns {string} the mcp.json path written
|
|
105
|
+
*/
|
|
106
|
+
export function writePiMcpServer({ configPath, url }, deps = {}) {
|
|
107
|
+
const read = deps.read ?? ((p) => readFileSync(p, "utf8"));
|
|
108
|
+
const write = deps.write ?? writeFileSync;
|
|
109
|
+
const mkdir = deps.mkdir ?? mkdirSync;
|
|
110
|
+
const rename = deps.rename ?? renameSync;
|
|
111
|
+
|
|
112
|
+
const mcpUrl = piMcpUrl(url);
|
|
113
|
+
if (!mcpUrl) throw new Error("writePiMcpServer requires a url");
|
|
114
|
+
|
|
115
|
+
let raw;
|
|
116
|
+
try {
|
|
117
|
+
raw = read(configPath);
|
|
118
|
+
} catch {
|
|
119
|
+
raw = undefined; // no file yet — start fresh
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
let parsed = {};
|
|
123
|
+
if (typeof raw === "string" && raw.trim()) {
|
|
124
|
+
try {
|
|
125
|
+
parsed = JSON.parse(raw);
|
|
126
|
+
} catch (err) {
|
|
127
|
+
throw new Error(`existing ${configPath} is not valid JSON (${err?.message ?? err}) — refusing to overwrite`);
|
|
128
|
+
}
|
|
129
|
+
if (!isPlainObject(parsed)) {
|
|
130
|
+
throw new Error(`existing ${configPath} is not a JSON object — refusing to overwrite`);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// Preserve an existing `mcpServers` object (and every server in it); a present-but-non-object
|
|
135
|
+
// `mcpServers` is unsafe to merge.
|
|
136
|
+
let servers = parsed.mcpServers;
|
|
137
|
+
if (servers === undefined || servers === null) {
|
|
138
|
+
servers = {};
|
|
139
|
+
} else if (!isPlainObject(servers)) {
|
|
140
|
+
throw new Error(`existing ${configPath} has a non-object "mcpServers" block — refusing to overwrite`);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Preserve every OTHER key on the chorus entry (e.g. toolPrefix / includeTools), and every
|
|
144
|
+
// OTHER header, but drop the legacy literal `bearerToken` (a secret) and overwrite
|
|
145
|
+
// Authorization with the keyless env-ref.
|
|
146
|
+
const existingChorus = isPlainObject(servers.chorus) ? servers.chorus : {};
|
|
147
|
+
const existingHeaders = isPlainObject(existingChorus.headers) ? existingChorus.headers : {};
|
|
148
|
+
const chorusRest = { ...existingChorus };
|
|
149
|
+
delete chorusRest.bearerToken; // drop any legacy literal token (a secret) — we use the env-ref header
|
|
150
|
+
|
|
151
|
+
servers.chorus = {
|
|
152
|
+
...chorusRest,
|
|
153
|
+
type: "http",
|
|
154
|
+
url: mcpUrl,
|
|
155
|
+
headers: { ...existingHeaders, Authorization: AUTHORIZATION_ENV_REF },
|
|
156
|
+
};
|
|
157
|
+
parsed.mcpServers = servers;
|
|
158
|
+
|
|
159
|
+
const content = `${JSON.stringify(parsed, null, 2)}\n`;
|
|
160
|
+
|
|
161
|
+
mkdir(dirname(configPath), { recursive: true });
|
|
162
|
+
const tmp = `${configPath}.tmp`;
|
|
163
|
+
write(tmp, content, { mode: 0o600 });
|
|
164
|
+
rename(tmp, configPath);
|
|
165
|
+
return configPath;
|
|
166
|
+
}
|