@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
|
@@ -0,0 +1,445 @@
|
|
|
1
|
+
// External DeepSeek Harness SDK runtime bridge. One fresh JSON-RPC runtime and
|
|
2
|
+
// session are created per wake; no dsh session state is persisted by Chorus.
|
|
3
|
+
|
|
4
|
+
import { spawn } from "node:child_process";
|
|
5
|
+
import { randomUUID } from "node:crypto";
|
|
6
|
+
import { statSync } from "node:fs";
|
|
7
|
+
import { win32 as pathWin32, posix as pathPosix } from "node:path";
|
|
8
|
+
import { prepareManagedDshConfig } from "./dsh-managed-config.mjs";
|
|
9
|
+
|
|
10
|
+
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
11
|
+
export const DEFAULT_DSH_TIMEOUT_MS = 30 * 60 * 1000;
|
|
12
|
+
export const DEFAULT_DSH_SHUTDOWN_TIMEOUT_MS = 5_000;
|
|
13
|
+
|
|
14
|
+
function nonEmpty(value) {
|
|
15
|
+
return typeof value === "string" && value.trim() ? value.trim() : null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
function positiveInt(value, fallback) {
|
|
19
|
+
const parsed = Number(value);
|
|
20
|
+
return Number.isSafeInteger(parsed) && parsed > 0 ? parsed : fallback;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function isFile(path) {
|
|
24
|
+
try {
|
|
25
|
+
return statSync(path).isFile();
|
|
26
|
+
} catch {
|
|
27
|
+
return false;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** Resolve the external SDK runtime. CHORUS_DSH_PATH overrides PATH. */
|
|
32
|
+
export function resolveDshPath(deps = {}) {
|
|
33
|
+
const env = deps.env ?? process.env;
|
|
34
|
+
const platform = deps.platform ?? process.platform;
|
|
35
|
+
const fileProbe = deps.isFile ?? isFile;
|
|
36
|
+
const override = nonEmpty(env.CHORUS_DSH_PATH);
|
|
37
|
+
if (override && fileProbe(override)) return override;
|
|
38
|
+
|
|
39
|
+
const windows = platform === "win32";
|
|
40
|
+
const path = windows ? pathWin32 : pathPosix;
|
|
41
|
+
const names = windows
|
|
42
|
+
? ["dsh-jsonrpc-agent.cmd", "dsh-jsonrpc-agent.exe", "dsh-jsonrpc-agent"]
|
|
43
|
+
: ["dsh-jsonrpc-agent"];
|
|
44
|
+
const dirs = (env.PATH || env.Path || "").split(path.delimiter).filter(Boolean);
|
|
45
|
+
for (const dir of dirs) {
|
|
46
|
+
for (const name of names) {
|
|
47
|
+
const candidate = path.join(dir, name);
|
|
48
|
+
if (fileProbe(candidate)) return candidate;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/** Resolve the required Cordis composition without placing it in argv. */
|
|
55
|
+
export function resolveDshConfig(env = process.env) {
|
|
56
|
+
return nonEmpty(env.CHORUS_DSH_CONFIG) ?? nonEmpty(env.DSH_CORDIS_CONFIG);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Windows npm command shims need cmd.exe while retaining argv isolation. */
|
|
60
|
+
export function resolveDshSpawnCommand(dshPath, platform = process.platform, env = process.env) {
|
|
61
|
+
const lower = dshPath.toLowerCase();
|
|
62
|
+
if (platform === "win32" && (lower.endsWith(".cmd") || lower.endsWith(".bat"))) {
|
|
63
|
+
return {
|
|
64
|
+
command: env.ComSpec || env.COMSPEC || "cmd.exe",
|
|
65
|
+
argv: ["/d", "/s", "/c", dshPath],
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return { command: dshPath, argv: [] };
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function tokenCount(value) {
|
|
72
|
+
return Number.isSafeInteger(value) && value >= 0 ? value : null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
/** Add one upstream TokenUsage object into the per-wake disjoint totals. */
|
|
76
|
+
export function addDshUsage(total, usage) {
|
|
77
|
+
if (!usage || typeof usage !== "object") return total;
|
|
78
|
+
for (const [source, target] of [
|
|
79
|
+
["inputTokens", "inputTokens"],
|
|
80
|
+
["outputTokens", "outputTokens"],
|
|
81
|
+
["cacheWriteTokens", "cacheCreationTokens"],
|
|
82
|
+
["cacheReadTokens", "cacheReadTokens"],
|
|
83
|
+
]) {
|
|
84
|
+
const count = tokenCount(usage[source]);
|
|
85
|
+
if (count === null) continue;
|
|
86
|
+
total[target] = (total[target] ?? 0) + count;
|
|
87
|
+
}
|
|
88
|
+
return total;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
function hasVisibleAssistantContent(data) {
|
|
92
|
+
const content = data?.message?.content;
|
|
93
|
+
return Array.isArray(content) && content.length > 0;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
function containsReceipt(event, messageId) {
|
|
97
|
+
if (event?.type !== "agent/inbox/spliced" || !Array.isArray(event?.data?.inserted)) return false;
|
|
98
|
+
return event.data.inserted.some((message) => message && message.id === messageId);
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
function deferred() {
|
|
102
|
+
let resolve;
|
|
103
|
+
let reject;
|
|
104
|
+
const promise = new Promise((res, rej) => {
|
|
105
|
+
resolve = res;
|
|
106
|
+
reject = rej;
|
|
107
|
+
});
|
|
108
|
+
return { promise, resolve, reject };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
function errorText(error) {
|
|
112
|
+
return error instanceof Error ? error.message : String(error);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
function withTimeout(promise, timeoutMs, message) {
|
|
116
|
+
let timer;
|
|
117
|
+
return Promise.race([
|
|
118
|
+
promise,
|
|
119
|
+
new Promise((_, reject) => {
|
|
120
|
+
timer = setTimeout(() => reject(new Error(message)), timeoutMs);
|
|
121
|
+
timer.unref?.();
|
|
122
|
+
}),
|
|
123
|
+
]).finally(() => clearTimeout(timer));
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
export class DshSpawner {
|
|
127
|
+
constructor(opts = {}) {
|
|
128
|
+
this.sessionDecision = { probeIsAuthoritative: false };
|
|
129
|
+
this.dshPath = opts.dshPath ?? null;
|
|
130
|
+
this.spawnImpl = opts.spawnImpl ?? spawn;
|
|
131
|
+
this.resolveDshPathFn = opts.resolveDshPathFn ?? resolveDshPath;
|
|
132
|
+
this.uuidFn = opts.uuidFn ?? randomUUID;
|
|
133
|
+
this.logger = opts.logger ?? NOOP_LOGGER;
|
|
134
|
+
this.creds = opts.creds ?? null;
|
|
135
|
+
this.platform = opts.platform ?? process.platform;
|
|
136
|
+
this.env = opts.env ?? process.env;
|
|
137
|
+
this.bundleVersion = opts.bundleVersion ?? null;
|
|
138
|
+
this.prepareManagedConfigFn = opts.prepareManagedConfigFn ?? prepareManagedDshConfig;
|
|
139
|
+
this.timeoutMs = opts.timeoutMs ?? positiveInt(this.env.CHORUS_DSH_TIMEOUT_MS, DEFAULT_DSH_TIMEOUT_MS);
|
|
140
|
+
this.shutdownTimeoutMs =
|
|
141
|
+
opts.shutdownTimeoutMs ??
|
|
142
|
+
positiveInt(this.env.CHORUS_DSH_SHUTDOWN_TIMEOUT_MS, DEFAULT_DSH_SHUTDOWN_TIMEOUT_MS);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
async wake({ prompt, sessionId: anchor, cwd, onMessage, onChild }) {
|
|
146
|
+
let dshPath = this.dshPath ?? this.resolveDshPathFn({ env: this.env, platform: this.platform });
|
|
147
|
+
let config = resolveDshConfig(this.env);
|
|
148
|
+
const result = (backendSessionId, exitCode) => ({
|
|
149
|
+
sessionId: backendSessionId || anchor || "",
|
|
150
|
+
backendSessionId: backendSessionId || null,
|
|
151
|
+
exitCode,
|
|
152
|
+
isNew: true,
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
if (!dshPath) {
|
|
156
|
+
this.logger.error(
|
|
157
|
+
"[Chorus] cannot locate `dsh-jsonrpc-agent`; install it or set CHORUS_DSH_PATH",
|
|
158
|
+
);
|
|
159
|
+
return result(null, null);
|
|
160
|
+
}
|
|
161
|
+
if (!config) {
|
|
162
|
+
try {
|
|
163
|
+
const managed = await this.prepareManagedConfigFn({
|
|
164
|
+
env: this.env,
|
|
165
|
+
bundleVersion: this.bundleVersion,
|
|
166
|
+
dshPath,
|
|
167
|
+
creds: this.creds,
|
|
168
|
+
});
|
|
169
|
+
config = managed.configPath;
|
|
170
|
+
dshPath = managed.runtimePath ?? dshPath;
|
|
171
|
+
} catch (error) {
|
|
172
|
+
this.logger.error(`[Chorus] cannot prepare managed dsh config: ${errorText(error)}`);
|
|
173
|
+
return result(null, null);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const dshSessionId = `chorus-${this.uuidFn().replaceAll("-", "")}`;
|
|
178
|
+
const provider =
|
|
179
|
+
nonEmpty(this.env.CHORUS_DSH_PROVIDER) ?? nonEmpty(this.env.DSH_PROVIDER) ?? "deepseek-official";
|
|
180
|
+
const model =
|
|
181
|
+
nonEmpty(this.env.CHORUS_DSH_MODEL) ?? nonEmpty(this.env.DSH_MODEL) ?? "deepseek-v4-flash";
|
|
182
|
+
const childEnv = {
|
|
183
|
+
...this.env,
|
|
184
|
+
CHORUS_DAEMON_HEADLESS: "1",
|
|
185
|
+
DSH_CORDIS_CONFIG: config,
|
|
186
|
+
DSH_CWD: cwd || process.cwd(),
|
|
187
|
+
};
|
|
188
|
+
if (this.creds?.url) childEnv.CHORUS_URL = this.creds.url;
|
|
189
|
+
if (this.creds?.apiKey) childEnv.CHORUS_API_KEY = this.creds.apiKey;
|
|
190
|
+
// Identity profile — the dsh doc-mirror wrapper passes this to `chorus mcp
|
|
191
|
+
// --agent` (resolving the key from ~/.chorus/daemon.json). dsh scrubs
|
|
192
|
+
// credential-shaped env from tool subprocesses; the profile is not a secret,
|
|
193
|
+
// and the wrapper also reads it from $DSH_HOME/.env, so url/apiKey remain the
|
|
194
|
+
// reliable fallback when it doesn't survive.
|
|
195
|
+
if (this.creds?.agentUuid || this.creds?.agentName)
|
|
196
|
+
childEnv.CHORUS_AGENT_PROFILE = this.creds.agentUuid || this.creds.agentName;
|
|
197
|
+
|
|
198
|
+
const { command, argv } = resolveDshSpawnCommand(dshPath, this.platform, childEnv);
|
|
199
|
+
let child;
|
|
200
|
+
try {
|
|
201
|
+
child = this.spawnImpl(command, argv, {
|
|
202
|
+
cwd: cwd || undefined,
|
|
203
|
+
env: childEnv,
|
|
204
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
205
|
+
shell: false,
|
|
206
|
+
detached: this.platform !== "win32",
|
|
207
|
+
windowsHide: true,
|
|
208
|
+
});
|
|
209
|
+
} catch (error) {
|
|
210
|
+
this.logger.error(`[Chorus] failed to start dsh runtime: ${errorText(error)}`);
|
|
211
|
+
return result(dshSessionId, null);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
try {
|
|
215
|
+
onChild?.(child);
|
|
216
|
+
} catch (error) {
|
|
217
|
+
this.logger.warn(`[Chorus] onChild handler threw: ${errorText(error)}`);
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
child.stdout?.setEncoding?.("utf8");
|
|
221
|
+
child.stderr?.setEncoding?.("utf8");
|
|
222
|
+
child.stdin?.on?.("error", () => {});
|
|
223
|
+
|
|
224
|
+
const closed = deferred();
|
|
225
|
+
const failed = deferred();
|
|
226
|
+
// A rejected failure promise is raced below; attaching this handler prevents
|
|
227
|
+
// a process-exit rejection from becoming unhandled during successful setup.
|
|
228
|
+
failed.promise.catch(() => {});
|
|
229
|
+
let exitCode;
|
|
230
|
+
let closeSeen = false;
|
|
231
|
+
let protocolDone = false;
|
|
232
|
+
let stdoutBuffer = "";
|
|
233
|
+
let stderrBuffer = "";
|
|
234
|
+
let serial = 0;
|
|
235
|
+
const pending = new Map();
|
|
236
|
+
const notifications = [];
|
|
237
|
+
let notificationCursor = 0;
|
|
238
|
+
let messageId = null;
|
|
239
|
+
let receiptSeen = false;
|
|
240
|
+
const idle = deferred();
|
|
241
|
+
idle.promise.catch(() => {});
|
|
242
|
+
const usage = {
|
|
243
|
+
inputTokens: null,
|
|
244
|
+
outputTokens: null,
|
|
245
|
+
cacheCreationTokens: null,
|
|
246
|
+
cacheReadTokens: null,
|
|
247
|
+
};
|
|
248
|
+
|
|
249
|
+
const fail = (message) => {
|
|
250
|
+
if (protocolDone) return;
|
|
251
|
+
protocolDone = true;
|
|
252
|
+
const error = message instanceof Error ? message : new Error(String(message));
|
|
253
|
+
for (const waiter of pending.values()) waiter.reject(error);
|
|
254
|
+
pending.clear();
|
|
255
|
+
idle.reject(error);
|
|
256
|
+
failed.reject(error);
|
|
257
|
+
};
|
|
258
|
+
|
|
259
|
+
const emit = (frame) => {
|
|
260
|
+
try {
|
|
261
|
+
onMessage?.(frame);
|
|
262
|
+
} catch (error) {
|
|
263
|
+
this.logger.warn(`[Chorus] onMessage handler threw: ${errorText(error)}`);
|
|
264
|
+
}
|
|
265
|
+
};
|
|
266
|
+
|
|
267
|
+
const processNotifications = () => {
|
|
268
|
+
if (!messageId || protocolDone) return;
|
|
269
|
+
while (notificationCursor < notifications.length) {
|
|
270
|
+
const notification = notifications[notificationCursor++];
|
|
271
|
+
const params = notification.params;
|
|
272
|
+
if (params?.sessionId !== dshSessionId) continue;
|
|
273
|
+
if (!receiptSeen) {
|
|
274
|
+
if (notification.method === "session.event" && containsReceipt(params.event, messageId)) {
|
|
275
|
+
receiptSeen = true;
|
|
276
|
+
}
|
|
277
|
+
continue;
|
|
278
|
+
}
|
|
279
|
+
if (notification.method === "session.event") {
|
|
280
|
+
const event = params.event;
|
|
281
|
+
if (!event || typeof event !== "object" || typeof event.type !== "string") {
|
|
282
|
+
fail("dsh session.event carried a malformed event envelope");
|
|
283
|
+
return;
|
|
284
|
+
}
|
|
285
|
+
if (event.type === "assistant/message") addDshUsage(usage, event.data?.usage);
|
|
286
|
+
if (event.type === "user/message" || (event.type === "assistant/message" && hasVisibleAssistantContent(event.data))) {
|
|
287
|
+
emit({ type: event.type, session_id: dshSessionId, data: event.data });
|
|
288
|
+
}
|
|
289
|
+
} else if (notification.method === "session.status" && params.status === "idle") {
|
|
290
|
+
idle.resolve();
|
|
291
|
+
return;
|
|
292
|
+
}
|
|
293
|
+
}
|
|
294
|
+
};
|
|
295
|
+
|
|
296
|
+
const handleFrame = (frame) => {
|
|
297
|
+
if (!frame || typeof frame !== "object" || frame.jsonrpc !== "2.0") {
|
|
298
|
+
fail("dsh runtime emitted a malformed JSON-RPC frame");
|
|
299
|
+
return;
|
|
300
|
+
}
|
|
301
|
+
if ((typeof frame.id === "string" || typeof frame.id === "number") && !frame.method) {
|
|
302
|
+
const waiter = pending.get(frame.id);
|
|
303
|
+
if (!waiter) return;
|
|
304
|
+
pending.delete(frame.id);
|
|
305
|
+
if (frame.error && typeof frame.error === "object") {
|
|
306
|
+
waiter.reject(
|
|
307
|
+
new Error(
|
|
308
|
+
`dsh JSON-RPC error ${frame.error.code ?? ""}: ${frame.error.message ?? "unknown error"}`,
|
|
309
|
+
),
|
|
310
|
+
);
|
|
311
|
+
} else {
|
|
312
|
+
waiter.resolve(frame.result);
|
|
313
|
+
}
|
|
314
|
+
return;
|
|
315
|
+
}
|
|
316
|
+
if (typeof frame.method === "string" && frame.id === undefined) {
|
|
317
|
+
notifications.push({
|
|
318
|
+
method: frame.method,
|
|
319
|
+
params: frame.params && typeof frame.params === "object" && !Array.isArray(frame.params)
|
|
320
|
+
? frame.params
|
|
321
|
+
: {},
|
|
322
|
+
});
|
|
323
|
+
processNotifications();
|
|
324
|
+
}
|
|
325
|
+
};
|
|
326
|
+
|
|
327
|
+
child.stdout?.on?.("data", (chunk) => {
|
|
328
|
+
stdoutBuffer += String(chunk);
|
|
329
|
+
for (;;) {
|
|
330
|
+
const newline = stdoutBuffer.indexOf("\n");
|
|
331
|
+
if (newline < 0) break;
|
|
332
|
+
const line = stdoutBuffer.slice(0, newline).trim();
|
|
333
|
+
stdoutBuffer = stdoutBuffer.slice(newline + 1);
|
|
334
|
+
if (!line) continue;
|
|
335
|
+
try {
|
|
336
|
+
handleFrame(JSON.parse(line));
|
|
337
|
+
} catch {
|
|
338
|
+
fail("dsh runtime emitted malformed JSON on stdout");
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
});
|
|
342
|
+
child.stderr?.on?.("data", (chunk) => {
|
|
343
|
+
stderrBuffer += String(chunk);
|
|
344
|
+
for (;;) {
|
|
345
|
+
const newline = stderrBuffer.indexOf("\n");
|
|
346
|
+
if (newline < 0) break;
|
|
347
|
+
const line = stderrBuffer.slice(0, newline).trim();
|
|
348
|
+
stderrBuffer = stderrBuffer.slice(newline + 1);
|
|
349
|
+
if (line) this.logger.warn(`[dsh] ${line}`);
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
child.on?.("error", (error) => fail(`dsh runtime process error: ${errorText(error)}`));
|
|
353
|
+
child.on?.("close", (code) => {
|
|
354
|
+
closeSeen = true;
|
|
355
|
+
exitCode = code;
|
|
356
|
+
if (stderrBuffer.trim()) this.logger.warn(`[dsh] ${stderrBuffer.trim()}`);
|
|
357
|
+
if (!protocolDone) fail(`dsh runtime exited before protocol completion (code ${code})`);
|
|
358
|
+
closed.resolve(code);
|
|
359
|
+
});
|
|
360
|
+
|
|
361
|
+
const request = (method, params = {}) => {
|
|
362
|
+
const id = `chorus_${++serial}`;
|
|
363
|
+
return new Promise((resolve, reject) => {
|
|
364
|
+
pending.set(id, { resolve, reject });
|
|
365
|
+
try {
|
|
366
|
+
child.stdin.write(`${JSON.stringify({ jsonrpc: "2.0", id, method, params })}\n`);
|
|
367
|
+
} catch (error) {
|
|
368
|
+
pending.delete(id);
|
|
369
|
+
reject(error);
|
|
370
|
+
}
|
|
371
|
+
});
|
|
372
|
+
};
|
|
373
|
+
|
|
374
|
+
const stopRuntime = async () => {
|
|
375
|
+
if (closeSeen) return;
|
|
376
|
+
try {
|
|
377
|
+
child.stdin?.end?.();
|
|
378
|
+
} catch {}
|
|
379
|
+
try {
|
|
380
|
+
await withTimeout(closed.promise, this.shutdownTimeoutMs, "dsh runtime did not exit after stdin closed");
|
|
381
|
+
} catch {
|
|
382
|
+
try {
|
|
383
|
+
child.kill?.("SIGTERM");
|
|
384
|
+
} catch {}
|
|
385
|
+
}
|
|
386
|
+
};
|
|
387
|
+
|
|
388
|
+
try {
|
|
389
|
+
const initialize = await withTimeout(
|
|
390
|
+
Promise.race([
|
|
391
|
+
request("initialize", { cwd: cwd || process.cwd(), provider, model }),
|
|
392
|
+
failed.promise,
|
|
393
|
+
]),
|
|
394
|
+
this.shutdownTimeoutMs,
|
|
395
|
+
"dsh initialize timed out",
|
|
396
|
+
);
|
|
397
|
+
if (initialize?.serverInfo?.name !== "deepseek-harness-sdk-runtime") {
|
|
398
|
+
throw new Error("dsh initialize returned an unexpected server identity");
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
const promptResult = await withTimeout(
|
|
402
|
+
Promise.race([
|
|
403
|
+
request("session/prompt", {
|
|
404
|
+
sessionId: dshSessionId,
|
|
405
|
+
contentBlocks: [{ type: "text", text: String(prompt ?? "") }],
|
|
406
|
+
}),
|
|
407
|
+
failed.promise,
|
|
408
|
+
]),
|
|
409
|
+
this.shutdownTimeoutMs,
|
|
410
|
+
"dsh session/prompt timed out",
|
|
411
|
+
);
|
|
412
|
+
if (!nonEmpty(promptResult?.messageId)) {
|
|
413
|
+
throw new Error("dsh session/prompt returned no messageId");
|
|
414
|
+
}
|
|
415
|
+
messageId = promptResult.messageId;
|
|
416
|
+
processNotifications();
|
|
417
|
+
|
|
418
|
+
await withTimeout(
|
|
419
|
+
Promise.race([idle.promise, failed.promise]),
|
|
420
|
+
this.timeoutMs,
|
|
421
|
+
`dsh turn timed out after ${this.timeoutMs}ms waiting for root idle`,
|
|
422
|
+
);
|
|
423
|
+
emit({
|
|
424
|
+
type: "dsh.turn.completed",
|
|
425
|
+
session_id: dshSessionId,
|
|
426
|
+
usage: { ...usage, model, source: "dsh" },
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
await withTimeout(
|
|
430
|
+
Promise.race([request("shutdown"), failed.promise]),
|
|
431
|
+
this.shutdownTimeoutMs,
|
|
432
|
+
"dsh shutdown timed out",
|
|
433
|
+
);
|
|
434
|
+
protocolDone = true;
|
|
435
|
+
child.stdin?.end?.();
|
|
436
|
+
await withTimeout(closed.promise, this.shutdownTimeoutMs, "dsh runtime did not exit after shutdown");
|
|
437
|
+
return result(dshSessionId, exitCode);
|
|
438
|
+
} catch (error) {
|
|
439
|
+
this.logger.error(`[Chorus] dsh wake failed: ${errorText(error)}`);
|
|
440
|
+
protocolDone = true;
|
|
441
|
+
await stopRuntime();
|
|
442
|
+
return result(dshSessionId, typeof exitCode === "number" && exitCode !== 0 ? exitCode : null);
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// cli/init/adapters.mjs
|
|
2
|
+
// The per-agent adapters `chorus init` configures. One descriptor per supported
|
|
3
|
+
// coding-agent harness; buildAdapter() turns each into an AgentAdapter
|
|
4
|
+
// (contracts.mjs). Detection is shared (cli/init/detect.mjs); the plugin-install
|
|
5
|
+
// mechanism (descriptor.install) is added by the plugin-install task — until
|
|
6
|
+
// then installPlugin reports "unsupported" rather than guessing a command.
|
|
7
|
+
//
|
|
8
|
+
// LAYOUT PROVENANCE (binary + config dir), so future edits don't drift into
|
|
9
|
+
// LLM-guessed paths (verified against each agent's real CLI / install-*.sh):
|
|
10
|
+
// - claude : bin `claude`; dir ~/.claude (this machine + docs/CONNECT_CLAUDE_CODE.md)
|
|
11
|
+
// - codex : bin `codex`; dir ~/.codex (public/install-codex.sh: CODEX_HOME=$HOME/.codex)
|
|
12
|
+
// - kiro : bin `kiro`; dir ~/.kiro (public/install-kiro.sh: ~/.kiro global)
|
|
13
|
+
// - opencode : bin `opencode`; dir ~/.config/opencode (public/install-opencode.sh: OPENCODE_CONFIG_DIR)
|
|
14
|
+
// - openclaw : bin `openclaw`; dir ~/.openclaw|~/.config/openclaw (NOT independently verified — probe both; see NOTE)
|
|
15
|
+
// - pi : bin `pi`; dir ~/.pi|~/.config/pi (NOT independently verified — probe both; see NOTE)
|
|
16
|
+
// - dsh : bin `dsh`; dir $DSH_HOME|~/.dsh ($DSH_HOME per dsh integration; see NOTE)
|
|
17
|
+
//
|
|
18
|
+
// NOTE: openclaw / pi / dsh config-dir specifics were not verifiable on this
|
|
19
|
+
// build host (their CLIs/config were not all present); the descriptors probe the
|
|
20
|
+
// most likely locations. A wrong config-dir guess only weakens the *config-dir*
|
|
21
|
+
// half of the dual signal (the binary-on-PATH half still detects them) and never
|
|
22
|
+
// blocks selection — undetected agents remain selectable. The plugin-install
|
|
23
|
+
// task must still verify each install command against the real CLI.
|
|
24
|
+
|
|
25
|
+
import { readFileSync } from "node:fs";
|
|
26
|
+
import { homedir } from "node:os";
|
|
27
|
+
import { join } from "node:path";
|
|
28
|
+
import { detectSignals } from "./detect.mjs";
|
|
29
|
+
import { OUTCOME_ACTIONS } from "./contracts.mjs";
|
|
30
|
+
import { CHORUS_PLUGIN_ID, CHORUS_MARKETPLACE_NAME, CHORUS_MARKETPLACE_SOURCE } from "./chorus-plugin-consts.mjs";
|
|
31
|
+
import {
|
|
32
|
+
installClaude,
|
|
33
|
+
installCodex,
|
|
34
|
+
installOpencode,
|
|
35
|
+
installDsh,
|
|
36
|
+
installOpenclaw,
|
|
37
|
+
installKiro,
|
|
38
|
+
readCodexInstallState,
|
|
39
|
+
readOpencodeInstallState,
|
|
40
|
+
readDshInstallState,
|
|
41
|
+
readOpenclawInstallState,
|
|
42
|
+
readKiroInstallState,
|
|
43
|
+
guided,
|
|
44
|
+
GUIDED_MESSAGES,
|
|
45
|
+
} from "./install-methods.mjs";
|
|
46
|
+
|
|
47
|
+
// Re-export the shared marketplace identifiers from their canonical home so
|
|
48
|
+
// existing importers of these names from adapters.mjs keep working.
|
|
49
|
+
export { CHORUS_PLUGIN_ID, CHORUS_MARKETPLACE_NAME, CHORUS_MARKETPLACE_SOURCE };
|
|
50
|
+
|
|
51
|
+
/** Read + JSON-parse a file, or null on any error. Never throws. */
|
|
52
|
+
function readJsonSafe(path) {
|
|
53
|
+
try {
|
|
54
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
55
|
+
} catch {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Claude Code install-state reader (verified against CC 2.1.235 on-disk layout):
|
|
62
|
+
* `~/.claude/plugins/installed_plugins.json` (v2 keyed by `<plugin>@<marketplace>`)
|
|
63
|
+
* and `known_marketplaces.json`. Read-only — never hand-writes these files.
|
|
64
|
+
* @param {{ home?: string, readJson?: (p: string) => any }} [deps]
|
|
65
|
+
* @returns {{ marketplaceRegistered: boolean, pluginInstalled: boolean, version?: string }}
|
|
66
|
+
*/
|
|
67
|
+
export function readClaudeInstallState({ home = homedir(), readJson = readJsonSafe } = {}) {
|
|
68
|
+
const pluginsDir = join(home, ".claude", "plugins");
|
|
69
|
+
const installed = readJson(join(pluginsDir, "installed_plugins.json"));
|
|
70
|
+
const markets = readJson(join(pluginsDir, "known_marketplaces.json"));
|
|
71
|
+
|
|
72
|
+
const marketplaceRegistered = !!(markets && typeof markets === "object" && markets[CHORUS_MARKETPLACE_NAME]);
|
|
73
|
+
|
|
74
|
+
let pluginInstalled = false;
|
|
75
|
+
let version;
|
|
76
|
+
const entries = installed && typeof installed === "object" ? installed.plugins?.[CHORUS_PLUGIN_ID] : null;
|
|
77
|
+
if (Array.isArray(entries) && entries.length > 0) {
|
|
78
|
+
pluginInstalled = true;
|
|
79
|
+
version = entries[0]?.version;
|
|
80
|
+
}
|
|
81
|
+
return { marketplaceRegistered, pluginInstalled, version };
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* The supported-agent descriptors. `install` / `readState` are optional hooks the
|
|
86
|
+
* plugin-install task fills in per agent; absent ⇒ generic behavior.
|
|
87
|
+
* @type {Array<{
|
|
88
|
+
* id: string, displayName: string, binaries: string[], configDirs: string[],
|
|
89
|
+
* readState?: (deps: object) => object, install?: (ctx: object) => object,
|
|
90
|
+
* }>}
|
|
91
|
+
*/
|
|
92
|
+
export const AGENT_DESCRIPTORS = [
|
|
93
|
+
{ id: "claude", displayName: "Claude Code", binaries: ["claude"], configDirs: ["~/.claude"], readState: readClaudeInstallState, install: installClaude },
|
|
94
|
+
{ id: "codex", displayName: "Codex CLI", binaries: ["codex"], configDirs: ["~/.codex"], readState: readCodexInstallState, install: installCodex },
|
|
95
|
+
{ id: "kiro", displayName: "Kiro CLI", binaries: ["kiro"], configDirs: ["~/.kiro"], readState: readKiroInstallState, install: installKiro },
|
|
96
|
+
{ id: "opencode", displayName: "opencode", binaries: ["opencode"], configDirs: ["~/.config/opencode", "~/.opencode"], readState: readOpencodeInstallState, install: installOpencode },
|
|
97
|
+
{ id: "openclaw", displayName: "OpenClaw", binaries: ["openclaw"], configDirs: ["~/.openclaw", "~/.config/openclaw"], readState: readOpenclawInstallState, install: installOpenclaw },
|
|
98
|
+
{ id: "pi", displayName: "Pi", binaries: ["pi"], configDirs: ["~/.pi", "~/.config/pi"], install: guided("pi", GUIDED_MESSAGES.pi) },
|
|
99
|
+
{ id: "dsh", displayName: "DeepSeek Harness (dsh)", binaries: ["dsh"], configDirs: ["$DSH_HOME", "~/.dsh"], readState: readDshInstallState, install: installDsh },
|
|
100
|
+
];
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Build an AgentAdapter from a descriptor.
|
|
104
|
+
* @param {typeof AGENT_DESCRIPTORS[number]} d
|
|
105
|
+
* @returns {import("./contracts.mjs").AgentAdapter}
|
|
106
|
+
*/
|
|
107
|
+
export function buildAdapter(d) {
|
|
108
|
+
return {
|
|
109
|
+
id: d.id,
|
|
110
|
+
displayName: d.displayName,
|
|
111
|
+
detect: (env = process.env) => detectSignals(d, { env }),
|
|
112
|
+
readInstallState: (deps = {}) => {
|
|
113
|
+
const base = typeof d.readState === "function"
|
|
114
|
+
? d.readState(deps)
|
|
115
|
+
: { marketplaceRegistered: false, pluginInstalled: false };
|
|
116
|
+
// `supported` = a REAL automated install path exists for this agent. A
|
|
117
|
+
// `guided()` fallback also returns a function (so `typeof d.install ===
|
|
118
|
+
// "function"` alone would report every fallback agent as supported — the
|
|
119
|
+
// pre-existing latent bug); guided installers are tagged `.guided === true`,
|
|
120
|
+
// so exclude them here. Real installers (claude/codex/opencode + dsh/openclaw/
|
|
121
|
+
// kiro) → true; guided (pi) → false.
|
|
122
|
+
return { supported: typeof d.install === "function" && d.install.guided !== true, ...base };
|
|
123
|
+
},
|
|
124
|
+
installPlugin: (ctx = {}) =>
|
|
125
|
+
typeof d.install === "function"
|
|
126
|
+
? d.install(ctx)
|
|
127
|
+
: {
|
|
128
|
+
stepId: "plugin-install",
|
|
129
|
+
agentId: d.id,
|
|
130
|
+
action: OUTCOME_ACTIONS.UNSUPPORTED,
|
|
131
|
+
detail: `no automated plugin install for ${d.displayName} yet — configure manually`,
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/** All supported adapters, built from the descriptors. */
|
|
137
|
+
export const ADAPTERS = AGENT_DESCRIPTORS.map(buildAdapter);
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
// cli/init/agent-type-map.mjs
|
|
2
|
+
// The single translation between a `chorus init` adapter selection id (see
|
|
3
|
+
// cli/init/adapters.mjs — "claude" | "codex" | "kiro" | "opencode" | "openclaw" |
|
|
4
|
+
// "pi" | "dsh") and the daemon's agentType vocabulary (cli/daemon-agent.mjs
|
|
5
|
+
// KNOWN_AGENTS). It lives in ONE place so the credential-seed step (which writes
|
|
6
|
+
// each selected agent's daemon.json agents[] entry) and the daemon-setup step
|
|
7
|
+
// (which gates auto-start on whether any selected agent is wakeable) can never
|
|
8
|
+
// disagree about how a selection maps to a backend.
|
|
9
|
+
//
|
|
10
|
+
// Two rules the callers rely on:
|
|
11
|
+
// 1. The init id "claude" is NOT the daemon agentType — it renames to
|
|
12
|
+
// "claude-code" EXPLICITLY here. No caller ever passes the raw init id
|
|
13
|
+
// through to daemon.json; every write goes through agentTypeForSelection.
|
|
14
|
+
// 2. Any selection the daemon cannot wake as a first-class backend
|
|
15
|
+
// (opencode / openclaw / pi, and dsh while its harness is dormant/offline)
|
|
16
|
+
// maps to the non-wakeable "offline" classification. Its key is still parked
|
|
17
|
+
// in agents[] for the `chorus mcp` proxy, but the daemon builds no spawner
|
|
18
|
+
// and dispatches no wake (spawner-select.mjs fail-closes on "offline").
|
|
19
|
+
//
|
|
20
|
+
// Fail-closed by default: an unknown / unmapped id maps to "offline" rather than a
|
|
21
|
+
// wakeable backend, so a future adapter added without a mapping is never silently
|
|
22
|
+
// woken as claude-code.
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Selection id → daemon agentType. Only claude/codex/kiro are wakeable backends;
|
|
26
|
+
* everything else is classified offline. `dsh` maps to offline because the dsh
|
|
27
|
+
* harness is de-advertised (offline) — re-map it here to bring it back online.
|
|
28
|
+
* @type {Readonly<Record<string, string>>}
|
|
29
|
+
*/
|
|
30
|
+
export const SELECTION_TO_AGENT_TYPE = Object.freeze({
|
|
31
|
+
claude: "claude-code", // explicit rename — never pass the init id "claude" through verbatim
|
|
32
|
+
codex: "codex",
|
|
33
|
+
kiro: "kiro",
|
|
34
|
+
opencode: "offline",
|
|
35
|
+
openclaw: "offline",
|
|
36
|
+
pi: "offline",
|
|
37
|
+
dsh: "offline",
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Map a `chorus init` selection id to the daemon agentType written into
|
|
42
|
+
* daemon.json `agents[]`. Unknown ids fail closed to "offline" (never a wakeable
|
|
43
|
+
* default), so an agent is only ever woken when its backend is explicitly known.
|
|
44
|
+
* @param {string} selectionId
|
|
45
|
+
* @returns {string} a KNOWN_AGENTS agentType ("claude-code" | "codex" | "kiro" | "offline")
|
|
46
|
+
*/
|
|
47
|
+
export function agentTypeForSelection(selectionId) {
|
|
48
|
+
return SELECTION_TO_AGENT_TYPE[selectionId] ?? "offline";
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Whether a daemon agentType is one the daemon can actually wake. "offline" is the
|
|
53
|
+
* one non-wakeable classification; every other value the init mapping produces
|
|
54
|
+
* (claude-code / codex / kiro) is wakeable.
|
|
55
|
+
* @param {string} agentType
|
|
56
|
+
* @returns {boolean}
|
|
57
|
+
*/
|
|
58
|
+
export function isWakeableAgentType(agentType) {
|
|
59
|
+
return agentType !== "offline";
|
|
60
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
// cli/init/chorus-plugin-consts.mjs
|
|
2
|
+
// Canonical Chorus plugin/marketplace identifiers, shared by the adapters and the
|
|
3
|
+
// per-agent install methods. Kept in its own module so adapters.mjs and
|
|
4
|
+
// install-methods.mjs can both import them without a circular dependency.
|
|
5
|
+
|
|
6
|
+
/** Plugin selector used by marketplace-based agents (Claude Code, Codex). */
|
|
7
|
+
export const CHORUS_PLUGIN_ID = "chorus@chorus-plugins";
|
|
8
|
+
/** Marketplace name as it appears in agents' on-disk state. */
|
|
9
|
+
export const CHORUS_MARKETPLACE_NAME = "chorus-plugins";
|
|
10
|
+
/**
|
|
11
|
+
* Remote marketplace source (owner decision: each agent's NATIVE REMOTE
|
|
12
|
+
* marketplace, not a local bundle). Overridable per invocation via
|
|
13
|
+
* CHORUS_MARKETPLACE_SOURCE. Accepted by `claude plugin marketplace add`
|
|
14
|
+
* (URL/path/repo). Codex prefers the `owner/repo` slug — see installCodex.
|
|
15
|
+
*/
|
|
16
|
+
export const CHORUS_MARKETPLACE_SOURCE = "https://github.com/Chorus-AIDLC/Chorus";
|