@chorus-aidlc/chorus 0.16.2 → 0.16.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +444 -433
- package/.next/standalone/.next/app-path-routes-manifest.json +42 -42
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +36 -36
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies.rsc +2 -2
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +2 -2
- package/.next/standalone/.next/server/app/admin.rsc +2 -2
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route.js +4 -4
- package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +2 -2
- package/.next/standalone/.next/server/app/index.rsc +2 -2
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +2 -2
- package/.next/standalone/.next/server/app/login/admin.rsc +2 -2
- package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/callback.html +2 -2
- package/.next/standalone/.next/server/app/login/callback.rsc +2 -2
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +2 -2
- package/.next/standalone/.next/server/app/login.html +2 -2
- package/.next/standalone/.next/server/app/login.rsc +2 -2
- package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
- package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +2 -2
- package/.next/standalone/.next/server/app/onboarding.rsc +3 -3
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects.html +2 -2
- package/.next/standalone/.next/server/app/projects.rsc +4 -4
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +4 -4
- package/.next/standalone/.next/server/app-paths-manifest.json +42 -42
- package/.next/standalone/.next/server/chunks/1318.js +1 -1
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/2572.js +1 -1
- package/.next/standalone/.next/server/chunks/2618.js +1 -1
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/3594.js +1 -1
- package/.next/standalone/.next/server/chunks/4394.js +1 -1
- package/.next/standalone/.next/server/chunks/4827.js +1 -1
- package/.next/standalone/.next/server/chunks/5205.js +1 -1
- package/.next/standalone/.next/server/chunks/5245.js +1 -1
- package/.next/standalone/.next/server/chunks/5351.js +4 -3
- package/.next/standalone/.next/server/chunks/{4011.js → 5489.js} +4 -4
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6506.js +2 -2
- package/.next/standalone/.next/server/chunks/6667.js +1 -1
- package/.next/standalone/.next/server/chunks/6995.js +1 -1
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/7530.js +1 -1
- package/.next/standalone/.next/server/chunks/8044.js +1 -0
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/9213.js +1 -1
- package/.next/standalone/.next/server/chunks/9378.js +1 -1
- package/.next/standalone/.next/server/chunks/951.js +1 -1
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +1 -1
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/11595.a6268c75ca8a2163.js +1 -0
- package/.next/standalone/.next/static/chunks/17099-936da9caf4c119b8.js +1 -0
- package/.next/standalone/.next/static/chunks/18609-6c859f756d530e94.js +1 -0
- package/.next/standalone/.next/static/chunks/19887-b805e1dcee8c367b.js +1 -0
- package/.next/standalone/.next/static/chunks/20204-90d655ea14281e10.js +1 -0
- package/.next/standalone/.next/static/chunks/{53402-a54163001f3d953a.js → 27370-c056dee2016c9124.js} +1 -1
- package/.next/standalone/.next/static/chunks/{29108-b9b232255811ffa8.js → 29108-5a11eea003f4cc11.js} +1 -1
- package/.next/standalone/.next/static/chunks/29305-f587e7e81bc0b200.js +10 -0
- package/.next/standalone/.next/static/chunks/33456.16ff7edf00137539.js +1 -0
- package/.next/standalone/.next/static/chunks/35432-5c245212c7595169.js +1 -0
- package/.next/standalone/.next/static/chunks/45024-eb7c062d13d9fe08.js +1 -0
- package/.next/standalone/.next/static/chunks/46294-6ae5bd0480b1820f.js +1 -0
- package/.next/standalone/.next/static/chunks/4860.9e06848eb531e667.js +1 -0
- package/.next/standalone/.next/static/chunks/53073-a7ed20af6538a178.js +1 -0
- package/.next/standalone/.next/static/chunks/65096-f756aac39efad7a3.js +1 -0
- package/.next/standalone/.next/static/chunks/6603-e70ddeab6ad09c50.js +1 -0
- package/.next/standalone/.next/static/chunks/67580-8733964ab2c7fc0e.js +1 -0
- package/.next/standalone/.next/static/chunks/7777-8b1b6681256e1534.js +1 -0
- package/.next/standalone/.next/static/chunks/78917-1b59cbb806b3ecfc.js +1 -0
- package/.next/standalone/.next/static/chunks/82751-3e161e1d8dbda3ac.js +1 -0
- package/.next/standalone/.next/static/chunks/94643-ffa140f765c73daf.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.81b79c91858f9099.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-cea0bb3e3a295bea.js → layout-b742c51c0a764daf.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-974781e4886529f8.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/{page-007278623926490f.js → page-f636e00c28f425ea.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c004f1a194af7fa5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-425acbe9ade5fa83.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/{page-f5a351c544ed23d7.js → page-fdd617457730a116.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-b9eb4e0692996657.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0a6c2d0e1b68e0e4.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-58b48aa0a11603c3.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-286faced32c6133f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/{page-7a5ef281f6819ed4.js → page-9d79e285b6fd2f8d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-1507a761e67c2aa9.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/page-5c82cf3abd856301.js +1 -0
- package/.next/standalone/.next/static/chunks/f5a9da1f-6abf712b3f684cf9.js +1 -0
- package/.next/standalone/.next/static/chunks/{webpack-b54e0c78eded76be.js → webpack-4d1cc14b13e247b6.js} +1 -1
- package/.next/standalone/.next/static/css/5f52bd39b284ccdf.css +1 -0
- package/.next/standalone/package.json +3 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +2 -1
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +5 -4
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +128 -0
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +1 -1
- package/.next/standalone/public/dsh-credentials.sh +137 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +5 -4
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +128 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/steering/chorus.md +2 -1
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +1 -1
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +2 -1
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/docs-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +5 -4
- package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +128 -0
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/.next/standalone/public/test-dsh-credentials.sh +55 -0
- package/README.ja.md +3 -1
- package/README.ko.md +3 -1
- package/README.md +3 -1
- package/README.zh.md +3 -1
- package/cli/agent-backend-prompt.mjs +93 -0
- package/cli/client-args.mjs +11 -5
- package/cli/daemon-agent.mjs +6 -5
- package/cli/daemon-banner.mjs +3 -3
- package/cli/daemon-config.mjs +1 -1
- package/cli/daemon-install-config.mjs +21 -14
- package/cli/daemon-rest-client.mjs +31 -8
- package/cli/daemon.mjs +47 -6
- package/cli/dsh-managed-config.mjs +407 -0
- package/cli/dsh-spawner.mjs +438 -0
- package/cli/login.mjs +26 -4
- package/cli/prompts.mjs +13 -3
- package/cli/spawner-select.mjs +10 -1
- package/cli/turn-reporter.mjs +5 -2
- package/cli/upload-hooks.mjs +31 -1
- package/cli/waker.mjs +49 -6
- package/package.json +3 -1
- package/prisma/migrations/20260818024700_add_turn_backend_session_id/migration.sql +1 -0
- package/prisma/schema.prisma +3 -0
- package/.next/standalone/.next/server/chunks/2463.js +0 -1
- package/.next/standalone/.next/static/chunks/11595.b6f8ad33572b32fe.js +0 -1
- package/.next/standalone/.next/static/chunks/19887-9f459ee9e8d0855f.js +0 -1
- package/.next/standalone/.next/static/chunks/22987-8fd965ab4ff87546.js +0 -1
- package/.next/standalone/.next/static/chunks/33456.e8550ad410031e29.js +0 -1
- package/.next/standalone/.next/static/chunks/35432-ee83da56c49ef6f8.js +0 -1
- package/.next/standalone/.next/static/chunks/38296-316ba18af72385fb.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.b405fc235b36271b.js +0 -1
- package/.next/standalone/.next/static/chunks/53073-5fd399cb25a11740.js +0 -1
- package/.next/standalone/.next/static/chunks/6603-07faab08560f7ecd.js +0 -1
- package/.next/standalone/.next/static/chunks/6698-1c55791b2d0820d5.js +0 -1
- package/.next/standalone/.next/static/chunks/66980-652990fcf3212c94.js +0 -10
- package/.next/standalone/.next/static/chunks/75137-c9e8422c9d4e1f52.js +0 -1
- package/.next/standalone/.next/static/chunks/7777-5dad34f6bdc13482.js +0 -1
- package/.next/standalone/.next/static/chunks/78917-7354d3b6908da7d1.js +0 -1
- package/.next/standalone/.next/static/chunks/82751-de255af4418d53e4.js +0 -1
- package/.next/standalone/.next/static/chunks/83285-db8ae107944eb6df.js +0 -1
- package/.next/standalone/.next/static/chunks/86155-c9b7c2c08d3fa80e.js +0 -1
- package/.next/standalone/.next/static/chunks/89836-b5ab6a0b32c54f42.js +0 -1
- package/.next/standalone/.next/static/chunks/94643-6d31df78aa3074b5.js +0 -1
- package/.next/standalone/.next/static/chunks/96170-75da13decdb6f73f.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.9dce8f30802824fc.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/project-groups/[uuid]/page-7462c5eb92130796.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-b6ecaf52f6b81ec7.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-82404154708e48a9.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-3cd46bec9383b191.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-6abc7d1785e2b999.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page-7f87113e5d8bcf6e.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-30ab1573c4bd466f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-b21d4184d9ca0b25.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-3b6c54f887108635.js +0 -1
- package/.next/standalone/.next/static/css/893d99a21153c9b0.css +0 -1
- /package/.next/standalone/.next/static/{YTZwWTfE0BsJnjCDYCEHi → 6sHDgeKioa0SJR1MAbcYG}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{YTZwWTfE0BsJnjCDYCEHi → 6sHDgeKioa0SJR1MAbcYG}/_ssgManifest.js +0 -0
|
@@ -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
|
/**
|
package/cli/daemon.mjs
CHANGED
|
@@ -41,6 +41,8 @@ import { Waker } from "./waker.mjs";
|
|
|
41
41
|
import { LineageResolver } from "./lineage.mjs";
|
|
42
42
|
import { resolveClaudePath } from "./claude-spawner.mjs";
|
|
43
43
|
import { resolveCodexPath } from "./codex-spawner.mjs";
|
|
44
|
+
import { resolveDshPath } from "./dsh-spawner.mjs";
|
|
45
|
+
import { prepareManagedDshConfig } from "./dsh-managed-config.mjs";
|
|
44
46
|
import { resolveKiroPath } from "./kiro-spawner.mjs";
|
|
45
47
|
import { selectSpawner } from "./spawner-select.mjs";
|
|
46
48
|
import {
|
|
@@ -152,7 +154,13 @@ export function buildDaemon(creds, deps = {}) {
|
|
|
152
154
|
// (construction byte-identical to before); codex → CodexSpawner. `creds` are
|
|
153
155
|
// passed through so the Codex backend can export the daemon key into the woken
|
|
154
156
|
// process env (the Claude backend ignores creds — it gets its key via --mcp-config).
|
|
155
|
-
const spawner = deps.spawner ?? selectSpawner(agentType, {
|
|
157
|
+
const spawner = deps.spawner ?? selectSpawner(agentType, {
|
|
158
|
+
logger,
|
|
159
|
+
permissionMode,
|
|
160
|
+
creds,
|
|
161
|
+
bundleVersion: deps.bundleVersion,
|
|
162
|
+
prepareManagedConfigFn: deps.prepareManagedDshConfig,
|
|
163
|
+
});
|
|
156
164
|
const maxConcurrency = deps.maxConcurrency ?? 4;
|
|
157
165
|
|
|
158
166
|
// ===== Multi-path: the SET of cwds this daemon serves (T3 — FR-5) =====
|
|
@@ -742,6 +750,7 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
742
750
|
// banner shows the right binary instead of always probing for `claude`.
|
|
743
751
|
const findClaude = deps.resolveClaudePath ?? resolveClaudePath;
|
|
744
752
|
const findCodex = deps.resolveCodexPath ?? resolveCodexPath;
|
|
753
|
+
const findDsh = deps.resolveDshPath ?? resolveDshPath;
|
|
745
754
|
const findKiro = deps.resolveKiroPath ?? resolveKiroPath;
|
|
746
755
|
const verbose = flags.verbose === true || env.CHORUS_VERBOSE === "1";
|
|
747
756
|
|
|
@@ -786,6 +795,9 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
786
795
|
writeConfig: deps.writeConfig,
|
|
787
796
|
readJson: deps.readJson,
|
|
788
797
|
loginPath: deps.loginPath,
|
|
798
|
+
prepareManagedDshConfig: deps.prepareManagedDshConfig,
|
|
799
|
+
bundleVersion: version,
|
|
800
|
+
resolveDshPath: findDsh,
|
|
789
801
|
};
|
|
790
802
|
|
|
791
803
|
const action = flags.action ?? "run";
|
|
@@ -884,6 +896,8 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
884
896
|
mcpClient: deps.mcpClient,
|
|
885
897
|
lineage: deps.lineage,
|
|
886
898
|
build: deps.build,
|
|
899
|
+
bundleVersion: version,
|
|
900
|
+
prepareManagedDshConfig: deps.prepareManagedDshConfig,
|
|
887
901
|
});
|
|
888
902
|
|
|
889
903
|
const shutdownMulti = () => {
|
|
@@ -924,11 +938,16 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
924
938
|
// Detect the SELECTED backend's executable (non-fatal): the daemon still
|
|
925
939
|
// subscribes when it's missing; a wake surfaces the error visibly when one
|
|
926
940
|
// arrives. The resolved path (or absence) is shown in the banner below. Each
|
|
927
|
-
// backend probes its own binary
|
|
928
|
-
//
|
|
929
|
-
// (and the banner reports) `kiro-cli`, not `claude`.
|
|
941
|
+
// backend probes its own binary, including dsh-jsonrpc-agent for dsh, so the
|
|
942
|
+
// startup banner and warning report the selected runtime rather than Claude.
|
|
930
943
|
const cliPath =
|
|
931
|
-
agentType === "codex"
|
|
944
|
+
agentType === "codex"
|
|
945
|
+
? findCodex()
|
|
946
|
+
: agentType === "kiro"
|
|
947
|
+
? findKiro()
|
|
948
|
+
: agentType === "dsh"
|
|
949
|
+
? findDsh()
|
|
950
|
+
: findClaude();
|
|
932
951
|
|
|
933
952
|
// The daemon.json the layered config readers (credentials, sigint timeout, cwds)
|
|
934
953
|
// consult. Surfacing its absolute path + presence in the banner makes it obvious
|
|
@@ -987,6 +1006,8 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
987
1006
|
sigintTimeoutMs,
|
|
988
1007
|
cwds,
|
|
989
1008
|
browseRoots,
|
|
1009
|
+
bundleVersion: version,
|
|
1010
|
+
prepareManagedDshConfig: deps.prepareManagedDshConfig,
|
|
990
1011
|
});
|
|
991
1012
|
|
|
992
1013
|
// Graceful shutdown on signals.
|
|
@@ -1171,7 +1192,7 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1171
1192
|
// CHORUS_AGENT env / a prior stored choice; probes the selected CLI and warns
|
|
1172
1193
|
// (non-fatal) when it is missing. An unknown --agent was already rejected by
|
|
1173
1194
|
// resolveAgentType above, so this phase never fails.
|
|
1174
|
-
await installCfg.resolveInstallAgent(flags, env, {
|
|
1195
|
+
const installAgent = await installCfg.resolveInstallAgent(flags, env, {
|
|
1175
1196
|
isTTY,
|
|
1176
1197
|
skip,
|
|
1177
1198
|
writeConfig: pfDeps?.writeConfig ?? updateDaemonConfig,
|
|
@@ -1181,6 +1202,26 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1181
1202
|
log,
|
|
1182
1203
|
errLog,
|
|
1183
1204
|
});
|
|
1205
|
+
if (
|
|
1206
|
+
installAgent.agent === "dsh" &&
|
|
1207
|
+
!String(env.CHORUS_DSH_CONFIG ?? "").trim() &&
|
|
1208
|
+
!String(env.DSH_CORDIS_CONFIG ?? "").trim()
|
|
1209
|
+
) {
|
|
1210
|
+
try {
|
|
1211
|
+
await (pfDeps?.prepareManagedDshConfig ?? prepareManagedDshConfig)({
|
|
1212
|
+
env,
|
|
1213
|
+
bundleVersion: pfDeps?.bundleVersion,
|
|
1214
|
+
dshPath: installAgent.cliPath ?? pfDeps?.resolveDshPath?.(),
|
|
1215
|
+
creds: credResult.creds,
|
|
1216
|
+
});
|
|
1217
|
+
} catch (error) {
|
|
1218
|
+
errLog(
|
|
1219
|
+
`[Chorus] install aborted — dsh managed composition preparation failed: ` +
|
|
1220
|
+
`${error instanceof Error ? error.message : String(error)}`,
|
|
1221
|
+
);
|
|
1222
|
+
return 1;
|
|
1223
|
+
}
|
|
1224
|
+
}
|
|
1184
1225
|
|
|
1185
1226
|
const spec = {
|
|
1186
1227
|
...svc.resolveServicePaths(),
|
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
import { spawnSync } from "node:child_process";
|
|
2
|
+
import { createHash, randomUUID } from "node:crypto";
|
|
3
|
+
import {
|
|
4
|
+
existsSync,
|
|
5
|
+
mkdirSync,
|
|
6
|
+
readFileSync,
|
|
7
|
+
renameSync,
|
|
8
|
+
rmSync,
|
|
9
|
+
writeFileSync,
|
|
10
|
+
} from "node:fs";
|
|
11
|
+
import { homedir } from "node:os";
|
|
12
|
+
import { dirname, join, resolve } from "node:path";
|
|
13
|
+
import { createRequire } from "node:module";
|
|
14
|
+
import { pathToFileURL } from "node:url";
|
|
15
|
+
|
|
16
|
+
export const DSH_BUNDLE = "@chorus-aidlc/chorus-dsh";
|
|
17
|
+
export const DSH_PEERS = Object.freeze([
|
|
18
|
+
"@deepseek-ai/dsh-mcp-client",
|
|
19
|
+
"@deepseek-ai/dsh-skill-filesystem",
|
|
20
|
+
"@deepseek-ai/dsh-tool-skill",
|
|
21
|
+
"@deepseek-ai/dsh-persona",
|
|
22
|
+
]);
|
|
23
|
+
export const DSH_RC_VERSION = "0.1.0-rc.7";
|
|
24
|
+
export const MANAGED_CONFIG_FILE = "cordis.yml";
|
|
25
|
+
|
|
26
|
+
// dsh-base supplies the core plugins used by the external JSON-RPC composition.
|
|
27
|
+
// Hoisted linking makes those transitive plugins visible from the config anchor.
|
|
28
|
+
const RUNTIME_PACKAGES = Object.freeze({
|
|
29
|
+
"@deepseek-ai/dsh-base": DSH_RC_VERSION,
|
|
30
|
+
"@deepseek-ai/dsh-agent-spine-demo": DSH_RC_VERSION,
|
|
31
|
+
"@deepseek-ai/dsh-sdk-jsonrpc-server": DSH_RC_VERSION,
|
|
32
|
+
"@deepseek-ai/dsh-sdk-jsonrpc-demo": DSH_RC_VERSION,
|
|
33
|
+
"@deepseek-ai/dsh-invariants": DSH_RC_VERSION,
|
|
34
|
+
"@deepseek-ai/cordis": "4.0.1",
|
|
35
|
+
});
|
|
36
|
+
const REQUIRED_IMPORTS = Object.freeze([DSH_BUNDLE, ...DSH_PEERS]);
|
|
37
|
+
const STATE_VERSION = 1;
|
|
38
|
+
|
|
39
|
+
const CONFIG_HEAD = `# Generated by Chorus. Secrets are read from the child environment.
|
|
40
|
+
# This file is managed; use CHORUS_DSH_CONFIG or DSH_CORDIS_CONFIG to override it.
|
|
41
|
+
|
|
42
|
+
- id: sdk-jsonrpc-server
|
|
43
|
+
name: '@deepseek-ai/dsh-sdk-jsonrpc-server'
|
|
44
|
+
config:
|
|
45
|
+
maxTokensAsSuccess: true
|
|
46
|
+
|
|
47
|
+
- id: llm-deepseek
|
|
48
|
+
name: '@deepseek-ai/dsh-llm-deepseek'
|
|
49
|
+
config:
|
|
50
|
+
thinking: enabled
|
|
51
|
+
reasoningEffort: max
|
|
52
|
+
|
|
53
|
+
- id: subprocess
|
|
54
|
+
name: '@deepseek-ai/dsh-subprocess-local'
|
|
55
|
+
|
|
56
|
+
- id: bash
|
|
57
|
+
name: '@deepseek-ai/dsh-bash-local'
|
|
58
|
+
config:
|
|
59
|
+
cwd: !!js process.env.DSH_CWD ?? process.cwd()
|
|
60
|
+
timeoutMs: 60000
|
|
61
|
+
|
|
62
|
+
- id: agent-spine
|
|
63
|
+
name: '@deepseek-ai/dsh-agent-spine-demo'
|
|
64
|
+
config:
|
|
65
|
+
persona: !!js process.env.DSH_SYSTEM_PROMPT ?? 'You are a coding agent.'
|
|
66
|
+
workspaceContext: false
|
|
67
|
+
skills:
|
|
68
|
+
enabled: false
|
|
69
|
+
toolBash:
|
|
70
|
+
enableRunInBackground: false
|
|
71
|
+
toolJobs: false
|
|
72
|
+
|
|
73
|
+
- id: sessions
|
|
74
|
+
name: '@deepseek-ai/dsh-session-persistence-jsonl'
|
|
75
|
+
config:
|
|
76
|
+
root: !!js process.env.DSH_SESSION_ROOT ?? './.sessions'
|
|
77
|
+
compression: zstd
|
|
78
|
+
|
|
79
|
+
- id: session-checkpoints
|
|
80
|
+
name: '@deepseek-ai/dsh-session-checkpoint-policy'
|
|
81
|
+
|
|
82
|
+
- id: subagent
|
|
83
|
+
name: '@deepseek-ai/dsh-subagent'
|
|
84
|
+
|
|
85
|
+
- id: subagent-spawn-in-process
|
|
86
|
+
name: '@deepseek-ai/dsh-subagent-spawn-in-process'
|
|
87
|
+
config:
|
|
88
|
+
providerName: spawn
|
|
89
|
+
|
|
90
|
+
- id: tool-subagent
|
|
91
|
+
name: '@deepseek-ai/dsh-tool-subagent'
|
|
92
|
+
config:
|
|
93
|
+
provider: spawn
|
|
94
|
+
toolName: subagent
|
|
95
|
+
enableRunInBackground: false
|
|
96
|
+
|
|
97
|
+
- id: tool-todo
|
|
98
|
+
name: '@deepseek-ai/dsh-tool-todo'
|
|
99
|
+
config:
|
|
100
|
+
allowParallelInProgress: true
|
|
101
|
+
|
|
102
|
+
- id: fs-local
|
|
103
|
+
name: '@deepseek-ai/dsh-fs-local'
|
|
104
|
+
config:
|
|
105
|
+
cwd: !!js process.env.DSH_CWD ?? process.cwd()
|
|
106
|
+
|
|
107
|
+
- id: fs-observation-policy
|
|
108
|
+
name: '@deepseek-ai/dsh-fs-observation-policy'
|
|
109
|
+
|
|
110
|
+
- id: tool-fs
|
|
111
|
+
name: '@deepseek-ai/dsh-tool-fs'
|
|
112
|
+
|
|
113
|
+
- id: token-meter
|
|
114
|
+
name: '@deepseek-ai/dsh-token-meter'
|
|
115
|
+
|
|
116
|
+
- id: compaction-basic
|
|
117
|
+
name: '@deepseek-ai/dsh-compaction-basic'
|
|
118
|
+
config:
|
|
119
|
+
thresholdRatio: 0.8
|
|
120
|
+
retainRatio: 0.16
|
|
121
|
+
maxTokens: 8192
|
|
122
|
+
compactionRetries: 1
|
|
123
|
+
|
|
124
|
+
- id: chorus-dsh-lifecycle
|
|
125
|
+
name: __CHORUS_BUNDLE__
|
|
126
|
+
|
|
127
|
+
- id: chorus-mcp
|
|
128
|
+
name: '@deepseek-ai/dsh-mcp-client'
|
|
129
|
+
inject: [chorusDshConfig]
|
|
130
|
+
config:
|
|
131
|
+
serverName: chorus
|
|
132
|
+
transport: streamable-http
|
|
133
|
+
url: !!js '\`\${chorusDshConfig.url}/api/mcp\`'
|
|
134
|
+
headers:
|
|
135
|
+
Authorization: !!js '\`Bearer \${chorusDshConfig.apiKey}\`'
|
|
136
|
+
failOnStartupError: false
|
|
137
|
+
reconnect:
|
|
138
|
+
enabled: true
|
|
139
|
+
|
|
140
|
+
- id: skill
|
|
141
|
+
name: '@deepseek-ai/dsh-skill'
|
|
142
|
+
|
|
143
|
+
- id: chorus-skill-filesystem
|
|
144
|
+
name: '@deepseek-ai/dsh-skill-filesystem'
|
|
145
|
+
config:
|
|
146
|
+
providerName: chorus
|
|
147
|
+
includeDefaultRoots: false
|
|
148
|
+
customSkillDirs:
|
|
149
|
+
- !!js "process.getBuiltinModule('node:path').join(process.getBuiltinModule('node:path').dirname(process.getBuiltinModule('node:module').createRequire(baseUrl).resolve('@chorus-aidlc/chorus-dsh/package.json')), 'skills')"
|
|
150
|
+
|
|
151
|
+
- id: chorus-persona
|
|
152
|
+
name: __CHORUS_PERSONA__
|
|
153
|
+
config:
|
|
154
|
+
plugin: '@deepseek-ai/dsh-persona'
|
|
155
|
+
text: |-
|
|
156
|
+
You are a Chorus PM and developer agent powered by {{model}}. Work from {{cwd}}.
|
|
157
|
+
Use the Chorus AI-DLC lifecycle and load the relevant Chorus skill before operating
|
|
158
|
+
a Chorus resource. Keep decisions, progress, acceptance evidence, and review verdicts
|
|
159
|
+
on the assigned resource. In a headless daemon turn, never wait for terminal input:
|
|
160
|
+
persist human decisions through Chorus, mention the requester, and end the turn.
|
|
161
|
+
Do not push, merge, publish, approve, verify, or cross a human-owned gate unless the
|
|
162
|
+
wake explicitly grants that authority.
|
|
163
|
+
|
|
164
|
+
- id: tool-skill
|
|
165
|
+
name: '@deepseek-ai/dsh-tool-skill'
|
|
166
|
+
`;
|
|
167
|
+
|
|
168
|
+
function errorText(error) {
|
|
169
|
+
return error instanceof Error ? error.message : String(error);
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
function redactedErrorText(error, values = []) {
|
|
173
|
+
let text = errorText(error);
|
|
174
|
+
for (const value of values) {
|
|
175
|
+
if (typeof value === "string" && value) text = text.replaceAll(value, "[REDACTED]");
|
|
176
|
+
}
|
|
177
|
+
return text;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
function readJson(path) {
|
|
181
|
+
try {
|
|
182
|
+
return JSON.parse(readFileSync(path, "utf8"));
|
|
183
|
+
} catch {
|
|
184
|
+
return null;
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
function packageSpecs({ bundleVersion, bundleSpec }) {
|
|
189
|
+
return {
|
|
190
|
+
[DSH_BUNDLE]: bundleSpec ?? bundleVersion,
|
|
191
|
+
...Object.fromEntries(DSH_PEERS.map((name) => [name, DSH_RC_VERSION])),
|
|
192
|
+
...RUNTIME_PACKAGES,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export function managedDshRoot(env = process.env) {
|
|
197
|
+
const home = env.HOME || env.USERPROFILE || homedir();
|
|
198
|
+
return join(home, ".chorus", "dsh");
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
export function renderManagedDshConfig(bundleEntry = DSH_BUNDLE) {
|
|
202
|
+
const quote = (value) => `'${String(value).replaceAll("'", "''")}'`;
|
|
203
|
+
const personaEntry =
|
|
204
|
+
bundleEntry === DSH_BUNDLE ? `${DSH_BUNDLE}/persona` : join(dirname(bundleEntry), "persona.mjs");
|
|
205
|
+
const skillDir =
|
|
206
|
+
bundleEntry === DSH_BUNDLE
|
|
207
|
+
? `"process.getBuiltinModule('node:path').join(process.getBuiltinModule('node:path').dirname(process.getBuiltinModule('node:module').createRequire(baseUrl).resolve('@chorus-aidlc/chorus-dsh/package.json')), 'skills')"`
|
|
208
|
+
: quote(resolve(dirname(bundleEntry), "..", "skills"));
|
|
209
|
+
return CONFIG_HEAD
|
|
210
|
+
.replace("__CHORUS_BUNDLE__", quote(bundleEntry))
|
|
211
|
+
.replace("__CHORUS_PERSONA__", quote(personaEntry))
|
|
212
|
+
.replace(
|
|
213
|
+
`"process.getBuiltinModule('node:path').join(process.getBuiltinModule('node:path').dirname(process.getBuiltinModule('node:module').createRequire(baseUrl).resolve('@chorus-aidlc/chorus-dsh/package.json')), 'skills')"`,
|
|
214
|
+
skillDir,
|
|
215
|
+
);
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
function resolveInstalledBundleEntry(projectDir) {
|
|
219
|
+
const pkgPath = join(projectDir, "node_modules", "@chorus-aidlc", "chorus-dsh", "package.json");
|
|
220
|
+
const pkg = readJson(pkgPath);
|
|
221
|
+
if (!pkg) return null;
|
|
222
|
+
const exported = pkg.exports?.["."]?.default ?? pkg.main;
|
|
223
|
+
return typeof exported === "string" ? resolve(dirname(pkgPath), exported) : null;
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export async function validateManagedDshImports(projectDir, opts = {}) {
|
|
227
|
+
const requireFromConfig = createRequire(join(projectDir, MANAGED_CONFIG_FILE));
|
|
228
|
+
const resolveImport = opts.resolveImport ?? ((name) => requireFromConfig.resolve(name));
|
|
229
|
+
const importModule = opts.importModule ?? ((entry) => import(pathToFileURL(entry).href));
|
|
230
|
+
const resolved = {};
|
|
231
|
+
let usedBundleFallback = false;
|
|
232
|
+
|
|
233
|
+
for (const name of REQUIRED_IMPORTS) {
|
|
234
|
+
try {
|
|
235
|
+
resolved[name] = resolveImport(name);
|
|
236
|
+
} catch (error) {
|
|
237
|
+
if (name !== DSH_BUNDLE) {
|
|
238
|
+
throw new Error(`dsh managed import resolution failed for ${name}: ${errorText(error)}`);
|
|
239
|
+
}
|
|
240
|
+
const fallback =
|
|
241
|
+
opts.resolveBundleEntry?.(projectDir) ?? resolveInstalledBundleEntry(projectDir);
|
|
242
|
+
if (!fallback || !existsSync(fallback)) {
|
|
243
|
+
throw new Error(`dsh managed bundle resolution failed: ${errorText(error)}`);
|
|
244
|
+
}
|
|
245
|
+
resolved[name] = fallback;
|
|
246
|
+
usedBundleFallback = true;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
for (const [name, entry] of Object.entries(resolved)) {
|
|
251
|
+
try {
|
|
252
|
+
await importModule(entry);
|
|
253
|
+
} catch (error) {
|
|
254
|
+
throw new Error(`dsh managed import load failed for ${name}: ${errorText(error)}`);
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
return {
|
|
258
|
+
resolved,
|
|
259
|
+
bundleEntry: resolved[DSH_BUNDLE],
|
|
260
|
+
usedBundleFallback,
|
|
261
|
+
};
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
function runCommand(command, argv, opts) {
|
|
265
|
+
const platform = opts.platform ?? process.platform;
|
|
266
|
+
const isCmd = platform === "win32" && /\.(cmd|bat)$/i.test(command);
|
|
267
|
+
const executable = isCmd ? opts.env?.ComSpec || opts.env?.COMSPEC || "cmd.exe" : command;
|
|
268
|
+
const commandArgs = isCmd ? ["/d", "/s", "/c", command, ...argv] : argv;
|
|
269
|
+
const result = spawnSync(executable, commandArgs, {
|
|
270
|
+
cwd: opts.cwd,
|
|
271
|
+
env: opts.env,
|
|
272
|
+
encoding: "utf8",
|
|
273
|
+
shell: false,
|
|
274
|
+
timeout: opts.timeout,
|
|
275
|
+
input: opts.input,
|
|
276
|
+
windowsHide: true,
|
|
277
|
+
});
|
|
278
|
+
if (result.error || result.status !== 0) {
|
|
279
|
+
const detail = result.error?.message || result.stderr?.trim() || `exit ${result.status}`;
|
|
280
|
+
throw new Error(detail);
|
|
281
|
+
}
|
|
282
|
+
return result;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
export function validateManagedDshComposition(configPath, opts = {}) {
|
|
286
|
+
const dshPath = opts.dshPath;
|
|
287
|
+
if (!dshPath) throw new Error("cannot validate dsh composition: dsh-jsonrpc-agent was not found");
|
|
288
|
+
const env = {
|
|
289
|
+
...(opts.env ?? process.env),
|
|
290
|
+
CHORUS_DAEMON_HEADLESS: "1",
|
|
291
|
+
CHORUS_URL: opts.creds?.url ?? "http://127.0.0.1",
|
|
292
|
+
CHORUS_API_KEY: opts.creds?.apiKey ?? "cho_validation",
|
|
293
|
+
DSH_CORDIS_CONFIG: configPath,
|
|
294
|
+
DSH_CWD: dirname(configPath),
|
|
295
|
+
};
|
|
296
|
+
const request =
|
|
297
|
+
`${JSON.stringify({ jsonrpc: "2.0", id: 1, method: "initialize", params: { cwd: dirname(configPath), provider: "deepseek-official", model: "deepseek-v4-flash" } })}\n`;
|
|
298
|
+
const runner = opts.runCommand ?? runCommand;
|
|
299
|
+
const result = runner(dshPath, [], {
|
|
300
|
+
cwd: dirname(configPath),
|
|
301
|
+
env,
|
|
302
|
+
input: request,
|
|
303
|
+
timeout: opts.timeoutMs ?? 20_000,
|
|
304
|
+
platform: opts.platform,
|
|
305
|
+
});
|
|
306
|
+
if (!String(result.stdout ?? "").includes('"id":1')) {
|
|
307
|
+
throw new Error("dsh composition validation did not complete JSON-RPC initialization");
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
function activeState(root, pathExists = existsSync) {
|
|
312
|
+
const state = readJson(join(root, "active.json"));
|
|
313
|
+
if (
|
|
314
|
+
!state ||
|
|
315
|
+
state.version !== STATE_VERSION ||
|
|
316
|
+
typeof state.configPath !== "string" ||
|
|
317
|
+
typeof state.runtimePath !== "string"
|
|
318
|
+
) return null;
|
|
319
|
+
return pathExists(state.configPath) && pathExists(state.runtimePath) ? state : null;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
export async function prepareManagedDshConfig(opts = {}) {
|
|
323
|
+
const env = opts.env ?? process.env;
|
|
324
|
+
const root = opts.root ?? managedDshRoot(env);
|
|
325
|
+
const bundleVersion = opts.bundleVersion;
|
|
326
|
+
if (!bundleVersion) throw new Error("dsh managed preparation requires a Chorus bundle version");
|
|
327
|
+
const specs = packageSpecs({ bundleVersion, bundleSpec: opts.bundleSpec });
|
|
328
|
+
const fingerprint = createHash("sha256")
|
|
329
|
+
.update(JSON.stringify({ version: STATE_VERSION, specs }))
|
|
330
|
+
.digest("hex")
|
|
331
|
+
.slice(0, 16);
|
|
332
|
+
const current = activeState(root, opts.statePathExists ?? existsSync);
|
|
333
|
+
|
|
334
|
+
if (current?.fingerprint === fingerprint) {
|
|
335
|
+
await (opts.validateImports ?? validateManagedDshImports)(dirname(current.configPath), opts);
|
|
336
|
+
return { ...current, reused: true };
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
const releaseDir = join(root, "releases", `${fingerprint}-${randomUUID()}`);
|
|
340
|
+
const markerTmp = join(root, `.active-${randomUUID()}.json`);
|
|
341
|
+
mkdirSync(releaseDir, { recursive: true });
|
|
342
|
+
try {
|
|
343
|
+
writeFileSync(
|
|
344
|
+
join(releaseDir, "package.json"),
|
|
345
|
+
`${JSON.stringify({ private: true, type: "module", dependencies: specs }, null, 2)}\n`,
|
|
346
|
+
{ mode: 0o600 },
|
|
347
|
+
);
|
|
348
|
+
writeFileSync(join(releaseDir, ".npmrc"), "node-linker=hoisted\n", { mode: 0o600 });
|
|
349
|
+
|
|
350
|
+
const install = opts.install ?? ((cwd) => runCommand(
|
|
351
|
+
opts.packageManager ?? (opts.platform === "win32" ? "pnpm.cmd" : "pnpm"),
|
|
352
|
+
["install", "--prod", "--ignore-scripts", "--frozen-lockfile=false"],
|
|
353
|
+
{ cwd, env, timeout: opts.installTimeoutMs ?? 120_000, platform: opts.platform },
|
|
354
|
+
));
|
|
355
|
+
try {
|
|
356
|
+
install(releaseDir);
|
|
357
|
+
} catch (error) {
|
|
358
|
+
throw new Error(
|
|
359
|
+
`dsh managed package installation failed: ` +
|
|
360
|
+
redactedErrorText(error, [env.CHORUS_API_KEY, opts.creds?.apiKey]),
|
|
361
|
+
);
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
const importResult = await (opts.validateImports ?? validateManagedDshImports)(releaseDir, opts);
|
|
365
|
+
const bundleEntry = importResult.usedBundleFallback ? importResult.bundleEntry : DSH_BUNDLE;
|
|
366
|
+
const configPath = join(releaseDir, MANAGED_CONFIG_FILE);
|
|
367
|
+
const runtimePath = join(
|
|
368
|
+
releaseDir,
|
|
369
|
+
"node_modules",
|
|
370
|
+
".bin",
|
|
371
|
+
opts.platform === "win32" ? "dsh-jsonrpc-agent.cmd" : "dsh-jsonrpc-agent",
|
|
372
|
+
);
|
|
373
|
+
if (!(opts.runtimeExists ?? existsSync)(runtimePath)) {
|
|
374
|
+
throw new Error(`dsh managed runtime was not installed at ${runtimePath}`);
|
|
375
|
+
}
|
|
376
|
+
writeFileSync(configPath, renderManagedDshConfig(bundleEntry), { mode: 0o600 });
|
|
377
|
+
|
|
378
|
+
try {
|
|
379
|
+
(opts.validateComposition ?? validateManagedDshComposition)(configPath, {
|
|
380
|
+
...opts,
|
|
381
|
+
dshPath: runtimePath,
|
|
382
|
+
});
|
|
383
|
+
} catch (error) {
|
|
384
|
+
throw new Error(
|
|
385
|
+
`dsh managed composition validation failed: ` +
|
|
386
|
+
redactedErrorText(error, [env.CHORUS_API_KEY, opts.creds?.apiKey]),
|
|
387
|
+
);
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
const state = {
|
|
391
|
+
version: STATE_VERSION,
|
|
392
|
+
fingerprint,
|
|
393
|
+
configPath,
|
|
394
|
+
bundleEntry,
|
|
395
|
+
runtimePath,
|
|
396
|
+
validatedAt: new Date().toISOString(),
|
|
397
|
+
};
|
|
398
|
+
mkdirSync(root, { recursive: true });
|
|
399
|
+
writeFileSync(markerTmp, `${JSON.stringify(state, null, 2)}\n`, { mode: 0o600 });
|
|
400
|
+
renameSync(markerTmp, join(root, "active.json"));
|
|
401
|
+
return { ...state, reused: false };
|
|
402
|
+
} catch (error) {
|
|
403
|
+
rmSync(markerTmp, { force: true });
|
|
404
|
+
rmSync(releaseDir, { recursive: true, force: true });
|
|
405
|
+
throw error;
|
|
406
|
+
}
|
|
407
|
+
}
|