@chorus-aidlc/chorus 0.9.1 → 0.9.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 +223 -223
- package/.next/standalone/.next/app-path-routes-manifest.json +38 -38
- package/.next/standalone/.next/build-manifest.json +2 -2
- package/.next/standalone/.next/prerender-manifest.json +39 -39
- package/.next/standalone/.next/server/app/(dashboard)/project-groups/[uuid]/page.js +2 -2
- 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 +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 +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]/ideas/[ideaUuid]/page.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js +2 -2
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/page.js.nft.json +1 -1
- package/.next/standalone/.next/server/app/(dashboard)/projects/[uuid]/ideas/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_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 +2 -2
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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/agents/[uuid]/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js +1 -1
- package/.next/standalone/.next/server/app/api/agents/[uuid]/sessions/route.js.nft.json +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/refresh/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/auth/session/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/documents/[uuid]/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.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/preview/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/move/route.js.nft.json +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]/release/route.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/release/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/ideas/[uuid]/route.js.nft.json +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/mcp/route.js +3 -3
- package/.next/standalone/.next/server/app/api/mcp/route.js.nft.json +1 -1
- 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.js.nft.json +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/projects/[uuid]/activity/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.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/ideas/tracker/route.js.nft.json +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.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.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.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]/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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/dependencies/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/projects/[uuid]/tasks/route.js.nft.json +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/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/proposals/[uuid]/approve/route.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.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.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.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.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/search/route_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js +1 -1
- package/.next/standalone/.next/server/app/api/sessions/[uuid]/route.js.nft.json +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.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/[dependsOnUuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/dependencies/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/release/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/route.js.nft.json +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.js +1 -1
- package/.next/standalone/.next/server/app/api/tasks/[uuid]/sessions/route.js.nft.json +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 +1 -1
- 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 +1 -1
- 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 +1 -1
- 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 +1 -1
- package/.next/standalone/.next/server/app/login/pick-workspace.rsc +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh/page_client-reference-manifest.js +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.html +1 -1
- package/.next/standalone/.next/server/app/login/silent-refresh.rsc +1 -1
- package/.next/standalone/.next/server/app/login.html +1 -1
- package/.next/standalone/.next/server/app/login.rsc +1 -1
- package/.next/standalone/.next/server/app/onboarding/page.js +3 -3
- 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 +1 -1
- 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 +1 -1
- package/.next/standalone/.next/server/app/projects.rsc +2 -2
- package/.next/standalone/.next/server/app/settings.html +1 -1
- package/.next/standalone/.next/server/app/settings.rsc +3 -3
- package/.next/standalone/.next/server/app-paths-manifest.json +38 -38
- package/.next/standalone/.next/server/chunks/1165.js +1 -1
- package/.next/standalone/.next/server/chunks/2990.js +1 -0
- package/.next/standalone/.next/server/chunks/4090.js +2 -2
- package/.next/standalone/.next/server/chunks/5491.js +1 -0
- package/.next/standalone/.next/server/chunks/6207.js +1 -1
- package/.next/standalone/.next/server/chunks/{5044.js → 6878.js} +1 -1
- package/.next/standalone/.next/server/chunks/7228.js +2 -2
- package/.next/standalone/.next/server/chunks/7578.js +2 -2
- package/.next/standalone/.next/server/chunks/7621.js +1 -0
- package/.next/standalone/.next/server/chunks/8144.js +1 -0
- package/.next/standalone/.next/server/chunks/8637.js +1 -1
- package/.next/standalone/.next/server/chunks/896.js +1 -0
- package/.next/standalone/.next/server/chunks/9508.js +2 -2
- package/.next/standalone/.next/server/middleware-manifest.json +5 -5
- package/.next/standalone/.next/server/pages/404.html +1 -1
- package/.next/standalone/.next/server/pages/500.html +1 -1
- package/.next/standalone/.next/server/pages-manifest.json +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/19126-12ce8ade288ce1dc.js +1 -0
- package/.next/standalone/.next/static/chunks/19898-7e07c69b635e3662.js +1 -0
- package/.next/standalone/.next/static/chunks/35486-1978488574385a45.js +1 -0
- package/.next/standalone/.next/static/chunks/52206-51a89715ca643e44.js +1 -0
- package/.next/standalone/.next/static/chunks/60011-b602fea2afba6992.js +1 -0
- package/.next/standalone/.next/static/chunks/{32190-a110356fb68a4333.js → 75444-976ac95fd66e7988.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-dd7eb66bb4ffd252.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-6d92b9867caf0fe1.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-f8f17f58cf779d37.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-83e2e42b27132b41.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/[ideaUuid]/{page-405cc5757c9116ed.js → page-55148db4b28ee5f5.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/ideas/{page-1591999fb2994672.js → page-556c181809c9e4f6.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-656797940b35b23c.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/new/{page-31f4ffd9778a39ed.js → page-414b398806324ad1.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-af88aeaedc3f4ae5.js +1 -0
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/[taskUuid]/{page-00ae31e877b4b261.js → page-6524ab00e6cdf59a.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/tasks/{page-b148c338bed81dce.js → page-7b0bb5f037cd320b.js} +1 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-db79d84fa8ca8cbf.js +1 -0
- package/.next/standalone/.next/static/chunks/app/onboarding/{page-9768ac847f5b2b48.js → page-7a00689ba561c111.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/agents/proposal-reviewer.md +3 -2
- package/.next/standalone/public/chorus-plugin/agents/task-reviewer.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/brainstorm/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/chorus/SKILL.md +2 -2
- package/.next/standalone/public/chorus-plugin/skills/develop/SKILL.md +3 -2
- package/.next/standalone/public/chorus-plugin/skills/idea/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/openspec-aware/SKILL.md +1 -1
- package/.next/standalone/public/chorus-plugin/skills/proposal/SKILL.md +18 -7
- package/.next/standalone/public/chorus-plugin/skills/quick-dev/SKILL.md +9 -4
- package/.next/standalone/public/chorus-plugin/skills/review/SKILL.md +5 -3
- package/.next/standalone/public/chorus-plugin/skills/yolo/SKILL.md +2 -2
- package/.next/standalone/public/install-codex.sh +200 -90
- package/.next/standalone/public/skill/brainstorm-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/chorus/SKILL.md +56 -4
- package/.next/standalone/public/skill/develop-chorus/SKILL.md +4 -3
- package/.next/standalone/public/skill/idea-chorus/SKILL.md +1 -1
- package/.next/standalone/public/skill/package.json +21 -5
- package/.next/standalone/public/skill/proposal-chorus/SKILL.md +18 -7
- package/.next/standalone/public/skill/proposal-reviewer-chorus/SKILL.md +198 -0
- package/.next/standalone/public/skill/quick-dev-chorus/SKILL.md +9 -4
- package/.next/standalone/public/skill/review-chorus/SKILL.md +17 -5
- package/.next/standalone/public/skill/task-reviewer-chorus/SKILL.md +219 -0
- package/.next/standalone/public/skill/yolo-chorus/SKILL.md +529 -0
- package/.next/standalone/public/test-install-codex.sh +4 -0
- package/package.json +1 -1
- package/.next/standalone/.next/server/chunks/1002.js +0 -1
- package/.next/standalone/.next/server/chunks/3405.js +0 -1
- package/.next/standalone/.next/server/chunks/4043.js +0 -1
- package/.next/standalone/.next/server/chunks/6592.js +0 -1
- package/.next/standalone/.next/server/chunks/6975.js +0 -1
- package/.next/standalone/.next/static/chunks/19126-7671ce1fd803fdd4.js +0 -1
- package/.next/standalone/.next/static/chunks/44046-5c0f7f8c0914988a.js +0 -1
- package/.next/standalone/.next/static/chunks/60011-0fbcb92028fe9655.js +0 -1
- package/.next/standalone/.next/static/chunks/6028-fe4175ea5e6241ed.js +0 -1
- package/.next/standalone/.next/static/chunks/9562-8433cd5c5abad077.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/layout-8409ca03f132910b.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/dashboard/page-7f7a7f654cab4dc3.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/[documentUuid]/page-a99a690b878a03be.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/documents/page-95cdcec5e6db551f.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/[proposalUuid]/page-2d85f24a980966b7.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/projects/[uuid]/proposals/page-38579c303156008c.js +0 -1
- package/.next/standalone/.next/static/chunks/app/(dashboard)/settings/page-b153aa34b940a24c.js +0 -1
- /package/.next/standalone/.next/static/{yBxnuARbl0brBJS3_STaI → uuDSoqvm-WWenZQ6dXPT7}/_buildManifest.js +0 -0
- /package/.next/standalone/.next/static/{yBxnuARbl0brBJS3_STaI → uuDSoqvm-WWenZQ6dXPT7}/_ssgManifest.js +0 -0
|
@@ -0,0 +1,529 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: yolo-chorus
|
|
3
|
+
description: Full-auto AI-DLC pipeline — drive a single prompt from Idea through Proposal, Execution, and Verification to Done.
|
|
4
|
+
license: AGPL-3.0
|
|
5
|
+
metadata:
|
|
6
|
+
author: chorus
|
|
7
|
+
version: "0.9.3"
|
|
8
|
+
category: project-management
|
|
9
|
+
mcp_server: chorus
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
# Yolo Skill
|
|
13
|
+
|
|
14
|
+
Full-auto AI-DLC pipeline. The user provides one prompt; you drive the entire lifecycle: Idea -> Elaboration -> Proposal -> Review -> Execute -> Verify -> Done. No interactive prompts, no human in the loop unless the pipeline gets stuck.
|
|
15
|
+
|
|
16
|
+
This skill is **framework-neutral**: it never assumes a specific agent harness. Every reviewer and worker is described as "spawn a sub-agent" with a concrete example or two, and every step has an inline single-agent fallback so the pipeline still completes when sub-agents are unavailable.
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## Overview
|
|
21
|
+
|
|
22
|
+
You take a natural-language description of what to build, and you handle everything:
|
|
23
|
+
|
|
24
|
+
1. **Planning** — resolve/create a project, create an Idea, self-elaborate, draft a Proposal (tech-design doc + task DAG), validate, submit.
|
|
25
|
+
2. **Proposal Review** — adversarial review loop against the `proposal-reviewer-chorus` skill.
|
|
26
|
+
3. **Execution** — dependency-ordered, wave-based task dispatch.
|
|
27
|
+
4. **Verification** — adversarial review loop against the `task-reviewer-chorus` skill + admin verify.
|
|
28
|
+
5. **Report** — completion summary + a mandatory Idea Completion Report.
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
<prompt>
|
|
32
|
+
|
|
|
33
|
+
v
|
|
34
|
+
Project + Idea + Self-Elaboration + Proposal
|
|
35
|
+
|
|
|
36
|
+
v
|
|
37
|
+
Proposal Review loop (up to maxProposalReviewRounds, default 3)
|
|
38
|
+
| PASS / PASS WITH NOTES -> approve ; FAIL -> reject + revise + resubmit
|
|
39
|
+
v
|
|
40
|
+
Admin Approve --> Documents + Tasks materialize (tasks land in `open`)
|
|
41
|
+
|
|
|
42
|
+
v
|
|
43
|
+
Wave-based Execution -- chorus_get_unblocked_tasks
|
|
44
|
+
| dispatch one worker sub-agent per unblocked task (fallback: sequential main agent)
|
|
45
|
+
v
|
|
46
|
+
Verification loop (up to maxTaskReviewRounds, default 3)
|
|
47
|
+
| PASS / PASS WITH NOTES -> mark AC + verify ; FAIL -> reopen
|
|
48
|
+
| verify unblocks dependents -> loop back to Execution
|
|
49
|
+
v
|
|
50
|
+
Done --> Report summary + mandatory Idea Completion Report
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Escape hatch:** Interrupt at any time. Every created entity (project, idea, proposal, tasks, comments) persists in Chorus. Resume manually via `develop-chorus` or `review-chorus`.
|
|
54
|
+
|
|
55
|
+
> **Base URL:** Skill files are hosted under `<BASE_URL>/skill/`. The user provides the Chorus access URL (e.g. `https://chorus.acme.com` or `http://localhost:8637`), referred to as `<BASE_URL>` below. See `chorus` skill (`<BASE_URL>/skill/chorus/SKILL.md`) for platform overview and shared tools.
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## Prerequisites
|
|
60
|
+
|
|
61
|
+
Yolo touches every resource and acts as PM, developer, AND admin. The API key MUST carry write + admin on the resources it drives:
|
|
62
|
+
|
|
63
|
+
| Needs | Why |
|
|
64
|
+
|-------|-----|
|
|
65
|
+
| `idea: [write]` | Create the Idea, run self-elaboration |
|
|
66
|
+
| `proposal: [write, admin]` | Create + submit the Proposal; approve it |
|
|
67
|
+
| `task: [write, admin]` | Create, execute, verify (and reopen) tasks |
|
|
68
|
+
| `project: [write]` | Create the project when none is supplied |
|
|
69
|
+
|
|
70
|
+
**Permission preflight — run this before doing anything else:**
|
|
71
|
+
|
|
72
|
+
```
|
|
73
|
+
perms = chorus_checkin().agent.permissions
|
|
74
|
+
need = { idea: ["write"],
|
|
75
|
+
proposal:["write", "admin"],
|
|
76
|
+
task: ["write", "admin"],
|
|
77
|
+
project: ["write"] }
|
|
78
|
+
|
|
79
|
+
missing = []
|
|
80
|
+
for resource, actions in need:
|
|
81
|
+
for a in actions:
|
|
82
|
+
if a not in (perms[resource] or []):
|
|
83
|
+
missing.append(f"{resource}:{a}")
|
|
84
|
+
|
|
85
|
+
if missing:
|
|
86
|
+
ABORT "yolo requires the following permissions, which this API key lacks: "
|
|
87
|
+
+ ", ".join(missing)
|
|
88
|
+
+ ". Use an Admin-preset API key (all 15 permissions) and retry."
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
List **every** missing `resource:action` pair in the abort message — do not stop at the first one — so the user can fix the key in one pass. Do not silently degrade or skip phases when a permission is missing; abort cleanly.
|
|
92
|
+
|
|
93
|
+
---
|
|
94
|
+
|
|
95
|
+
## Input
|
|
96
|
+
|
|
97
|
+
```
|
|
98
|
+
<natural language prompt of what to build>
|
|
99
|
+
<prompt> (with an optional existing-project hint, e.g. a project UUID or name)
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
- **prompt** — what you want built. Becomes the Idea content verbatim.
|
|
103
|
+
- **existing-project hint** (optional) — a project UUID or name to reuse instead of creating a new project. If absent, you search for a match and create one only when none fits.
|
|
104
|
+
|
|
105
|
+
Keep the prompt detailed: the richer the input, the better the auto-generated proposal, and the fewer review rounds it takes.
|
|
106
|
+
|
|
107
|
+
---
|
|
108
|
+
|
|
109
|
+
## Workflow
|
|
110
|
+
|
|
111
|
+
### Phase 1: Planning
|
|
112
|
+
|
|
113
|
+
#### Step 1.1: Resolve Project
|
|
114
|
+
|
|
115
|
+
**If the user supplied a project UUID:**
|
|
116
|
+
|
|
117
|
+
```
|
|
118
|
+
chorus_get_project({ projectUuid: "<uuid>" })
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
Confirm it exists and reuse it.
|
|
122
|
+
|
|
123
|
+
**Otherwise, search for a suitable existing project first:**
|
|
124
|
+
|
|
125
|
+
```
|
|
126
|
+
# Search by topic
|
|
127
|
+
chorus_search({ query: "<key terms from prompt>", entityTypes: ["project"] })
|
|
128
|
+
# Or list recent projects
|
|
129
|
+
chorus_list_projects()
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
If a project clearly matches the user's intent (same topic, active, relevant scope), reuse it. Only when no project fits, create one:
|
|
133
|
+
|
|
134
|
+
```
|
|
135
|
+
chorus_admin_create_project({
|
|
136
|
+
name: "<short title derived from prompt>",
|
|
137
|
+
description: "<1-2 sentence summary of the prompt>"
|
|
138
|
+
})
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
#### Step 1.2: Create the Idea
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
chorus_pm_create_idea({
|
|
145
|
+
projectUuid: "<project-uuid>",
|
|
146
|
+
title: "<concise title derived from prompt>",
|
|
147
|
+
content: "<full user prompt, as-is>"
|
|
148
|
+
})
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Then claim it so you own the elaboration:
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
chorus_claim_idea({ ideaUuid: "<idea-uuid>" })
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
#### Step 1.3: Self-Elaboration (no interactive prompts)
|
|
158
|
+
|
|
159
|
+
In yolo mode you generate the elaboration questions AND answer them yourself — there are NO interactive user prompts. This preserves a decision audit trail without interrupting anyone.
|
|
160
|
+
|
|
161
|
+
1. **Generate and submit questions:**
|
|
162
|
+
|
|
163
|
+
```
|
|
164
|
+
chorus_pm_start_elaboration({
|
|
165
|
+
ideaUuid: "<idea-uuid>",
|
|
166
|
+
depth: "standard",
|
|
167
|
+
questions: [
|
|
168
|
+
{
|
|
169
|
+
id: "q1",
|
|
170
|
+
text: "<question about scope, architecture, data model, etc.>",
|
|
171
|
+
category: "functional",
|
|
172
|
+
options: [
|
|
173
|
+
{ id: "a", label: "<option A>" },
|
|
174
|
+
{ id: "b", label: "<option B>" }
|
|
175
|
+
]
|
|
176
|
+
}
|
|
177
|
+
// ... 5-8 questions covering functional, technical, and scope aspects
|
|
178
|
+
]
|
|
179
|
+
})
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
2. **Answer immediately** — pick the option that best fits the prompt and record your rationale:
|
|
183
|
+
|
|
184
|
+
```
|
|
185
|
+
chorus_answer_elaboration({
|
|
186
|
+
ideaUuid: "<idea-uuid>",
|
|
187
|
+
roundUuid: "<round-uuid>",
|
|
188
|
+
answers: [
|
|
189
|
+
{ questionId: "q1", selectedOptionId: "a", customText: "Rationale: ..." }
|
|
190
|
+
// ...
|
|
191
|
+
]
|
|
192
|
+
})
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
3. **Validate** — in self-mode there are no outstanding human issues, so close the round clean:
|
|
196
|
+
|
|
197
|
+
```
|
|
198
|
+
chorus_pm_validate_elaboration({
|
|
199
|
+
ideaUuid: "<idea-uuid>",
|
|
200
|
+
roundUuid: "<round-uuid>",
|
|
201
|
+
issues: []
|
|
202
|
+
})
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
#### Step 1.4: Create the Proposal
|
|
206
|
+
|
|
207
|
+
1. **Create the empty proposal container:**
|
|
208
|
+
|
|
209
|
+
```
|
|
210
|
+
chorus_pm_create_proposal({
|
|
211
|
+
projectUuid: "<project-uuid>",
|
|
212
|
+
title: "<feature name>",
|
|
213
|
+
description: "<summary derived from the elaborated idea>",
|
|
214
|
+
inputType: "idea",
|
|
215
|
+
inputUuids: ["<idea-uuid>"]
|
|
216
|
+
})
|
|
217
|
+
```
|
|
218
|
+
|
|
219
|
+
2. **Add a tech-design document draft.** Capture architecture, data model, API surface, and module contracts (return formats, error patterns, call points) so each task draft can reference a single source of truth:
|
|
220
|
+
|
|
221
|
+
```
|
|
222
|
+
chorus_pm_add_document_draft({
|
|
223
|
+
proposalUuid: "<proposal-uuid>",
|
|
224
|
+
type: "tech_design",
|
|
225
|
+
title: "Tech Design: <feature>",
|
|
226
|
+
content: "<markdown tech design: architecture, data model, API, module contracts>"
|
|
227
|
+
})
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
3. **Add task drafts incrementally** and chain them into a `dependsOn` DAG with the returned `draftUuid` of each upstream draft. `acceptanceCriteriaItems` is **required** on every draft — at least one non-blank criterion, or the call is rejected. Each criterion must be objectively verifiable by a different agent:
|
|
231
|
+
|
|
232
|
+
```
|
|
233
|
+
# First task
|
|
234
|
+
result1 = chorus_pm_add_task_draft({
|
|
235
|
+
proposalUuid: "<proposal-uuid>",
|
|
236
|
+
title: "<module name>",
|
|
237
|
+
description: "<what to build, referencing the tech design>",
|
|
238
|
+
priority: "high",
|
|
239
|
+
storyPoints: 3,
|
|
240
|
+
acceptanceCriteriaItems: [
|
|
241
|
+
{ description: "<testable criterion>", required: true }
|
|
242
|
+
// ...
|
|
243
|
+
]
|
|
244
|
+
})
|
|
245
|
+
|
|
246
|
+
# Second task depends on the first
|
|
247
|
+
chorus_pm_add_task_draft({
|
|
248
|
+
proposalUuid: "<proposal-uuid>",
|
|
249
|
+
title: "<dependent module>",
|
|
250
|
+
description: "...",
|
|
251
|
+
priority: "medium",
|
|
252
|
+
storyPoints: 2,
|
|
253
|
+
acceptanceCriteriaItems: [ { description: "...", required: true } ],
|
|
254
|
+
dependsOnDraftUuids: ["<result1.draftUuid>"]
|
|
255
|
+
})
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
> For a DAG of **4 or more tasks**, include at least one integration-checkpoint task whose AC requires end-to-end execution of the preceding modules together. The proposal reviewer treats a missing integration checkpoint as a BLOCKER, so add one up front.
|
|
259
|
+
|
|
260
|
+
4. **Validate** and fix any reported errors before submitting:
|
|
261
|
+
|
|
262
|
+
```
|
|
263
|
+
chorus_pm_validate_proposal({ proposalUuid: "<proposal-uuid>" })
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
5. **Submit** for review:
|
|
267
|
+
|
|
268
|
+
```
|
|
269
|
+
chorus_pm_submit_proposal({ proposalUuid: "<proposal-uuid>" })
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
Proceed to Phase 2 — you drive the proposal review yourself; nothing reviews it automatically.
|
|
273
|
+
|
|
274
|
+
---
|
|
275
|
+
|
|
276
|
+
### Phase 2: Proposal Review Loop
|
|
277
|
+
|
|
278
|
+
Run an adversarial review on the submitted proposal using the **Independent Review pattern** (see below). Loop until the verdict allows approval or you exhaust `maxProposalReviewRounds`.
|
|
279
|
+
|
|
280
|
+
> **Independent Review pattern (framework-neutral).** Spawn a **read-only** sub-agent and have it load the `proposal-reviewer-chorus` skill (`<BASE_URL>/skill/proposal-reviewer-chorus/SKILL.md`), pass it the `proposalUuid` and the current review round number, and instruct it to post exactly one `VERDICT` comment on the proposal. The reviewer's only side effect is that comment; it makes no writes to your project. After it returns, read the verdict via `chorus_get_comments`.
|
|
281
|
+
>
|
|
282
|
+
> **The exact spawn mechanism is harness-specific** — these are EXAMPLES only, not a hard dependency:
|
|
283
|
+
> - Claude Code: dispatch a sub-agent with the Task/Agent tool, mounting the `proposal-reviewer-chorus` skill.
|
|
284
|
+
> - Codex: `spawn_agent` mounting the skill, then `wait_agent`; release the thread slot with `close_agent` afterwards.
|
|
285
|
+
> - Any other harness: whatever read-only sub-agent primitive it exposes.
|
|
286
|
+
>
|
|
287
|
+
> **Inline self-review fallback (no sub-agents available).** If your harness cannot spawn a sub-agent, perform the review inline as the main agent: read `proposal-reviewer-chorus`, follow its procedure against this proposal (fetch the proposal `section: "full"`, the idea, and the elaboration; audit documents and task drafts; classify findings as BLOCKER vs NOTE), and post your own `VERDICT` comment via `chorus_add_comment`. The verdict semantics below are identical in either mode.
|
|
288
|
+
>
|
|
289
|
+
> This is the canonical pattern; `chorus` (`<BASE_URL>/skill/chorus/SKILL.md`) documents it canonically — describe it inline here so yolo is self-contained.
|
|
290
|
+
|
|
291
|
+
**Review loop:**
|
|
292
|
+
|
|
293
|
+
```
|
|
294
|
+
round = 1
|
|
295
|
+
loop:
|
|
296
|
+
# 1. Spawn the reviewer (Independent Review pattern above) with proposalUuid + round.
|
|
297
|
+
# Fallback: inline self-review as the main agent.
|
|
298
|
+
|
|
299
|
+
# 2. Read the latest VERDICT comment.
|
|
300
|
+
comments = chorus_get_comments({ targetType: "proposal", targetUuid: "<proposal-uuid>" })
|
|
301
|
+
# Find the most recent comment containing "VERDICT:".
|
|
302
|
+
|
|
303
|
+
# 3. Act on the verdict (three outcomes).
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
1. **`VERDICT: PASS`** or **`VERDICT: PASS WITH NOTES`** — approve. Tasks and documents materialize automatically; proceed to Phase 3.
|
|
307
|
+
|
|
308
|
+
```
|
|
309
|
+
chorus_admin_approve_proposal({
|
|
310
|
+
proposalUuid: "<proposal-uuid>",
|
|
311
|
+
reviewNote: "PASS from reviewer. <one-line summary of any NOTES>"
|
|
312
|
+
})
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
2. **`VERDICT: FAIL`** — read the BLOCKERs from the reviewer comment, reject, revise, and resubmit:
|
|
316
|
+
|
|
317
|
+
```
|
|
318
|
+
chorus_pm_reject_proposal({
|
|
319
|
+
proposalUuid: "<proposal-uuid>",
|
|
320
|
+
reviewNote: "FAIL from reviewer. Fixing BLOCKERs: <list>"
|
|
321
|
+
})
|
|
322
|
+
# Revise drafts to address each BLOCKER:
|
|
323
|
+
# chorus_pm_update_document_draft({ ... })
|
|
324
|
+
# chorus_pm_update_task_draft({ ... })
|
|
325
|
+
chorus_pm_submit_proposal({ proposalUuid: "<proposal-uuid>" })
|
|
326
|
+
round += 1
|
|
327
|
+
# Re-run the Independent Review for the next round (pass round = current number).
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
3. **Max rounds escalation.** Loop up to `maxProposalReviewRounds` (default **3**). If exhausted with unresolved BLOCKERs:
|
|
331
|
+
|
|
332
|
+
```
|
|
333
|
+
STOP: "Proposal review failed after 3 rounds. Remaining BLOCKERs: <list>.
|
|
334
|
+
Human review needed. Proposal UUID: <proposal-uuid>."
|
|
335
|
+
```
|
|
336
|
+
|
|
337
|
+
4. **No VERDICT comment after the reviewer returns?** The reviewer likely exhausted its turn budget. **Respawn it once** with a concise-budget hint: *"Stay within turn budget. Fetch the proposal + comments + idea only, skim for obvious BLOCKERs, and post your VERDICT within the first ~10 turns."* If the second attempt still posts no VERDICT, treat the proposal as **PASS WITH NOTES** and proceed — the pipeline must not loop forever on a silent reviewer.
|
|
338
|
+
|
|
339
|
+
---
|
|
340
|
+
|
|
341
|
+
### Phase 3: Execution (Wave-Based)
|
|
342
|
+
|
|
343
|
+
After approval, tasks exist in `open`. Execute them in dependency-ordered waves. A wave is the current set of unblocked tasks; verifying a wave (Phase 4) unblocks the next.
|
|
344
|
+
|
|
345
|
+
```
|
|
346
|
+
wave = 1
|
|
347
|
+
loop:
|
|
348
|
+
# 1. Find tasks whose dependencies are all resolved (done/closed).
|
|
349
|
+
unblocked = chorus_get_unblocked_tasks({ projectUuid: "<project-uuid>" })
|
|
350
|
+
|
|
351
|
+
if no unblocked tasks and all tasks done:
|
|
352
|
+
break # pipeline complete
|
|
353
|
+
|
|
354
|
+
if no unblocked tasks and some tasks not done:
|
|
355
|
+
break with escalation report # stuck: tasks failed review or are circularly blocked
|
|
356
|
+
|
|
357
|
+
# 2. Dispatch one worker per unblocked task (see worker dispatch below).
|
|
358
|
+
# 3. Wait for workers to reach `to_verify`.
|
|
359
|
+
# 4. Run Phase 4 verification for this wave's tasks.
|
|
360
|
+
wave += 1
|
|
361
|
+
# 5. Loop: re-check chorus_get_unblocked_tasks for newly unblocked tasks.
|
|
362
|
+
```
|
|
363
|
+
|
|
364
|
+
**Worker dispatch (framework-neutral).** For each unblocked task, dispatch a worker sub-agent that follows the developer workflow (`develop-chorus`, `<BASE_URL>/skill/develop-chorus/SKILL.md`): claim -> in_progress -> implement -> report_work -> self-check AC -> submit_for_verify. The worker prompt needs:
|
|
365
|
+
|
|
366
|
+
- `taskUuid` (required)
|
|
367
|
+
- `projectUuid` (required, for context lookups)
|
|
368
|
+
- An explicit instruction to follow the `develop-chorus` skill and to exit after `chorus_submit_for_verify` so the main agent can run verification.
|
|
369
|
+
|
|
370
|
+
> **The spawn mechanism is harness-specific** — EXAMPLES only:
|
|
371
|
+
> - Claude Code: one sub-agent per task via the Task/Agent tool (parallel within the wave).
|
|
372
|
+
> - Codex: `spawn_agent` per task, then `wait_agent`; `close_agent` each worker after it returns.
|
|
373
|
+
> - Optionally create a `chorus_create_session` per worker for observability and `chorus_close_session` it when the worker finishes.
|
|
374
|
+
|
|
375
|
+
**Sequential main-agent fallback.** If sub-agents are unavailable, or parallel execution is impractical (rate limits, token budget, simpler debugging), execute each unblocked task yourself, sequentially, as the main agent:
|
|
376
|
+
|
|
377
|
+
```
|
|
378
|
+
for each task in unblocked:
|
|
379
|
+
chorus_claim_task({ taskUuid: "<task-uuid>" })
|
|
380
|
+
chorus_update_task({ taskUuid: "<task-uuid>", status: "in_progress" })
|
|
381
|
+
# ... read context (task, proposal documents, upstream deps), implement, run tests ...
|
|
382
|
+
chorus_report_work({ taskUuid: "<task-uuid>", report: "..." })
|
|
383
|
+
chorus_report_criteria_self_check({ taskUuid: "<task-uuid>", criteria: [ ... ] })
|
|
384
|
+
chorus_submit_for_verify({ taskUuid: "<task-uuid>", summary: "..." })
|
|
385
|
+
# Then run Phase 4 verification for this task before moving on.
|
|
386
|
+
```
|
|
387
|
+
|
|
388
|
+
The fallback is slower (no parallelism) but completes the same pipeline.
|
|
389
|
+
|
|
390
|
+
---
|
|
391
|
+
|
|
392
|
+
### Phase 4: Verification Loop
|
|
393
|
+
|
|
394
|
+
After each wave's workers reach `to_verify`, verify their tasks using the **Independent Review pattern** — the same neutral mechanism as Phase 2, pointed at the `task-reviewer-chorus` skill.
|
|
395
|
+
|
|
396
|
+
> **Independent Review pattern (framework-neutral).** Spawn a **read-only** sub-agent and have it load the `task-reviewer-chorus` skill (`<BASE_URL>/skill/task-reviewer-chorus/SKILL.md`), pass it the `taskUuid` and the current review round number, and instruct it to post exactly one `VERDICT` comment on the task. The reviewer's only project side effect is that comment (it may run read-only tests/build/lint, but never writes). After it returns, read the verdict via `chorus_get_comments`.
|
|
397
|
+
>
|
|
398
|
+
> **The exact spawn mechanism is harness-specific** — EXAMPLES only:
|
|
399
|
+
> - Claude Code: dispatch a read-only sub-agent with the Task/Agent tool, mounting the `task-reviewer-chorus` skill.
|
|
400
|
+
> - Codex: `spawn_agent` mounting the skill, then `wait_agent`; `close_agent` afterwards to release the thread slot.
|
|
401
|
+
>
|
|
402
|
+
> **Inline self-review fallback (no sub-agents available).** Perform the review inline as the main agent: read `task-reviewer-chorus`, follow its procedure (fetch the task, its AC, comments, and the proposal `section: "documents"`; run the project's test/build/lint; verify each AC independently; classify BLOCKER vs NOTE), and post your own `VERDICT` comment via `chorus_add_comment`.
|
|
403
|
+
|
|
404
|
+
**Verification loop, per task in the wave:**
|
|
405
|
+
|
|
406
|
+
```
|
|
407
|
+
for each task in wave_tasks:
|
|
408
|
+
t = chorus_get_task({ taskUuid: "<task-uuid>" })
|
|
409
|
+
if t.status != "to_verify":
|
|
410
|
+
continue # worker did not submit; handle in a later wave or escalate
|
|
411
|
+
|
|
412
|
+
# Spawn the task reviewer (Independent Review pattern) with taskUuid + round.
|
|
413
|
+
# Fallback: inline self-review.
|
|
414
|
+
|
|
415
|
+
comments = chorus_get_comments({ targetType: "task", targetUuid: "<task-uuid>" })
|
|
416
|
+
# Find the most recent comment containing "VERDICT:".
|
|
417
|
+
```
|
|
418
|
+
|
|
419
|
+
Act on the verdict — three outcomes:
|
|
420
|
+
|
|
421
|
+
1. **`VERDICT: PASS`** — all AC verified, no issues. Mark AC and verify:
|
|
422
|
+
|
|
423
|
+
```
|
|
424
|
+
chorus_mark_acceptance_criteria({
|
|
425
|
+
taskUuid: "<task-uuid>",
|
|
426
|
+
criteria: [ { uuid: "<ac-uuid>", status: "passed", evidence: "<from reviewer>" } /* ... */ ]
|
|
427
|
+
})
|
|
428
|
+
chorus_admin_verify_task({ taskUuid: "<task-uuid>" }) # -> done, unblocks dependents
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
2. **`VERDICT: PASS WITH NOTES`** — minor, non-blocking notes only. Still mark AC and verify (same two calls as above).
|
|
432
|
+
|
|
433
|
+
3. **`VERDICT: FAIL`** — BLOCKERs found. Do NOT verify. Reopen for rework; the task returns to `in_progress` (its AC reset to pending) and is picked up in the next wave:
|
|
434
|
+
|
|
435
|
+
```
|
|
436
|
+
chorus_admin_reopen_task({ taskUuid: "<task-uuid>" })
|
|
437
|
+
chorus_add_comment({ targetType: "task", targetUuid: "<task-uuid>",
|
|
438
|
+
content: "Reopened. BLOCKERs to fix: <list>" })
|
|
439
|
+
```
|
|
440
|
+
|
|
441
|
+
**Max rounds escalation.** Track review rounds per task via `maxTaskReviewRounds` (default **3**). If a task has been reopened 3 times and still FAILs, skip it and flag for human escalation — do **not** halt the whole pipeline for one stuck task:
|
|
442
|
+
|
|
443
|
+
```
|
|
444
|
+
ESCALATE: "Task '<title>' failed review after 3 rounds. Last BLOCKERs: <list>.
|
|
445
|
+
Manual intervention needed. Task UUID: <task-uuid>."
|
|
446
|
+
```
|
|
447
|
+
|
|
448
|
+
**No VERDICT comment after the reviewer returns?** It exhausted its turn budget. **Respawn it once** with a concise-budget hint: *"Stay within turn budget. Fetch the task/proposal/comments, run only the core tests, and post your VERDICT within the first ~12 turns."* If the second attempt still posts no VERDICT, treat as **PASS WITH NOTES** and proceed — do not loop indefinitely.
|
|
449
|
+
|
|
450
|
+
After verifying every task in the wave, return to **Phase 3** and re-run `chorus_get_unblocked_tasks` for newly unblocked tasks. Repeat until no tasks remain.
|
|
451
|
+
|
|
452
|
+
---
|
|
453
|
+
|
|
454
|
+
### Phase 5: Report
|
|
455
|
+
|
|
456
|
+
When all waves complete, output a markdown summary:
|
|
457
|
+
|
|
458
|
+
```markdown
|
|
459
|
+
## Yolo Complete
|
|
460
|
+
|
|
461
|
+
**Project:** <project-name> (<project-uuid>)
|
|
462
|
+
**Proposal:** <proposal-title> (<proposal-uuid>)
|
|
463
|
+
**Idea:** <idea-title> (<idea-uuid>)
|
|
464
|
+
|
|
465
|
+
### Tasks
|
|
466
|
+
| Task | Status | Review Rounds |
|
|
467
|
+
|------|--------|---------------|
|
|
468
|
+
| <title> | done | 1 |
|
|
469
|
+
| <title> | done | 2 |
|
|
470
|
+
| <title> | ESCALATED | 3 (max) |
|
|
471
|
+
|
|
472
|
+
### Summary
|
|
473
|
+
- Total tasks: N
|
|
474
|
+
- Completed: X / N
|
|
475
|
+
- Escalated: Y (need human review)
|
|
476
|
+
- Waves executed: W
|
|
477
|
+
- Idea Completion Report: <document-uuid> (from Phase 5b)
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
---
|
|
481
|
+
|
|
482
|
+
### Phase 5b: Idea Completion Report (mandatory)
|
|
483
|
+
|
|
484
|
+
A successful yolo run always finishes the Idea. Call `chorus_create_report` **exactly once**, with `proposalUuid` set to the **last verified proposal**. The tool's own description carries the section template — follow it. Surface the returned `documentUuid` in the Phase 5 summary table. Skipping this is a protocol violation.
|
|
485
|
+
|
|
486
|
+
```
|
|
487
|
+
result = chorus_create_report({
|
|
488
|
+
proposalUuid: "<last-verified-proposal-uuid>",
|
|
489
|
+
// ... follow the tool description's section template ...
|
|
490
|
+
})
|
|
491
|
+
# Surface result.documentUuid in the Phase 5 summary.
|
|
492
|
+
```
|
|
493
|
+
|
|
494
|
+
---
|
|
495
|
+
|
|
496
|
+
## Error Handling
|
|
497
|
+
|
|
498
|
+
| Scenario | Action |
|
|
499
|
+
|----------|--------|
|
|
500
|
+
| Missing permissions at startup | Abort, listing **every** missing `resource:action` pair (see Prerequisites). Recommend an Admin-preset API key. |
|
|
501
|
+
| Project creation fails | Report the error; suggest the user create the project manually and rerun with an existing-project hint. |
|
|
502
|
+
| Proposal review FAILs after `maxProposalReviewRounds` (3) | Stop the pipeline; report the persisting BLOCKERs; recommend manual review of the proposal. |
|
|
503
|
+
| Task review FAILs after `maxTaskReviewRounds` (3) | Flag the task as escalation-needed; continue with the other tasks. |
|
|
504
|
+
| Reviewer returns no VERDICT | Respawn the reviewer once with a concise-budget hint; if still none, treat as PASS WITH NOTES and proceed. |
|
|
505
|
+
| Worker crashes / never submits | Log it, leave the task non-`to_verify`; re-pick it in a later wave or escalate if it stays stuck. |
|
|
506
|
+
| No unblocked tasks but some not done | Stuck DAG (failed reviews or bad dependencies). Break with an escalation report; do not loop. |
|
|
507
|
+
| Sub-agents unavailable | Use the inline self-review fallback (reviews) and the sequential main-agent fallback (execution). |
|
|
508
|
+
| Interrupted mid-run | All entities persist in Chorus. Resume via `develop-chorus` or `review-chorus`. |
|
|
509
|
+
|
|
510
|
+
---
|
|
511
|
+
|
|
512
|
+
## Tips
|
|
513
|
+
|
|
514
|
+
- **Keep the prompt detailed** — richer input yields a stronger proposal and fewer review rounds.
|
|
515
|
+
- **The proposal reviewer is your quality gate** — repeated FAILs usually mean the prompt is too vague; tighten it and rerun.
|
|
516
|
+
- **Watch the wave count** — if tasks keep getting reopened, interrupt and inspect the reviewer feedback before continuing.
|
|
517
|
+
- **Prefer sub-agents when available** — a fresh read-only reviewer is more adversarial than reviewing your own output inline; use the inline fallback only when you must.
|
|
518
|
+
- **Everything is audited** — elaboration Q&A, reviewer VERDICTs, work reports, and approvals all persist; inspect the Chorus UI for the full history.
|
|
519
|
+
- **For small, single-step work**, prefer `quick-dev-chorus` (`<BASE_URL>/skill/quick-dev-chorus/SKILL.md`) — it skips the Idea -> Proposal overhead.
|
|
520
|
+
- **Sub-agents share your API key** — confirm it carries the Prerequisites permissions before starting.
|
|
521
|
+
|
|
522
|
+
---
|
|
523
|
+
|
|
524
|
+
## Next
|
|
525
|
+
|
|
526
|
+
- To create proposals manually: `proposal-chorus` skill (`<BASE_URL>/skill/proposal-chorus/SKILL.md`)
|
|
527
|
+
- To develop tasks manually: `develop-chorus` skill (`<BASE_URL>/skill/develop-chorus/SKILL.md`)
|
|
528
|
+
- To review proposals and verify tasks manually: `review-chorus` skill (`<BASE_URL>/skill/review-chorus/SKILL.md`)
|
|
529
|
+
- For platform overview and shared tools: `chorus` skill (`<BASE_URL>/skill/chorus/SKILL.md`)
|
|
@@ -119,6 +119,10 @@ else
|
|
|
119
119
|
grep -q '^\[mcp_servers\.chorus\]' "$cfg" && pass "[mcp_servers.chorus] block present" || fail "[mcp_servers.chorus] missing"
|
|
120
120
|
grep -q 'url = "https://chorus.test/api/mcp"' "$cfg" && pass "url written literally" || fail "url not literal"
|
|
121
121
|
grep -q 'Authorization = "Bearer cho_test_key_abc123"' "$cfg" && pass "Authorization header literal" || fail "Authorization not literal"
|
|
122
|
+
grep -q '^hooks = true' "$cfg" && pass "hooks feature enabled" || fail "hooks feature not enabled"
|
|
123
|
+
grep -q '^codex_hooks =' "$cfg" && fail "deprecated codex_hooks key written" || pass "deprecated codex_hooks key not written"
|
|
124
|
+
[ ! -f "$TMP_HOME/.codex/hooks.json" ] && pass "installer does not write user hooks.json" || fail "installer wrote user hooks.json"
|
|
125
|
+
[ ! -e "$TMP_HOME/.codex/hooks/chorus/run-hook.sh" ] && pass "installer does not write hook wrapper" || fail "installer wrote hook wrapper"
|
|
122
126
|
if command -v stat >/dev/null 2>&1; then
|
|
123
127
|
mode="$(stat -c '%a' "$cfg" 2>/dev/null || stat -f '%OLp' "$cfg" 2>/dev/null || echo "")"
|
|
124
128
|
if [ "$mode" = "600" ]; then
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@chorus-aidlc/chorus",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.3",
|
|
4
4
|
"description": "The Agent Harness for AI-Human Collaboration — session lifecycle, task state, sub-agent orchestration, observability, and failure recovery",
|
|
5
5
|
"homepage": "https://github.com/Chorus-AIDLC/Chorus",
|
|
6
6
|
"repository": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=1002,exports.ids=[1002],exports.modules={48873:(a,b,c)=>{c.d(b,{Ik:()=>f,Yy:()=>d,nm:()=>e});class d extends Error{constructor(a){super(`${a} is already claimed`),this.name="AlreadyClaimedError"}}class e extends Error{constructor(a){super(`${a} is not currently claimed`),this.name="NotClaimedError"}}function f(a){return"object"==typeof a&&null!==a&&"code"in a&&"P2025"===a.code}},76872:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{LS:()=>h,SJ:()=>j,Uo:()=>k,Xx:()=>l,_9:()=>m,ir:()=>i,lR:()=>g});var e=c(52618),f=a([e]);async function g(a,b){if("user"===a){let a=await e.z.user.findUnique({where:{uuid:b},select:{name:!0,email:!0}});return a&&(a.name||a.email)||"Unknown"}if("agent"===a){let a=await e.z.agent.findUnique({where:{uuid:b},select:{name:!0}});return a?.name??null}return null}async function h(a,b){if(b){let c=await g(b,a);return c?{type:b,uuid:a,name:c}:null}let c=await e.z.user.findUnique({where:{uuid:a},select:{name:!0,email:!0}});if(c)return{type:"user",uuid:a,name:c.name||c.email||"Unknown"};let d=await e.z.agent.findUnique({where:{uuid:a},select:{name:!0}});return d?{type:"agent",uuid:a,name:d.name}:null}async function i(a,b,c,d){if(!a||!b)return null;let e=await g(a,b);if(!e)return null;let f=null;if(d){let a=await g("user",d);a&&(f={type:"user",uuid:d,name:a})}return{type:a,uuid:b,name:e,assignedAt:c?.toISOString()??null,assignedBy:f}}async function j(a,b,c){if(!a)return null;let d=await g("user",a);if(d&&"Unknown"!==d)return{reviewedBy:{type:"user",uuid:a,name:d},reviewNote:b,reviewedAt:c?.toISOString()??null};let e=await g("agent",a);return e?{reviewedBy:{type:"agent",uuid:a,name:e},reviewNote:b,reviewedAt:c?.toISOString()??null}:null}async function k(a){let b=new Map;if(0===a.length)return b;let c=[...new Set(a.filter(a=>"user"===a.type).map(a=>a.uuid))],d=[...new Set(a.filter(a=>"agent"===a.type).map(a=>a.uuid))],[f,g]=await Promise.all([c.length>0?e.z.user.findMany({where:{uuid:{in:c}},select:{uuid:!0,name:!0,email:!0}}):[],d.length>0?e.z.agent.findMany({where:{uuid:{in:d}},select:{uuid:!0,name:!0}}):[]]);for(let a of f)b.set(a.uuid,a.name||a.email||"Unknown");for(let a of g)b.set(a.uuid,a.name);return b}async function l(a){let b=new Map;if(0===a.length)return b;let c=[...new Set(a)],d=await e.z.user.findMany({where:{uuid:{in:c}},select:{uuid:!0,name:!0,email:!0}}),f=new Set;for(let a of d)f.add(a.uuid),b.set(a.uuid,{type:"user",uuid:a.uuid,name:a.name||a.email||"Unknown"});let g=c.filter(a=>!f.has(a));if(g.length>0)for(let a of(await e.z.agent.findMany({where:{uuid:{in:g}},select:{uuid:!0,name:!0}})))b.set(a.uuid,{type:"agent",uuid:a.uuid,name:a.name});return b}async function m(a,b,c){let d={uuid:b,companyUuid:c};switch(a){case"idea":return!!await e.z.idea.findFirst({where:d,select:{uuid:!0}});case"proposal":return!!await e.z.proposal.findFirst({where:d,select:{uuid:!0}});case"task":return!!await e.z.task.findFirst({where:d,select:{uuid:!0}});case"document":return!!await e.z.document.findFirst({where:d,select:{uuid:!0}});default:return!1}}e=(f.then?(await f)():f)[0],d()}catch(a){d(a)}})},88437:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.r(b),c.d(b,{createActivity:()=>k,listActivities:()=>i,listActivitiesWithActorNames:()=>j});var e=c(52618),f=c(42558),g=c(76872),h=a([e,g]);async function i({companyUuid:a,projectUuid:b,skip:c,take:d,targetType:f,targetUuid:g}){let h={projectUuid:b,companyUuid:a,...f&&{targetType:f},...g&&{targetUuid:g}},[i,j]=await Promise.all([e.z.activity.findMany({where:h,skip:c,take:d,orderBy:{createdAt:"desc"},select:{uuid:!0,targetType:!0,targetUuid:!0,actorType:!0,actorUuid:!0,action:!0,value:!0,sessionUuid:!0,sessionName:!0,createdAt:!0}}),e.z.activity.count({where:h})]);return{activities:i,total:j}}async function j(a){let{activities:b,total:c}=await i(a);return{activities:await Promise.all(b.map(async a=>{let b=await (0,g.lR)(a.actorType,a.actorUuid);return{uuid:a.uuid,targetType:a.targetType,targetUuid:a.targetUuid,action:a.action,actorType:a.actorType,actorName:b||"Unknown",value:a.value,sessionUuid:a.sessionUuid,sessionName:a.sessionName,createdAt:a.createdAt.toISOString()}})),total:c}}async function k({companyUuid:a,projectUuid:b,targetType:c,targetUuid:d,actorType:g,actorUuid:h,action:i,value:j,sessionUuid:k,sessionName:l}){let m=await e.z.activity.create({data:{companyUuid:a,projectUuid:b,targetType:c,targetUuid:d,actorType:g,actorUuid:h,action:i,value:j||void 0,sessionUuid:k||void 0,sessionName:l||void 0}});return f.B.emit("activity",{companyUuid:a,projectUuid:b,targetType:c,targetUuid:d,actorType:g,actorUuid:h,action:i,value:j,sessionUuid:k,sessionName:l,uuid:m.uuid}),m}[e,g]=h.then?(await h)():h,d()}catch(a){d(a)}})},90494:(a,b,c)=>{c.a(a,async(a,d)=>{try{c.d(b,{AM:()=>j,Xs:()=>i,_L:()=>k});var e=c(52618),f=c(76872),g=c(37943),h=a([e,f,g]);[e,f,g]=h.then?(await h)():h;let m=/@\[([^\]]+)\]\((user|agent):([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})\)/gi;function i(a){let b,c=[],d=new Set;for(m.lastIndex=0;null!==(b=m.exec(a))&&!(c.length>=10);){let a=b[1],e=b[2].toLowerCase(),f=b[3].toLowerCase(),g=`${e}:${f}`;d.has(g)||(d.add(g),c.push({type:e,uuid:f,displayName:a}))}return c}async function j(a){let{companyUuid:b,sourceType:c,sourceUuid:d,content:h,actorType:j,actorUuid:k,projectUuid:n,entityTitle:o}=a,p=i(h);if(0===p.length)return;let q=p.filter(a=>a.type!==j||a.uuid!==k);if(0===q.length)return;let r=[];for(let a of q)await l(b,a.type,a.uuid)&&r.push(a);if(0===r.length)return;await e.z.mention.createMany({data:r.map(a=>({companyUuid:b,sourceType:c,sourceUuid:d,mentionedType:a.type,mentionedUuid:a.uuid,actorType:j,actorUuid:k}))});let s=await (0,f.lR)(j,k)??"Someone",t=await e.z.project.findUnique({where:{uuid:n},select:{name:!0}}),u=t?.name??"Unknown Project",v=function(a){let b=a.replace(m,"@$1");return b.length<=120?b:b.substring(0,117)+"..."}(h),w=c,x=d;if("comment"===c){let a=await e.z.comment.findUnique({where:{uuid:d},select:{targetType:!0,targetUuid:!0}});a&&(w=a.targetType,x=a.targetUuid)}let y=[];for(let a of r){if(!(await g.lX(b,a.type,a.uuid)).mentioned)continue;let c=`${s} mentioned you: "${v}"`;y.push({companyUuid:b,projectUuid:n,recipientType:a.type,recipientUuid:a.uuid,entityType:w,entityUuid:x,entityTitle:o,projectName:u,action:"mentioned",message:c,actorType:j,actorUuid:k,actorName:s})}y.length>0&&await g.Xm(y)}async function k(a){let b,{companyUuid:c,query:d,actorType:f,actorUuid:g,ownerUuid:h,limit:i=10}=a,j=Math.min(i,50),k=[];if("user"===f?b=g:"agent"===f&&h&&(b=h),!d){if(b)for(let a of(await e.z.agent.findMany({where:{companyUuid:c,ownerUuid:b},select:{uuid:!0,name:!0,roles:!0},orderBy:{createdAt:"desc"},take:Math.min(5,j)})))k.push({type:"agent",uuid:a.uuid,name:a.name,roles:a.roles});return k}for(let a of(await e.z.user.findMany({where:{companyUuid:c,OR:[{name:{contains:d,mode:"insensitive"}},{email:{contains:d,mode:"insensitive"}}]},select:{uuid:!0,name:!0,email:!0,avatarUrl:!0},take:j})))k.push({type:"user",uuid:a.uuid,name:a.name??a.email??"Unknown",email:a.email,avatarUrl:a.avatarUrl});let l={companyUuid:c,name:{contains:d,mode:"insensitive"}};for(let a of(b&&(l.ownerUuid=b),await e.z.agent.findMany({where:l,select:{uuid:!0,name:!0,roles:!0},take:j-k.length>0?j-k.length:j})))k.push({type:"agent",uuid:a.uuid,name:a.name,roles:a.roles});return k.slice(0,j)}async function l(a,b,c){return"user"===b?!!await e.z.user.findFirst({where:{uuid:c,companyUuid:a},select:{uuid:!0}}):!!await e.z.agent.findFirst({where:{uuid:c,companyUuid:a},select:{uuid:!0}})}d()}catch(a){d(a)}})}};
|