@chorus-aidlc/chorus 0.16.2 → 0.16.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +444 -433
- package/.next/standalone/.next/app-path-routes-manifest.json +42 -42
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +36 -36
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +2 -2
- package/.next/standalone/.next/server/app/admin.rsc +2 -2
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.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_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +2 -2
- package/.next/standalone/.next/server/app/index.rsc +2 -2
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +2 -2
- package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
- package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/callback.html +2 -2
- package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
- package/.next/standalone/.next/server/app/login.html +2 -2
- package/.next/standalone/.next/server/app/login.rsc +2 -2
- package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
- package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +2 -2
- package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects.html +2 -2
- package/.next/standalone/.next/server/app/projects.rsc +4 -4
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +4 -4
- package/.next/standalone/.next/server/app-paths-manifest.json +42 -42
- 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/2572.js +1 -1
- package/.next/standalone/.next/server/chunks/2618.js +1 -1
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3594.js +1 -1
- package/.next/standalone/.next/server/chunks/4394.js +1 -1
- package/.next/standalone/.next/server/chunks/4827.js +1 -1
- package/.next/standalone/.next/server/chunks/5205.js +1 -1
- package/.next/standalone/.next/server/chunks/5245.js +1 -1
- package/.next/standalone/.next/server/chunks/5351.js +4 -3
- package/.next/standalone/.next/server/chunks/{4011.js → 5489.js} +4 -4
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6506.js +2 -2
- package/.next/standalone/.next/server/chunks/6667.js +1 -1
- package/.next/standalone/.next/server/chunks/6995.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/8044.js +1 -0
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/9213.js +1 -1
- package/.next/standalone/.next/server/chunks/9378.js +1 -1
- package/.next/standalone/.next/server/chunks/951.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/11595.a6268c75ca8a2163.js +1 -0
- package/.next/standalone/.next/static/chunks/17099-936da9caf4c119b8.js +1 -0
- package/.next/standalone/.next/static/chunks/18609-6c859f756d530e94.js +1 -0
- package/.next/standalone/.next/static/chunks/19887-b805e1dcee8c367b.js +1 -0
- package/.next/standalone/.next/static/chunks/20204-90d655ea14281e10.js +1 -0
- package/.next/standalone/.next/static/chunks/{53402-a54163001f3d953a.js → 27370-c056dee2016c9124.js} +1 -1
- package/.next/standalone/.next/static/chunks/{29108-b9b232255811ffa8.js → 29108-5a11eea003f4cc11.js} +1 -1
- package/.next/standalone/.next/static/chunks/29305-f587e7e81bc0b200.js +10 -0
- package/.next/standalone/.next/static/chunks/33456.16ff7edf00137539.js +1 -0
- package/.next/standalone/.next/static/chunks/35432-5c245212c7595169.js +1 -0
- package/.next/standalone/.next/static/chunks/45024-eb7c062d13d9fe08.js +1 -0
- package/.next/standalone/.next/static/chunks/46294-6ae5bd0480b1820f.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.9e06848eb531e667.js +1 -0
- package/.next/standalone/.next/static/chunks/53073-a7ed20af6538a178.js +1 -0
- package/.next/standalone/.next/static/chunks/65096-f756aac39efad7a3.js +1 -0
- package/.next/standalone/.next/static/chunks/6603-e70ddeab6ad09c50.js +1 -0
- package/.next/standalone/.next/static/chunks/67580-8733964ab2c7fc0e.js +1 -0
- package/.next/standalone/.next/static/chunks/7777-8b1b6681256e1534.js +1 -0
- package/.next/standalone/.next/static/chunks/78917-1b59cbb806b3ecfc.js +1 -0
- package/.next/standalone/.next/static/chunks/82751-3e161e1d8dbda3ac.js +1 -0
- package/.next/standalone/.next/static/chunks/94643-ffa140f765c73daf.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.81b79c91858f9099.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-cea0bb3e3a295bea.js → layout-b742c51c0a764daf.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-974781e4886529f8.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-007278623926490f.js → page-f636e00c28f425ea.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c004f1a194af7fa5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-425acbe9ade5fa83.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-f5a351c544ed23d7.js → page-fdd617457730a116.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-b9eb4e0692996657.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0a6c2d0e1b68e0e4.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-58b48aa0a11603c3.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-286faced32c6133f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-7a5ef281f6819ed4.js → page-9d79e285b6fd2f8d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-1507a761e67c2aa9.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/page-5c82cf3abd856301.js +1 -0
- package/.next/standalone/.next/static/chunks/f5a9da1f-6abf712b3f684cf9.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-b54e0c78eded76be.js → webpack-4d1cc14b13e247b6.js} +1 -1
- package/.next/standalone/.next/static/css/5f52bd39b284ccdf.css +1 -0
- package/.next/standalone/package.json +3 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +2 -1
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +5 -4
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +128 -0
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
- package/.next/standalone/public/dsh-credentials.sh +137 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +5 -4
- 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 +128 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +2 -1
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +2 -1
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/docs-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +5 -4
- package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +128 -0
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/.next/standalone/public/test-dsh-credentials.sh +55 -0
- package/README.ja.md +3 -1
- package/README.ko.md +3 -1
- package/README.md +3 -1
- package/README.zh.md +3 -1
- package/cli/agent-backend-prompt.mjs +93 -0
- package/cli/client-args.mjs +11 -5
- package/cli/daemon-agent.mjs +6 -5
- package/cli/daemon-banner.mjs +3 -3
- package/cli/daemon-config.mjs +1 -1
- package/cli/daemon-install-config.mjs +21 -14
- package/cli/daemon-rest-client.mjs +31 -8
- package/cli/daemon.mjs +47 -6
- package/cli/dsh-managed-config.mjs +407 -0
- package/cli/dsh-spawner.mjs +438 -0
- package/cli/login.mjs +26 -4
- package/cli/prompts.mjs +13 -3
- package/cli/spawner-select.mjs +10 -1
- package/cli/turn-reporter.mjs +5 -2
- package/cli/upload-hooks.mjs +31 -1
- package/cli/waker.mjs +49 -6
- package/package.json +3 -1
- package/prisma/migrations/20260818024700_add_turn_backend_session_id/migration.sql +1 -0
- package/prisma/schema.prisma +3 -0
- package/.next/standalone/.next/server/chunks/2463.js +0 -1
- package/.next/standalone/.next/static/chunks/11595.b6f8ad33572b32fe.js +0 -1
- package/.next/standalone/.next/static/chunks/19887-9f459ee9e8d0855f.js +0 -1
- package/.next/standalone/.next/static/chunks/22987-8fd965ab4ff87546.js +0 -1
- package/.next/standalone/.next/static/chunks/33456.e8550ad410031e29.js +0 -1
- package/.next/standalone/.next/static/chunks/35432-ee83da56c49ef6f8.js +0 -1
- package/.next/standalone/.next/static/chunks/38296-316ba18af72385fb.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.b405fc235b36271b.js +0 -1
- package/.next/standalone/.next/static/chunks/53073-5fd399cb25a11740.js +0 -1
- package/.next/standalone/.next/static/chunks/6603-07faab08560f7ecd.js +0 -1
- package/.next/standalone/.next/static/chunks/6698-1c55791b2d0820d5.js +0 -1
- package/.next/standalone/.next/static/chunks/66980-652990fcf3212c94.js +0 -10
- package/.next/standalone/.next/static/chunks/75137-c9e8422c9d4e1f52.js +0 -1
- package/.next/standalone/.next/static/chunks/7777-5dad34f6bdc13482.js +0 -1
- package/.next/standalone/.next/static/chunks/78917-7354d3b6908da7d1.js +0 -1
- package/.next/standalone/.next/static/chunks/82751-de255af4418d53e4.js +0 -1
- package/.next/standalone/.next/static/chunks/83285-db8ae107944eb6df.js +0 -1
- package/.next/standalone/.next/static/chunks/86155-c9b7c2c08d3fa80e.js +0 -1
- package/.next/standalone/.next/static/chunks/89836-b5ab6a0b32c54f42.js +0 -1
- package/.next/standalone/.next/static/chunks/94643-6d31df78aa3074b5.js +0 -1
- package/.next/standalone/.next/static/chunks/96170-75da13decdb6f73f.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.9dce8f30802824fc.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-7462c5eb92130796.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-b6ecaf52f6b81ec7.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-82404154708e48a9.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-3cd46bec9383b191.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-6abc7d1785e2b999.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-7f87113e5d8bcf6e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-30ab1573c4bd466f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-b21d4184d9ca0b25.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-3b6c54f887108635.js +0 -1
- package/.next/standalone/.next/static/css/893d99a21153c9b0.css +0 -1
- /package/.next/standalone/.next/static/{YTZwWTfE0BsJnjCDYCEHi → 6sHDgeKioa0SJR1MAbcYG}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{YTZwWTfE0BsJnjCDYCEHi → 6sHDgeKioa0SJR1MAbcYG}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: orchestrate-chorus
|
|
3
|
+
description: Multi-agent orchestration playbook — coordinate OTHER agents and humans across the AI-DLC lifecycle by delegating ideas and tasks, running independent reviewers, and gatekeeping at the Reversed-Conversation gates.
|
|
4
|
+
license: AGPL-3.0
|
|
5
|
+
metadata:
|
|
6
|
+
author: chorus
|
|
7
|
+
version: "0.16.4"
|
|
8
|
+
category: project-management
|
|
9
|
+
mcp_server: chorus
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Orchestrate Skill
|
|
13
|
+
|
|
14
|
+
This skill is for an **orchestrator** (typically an Admin-preset agent) that coordinates *other* agents and humans across the AI-DLC lifecycle instead of doing all the work itself. The orchestrator decomposes work, hands each piece to a chosen owner, runs independent reviewers as quality gates, and gatekeeps the human-owned approval/verify gates — but never ships on its own.
|
|
15
|
+
|
|
16
|
+
It complements the other skills rather than replacing them:
|
|
17
|
+
|
|
18
|
+
- `yolo-chorus` (`<BASE_URL>/skill/yolo-chorus/SKILL.md`) — **one** agent drives the whole pipeline solo. Orchestration is the opposite: **many** agents, each owning a piece, coordinated by you.
|
|
19
|
+
- `idea-chorus`, `proposal-chorus`, `develop-chorus`, `review-chorus`, `quick-dev-chorus` — a single stage you execute yourself. Orchestration is the layer *above* those: you decide who runs each stage.
|
|
20
|
+
|
|
21
|
+
---
|
|
22
|
+
|
|
23
|
+
## When to use this skill
|
|
24
|
+
|
|
25
|
+
Use it when **more than one agent (or agent + human) will touch the work** and someone has to keep them coherent:
|
|
26
|
+
|
|
27
|
+
- You own a **theme / epic / container idea** that decomposes into several independent child ideas, and you want to hand each child to a specific worker (the motivating case: a theme owner gives one child to Codex, another to a Claude dev agent, another to a human).
|
|
28
|
+
- An approved proposal has a **task DAG** and you want several developer agents working the unblocked tasks in parallel waves.
|
|
29
|
+
- You need an **independent adversarial review** of someone else's proposal / task / feature before it advances.
|
|
30
|
+
- You are the responsible owner and must keep **one accountable assignee per idea** while work fans out.
|
|
31
|
+
|
|
32
|
+
Prerequisite: delegating ideas needs `idea:admin`; delegating tasks needs `proposal:write`. Run `chorus_checkin()` first to confirm your permission set.
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
|
|
36
|
+
## Delegation primitives
|
|
37
|
+
|
|
38
|
+
### Assign an idea — `chorus_pm_assign_idea` (`idea:admin`)
|
|
39
|
+
|
|
40
|
+
Hand a whole idea to a chosen agent or user. Parameters:
|
|
41
|
+
|
|
42
|
+
| Param | Meaning |
|
|
43
|
+
|-------|---------|
|
|
44
|
+
| `ideaUuid` | The idea to delegate |
|
|
45
|
+
| `assigneeType` | `"agent"` or `"user"` |
|
|
46
|
+
| `assigneeUuid` | The chosen agent/user UUID (resolve names with `chorus_search_mentionables`) |
|
|
47
|
+
| `instanceUuid` | *(optional, agent targets only)* pin the work to one durable AgentInstance — the `(agent, host, cwd)` place — so wakes land where the code lives |
|
|
48
|
+
|
|
49
|
+
Behavior you must understand:
|
|
50
|
+
|
|
51
|
+
- **The assignee is woken and advances from the idea's *current* stage** — it does **NOT** re-claim. If the idea is `open` it moves to `elaborating`; any other status is preserved. The assignee picks up wherever the idea already is (elaboration, ready-for-proposal, etc.).
|
|
52
|
+
- **Agent targets must hold `idea:write`** (via a preset such as `pm_agent`/`admin_agent`, or an explicit permission) or the call is rejected. **User targets must be in your company.** `instanceUuid` is rejected for user targets.
|
|
53
|
+
- **Silent takeover.** Reassigning an already-owned idea simply moves ownership to the new assignee — there is one owner at a time, no confirmation prompt. Use this deliberately, not by accident.
|
|
54
|
+
|
|
55
|
+
### Assign a task — `chorus_pm_assign_task` (`proposal:write`)
|
|
56
|
+
|
|
57
|
+
Hand a single task to a developer agent. Parameters: `taskUuid`, `agentUuid` (must hold `task:write`), optional `instanceUuid`. The task must be `open` or `assigned`. The assignee is woken to execute it. Use this to distribute the tasks of an approved proposal.
|
|
58
|
+
|
|
59
|
+
### Derive child ideas and fan them out
|
|
60
|
+
|
|
61
|
+
The theme-decomposition case, end to end:
|
|
62
|
+
|
|
63
|
+
1. Read the container/theme idea and its context (`chorus_get_idea`, `chorus_get_documents`, `chorus_get_comments`).
|
|
64
|
+
2. For each independent slice, create a child idea with `chorus_pm_create_idea` (link it back to the parent in the body / via `references[]`).
|
|
65
|
+
3. Assign each child to a distinct owner with `chorus_pm_assign_idea` — e.g. one child to Codex, one to a Claude dev agent, one to a human. Each child now has its **own single owner** and advances independently.
|
|
66
|
+
4. @mention each assignee and the theme owner so the delegation is visible.
|
|
67
|
+
|
|
68
|
+
---
|
|
69
|
+
|
|
70
|
+
## Independent review as an adversarial gate
|
|
71
|
+
|
|
72
|
+
Chorus uses three read-only adversarial reviewers as quality gates. As orchestrator you run them at the three gates and act on the verdict — this is your primary quality lever when you are not writing the code yourself.
|
|
73
|
+
|
|
74
|
+
| Reviewer skill | Run after | Reviews |
|
|
75
|
+
|----------------|-----------|---------|
|
|
76
|
+
| `proposal-reviewer-chorus` | a proposal is submitted | proposal draft quality (VERDICT on the proposal) |
|
|
77
|
+
| `task-reviewer-chorus` | a task is submitted for verify | one task vs its acceptance criteria (VERDICT on the task) |
|
|
78
|
+
| `code-reviewer-chorus` | the idea's last task is verified | the idea's **aggregate** code change — the final ship gateway (VERDICT on the idea) |
|
|
79
|
+
|
|
80
|
+
Spawn a read-only sub-agent that loads the matching reviewer skill and the target UUID (pass the `ideaUuid` for code review); if your harness has no sub-agent primitive, run the reviewer's procedure inline yourself. Each posts exactly one `VERDICT: PASS` / `PASS WITH NOTES` / `FAIL` comment. Verdicts are **advisory** — they do not auto-approve, auto-verify, or hard-block; you read the BLOCKERs and decide. A `FAIL` means route the BLOCKERs back for a fix before advancing (for a code-review FAIL, add fix tasks to the *approved* proposal via `quick-dev-chorus` and re-run once they are `done`). The **Independent Review** section of the core `chorus` skill (`<BASE_URL>/skill/chorus/SKILL.md`) is the canonical description of this pattern.
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Choosing a collaboration mode
|
|
85
|
+
|
|
86
|
+
Pick the lightest mode that fits the shape of the work:
|
|
87
|
+
|
|
88
|
+
| Mode | Use when | How you run it |
|
|
89
|
+
|------|----------|----------------|
|
|
90
|
+
| **Single-owner drives one idea** | The work is one coherent feature | Assign the idea once (`chorus_pm_assign_idea`); that owner runs idea → proposal → tasks; you gatekeep the gates |
|
|
91
|
+
| **Fan-out children to N agents** | A theme decomposes into independent slices | Derive child ideas, assign each to a distinct owner; children run in parallel, each single-owner |
|
|
92
|
+
| **Parallel task waves** | One approved proposal with a task DAG | Assign the currently-unblocked tasks (`chorus_pm_assign_task`) to several dev agents; as tasks reach `done`, assign the next wave |
|
|
93
|
+
| **Review-only** | Work is already produced elsewhere | Spawn the relevant reviewer, read the VERDICT, and gatekeep — no new delegation |
|
|
94
|
+
|
|
95
|
+
Guidance: start narrow. If a single owner can hold the whole feature in their head, prefer **single-owner** — coordination overhead is not free. Reach for **fan-out** only when slices are genuinely independent (separate scope, separable elaboration). Use **parallel task waves** only after a proposal is approved and its DAG is real; respect dependencies — `to_verify` does **not** unblock downstream, only `done` does.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## Single-owner & concurrency discipline
|
|
100
|
+
|
|
101
|
+
- **One responsible assignee per idea at a time.** This mirrors the daemon's single-owner semantics: the idea is the authoritative pin root, and its owner's proposals/tasks/wakes inherit that identity. Don't leave an idea ambiguously "owned by the team."
|
|
102
|
+
- **Don't race duplicate sessions on the same work.** Two daemon sessions (or two agents) driving the same idea/task will collide on status transitions and produce conflicting wakes. Assign, then let one owner run.
|
|
103
|
+
- **Pin with `instanceUuid` when the work is tied to a place.** If a child idea's code lives on a specific host/cwd, pin the assignment to that AgentInstance so every downstream wake lands there instead of a random daemon.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
## Reversed-Conversation gates (you never auto-ship)
|
|
108
|
+
|
|
109
|
+
Chorus is **AI proposes, humans verify**. As orchestrator you enforce that, you do not bypass it:
|
|
110
|
+
|
|
111
|
+
- **Elaboration gate (gateway resolve/skip).** When a child idea you assigned to another agent has its elaboration answered, you can close the elaboration gate yourself via `chorus_pm_validate_elaboration` (or `chorus_pm_skip_elaboration` for a trivially clear idea) even though you are not the assignee — holding `idea:admin` is enough. This is the MCP parity of the UI Verify-Elaborate: it wakes the **assignee** agent to write the proposal. You gatekeep the gate; the assignee still authors the proposal (Reversed-Conversation preserved).
|
|
112
|
+
- **Proposal gate.** When a delegated owner submits a proposal, STOP. Run the proposal reviewer, then hand the approve/reject decision to the human owner. Do not self-approve just because you *can* (`proposal:admin`).
|
|
113
|
+
- **Verify gate.** When a task reaches `to_verify`, STOP. Run the task reviewer, then let the human verify. Permission to verify is not authorization to rubber-stamp your own coordinated work.
|
|
114
|
+
- **Never merge or push.** The orchestrator drives work up to "PR ready" and hands it back to the human — it does not merge, push, or otherwise ship autonomously.
|
|
115
|
+
|
|
116
|
+
@mention the owner at each gate so the handoff is explicit and auditable.
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## Derive a child idea vs add a task vs assign directly
|
|
121
|
+
|
|
122
|
+
| Do this | When |
|
|
123
|
+
|---------|------|
|
|
124
|
+
| **Derive a new child idea** (`chorus_pm_create_idea` + assign) | The slice is genuinely separate scope that deserves its own elaboration, proposal, and owner — a theme decomposition, or a parallelizable sub-feature. |
|
|
125
|
+
| **Add a task to an approved proposal** (`chorus_create_tasks` with `proposalUuid`) | The work is a discrete unit of the **same** feature that already has a proposal — e.g. code-review fix tasks, or a follow-up step in an existing DAG. |
|
|
126
|
+
| **Assign the existing idea/task directly** (`chorus_pm_assign_idea` / `chorus_pm_assign_task`) | The work is already scoped and just needs a (different) owner or executor — reassignment, taking over a stalled idea, or distributing existing tasks. |
|
|
127
|
+
|
|
128
|
+
Rule of thumb: **new scope → child idea; same-proposal unit → task; only the owner changes → assign.**
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
# Tests for public/dsh-credentials.sh — write/merge/mode/idempotency/validation.
|
|
3
|
+
# Runs the real script against disposable $DSH_HOME dirs. Bash 3.2 compatible.
|
|
4
|
+
set -uo pipefail
|
|
5
|
+
|
|
6
|
+
HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
7
|
+
SCRIPT="$HERE/dsh-credentials.sh"
|
|
8
|
+
fail=0
|
|
9
|
+
|
|
10
|
+
ok() { printf 'ok %s\n' "$1"; }
|
|
11
|
+
no() { printf 'FAIL %s\n' "$1"; fail=1; }
|
|
12
|
+
|
|
13
|
+
# run the script with a clean env (no ambient CHORUS_*), stdin from /dev/null.
|
|
14
|
+
run() {
|
|
15
|
+
local home="$1"; shift
|
|
16
|
+
env -u CHORUS_URL -u CHORUS_API_KEY DSH_HOME="$home" "$@" bash "$SCRIPT" </dev/null >/dev/null 2>&1
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
# 1. writes both keys, preserves unrelated lines, mode 0600, normalizes URL
|
|
20
|
+
T="$(mktemp -d)"; printf 'DEEPSEEK_API_KEY=sk-keep\nOTHER=1\n' > "$T/.env"
|
|
21
|
+
run "$T" CHORUS_URL="https://c.example/api/mcp/" CHORUS_API_KEY="cho_test123"
|
|
22
|
+
grep -qx 'CHORUS_URL=https://c.example' "$T/.env" && ok "writes+normalizes CHORUS_URL" || no "writes+normalizes CHORUS_URL"
|
|
23
|
+
grep -qx 'CHORUS_API_KEY=cho_test123' "$T/.env" && ok "writes CHORUS_API_KEY" || no "writes CHORUS_API_KEY"
|
|
24
|
+
grep -qx 'DEEPSEEK_API_KEY=sk-keep' "$T/.env" && ok "preserves DEEPSEEK line" || no "preserves DEEPSEEK line"
|
|
25
|
+
grep -qx 'OTHER=1' "$T/.env" && ok "preserves OTHER line" || no "preserves OTHER line"
|
|
26
|
+
[ "$(stat -c '%a' "$T/.env" 2>/dev/null || stat -f '%A' "$T/.env")" = "600" ] && ok "mode 0600" || no "mode 0600"
|
|
27
|
+
|
|
28
|
+
# 2. idempotent: re-run replaces, no duplicate lines
|
|
29
|
+
run "$T" CHORUS_URL="https://c.example" CHORUS_API_KEY="cho_new"
|
|
30
|
+
[ "$(grep -c '^CHORUS_URL=' "$T/.env")" = "1" ] && ok "no duplicate CHORUS_URL" || no "no duplicate CHORUS_URL"
|
|
31
|
+
[ "$(grep -c '^CHORUS_API_KEY=' "$T/.env")" = "1" ] && ok "no duplicate CHORUS_API_KEY" || no "no duplicate CHORUS_API_KEY"
|
|
32
|
+
grep -qx 'CHORUS_API_KEY=cho_new' "$T/.env" && ok "replaced key value" || no "replaced key value"
|
|
33
|
+
rm -rf "$T"
|
|
34
|
+
|
|
35
|
+
# 3. drops a prior `export CHORUS_*` form too, keeps others
|
|
36
|
+
T="$(mktemp -d)"; printf 'export CHORUS_URL=https://old\nexport CHORUS_API_KEY=cho_old\nKEEP=2\n' > "$T/.env"
|
|
37
|
+
run "$T" CHORUS_URL="https://c.example" CHORUS_API_KEY="cho_fresh"
|
|
38
|
+
grep -q 'export CHORUS_URL' "$T/.env" && no "drops export CHORUS_URL" || ok "drops export CHORUS_URL"
|
|
39
|
+
grep -q 'export CHORUS_API_KEY' "$T/.env" && no "drops export CHORUS_API_KEY" || ok "drops export CHORUS_API_KEY"
|
|
40
|
+
grep -qx 'KEEP=2' "$T/.env" && ok "KEEP preserved" || no "KEEP preserved"
|
|
41
|
+
rm -rf "$T"
|
|
42
|
+
|
|
43
|
+
# 4. validation: missing creds (no TTY) / bad URL / bad key all exit non-zero, write nothing
|
|
44
|
+
T="$(mktemp -d)"
|
|
45
|
+
run "$T" && no "missing creds exits non-zero" || ok "missing creds exits non-zero"
|
|
46
|
+
[ ! -f "$T/.env" ] && ok "no .env written on failure" || no "no .env written on failure"
|
|
47
|
+
run "$T" CHORUS_URL="ftp://x" CHORUS_API_KEY="cho_x" && no "bad URL exits non-zero" || ok "bad URL exits non-zero"
|
|
48
|
+
run "$T" CHORUS_URL="https://x" CHORUS_API_KEY="nope" && no "bad key exits non-zero" || ok "bad key exits non-zero"
|
|
49
|
+
rm -rf "$T"
|
|
50
|
+
|
|
51
|
+
# 5. --help exits 0
|
|
52
|
+
bash "$SCRIPT" --help >/dev/null 2>&1 && ok "--help exits 0" || no "--help exits 0"
|
|
53
|
+
|
|
54
|
+
if [ "$fail" -eq 0 ]; then printf '\nALL PASS\n'; else printf '\nFAILURES\n'; fi
|
|
55
|
+
exit "$fail"
|
package/README.ja.md
CHANGED
|
@@ -38,6 +38,8 @@ Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Veri
|
|
|
38
38
|
|
|
39
39
|
## 最近の更新
|
|
40
40
|
|
|
41
|
+
**[v0.16.4](https://chorus-ai.dev/blog/chorus-v0.16.4-release/)** — DeepSeek Harness(dsh)が 6 つ目の接続方法に。`@chorus-aidlc/chorus-dsh` バンドルが Chorus のスキル・ペルソナ・MCP 設定を任意の dsh プロファイルに追加します。現時点は対話的な利用のみ、デーモンウェイクは後日対応。
|
|
42
|
+
|
|
41
43
|
**[v0.16.1](https://chorus-ai.dev/blog/chorus-v0.16.1-release/)** — 1 つの `chorus daemon` が、互いに独立した複数のエージェントを同時に扱えるようになりました。各エージェントは `agents[]` 配列で自分のキー・作業ディレクトリ・バックエンド・権限を持ちます。エージェント同士は @メンションで作業を渡し合え、各ウェイクはそのエージェント自身のプロジェクトディレクトリに届きます。
|
|
42
44
|
|
|
43
45
|
**[v0.16.0](https://chorus-ai.dev/blog/chorus-v0.16.0-release/)** — エージェントをドキュメントサイト([doc.chorus-ai.dev](https://doc.chorus-ai.dev))へ案内する `docs` スキルを追加し、記憶に頼らず現在のドキュメントを読んで回答するようにしました。
|
|
@@ -99,7 +101,7 @@ PM エージェントが要件を分析し、PRD と課題 DAG を含む提案
|
|
|
99
101
|
|
|
100
102
|
## AI エージェントを接続する
|
|
101
103
|
|
|
102
|
-
最も手早い方法は、アプリ内のセットアップウィザードです:**Settings → Setup Guide** を開いてください。ウィザードが API キーを作成し、お使いのクライアント(Claude Code、Codex、Kiro、OpenCode、OpenClaw、Pi、その他 MCP 互換のエージェント)向けの正確なコマンドを表示します。
|
|
104
|
+
最も手早い方法は、アプリ内のセットアップウィザードです:**Settings → Setup Guide** を開いてください。ウィザードが API キーを作成し、お使いのクライアント(Claude Code、Codex、Kiro、dsh、OpenCode、OpenClaw、Pi、その他 MCP 互換のエージェント)向けの正確なコマンドを表示します。
|
|
103
105
|
|
|
104
106
|
クライアントごとの詳細なガイド → **[エージェントプラットフォーム](https://doc.chorus-ai.dev/ja/reference/agents/)**。
|
|
105
107
|
|
package/README.ko.md
CHANGED
|
@@ -38,6 +38,8 @@ Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Veri
|
|
|
38
38
|
|
|
39
39
|
## 최근 업데이트
|
|
40
40
|
|
|
41
|
+
**[v0.16.4](https://chorus-ai.dev/blog/chorus-v0.16.4-release/)** — DeepSeek Harness(dsh)가 여섯 번째 연결 방식으로 추가됩니다: `@chorus-aidlc/chorus-dsh` 번들이 Chorus의 스킬·페르소나·MCP 설정을 임의의 dsh 프로파일에 추가합니다. 현재는 대화식 사용만, 데몬 웨이크는 추후 지원.
|
|
42
|
+
|
|
41
43
|
**[v0.16.1](https://chorus-ai.dev/blog/chorus-v0.16.1-release/)** — 이제 하나의 `chorus daemon`이 서로 독립적인 여러 에이전트를 동시에 서비스합니다. 각 에이전트는 `agents[]` 배열로 자신의 키·작업 디렉터리·백엔드·권한을 가집니다. 에이전트끼리 @멘션으로 작업을 넘길 수 있고, 각 웨이크는 해당 에이전트 자신의 프로젝트 디렉터리에 도착합니다.
|
|
42
44
|
|
|
43
45
|
**[v0.16.0](https://chorus-ai.dev/blog/chorus-v0.16.0-release/)** — 에이전트를 문서 사이트([doc.chorus-ai.dev](https://doc.chorus-ai.dev))로 안내하는 `docs` 스킬을 추가해, 기억에 의존하지 않고 현재 문서를 읽고 답하도록 했습니다.
|
|
@@ -99,7 +101,7 @@ PM 에이전트가 요구사항을 분석해 PRD와 작업 DAG를 생성하며,
|
|
|
99
101
|
|
|
100
102
|
## 에이전트 연결하기
|
|
101
103
|
|
|
102
|
-
가장 빠른 방법은 앱 내 마법사입니다: **Settings → Setup Guide**를 여세요. 마법사가 API 키를 만들고, 사용하는 클라이언트(Claude Code, Codex, Kiro, OpenCode, OpenClaw, Pi, 또는 그 밖의 MCP 호환 에이전트)에 맞는 정확한 명령을 보여줍니다.
|
|
104
|
+
가장 빠른 방법은 앱 내 마법사입니다: **Settings → Setup Guide**를 여세요. 마법사가 API 키를 만들고, 사용하는 클라이언트(Claude Code, Codex, Kiro, dsh, OpenCode, OpenClaw, Pi, 또는 그 밖의 MCP 호환 에이전트)에 맞는 정확한 명령을 보여줍니다.
|
|
103
105
|
|
|
104
106
|
클라이언트별 전체 가이드 → **[에이전트 플랫폼](https://doc.chorus-ai.dev/ko/reference/agents/)**.
|
|
105
107
|
|
package/README.md
CHANGED
|
@@ -38,6 +38,8 @@ The labels under each stage are the **permissions** an actor needs there — gra
|
|
|
38
38
|
|
|
39
39
|
## What's New
|
|
40
40
|
|
|
41
|
+
**[v0.16.4](https://chorus-ai.dev/blog/chorus-v0.16.4-release/)** — DeepSeek Harness (dsh) is the sixth way to connect: the `@chorus-aidlc/chorus-dsh` bundle drops Chorus's skills, persona, and MCP config into any dsh profile. Interactive for now; daemon wake comes later.
|
|
42
|
+
|
|
41
43
|
**[v0.16.1](https://chorus-ai.dev/blog/chorus-v0.16.1-release/)** — One `chorus daemon` now serves many independent agents at once — each with its own key, working directories, backend, and permissions via an `agents[]` array — and agents can hand work to each other by @-mention, with each wake landing in that agent's own project directory.
|
|
42
44
|
|
|
43
45
|
**[v0.16.0](https://chorus-ai.dev/blog/chorus-v0.16.0-release/)** — A `docs` skill that points agents at the live docs site ([doc.chorus-ai.dev](https://doc.chorus-ai.dev)), so they answer from the current docs instead of reciting from memory.
|
|
@@ -99,7 +101,7 @@ Task cards flow between To Do → In Progress → To Verify as agents work, with
|
|
|
99
101
|
|
|
100
102
|
## Connect an Agent
|
|
101
103
|
|
|
102
|
-
The fastest path is the in-app wizard: open **Settings → Setup Guide**. It creates the API key and shows the exact commands for your client — Claude Code, Codex, Kiro, OpenCode, OpenClaw, Pi, or any MCP-compatible agent.
|
|
104
|
+
The fastest path is the in-app wizard: open **Settings → Setup Guide**. It creates the API key and shows the exact commands for your client — Claude Code, Codex, Kiro, dsh, OpenCode, OpenClaw, Pi, or any MCP-compatible agent.
|
|
103
105
|
|
|
104
106
|
Full per-client guides → **[Agent platforms](https://doc.chorus-ai.dev/reference/agents/)**.
|
|
105
107
|
|
package/README.zh.md
CHANGED
|
@@ -29,6 +29,8 @@ Idea ──> Proposal ──> [Document + Task DAG] ──> Execute ──> Veri
|
|
|
29
29
|
|
|
30
30
|
## 最近更新
|
|
31
31
|
|
|
32
|
+
**[v0.16.4](https://chorus-ai.dev/zh/blog/chorus-v0.16.4-release/)** — DeepSeek Harness(dsh)成为第六种接入方式:`@chorus-aidlc/chorus-dsh` bundle 把 Chorus 的 skill、persona 和 MCP 配置装进任意 dsh profile。目前仅交互式使用,daemon 唤醒稍后支持。
|
|
33
|
+
|
|
32
34
|
**[v0.16.1](https://chorus-ai.dev/zh/blog/chorus-v0.16.1-release/)** — 一个 `chorus daemon` 现在可以同时服务多个互相独立的 agent,每个都有自己的密钥、工作目录、后端和权限(通过 `agents[]` 配置);agent 之间还能通过 @ 把活递给对方,每次唤醒都落在该 agent 自己的项目目录里。
|
|
33
35
|
|
|
34
36
|
**[v0.16.0](https://chorus-ai.dev/zh/blog/chorus-v0.16.0-release/)** — 新增 `docs` skill,引导 Agent 查阅文档站点([doc.chorus-ai.dev](https://doc.chorus-ai.dev)),基于当前文档作答,而不是凭记忆复述。
|
|
@@ -90,7 +92,7 @@ Kanban 看板随 Agent 工作进度自动更新,任务卡片在 To Do → In P
|
|
|
90
92
|
|
|
91
93
|
## 连接 Agent
|
|
92
94
|
|
|
93
|
-
最快的方式是应用内的 setup 向导:打开 **Settings → Setup Guide**。它会创建 API Key,并给出适配你所用客户端的完整命令,无论是 Claude Code、Codex、Kiro、OpenCode、OpenClaw、Pi,还是任何兼容 MCP 的 agent。
|
|
95
|
+
最快的方式是应用内的 setup 向导:打开 **Settings → Setup Guide**。它会创建 API Key,并给出适配你所用客户端的完整命令,无论是 Claude Code、Codex、Kiro、dsh、OpenCode、OpenClaw、Pi,还是任何兼容 MCP 的 agent。
|
|
94
96
|
|
|
95
97
|
按客户端分的完整接入指南 → **[Agent 接入平台](https://doc.chorus-ai.dev/zh/reference/agents/)**。
|
|
96
98
|
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
// cli/agent-backend-prompt.mjs
|
|
2
|
+
// Single source of truth for the interactive "which agent backend?" menu shared
|
|
3
|
+
// by the daemon credential-capture entry points: `chorus login` (single-agent),
|
|
4
|
+
// `chorus login --add` / `chorus daemon add`, and the `chorus install` "add
|
|
5
|
+
// another agent" loop (see cli/login.mjs, cli/daemon-install-config.mjs).
|
|
6
|
+
//
|
|
7
|
+
// The same AGENT_MENU list also feeds resolveInstallAgent's daemon-level backend
|
|
8
|
+
// prompt in daemon-install-config.mjs, so every surface advertises EXACTLY the
|
|
9
|
+
// same backends and never drifts — re-advertising a backend (e.g. dsh) is a
|
|
10
|
+
// one-line edit here that all prompts pick up.
|
|
11
|
+
//
|
|
12
|
+
// promptAgentBackend deliberately differs from resolveInstallAgent's inline menu
|
|
13
|
+
// in ONE way: an empty / unrecognized answer returns `undefined` ("no explicit
|
|
14
|
+
// choice") rather than DEFAULT_AGENT, so the add/login callers can OMIT the
|
|
15
|
+
// backend field and let resolve-time inheritance apply (the daemon top-level
|
|
16
|
+
// default). resolveInstallAgent must always produce a concrete daemon-level
|
|
17
|
+
// backend, so it keeps its own empty→DEFAULT_AGENT behavior and does NOT use
|
|
18
|
+
// this helper.
|
|
19
|
+
//
|
|
20
|
+
// Lives in its own module to avoid an import cycle: daemon-install-config.mjs
|
|
21
|
+
// already imports appendAgentConfig from login.mjs, so the shared menu cannot
|
|
22
|
+
// live in either of those files.
|
|
23
|
+
|
|
24
|
+
import { KNOWN_AGENTS } from "./daemon-agent.mjs";
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* The interactive agent-backend menu. Order mirrors KNOWN_AGENTS with claude-code
|
|
28
|
+
* first (it is the default). Kept as the single shared list so the numbered
|
|
29
|
+
* prompt and the accepted values never drift across entry points.
|
|
30
|
+
*
|
|
31
|
+
* NOTE: the dsh JSON-RPC daemon backend is temporarily de-advertised (offline).
|
|
32
|
+
* The code path (probeAgentCli/resolveDshPath, spawner-select, dsh-spawner) is
|
|
33
|
+
* kept dormant — re-add this menu entry to bring it back online. It remains
|
|
34
|
+
* reachable by name (e.g. `--agent dsh`, or typing "dsh" at the prompt).
|
|
35
|
+
*/
|
|
36
|
+
export const AGENT_MENU = [
|
|
37
|
+
{ value: "claude-code", label: "Claude Code (default)" },
|
|
38
|
+
{ value: "codex", label: "Codex CLI" },
|
|
39
|
+
{ value: "kiro", label: "Kiro CLI" },
|
|
40
|
+
];
|
|
41
|
+
|
|
42
|
+
/** A non-empty trimmed string, or undefined. */
|
|
43
|
+
function nonEmpty(value) {
|
|
44
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Prompt the operator to pick an agent backend for the agent being configured,
|
|
49
|
+
* shared by the add / login / install-add flows.
|
|
50
|
+
*
|
|
51
|
+
* Returns the chosen backend value, or `undefined` when the operator makes no
|
|
52
|
+
* explicit choice — meaning "inherit the daemon default" (the caller then omits
|
|
53
|
+
* the `agentType` / top-level `agent` field). `undefined` is returned when:
|
|
54
|
+
* - `isTTY` is false (non-interactive / piped) — returns immediately, prints
|
|
55
|
+
* nothing, never blocks (mirrors resolveInstallAgent / resolveDaemonCwds);
|
|
56
|
+
* - the answer is empty (Enter);
|
|
57
|
+
* - the answer is an out-of-range number or is otherwise unrecognized.
|
|
58
|
+
*
|
|
59
|
+
* Accepts either a menu number (1..AGENT_MENU.length) or a KNOWN_AGENTS value
|
|
60
|
+
* typed by name (e.g. "codex", or "dsh" even though it is de-advertised).
|
|
61
|
+
*
|
|
62
|
+
* @param {{
|
|
63
|
+
* ask: (query: string, opts?: object) => Promise<string>,
|
|
64
|
+
* log?: (m: string) => void,
|
|
65
|
+
* isTTY?: boolean,
|
|
66
|
+
* }} deps
|
|
67
|
+
* @returns {Promise<string|undefined>}
|
|
68
|
+
*/
|
|
69
|
+
export async function promptAgentBackend({ ask, log = () => {}, isTTY = false } = {}) {
|
|
70
|
+
// Non-TTY (piped / scripted) must never block on a menu — return immediately
|
|
71
|
+
// with no output. The caller falls back to --agent or inherits the default.
|
|
72
|
+
if (!isTTY || typeof ask !== "function") return undefined;
|
|
73
|
+
|
|
74
|
+
log("[Chorus] Which agent backend should this agent use?");
|
|
75
|
+
for (let i = 0; i < AGENT_MENU.length; i += 1) {
|
|
76
|
+
log(`[Chorus] ${i + 1}) ${AGENT_MENU[i].label}`);
|
|
77
|
+
}
|
|
78
|
+
const answer = nonEmpty(
|
|
79
|
+
await ask(`Select [1-${AGENT_MENU.length}] (Enter to inherit the daemon default): `),
|
|
80
|
+
);
|
|
81
|
+
if (!answer) return undefined; // Enter → inherit default.
|
|
82
|
+
|
|
83
|
+
const n = Number(answer);
|
|
84
|
+
if (Number.isInteger(n) && n >= 1 && n <= AGENT_MENU.length) {
|
|
85
|
+
return AGENT_MENU[n - 1].value;
|
|
86
|
+
}
|
|
87
|
+
// A backend typed by name (muscle memory). KNOWN_AGENTS includes de-advertised
|
|
88
|
+
// backends (dsh), so a by-name pick can still reach them.
|
|
89
|
+
if (KNOWN_AGENTS.includes(answer)) return answer;
|
|
90
|
+
|
|
91
|
+
// Out-of-range / garbage → no explicit choice; the caller inherits the default.
|
|
92
|
+
return undefined;
|
|
93
|
+
}
|
package/cli/client-args.mjs
CHANGED
|
@@ -14,10 +14,10 @@
|
|
|
14
14
|
export const DAEMON_ACTIONS = new Set(["stop", "status", "restart", "logs", "install", "uninstall"]);
|
|
15
15
|
|
|
16
16
|
/** Known agent backends, kept in sync with the authoritative list in
|
|
17
|
-
* daemon-agent.mjs (`claude-code`, `codex`, `kiro` — all implemented). This copy
|
|
17
|
+
* daemon-agent.mjs (`claude-code`, `codex`, `kiro`, `dsh` — all implemented). This copy
|
|
18
18
|
* is informational only: parsing here does not validate the value (the resolver
|
|
19
19
|
* in daemon-agent.mjs is the single source of truth for validation). */
|
|
20
|
-
export const KNOWN_AGENTS = new Set(["claude-code", "codex", "kiro"]);
|
|
20
|
+
export const KNOWN_AGENTS = new Set(["claude-code", "codex", "kiro", "dsh"]);
|
|
21
21
|
|
|
22
22
|
/**
|
|
23
23
|
* Parse the client-subcommand flags out of an arg list. Recognizes the
|
|
@@ -126,7 +126,8 @@ OPTIONS
|
|
|
126
126
|
--agent <type> Local agent backend to wake (env: CHORUS_AGENT)
|
|
127
127
|
(claude-code | codex | kiro; default: claude-code)
|
|
128
128
|
(Also configurable as "agent":"…" in ~/.chorus/daemon.json;
|
|
129
|
-
'chorus daemon install'
|
|
129
|
+
'chorus daemon install' and 'chorus login' (incl. --add)
|
|
130
|
+
prompt for it interactively on a TTY.)
|
|
130
131
|
--yolo Full autonomy for the woken agent (env: CHORUS_YOLO=1)
|
|
131
132
|
(--dangerously-skip-permissions: Bash, file writes, any
|
|
132
133
|
command). This is the DEFAULT permission mode.
|
|
@@ -205,10 +206,15 @@ OPTIONS
|
|
|
205
206
|
--api-key <cho_...> Agent API key (env: CHORUS_API_KEY)
|
|
206
207
|
--add Add this key as an ADDITIONAL agent (multi-agent daemon)
|
|
207
208
|
instead of overwriting the single credential
|
|
209
|
+
--agent <type> Agent backend for THIS agent (env: CHORUS_AGENT)
|
|
210
|
+
(claude-code | codex | kiro). On a TTY, login (and
|
|
211
|
+
--add) prompt for it when omitted; Enter inherits the
|
|
212
|
+
daemon default (claude-code) and writes no backend.
|
|
208
213
|
-h, --help Show this help message
|
|
209
214
|
|
|
210
|
-
With no flags, login prompts interactively for the URL
|
|
211
|
-
validates them against the server, and on success
|
|
215
|
+
With no flags, login prompts interactively for the URL, a masked API key, and
|
|
216
|
+
(on a TTY) the agent backend, validates them against the server, and on success
|
|
217
|
+
saves the credentials.
|
|
212
218
|
|
|
213
219
|
With --add, the validated key is appended to the daemon.json 'agents[]' array
|
|
214
220
|
so one daemon can serve several independent agents (see docs/DAEMON.md). The
|
package/cli/daemon-agent.mjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// cli/daemon-agent.mjs
|
|
2
2
|
// Pure resolution + validation of the daemon's `--agent <type>` selection.
|
|
3
|
-
// `claude-code` (the default), `codex`, and `
|
|
3
|
+
// `claude-code` (the default), `codex`, `kiro`, and `dsh` are recognized backends
|
|
4
4
|
// (add-daemon-codex-backend cashed in the reserved `codex` slot;
|
|
5
5
|
// add-daemon-kiro-backend adds `kiro`). Resolving an unknown value is a hard
|
|
6
6
|
// error (no silent fallback).
|
|
@@ -16,10 +16,9 @@
|
|
|
16
16
|
import { readFileSync } from "node:fs";
|
|
17
17
|
import { loginFilePath } from "./credentials.mjs";
|
|
18
18
|
|
|
19
|
-
/** The agent backends the daemon recognizes.
|
|
20
|
-
*
|
|
21
|
-
|
|
22
|
-
export const KNOWN_AGENTS = ["claude-code", "codex", "kiro"];
|
|
19
|
+
/** The agent backends the daemon recognizes. Existing spawners cover claude-code,
|
|
20
|
+
* codex, and kiro; dsh registration is the base contract for its bridge. */
|
|
21
|
+
export const KNOWN_AGENTS = ["claude-code", "codex", "kiro", "dsh"];
|
|
23
22
|
|
|
24
23
|
/** The default agent backend when neither --agent nor CHORUS_AGENT is set. */
|
|
25
24
|
export const DEFAULT_AGENT = "claude-code";
|
|
@@ -35,6 +34,7 @@ export const DEFAULT_AGENT = "claude-code";
|
|
|
35
34
|
export function backendCli(agentType) {
|
|
36
35
|
if (agentType === "codex") return { name: "codex", envVar: "CHORUS_CODEX_PATH" };
|
|
37
36
|
if (agentType === "kiro") return { name: "kiro-cli", envVar: "CHORUS_KIRO_PATH" };
|
|
37
|
+
if (agentType === "dsh") return { name: "dsh-jsonrpc-agent", envVar: "CHORUS_DSH_PATH" };
|
|
38
38
|
return { name: "claude", envVar: "CHORUS_CLAUDE_PATH" };
|
|
39
39
|
}
|
|
40
40
|
|
|
@@ -49,6 +49,7 @@ export function backendCli(agentType) {
|
|
|
49
49
|
export function backendClientType(agentType) {
|
|
50
50
|
if (agentType === "codex") return "codex";
|
|
51
51
|
if (agentType === "kiro") return "kiro";
|
|
52
|
+
if (agentType === "dsh") return "dsh";
|
|
52
53
|
return "claude_code";
|
|
53
54
|
}
|
|
54
55
|
|
package/cli/daemon-banner.mjs
CHANGED
|
@@ -19,7 +19,7 @@ import { backendCli } from "./daemon-agent.mjs";
|
|
|
19
19
|
* @property {string} agentUuid authenticated agent uuid.
|
|
20
20
|
* @property {"yolo"|"chorus"} permissionMode
|
|
21
21
|
* @property {string} credentialSource resolved credential source (flag/env/login-file/…).
|
|
22
|
-
* @property {string} agentType local agent backend (claude-code | codex) — drives the CLI row label.
|
|
22
|
+
* @property {string} agentType local agent backend (claude-code | codex | kiro | dsh) — drives the CLI row label.
|
|
23
23
|
* @property {string|null} cliPath resolved path of the SELECTED backend's CLI, or null when not found.
|
|
24
24
|
* @property {string} [connection] connection state line (default "connecting…").
|
|
25
25
|
* @property {string} [configPath] absolute path to the daemon.json the CLI reads.
|
|
@@ -42,8 +42,8 @@ export function bannerRows(info) {
|
|
|
42
42
|
info.permissionMode === "yolo"
|
|
43
43
|
? "YOLO ⚠ (full autonomy — Bash/write/any command)"
|
|
44
44
|
: "chorus-only (Chorus MCP tools only)";
|
|
45
|
-
// The CLI row names the
|
|
46
|
-
//
|
|
45
|
+
// The CLI row names the selected backend so non-Claude runs are never
|
|
46
|
+
// mislabeled and their own executable override is actionable.
|
|
47
47
|
const cli = backendCli(info.agentType);
|
|
48
48
|
const cliValue = info.cliPath
|
|
49
49
|
? `found: ${info.cliPath}`
|
package/cli/daemon-config.mjs
CHANGED
|
@@ -306,7 +306,7 @@ function positiveInt(value) {
|
|
|
306
306
|
* @typedef {Object} AgentConfig One fully-resolved agent runtime config.
|
|
307
307
|
* @property {string} url Chorus server URL for this agent.
|
|
308
308
|
* @property {string} apiKey This agent's `cho_` API key.
|
|
309
|
-
* @property {string} agentType Backend: claude-code | codex | kiro.
|
|
309
|
+
* @property {string} agentType Backend: claude-code | codex | kiro | dsh.
|
|
310
310
|
* @property {Array<string|undefined>} cwds Served paths (`undefined` ⇒ process cwd).
|
|
311
311
|
* @property {"yolo"|"chorus"} permissionMode Woken-agent permission posture.
|
|
312
312
|
* @property {number} maxConcurrency This agent's wake-queue cap.
|
|
@@ -27,9 +27,11 @@ import { updateDaemonConfig, appendAgentConfig, prompt as defaultPrompt } from "
|
|
|
27
27
|
import { validateAndFetchIdentity } from "./chorus-client.mjs";
|
|
28
28
|
import { normalizeCwd, cleanCwdList } from "./daemon-config.mjs";
|
|
29
29
|
import { KNOWN_AGENTS, DEFAULT_AGENT } from "./daemon-agent.mjs";
|
|
30
|
+
import { AGENT_MENU, promptAgentBackend } from "./agent-backend-prompt.mjs";
|
|
30
31
|
import { agentNotFoundWarningLine } from "./daemon-banner.mjs";
|
|
31
32
|
import { resolveClaudePath } from "./claude-spawner.mjs";
|
|
32
33
|
import { resolveCodexPath } from "./codex-spawner.mjs";
|
|
34
|
+
import { resolveDshPath } from "./dsh-spawner.mjs";
|
|
33
35
|
import { resolveKiroPath } from "./kiro-spawner.mjs";
|
|
34
36
|
import { readFileSync } from "node:fs";
|
|
35
37
|
|
|
@@ -160,12 +162,20 @@ export async function resolveInstallCredentials(flags = {}, env = {}, opts = {})
|
|
|
160
162
|
);
|
|
161
163
|
continue;
|
|
162
164
|
}
|
|
163
|
-
|
|
165
|
+
// Which backend for this agent? Explicit --agent wins; otherwise the menu
|
|
166
|
+
// (we're already on a TTY here). undefined → omit agentType so the entry
|
|
167
|
+
// inherits the daemon default at resolve time (never a literal claude-code).
|
|
168
|
+
let at = nonEmpty(flags.agent);
|
|
169
|
+
if (!at) at = await promptAgentBackend({ ask, log, isTTY });
|
|
170
|
+
const agentObj = { url: u, apiKey: k, agentUuid: id.uuid, agentName: id.name };
|
|
171
|
+
if (at) agentObj.agentType = at;
|
|
172
|
+
const res = appendAgent(agentObj);
|
|
164
173
|
if (!res.ok) {
|
|
165
174
|
errLog(`[Chorus] agent ${id.name} (${id.uuid}) is already configured — skipping.`);
|
|
166
175
|
continue;
|
|
167
176
|
}
|
|
168
|
-
|
|
177
|
+
const backendNote = at ? ` (backend: ${at})` : "";
|
|
178
|
+
log(`[Chorus] added agent ${id.name} (${id.uuid})${backendNote} — this daemon now serves ${res.agents.length} agents.`);
|
|
169
179
|
}
|
|
170
180
|
}
|
|
171
181
|
|
|
@@ -242,7 +252,6 @@ export async function resolveInstallCwds(flags = {}, opts = {}) {
|
|
|
242
252
|
const first = nonEmpty(await ask(`Working directory [${defaultCwd}] (Enter to accept the default): `));
|
|
243
253
|
collected.push(first ?? defaultCwd);
|
|
244
254
|
// subsequent adds
|
|
245
|
-
// eslint-disable-next-line no-constant-condition
|
|
246
255
|
while (true) {
|
|
247
256
|
const next = nonEmpty(await ask("Add another working directory (blank to finish): "));
|
|
248
257
|
if (!next) break;
|
|
@@ -280,25 +289,23 @@ export async function resolveInstallBrowseRoots(flags = {}, opts = {}) {
|
|
|
280
289
|
return { browseRoots };
|
|
281
290
|
}
|
|
282
291
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
{ value: "claude-code", label: "Claude Code (default)" },
|
|
290
|
-
{ value: "codex", label: "Codex CLI" },
|
|
291
|
-
{ value: "kiro", label: "Kiro CLI" },
|
|
292
|
-
];
|
|
292
|
+
// The interactive agent-backend menu (`AGENT_MENU`) now lives in
|
|
293
|
+
// ./agent-backend-prompt.mjs as the single source of truth shared with the
|
|
294
|
+
// add/login flows (imported above), so every backend prompt advertises the same
|
|
295
|
+
// list and never drifts. resolveInstallAgent keeps its own inline menu render
|
|
296
|
+
// below (its empty→DEFAULT_AGENT semantics differ from promptAgentBackend's
|
|
297
|
+
// empty→undefined) but reads the same AGENT_MENU rows.
|
|
293
298
|
|
|
294
299
|
/** Probe the selected backend's CLI on PATH. Returns the resolved path or null.
|
|
295
300
|
* Injectable per backend so the check is testable without a real PATH. */
|
|
296
301
|
function probeAgentCli(agent, probes = {}) {
|
|
297
302
|
const findClaude = probes.resolveClaudePath ?? resolveClaudePath;
|
|
298
303
|
const findCodex = probes.resolveCodexPath ?? resolveCodexPath;
|
|
304
|
+
const findDsh = probes.resolveDshPath ?? resolveDshPath;
|
|
299
305
|
const findKiro = probes.resolveKiroPath ?? resolveKiroPath;
|
|
300
306
|
if (agent === "codex") return findCodex();
|
|
301
307
|
if (agent === "kiro") return findKiro();
|
|
308
|
+
if (agent === "dsh") return findDsh();
|
|
302
309
|
return findClaude();
|
|
303
310
|
}
|
|
304
311
|
|
|
@@ -331,7 +338,7 @@ function probeAgentCli(agent, probes = {}) {
|
|
|
331
338
|
* loginPath?: string,
|
|
332
339
|
* writeConfig?: (partial: Record<string, unknown>) => string,
|
|
333
340
|
* prompt?: typeof defaultPrompt,
|
|
334
|
-
* probes?: { resolveClaudePath?: Function, resolveCodexPath?: Function, resolveKiroPath?: Function },
|
|
341
|
+
* probes?: { resolveClaudePath?: Function, resolveCodexPath?: Function, resolveKiroPath?: Function, resolveDshPath?: Function },
|
|
335
342
|
* log?: (m: string) => void,
|
|
336
343
|
* errLog?: (m: string) => void,
|
|
337
344
|
* }} [opts]
|