@chorus-aidlc/chorus 0.16.1 → 0.16.3
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 +450 -438
- package/.next/standalone/.next/app-path-routes-manifest.json +48 -48
- package/.next/standalone/.next/build-manifest.json +5 -5
- package/.next/standalone/.next/prerender-manifest.json +18 -18
- 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 +2 -2
- 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.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.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.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.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.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 +48 -48
- 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/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/5245.js +1 -1
- package/.next/standalone/.next/server/chunks/5351.js +1 -1
- package/.next/standalone/.next/server/chunks/{2547.js → 5489.js} +5 -5
- package/.next/standalone/.next/server/chunks/6113.js +1 -1
- package/.next/standalone/.next/server/chunks/6506.js +3 -3
- package/.next/standalone/.next/server/chunks/6515.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/7364.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/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/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.97e534422c57aee1.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-c0bb297a78a1c7cd.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-e171d8b8c680cbb5.js → 29108-5a11eea003f4cc11.js} +1 -1
- package/.next/standalone/.next/static/chunks/29305-f587e7e81bc0b200.js +10 -0
- package/.next/standalone/.next/static/chunks/{31308-bb4a97b3f39c22dd.js → 31308-fda6febfb2882a28.js} +1 -1
- package/.next/standalone/.next/static/chunks/33456.6dc44a6aca1a01fd.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.7873ebc9ba435c8c.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-01be319472d751b3.js +1 -0
- package/.next/standalone/.next/static/chunks/99373.d0e808c18408b8da.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/{layout-3d3b3b9e16c03cda.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-69d746c98079024d.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-8119df915138a9c3.js → page-fdd617457730a116.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-6b3fb08d53826d02.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-dec1f54ebb9bf963.js → webpack-fa066d7ff9ab2b29.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/agents/code-reviewer.md +1 -1
- package/.next/standalone/public/chorus-plugin/agents/proposal-reviewer.md +1 -0
- package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +2 -0
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +4 -3
- 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/kiro-plugin/.kiro/agents/chorus-code-reviewer.json +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-proposal-reviewer.json +1 -1
- package/.next/standalone/public/kiro-plugin/.kiro/agents/chorus-task-reviewer.json +1 -1
- 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 +4 -3
- 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 +4 -3
- package/.next/standalone/public/skill/code-reviewer-chorus/SKILL.md +2 -2
- 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 +2 -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 +2 -1
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +1 -1
- package/README.ja.md +26 -346
- package/README.ko.md +28 -347
- package/README.md +33 -353
- package/README.zh.md +31 -328
- package/cli/control-handler.mjs +13 -3
- package/cli/daemon-rest-client.mjs +11 -3
- package/cli/daemon.mjs +52 -10
- package/cli/event-router.mjs +17 -5
- package/cli/prompts.mjs +129 -4
- package/cli/turn-reporter.mjs +5 -1
- package/cli/wake-queue.mjs +57 -35
- package/cli/waker.mjs +125 -36
- package/package.json +3 -1
- package/prisma/migrations/20260814101500_add_typed_assignment_provenance/migration.sql +2 -0
- package/prisma/schema.prisma +4 -2
- package/.next/standalone/.next/server/chunks/2463.js +0 -1
- package/.next/standalone/.next/static/chunks/11595.1bcd2b65089007ae.js +0 -1
- package/.next/standalone/.next/static/chunks/19887-4d76db57a7ce4437.js +0 -1
- package/.next/standalone/.next/static/chunks/22987-8fd965ab4ff87546.js +0 -1
- package/.next/standalone/.next/static/chunks/33456.c98d3e21528b61d8.js +0 -1
- package/.next/standalone/.next/static/chunks/38296-316ba18af72385fb.js +0 -1
- package/.next/standalone/.next/static/chunks/4340-a33120fb742af57e.js +0 -1
- package/.next/standalone/.next/static/chunks/4860.9122a86d33dc6b62.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/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/94426-39b6da238425f9b7.js +0 -10
- package/.next/standalone/.next/static/chunks/94643-90a9ec7b9a9abaf0.js +0 -1
- package/.next/standalone/.next/static/chunks/99373.585230dcb315a068.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-2af705f6c3789131.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-f619bd65e1eed8c9.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-0789c6589363154c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/page-a612f6fc5be0239d.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-5fb9fd3db155d5ca.js +0 -1
- package/.next/standalone/.next/static/chunks/app/onboarding/page-e85315278aafc300.js +0 -1
- package/.next/standalone/.next/static/css/67fba0943f494f0e.css +0 -1
- /package/.next/standalone/.next/static/{H92ZuhpmDWcL3WOfYRc-- → K8qIdwvKoIWbwQ_f01mnM}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{H92ZuhpmDWcL3WOfYRc-- → K8qIdwvKoIWbwQ_f01mnM}/_ssgManifest.js +0 -0
package/cli/event-router.mjs
CHANGED
|
@@ -37,8 +37,8 @@ export class EventRouter {
|
|
|
37
37
|
/**
|
|
38
38
|
* @param {{
|
|
39
39
|
* mcpClient: { callTool: (name: string, args?: Record<string, unknown>) => Promise<any> },
|
|
40
|
-
* waker: { keyFor: (n: any) => Promise<{ key: string, rootIdeaUuid: string|null, directIdeaUuid: string|null }>,
|
|
41
|
-
* queue: { enqueue: (key: string,
|
|
40
|
+
* waker: { keyFor: (n: any) => Promise<{ key: string, rootIdeaUuid: string|null, directIdeaUuid: string|null }>, wakeBatch: (ns: any[], key: string, attribution?: any) => Promise<void>, markQueued?: (n: any, key: string, attribution?: any) => void },
|
|
41
|
+
* queue: { enqueue: (key: string, item: { notification: any, attribution: any }) => void },
|
|
42
42
|
* wakeActions: Set<string>,
|
|
43
43
|
* getConnectionUuid?: () => (string|null), This daemon's registered connection uuid
|
|
44
44
|
* (null until the SSE handshake reports it).
|
|
@@ -228,7 +228,8 @@ export class EventRouter {
|
|
|
228
228
|
* reason ("user" | "crash") threaded from the control event; it is stamped on the
|
|
229
229
|
* synthetic notification as `resumedFrom` so the prompt builder can state a crash
|
|
230
230
|
* explicitly. Absent/unknown → not stamped → the user-resume prompt.
|
|
231
|
-
* @param {{ entityType?: string, entityUuid?: string, resumeReason?: string
|
|
231
|
+
* @param {{ entityType?: string, entityUuid?: string, resumeReason?: string,
|
|
232
|
+
* orchestrator?: { type?: string, uuid?: string, name?: string } | null }} target
|
|
232
233
|
*/
|
|
233
234
|
dispatchResume(target) {
|
|
234
235
|
const entityType = target?.entityType;
|
|
@@ -247,6 +248,11 @@ export class EventRouter {
|
|
|
247
248
|
entityUuid,
|
|
248
249
|
...(resumedFrom ? { resumedFrom } : {}),
|
|
249
250
|
...(typeof target?.runtimeCwd === "string" ? { runtimeCwd: target.runtimeCwd } : {}),
|
|
251
|
+
...(target?.orchestrator?.type === "agent" &&
|
|
252
|
+
typeof target.orchestrator.uuid === "string" &&
|
|
253
|
+
typeof target.orchestrator.name === "string"
|
|
254
|
+
? { orchestrator: target.orchestrator }
|
|
255
|
+
: {}),
|
|
250
256
|
};
|
|
251
257
|
this.#resolveAndEnqueue(n, `resume:${entityType}:${entityUuid}`).catch((err) => {
|
|
252
258
|
this.logger.error(`[Chorus] failed to dispatch resume for ${entityType}:${entityUuid}: ${err}`);
|
|
@@ -383,7 +389,10 @@ export class EventRouter {
|
|
|
383
389
|
} catch (err) {
|
|
384
390
|
this.logger.warn(`[Chorus] markQueued failed for pending turn ${turnUuid}: ${err}`);
|
|
385
391
|
}
|
|
386
|
-
|
|
392
|
+
// Enqueue an opaque DATA payload (add-daemon-wake-coalescing §C4), NOT a thunk: the
|
|
393
|
+
// queue coalesces all same-key pending items and hands the whole batch to its runBatch
|
|
394
|
+
// (wired to waker.wakeBatch in daemon.mjs). markQueued was already called per-item above.
|
|
395
|
+
this.queue.enqueue(key, { notification: n, attribution });
|
|
387
396
|
}
|
|
388
397
|
|
|
389
398
|
/**
|
|
@@ -531,6 +540,9 @@ export class EventRouter {
|
|
|
531
540
|
} catch (err) {
|
|
532
541
|
this.logger.warn(`[Chorus] markQueued failed for ${label}: ${err}`);
|
|
533
542
|
}
|
|
534
|
-
|
|
543
|
+
// Enqueue an opaque DATA payload (add-daemon-wake-coalescing §C4), NOT a thunk: the
|
|
544
|
+
// queue coalesces all same-key pending items and hands the whole batch to its runBatch
|
|
545
|
+
// (wired to waker.wakeBatch in daemon.mjs). markQueued was already called per-item above.
|
|
546
|
+
this.queue.enqueue(key, { notification: n, attribution });
|
|
535
547
|
}
|
|
536
548
|
}
|
package/cli/prompts.mjs
CHANGED
|
@@ -25,6 +25,7 @@
|
|
|
25
25
|
* @property {string} actorType
|
|
26
26
|
* @property {string} actorUuid
|
|
27
27
|
* @property {string} actorName
|
|
28
|
+
* @property {{type: string, uuid: string, name: string} | null} [orchestrator]
|
|
28
29
|
* @property {string} [instructionText] Free-text body of a `human_instruction` wake
|
|
29
30
|
* (子1 — daemon-session-conversation). The server denormalizes the canonical turn
|
|
30
31
|
* promptText onto the wake notification so the daemon reads it in the
|
|
@@ -40,6 +41,29 @@ function mentionGuidance(n, entityType) {
|
|
|
40
41
|
);
|
|
41
42
|
}
|
|
42
43
|
|
|
44
|
+
/**
|
|
45
|
+
* Orchestrator-handoff guidance, appended to every wake body by buildPrompt. This is
|
|
46
|
+
* the SINGLE home of the "hand back to the agent that dispatched you" instruction —
|
|
47
|
+
* it is runtime PE (it depends on who the wake resolved as orchestrator), so it lives
|
|
48
|
+
* here in the wake prompt, NOT in the static skill docs. Its OpenClaw twin is
|
|
49
|
+
* `buildOrchestratorGuidance` in packages/openclaw-plugin/src/event-router.ts —
|
|
50
|
+
* KEEP THE TWO WORDINGS IN SYNC.
|
|
51
|
+
* Returns null unless the resource has an AGENT orchestrator; a human-assigned
|
|
52
|
+
* resource hands back to the human via the per-event actor @mention (mentionGuidance).
|
|
53
|
+
* @param {NotificationDetail} n
|
|
54
|
+
*/
|
|
55
|
+
function orchestratorGuidance(n) {
|
|
56
|
+
if (n.orchestrator?.type !== "agent") return null;
|
|
57
|
+
return (
|
|
58
|
+
`Your orchestrator for this resource is @${n.orchestrator.name}.\n` +
|
|
59
|
+
`At a human-only gate you cannot cross, or when this child resource is complete, hand control ` +
|
|
60
|
+
`back by commenting on the resource and mentioning ` +
|
|
61
|
+
`@[${n.orchestrator.name}](agent:${n.orchestrator.uuid}) with the decision needed or completion ` +
|
|
62
|
+
`evidence, then leave any human-gated resource pending and end the turn. Do not @mention the ` +
|
|
63
|
+
`orchestrator for ordinary internal progress.`
|
|
64
|
+
);
|
|
65
|
+
}
|
|
66
|
+
|
|
43
67
|
/**
|
|
44
68
|
* Shared headless preamble prepended to EVERY wake prompt (add-daemon-headless-
|
|
45
69
|
* interaction-guard). A daemon-woken session is a headless `claude -p` run with no
|
|
@@ -96,7 +120,98 @@ export const HEADLESS_PREAMBLE = [
|
|
|
96
120
|
export function buildPrompt(n) {
|
|
97
121
|
const body = buildPromptBody(n);
|
|
98
122
|
if (body == null) return null;
|
|
99
|
-
|
|
123
|
+
const handoff = orchestratorGuidance(n);
|
|
124
|
+
return `${HEADLESS_PREAMBLE}\n\n${body}${handoff ? `\n\n${handoff}` : ""}`;
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Build ONE combined wake prompt for a coalesced batch of same-session notifications
|
|
129
|
+
* (add-daemon-wake-coalescing, tech design §C2). The daemon serializes wakes per session
|
|
130
|
+
* key; while a turn runs, later same-key wakes pile up and — when the slot frees — are
|
|
131
|
+
* drained together into a single `claude --resume` turn. This composes their one prompt.
|
|
132
|
+
*
|
|
133
|
+
* Rules:
|
|
134
|
+
* - **Size 1** → delegate to `buildPrompt(n)` verbatim, so the single-event path is
|
|
135
|
+
* BYTE-IDENTICAL to today (and all current prompt tests keep passing). This is keyed on
|
|
136
|
+
* the count of RENDERABLE events (non-null body): a batch that reduces to a single
|
|
137
|
+
* renderable event — e.g. a real wake plus an empty `human_instruction` — also takes
|
|
138
|
+
* the single-event path.
|
|
139
|
+
* - **Size > 1 renderable** → `HEADLESS_PREAMBLE` ONCE (it is a per-turn guard, paid once
|
|
140
|
+
* per turn, not per event), then a short backlog preamble, then one labeled block per
|
|
141
|
+
* event in ARRIVAL order, each block being the reused per-action `buildPromptBody(n)` so
|
|
142
|
+
* every event keeps its own tool hints and @mention guidance.
|
|
143
|
+
* - **Same-entity collapse (Q2)**: events sharing `(action, entityUuid)` collapse into one
|
|
144
|
+
* block at the group's FIRST-SEEN position, noting the occurrence count and showing the
|
|
145
|
+
* NEWEST message. This is safe only because such actions' full content is re-derivable
|
|
146
|
+
* server-side (comments via chorus_get_comments, task lifecycle via chorus_get_*).
|
|
147
|
+
* - **`human_instruction` is NEVER collapsed (Q3, Round-1 BLOCKER-2)**: every queued chat
|
|
148
|
+
* message carries `action=human_instruction` and `entityUuid=directIdeaUuid`, and its
|
|
149
|
+
* text lives ONLY on the turn/notification (not re-fetchable), so collapsing to
|
|
150
|
+
* newest-only would silently drop earlier chat and defeat the feature. Each renders its
|
|
151
|
+
* full body as its own block, in arrival order.
|
|
152
|
+
* - Events whose body is null (empty `human_instruction`, non-wake action) are omitted; a
|
|
153
|
+
* batch with no renderable event returns null (the router then spawns nothing).
|
|
154
|
+
*
|
|
155
|
+
* @param {NotificationDetail[]} notifications Arrival-ordered batch (FIFO drain order).
|
|
156
|
+
* @returns {string | null}
|
|
157
|
+
*/
|
|
158
|
+
export function buildBatchPrompt(notifications) {
|
|
159
|
+
if (!Array.isArray(notifications) || notifications.length === 0) return null;
|
|
160
|
+
|
|
161
|
+
// Keep only events with a renderable per-action body, in arrival order.
|
|
162
|
+
const items = [];
|
|
163
|
+
for (const n of notifications) {
|
|
164
|
+
const body = buildPromptBody(n);
|
|
165
|
+
if (body != null) items.push({ n, body });
|
|
166
|
+
}
|
|
167
|
+
if (items.length === 0) return null;
|
|
168
|
+
// One renderable event → byte-identical single-event prompt (delegates to buildPrompt so
|
|
169
|
+
// the exact "PREAMBLE\n\nbody" shape is preserved). Covers a true batch of size 1 and a
|
|
170
|
+
// batch that reduced to one renderable event after null-body events were dropped.
|
|
171
|
+
if (items.length === 1) return buildPrompt(items[0].n);
|
|
172
|
+
|
|
173
|
+
// Group into ordered blocks. Collapsible actions merge by (action, entityUuid) at their
|
|
174
|
+
// first-seen slot; human_instruction is exempt and always gets its own block.
|
|
175
|
+
const blocks = [];
|
|
176
|
+
const collapseIndex = new Map(); // "action::entityUuid" -> index into `blocks`
|
|
177
|
+
for (const { n, body } of items) {
|
|
178
|
+
if (n.action === "human_instruction") {
|
|
179
|
+
blocks.push({ notif: n, body, count: 1 });
|
|
180
|
+
continue;
|
|
181
|
+
}
|
|
182
|
+
const groupKey = `${n.action}::${n.entityUuid ?? ""}`;
|
|
183
|
+
const existing = collapseIndex.get(groupKey);
|
|
184
|
+
if (existing != null) {
|
|
185
|
+
const g = blocks[existing];
|
|
186
|
+
g.count += 1;
|
|
187
|
+
g.notif = n; // newest wins (arrival order → last member is newest)
|
|
188
|
+
g.body = body; // newest body
|
|
189
|
+
} else {
|
|
190
|
+
collapseIndex.set(groupKey, blocks.length);
|
|
191
|
+
blocks.push({ notif: n, body, count: 1 });
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Backlog preamble. N = number of renderable events that arrived (not the collapsed block
|
|
196
|
+
// count) — collapse is a rendering optimization; each collapsed block states its own count.
|
|
197
|
+
const backlogPreamble =
|
|
198
|
+
`You have ${items.length} queued Chorus events on this session that arrived while you ` +
|
|
199
|
+
`were busy — handle them together, in order; each is labeled with its type below.`;
|
|
200
|
+
|
|
201
|
+
const rendered = blocks.map((g, idx) => {
|
|
202
|
+
const n = g.notif;
|
|
203
|
+
const entityType = n.entityType || "session";
|
|
204
|
+
const entityUuid = n.entityUuid || "";
|
|
205
|
+
const header = `### Event ${idx + 1} — ${n.action} on ${entityType} ${entityUuid}`.replace(/\s+$/, "");
|
|
206
|
+
const collapseNote =
|
|
207
|
+
g.count > 1
|
|
208
|
+
? `\n(${g.count} ${n.action} events on this ${entityType} arrived — showing the newest ` +
|
|
209
|
+
`below; earlier ones are re-derivable via the entity's own chorus_get_* tools.)`
|
|
210
|
+
: "";
|
|
211
|
+
return `${header}${collapseNote}\n\n${g.body}`;
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
return [HEADLESS_PREAMBLE, backlogPreamble, ...rendered].join("\n\n");
|
|
100
215
|
}
|
|
101
216
|
|
|
102
217
|
/**
|
|
@@ -205,10 +320,20 @@ function buildPromptBody(n) {
|
|
|
205
320
|
);
|
|
206
321
|
}
|
|
207
322
|
case "idea_claimed":
|
|
323
|
+
// The assignment ALREADY set you as the assignee, so there is nothing to claim —
|
|
324
|
+
// chorus_claim_idea would throw (AlreadyClaimedError, and a hard "Cannot claim an
|
|
325
|
+
// elaborated Idea" for the elaborated-backfill case). Do NOT emit a claim
|
|
326
|
+
// instruction here (a prompt test asserts the literal never appears). Instead tell
|
|
327
|
+
// the already-assigned agent to review and advance from the idea's CURRENT stage,
|
|
328
|
+
// stopping at the human proposal/verify gates. Names the assigner via n.actorName /
|
|
329
|
+
// n.actorType (already on the notification — no server change). Mirrored in the
|
|
330
|
+
// OpenClaw twin handleIdeaClaimed (event-router.ts) — KEEP THE TWO WORDINGS IN SYNC.
|
|
208
331
|
return (
|
|
209
|
-
`[Chorus] Idea '${n.entityTitle}' was assigned to you
|
|
210
|
-
`projectUuid: ${n.projectUuid}).
|
|
211
|
-
`
|
|
332
|
+
`[Chorus] Idea '${n.entityTitle}' was assigned to you by ${n.actorName} (${n.actorType}) ` +
|
|
333
|
+
`(ideaUuid: ${n.entityUuid}, projectUuid: ${n.projectUuid}). You are now the assignee — no need ` +
|
|
334
|
+
`to claim it. Use chorus_get_idea to review it, then advance it from its CURRENT stage: if it is ` +
|
|
335
|
+
`still elaborating, run or continue elaboration; if it is already elaborated, author the proposal. ` +
|
|
336
|
+
`Stop at the human proposal/verify gates and never merge automatically.\n${mentionGuidance(n, "idea")}`
|
|
212
337
|
);
|
|
213
338
|
case "task_reopened":
|
|
214
339
|
return (
|
package/cli/turn-reporter.mjs
CHANGED
|
@@ -52,7 +52,7 @@ export const TURN_INTERRUPT_REASONS = new Set([
|
|
|
52
52
|
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
53
53
|
* fetchImpl?: typeof fetch, Injectable for tests.
|
|
54
54
|
* }} opts
|
|
55
|
-
* @returns {(params: { sessionId: string, status: "running"|"ended"|"interrupted", entityType?: string|null, entityUuid?: string|null, interruptedReason?: "user"|"crash"|"shutdown"|"invalid_path"|null, transcriptRelayError?: string|null, usage?: import("./upload-hooks.mjs").TokenUsage|null }) => Promise<void>}
|
|
55
|
+
* @returns {(params: { sessionId: string, status: "running"|"ended"|"interrupted", entityType?: string|null, entityUuid?: string|null, interruptedReason?: "user"|"crash"|"shutdown"|"invalid_path"|null, transcriptRelayError?: string|null, usage?: import("./upload-hooks.mjs").TokenUsage|null, coalescedCount?: number }) => Promise<void>}
|
|
56
56
|
*/
|
|
57
57
|
export function createTurnReporter(opts) {
|
|
58
58
|
const logger = opts.logger ?? NOOP_LOGGER;
|
|
@@ -76,6 +76,7 @@ export function createTurnReporter(opts) {
|
|
|
76
76
|
transcriptRelayError,
|
|
77
77
|
usage,
|
|
78
78
|
backendSessionId,
|
|
79
|
+
coalescedCount,
|
|
79
80
|
}) {
|
|
80
81
|
if (typeof sessionId !== "string" || !sessionId || !TURN_STATUSES.has(status)) {
|
|
81
82
|
logger.warn(
|
|
@@ -111,6 +112,9 @@ export function createTurnReporter(opts) {
|
|
|
111
112
|
// only on a terminal edge. No validation here — usage is an opaque nested object.
|
|
112
113
|
usage,
|
|
113
114
|
backendSessionId,
|
|
115
|
+
// Coalesced-wake count (add-daemon-wake-coalescing): threaded straight through; the
|
|
116
|
+
// client sends it only on the → running edge and only when > 1 (a single wake omits it).
|
|
117
|
+
coalescedCount,
|
|
114
118
|
});
|
|
115
119
|
};
|
|
116
120
|
}
|
package/cli/wake-queue.mjs
CHANGED
|
@@ -1,14 +1,22 @@
|
|
|
1
1
|
// cli/wake-queue.mjs
|
|
2
|
-
// Per-key FIFO scheduler with a global concurrency cap
|
|
3
|
-
// idea_root session anchor safe
|
|
4
|
-
// serialization", design.md "Concurrency
|
|
5
|
-
//
|
|
6
|
-
//
|
|
2
|
+
// Per-key FIFO scheduler with a global concurrency cap, coalescing same-key
|
|
3
|
+
// wakes into batches. This is what makes the idea_root session anchor safe
|
|
4
|
+
// (cli-daemon spec "Per-root-idea wake serialization", design.md "Concurrency
|
|
5
|
+
// model") AND implements daemon-wake-coalescing (design.md §C1):
|
|
6
|
+
// • within one key (root idea) → strictly serial, FIFO. The next batch waits
|
|
7
|
+
// for the current runBatch to settle, so we never run two
|
|
7
8
|
// `claude --resume <sameSessionId>` against one session.
|
|
9
|
+
// • coalescing: when a key's slot frees, the ENTIRE pending array for that key
|
|
10
|
+
// is drained (splice) and delivered to runBatch ONCE as a single batch. So
|
|
11
|
+
// N events that pile up while the previous turn runs become ONE turn.
|
|
12
|
+
// Natural batching only — NO debounce/collect timer, NO batch-size cap.
|
|
8
13
|
// • across keys → concurrent, bounded by maxConcurrency.
|
|
9
14
|
// • enqueue() returns immediately — never blocks the SSE loop.
|
|
10
|
-
// • a
|
|
11
|
-
// poisoned wake must not wedge the key's queue forever).
|
|
15
|
+
// • a batch whose runBatch throws is logged and the next batch for that key
|
|
16
|
+
// proceeds (a poisoned wake must not wedge the key's queue forever).
|
|
17
|
+
// The queue carries opaque DATA items (the router passes `{ notification,
|
|
18
|
+
// attribution }`); it never introspects them — the runBatch callback (supplied
|
|
19
|
+
// at construction, wired to waker.wakeBatch in daemon.mjs) does.
|
|
12
20
|
// Plain ESM, zero deps, in-memory.
|
|
13
21
|
|
|
14
22
|
const NOOP_LOGGER = { info() {}, warn() {}, error() {} };
|
|
@@ -18,41 +26,49 @@ export class WakeQueue {
|
|
|
18
26
|
* @param {{
|
|
19
27
|
* maxConcurrency?: number,
|
|
20
28
|
* logger?: { info(m:string):void, warn(m:string):void, error(m:string):void },
|
|
29
|
+
* runBatch?: (key: string, items: any[]) => Promise<void>,
|
|
21
30
|
* }} [opts]
|
|
22
31
|
*/
|
|
23
32
|
constructor(opts = {}) {
|
|
24
33
|
this.maxConcurrency = opts.maxConcurrency ?? 4;
|
|
25
34
|
this.logger = opts.logger ?? NOOP_LOGGER;
|
|
26
|
-
|
|
35
|
+
// The batch runner: called ONCE per drained batch with every pending item
|
|
36
|
+
// for the key. Defaults to a no-op so an unwired queue never throws (the
|
|
37
|
+
// daemon always supplies the real waker.wakeBatch runner).
|
|
38
|
+
this.runBatch = opts.runBatch ?? (async () => {});
|
|
39
|
+
/** @type {Map<string, any[]>} pending data items per key. */
|
|
27
40
|
this.pending = new Map();
|
|
28
|
-
/** @type {Set<string>} keys with a
|
|
41
|
+
/** @type {Set<string>} keys with a batch currently running. */
|
|
29
42
|
this.running = new Set();
|
|
30
43
|
/** @type {string[]} keys waiting for a global concurrency slot. */
|
|
31
44
|
this.readyKeys = [];
|
|
32
45
|
this.activeCount = 0;
|
|
33
|
-
// Graceful-shutdown latch: once set, #pump starts NOTHING new — in-flight
|
|
34
|
-
// finish (drain observes them) but queued work stays queued and dies
|
|
35
|
-
// process. Never cleared; a stopping queue is on its way out.
|
|
46
|
+
// Graceful-shutdown latch: once set, #pump starts NOTHING new — in-flight
|
|
47
|
+
// batches finish (drain observes them) but queued work stays queued and dies
|
|
48
|
+
// with the process. Never cleared; a stopping queue is on its way out.
|
|
36
49
|
this.stopped = false;
|
|
37
50
|
}
|
|
38
51
|
|
|
39
|
-
/** Stop starting new
|
|
52
|
+
/** Stop starting new batches (graceful shutdown). In-flight batches are unaffected. */
|
|
40
53
|
stop() {
|
|
41
54
|
this.stopped = true;
|
|
42
55
|
}
|
|
43
56
|
|
|
44
57
|
/**
|
|
45
|
-
* Enqueue
|
|
46
|
-
*
|
|
47
|
-
*
|
|
58
|
+
* Enqueue an opaque data item under a key. Returns immediately. Items on the
|
|
59
|
+
* same key coalesce: while a key's batch runs, later items pile up and are
|
|
60
|
+
* drained together as ONE batch when the slot frees. Different keys run
|
|
61
|
+
* concurrently up to maxConcurrency.
|
|
48
62
|
* @param {string} key
|
|
49
|
-
* @param {(
|
|
63
|
+
* @param {any} item opaque data (e.g. `{ notification, attribution }`)
|
|
50
64
|
*/
|
|
51
|
-
enqueue(key,
|
|
65
|
+
enqueue(key, item) {
|
|
52
66
|
if (!this.pending.has(key)) this.pending.set(key, []);
|
|
53
|
-
this.pending.get(key).push(
|
|
67
|
+
this.pending.get(key).push(item);
|
|
54
68
|
// A key becomes "ready" to claim a global slot only when it's not already
|
|
55
|
-
// running (serial-per-key) and not already queued for a slot.
|
|
69
|
+
// running (serial-per-key) and not already queued for a slot. While it IS
|
|
70
|
+
// running, later items simply accumulate in `pending` and are picked up by
|
|
71
|
+
// the next batch — this is where coalescing happens.
|
|
56
72
|
if (!this.running.has(key) && !this.readyKeys.includes(key)) {
|
|
57
73
|
this.readyKeys.push(key);
|
|
58
74
|
}
|
|
@@ -65,7 +81,7 @@ export class WakeQueue {
|
|
|
65
81
|
}
|
|
66
82
|
|
|
67
83
|
/**
|
|
68
|
-
* Snapshot of the keys with a
|
|
84
|
+
* Snapshot of the keys with a batch currently running (observability read).
|
|
69
85
|
* Returns a fresh array so a caller can't mutate the internal Set.
|
|
70
86
|
* @returns {string[]}
|
|
71
87
|
*/
|
|
@@ -74,7 +90,7 @@ export class WakeQueue {
|
|
|
74
90
|
}
|
|
75
91
|
|
|
76
92
|
/**
|
|
77
|
-
* Snapshot of the keys that have at least one
|
|
93
|
+
* Snapshot of the keys that have at least one item still waiting to run —
|
|
78
94
|
* i.e. enqueued but not yet started (observability read). A key that is
|
|
79
95
|
* currently running with no further queued work is NOT pending. Returns a
|
|
80
96
|
* fresh array so a caller can't mutate internal state.
|
|
@@ -85,13 +101,13 @@ export class WakeQueue {
|
|
|
85
101
|
}
|
|
86
102
|
|
|
87
103
|
/**
|
|
88
|
-
* Wait (bounded) for every in-flight
|
|
104
|
+
* Wait (bounded) for every in-flight batch to finish — the graceful-shutdown drain
|
|
89
105
|
* (fix-daemon-exit-orphan-running-turn). Resolves `true` when the queue went idle
|
|
90
|
-
* (no active
|
|
106
|
+
* (no active batch) within `timeoutMs`, `false` on timeout — the caller exits
|
|
91
107
|
* anyway and leaves the rest to the server-side reconcile backstop. Pending
|
|
92
|
-
* (not-yet-started)
|
|
108
|
+
* (not-yet-started) items are NOT waited for: a shutting-down daemon stops
|
|
93
109
|
* starting new work, so only the in-flight subprocesses (and their exit reports)
|
|
94
|
-
* matter. Polling (50ms) keeps this zero-dep and independent of
|
|
110
|
+
* matter. Polling (50ms) keeps this zero-dep and independent of batch internals.
|
|
95
111
|
* @param {number} timeoutMs
|
|
96
112
|
* @returns {Promise<boolean>}
|
|
97
113
|
*/
|
|
@@ -112,33 +128,39 @@ export class WakeQueue {
|
|
|
112
128
|
if (this.running.has(key)) continue; // already running under another slot
|
|
113
129
|
const queue = this.pending.get(key);
|
|
114
130
|
if (!queue || queue.length === 0) continue;
|
|
115
|
-
this.#
|
|
131
|
+
this.#startBatch(key);
|
|
116
132
|
}
|
|
117
133
|
}
|
|
118
134
|
|
|
119
|
-
/**
|
|
120
|
-
|
|
135
|
+
/**
|
|
136
|
+
* Drain the ENTIRE pending array for a key into one batch and run it, then
|
|
137
|
+
* chain to the following batch. No batch-size cap (design.md §C1, Q7).
|
|
138
|
+
*/
|
|
139
|
+
#startBatch(key) {
|
|
121
140
|
const queue = this.pending.get(key);
|
|
122
141
|
if (!queue || queue.length === 0) {
|
|
123
142
|
this.running.delete(key);
|
|
124
143
|
return;
|
|
125
144
|
}
|
|
126
|
-
|
|
145
|
+
// Coalesce: take everything pending for this key right now as one batch.
|
|
146
|
+
// Items that arrive after this splice accumulate for the NEXT batch.
|
|
147
|
+
const items = queue.splice(0);
|
|
127
148
|
this.running.add(key);
|
|
128
149
|
this.activeCount++;
|
|
129
150
|
|
|
130
151
|
Promise.resolve()
|
|
131
|
-
.then(
|
|
152
|
+
.then(() => this.runBatch(key, items))
|
|
132
153
|
.catch((err) => {
|
|
133
|
-
// Poisoned
|
|
134
|
-
this.logger.warn(`[Chorus] wake
|
|
154
|
+
// Poisoned batch: log, do NOT let it wedge the key's queue.
|
|
155
|
+
this.logger.warn(`[Chorus] wake batch for ${key} failed: ${err}`);
|
|
135
156
|
})
|
|
136
157
|
.finally(() => {
|
|
137
158
|
this.activeCount--;
|
|
138
159
|
const remaining = this.pending.get(key);
|
|
139
160
|
if (remaining && remaining.length > 0) {
|
|
140
|
-
// Same key
|
|
141
|
-
// #pump will pick it up
|
|
161
|
+
// Same key accumulated more work while this batch ran → it must run
|
|
162
|
+
// serially as the next batch. Re-mark ready; #pump will pick it up
|
|
163
|
+
// (respecting the global cap).
|
|
142
164
|
if (!this.readyKeys.includes(key)) this.readyKeys.push(key);
|
|
143
165
|
this.running.delete(key); // free the key so #pump can re-claim it
|
|
144
166
|
} else {
|