@chorus-aidlc/chorus 0.16.3 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/standalone/.next/BUILD_ID +1 -1
- package/.next/standalone/.next/app-build-manifest.json +445 -445
- package/.next/standalone/.next/app-path-routes-manifest.json +54 -54
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +42 -42
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/activity/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/dashboard/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/documents/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/graph/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/proposals/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/tasks/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/settings/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/settings/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/_not-found.html +2 -2
- package/.next/standalone/.next/server/app/_not-found.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/companies/[uuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies/new.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies/new.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/companies/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin/companies.html +2 -2
- package/.next/standalone/.next/server/app/admin/companies.rsc +1 -1
- package/.next/standalone/.next/server/app/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/admin.html +2 -2
- package/.next/standalone/.next/server/app/admin.rsc +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/companies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/admin/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agent-connections/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/api-keys/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/callback/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/check-default/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/company-oidc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/default-login/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/identify/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/logout/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/me/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/sync-token/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/comments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/connection-heartbeat/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/control/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/directory-request/report/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/execution-state/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/executions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/pending-turns/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/report-interrupt/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/resume/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/transcript/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon/turn-advance/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-directory-requests/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/instruction/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/repoint/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/[sessionUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/ad-hoc/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/daemon-sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/documents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/entities/[type]/[uuid]/root-idea/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/health/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/parent/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/wake-preview/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/conversational/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mcp/route.js +3 -3
- package/.next/standalone/.next/server/app/api/mcp/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route.js +1 -1
- package/.next/standalone/.next/server/app/api/me/assignments/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/mentionables/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/archive/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/[uuid]/read/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/preferences/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/read-all/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/notifications/unread-count/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/dashboard/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-groups/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/pin/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/project-visits/visit/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/activity/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/agent-cwds/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/available/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/documents/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/group/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/[proposalUuid]/validate/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/proposals/summary/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/resource-graph/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/stats/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/agent-cwd-options/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/close/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/reject/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/revoke/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/references/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/session/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/claim/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/index.html +2 -2
- package/.next/standalone/.next/server/app/index.rsc +1 -1
- package/.next/standalone/.next/server/app/login/admin/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/admin.html +2 -2
- package/.next/standalone/.next/server/app/login/admin.rsc +1 -1
- package/.next/standalone/.next/server/app/login/callback/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/callback.html +2 -2
- package/.next/standalone/.next/server/app/login/callback.rsc +1 -1
- package/.next/standalone/.next/server/app/login/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.html +2 -2
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +1 -1
- package/.next/standalone/.next/server/app/login.html +2 -2
- package/.next/standalone/.next/server/app/login.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding/page.js +2 -2
- package/.next/standalone/.next/server/app/onboarding/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/onboarding/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/onboarding.html +2 -2
- package/.next/standalone/.next/server/app/onboarding.rsc +2 -2
- package/.next/standalone/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/projects.html +2 -2
- package/.next/standalone/.next/server/app/projects.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.html +2 -2
- package/.next/standalone/.next/server/app/settings.rsc +3 -3
- package/.next/standalone/.next/server/app-paths-manifest.json +54 -54
- package/.next/standalone/.next/server/chunks/1114.js +1 -1
- package/.next/standalone/.next/server/chunks/1318.js +1 -1
- package/.next/standalone/.next/server/chunks/1437.js +1 -0
- package/.next/standalone/.next/server/chunks/1559.js +2 -2
- package/.next/standalone/.next/server/chunks/2572.js +1 -1
- package/.next/standalone/.next/server/chunks/2618.js +1 -1
- package/.next/standalone/.next/server/chunks/2961.js +1 -1
- package/.next/standalone/.next/server/chunks/{9793.js → 3045.js} +1 -1
- package/.next/standalone/.next/server/chunks/3831.js +37 -0
- package/.next/standalone/.next/server/chunks/4827.js +1 -1
- package/.next/standalone/.next/server/chunks/5245.js +1 -1
- package/.next/standalone/.next/server/chunks/{4394.js → 5706.js} +1 -1
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6207.js +1 -1
- package/.next/standalone/.next/server/chunks/6506.js +2 -2
- package/.next/standalone/.next/server/chunks/6515.js +2 -2
- package/.next/standalone/.next/server/chunks/679.js +1 -1
- package/.next/standalone/.next/server/chunks/7368.js +1 -1
- package/.next/standalone/.next/server/chunks/7530.js +1 -1
- package/.next/standalone/.next/server/chunks/8454.js +1 -1
- package/.next/standalone/.next/server/chunks/920.js +1 -1
- package/.next/standalone/.next/server/chunks/9213.js +1 -1
- package/.next/standalone/.next/server/chunks/9378.js +1 -1
- package/.next/standalone/.next/server/chunks/9449.js +1 -0
- package/.next/standalone/.next/server/chunks/9458.js +1 -0
- package/.next/standalone/.next/server/middleware-build-manifest.js +1 -1
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/pages/404.html +2 -2
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/server-reference-manifest.json +1 -1
- package/.next/standalone/.next/static/chunks/{11595.97e534422c57aee1.js → 11595.bbe40924d18958bf.js} +1 -1
- package/.next/standalone/.next/static/chunks/18139-e6ef4b5869593f8e.js +1 -0
- package/.next/standalone/.next/static/chunks/28856-ef2cb58fbd404ef9.js +1 -0
- package/.next/standalone/.next/static/chunks/{31308-fda6febfb2882a28.js → 31308-bb4a97b3f39c22dd.js} +1 -1
- package/.next/standalone/.next/static/chunks/{33456.6dc44a6aca1a01fd.js → 33456.5499eb8e892b110a.js} +1 -1
- package/.next/standalone/.next/static/chunks/{4860.7873ebc9ba435c8c.js → 4860.be77046fb2b3a2bd.js} +1 -1
- package/.next/standalone/.next/static/chunks/66873-e3be53f41b3f2255.js +1 -0
- package/.next/standalone/.next/static/chunks/70303-aec3d52ad87602a3.js +1 -0
- package/.next/standalone/.next/static/chunks/76201-83b26515f85ce37c.js +1 -0
- package/.next/standalone/.next/static/chunks/78917-a8a8dff98857c045.js +1 -0
- package/.next/standalone/.next/static/chunks/{94643-01be319472d751b3.js → 94643-ffa140f765c73daf.js} +1 -1
- package/.next/standalone/.next/static/chunks/97663-9c3ae4fd60b353db.js +1 -0
- package/.next/standalone/.next/static/chunks/{99373.d0e808c18408b8da.js → 99373.111493dc260a2a04.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-b742c51c0a764daf.js → layout-40fe7d026c5a7c6d.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-87d4d0fe90fca28c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-1206abaee85dc915.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/{page-425acbe9ade5fa83.js → page-474e494097c8945f.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-e902b19328092ccf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-f273288c3530aa0f.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-6568a7b08bf9a54b.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-fbd3c27b68666234.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-58b48aa0a11603c3.js → page-15bb6e1696668512.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-286faced32c6133f.js → page-2bea97214b1595cc.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-2bf7ceee62b574c7.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/{page-5c82cf3abd856301.js → page-540da64d7ba16dc7.js} +1 -1
- package/.next/standalone/.next/static/chunks/{webpack-fa066d7ff9ab2b29.js → webpack-7cbb3ba6792f1fb3.js} +1 -1
- package/.next/standalone/package.json +1 -1
- package/.next/standalone/public/chorus-plugin/.claude-plugin/plugin.json +1 -1
- package/.next/standalone/public/chorus-plugin/bin/chorus-api.sh +44 -1
- package/.next/standalone/public/chorus-plugin/bin/on-session-start.sh +4 -3
- package/.next/standalone/public/chorus-plugin/bin/tests/test-mcp-cli-delegation.sh +244 -0
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +19 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus-cli/SKILL.md +57 -0
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/docs/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +85 -42
- package/.next/standalone/public/chorus-plugin/skills/orchestrate/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +3 -3
- package/.next/standalone/public/dsh-credentials.sh +30 -0
- package/.next/standalone/public/install-codex.sh +21 -406
- package/.next/standalone/public/install-kiro.sh +20 -344
- package/.next/standalone/public/install-opencode.sh +20 -275
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-cli/SKILL.md +57 -0
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-develop/SKILL.md +2 -2
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-docs/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-idea/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-openspec-aware/SKILL.md +85 -42
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-orchestrate/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-proposal/SKILL.md +2 -2
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-quick-dev/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-review/SKILL.md +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/skills/chorus-yolo/SKILL.md +3 -3
- package/.next/standalone/public/kiro-plugin/bin/chorus-api.sh +44 -1
- package/.next/standalone/public/kiro-plugin/bin/on-agent-spawn.sh +6 -4
- package/.next/standalone/public/kiro-plugin/manifest.txt +41 -0
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +19 -1
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/docs-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/orchestrate-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/review-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/.next/standalone/public/test-dsh-credentials.sh +39 -0
- package/.next/standalone/public/test-install-codex.sh +31 -79
- package/README.ja.md +5 -3
- package/README.ko.md +5 -3
- package/README.md +5 -3
- package/README.zh.md +5 -3
- package/chorus.mjs +35 -1
- package/cli/agent-backend-prompt.mjs +94 -0
- package/cli/agents.mjs +329 -0
- package/cli/chorus-client.mjs +69 -0
- package/cli/claude-spawner.mjs +4 -0
- package/cli/client-args.mjs +11 -5
- package/cli/codex-spawner.mjs +11 -6
- package/cli/credentials.mjs +185 -3
- package/cli/daemon-agent.mjs +30 -5
- package/cli/daemon-banner.mjs +3 -3
- package/cli/daemon-config.mjs +27 -2
- package/cli/daemon-install-config.mjs +21 -14
- package/cli/daemon-rest-client.mjs +31 -8
- package/cli/daemon-service.mjs +120 -33
- package/cli/daemon.mjs +175 -28
- package/cli/dsh-managed-config.mjs +407 -0
- package/cli/dsh-spawner.mjs +445 -0
- package/cli/init/adapters.mjs +137 -0
- package/cli/init/agent-type-map.mjs +60 -0
- package/cli/init/chorus-plugin-consts.mjs +16 -0
- package/cli/init/codex-mcp-config.mjs +183 -0
- package/cli/init/contracts.mjs +120 -0
- package/cli/init/detect.mjs +97 -0
- package/cli/init/file-template.mjs +248 -0
- package/cli/init/install-methods.mjs +508 -0
- package/cli/init/registry.mjs +74 -0
- package/cli/init/run-command.mjs +30 -0
- package/cli/init/select.mjs +111 -0
- package/cli/init/steps/credential-seed.mjs +751 -0
- package/cli/init/steps/daemon-setup.mjs +246 -0
- package/cli/init/steps/plugin-install.mjs +37 -0
- package/cli/init-args.mjs +137 -0
- package/cli/init.mjs +198 -0
- package/cli/kiro-spawner.mjs +4 -0
- package/cli/login.mjs +26 -4
- package/cli/mcp-args.mjs +280 -0
- package/cli/mcp.mjs +164 -0
- package/cli/spawner-select.mjs +54 -2
- package/cli/turn-reporter.mjs +5 -2
- package/cli/upload-hooks.mjs +31 -1
- package/cli/waker.mjs +49 -6
- package/package.json +1 -1
- package/prisma/migrations/20260818024700_add_turn_backend_session_id/migration.sql +1 -0
- package/prisma/schema.prisma +3 -0
- package/.next/standalone/.next/server/chunks/3594.js +0 -1
- package/.next/standalone/.next/server/chunks/5351.js +0 -32
- package/.next/standalone/.next/server/chunks/6667.js +0 -1
- package/.next/standalone/.next/server/chunks/6995.js +0 -1
- package/.next/standalone/.next/static/chunks/19887-c0bb297a78a1c7cd.js +0 -1
- package/.next/standalone/.next/static/chunks/29108-5a11eea003f4cc11.js +0 -1
- package/.next/standalone/.next/static/chunks/53073-a7ed20af6538a178.js +0 -1
- package/.next/standalone/.next/static/chunks/6603-e70ddeab6ad09c50.js +0 -1
- package/.next/standalone/.next/static/chunks/78917-1b59cbb806b3ecfc.js +0 -1
- package/.next/standalone/.next/static/chunks/82751-3e161e1d8dbda3ac.js +0 -1
- package/.next/standalone/.next/static/chunks/99366-425e9ef22e60e3e2.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-f636e00c28f425ea.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-c004f1a194af7fa5.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/graph/page-fdd617457730a116.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-6b3fb08d53826d02.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/page-d5b222f379b2e8ca.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-0a6c2d0e1b68e0e4.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-1507a761e67c2aa9.js +0 -1
- /package/.next/standalone/.next/static/{K8qIdwvKoIWbwQ_f01mnM → 0spgxl3lP26Fl1otd1D7R}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{K8qIdwvKoIWbwQ_f01mnM → 0spgxl3lP26Fl1otd1D7R}/_ssgManifest.js +0 -0
package/cli/daemon-service.mjs
CHANGED
|
@@ -35,6 +35,9 @@ import { fileURLToPath } from "node:url";
|
|
|
35
35
|
/** The systemd --user unit name (also the launchd label stem). */
|
|
36
36
|
export const SERVICE_NAME = "chorus-daemon";
|
|
37
37
|
|
|
38
|
+
/** The macOS launchd LaunchAgent label. */
|
|
39
|
+
export const LAUNCHD_LABEL = "com.chorus.daemon";
|
|
40
|
+
|
|
38
41
|
/** Default IO bundle — overridable per-call for tests (no real disk/process). */
|
|
39
42
|
function defaultIO() {
|
|
40
43
|
return {
|
|
@@ -232,25 +235,39 @@ function systemdQuoteArg(token) {
|
|
|
232
235
|
|
|
233
236
|
/**
|
|
234
237
|
* Detect whether a supervisor already manages the chorus daemon on this host.
|
|
235
|
-
* Linux
|
|
236
|
-
* - kind: "
|
|
237
|
-
*
|
|
238
|
-
* - kind: "none" otherwise (or when
|
|
238
|
+
* - Linux → kind: "systemd" (unit file present and/or `is-active` == "active").
|
|
239
|
+
* - macOS → kind: "launchd" (LaunchAgent plist present and/or `launchctl list
|
|
240
|
+
* <label>` reports it loaded).
|
|
241
|
+
* - kind: "none" otherwise (or when the service manager is unavailable).
|
|
239
242
|
* Used by the lifecycle subcommands to decide whether to delegate.
|
|
240
243
|
* @param {object} [io]
|
|
241
|
-
* @returns {{ kind: "systemd", installed: boolean, active: boolean, unitPath: string }
|
|
244
|
+
* @returns {{ kind: "systemd", installed: boolean, active: boolean, unitPath: string }
|
|
245
|
+
* | { kind: "launchd", installed: boolean, active: boolean, label: string, plistPath: string }
|
|
246
|
+
* | { kind: "none" }}
|
|
242
247
|
*/
|
|
243
248
|
export function detectSupervisor(io = defaultIO()) {
|
|
244
|
-
if (io.platform
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
249
|
+
if (io.platform === "linux") {
|
|
250
|
+
const unitPath = systemdUnitPath(io);
|
|
251
|
+
const installed = safeExists(unitPath, io);
|
|
252
|
+
// `is-active` is authoritative for "running under systemd right now". Query it
|
|
253
|
+
// even when the unit file is absent: a transient/unit-less path still returns
|
|
254
|
+
// non-active, and we never want to throw here.
|
|
255
|
+
const activeRes = systemctlUser(["is-active", `${SERVICE_NAME}.service`], io);
|
|
256
|
+
const active = (activeRes.stdout ?? "").trim() === "active";
|
|
257
|
+
if (!installed && !active) return { kind: "none" };
|
|
258
|
+
return { kind: "systemd", installed, active, unitPath };
|
|
259
|
+
}
|
|
260
|
+
if (io.platform === "darwin") {
|
|
261
|
+
const plistPath = launchdPlistPath(io);
|
|
262
|
+
const installed = safeExists(plistPath, io);
|
|
263
|
+
// `launchctl list <label>` exits 0 when the agent is loaded (prints its dict),
|
|
264
|
+
// non-zero otherwise. This is authoritative for "loaded right now".
|
|
265
|
+
const listRes = launchctl(["list", LAUNCHD_LABEL], io);
|
|
266
|
+
const active = listRes.status === 0;
|
|
267
|
+
if (!installed && !active) return { kind: "none" };
|
|
268
|
+
return { kind: "launchd", installed, active, label: LAUNCHD_LABEL, plistPath };
|
|
269
|
+
}
|
|
270
|
+
return { kind: "none" };
|
|
254
271
|
}
|
|
255
272
|
|
|
256
273
|
function safeExists(path, io) {
|
|
@@ -281,6 +298,44 @@ export function journalctlUser(args, io = defaultIO()) {
|
|
|
281
298
|
}
|
|
282
299
|
}
|
|
283
300
|
|
|
301
|
+
/** Run `launchctl <args>`, capturing output. Never throws. macOS only. */
|
|
302
|
+
export function launchctl(args, io = defaultIO()) {
|
|
303
|
+
try {
|
|
304
|
+
const r = io.spawnSync("launchctl", args, { encoding: "utf8" });
|
|
305
|
+
// spawnSync sets .error (and status null) when the binary is missing (ENOENT);
|
|
306
|
+
// surface that as a null status + the error message rather than throwing.
|
|
307
|
+
if (r?.error) {
|
|
308
|
+
return { status: null, stdout: r?.stdout ?? "", stderr: String(r.error.message ?? r.error) };
|
|
309
|
+
}
|
|
310
|
+
return { status: r?.status ?? null, stdout: r?.stdout ?? "", stderr: r?.stderr ?? "" };
|
|
311
|
+
} catch (err) {
|
|
312
|
+
return { status: null, stdout: "", stderr: err instanceof Error ? err.message : String(err) };
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
/**
|
|
317
|
+
* Classify whether THIS host supports installing a real boot-autostart daemon
|
|
318
|
+
* service, and via which supervisor. The single source of truth both
|
|
319
|
+
* `chorus daemon install` and the `chorus agents add` daemon-setup step consult so they
|
|
320
|
+
* cannot disagree about what "supported" means (add-chorus-init-daemon-setup).
|
|
321
|
+
* - "systemd" — Linux where `systemctl --user` is usable.
|
|
322
|
+
* - "launchd" — macOS (launchctl is always present).
|
|
323
|
+
* - "unsupported" — Linux without a usable systemctl, Windows, or anything else.
|
|
324
|
+
* Pure-ish: only probes `systemctl --user --version` on Linux (injected IO).
|
|
325
|
+
* @param {object} [io]
|
|
326
|
+
* @returns {"systemd" | "launchd" | "unsupported"}
|
|
327
|
+
*/
|
|
328
|
+
export function autostartCapability(io = defaultIO()) {
|
|
329
|
+
if (io.platform === "darwin") return "launchd";
|
|
330
|
+
if (io.platform === "linux") {
|
|
331
|
+
// `systemctl --user` must be reachable — a container/minimal host may lack it,
|
|
332
|
+
// in which case there is no real boot service we can install.
|
|
333
|
+
const probe = systemctlUser(["--version"], io);
|
|
334
|
+
return probe.status === 0 ? "systemd" : "unsupported";
|
|
335
|
+
}
|
|
336
|
+
return "unsupported";
|
|
337
|
+
}
|
|
338
|
+
|
|
284
339
|
/**
|
|
285
340
|
* Install the systemd --user unit (Linux) or return the template to print
|
|
286
341
|
* (macOS/Windows). On Linux: write the unit, `daemon-reload`, `enable --now`.
|
|
@@ -331,19 +386,39 @@ export function installService(spec, io = defaultIO()) {
|
|
|
331
386
|
}
|
|
332
387
|
}
|
|
333
388
|
if (io.platform === "darwin") {
|
|
389
|
+
// Real launchd install (add-chorus-init-daemon-setup): write the LaunchAgent
|
|
390
|
+
// plist and `launchctl load -w` it so it starts now and at every login —
|
|
391
|
+
// no longer a printed-template-only posture.
|
|
334
392
|
const plistPath = launchdPlistPath(io);
|
|
335
393
|
const unitText = renderLaunchdPlist({ ...spec, home, logPath: join(home, ".chorus", "daemon.log") });
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
394
|
+
const steps = [];
|
|
395
|
+
try {
|
|
396
|
+
io.mkdirSync(dirname(plistPath), { recursive: true });
|
|
397
|
+
// Back up an existing plist before overwrite (backup-before-overwrite
|
|
398
|
+
// convention, mirrors the init plugin-install step); best-effort.
|
|
399
|
+
if (safeExists(plistPath, io) && typeof io.readFileSync === "function") {
|
|
400
|
+
try {
|
|
401
|
+
io.writeFileSync(`${plistPath}.chorus-bak`, io.readFileSync(plistPath));
|
|
402
|
+
steps.push(`backed up existing plist → ${plistPath}.chorus-bak`);
|
|
403
|
+
} catch {
|
|
404
|
+
// a failed backup must not block the (idempotent) re-install
|
|
405
|
+
}
|
|
406
|
+
}
|
|
407
|
+
// Unload any currently-loaded copy first so a re-install applies the new
|
|
408
|
+
// plist rather than leaving the old agent running (parallels the systemd
|
|
409
|
+
// restart). Best-effort — a not-loaded agent returns non-zero here.
|
|
410
|
+
launchctl(["unload", plistPath], io);
|
|
411
|
+
io.writeFileSync(plistPath, unitText, { mode: 0o644 });
|
|
412
|
+
steps.push(`wrote ${plistPath}`);
|
|
413
|
+
const load = launchctl(["load", "-w", plistPath], io);
|
|
414
|
+
if (load.status !== 0) {
|
|
415
|
+
return { platform: "darwin", installed: false, unitPath: plistPath, unitText, steps, error: `launchctl load -w failed: ${load.stderr.trim() || `exit ${load.status}`}` };
|
|
416
|
+
}
|
|
417
|
+
steps.push(`launchctl load -w ${plistPath}`);
|
|
418
|
+
return { platform: "darwin", installed: true, unitPath: plistPath, unitText, steps };
|
|
419
|
+
} catch (err) {
|
|
420
|
+
return { platform: "darwin", installed: false, unitPath: plistPath, unitText, steps, error: err instanceof Error ? err.message : String(err) };
|
|
421
|
+
}
|
|
347
422
|
}
|
|
348
423
|
// Windows / other: no first-class service model without native deps. Print the
|
|
349
424
|
// foreground command an operator can wrap in their supervisor of choice.
|
|
@@ -398,18 +473,30 @@ export function uninstallService(io = defaultIO()) {
|
|
|
398
473
|
return { platform: "linux", removed: existed || disable.status === 0, unitPath, steps };
|
|
399
474
|
}
|
|
400
475
|
if (io.platform === "darwin") {
|
|
476
|
+
// Real launchd uninstall (add-chorus-init-daemon-setup): unload the agent and
|
|
477
|
+
// remove the plist. Idempotent: tolerate an already-absent plist / not-loaded
|
|
478
|
+
// agent.
|
|
401
479
|
const plistPath = launchdPlistPath(io);
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
};
|
|
480
|
+
const steps = [];
|
|
481
|
+
const existed = safeExists(plistPath, io);
|
|
482
|
+
// unload -w stops the agent and clears its "enabled" override; a not-loaded
|
|
483
|
+
// agent returns non-zero, which we tolerate.
|
|
484
|
+
const unload = launchctl(["unload", "-w", plistPath], io);
|
|
485
|
+
if (unload.status === 0) steps.push(`launchctl unload -w ${plistPath}`);
|
|
486
|
+
try {
|
|
487
|
+
if (existed) {
|
|
488
|
+
io.unlinkSync(plistPath);
|
|
489
|
+
steps.push(`removed ${plistPath}`);
|
|
490
|
+
}
|
|
491
|
+
} catch (err) {
|
|
492
|
+
return { platform: "darwin", removed: false, unitPath: plistPath, steps, error: err instanceof Error ? err.message : String(err) };
|
|
493
|
+
}
|
|
494
|
+
return { platform: "darwin", removed: existed, unitPath: plistPath, steps };
|
|
408
495
|
}
|
|
409
496
|
return {
|
|
410
497
|
platform: "other",
|
|
411
498
|
removed: false,
|
|
412
|
-
steps: ["Automatic service uninstall is only supported on Linux (systemd). Remove the daemon from your supervisor manually."],
|
|
499
|
+
steps: ["Automatic service uninstall is only supported on Linux (systemd) and macOS (launchd). Remove the daemon from your supervisor manually."],
|
|
413
500
|
};
|
|
414
501
|
}
|
|
415
502
|
|
package/cli/daemon.mjs
CHANGED
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
yoloWarningLine,
|
|
32
32
|
} from "./daemon-permission-mode.mjs";
|
|
33
33
|
import { resolveAgentType, backendClientType } from "./daemon-agent.mjs";
|
|
34
|
+
import { isWakeableAgentType } from "./init/agent-type-map.mjs";
|
|
34
35
|
import { formatBanner, agentNotFoundWarningLine } from "./daemon-banner.mjs";
|
|
35
36
|
import { ChorusClient, validateAndFetchIdentity } from "./chorus-client.mjs";
|
|
36
37
|
import { SseListener } from "./sse-listener.mjs";
|
|
@@ -41,6 +42,8 @@ import { Waker } from "./waker.mjs";
|
|
|
41
42
|
import { LineageResolver } from "./lineage.mjs";
|
|
42
43
|
import { resolveClaudePath } from "./claude-spawner.mjs";
|
|
43
44
|
import { resolveCodexPath } from "./codex-spawner.mjs";
|
|
45
|
+
import { resolveDshPath } from "./dsh-spawner.mjs";
|
|
46
|
+
import { prepareManagedDshConfig } from "./dsh-managed-config.mjs";
|
|
44
47
|
import { resolveKiroPath } from "./kiro-spawner.mjs";
|
|
45
48
|
import { selectSpawner } from "./spawner-select.mjs";
|
|
46
49
|
import {
|
|
@@ -73,6 +76,7 @@ import {
|
|
|
73
76
|
uninstallService,
|
|
74
77
|
systemctlUser,
|
|
75
78
|
journalctlUser,
|
|
79
|
+
launchctl,
|
|
76
80
|
resolveServicePaths,
|
|
77
81
|
SERVICE_NAME,
|
|
78
82
|
} from "./daemon-service.mjs";
|
|
@@ -152,7 +156,13 @@ export function buildDaemon(creds, deps = {}) {
|
|
|
152
156
|
// (construction byte-identical to before); codex → CodexSpawner. `creds` are
|
|
153
157
|
// passed through so the Codex backend can export the daemon key into the woken
|
|
154
158
|
// process env (the Claude backend ignores creds — it gets its key via --mcp-config).
|
|
155
|
-
const spawner = deps.spawner ?? selectSpawner(agentType, {
|
|
159
|
+
const spawner = deps.spawner ?? selectSpawner(agentType, {
|
|
160
|
+
logger,
|
|
161
|
+
permissionMode,
|
|
162
|
+
creds,
|
|
163
|
+
bundleVersion: deps.bundleVersion,
|
|
164
|
+
prepareManagedConfigFn: deps.prepareManagedDshConfig,
|
|
165
|
+
});
|
|
156
166
|
const maxConcurrency = deps.maxConcurrency ?? 4;
|
|
157
167
|
|
|
158
168
|
// ===== Multi-path: the SET of cwds this daemon serves (T3 — FR-5) =====
|
|
@@ -625,6 +635,27 @@ export function buildMultiAgentDaemon(agentConfigs, deps = {}) {
|
|
|
625
635
|
|
|
626
636
|
const agents = agentConfigs
|
|
627
637
|
.map((cfg, i) => {
|
|
638
|
+
// Offline agents are proxy-only: their key is parked in daemon.json solely so
|
|
639
|
+
// `chorus mcp` can act under that identity (it reads the file directly, not via
|
|
640
|
+
// this runtime). The daemon-multi-agent spec says the daemon SHALL NOT construct
|
|
641
|
+
// a spawner, dispatch wakes, OR register it as a wakeable connection. Building a
|
|
642
|
+
// runtime here would open an SSE stream that self-reports a connection — so we
|
|
643
|
+
// SKIP the offline agent entirely (no runtime, no connection, no self-report),
|
|
644
|
+
// which is what closes the T4-review registration gap. Returning null (kept in
|
|
645
|
+
// step with a build failure) preserves the original index `i` for the per-agent
|
|
646
|
+
// injected-dep alignment below (map keeps the index; the filter drops the null).
|
|
647
|
+
// Skip = not woken: an offline backend (can't be woken) OR a wakeable backend
|
|
648
|
+
// the operator opted out of (`daemonWake: false`). Both get the same proxy-only
|
|
649
|
+
// treatment (no runtime/SSE/connection); the key stays in daemon.json for
|
|
650
|
+
// `chorus mcp`. `daemonWake` absent/true ⇒ woken (back-compat with entries that
|
|
651
|
+
// predate the field).
|
|
652
|
+
if (cfg.agentType === "offline" || cfg.daemonWake === false) {
|
|
653
|
+
const why = cfg.agentType === "offline" ? "offline backend" : "daemon waking disabled (daemonWake:false)";
|
|
654
|
+
logger.info?.(
|
|
655
|
+
`[Chorus] agent ${cfg.label}: ${why} — proxy-only key, no wakeable connection registered`,
|
|
656
|
+
);
|
|
657
|
+
return null;
|
|
658
|
+
}
|
|
628
659
|
// Per-agent deps: cfg fields drive the per-agent runtime; injectable fakes are
|
|
629
660
|
// indexed per agent. `cwd` (singular) is cleared so a caller's single value can
|
|
630
661
|
// never leak across agents — each agent's `cwds` is authoritative.
|
|
@@ -647,7 +678,13 @@ export function buildMultiAgentDaemon(agentConfigs, deps = {}) {
|
|
|
647
678
|
: deps.makeSseListener,
|
|
648
679
|
};
|
|
649
680
|
try {
|
|
650
|
-
return {
|
|
681
|
+
return {
|
|
682
|
+
cfg,
|
|
683
|
+
daemon: build(
|
|
684
|
+
{ url: cfg.url, apiKey: cfg.apiKey, agentUuid: cfg.agentUuid, agentName: cfg.agentName },
|
|
685
|
+
agentDeps,
|
|
686
|
+
),
|
|
687
|
+
};
|
|
651
688
|
} catch (err) {
|
|
652
689
|
logger.error?.(
|
|
653
690
|
`[Chorus] agent ${cfg.label}: failed to build runtime — skipping ` +
|
|
@@ -659,6 +696,33 @@ export function buildMultiAgentDaemon(agentConfigs, deps = {}) {
|
|
|
659
696
|
.filter(Boolean);
|
|
660
697
|
|
|
661
698
|
if (agents.length === 0) {
|
|
699
|
+
// Distinguish "all offline" (nothing wakeable to serve — not an error) from
|
|
700
|
+
// "every wakeable runtime threw" (a real build failure). An all-offline config
|
|
701
|
+
// is a legitimate proxy-only setup: return an idle no-op daemon so the process
|
|
702
|
+
// stays up (its offline keys remain available to `chorus mcp`) rather than
|
|
703
|
+
// crashing with a misleading "all runtimes failed" error.
|
|
704
|
+
const anyWakeable = agentConfigs.some(
|
|
705
|
+
(cfg) => isWakeableAgentType(cfg.agentType) && cfg.daemonWake !== false,
|
|
706
|
+
);
|
|
707
|
+
if (!anyWakeable) {
|
|
708
|
+
logger.warn?.(
|
|
709
|
+
"[Chorus] all configured agents are offline — no daemon-wakeable backend to serve. " +
|
|
710
|
+
"Offline keys remain in daemon.json for `chorus mcp`; the daemon has nothing to wake.",
|
|
711
|
+
);
|
|
712
|
+
return {
|
|
713
|
+
agents: [],
|
|
714
|
+
connections: [],
|
|
715
|
+
// No wakeable connection was registered, so there are no back-compat aliases.
|
|
716
|
+
waker: undefined,
|
|
717
|
+
router: undefined,
|
|
718
|
+
sseListener: undefined,
|
|
719
|
+
// Never settles: an idle daemon simply waits (it registered no connection, so
|
|
720
|
+
// it can never be "all-conflicted"). runDaemon keeps it alive on waitForever.
|
|
721
|
+
allConflict: new Promise(() => {}),
|
|
722
|
+
async start() {},
|
|
723
|
+
async stop() {},
|
|
724
|
+
};
|
|
725
|
+
}
|
|
662
726
|
throw new Error("buildMultiAgentDaemon: all agent runtimes failed to build");
|
|
663
727
|
}
|
|
664
728
|
|
|
@@ -742,6 +806,7 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
742
806
|
// banner shows the right binary instead of always probing for `claude`.
|
|
743
807
|
const findClaude = deps.resolveClaudePath ?? resolveClaudePath;
|
|
744
808
|
const findCodex = deps.resolveCodexPath ?? resolveCodexPath;
|
|
809
|
+
const findDsh = deps.resolveDshPath ?? resolveDshPath;
|
|
745
810
|
const findKiro = deps.resolveKiroPath ?? resolveKiroPath;
|
|
746
811
|
const verbose = flags.verbose === true || env.CHORUS_VERBOSE === "1";
|
|
747
812
|
|
|
@@ -774,6 +839,7 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
774
839
|
uninstallService,
|
|
775
840
|
systemctlUser,
|
|
776
841
|
journalctlUser,
|
|
842
|
+
launchctl,
|
|
777
843
|
resolveServicePaths: () => resolveServicePaths(env),
|
|
778
844
|
};
|
|
779
845
|
// The preflight dep bundle — built from the same seams runDaemon resolved, so
|
|
@@ -786,6 +852,9 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
786
852
|
writeConfig: deps.writeConfig,
|
|
787
853
|
readJson: deps.readJson,
|
|
788
854
|
loginPath: deps.loginPath,
|
|
855
|
+
prepareManagedDshConfig: deps.prepareManagedDshConfig,
|
|
856
|
+
bundleVersion: version,
|
|
857
|
+
resolveDshPath: findDsh,
|
|
789
858
|
};
|
|
790
859
|
|
|
791
860
|
const action = flags.action ?? "run";
|
|
@@ -848,6 +917,11 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
848
917
|
for (const cfg of agentConfigs) {
|
|
849
918
|
try {
|
|
850
919
|
const id = await validate({ url: cfg.url, apiKey: cfg.apiKey });
|
|
920
|
+
// The validated identity is authoritative for the CHORUS_AGENT_PROFILE the
|
|
921
|
+
// spawner exports — fill from it when daemon.json omitted the field
|
|
922
|
+
// (resolveAgentConfigs already normalized these to a trimmed string | undefined).
|
|
923
|
+
cfg.agentUuid = cfg.agentUuid ?? id.uuid;
|
|
924
|
+
cfg.agentName = cfg.agentName ?? id.name;
|
|
851
925
|
okConfigs.push(cfg);
|
|
852
926
|
log(
|
|
853
927
|
`[Chorus] agent ${cfg.label}: ${id.name} (${id.uuid}) — ${cfg.agentType}, ` +
|
|
@@ -884,6 +958,8 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
884
958
|
mcpClient: deps.mcpClient,
|
|
885
959
|
lineage: deps.lineage,
|
|
886
960
|
build: deps.build,
|
|
961
|
+
bundleVersion: version,
|
|
962
|
+
prepareManagedDshConfig: deps.prepareManagedDshConfig,
|
|
887
963
|
});
|
|
888
964
|
|
|
889
965
|
const shutdownMulti = () => {
|
|
@@ -924,11 +1000,16 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
924
1000
|
// Detect the SELECTED backend's executable (non-fatal): the daemon still
|
|
925
1001
|
// subscribes when it's missing; a wake surfaces the error visibly when one
|
|
926
1002
|
// 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`.
|
|
1003
|
+
// backend probes its own binary, including dsh-jsonrpc-agent for dsh, so the
|
|
1004
|
+
// startup banner and warning report the selected runtime rather than Claude.
|
|
930
1005
|
const cliPath =
|
|
931
|
-
agentType === "codex"
|
|
1006
|
+
agentType === "codex"
|
|
1007
|
+
? findCodex()
|
|
1008
|
+
: agentType === "kiro"
|
|
1009
|
+
? findKiro()
|
|
1010
|
+
: agentType === "dsh"
|
|
1011
|
+
? findDsh()
|
|
1012
|
+
: findClaude();
|
|
932
1013
|
|
|
933
1014
|
// The daemon.json the layered config readers (credentials, sigint timeout, cwds)
|
|
934
1015
|
// consult. Surfacing its absolute path + presence in the banner makes it obvious
|
|
@@ -979,7 +1060,11 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
979
1060
|
}
|
|
980
1061
|
log(`[Chorus] browse roots: ${browseRoots.join(", ")} (discovery only; no connections created)`);
|
|
981
1062
|
|
|
982
|
-
const daemon = build(
|
|
1063
|
+
const daemon = build(
|
|
1064
|
+
// Export this agent's identity as CHORUS_AGENT_PROFILE in the woken session
|
|
1065
|
+
// (the validated identity is authoritative; creds may already carry it).
|
|
1066
|
+
{ ...creds, agentUuid: creds.agentUuid ?? identity.uuid, agentName: creds.agentName ?? identity.name },
|
|
1067
|
+
{
|
|
983
1068
|
logger: { info: log, warn: errLog, error: errLog },
|
|
984
1069
|
permissionMode,
|
|
985
1070
|
agentType,
|
|
@@ -987,6 +1072,8 @@ export async function runDaemon(flags = {}, deps = {}) {
|
|
|
987
1072
|
sigintTimeoutMs,
|
|
988
1073
|
cwds,
|
|
989
1074
|
browseRoots,
|
|
1075
|
+
bundleVersion: version,
|
|
1076
|
+
prepareManagedDshConfig: deps.prepareManagedDshConfig,
|
|
990
1077
|
});
|
|
991
1078
|
|
|
992
1079
|
// Graceful shutdown on signals.
|
|
@@ -1097,11 +1184,13 @@ export async function preflight(ctx) {
|
|
|
1097
1184
|
/**
|
|
1098
1185
|
* Dispatch a daemon lifecycle subcommand. Two families:
|
|
1099
1186
|
* - install / uninstall — manage the boot-autostart supervisor service
|
|
1100
|
-
* (systemd --user on Linux; a printed template
|
|
1187
|
+
* (systemd --user on Linux; launchd LaunchAgent on macOS; a printed template
|
|
1188
|
+
* on Windows/other).
|
|
1101
1189
|
* - status / stop / restart / logs — when a supervisor unit is installed and
|
|
1102
|
-
* active, DELEGATE to it (systemctl / journalctl
|
|
1103
|
-
* never misreported as "not running";
|
|
1104
|
-
* pidfile/logfile-managed `-d` background daemon
|
|
1190
|
+
* active, DELEGATE to it (systemctl / journalctl on Linux, launchctl on
|
|
1191
|
+
* macOS) so a supervised daemon is never misreported as "not running";
|
|
1192
|
+
* otherwise operate on the pidfile/logfile-managed `-d` background daemon
|
|
1193
|
+
* exactly as before.
|
|
1105
1194
|
* Each reports clearly (no silent failure). `restart` performs
|
|
1106
1195
|
* stop-then-detached-start on the pidfile path.
|
|
1107
1196
|
* @returns {Promise<number>} exit code
|
|
@@ -1171,7 +1260,7 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1171
1260
|
// CHORUS_AGENT env / a prior stored choice; probes the selected CLI and warns
|
|
1172
1261
|
// (non-fatal) when it is missing. An unknown --agent was already rejected by
|
|
1173
1262
|
// resolveAgentType above, so this phase never fails.
|
|
1174
|
-
await installCfg.resolveInstallAgent(flags, env, {
|
|
1263
|
+
const installAgent = await installCfg.resolveInstallAgent(flags, env, {
|
|
1175
1264
|
isTTY,
|
|
1176
1265
|
skip,
|
|
1177
1266
|
writeConfig: pfDeps?.writeConfig ?? updateDaemonConfig,
|
|
@@ -1181,6 +1270,26 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1181
1270
|
log,
|
|
1182
1271
|
errLog,
|
|
1183
1272
|
});
|
|
1273
|
+
if (
|
|
1274
|
+
installAgent.agent === "dsh" &&
|
|
1275
|
+
!String(env.CHORUS_DSH_CONFIG ?? "").trim() &&
|
|
1276
|
+
!String(env.DSH_CORDIS_CONFIG ?? "").trim()
|
|
1277
|
+
) {
|
|
1278
|
+
try {
|
|
1279
|
+
await (pfDeps?.prepareManagedDshConfig ?? prepareManagedDshConfig)({
|
|
1280
|
+
env,
|
|
1281
|
+
bundleVersion: pfDeps?.bundleVersion,
|
|
1282
|
+
dshPath: installAgent.cliPath ?? pfDeps?.resolveDshPath?.(),
|
|
1283
|
+
creds: credResult.creds,
|
|
1284
|
+
});
|
|
1285
|
+
} catch (error) {
|
|
1286
|
+
errLog(
|
|
1287
|
+
`[Chorus] install aborted — dsh managed composition preparation failed: ` +
|
|
1288
|
+
`${error instanceof Error ? error.message : String(error)}`,
|
|
1289
|
+
);
|
|
1290
|
+
return 1;
|
|
1291
|
+
}
|
|
1292
|
+
}
|
|
1184
1293
|
|
|
1185
1294
|
const spec = {
|
|
1186
1295
|
...svc.resolveServicePaths(),
|
|
@@ -1198,21 +1307,26 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1198
1307
|
for (const s of r.steps) log(`[Chorus] ${s}`);
|
|
1199
1308
|
log(`[Chorus] it will now start automatically at login. Manage it with:`);
|
|
1200
1309
|
log(`[Chorus] chorus daemon status | stop | restart | logs`);
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
|
|
1204
|
-
|
|
1205
|
-
|
|
1310
|
+
if (r.platform === "linux") {
|
|
1311
|
+
// A --user service only survives logout with lingering enabled; and a
|
|
1312
|
+
// separately-started `chorus daemon -d` would hold the same paths and make
|
|
1313
|
+
// this service exit-and-retry. Surface both so neither is a silent gotcha.
|
|
1314
|
+
log(`[Chorus] to keep it running after you log out: loginctl enable-linger "$USER"`);
|
|
1315
|
+
log(`[Chorus] if you previously ran 'chorus daemon -d', stop it first ('chorus daemon stop') so it doesn't hold the same paths.`);
|
|
1316
|
+
} else if (r.platform === "darwin") {
|
|
1317
|
+
log(`[Chorus] if you previously ran 'chorus daemon -d', stop it first ('chorus daemon stop') so it doesn't hold the same paths.`);
|
|
1318
|
+
}
|
|
1206
1319
|
return 0;
|
|
1207
1320
|
}
|
|
1208
|
-
if (r.platform === "linux") {
|
|
1209
|
-
//
|
|
1321
|
+
if (r.platform === "linux" || r.platform === "darwin") {
|
|
1322
|
+
// A real install (systemd/launchd) actually failed — surface it, never a
|
|
1323
|
+
// silent success or a misleading "not supported" message.
|
|
1210
1324
|
errLog(`[Chorus] service install failed: ${r.error}`);
|
|
1211
1325
|
for (const s of r.steps) errLog(`[Chorus] (did: ${s})`);
|
|
1212
1326
|
return 1;
|
|
1213
1327
|
}
|
|
1214
|
-
//
|
|
1215
|
-
log(`[Chorus] automatic install is
|
|
1328
|
+
// Windows / other: no first-class auto-install — print the template + steps.
|
|
1329
|
+
log(`[Chorus] automatic install is not supported on this platform. To run the daemon as a service:`);
|
|
1216
1330
|
for (const s of r.steps) log(`[Chorus] ${s}`);
|
|
1217
1331
|
log("");
|
|
1218
1332
|
log(r.unitText);
|
|
@@ -1220,7 +1334,7 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1220
1334
|
}
|
|
1221
1335
|
if (action === "uninstall") {
|
|
1222
1336
|
const r = svc.uninstallService();
|
|
1223
|
-
if (r.platform === "linux") {
|
|
1337
|
+
if (r.platform === "linux" || r.platform === "darwin") {
|
|
1224
1338
|
if (r.error) {
|
|
1225
1339
|
errLog(`[Chorus] service uninstall failed: ${r.error}`);
|
|
1226
1340
|
return 1;
|
|
@@ -1233,22 +1347,32 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1233
1347
|
}
|
|
1234
1348
|
return 0;
|
|
1235
1349
|
}
|
|
1236
|
-
log(`[Chorus] automatic uninstall is
|
|
1350
|
+
log(`[Chorus] automatic uninstall is not supported on this platform. To remove the service:`);
|
|
1237
1351
|
for (const s of r.steps) log(`[Chorus] ${s}`);
|
|
1238
1352
|
return 0;
|
|
1239
1353
|
}
|
|
1240
1354
|
|
|
1241
1355
|
// For the control verbs, prefer a live supervisor unit over the pidfile.
|
|
1356
|
+
// A supervisor is systemd (Linux) or launchd (macOS); both delegate the verbs
|
|
1357
|
+
// to their service manager so a supervised daemon is never misreported as "not
|
|
1358
|
+
// running" via the pidfile.
|
|
1242
1359
|
const sup = svc.detectSupervisor();
|
|
1243
|
-
const
|
|
1360
|
+
const systemd = sup.kind === "systemd" && sup.installed;
|
|
1361
|
+
const launchd = sup.kind === "launchd" && sup.installed;
|
|
1244
1362
|
|
|
1245
1363
|
if (action === "status") {
|
|
1246
|
-
if (
|
|
1364
|
+
if (systemd) {
|
|
1247
1365
|
log(`[Chorus] daemon is managed by systemd (${SERVICE_NAME}.service) — ${sup.active ? "active" : "installed but NOT active"}.`);
|
|
1248
1366
|
const r = svc.systemctlUser(["status", "--no-pager", `${SERVICE_NAME}.service`]);
|
|
1249
1367
|
if (r.stdout) log(r.stdout.trimEnd());
|
|
1250
1368
|
return sup.active ? 0 : 1;
|
|
1251
1369
|
}
|
|
1370
|
+
if (launchd) {
|
|
1371
|
+
log(`[Chorus] daemon is managed by launchd (${sup.label}) — ${sup.active ? "loaded" : "installed but NOT loaded"}.`);
|
|
1372
|
+
const r = svc.launchctl(["list", sup.label]);
|
|
1373
|
+
if (r.stdout) log(r.stdout.trimEnd());
|
|
1374
|
+
return sup.active ? 0 : 1;
|
|
1375
|
+
}
|
|
1252
1376
|
const s = lifecycle.isRunning();
|
|
1253
1377
|
if (s.running) log(`[Chorus] daemon is running (pid ${s.pid}).`);
|
|
1254
1378
|
else if (s.stale) log(`[Chorus] daemon is NOT running (stale pidfile for pid ${s.pid}).`);
|
|
@@ -1256,7 +1380,7 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1256
1380
|
return 0;
|
|
1257
1381
|
}
|
|
1258
1382
|
if (action === "logs") {
|
|
1259
|
-
if (
|
|
1383
|
+
if (systemd) {
|
|
1260
1384
|
const r = svc.journalctlUser(["-u", `${SERVICE_NAME}.service`, "--no-pager", "-n", "200"]);
|
|
1261
1385
|
if (r.status !== 0 && !r.stdout) {
|
|
1262
1386
|
errLog(`[Chorus] could not read the service journal: ${r.stderr.trim() || `exit ${r.status}`}`);
|
|
@@ -1265,6 +1389,8 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1265
1389
|
log(r.stdout.trimEnd());
|
|
1266
1390
|
return 0;
|
|
1267
1391
|
}
|
|
1392
|
+
// launchd (and the pidfile path) both log to ~/.chorus/daemon.log — the plist
|
|
1393
|
+
// routes stdout/stderr there — so the pidfile logfile reader serves both.
|
|
1268
1394
|
const r = lifecycle.readLog();
|
|
1269
1395
|
if (!r.ok) {
|
|
1270
1396
|
errLog(`[Chorus] ${r.message}`);
|
|
@@ -1274,7 +1400,7 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1274
1400
|
return 0;
|
|
1275
1401
|
}
|
|
1276
1402
|
if (action === "stop") {
|
|
1277
|
-
if (
|
|
1403
|
+
if (systemd) {
|
|
1278
1404
|
const r = svc.systemctlUser(["stop", `${SERVICE_NAME}.service`]);
|
|
1279
1405
|
if (r.status === 0) {
|
|
1280
1406
|
log(`[Chorus] stopped the daemon service (systemctl --user stop ${SERVICE_NAME}.service).`);
|
|
@@ -1284,6 +1410,16 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1284
1410
|
errLog(`[Chorus] failed to stop the service: ${r.stderr.trim() || `exit ${r.status}`}`);
|
|
1285
1411
|
return 1;
|
|
1286
1412
|
}
|
|
1413
|
+
if (launchd) {
|
|
1414
|
+
const r = svc.launchctl(["unload", sup.plistPath]);
|
|
1415
|
+
if (r.status === 0) {
|
|
1416
|
+
log(`[Chorus] stopped the daemon service (launchctl unload ${sup.plistPath}).`);
|
|
1417
|
+
log(`[Chorus] note: it will load again at next login. To disable: chorus daemon uninstall`);
|
|
1418
|
+
return 0;
|
|
1419
|
+
}
|
|
1420
|
+
errLog(`[Chorus] failed to stop the service: ${r.stderr.trim() || `exit ${r.status}`}`);
|
|
1421
|
+
return 1;
|
|
1422
|
+
}
|
|
1287
1423
|
// --force: unconditional pidfile cleanup for stuck states the identity
|
|
1288
1424
|
// probe cannot resolve. Threaded from the parsed client flags.
|
|
1289
1425
|
const r = lifecycle.stopDaemon({ force: pfDeps?.flags?.force === true });
|
|
@@ -1295,7 +1431,7 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1295
1431
|
return ok ? 0 : 1;
|
|
1296
1432
|
}
|
|
1297
1433
|
if (action === "restart") {
|
|
1298
|
-
if (
|
|
1434
|
+
if (systemd) {
|
|
1299
1435
|
const r = svc.systemctlUser(["restart", `${SERVICE_NAME}.service`]);
|
|
1300
1436
|
if (r.status === 0) {
|
|
1301
1437
|
log(`[Chorus] restarted the daemon service (systemctl --user restart ${SERVICE_NAME}.service).`);
|
|
@@ -1304,6 +1440,17 @@ export async function handleLifecycleAction(action, { log, errLog, lifecycle, se
|
|
|
1304
1440
|
errLog(`[Chorus] failed to restart the service: ${r.stderr.trim() || `exit ${r.status}`}`);
|
|
1305
1441
|
return 1;
|
|
1306
1442
|
}
|
|
1443
|
+
if (launchd) {
|
|
1444
|
+
// launchd has no atomic restart — unload then load the same plist.
|
|
1445
|
+
svc.launchctl(["unload", sup.plistPath]);
|
|
1446
|
+
const r = svc.launchctl(["load", sup.plistPath]);
|
|
1447
|
+
if (r.status === 0) {
|
|
1448
|
+
log(`[Chorus] restarted the daemon service (launchctl unload+load ${sup.plistPath}).`);
|
|
1449
|
+
return 0;
|
|
1450
|
+
}
|
|
1451
|
+
errLog(`[Chorus] failed to restart the service: ${r.stderr.trim() || `exit ${r.status}`}`);
|
|
1452
|
+
return 1;
|
|
1453
|
+
}
|
|
1307
1454
|
const r = lifecycle.stopDaemon();
|
|
1308
1455
|
log(`[Chorus] ${r.message}`);
|
|
1309
1456
|
// Start a fresh detached instance regardless of whether one was running.
|