@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
|
@@ -53,6 +53,7 @@ import {
|
|
|
53
53
|
import { resolveInstallCwds as defaultResolveInstallCwds } from "../../daemon-install-config.mjs";
|
|
54
54
|
import { validateAndFetchIdentity } from "../../chorus-client.mjs";
|
|
55
55
|
import { agentTypeForSelection, isWakeableAgentType } from "../agent-type-map.mjs";
|
|
56
|
+
import { writePiMcpServer, resolvePiMcpConfigPath } from "../pi-mcp-config.mjs";
|
|
56
57
|
|
|
57
58
|
const STEP_ID = "credential-seed";
|
|
58
59
|
const { SEEDED, SKIPPED, FAILED } = OUTCOME_ACTIONS;
|
|
@@ -421,6 +422,23 @@ export function readCodexEnvProfile(envPath, deps = {}) {
|
|
|
421
422
|
}
|
|
422
423
|
}
|
|
423
424
|
|
|
425
|
+
/**
|
|
426
|
+
* Whether an init selection id is Pi (`pi`). Pi's Chorus MCP access is via the ADAPTER
|
|
427
|
+
* path (`pi-mcp-adapter` reads an mcp.json — chorus.ts never registers tools itself), so
|
|
428
|
+
* — like Codex's `[mcp_servers.chorus]` — `chorus agents add` writes pi's global
|
|
429
|
+
* `~/.pi/agent/mcp.json` with an `mcpServers.chorus` entry whose Authorization references
|
|
430
|
+
* the API key by ENV VAR (`Bearer ${CHORUS_API_KEY}`), NO literal key on disk. Unlike dsh /
|
|
431
|
+
* Claude Code / Codex, pi has NO settings env-file to persist the key + profile into, so this
|
|
432
|
+
* write does NOT suppress the CHORUS_AGENT_PROFILE export hint: interactive pi still needs
|
|
433
|
+
* CHORUS_API_KEY (+ CHORUS_AGENT_PROFILE) exported in its shell. We gate on the selection id,
|
|
434
|
+
* NOT the mapped daemon agentType (`pi` → the shared "offline" type, so it can't single pi
|
|
435
|
+
* out). Mirrors {@link isDshSelection} / {@link isClaudeSelection} / {@link isCodexSelection}.
|
|
436
|
+
* @param {string} id
|
|
437
|
+
*/
|
|
438
|
+
function isPiSelection(id) {
|
|
439
|
+
return id === "pi";
|
|
440
|
+
}
|
|
441
|
+
|
|
424
442
|
/**
|
|
425
443
|
* @param {import("../contracts.mjs").StepContext & {
|
|
426
444
|
* validateCredentials?: Function, appendAgent?: Function, writeLogin?: Function,
|
|
@@ -442,6 +460,7 @@ export async function seedCredentials(ctx) {
|
|
|
442
460
|
const readSettingsProfile = ctx.readClaudeSettingsProfile ?? readClaudeSettingsProfile;
|
|
443
461
|
const writeCodexEnv = ctx.writeCodexEnv ?? writeCodexEnvFile;
|
|
444
462
|
const readCodexProfile = ctx.readCodexEnvProfile ?? readCodexEnvProfile;
|
|
463
|
+
const writePiMcp = ctx.writePiMcp ?? writePiMcpServer;
|
|
445
464
|
|
|
446
465
|
const selection = Array.isArray(ctx.selection) ? ctx.selection.filter((id) => nonEmpty(id)) : [];
|
|
447
466
|
if (selection.length === 0) {
|
|
@@ -708,13 +727,47 @@ export async function seedCredentials(ctx) {
|
|
|
708
727
|
}
|
|
709
728
|
}
|
|
710
729
|
|
|
711
|
-
//
|
|
712
|
-
//
|
|
713
|
-
|
|
730
|
+
// pi-only: ALSO write pi's global ~/.pi/agent/mcp.json so `pi-mcp-adapter` exposes the
|
|
731
|
+
// chorus_* tools to the pi agent (the ADAPTER path — chorus.ts never registers tools). The
|
|
732
|
+
// Authorization header references the key by env var (`Bearer ${CHORUS_API_KEY}`), so NO
|
|
733
|
+
// literal cho_ key is written — the pi analogue of Codex's keyless [mcp_servers.chorus]
|
|
734
|
+
// bearer_token_env_var and CC's plugin .mcp.json ${VAR} interpolation. The URL is not a
|
|
735
|
+
// secret, so it is a resolved literal. UNGATED by daemon.json dedup (an idempotent re-run
|
|
736
|
+
// still repairs a missing/stale mcp.json). Unlike dsh/claude/codex this write does NOT
|
|
737
|
+
// suppress the CHORUS_AGENT_PROFILE export hint: pi has NO settings env-file to persist the
|
|
738
|
+
// key + profile into, so interactive pi still needs CHORUS_API_KEY (+ CHORUS_AGENT_PROFILE)
|
|
739
|
+
// in its shell — the daemon spawner injects them for the wake path. `piMcpWritten` is
|
|
740
|
+
// reported for observability only; it is intentionally NOT in the hint-suppression set.
|
|
741
|
+
let piNote = "";
|
|
742
|
+
let piMcpWritten = false;
|
|
743
|
+
if (isPiSelection(id)) {
|
|
744
|
+
const configPath = resolvePiMcpConfigPath(env);
|
|
745
|
+
try {
|
|
746
|
+
const p = writePiMcp({ configPath, url });
|
|
747
|
+
piMcpWritten = true;
|
|
748
|
+
piNote =
|
|
749
|
+
`; wrote mcpServers.chorus (Authorization: Bearer \${CHORUS_API_KEY}) into ${p} (0600) — ` +
|
|
750
|
+
"pi-mcp-adapter exposes the chorus_* tools with the cho_ key env-sourced (no literal key on " +
|
|
751
|
+
"disk). Interactive pi still needs CHORUS_API_KEY (+ CHORUS_AGENT_PROFILE) exported in its " +
|
|
752
|
+
"shell; the daemon injects them for the wake path. Your cho_ key is not shown here.";
|
|
753
|
+
} catch (err) {
|
|
754
|
+
piNote =
|
|
755
|
+
`; WARNING: could not write ${configPath} (${err?.message ?? String(err)}). ` +
|
|
756
|
+
"pi will not reach Chorus MCP until an mcpServers.chorus entry with an env-referenced " +
|
|
757
|
+
`Authorization (Bearer \${CHORUS_API_KEY}) exists — add it to ${configPath}. ` +
|
|
758
|
+
"Your cho_ key is not shown here.";
|
|
759
|
+
}
|
|
760
|
+
}
|
|
761
|
+
|
|
762
|
+
// Combined side-file note + hint-suppression flags (dsh, claude, codex, and pi are mutually
|
|
763
|
+
// exclusive selection ids, so at most one note is set per iteration). piMcpWritten is carried
|
|
764
|
+
// for observability but is NOT a hint-suppression flag (see the pi branch above).
|
|
765
|
+
const sideNote = `${dshNote}${claudeNote}${codexNote}${piNote}`;
|
|
714
766
|
const hintFlags = {
|
|
715
767
|
...(profileInEnv ? { profileInEnv: true } : {}),
|
|
716
768
|
...(settingsEnvWritten ? { settingsEnvWritten: true } : {}),
|
|
717
769
|
...(codexEnvWritten ? { codexEnvWritten: true } : {}),
|
|
770
|
+
...(piMcpWritten ? { piMcpWritten: true } : {}),
|
|
718
771
|
};
|
|
719
772
|
|
|
720
773
|
if (!res.ok) {
|
package/cli/init-args.mjs
CHANGED
|
@@ -113,7 +113,8 @@ OPTIONS
|
|
|
113
113
|
auto-start is unsupported (e.g. Windows). In an
|
|
114
114
|
interactive TTY run the daemon-setup step prompts instead
|
|
115
115
|
(default: No).
|
|
116
|
-
-y, --yes
|
|
116
|
+
-y, --yes Accept confirmation prompts, including refreshing
|
|
117
|
+
installed plugins to latest (implied when non-TTY).
|
|
117
118
|
-h, --help Show this help message.
|
|
118
119
|
|
|
119
120
|
NON-INTERACTIVE
|
|
@@ -121,6 +122,8 @@ NON-INTERACTIVE
|
|
|
121
122
|
will not guess which agents to configure and aborts otherwise. The daemon boot service is
|
|
122
123
|
installed non-interactively ONLY when you pass --daemon-autostart; otherwise the
|
|
123
124
|
daemon config is written and you start it yourself with 'chorus daemon'.
|
|
125
|
+
With an explicit selection, --yes and non-TTY runs refresh selected installed
|
|
126
|
+
plugins to their latest available versions without prompting.
|
|
124
127
|
|
|
125
128
|
SCOPE
|
|
126
129
|
This installs the plugin SURFACE, seeds credentials into the daemon config, and
|
package/cli/init.mjs
CHANGED
|
@@ -97,11 +97,26 @@ export async function runInit(argv = [], deps = {}) {
|
|
|
97
97
|
|
|
98
98
|
io.log(`[chorus agents add] Configuring: ${selectedIds.join(", ")}`);
|
|
99
99
|
|
|
100
|
+
// Resolve adapters once: update-intent detection and per-agent steps must see
|
|
101
|
+
// the same adapter instances/state readers.
|
|
102
|
+
const adapters = new Map();
|
|
103
|
+
for (const agentId of selectedIds) {
|
|
104
|
+
adapters.set(agentId, await getAdapter(agentId));
|
|
105
|
+
}
|
|
106
|
+
const updateInstalled = await resolveUpdateInstalled({
|
|
107
|
+
selectedIds,
|
|
108
|
+
adapters,
|
|
109
|
+
flags,
|
|
110
|
+
env,
|
|
111
|
+
io,
|
|
112
|
+
});
|
|
113
|
+
const resolvedFlags = { ...flags, updateInstalled };
|
|
114
|
+
|
|
100
115
|
const steps = await orderedSteps();
|
|
101
116
|
// `ctxExtras` lets a caller/test inject step-context collaborators (e.g. a
|
|
102
117
|
// fake credential validator or command runner) so an end-to-end run is
|
|
103
118
|
// hermetic; production passes none and steps use their real defaults.
|
|
104
|
-
const baseCtx = { selection: selectedIds, flags, io, env, backup, ...(deps.ctxExtras ?? {}) };
|
|
119
|
+
const baseCtx = { selection: selectedIds, flags: resolvedFlags, io, env, backup, ...(deps.ctxExtras ?? {}) };
|
|
105
120
|
/** @type {import("./init/contracts.mjs").StepOutcome[]} */
|
|
106
121
|
const outcomes = [];
|
|
107
122
|
|
|
@@ -109,7 +124,7 @@ export async function runInit(argv = [], deps = {}) {
|
|
|
109
124
|
try {
|
|
110
125
|
if (step.scope === STEP_SCOPES.PER_AGENT) {
|
|
111
126
|
for (const agentId of selectedIds) {
|
|
112
|
-
const adapter =
|
|
127
|
+
const adapter = adapters.get(agentId);
|
|
113
128
|
outcomes.push(await step.run({ ...baseCtx, agentId, adapter }));
|
|
114
129
|
}
|
|
115
130
|
} else {
|
|
@@ -129,6 +144,36 @@ export async function runInit(argv = [], deps = {}) {
|
|
|
129
144
|
return outcomes.flat().some(isFailureOutcome) ? 1 : 0;
|
|
130
145
|
}
|
|
131
146
|
|
|
147
|
+
/**
|
|
148
|
+
* Resolve one installed-plugin update decision for the whole invocation.
|
|
149
|
+
* Unsupported/guided adapters and selected adapters without an installed
|
|
150
|
+
* Chorus payload do not trigger the question. `--yes` and non-TTY runs accept
|
|
151
|
+
* automatically; an interactive answer defaults to no.
|
|
152
|
+
*/
|
|
153
|
+
export async function resolveUpdateInstalled({ selectedIds, adapters, flags, env, io }) {
|
|
154
|
+
let anyInstalled = false;
|
|
155
|
+
for (const agentId of selectedIds) {
|
|
156
|
+
const adapter = adapters.get(agentId);
|
|
157
|
+
if (!adapter || typeof adapter.readInstallState !== "function") continue;
|
|
158
|
+
try {
|
|
159
|
+
const profile = flags.dshProfile ?? env.CHORUS_DSH_PROFILE;
|
|
160
|
+
const state = await adapter.readInstallState({ env, profile });
|
|
161
|
+
if (state?.supported === true && state?.pluginInstalled === true) {
|
|
162
|
+
anyInstalled = true;
|
|
163
|
+
break;
|
|
164
|
+
}
|
|
165
|
+
} catch {
|
|
166
|
+
// State probes are advisory and read-only. A broken probe must not block
|
|
167
|
+
// normal repair/install work; the installer will report its own outcome.
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
if (!anyInstalled) return false;
|
|
171
|
+
if (flags.yes || !io.isTTY) return true;
|
|
172
|
+
if (typeof io.ask !== "function") return false;
|
|
173
|
+
const answer = String(await io.ask("Update installed Chorus plugins to the latest available versions? [y/N] ")).trim();
|
|
174
|
+
return /^(?:y|yes)$/i.test(answer);
|
|
175
|
+
}
|
|
176
|
+
|
|
132
177
|
/** Print the per-outcome summary table. */
|
|
133
178
|
export function summarize(outcomes, io, selectedIds = []) {
|
|
134
179
|
io.log("");
|
package/cli/kiro-spawner.mjs
CHANGED
|
@@ -222,6 +222,7 @@ export function pickNewSessionId(before, after) {
|
|
|
222
222
|
export class KiroSpawner {
|
|
223
223
|
/** @param {KiroSpawnerOptions} [opts] */
|
|
224
224
|
constructor(opts = {}) {
|
|
225
|
+
this.sessionDecision = { probeIsAuthoritative: false };
|
|
225
226
|
this.kiroPath = opts.kiroPath ?? null;
|
|
226
227
|
this.spawnImpl = opts.spawnImpl ?? spawn;
|
|
227
228
|
this.logger = opts.logger ?? NOOP_LOGGER;
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
// cli/pi-spawner.mjs
|
|
2
|
+
// Cross-platform headless pi spawner — the `pi` counterpart to ClaudeSpawner /
|
|
3
|
+
// CodexSpawner, satisfying the SAME backend-agnostic Spawner.wake(...) contract so
|
|
4
|
+
// the daemon's wake pipeline (queue, waker, directed delivery, headless guard,
|
|
5
|
+
// reporters) stays backend-neutral and drives whichever spawner is injected purely
|
|
6
|
+
// through the shared wake(...) contract.
|
|
7
|
+
//
|
|
8
|
+
// Verified against the pi source (earendil-works/pi, packages/coding-agent) before
|
|
9
|
+
// coding — NOT guessed:
|
|
10
|
+
// • `pi --mode json -p` runs headless and emits a JSONL event stream on stdout
|
|
11
|
+
// (one JSON object per line): the session header first, then AgentSessionEvents
|
|
12
|
+
// (`message_start` / `message_update` / `message_end` / `tool_execution_*` /
|
|
13
|
+
// `turn_end` / `agent_end`). Verified against src/modes/print-mode.ts +
|
|
14
|
+
// src/modes/json-event.ts + docs/json.md.
|
|
15
|
+
// • The prompt is read from PIPED STDIN (never argv): main.ts `readPipedStdin()`
|
|
16
|
+
// folds stdin into the initial message when stdin is not a TTY. We pipe the
|
|
17
|
+
// prompt and close stdin, exactly like the Claude/Codex spawners.
|
|
18
|
+
// • SESSION MODEL — client-owned id (like Claude, unlike Codex). pi accepts a
|
|
19
|
+
// caller-provided `--session-id <id>` which is IDEMPOTENT create-or-resume:
|
|
20
|
+
// main.ts createSessionManager() resumes the existing session when one with
|
|
21
|
+
// that exact id already exists in the cwd-scoped session dir, otherwise creates
|
|
22
|
+
// a fresh session WITH that id. (`--session <id>` is the resume-ONLY flag — it
|
|
23
|
+
// hard-errors when the session is absent — so it is the wrong choice for a wake
|
|
24
|
+
// that must create-if-missing.) So we pass `--session-id <anchor>` for BOTH the
|
|
25
|
+
// first wake and every resume; pi owns the new-vs-resume decision from its own
|
|
26
|
+
// on-disk state. No persisted anchor→id map is needed (that is only for Codex,
|
|
27
|
+
// which generates its own id). We NEVER pass `--no-session` (that flag is for
|
|
28
|
+
// ephemeral subagent children only).
|
|
29
|
+
// • pi has NO permission system (no sandbox / no tool-approval prompt in headless
|
|
30
|
+
// mode), so `permissionMode` is a NO-OP: we emit no sandbox / skip-permissions
|
|
31
|
+
// flag. `chorus` and `yolo` modes run identically.
|
|
32
|
+
// • pi has no native MCP: a woken pi reaches Chorus tools only via the chorus-pi
|
|
33
|
+
// extension / pi-mcp-adapter installed in the woken environment. This spawner
|
|
34
|
+
// does not inject MCP; it exports the daemon's creds into the child env, which
|
|
35
|
+
// the extension consumes (CHORUS_URL / CHORUS_API_KEY / CHORUS_AGENT_PROFILE).
|
|
36
|
+
//
|
|
37
|
+
// Reuses claude-spawner's platform-neutral NDJSON parser (parseNdjsonChunk) and the
|
|
38
|
+
// PATH-walk / .cmd-shim shape of the other spawners' path resolution.
|
|
39
|
+
|
|
40
|
+
import { spawn } from "node:child_process";
|
|
41
|
+
import { statSync } from "node:fs";
|
|
42
|
+
import { win32 as pathWin32, posix as pathPosix } from "node:path";
|
|
43
|
+
import { parseNdjsonChunk } from "./claude-spawner.mjs";
|
|
44
|
+
|
|
45
|
+
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Build the argv for a headless pi run. The prompt is NEVER here — it goes over
|
|
49
|
+
* stdin (`pi -p` folds piped stdin into the initial message).
|
|
50
|
+
*
|
|
51
|
+
* `--session-id <anchor>` is pi's idempotent create-or-resume flag (verified against
|
|
52
|
+
* pi main.ts createSessionManager): it resumes the session with that exact id if one
|
|
53
|
+
* exists in the cwd-scoped dir, else creates a new session with that id — so the SAME
|
|
54
|
+
* args serve both the first wake and every resume, and pi owns the decision. `-p` is
|
|
55
|
+
* placed LAST so pi's arg parser can never mistake a following token for a message
|
|
56
|
+
* positional (its `-p` handler slurps the next bare, non-flag arg as a message).
|
|
57
|
+
*
|
|
58
|
+
* @param {{ sessionId: string }} o
|
|
59
|
+
* @returns {string[]}
|
|
60
|
+
*/
|
|
61
|
+
export function buildPiArgs({ sessionId }) {
|
|
62
|
+
return ["--mode", "json", "--session-id", sessionId, "-p"];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Resolve the real `pi` executable WITHOUT a shell — same approach as
|
|
67
|
+
* resolveClaudePath / resolveCodexPath. On Windows the bin may be `pi.cmd` (npm
|
|
68
|
+
* shim), which `spawn` can't exec directly without shell:true; we walk PATH for the
|
|
69
|
+
* platform candidates. `CHORUS_PI_PATH` overrides.
|
|
70
|
+
* @param {{ env?: NodeJS.ProcessEnv, platform?: NodeJS.Platform, isFile?: (p: string) => boolean }} [deps]
|
|
71
|
+
* @returns {string | null}
|
|
72
|
+
*/
|
|
73
|
+
export function resolvePiPath(deps = {}) {
|
|
74
|
+
const env = deps.env ?? process.env;
|
|
75
|
+
const platform = deps.platform ?? process.platform;
|
|
76
|
+
const isFile =
|
|
77
|
+
deps.isFile ??
|
|
78
|
+
((p) => {
|
|
79
|
+
try {
|
|
80
|
+
return statSync(p).isFile();
|
|
81
|
+
} catch {
|
|
82
|
+
return false;
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
if (env.CHORUS_PI_PATH && isFile(env.CHORUS_PI_PATH)) {
|
|
87
|
+
return env.CHORUS_PI_PATH;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
const isWin = platform === "win32";
|
|
91
|
+
const p = isWin ? pathWin32 : pathPosix;
|
|
92
|
+
const names = isWin ? ["pi.cmd", "pi.exe", "pi"] : ["pi"];
|
|
93
|
+
const pathVar = env.PATH || env.Path || "";
|
|
94
|
+
const dirs = pathVar.split(p.delimiter).filter(Boolean);
|
|
95
|
+
for (const dir of dirs) {
|
|
96
|
+
for (const name of names) {
|
|
97
|
+
const candidate = p.join(dir, name);
|
|
98
|
+
if (isFile(candidate)) return candidate;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* Resolve the actual command + argv to spawn. On Windows a `.cmd`/`.bat` shim is
|
|
106
|
+
* not a PE executable, so it must run via `cmd.exe /d /s /c <path> ...args`; we keep
|
|
107
|
+
* shell:false and pass argv as an array (no shell word-splitting/injection).
|
|
108
|
+
* @param {string} piPath @param {string[]} args
|
|
109
|
+
* @param {NodeJS.Platform} [platform] @param {NodeJS.ProcessEnv} [env]
|
|
110
|
+
* @returns {{ command: string, argv: string[] }}
|
|
111
|
+
*/
|
|
112
|
+
export function resolveSpawnCommand(piPath, args, platform = process.platform, env = process.env) {
|
|
113
|
+
const isWin = platform === "win32";
|
|
114
|
+
const lower = piPath.toLowerCase();
|
|
115
|
+
if (isWin && (lower.endsWith(".cmd") || lower.endsWith(".bat"))) {
|
|
116
|
+
const comspec = env.ComSpec || env.COMSPEC || "cmd.exe";
|
|
117
|
+
return { command: comspec, argv: ["/d", "/s", "/c", piPath, ...args] };
|
|
118
|
+
}
|
|
119
|
+
return { command: piPath, argv: args };
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* @typedef {Object} PiSpawnerOptions
|
|
124
|
+
* @property {string} [piPath] Resolved pi path (resolved lazily if omitted).
|
|
125
|
+
* @property {(o: object) => any} [spawnImpl] Injectable spawn (tests).
|
|
126
|
+
* @property {{info(m:string):void,warn(m:string):void,error(m:string):void}} [logger]
|
|
127
|
+
* @property {"chorus"|"yolo"} [permissionMode] Accepted for a uniform selectSpawner
|
|
128
|
+
* call, but a NO-OP: pi has no permission system, so no flag is emitted either way.
|
|
129
|
+
* @property {{ url: string, apiKey: string, agentUuid?: string, agentName?: string }} [creds]
|
|
130
|
+
* Daemon creds exported into the child env for the chorus-pi extension's MCP-over-HTTP
|
|
131
|
+
* tooling and SessionStart bookkeeping.
|
|
132
|
+
* @property {NodeJS.Platform} [platform] Injectable for tests; gates POSIX `detached`.
|
|
133
|
+
* @property {(deps?: object) => (string|null)} [resolvePiPathFn] Injectable resolver.
|
|
134
|
+
*/
|
|
135
|
+
|
|
136
|
+
export class PiSpawner {
|
|
137
|
+
/** @param {PiSpawnerOptions} [opts] */
|
|
138
|
+
constructor(opts = {}) {
|
|
139
|
+
// pi manages new-vs-resume internally from its own on-disk session state (the
|
|
140
|
+
// `--session-id` anchor is idempotent create-or-resume), so the daemon's shared
|
|
141
|
+
// Claude transcript probe is NOT authoritative for pi. Setting this false makes
|
|
142
|
+
// the waker skip the Claude-specific "take over with `claude --resume`" log line
|
|
143
|
+
// (mirrors CodexSpawner) — pi is not resumable via `claude --resume`.
|
|
144
|
+
this.sessionDecision = { probeIsAuthoritative: false };
|
|
145
|
+
this.piPath = opts.piPath ?? null;
|
|
146
|
+
this.spawnImpl = opts.spawnImpl ?? spawn;
|
|
147
|
+
this.logger = opts.logger ?? NOOP_LOGGER;
|
|
148
|
+
// Stored for a uniform construction shape, but never consulted when building
|
|
149
|
+
// args — pi has no permission surface, so no sandbox / skip-permissions flag.
|
|
150
|
+
this.permissionMode = opts.permissionMode ?? "chorus";
|
|
151
|
+
this.creds = opts.creds ?? null;
|
|
152
|
+
this.platform = opts.platform ?? process.platform;
|
|
153
|
+
this.resolvePiPathFn = opts.resolvePiPathFn ?? resolvePiPath;
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Spawn a headless pi run. Resolves when the subprocess exits. The prompt is
|
|
158
|
+
* written to stdin (never argv). `sessionId` is the Chorus anchor (direct idea
|
|
159
|
+
* uuid, or the entity uuid for an ad-hoc session) and is passed straight through as
|
|
160
|
+
* pi's client-owned `--session-id`, which pi resolves as create-or-resume from its
|
|
161
|
+
* own on-disk session dir — so the passed `isNew` (derived by the waker's
|
|
162
|
+
* Claude-specific transcript probe, which never matches a pi session) does NOT
|
|
163
|
+
* drive the flag; it is only echoed back for the waker's log line.
|
|
164
|
+
*
|
|
165
|
+
* @param {{ prompt: string, sessionId: string|null, isNew?: boolean, cwd?: string,
|
|
166
|
+
* onMessage?: (obj: any) => void,
|
|
167
|
+
* onChild?: (child: import("node:child_process").ChildProcess) => void }} params
|
|
168
|
+
* @returns {Promise<{ sessionId: string, backendSessionId: string|null, exitCode: number|null, isNew: boolean }>}
|
|
169
|
+
* `backendSessionId` is the resumable anchor (the input `sessionId`) after a spawn,
|
|
170
|
+
* so the conversation UI can offer a resumable id — mirrors the other spawners.
|
|
171
|
+
* `null` on the pre-spawn failure paths (no run started, nothing to resume).
|
|
172
|
+
*/
|
|
173
|
+
async wake({ prompt, sessionId, isNew, cwd, onMessage, onChild }) {
|
|
174
|
+
const anchor = typeof sessionId === "string" ? sessionId : "";
|
|
175
|
+
const isNewFlag = Boolean(isNew);
|
|
176
|
+
|
|
177
|
+
const piPath = this.piPath ?? this.resolvePiPathFn();
|
|
178
|
+
if (!piPath) {
|
|
179
|
+
// No crash — surface visibly and resolve with a failure result (matches the
|
|
180
|
+
// other spawners' "skipping wake" convention: exitCode null, no throw).
|
|
181
|
+
this.logger.error("[Chorus] cannot locate the `pi` executable on PATH; skipping wake");
|
|
182
|
+
return { sessionId: anchor, backendSessionId: null, exitCode: null, isNew: isNewFlag };
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const args = buildPiArgs({ sessionId: anchor });
|
|
186
|
+
const { command, argv } = resolveSpawnCommand(piPath, args, this.platform);
|
|
187
|
+
|
|
188
|
+
// POSIX: detached process group so the interrupt path can group-kill the tree
|
|
189
|
+
// (pi may fork child shells / subagents). Windows uses taskkill /T. stdio stays
|
|
190
|
+
// piped — prompt over stdin + NDJSON stdout parse are unaffected.
|
|
191
|
+
const detached = this.platform !== "win32";
|
|
192
|
+
|
|
193
|
+
// Export the daemon's resolved connection pair for the chorus-pi extension's
|
|
194
|
+
// Chorus tooling. Explicitly overwrite inherited values so the extension and the
|
|
195
|
+
// daemon cannot disagree about which Chorus instance this wake belongs to.
|
|
196
|
+
const childEnv = { ...process.env, CHORUS_DAEMON_HEADLESS: "1" };
|
|
197
|
+
if (this.creds) {
|
|
198
|
+
if (this.creds.url) childEnv.CHORUS_URL = this.creds.url;
|
|
199
|
+
if (this.creds.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
|
|
200
|
+
// Identity profile for the woken session — its extension/skills pass this to
|
|
201
|
+
// `chorus mcp --agent`, which resolves the key from ~/.chorus/daemon.json.
|
|
202
|
+
if (this.creds.agentUuid || this.creds.agentName)
|
|
203
|
+
childEnv.CHORUS_AGENT_PROFILE = this.creds.agentUuid || this.creds.agentName;
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
return new Promise((resolve) => {
|
|
207
|
+
let child;
|
|
208
|
+
try {
|
|
209
|
+
child = this.spawnImpl(command, argv, {
|
|
210
|
+
cwd: cwd ?? process.cwd(),
|
|
211
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
212
|
+
env: childEnv,
|
|
213
|
+
shell: false,
|
|
214
|
+
detached,
|
|
215
|
+
windowsHide: true,
|
|
216
|
+
});
|
|
217
|
+
} catch (err) {
|
|
218
|
+
this.logger.error(`[Chorus] failed to spawn pi: ${err}`);
|
|
219
|
+
resolve({ sessionId: anchor, backendSessionId: null, exitCode: null, isNew: isNewFlag });
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Hand the live child to the caller (interrupt registry) before resolving.
|
|
224
|
+
// Never let a throwing callback escape into the spawn path.
|
|
225
|
+
if (onChild) {
|
|
226
|
+
try {
|
|
227
|
+
onChild(child);
|
|
228
|
+
} catch (err) {
|
|
229
|
+
this.logger.warn(`[Chorus] onChild handler threw: ${err}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
let stdoutBuf = "";
|
|
234
|
+
|
|
235
|
+
child.stdout?.setEncoding?.("utf8");
|
|
236
|
+
child.stdout?.on("data", (chunk) => {
|
|
237
|
+
stdoutBuf = parseNdjsonChunk(
|
|
238
|
+
stdoutBuf,
|
|
239
|
+
String(chunk),
|
|
240
|
+
(obj) => {
|
|
241
|
+
if (onMessage) {
|
|
242
|
+
try {
|
|
243
|
+
onMessage(obj);
|
|
244
|
+
} catch (err) {
|
|
245
|
+
this.logger.warn(`[Chorus] onMessage handler threw: ${err}`);
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
},
|
|
249
|
+
(msg) => this.logger.warn(`[Chorus] ${msg}`)
|
|
250
|
+
);
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
child.stderr?.setEncoding?.("utf8");
|
|
254
|
+
child.stderr?.on("data", (chunk) => {
|
|
255
|
+
const text = String(chunk).trim();
|
|
256
|
+
if (text) this.logger.warn(`[Chorus] pi stderr: ${text}`);
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
child.on("error", (err) => {
|
|
260
|
+
this.logger.error(`[Chorus] pi process error: ${err}`);
|
|
261
|
+
resolve({ sessionId: anchor, backendSessionId: anchor || null, exitCode: null, isNew: isNewFlag });
|
|
262
|
+
});
|
|
263
|
+
|
|
264
|
+
child.on("close", (code) => {
|
|
265
|
+
if (code !== 0) {
|
|
266
|
+
this.logger.warn(`[Chorus] pi exited with code ${code}`);
|
|
267
|
+
}
|
|
268
|
+
resolve({ sessionId: anchor, backendSessionId: anchor || null, exitCode: code, isNew: isNewFlag });
|
|
269
|
+
});
|
|
270
|
+
|
|
271
|
+
// Guard against an ASYNC stdin error (EPIPE) so it never becomes an
|
|
272
|
+
// uncaughtException that kills the daemon.
|
|
273
|
+
child.stdin?.on?.("error", (err) => {
|
|
274
|
+
this.logger.warn(`[Chorus] pi stdin error (ignored): ${err}`);
|
|
275
|
+
});
|
|
276
|
+
|
|
277
|
+
// Feed the prompt over stdin, then close it so the model runs.
|
|
278
|
+
try {
|
|
279
|
+
child.stdin?.write(prompt);
|
|
280
|
+
child.stdin?.end();
|
|
281
|
+
} catch (err) {
|
|
282
|
+
this.logger.warn(`[Chorus] failed writing prompt to pi stdin: ${err}`);
|
|
283
|
+
}
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
}
|
package/cli/spawner-select.mjs
CHANGED
|
@@ -20,6 +20,7 @@ import { ClaudeSpawner } from "./claude-spawner.mjs";
|
|
|
20
20
|
import { CodexSpawner } from "./codex-spawner.mjs";
|
|
21
21
|
import { DshSpawner } from "./dsh-spawner.mjs";
|
|
22
22
|
import { KiroSpawner } from "./kiro-spawner.mjs";
|
|
23
|
+
import { PiSpawner } from "./pi-spawner.mjs";
|
|
23
24
|
|
|
24
25
|
/**
|
|
25
26
|
* A fail-closed spawner for the `offline` agentType. It satisfies the shared
|
|
@@ -52,7 +53,7 @@ export class OfflineSpawner {
|
|
|
52
53
|
|
|
53
54
|
/**
|
|
54
55
|
* Construct the spawner backend for `agentType`.
|
|
55
|
-
* @param {string} agentType "claude-code" | "codex" | "kiro" | "dsh" | "offline"
|
|
56
|
+
* @param {string} agentType "claude-code" | "codex" | "kiro" | "dsh" | "pi" | "offline"
|
|
56
57
|
* (already validated upstream). "offline" → OfflineSpawner (fail-closed no-op).
|
|
57
58
|
* @param {{ logger?: any, permissionMode?: "chorus"|"yolo", creds?: { url: string, apiKey: string } }} [opts]
|
|
58
59
|
* @returns {import("./codex-spawner.mjs").Spawner}
|
|
@@ -79,5 +80,10 @@ export function selectSpawner(agentType, opts = {}) {
|
|
|
79
80
|
prepareManagedConfigFn: opts.prepareManagedConfigFn,
|
|
80
81
|
});
|
|
81
82
|
}
|
|
83
|
+
if (agentType === "pi") {
|
|
84
|
+
// pi is a first-class wakeable backend — an explicit branch so it NEVER falls
|
|
85
|
+
// through to the claude-code default below (nor is treated as offline).
|
|
86
|
+
return new PiSpawner({ logger, permissionMode, creds });
|
|
87
|
+
}
|
|
82
88
|
return new ClaudeSpawner({ logger, permissionMode, creds });
|
|
83
89
|
}
|
package/cli/upload-hooks.mjs
CHANGED
|
@@ -399,15 +399,26 @@ function stripSystemReminders(s) {
|
|
|
399
399
|
* the caller can skip it). Never throws — a shape it doesn't recognize yields null
|
|
400
400
|
* rather than an error (defensive against CLI drift).
|
|
401
401
|
*
|
|
402
|
-
*
|
|
402
|
+
* Four stream dialects are recognized (their top-level shapes are disjoint, so no
|
|
403
403
|
* backend flag is needed):
|
|
404
404
|
* - Claude Code stream-json: `{ type: "user"|"assistant", message: { content … } }`.
|
|
405
|
+
* - DeepSeek Harness (dsh): `{ type: "user/message"|"assistant/message", data: { message } }`.
|
|
405
406
|
* - codex `codex exec --json`: conversation/tool output rides on `item.completed`
|
|
406
407
|
* events discriminated by `item.type`; assistant text is an `agent_message`
|
|
407
408
|
* item with a top-level `item.text` (verified against codex-cli 0.142.3). codex
|
|
408
409
|
* does NOT echo the user prompt (the chat UI renders that from the turn's
|
|
409
410
|
* promptText), and `reasoning` / `command_execution` / lifecycle envelopes are
|
|
410
411
|
* not conversation text — all dropped.
|
|
412
|
+
* - pi (@earendil-works/pi-coding-agent) `pi --mode json`: AgentSessionEvents whose
|
|
413
|
+
* authoritative final text is a `message_end` carrying a full AgentMessage
|
|
414
|
+
* (`{ role, content }`). We keep ONLY the assistant message: pi UNCONDITIONALLY
|
|
415
|
+
* re-emits the wake prompt as a `message_end` with role "user" (agent-loop.ts),
|
|
416
|
+
* which the daemon already stores as the turn's promptText — so echoing it would
|
|
417
|
+
* duplicate the prompt (same reason codex drops the user echo). `toolResult`
|
|
418
|
+
* messages and `tool_execution_end` tool-output events are not conversation text.
|
|
419
|
+
* pi's content-block shape is identical to Claude's (text blocks `{type:"text",text}`,
|
|
420
|
+
* thinking `{type:"thinking"}`, tool calls `{type:"toolCall"}`), so we normalize the
|
|
421
|
+
* assistant envelope to the Claude shape and reuse the same block extractor.
|
|
411
422
|
*
|
|
412
423
|
* @param {any} obj One parsed stream NDJSON object.
|
|
413
424
|
* @returns {{ role: "user"|"assistant", text: string } | null}
|
|
@@ -438,6 +449,19 @@ export function extractTranscriptText(obj) {
|
|
|
438
449
|
return { role: "assistant", text: itemText };
|
|
439
450
|
}
|
|
440
451
|
|
|
452
|
+
// ── pi `pi --mode json` dialect ──
|
|
453
|
+
// pi's authoritative final text of each step is a `message_end` carrying a full
|
|
454
|
+
// AgentMessage `{ role, content }`. Keep ONLY the assistant message: pi re-emits the
|
|
455
|
+
// wake prompt as a role:"user" message_end (already stored as the turn's promptText),
|
|
456
|
+
// and role:"toolResult" / `tool_execution_end` events are tool output, not text.
|
|
457
|
+
// pi's content-block shape matches Claude's, so we hand the message to the Claude-shape
|
|
458
|
+
// extractor below (which keeps only `{type:"text"}` blocks, strips reminders, drops empties).
|
|
459
|
+
if (obj.type === "message_end") {
|
|
460
|
+
const message = obj.message;
|
|
461
|
+
if (!message || typeof message !== "object" || message.role !== "assistant") return null;
|
|
462
|
+
return extractTranscriptText({ type: "assistant", message });
|
|
463
|
+
}
|
|
464
|
+
|
|
441
465
|
// ── Claude Code stream-json dialect ──
|
|
442
466
|
if (!CONVERSATION_TYPES.has(obj.type)) return null;
|
|
443
467
|
|