@chorus-aidlc/chorus 0.16.3 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +445 -445
- package/.next/standalone/.next/app-path-routes-manifest.json +54 -54
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +42 -42
- 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_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_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_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_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 +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_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 +1 -1
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +2 -2
- package/.next/standalone/.next/server/app/admin.rsc +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route_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 +3 -3
- 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_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.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 +1 -1
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +2 -2
- package/.next/standalone/.next/server/app/login/admin.rsc +1 -1
- package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/callback.html +2 -2
- package/.next/standalone/.next/server/app/login/callback.rsc +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +1 -1
- package/.next/standalone/.next/server/app/login.html +2 -2
- package/.next/standalone/.next/server/app/login.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding/page.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 +2 -2
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects.html +2 -2
- package/.next/standalone/.next/server/app/projects.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +3 -3
- package/.next/standalone/.next/server/app-paths-manifest.json +54 -54
- package/.next/standalone/.next/server/chunks/1114.js +1 -1
- package/.next/standalone/.next/server/chunks/1318.js +1 -1
- package/.next/standalone/.next/server/chunks/1437.js +1 -0
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/2572.js +1 -1
- package/.next/standalone/.next/server/chunks/2618.js +1 -1
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/{9793.js → 3045.js} +1 -1
- package/.next/standalone/.next/server/chunks/3831.js +37 -0
- package/.next/standalone/.next/server/chunks/4827.js +1 -1
- package/.next/standalone/.next/server/chunks/5245.js +1 -1
- package/.next/standalone/.next/server/chunks/{4394.js → 5706.js} +1 -1
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6207.js +1 -1
- package/.next/standalone/.next/server/chunks/6506.js +2 -2
- package/.next/standalone/.next/server/chunks/6515.js +2 -2
- package/.next/standalone/.next/server/chunks/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/9449.js +1 -0
- package/.next/standalone/.next/server/chunks/9458.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/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/{11595.97e534422c57aee1.js → 11595.bbe40924d18958bf.js} +1 -1
- package/.next/standalone/.next/static/chunks/18139-e6ef4b5869593f8e.js +1 -0
- package/.next/standalone/.next/static/chunks/28856-ef2cb58fbd404ef9.js +1 -0
- package/.next/standalone/.next/static/chunks/{31308-fda6febfb2882a28.js → 31308-bb4a97b3f39c22dd.js} +1 -1
- package/.next/standalone/.next/static/chunks/{33456.6dc44a6aca1a01fd.js → 33456.5499eb8e892b110a.js} +1 -1
- package/.next/standalone/.next/static/chunks/{4860.7873ebc9ba435c8c.js → 4860.be77046fb2b3a2bd.js} +1 -1
- package/.next/standalone/.next/static/chunks/66873-e3be53f41b3f2255.js +1 -0
- package/.next/standalone/.next/static/chunks/70303-aec3d52ad87602a3.js +1 -0
- package/.next/standalone/.next/static/chunks/76201-83b26515f85ce37c.js +1 -0
- package/.next/standalone/.next/static/chunks/78917-a8a8dff98857c045.js +1 -0
- package/.next/standalone/.next/static/chunks/{94643-01be319472d751b3.js → 94643-ffa140f765c73daf.js} +1 -1
- package/.next/standalone/.next/static/chunks/97663-9c3ae4fd60b353db.js +1 -0
- package/.next/standalone/.next/static/chunks/{99373.d0e808c18408b8da.js → 99373.111493dc260a2a04.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-b742c51c0a764daf.js → layout-40fe7d026c5a7c6d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-87d4d0fe90fca28c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-1206abaee85dc915.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-425acbe9ade5fa83.js → page-474e494097c8945f.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-e902b19328092ccf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-f273288c3530aa0f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-6568a7b08bf9a54b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-fbd3c27b68666234.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-58b48aa0a11603c3.js → page-15bb6e1696668512.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-286faced32c6133f.js → page-2bea97214b1595cc.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-2bf7ceee62b574c7.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/{page-5c82cf3abd856301.js → page-540da64d7ba16dc7.js} +1 -1
- package/.next/standalone/.next/static/chunks/{webpack-fa066d7ff9ab2b29.js → webpack-7cbb3ba6792f1fb3.js} +1 -1
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +44 -1
- package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +4 -3
- package/.next/standalone/public/chorus-plugin/bin/tests/test-mcp-cli-delegation.sh +244 -0
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +19 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +57 -0
- 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 +1 -1
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +85 -42
- package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +2 -2
- 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/dsh-credentials.sh +30 -0
- package/.next/standalone/public/install-codex.sh +21 -406
- package/.next/standalone/public/install-kiro.sh +20 -344
- package/.next/standalone/public/install-opencode.sh +20 -275
- 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 +57 -0
- 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 +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +85 -42
- 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 +2 -2
- 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/bin/chorus-api.sh +44 -1
- package/.next/standalone/public/kiro-plugin/bin/on-agent-spawn.sh +6 -4
- package/.next/standalone/public/kiro-plugin/manifest.txt +41 -0
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +19 -1
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/docs-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/.next/standalone/public/test-dsh-credentials.sh +39 -0
- package/.next/standalone/public/test-install-codex.sh +31 -79
- package/README.ja.md +5 -3
- package/README.ko.md +5 -3
- package/README.md +5 -3
- package/README.zh.md +5 -3
- package/chorus.mjs +35 -1
- package/cli/agent-backend-prompt.mjs +94 -0
- package/cli/agents.mjs +329 -0
- package/cli/chorus-client.mjs +69 -0
- package/cli/claude-spawner.mjs +4 -0
- package/cli/client-args.mjs +11 -5
- package/cli/codex-spawner.mjs +11 -6
- package/cli/credentials.mjs +185 -3
- package/cli/daemon-agent.mjs +30 -5
- package/cli/daemon-banner.mjs +3 -3
- package/cli/daemon-config.mjs +27 -2
- package/cli/daemon-install-config.mjs +21 -14
- package/cli/daemon-rest-client.mjs +31 -8
- package/cli/daemon-service.mjs +120 -33
- package/cli/daemon.mjs +175 -28
- package/cli/dsh-managed-config.mjs +407 -0
- package/cli/dsh-spawner.mjs +445 -0
- package/cli/init/adapters.mjs +137 -0
- package/cli/init/agent-type-map.mjs +60 -0
- package/cli/init/chorus-plugin-consts.mjs +16 -0
- package/cli/init/codex-mcp-config.mjs +183 -0
- package/cli/init/contracts.mjs +120 -0
- package/cli/init/detect.mjs +97 -0
- package/cli/init/file-template.mjs +248 -0
- package/cli/init/install-methods.mjs +508 -0
- package/cli/init/registry.mjs +74 -0
- package/cli/init/run-command.mjs +30 -0
- package/cli/init/select.mjs +111 -0
- package/cli/init/steps/credential-seed.mjs +751 -0
- package/cli/init/steps/daemon-setup.mjs +246 -0
- package/cli/init/steps/plugin-install.mjs +37 -0
- package/cli/init-args.mjs +137 -0
- package/cli/init.mjs +198 -0
- package/cli/kiro-spawner.mjs +4 -0
- package/cli/login.mjs +26 -4
- package/cli/mcp-args.mjs +280 -0
- package/cli/mcp.mjs +164 -0
- package/cli/spawner-select.mjs +54 -2
- package/cli/turn-reporter.mjs +5 -2
- package/cli/upload-hooks.mjs +31 -1
- package/cli/waker.mjs +49 -6
- package/package.json +1 -1
- package/prisma/migrations/20260818024700_add_turn_backend_session_id/migration.sql +1 -0
- package/prisma/schema.prisma +3 -0
- package/.next/standalone/.next/server/chunks/3594.js +0 -1
- package/.next/standalone/.next/server/chunks/5351.js +0 -32
- package/.next/standalone/.next/server/chunks/6667.js +0 -1
- package/.next/standalone/.next/server/chunks/6995.js +0 -1
- package/.next/standalone/.next/static/chunks/19887-c0bb297a78a1c7cd.js +0 -1
- package/.next/standalone/.next/static/chunks/29108-5a11eea003f4cc11.js +0 -1
- package/.next/standalone/.next/static/chunks/53073-a7ed20af6538a178.js +0 -1
- package/.next/standalone/.next/static/chunks/6603-e70ddeab6ad09c50.js +0 -1
- package/.next/standalone/.next/static/chunks/78917-1b59cbb806b3ecfc.js +0 -1
- package/.next/standalone/.next/static/chunks/82751-3e161e1d8dbda3ac.js +0 -1
- package/.next/standalone/.next/static/chunks/99366-425e9ef22e60e3e2.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-f636e00c28f425ea.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c004f1a194af7fa5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-fdd617457730a116.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-6b3fb08d53826d02.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-d5b222f379b2e8ca.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0a6c2d0e1b68e0e4.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-1507a761e67c2aa9.js +0 -1
- /package/.next/standalone/.next/static/{K8qIdwvKoIWbwQ_f01mnM → 0spgxl3lP26Fl1otd1D7R}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{K8qIdwvKoIWbwQ_f01mnM → 0spgxl3lP26Fl1otd1D7R}/_ssgManifest.js +0 -0
package/cli/credentials.mjs
CHANGED
|
@@ -159,13 +159,26 @@ export function resolveCredentials(flags = {}, deps = {}) {
|
|
|
159
159
|
if (url && apiKey) return { url, apiKey, source: "env" };
|
|
160
160
|
}
|
|
161
161
|
|
|
162
|
-
// 3. Login file (~/.chorus/daemon.json)
|
|
162
|
+
// 3. Login file (~/.chorus/daemon.json): the flat top-level url/apiKey, else the
|
|
163
|
+
// first agents[] entry. The flat top-level agent config is DEPRECATED — `chorus
|
|
164
|
+
// init` now writes credentials only into agents[] — so fall back to agents[0]
|
|
165
|
+
// so this single-credential resolver (install/daemon-setup gate, legacy flat
|
|
166
|
+
// daemon) still resolves from an agents[]-only daemon.json.
|
|
163
167
|
tried.push(`login file (${loginPath}, run \`chorus login\`)`);
|
|
164
168
|
{
|
|
165
169
|
const file = readJson(loginPath);
|
|
166
170
|
if (file) {
|
|
167
|
-
|
|
168
|
-
|
|
171
|
+
let url = nonEmpty(file.url);
|
|
172
|
+
let apiKey = nonEmpty(file.apiKey);
|
|
173
|
+
if (!(url && apiKey) && Array.isArray(file.agents)) {
|
|
174
|
+
const a0 = file.agents.find(
|
|
175
|
+
(a) => a && typeof a === "object" && nonEmpty(a.url) && nonEmpty(a.apiKey),
|
|
176
|
+
);
|
|
177
|
+
if (a0) {
|
|
178
|
+
url = nonEmpty(a0.url);
|
|
179
|
+
apiKey = nonEmpty(a0.apiKey);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
169
182
|
if (url && apiKey) return { url, apiKey, source: "login-file" };
|
|
170
183
|
}
|
|
171
184
|
}
|
|
@@ -194,3 +207,172 @@ export function resolveCredentials(flags = {}, deps = {}) {
|
|
|
194
207
|
" • login: chorus login (persists to ~/.chorus/daemon.json)\n"
|
|
195
208
|
);
|
|
196
209
|
}
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* @typedef {Object} McpCredentials
|
|
213
|
+
* @property {string} url
|
|
214
|
+
* @property {string} apiKey
|
|
215
|
+
* @property {string} label Diagnostic label for the acting identity ("flag" /
|
|
216
|
+
* "env" / a `~/.chorus/daemon.json` agent name/label / the flat-resolution source).
|
|
217
|
+
*/
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Resolve the url + `cho_` API key AND the acting agent identity for the
|
|
221
|
+
* `chorus mcp` command group. Unlike `resolveCredentials`, this understands the
|
|
222
|
+
* multi-agent `agents[]` model and refuses to guess which agent to act as.
|
|
223
|
+
*
|
|
224
|
+
* PROFILE identity (AWS-CLI style): a caller can name WHICH agent to act as by
|
|
225
|
+
* `--agent <name|uuid>` (explicit flag) or the `CHORUS_AGENT_PROFILE` env var,
|
|
226
|
+
* and this resolves that agent's key from `~/.chorus/daemon.json` — the secret
|
|
227
|
+
* never has to be threaded through the caller's environment. A profile matches
|
|
228
|
+
* an `agents[]` entry by its `agentUuid`, `agentName`, or the back-compat
|
|
229
|
+
* `label`/`name` aliases (exact). Ambiguous (matches >1 entry) → hard error.
|
|
230
|
+
*
|
|
231
|
+
* Precedence (owner decision: PREFER profile, fall back to url+key mode when no
|
|
232
|
+
* profile resolves — the key stays written in daemon.json, url+key is the
|
|
233
|
+
* fallback so the CLI-absent curl path still works):
|
|
234
|
+
* 1. Explicit `--agent <name|uuid>` flag → deliberate profile selection from
|
|
235
|
+
* `agents[]`, PREFERRED over an explicit url+key pair (no match → hard error
|
|
236
|
+
* listing agents). With NO `agents[]` it rides along an explicit `--url/--api-key`
|
|
237
|
+
* pair (else the env pair) as the label, else it is a usage error.
|
|
238
|
+
* 2. Explicit `--url` + `--api-key` flags (no `--agent`) → used directly
|
|
239
|
+
* (identity is explicit); a `CHORUS_AGENT_PROFILE` name rides along as the label.
|
|
240
|
+
* 3. `CHORUS_AGENT_PROFILE` env → ambient profile selection from `agents[]`.
|
|
241
|
+
* A match wins over the url+key env pair; NO match falls through (the
|
|
242
|
+
* profile "doesn't exist" → url-mode fallback), an ambiguous match throws.
|
|
243
|
+
* 4. `CHORUS_URL` + `CHORUS_API_KEY` env pair → used directly (url-mode
|
|
244
|
+
* fallback / legacy plugin-hook path); a profile name rides as the label.
|
|
245
|
+
* 5. Exactly one agent in `agents[]` + nothing specified → that agent.
|
|
246
|
+
* 6. More than one agent + nothing specified → hard error (never pick
|
|
247
|
+
* silently), listing the available agents.
|
|
248
|
+
* 7. No `agents[]` → flat resolution via `resolveCredentials`.
|
|
249
|
+
*
|
|
250
|
+
* Each selected agent's `url`/`apiKey` merges over the top-level per-field
|
|
251
|
+
* defaults (`resolveCredentialDefaults`), so an agent that omits a field
|
|
252
|
+
* inherits it.
|
|
253
|
+
*
|
|
254
|
+
* This never imports `cli/daemon-config.mjs` (which imports THIS module) — it
|
|
255
|
+
* reads `agents[]` directly to stay cycle-free; only url/apiKey/label matter for
|
|
256
|
+
* MCP, so per-agent agentType/permissionMode validation is intentionally skipped.
|
|
257
|
+
*
|
|
258
|
+
* @param {{ url?: string, apiKey?: string, agent?: string }} flags
|
|
259
|
+
* @param {ResolveDeps} [deps]
|
|
260
|
+
* @returns {McpCredentials}
|
|
261
|
+
* @throws {Error} on ambiguity, a missing `--agent` label, or nothing resolvable.
|
|
262
|
+
*/
|
|
263
|
+
export function resolveMcpCredentials(flags = {}, deps = {}) {
|
|
264
|
+
const env = deps.env ?? process.env;
|
|
265
|
+
const readJson = deps.readJson ?? readJsonSafe;
|
|
266
|
+
const loginPath = deps.loginPath ?? loginFilePath();
|
|
267
|
+
const flagAgent = nonEmpty(flags.agent);
|
|
268
|
+
const envProfile = nonEmpty(env.CHORUS_AGENT_PROFILE);
|
|
269
|
+
// The profile name a caller asked for, whatever its source — used as the
|
|
270
|
+
// diagnostic label when creds ultimately come from explicit flags / the env pair.
|
|
271
|
+
const wanted = flagAgent ?? envProfile;
|
|
272
|
+
|
|
273
|
+
const envPair = () => {
|
|
274
|
+
const url = nonEmpty(env.CHORUS_URL);
|
|
275
|
+
const apiKey = nonEmpty(env.CHORUS_API_KEY);
|
|
276
|
+
return url && apiKey ? { url, apiKey } : null;
|
|
277
|
+
};
|
|
278
|
+
const flagPair = () => {
|
|
279
|
+
const url = nonEmpty(flags.url);
|
|
280
|
+
const apiKey = nonEmpty(flags.apiKey);
|
|
281
|
+
return url && apiKey ? { url, apiKey } : null;
|
|
282
|
+
};
|
|
283
|
+
|
|
284
|
+
// Read agents[] once and pre-resolve every entry (label, its match keys, and
|
|
285
|
+
// its effective url/apiKey merged over the top-level per-field defaults).
|
|
286
|
+
const file = readJson(loginPath);
|
|
287
|
+
const agentEntries =
|
|
288
|
+
file && Array.isArray(file.agents)
|
|
289
|
+
? file.agents.filter((a) => a && typeof a === "object")
|
|
290
|
+
: [];
|
|
291
|
+
const hasAgents = agentEntries.length > 0;
|
|
292
|
+
const defaults = hasAgents ? resolveCredentialDefaults(flags, deps) : { url: undefined, apiKey: undefined };
|
|
293
|
+
const labelOf = (entry, i) =>
|
|
294
|
+
nonEmpty(entry.agentName) ?? nonEmpty(entry.label) ?? nonEmpty(entry.name) ?? `agents[${i}]`;
|
|
295
|
+
const resolved = agentEntries.map((entry, i) => ({
|
|
296
|
+
label: labelOf(entry, i),
|
|
297
|
+
// A profile may name an entry by its uuid, its display name, or the
|
|
298
|
+
// back-compat label/name aliases.
|
|
299
|
+
keys: [entry.agentUuid, entry.agentName, entry.label, entry.name]
|
|
300
|
+
.map((k) => nonEmpty(k))
|
|
301
|
+
.filter((k) => k !== undefined),
|
|
302
|
+
url: nonEmpty(entry.url) ?? defaults.url,
|
|
303
|
+
apiKey: nonEmpty(entry.apiKey) ?? defaults.apiKey,
|
|
304
|
+
}));
|
|
305
|
+
const labels = resolved.map((a) => a.label).join(", ");
|
|
306
|
+
const pick = (a) => {
|
|
307
|
+
if (!a.url || !a.apiKey) {
|
|
308
|
+
throw new Error(
|
|
309
|
+
`Agent "${a.label}" in ${loginPath} is missing a url or apiKey (and no top-level default supplies it).`,
|
|
310
|
+
);
|
|
311
|
+
}
|
|
312
|
+
return { url: a.url, apiKey: a.apiKey, label: a.label };
|
|
313
|
+
};
|
|
314
|
+
const matchesFor = (name) => resolved.filter((a) => a.keys.includes(name));
|
|
315
|
+
const selectOrThrow = (name, source) => {
|
|
316
|
+
const matches = matchesFor(name);
|
|
317
|
+
if (matches.length === 1) return pick(matches[0]);
|
|
318
|
+
if (matches.length > 1) {
|
|
319
|
+
throw new Error(
|
|
320
|
+
`${source} "${name}" is ambiguous in ${loginPath} — it matches ${matches.length} agents ` +
|
|
321
|
+
`(${matches.map((m) => m.label).join(", ")}). Use the agent UUID to disambiguate.`,
|
|
322
|
+
);
|
|
323
|
+
}
|
|
324
|
+
return null; // no match
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
// 1. Explicit --agent flag: a deliberate profile selection — PREFERRED over an
|
|
328
|
+
// explicit url+key flag pair (owner: "prefer profile"). With NO agents[] to
|
|
329
|
+
// match, it rides an explicit flag pair (else the env pair), using the name
|
|
330
|
+
// as the diagnostic label; with neither it is a usage error.
|
|
331
|
+
if (flagAgent) {
|
|
332
|
+
if (hasAgents) {
|
|
333
|
+
const hit = selectOrThrow(flagAgent, "--agent");
|
|
334
|
+
if (hit) return hit;
|
|
335
|
+
throw new Error(`--agent "${flagAgent}" not found in ${loginPath} agents[]. Available: ${labels}.`);
|
|
336
|
+
}
|
|
337
|
+
const pair = flagPair() ?? envPair();
|
|
338
|
+
if (pair) return { url: pair.url, apiKey: pair.apiKey, label: flagAgent };
|
|
339
|
+
throw new Error(
|
|
340
|
+
`--agent "${flagAgent}" was given but ${loginPath} declares no agents[]. ` +
|
|
341
|
+
`Remove --agent, or configure an agents[] list.`,
|
|
342
|
+
);
|
|
343
|
+
}
|
|
344
|
+
|
|
345
|
+
// 2. Explicit url+key flag pair (no --agent) — identity is explicit.
|
|
346
|
+
{
|
|
347
|
+
const pair = flagPair();
|
|
348
|
+
if (pair) return { url: pair.url, apiKey: pair.apiKey, label: wanted ?? "flag" };
|
|
349
|
+
}
|
|
350
|
+
|
|
351
|
+
// 3. CHORUS_AGENT_PROFILE env: ambient profile selection. A match wins over the
|
|
352
|
+
// url+key env pair; a no-match falls through to url-mode (profile "doesn't
|
|
353
|
+
// exist"); an ambiguous match throws.
|
|
354
|
+
if (envProfile && hasAgents) {
|
|
355
|
+
const hit = selectOrThrow(envProfile, "CHORUS_AGENT_PROFILE");
|
|
356
|
+
if (hit) return hit;
|
|
357
|
+
// no match → fall through to the url-mode fallback below
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
// 4. Env pair (url-mode fallback). Carry the profile name as the label if set.
|
|
361
|
+
{
|
|
362
|
+
const pair = envPair();
|
|
363
|
+
if (pair) return { url: pair.url, apiKey: pair.apiKey, label: wanted ?? "env" };
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// 5/6. agents[] with nothing specified: auto-single, else hard error.
|
|
367
|
+
if (hasAgents) {
|
|
368
|
+
if (resolved.length === 1) return pick(resolved[0]);
|
|
369
|
+
throw new Error(
|
|
370
|
+
`Multiple agents are configured in ${loginPath} (${labels}). ` +
|
|
371
|
+
`Specify which one to act as with --agent <name|uuid> or CHORUS_AGENT_PROFILE.`,
|
|
372
|
+
);
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
// 7. No agents[] → flat resolution (throws the detailed "could not resolve" error).
|
|
376
|
+
const flat = resolveCredentials(flags, deps);
|
|
377
|
+
return { url: flat.url, apiKey: flat.apiKey, label: flat.source };
|
|
378
|
+
}
|
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,19 @@
|
|
|
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
|
-
|
|
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
|
+
*
|
|
22
|
+
* `offline` is a NON-wakeable classification, not a real backend: an agent whose
|
|
23
|
+
* key is parked in daemon.json purely so `chorus mcp` can proxy through it, while
|
|
24
|
+
* the daemon builds NO spawner and dispatches NO wake for it. It is accepted here
|
|
25
|
+
* (and by-name in agent-backend-prompt via this list) so an agents[] entry may set
|
|
26
|
+
* `agentType: "offline"` and pass resolveAgentConfigs' KNOWN_AGENTS validation. The
|
|
27
|
+
* fail-closed no-wake handling lives in spawner-select.mjs (selectSpawner returns
|
|
28
|
+
* an OfflineSpawner that refuses to spawn) — an offline value MUST NOT fall through
|
|
29
|
+
* to the claude-code default and wake it. `chorus agents add` maps every non-wakeable
|
|
30
|
+
* selected agent (opencode/openclaw/pi/dsh) to this classification. */
|
|
31
|
+
export const KNOWN_AGENTS = ["claude-code", "codex", "kiro", "dsh", "offline"];
|
|
23
32
|
|
|
24
33
|
/** The default agent backend when neither --agent nor CHORUS_AGENT is set. */
|
|
25
34
|
export const DEFAULT_AGENT = "claude-code";
|
|
@@ -35,6 +44,12 @@ export const DEFAULT_AGENT = "claude-code";
|
|
|
35
44
|
export function backendCli(agentType) {
|
|
36
45
|
if (agentType === "codex") return { name: "codex", envVar: "CHORUS_CODEX_PATH" };
|
|
37
46
|
if (agentType === "kiro") return { name: "kiro-cli", envVar: "CHORUS_KIRO_PATH" };
|
|
47
|
+
if (agentType === "dsh") return { name: "dsh-jsonrpc-agent", envVar: "CHORUS_DSH_PATH" };
|
|
48
|
+
// `offline` has no CLI to resolve — it is never woken (see backendClientType).
|
|
49
|
+
// The daemon does not probe a binary for it; this explicit descriptor keeps the
|
|
50
|
+
// return sensible if some banner path ever reads it (CHORUS_AGENT selects the
|
|
51
|
+
// backend), instead of mislabeling it as `claude`.
|
|
52
|
+
if (agentType === "offline") return { name: "offline", envVar: "CHORUS_AGENT" };
|
|
38
53
|
return { name: "claude", envVar: "CHORUS_CLAUDE_PATH" };
|
|
39
54
|
}
|
|
40
55
|
|
|
@@ -49,6 +64,16 @@ export function backendCli(agentType) {
|
|
|
49
64
|
export function backendClientType(agentType) {
|
|
50
65
|
if (agentType === "codex") return "codex";
|
|
51
66
|
if (agentType === "kiro") return "kiro";
|
|
67
|
+
if (agentType === "dsh") return "dsh";
|
|
68
|
+
// `offline` is a non-wakeable classification — the daemon SHALL NOT register it
|
|
69
|
+
// as a wakeable connection (daemon-multi-agent spec). It must therefore NOT
|
|
70
|
+
// fall through to the `claude_code` default (which would make an offline agent
|
|
71
|
+
// present as a wakeable claude_code connection). Return the distinct `offline`
|
|
72
|
+
// string: the runtime fan-out skips registering it at all, and this value is
|
|
73
|
+
// intentionally OUTSIDE the server's DAEMON_CLIENT_TYPES allowlist, so any
|
|
74
|
+
// future path that DID try to register it fails closed (server rejects) rather
|
|
75
|
+
// than silently registering it as claude_code.
|
|
76
|
+
if (agentType === "offline") return "offline";
|
|
52
77
|
return "claude_code";
|
|
53
78
|
}
|
|
54
79
|
|
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,13 +306,19 @@ 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 | offline.
|
|
310
|
+
* @property {boolean} [daemonWake] Wake opt-in for a wakeable backend; only
|
|
311
|
+
* `false` disables (absent/true ⇒ woken).
|
|
310
312
|
* @property {Array<string|undefined>} cwds Served paths (`undefined` ⇒ process cwd).
|
|
311
313
|
* @property {"yolo"|"chorus"} permissionMode Woken-agent permission posture.
|
|
312
314
|
* @property {number} maxConcurrency This agent's wake-queue cap.
|
|
313
315
|
* @property {number} sigintTimeoutMs Interrupt escalation window (ms).
|
|
314
316
|
* @property {string[]} browseRoots Directory-discovery allowlist.
|
|
315
317
|
* @property {string} label Diagnostic label ("agent" or "agents[i]").
|
|
318
|
+
* @property {string} [agentUuid] This agent's Chorus UUID — exported to a
|
|
319
|
+
* woken session as CHORUS_AGENT_PROFILE so its
|
|
320
|
+
* hooks/skills resolve the key from daemon.json.
|
|
321
|
+
* @property {string} [agentName] This agent's Chorus display name (profile alias).
|
|
316
322
|
*/
|
|
317
323
|
|
|
318
324
|
/**
|
|
@@ -365,6 +371,8 @@ export function resolveAgentConfigs(flags = {}, deps = {}) {
|
|
|
365
371
|
sigintTimeoutMs: resolveSigintTimeoutMs(flags, deps),
|
|
366
372
|
browseRoots: resolveBrowseRoots(flags, deps),
|
|
367
373
|
label: "agent",
|
|
374
|
+
agentUuid: nonEmptyStr(file?.agentUuid),
|
|
375
|
+
agentName: nonEmptyStr(file?.agentName),
|
|
368
376
|
},
|
|
369
377
|
];
|
|
370
378
|
}
|
|
@@ -433,6 +441,23 @@ export function resolveAgentConfigs(flags = {}, deps = {}) {
|
|
|
433
441
|
const browseRoots =
|
|
434
442
|
entry.browseRoots !== undefined ? cleanCwdList(entry.browseRoots, home) : defaultBrowseRoots;
|
|
435
443
|
|
|
436
|
-
|
|
444
|
+
// daemonWake: per-agent opt-in for daemon waking (pass-through boolean). Only
|
|
445
|
+
// `=== false` disables waking; absent (undefined) or true ⇒ woken, so agent
|
|
446
|
+
// entries written before this field existed keep being woken. Orthogonal to
|
|
447
|
+
// agentType (offline is never woken regardless).
|
|
448
|
+
return {
|
|
449
|
+
url,
|
|
450
|
+
apiKey,
|
|
451
|
+
agentType,
|
|
452
|
+
cwds,
|
|
453
|
+
permissionMode,
|
|
454
|
+
maxConcurrency,
|
|
455
|
+
sigintTimeoutMs,
|
|
456
|
+
browseRoots,
|
|
457
|
+
daemonWake: entry.daemonWake,
|
|
458
|
+
label,
|
|
459
|
+
agentUuid: nonEmptyStr(entry.agentUuid),
|
|
460
|
+
agentName: nonEmptyStr(entry.agentName),
|
|
461
|
+
};
|
|
437
462
|
});
|
|
438
463
|
}
|
|
@@ -27,9 +27,11 @@ import { updateDaemonConfig, appendAgentConfig, prompt as defaultPrompt } from "
|
|
|
27
27
|
import { validateAndFetchIdentity } from "./chorus-client.mjs";
|
|
28
28
|
import { normalizeCwd, cleanCwdList } from "./daemon-config.mjs";
|
|
29
29
|
import { KNOWN_AGENTS, DEFAULT_AGENT } from "./daemon-agent.mjs";
|
|
30
|
+
import { AGENT_MENU, promptAgentBackend } from "./agent-backend-prompt.mjs";
|
|
30
31
|
import { agentNotFoundWarningLine } from "./daemon-banner.mjs";
|
|
31
32
|
import { resolveClaudePath } from "./claude-spawner.mjs";
|
|
32
33
|
import { resolveCodexPath } from "./codex-spawner.mjs";
|
|
34
|
+
import { resolveDshPath } from "./dsh-spawner.mjs";
|
|
33
35
|
import { resolveKiroPath } from "./kiro-spawner.mjs";
|
|
34
36
|
import { readFileSync } from "node:fs";
|
|
35
37
|
|
|
@@ -160,12 +162,20 @@ export async function resolveInstallCredentials(flags = {}, env = {}, opts = {})
|
|
|
160
162
|
);
|
|
161
163
|
continue;
|
|
162
164
|
}
|
|
163
|
-
|
|
165
|
+
// Which backend for this agent? Explicit --agent wins; otherwise the menu
|
|
166
|
+
// (we're already on a TTY here). undefined → omit agentType so the entry
|
|
167
|
+
// inherits the daemon default at resolve time (never a literal claude-code).
|
|
168
|
+
let at = nonEmpty(flags.agent);
|
|
169
|
+
if (!at) at = await promptAgentBackend({ ask, log, isTTY });
|
|
170
|
+
const agentObj = { url: u, apiKey: k, agentUuid: id.uuid, agentName: id.name };
|
|
171
|
+
if (at) agentObj.agentType = at;
|
|
172
|
+
const res = appendAgent(agentObj);
|
|
164
173
|
if (!res.ok) {
|
|
165
174
|
errLog(`[Chorus] agent ${id.name} (${id.uuid}) is already configured — skipping.`);
|
|
166
175
|
continue;
|
|
167
176
|
}
|
|
168
|
-
|
|
177
|
+
const backendNote = at ? ` (backend: ${at})` : "";
|
|
178
|
+
log(`[Chorus] added agent ${id.name} (${id.uuid})${backendNote} — this daemon now serves ${res.agents.length} agents.`);
|
|
169
179
|
}
|
|
170
180
|
}
|
|
171
181
|
|
|
@@ -242,7 +252,6 @@ export async function resolveInstallCwds(flags = {}, opts = {}) {
|
|
|
242
252
|
const first = nonEmpty(await ask(`Working directory [${defaultCwd}] (Enter to accept the default): `));
|
|
243
253
|
collected.push(first ?? defaultCwd);
|
|
244
254
|
// subsequent adds
|
|
245
|
-
// eslint-disable-next-line no-constant-condition
|
|
246
255
|
while (true) {
|
|
247
256
|
const next = nonEmpty(await ask("Add another working directory (blank to finish): "));
|
|
248
257
|
if (!next) break;
|
|
@@ -280,25 +289,23 @@ export async function resolveInstallBrowseRoots(flags = {}, opts = {}) {
|
|
|
280
289
|
return { browseRoots };
|
|
281
290
|
}
|
|
282
291
|
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
{ value: "claude-code", label: "Claude Code (default)" },
|
|
290
|
-
{ value: "codex", label: "Codex CLI" },
|
|
291
|
-
{ value: "kiro", label: "Kiro CLI" },
|
|
292
|
-
];
|
|
292
|
+
// The interactive agent-backend menu (`AGENT_MENU`) now lives in
|
|
293
|
+
// ./agent-backend-prompt.mjs as the single source of truth shared with the
|
|
294
|
+
// add/login flows (imported above), so every backend prompt advertises the same
|
|
295
|
+
// list and never drifts. resolveInstallAgent keeps its own inline menu render
|
|
296
|
+
// below (its empty→DEFAULT_AGENT semantics differ from promptAgentBackend's
|
|
297
|
+
// empty→undefined) but reads the same AGENT_MENU rows.
|
|
293
298
|
|
|
294
299
|
/** Probe the selected backend's CLI on PATH. Returns the resolved path or null.
|
|
295
300
|
* Injectable per backend so the check is testable without a real PATH. */
|
|
296
301
|
function probeAgentCli(agent, probes = {}) {
|
|
297
302
|
const findClaude = probes.resolveClaudePath ?? resolveClaudePath;
|
|
298
303
|
const findCodex = probes.resolveCodexPath ?? resolveCodexPath;
|
|
304
|
+
const findDsh = probes.resolveDshPath ?? resolveDshPath;
|
|
299
305
|
const findKiro = probes.resolveKiroPath ?? resolveKiroPath;
|
|
300
306
|
if (agent === "codex") return findCodex();
|
|
301
307
|
if (agent === "kiro") return findKiro();
|
|
308
|
+
if (agent === "dsh") return findDsh();
|
|
302
309
|
return findClaude();
|
|
303
310
|
}
|
|
304
311
|
|
|
@@ -331,7 +338,7 @@ function probeAgentCli(agent, probes = {}) {
|
|
|
331
338
|
* loginPath?: string,
|
|
332
339
|
* writeConfig?: (partial: Record<string, unknown>) => string,
|
|
333
340
|
* prompt?: typeof defaultPrompt,
|
|
334
|
-
* probes?: { resolveClaudePath?: Function, resolveCodexPath?: Function, resolveKiroPath?: Function },
|
|
341
|
+
* probes?: { resolveClaudePath?: Function, resolveCodexPath?: Function, resolveKiroPath?: Function, resolveDshPath?: Function },
|
|
335
342
|
* log?: (m: string) => void,
|
|
336
343
|
* errLog?: (m: string) => void,
|
|
337
344
|
* }} [opts]
|
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
// the existing server endpoints accept, so the two daemon hosts — the chorus CLI daemon
|
|
5
5
|
// (`cli/daemon.mjs`) and the OpenClaw plugin — cannot drift in the wire contract.
|
|
6
6
|
//
|
|
7
|
-
// The
|
|
8
|
-
// src/app/api/daemon/*/route.ts
|
|
7
|
+
// The operations and payload fields this client supports (verified against
|
|
8
|
+
// src/app/api/daemon/*/route.ts):
|
|
9
9
|
// turnAdvance → POST /api/daemon/turn-advance
|
|
10
|
-
// { connectionUuid, sessionId, status,
|
|
10
|
+
// { connectionUuid, sessionId, status, turnUuid?,
|
|
11
|
+
// backendSessionId?, entityType?, entityUuid?,
|
|
12
|
+
// interruptedReason?, transcriptRelayError?, usage?,
|
|
11
13
|
// coalescedCount? }
|
|
12
14
|
// transcript → POST /api/daemon/transcript
|
|
13
15
|
// { sessionId, messages: [{ role, text }] }
|
|
@@ -71,7 +73,7 @@ const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
|
71
73
|
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
72
74
|
* }} opts
|
|
73
75
|
* @returns {{
|
|
74
|
-
* turnAdvance: (p: { sessionId: string, backendSessionId?: string|null, status: string, entityType?: string|null, entityUuid?: string|null, coalescedCount?: number }) => Promise<DaemonRestResult>,
|
|
76
|
+
* turnAdvance: (p: { sessionId: string, turnUuid?: string|null, backendSessionId?: string|null, status: string, entityType?: string|null, entityUuid?: string|null, coalescedCount?: number }) => Promise<DaemonRestResult>,
|
|
75
77
|
* transcript: (p: { sessionId: string, messages: Array<{ role: string, text: string }> }) => Promise<DaemonRestResult>,
|
|
76
78
|
* executionState: (p: { executions: Array<Record<string, unknown>> }) => Promise<DaemonRestResult>,
|
|
77
79
|
* reportInterrupt: (p: { entityType: string, entityUuid: string, reason: string }) => Promise<DaemonRestResult>,
|
|
@@ -111,7 +113,7 @@ export function createDaemonRestClient(opts) {
|
|
|
111
113
|
* established op-prefixed message.
|
|
112
114
|
* @returns {Promise<DaemonRestResult>}
|
|
113
115
|
*/
|
|
114
|
-
async function post(op, path, body, successLog, context = "") {
|
|
116
|
+
async function post(op, path, body, successLog, context = "", readData = false) {
|
|
115
117
|
let response;
|
|
116
118
|
try {
|
|
117
119
|
response = await fetchImpl(`${url}${path}`, {
|
|
@@ -131,8 +133,19 @@ export function createDaemonRestClient(opts) {
|
|
|
131
133
|
logger.warn(`[Chorus] ${error}`);
|
|
132
134
|
return { ok: false, status: response.status, error };
|
|
133
135
|
}
|
|
136
|
+
let data;
|
|
137
|
+
if (readData) {
|
|
138
|
+
try {
|
|
139
|
+
const parsed = await response.json();
|
|
140
|
+
data = parsed && typeof parsed === "object" ? parsed.data : undefined;
|
|
141
|
+
} catch (err) {
|
|
142
|
+
// Mixed-version fallback: older servers may return an empty successful body.
|
|
143
|
+
// Keep the lifecycle report successful, but make the missing correlation visible.
|
|
144
|
+
logger.warn(`[Chorus] ${op} response correlation unavailable: ${err}`);
|
|
145
|
+
}
|
|
146
|
+
}
|
|
134
147
|
if (successLog) logger.info(`[Chorus] ${successLog}`);
|
|
135
|
-
return { ok: true, status: response.status };
|
|
148
|
+
return { ok: true, status: response.status, ...(data !== undefined ? { data } : {}) };
|
|
136
149
|
}
|
|
137
150
|
|
|
138
151
|
return {
|
|
@@ -148,7 +161,7 @@ export function createDaemonRestClient(opts) {
|
|
|
148
161
|
* the turn's usage. Both ride the terminal edge only. Requires the connectionUuid (the
|
|
149
162
|
* server addresses the turn against a connection the agent owns).
|
|
150
163
|
*/
|
|
151
|
-
async turnAdvance({ sessionId, status, entityType, entityUuid, interruptedReason, transcriptRelayError, usage, backendSessionId, coalescedCount }) {
|
|
164
|
+
async turnAdvance({ sessionId, turnUuid, status, entityType, entityUuid, interruptedReason, transcriptRelayError, usage, backendSessionId, coalescedCount }) {
|
|
152
165
|
const connectionUuid = getConnectionUuid();
|
|
153
166
|
if (!connectionUuid) {
|
|
154
167
|
const error = `cannot advance turn for session ${sessionId} → ${status} — no connection uuid yet`;
|
|
@@ -164,6 +177,7 @@ export function createDaemonRestClient(opts) {
|
|
|
164
177
|
connectionUuid,
|
|
165
178
|
sessionId,
|
|
166
179
|
status,
|
|
180
|
+
...(turnUuid ? { turnUuid } : {}),
|
|
167
181
|
// Only sent when BOTH are present, so the server never gets a partial linkage.
|
|
168
182
|
...(entityType && entityUuid ? { entityType, entityUuid } : {}),
|
|
169
183
|
// Only meaningful alongside status=interrupted; never sent otherwise.
|
|
@@ -182,12 +196,21 @@ export function createDaemonRestClient(opts) {
|
|
|
182
196
|
? { coalescedCount }
|
|
183
197
|
: {}),
|
|
184
198
|
};
|
|
185
|
-
|
|
199
|
+
const result = await post(
|
|
186
200
|
"turn-advance",
|
|
187
201
|
"/api/daemon/turn-advance",
|
|
188
202
|
body,
|
|
189
203
|
`advanced turn for session ${sessionId} → ${status}`,
|
|
204
|
+
"",
|
|
205
|
+
status === "running",
|
|
190
206
|
);
|
|
207
|
+
const resolvedTurnUuid =
|
|
208
|
+
typeof result.data?.turn?.uuid === "string" ? result.data.turn.uuid : null;
|
|
209
|
+
if (status !== "running") return result;
|
|
210
|
+
const { data: _rawData, ...baseResult } = result;
|
|
211
|
+
return resolvedTurnUuid
|
|
212
|
+
? { ...baseResult, data: { turnUuid: resolvedTurnUuid } }
|
|
213
|
+
: baseResult;
|
|
191
214
|
},
|
|
192
215
|
|
|
193
216
|
/**
|