@aoagents/ao-web 0.2.4 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.next/BUILD_ID +1 -1
- package/.next/app-build-manifest.json +296 -223
- package/.next/app-path-routes-manifest.json +16 -8
- package/.next/build-manifest.json +14 -14
- package/.next/next-minimal-server.js.nft.json +1 -1
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +31 -31
- package/.next/react-loadable-manifest.json +18 -18
- package/.next/required-server-files.json +9 -4
- package/.next/routes-manifest.json +33 -0
- package/.next/server/app/_not-found/page.js +2 -2
- package/.next/server/app/_not-found/page.js.nft.json +1 -1
- package/.next/server/app/_not-found/page_client-reference-manifest.js +1 -1
- package/.next/server/app/_not-found.html +1 -1
- package/.next/server/app/_not-found.rsc +15 -15
- package/.next/server/app/api/backlog/route.js +1 -1
- package/.next/server/app/api/backlog/route.js.nft.json +1 -1
- package/.next/server/app/api/backlog/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/browse-directory/route.js +1 -0
- package/.next/server/app/api/browse-directory/route.js.nft.json +1 -0
- package/.next/server/app/api/browse-directory/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/events/route.js +3 -3
- package/.next/server/app/api/events/route.js.nft.json +1 -1
- package/.next/server/app/api/events/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/filesystem/browse/route.js +1 -0
- package/.next/server/app/api/filesystem/browse/route.js.nft.json +1 -0
- package/.next/server/app/api/filesystem/browse/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/issues/route.js +1 -1
- package/.next/server/app/api/issues/route.js.nft.json +1 -1
- package/.next/server/app/api/issues/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/observability/route.js +1 -1
- package/.next/server/app/api/observability/route.js.nft.json +1 -1
- package/.next/server/app/api/observability/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/orchestrators/route.js +1 -1
- package/.next/server/app/api/orchestrators/route.js.nft.json +1 -1
- package/.next/server/app/api/orchestrators/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/[id]/route.js +1 -0
- package/.next/server/app/api/projects/[id]/route.js.nft.json +1 -0
- package/.next/server/app/api/projects/[id]/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/projects/reload/route.js +1 -0
- package/.next/server/app/api/projects/reload/route.js.nft.json +1 -0
- package/.next/server/app/api/projects/reload/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/projects/route.js +1 -1
- package/.next/server/app/api/projects/route.js.nft.json +1 -1
- package/.next/server/app/api/projects/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/prs/[id]/merge/route.js +1 -1
- package/.next/server/app/api/prs/[id]/merge/route.js.nft.json +1 -1
- package/.next/server/app/api/prs/[id]/merge/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/runtime/terminal/route.js +1 -1
- package/.next/server/app/api/runtime/terminal/route.js.nft.json +1 -1
- package/.next/server/app/api/runtime/terminal/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/kill/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/kill/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/kill/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/message/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/message/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/message/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/remap/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/remap/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/remap/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/restore/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/restore/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/restore/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/[id]/send/route.js +1 -1
- package/.next/server/app/api/sessions/[id]/send/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/[id]/send/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/sessions/patches/route.js +1 -0
- package/.next/server/app/api/sessions/patches/route.js.nft.json +1 -0
- package/.next/server/app/api/sessions/patches/route_client-reference-manifest.js +1 -0
- package/.next/server/app/api/sessions/route.js +1 -1
- package/.next/server/app/api/sessions/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/setup-labels/route.js +1 -1
- package/.next/server/app/api/setup-labels/route.js.nft.json +1 -1
- package/.next/server/app/api/setup-labels/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/spawn/route.js +1 -1
- package/.next/server/app/api/spawn/route.js.nft.json +1 -1
- package/.next/server/app/api/spawn/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/verify/route.js +1 -1
- package/.next/server/app/api/verify/route.js.nft.json +1 -1
- package/.next/server/app/api/verify/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/webhooks/[...slug]/route.js +1 -1
- package/.next/server/app/api/webhooks/[...slug]/route.js.nft.json +1 -1
- package/.next/server/app/api/webhooks/[...slug]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/apple-icon/route.js +1 -1
- package/.next/server/app/apple-icon/route.js.nft.json +1 -1
- package/.next/server/app/apple-icon/route_client-reference-manifest.js +1 -1
- package/.next/server/app/dev/terminal-test/page.js +3 -3
- package/.next/server/app/dev/terminal-test/page.js.nft.json +1 -1
- package/.next/server/app/dev/terminal-test/page_client-reference-manifest.js +1 -1
- package/.next/server/app/dev/terminal-test.html +1 -1
- package/.next/server/app/dev/terminal-test.rsc +17 -17
- package/.next/server/app/icon/route.js +1 -1
- package/.next/server/app/icon/route.js.nft.json +1 -1
- package/.next/server/app/icon/route_client-reference-manifest.js +1 -1
- package/.next/server/app/icon-192/route.js +1 -1
- package/.next/server/app/icon-192/route.js.nft.json +1 -1
- package/.next/server/app/icon-192/route_client-reference-manifest.js +1 -1
- package/.next/server/app/icon-512/route.js +1 -1
- package/.next/server/app/icon-512/route.js.nft.json +1 -1
- package/.next/server/app/icon-512/route_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest/route.js +2 -2
- package/.next/server/app/manifest.webmanifest/route.js.nft.json +1 -1
- package/.next/server/app/manifest.webmanifest/route_client-reference-manifest.js +1 -1
- package/.next/server/app/manifest.webmanifest.body +1 -1
- package/.next/server/app/orchestrators/page.js +2 -2
- package/.next/server/app/orchestrators/page.js.nft.json +1 -1
- package/.next/server/app/orchestrators/page_client-reference-manifest.js +1 -1
- package/.next/server/app/page.js +2 -2
- package/.next/server/app/page.js.nft.json +1 -1
- package/.next/server/app/page_client-reference-manifest.js +1 -1
- package/.next/server/app/projects/[projectId]/page.js +2 -0
- package/.next/server/app/projects/[projectId]/page.js.nft.json +1 -0
- package/.next/server/app/projects/[projectId]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/projects/[projectId]/sessions/[id]/page.js +2 -0
- package/.next/server/app/projects/[projectId]/sessions/[id]/page.js.nft.json +1 -0
- package/.next/server/app/projects/[projectId]/sessions/[id]/page_client-reference-manifest.js +1 -0
- package/.next/server/app/projects/[projectId]/settings/page.js +2 -0
- package/.next/server/app/projects/[projectId]/settings/page.js.nft.json +1 -0
- package/.next/server/app/projects/[projectId]/settings/page_client-reference-manifest.js +1 -0
- package/.next/server/app/prs/page.js +2 -2
- package/.next/server/app/prs/page.js.nft.json +1 -1
- package/.next/server/app/prs/page_client-reference-manifest.js +1 -1
- package/.next/server/app/sessions/[id]/page.js +2 -12
- package/.next/server/app/sessions/[id]/page.js.nft.json +1 -1
- package/.next/server/app/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/test-direct/page.js +2 -2
- package/.next/server/app/test-direct/page.js.nft.json +1 -1
- package/.next/server/app/test-direct/page_client-reference-manifest.js +1 -1
- package/.next/server/app/test-direct.html +1 -1
- package/.next/server/app/test-direct.rsc +17 -17
- package/.next/server/app-paths-manifest.json +16 -8
- package/.next/server/chunks/1172.js +1 -0
- package/.next/server/chunks/1271.js +1 -0
- package/.next/server/chunks/2106.js +1 -0
- package/.next/server/chunks/252.js +11 -0
- package/.next/server/chunks/2810.js +1 -0
- package/.next/server/chunks/3602.js +382 -0
- package/.next/server/chunks/3667.js +277 -0
- package/.next/server/chunks/3714.js +1 -0
- package/.next/server/chunks/4520.js +1 -0
- package/.next/server/chunks/6086.js +25 -0
- package/.next/server/chunks/6172.js +9 -0
- package/.next/server/chunks/8367.js +3 -0
- package/.next/server/chunks/8386.js +1 -0
- package/.next/server/chunks/8803.js +6 -0
- package/.next/server/chunks/9561.js +22 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +1 -1
- package/.next/server/next-font-manifest.js +1 -1
- package/.next/server/next-font-manifest.json +1 -1
- package/.next/server/pages/404.html +1 -1
- package/.next/server/pages/500.html +1 -1
- package/.next/server/pages/_app.js +1 -1
- package/.next/server/pages/_app.js.nft.json +1 -1
- package/.next/server/pages/_document.js +1 -1
- package/.next/server/pages/_document.js.nft.json +1 -1
- package/.next/server/pages/_error.js +3 -3
- package/.next/server/pages/_error.js.nft.json +1 -1
- package/.next/server/server-reference-manifest.json +1 -1
- package/.next/server/webpack-runtime.js +1 -1
- package/.next/static/chunks/1461-af7c54935f21d56d.js +1 -0
- package/.next/static/chunks/1d2d5650.1ef8611b5325bd83.js +18 -0
- package/.next/static/chunks/{9393.acf1934a190d793b.js → 2529.32352c1ce5253e3e.js} +1 -1
- package/.next/static/chunks/3697.4d6d86c5f0caf73e.js +1 -0
- package/.next/static/chunks/4465-aaba60a6355de914.js +1 -0
- package/.next/static/chunks/{7411.ecda44797fb514a0.js → 5491.fd98884d48631149.js} +1 -1
- package/.next/static/chunks/6078.47ce88bee96cfaee.js +1 -0
- package/.next/static/chunks/6607-405ce4d15e595f4a.js +1 -0
- package/.next/static/chunks/7008-71ebb186f0549f41.js +1 -0
- package/.next/static/chunks/7317.685aa5231218e8d3.js +1 -0
- package/.next/static/chunks/8713-d3d663f55dc00e48.js +1 -0
- package/.next/static/chunks/88a6fc35-f836b4b72df5eafa.js +1 -0
- package/.next/static/chunks/9331-fcdd652218ac6f68.js +1 -0
- package/.next/static/chunks/app/_not-found/page-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/backlog/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/browse-directory/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/events/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/filesystem/browse/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/issues/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/observability/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/orchestrators/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/projects/[id]/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/projects/reload/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/projects/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/prs/[id]/merge/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/runtime/terminal/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/kill/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/message/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/remap/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/restore/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/send/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/sessions/patches/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/setup-labels/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/spawn/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/verify/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/api/webhooks/[...slug]/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/apple-icon/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/dev/terminal-test/page-5765f0465db56fed.js +1 -0
- package/.next/static/chunks/app/error-670f1d8bf2b6859c.js +1 -0
- package/.next/static/chunks/app/{global-error-7b5c8ae45329c659.js → global-error-ca06d2b1be2d4ae0.js} +1 -1
- package/.next/static/chunks/app/icon/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/icon-192/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/icon-512/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/layout-ddf79478d9a673bb.js +1 -0
- package/.next/static/chunks/app/loading-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/{not-found-3772c2e09c29d80f.js → not-found-824d5d3c6e296eeb.js} +1 -1
- package/.next/static/chunks/app/orchestrators/page-4c190484788aaaa3.js +1 -0
- package/.next/static/chunks/app/page-d3b83ad5f09b6ec7.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/loading-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/page-9f3dfbea006747cf.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-a7090a06948f9a6b.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/settings/page-219df6dcbc6d1107.js +1 -0
- package/.next/static/chunks/app/prs/page-a285e930235a23af.js +1 -0
- package/.next/static/chunks/app/sessions/[id]/error-eb0973907da68a37.js +1 -0
- package/.next/static/chunks/app/sessions/[id]/loading-e2dea9178b4af8db.js +1 -0
- package/.next/static/chunks/app/sessions/[id]/{not-found-3772c2e09c29d80f.js → not-found-824d5d3c6e296eeb.js} +1 -1
- package/.next/static/chunks/app/sessions/[id]/page-98f398b822092218.js +1 -0
- package/.next/static/chunks/app/test-direct/page-f9bff7d7b4dfe728.js +1 -0
- package/.next/static/chunks/framework-7060e2ac4971c604.js +1 -0
- package/.next/static/chunks/main-app-690acf9d5d2050c9.js +1 -0
- package/.next/static/chunks/main-ed1610689fbd6f0d.js +1 -0
- package/.next/static/chunks/pages/_app-f4baf4dbe88f6f54.js +1 -0
- package/.next/static/chunks/pages/_error-a7f6723f42093f29.js +1 -0
- package/.next/static/chunks/{webpack-e12ceebeb7a1cc7e.js → webpack-d4ff5ed5e153ca3e.js} +1 -1
- package/.next/static/css/577ea7f5ad4f0576.css +1 -0
- package/.next/static/css/659eccb5db697b76.css +1 -0
- package/.next/static/q6yh3n8jgvyI9JIbexzuH/_buildManifest.js +1 -0
- package/dist-server/direct-terminal-ws.js +33 -236
- package/dist-server/mux-websocket.js +516 -0
- package/dist-server/start-all.js +0 -2
- package/next.config.js +5 -0
- package/package.json +18 -15
- package/.next/server/chunks/27.js +0 -438
- package/.next/server/chunks/377.js +0 -1
- package/.next/server/chunks/393.js +0 -1
- package/.next/server/chunks/627.js +0 -391
- package/.next/server/chunks/639.js +0 -6
- package/.next/server/chunks/693.js +0 -1
- package/.next/server/chunks/705.js +0 -22
- package/.next/server/chunks/787.js +0 -29
- package/.next/server/chunks/796.js +0 -1
- package/.next/server/chunks/934.js +0 -1
- package/.next/server/chunks/956.js +0 -9
- package/.next/static/WS8DHHp9haunZGhtE8L33/_buildManifest.js +0 -1
- package/.next/static/chunks/1250-e7cf6b069fbb03ed.js +0 -1
- package/.next/static/chunks/2205.498806f73783aa54.js +0 -1
- package/.next/static/chunks/3698-9c12c45b8184022c.js +0 -1
- package/.next/static/chunks/6381.1541d5695a727108.js +0 -1
- package/.next/static/chunks/7505-2d2422d31862995f.js +0 -1
- package/.next/static/chunks/8597-1385f90ec1cebf47.js +0 -1
- package/.next/static/chunks/8762.f3d526855363db16.js +0 -1
- package/.next/static/chunks/a51c26f2-a21e680a5df6764e.js +0 -1
- package/.next/static/chunks/app/_not-found/page-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/backlog/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/events/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/issues/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/observability/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/orchestrators/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/projects/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/prs/[id]/merge/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/runtime/terminal/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/kill/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/message/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/remap/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/restore/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/send/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/sessions/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/setup-labels/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/spawn/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/verify/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/api/webhooks/[...slug]/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/apple-icon/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/dev/terminal-test/page-ac0ce5b046fcad82.js +0 -1
- package/.next/static/chunks/app/error-4896c9d3b7681a80.js +0 -1
- package/.next/static/chunks/app/icon/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/icon-192/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/icon-512/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/layout-023f2083204e4f68.js +0 -1
- package/.next/static/chunks/app/loading-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/orchestrators/page-df85236df674fc5a.js +0 -1
- package/.next/static/chunks/app/page-e97da633b7ef25f2.js +0 -1
- package/.next/static/chunks/app/prs/page-8cc0fce584d238c5.js +0 -1
- package/.next/static/chunks/app/sessions/[id]/error-90bc99b777fecabf.js +0 -1
- package/.next/static/chunks/app/sessions/[id]/loading-2224bc1d3dce1b3e.js +0 -1
- package/.next/static/chunks/app/sessions/[id]/page-c9c95a8604786cff.js +0 -1
- package/.next/static/chunks/app/test-direct/page-16ceeb9f7664394a.js +0 -1
- package/.next/static/chunks/df4ed4d4.6a752eba3933e9a8.js +0 -3
- package/.next/static/chunks/framework-f8b8ba0f71d38056.js +0 -1
- package/.next/static/chunks/main-2bc85c765bf1fc49.js +0 -1
- package/.next/static/chunks/main-app-93fb36c3bd1a6739.js +0 -1
- package/.next/static/chunks/pages/_app-a0b975794f15bd68.js +0 -1
- package/.next/static/chunks/pages/_error-5f4e3b5eea57917d.js +0 -1
- package/.next/static/css/6ef2fa08dd043252.css +0 -1
- package/.next/static/css/908f93fdd7ffba42.css +0 -1
- package/dist-server/terminal-websocket.js +0 -375
- /package/.next/static/{WS8DHHp9haunZGhtE8L33 → q6yh3n8jgvyI9JIbexzuH}/_ssgManifest.js +0 -0
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=377,exports.ids=[377],exports.modules={15887:(a,b,c)=>{c.d(b,{X:()=>g});var d=c(2718),e=c(66773),f=c.n(e);function g({ariaLabel:a,activeTab:b,dashboardHref:c,prsHref:e,showOrchestrator:g=!0,orchestratorHref:h=null}){return(0,d.jsxs)("nav",{className:"mobile-bottom-nav","aria-label":a,children:[(0,d.jsxs)(f(),{href:c,className:"mobile-bottom-nav__item","data-active":"dashboard"===b?"true":"false","aria-current":"dashboard"===b?"page":void 0,children:[(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24","aria-hidden":"true",children:(0,d.jsx)("path",{d:"M3 13h8V3H3zm10 8h8V11h-8zM3 21h8v-6H3zm10-10h8V3h-8z"})}),(0,d.jsx)("span",{children:"Dashboard"})]}),(0,d.jsxs)(f(),{href:e,className:"mobile-bottom-nav__item","data-active":"prs"===b?"true":"false","aria-current":"prs"===b?"page":void 0,children:[(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24","aria-hidden":"true",children:(0,d.jsx)("path",{d:"M8 6h13M8 12h13M8 18h13M3 6h.01M3 12h.01M3 18h.01"})}),(0,d.jsx)("span",{children:"PRs"})]}),g?h?(0,d.jsxs)(f(),{href:h,className:"mobile-bottom-nav__item","data-active":"orchestrator"===b?"true":"false","aria-current":"orchestrator"===b?"page":void 0,children:[(0,d.jsxs)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,d.jsx)("path",{d:"M9 3H5a2 2 0 0 0-2 2v4m16 0V5a2 2 0 0 0-2-2h-4m0 18h4a2 2 0 0 0 2-2v-4M3 15v4a2 2 0 0 0 2 2h4"}),(0,d.jsx)("path",{d:"M9 9h6v6H9z"})]}),(0,d.jsx)("span",{children:"Orchestrator"})]}):(0,d.jsxs)("button",{type:"button",className:"mobile-bottom-nav__item",disabled:!0,children:[(0,d.jsxs)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,d.jsx)("path",{d:"M9 3H5a2 2 0 0 0-2 2v4m16 0V5a2 2 0 0 0-2-2h-4m0 18h4a2 2 0 0 0 2-2v-4M3 15v4a2 2 0 0 0 2 2h4"}),(0,d.jsx)("path",{d:"M9 9h6v6H9z"})]}),(0,d.jsx)("span",{children:"Orchestrator"})]}):null]})}},29547:(a,b,c)=>{c.d(b,{CM:()=>d.CM,QN:()=>g,Rt:()=>d.Rt,U1:()=>d.U1,fZ:()=>e,ng:()=>h,sZ:()=>f});var d=c(76105);function e(a){return a.mergeability.blockers.includes("API rate limited or unavailable")}function f(a){return!1===a.enriched}function g(a){return"open"===a.state&&a.mergeability.mergeable&&a.mergeability.ciPassing&&a.mergeability.approved&&a.mergeability.noConflicts}function h(a){if("merged"===a.status||"killed"===a.status||"cleanup"===a.status||"done"===a.status||"terminated"===a.status||a.pr&&("merged"===a.pr.state||"closed"===a.pr.state))return"done";if("mergeable"===a.status||"approved"===a.status||a.pr&&!f(a.pr)&&a.pr.mergeability.mergeable)return"merge";if(a.status===d.SB.ERRORED||a.status===d.SB.NEEDS_INPUT||a.status===d.SB.STUCK||a.activity===d.u3.WAITING_INPUT||a.activity===d.u3.BLOCKED||a.activity===d.u3.EXITED)return"respond";if("ci_failed"===a.status||"changes_requested"===a.status)return"review";if(a.pr&&!e(a.pr)&&!f(a.pr)){let b=a.pr;if(b.ciStatus===d.U1.FAILING||"changes_requested"===b.reviewDecision||!b.mergeability.noConflicts)return"review"}if("review_pending"===a.status)return"pending";if(a.pr&&!e(a.pr)&&!f(a.pr)){let b=a.pr;if(!b.isDraft&&b.unresolvedThreads>0||!b.isDraft&&("pending"===b.reviewDecision||"none"===b.reviewDecision))return"pending"}return"working"}},52730:(a,b,c)=>{c.d(b,{D:()=>e,U:()=>f});var d=c(89583);let e=767;function f(a){let[b,c]=(0,d.useState)(!1);return b}},67924:(a,b,c)=>{c.d(b,{wX:()=>f,zm:()=>i});var d=c(2718);let e={passing:{label:"CI passing",className:"bg-[rgba(63,185,80,0.1)] text-[var(--color-accent-green)]",icon:"✓"},failing:{label:"CI failing",className:"bg-[rgba(248,81,73,0.15)] text-[var(--color-accent-red)]",icon:"✗"},pending:{label:"CI pending",className:"bg-[rgba(210,153,34,0.1)] text-[var(--color-accent-yellow)]",icon:"●"},none:{label:"—",className:"text-[var(--color-text-muted)]",icon:""}};function f({status:a,checks:b,compact:c}){let f=e[a],g=b?.filter(a=>"failed"===a.status).length??0;if("none"===a)return(0,d.jsx)("span",{className:"text-xs text-[var(--color-text-muted)]",children:"—"});let h="failing"===a&&g>0?`${g} check${g>1?"s":""} failing`:f.label;return(0,d.jsxs)("span",{className:`inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[10px] font-semibold tracking-wide ${f.className}`,children:[!c&&(0,d.jsx)("span",{children:f.icon}),h]})}let g={passed:{icon:"✓",color:"var(--color-accent-green)"},failed:{icon:"✗",color:"var(--color-accent-red)"},running:{icon:"●",color:"var(--color-accent-yellow)"},pending:{icon:"○",color:"var(--color-text-muted)"},skipped:{icon:"○",color:"var(--color-text-muted)"}},h={failed:0,running:1,pending:2,passed:3,skipped:4};function i({checks:a,layout:b="vertical"}){let c=[...a].sort((a,b)=>h[a.status]-h[b.status]);return"inline"===b?(0,d.jsx)("div",{className:"flex flex-wrap items-center gap-x-3 gap-y-1",children:c.map(a=>{let{icon:b,color:c}=g[a.status],e=(0,d.jsxs)("span",{className:"inline-flex items-center gap-1 text-xs",children:[(0,d.jsx)("span",{style:{color:c},children:b}),(0,d.jsx)("span",{className:"text-[var(--color-text-secondary)]",children:a.name})]});return a.url?(0,d.jsx)("a",{href:a.url,target:"_blank",rel:"noopener noreferrer",className:"hover:no-underline",children:e},a.name):(0,d.jsx)("span",{children:e},a.name)})}):"expanded"===b?(0,d.jsx)("div",{className:"space-y-1",children:c.map(a=>{let{icon:b,color:c}=g[a.status],e=(0,d.jsxs)("span",{className:"inline-flex items-center gap-1 text-xs",children:[(0,d.jsx)("span",{style:{color:c},children:b}),(0,d.jsx)("span",{className:"text-[var(--color-text-secondary)]",children:a.name})]});return(0,d.jsxs)("div",{className:"flex items-center gap-2",children:[a.url?(0,d.jsx)("a",{href:a.url,target:"_blank",rel:"noopener noreferrer",className:"hover:no-underline",children:e}):e,a.url&&(0,d.jsx)("a",{href:a.url,target:"_blank",rel:"noopener noreferrer",className:"text-[11px] text-[var(--color-accent-blue)] hover:underline",children:"view"})]},a.name)})}):(0,d.jsx)("div",{className:"space-y-1",children:c.map(a=>{let{icon:b,color:c}=g[a.status];return(0,d.jsxs)("div",{className:"flex items-center gap-2 text-xs",children:[(0,d.jsx)("span",{style:{color:c},className:"w-3.5 shrink-0 text-center",children:b}),(0,d.jsx)("span",{className:"min-w-0 flex-1 truncate text-[var(--color-text-secondary)]",children:a.name}),a.url&&(0,d.jsx)("a",{href:a.url,target:"_blank",rel:"noopener noreferrer",className:"shrink-0 text-[11px] text-[var(--color-accent-blue)] hover:underline",children:"view"})]},a.name)})})}},76105:(a,b,c)=>{c.d(b,{CM:()=>f,Rt:()=>g,SB:()=>e,U1:()=>i,tT:()=>h,u3:()=>d});let d={ACTIVE:"active",READY:"ready",IDLE:"idle",WAITING_INPUT:"waiting_input",BLOCKED:"blocked",EXITED:"exited"},e={SPAWNING:"spawning",WORKING:"working",PR_OPEN:"pr_open",CI_FAILED:"ci_failed",REVIEW_PENDING:"review_pending",CHANGES_REQUESTED:"changes_requested",APPROVED:"approved",MERGEABLE:"mergeable",MERGED:"merged",CLEANUP:"cleanup",NEEDS_INPUT:"needs_input",STUCK:"stuck",ERRORED:"errored",IDLE:"idle",KILLED:"killed",DONE:"done",TERMINATED:"terminated"},f=new Set(["killed","terminated","done","cleanup","errored","merged"]),g=new Set(["exited"]);function h(a,b,c){if(a.metadata?.role==="orchestrator"||a.id.endsWith("-orchestrator"))return!0;if(!b)return!1;let d=b.replace(/[.*+?^${}()|[\]\\]/g,"\\$&");if(!RegExp(`^${d}-orchestrator-\\d+$`).test(a.id))return!1;if(c){for(let d of c)if(d!==b&&RegExp(`^${d.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}-\\d+$`).test(a.id))return!1}return!0}let i={PENDING:"pending",PASSING:"passing",FAILING:"failing",NONE:"none"}},81609:(a,b,c)=>{c.d(b,{cn:()=>d});function d(...a){return a.filter(Boolean).join(" ")}},95739:(a,b,c)=>{c.d(b,{P:()=>d});function d(a){if(a.pr?.title)return a.pr.title;if(a.issueTitle)return a.issueTitle;if(a.branch)return a.branch.replace(/^(?:feat|fix|chore|refactor|docs|test|ci|session|release|hotfix|feature|bugfix|build|wip|improvement)\//,"").replace(/[-_]/g," ").replace(/\b\w/g,a=>a.toUpperCase()).trim();let b=a.metadata.pinnedSummary;return b||(a.summary&&!a.summaryIsFallback||a.summary?a.summary:a.status)}}};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
exports.id=393,exports.ids=[393],exports.modules={4324:(a,b,c)=>{Promise.resolve().then(c.bind(c,53545))},5401:(a,b,c)=>{"use strict";function d(){return null}c.d(b,{ServiceWorkerRegistrar:()=>d}),c(89583)},5715:(a,b,c)=>{Promise.resolve().then(c.bind(c,77688))},9584:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f});var d=c(69440),e=c(73007);function f(){return(0,d.jsx)(e.ErrorDisplay,{title:"Page not found",message:"This route does not exist in the dashboard. Return to the main view to pick an active project or session.",tone:"not-found",primaryAction:{label:"Back to dashboard",href:"/"}})}},15572:(a,b,c)=>{Promise.resolve().then(c.bind(c,3018)),Promise.resolve().then(c.bind(c,72547))},16348:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>n,generateMetadata:()=>m,viewport:()=>l});var d=c(69440),e=c(21949),f=c.n(e),g=c(45584),h=c.n(g),i=c(3018),j=c(64277),k=c(72547);c(33977);let l={width:"device-width",initialScale:1,viewportFit:"cover",themeColor:[{media:"(prefers-color-scheme: light)",color:"#ffffff"},{media:"(prefers-color-scheme: dark)",color:"#0a0d12"}]};async function m(){let a=(0,j.P_)();return{title:{template:`%s | ${a}`,default:`ao | ${a}`},description:"Dashboard for managing parallel AI coding agents",appleWebApp:{capable:!0,statusBarStyle:"black-translucent",title:`ao | ${a}`}}}function n({children:a}){return(0,d.jsx)("html",{lang:"en",className:`dark ${f().variable} ${h().variable}`,suppressHydrationWarning:!0,children:(0,d.jsxs)("body",{className:"bg-[var(--color-bg-base)] text-[var(--color-text-primary)] antialiased",children:[(0,d.jsx)(i.ThemeProvider,{attribute:"class",defaultTheme:"dark",enableSystem:!1,children:a}),(0,d.jsx)(k.ServiceWorkerRegistrar,{})]})})}},20516:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,87617,23)),Promise.resolve().then(c.t.bind(c,15705,23)),Promise.resolve().then(c.t.bind(c,25312,23)),Promise.resolve().then(c.t.bind(c,45536,23)),Promise.resolve().then(c.t.bind(c,95796,23)),Promise.resolve().then(c.t.bind(c,15044,23)),Promise.resolve().then(c.t.bind(c,77045,23)),Promise.resolve().then(c.bind(c,50244))},33977:()=>{},35831:(a,b,c)=>{Promise.resolve().then(c.bind(c,69324))},36330:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(63332).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/private/tmp/agent-orchestrator/packages/web/src/app/global-error.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/private/tmp/agent-orchestrator/packages/web/src/app/global-error.tsx","default")},52392:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>e});var d=c(69440);function e(){return(0,d.jsx)("div",{className:"flex min-h-screen items-center justify-center bg-[var(--color-bg-base)]",children:(0,d.jsxs)("div",{className:"flex flex-col items-center gap-3",children:[(0,d.jsx)("svg",{className:"h-5 w-5 animate-spin text-[var(--color-text-tertiary)]",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:(0,d.jsx)("path",{d:"M12 3a9 9 0 1 0 9 9"})}),(0,d.jsx)("p",{className:"text-[13px] text-[var(--color-text-tertiary)]",children:"Loading…"})]})})}},52571:(a,b,c)=>{Promise.resolve().then(c.bind(c,36330))},53545:(a,b,c)=>{"use strict";c.d(b,{ErrorDisplay:()=>j});var d=c(2718),e=c(66773),f=c.n(e);let g={error:{accent:"var(--color-status-error)",bg:"var(--color-tint-red)",border:"color-mix(in srgb, var(--color-status-error) 24%, transparent)",label:"error"},warning:{accent:"var(--color-status-attention)",bg:"var(--color-tint-yellow)",border:"color-mix(in srgb, var(--color-status-attention) 24%, transparent)",label:"warning"},"not-found":{accent:"var(--color-accent)",bg:"var(--color-tint-blue)",border:"color-mix(in srgb, var(--color-accent) 24%, transparent)",label:"missing"}};function h({accent:a}){return(0,d.jsx)("div",{className:"flex h-14 w-14 items-center justify-center rounded-2xl border",style:{background:`linear-gradient(180deg, color-mix(in srgb, ${a} 16%, var(--color-bg-elevated)) 0%, var(--color-bg-surface) 100%)`,borderColor:`color-mix(in srgb, ${a} 18%, var(--color-border-default))`,boxShadow:"var(--detail-card-shadow)"},children:(0,d.jsxs)("svg",{className:"h-7 w-7",fill:"none",stroke:"currentColor",strokeWidth:"1.6",style:{color:a},viewBox:"0 0 24 24",children:[(0,d.jsx)("rect",{x:"2.5",y:"4.5",width:"19",height:"15",rx:"3"}),(0,d.jsx)("path",{d:"M6.5 9.5l3.25 2.5-3.25 2.5M12.75 15h4.75"})]})})}function i({action:a,primary:b=!1}){let c=b?"inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-semibold transition-colors hover:no-underline":"inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-medium transition-colors hover:no-underline",e=b?{background:"var(--color-accent)",color:"var(--color-text-inverse)",borderColor:"color-mix(in srgb, var(--color-accent) 72%, transparent)"}:{background:"var(--color-bg-surface)",color:"var(--color-text-secondary)",borderColor:"var(--color-border-default)"};return a.href?(0,d.jsx)(f(),{href:a.href,className:c,style:e,children:a.label}):(0,d.jsx)("button",{type:"button",onClick:a.onClick,className:c,style:e,children:a.label})}function j({title:a,message:b,tone:c="error",detailsTitle:e="Technical details",error:f,primaryAction:j,secondaryAction:k,compact:l=!1,chrome:m="page",children:n}){let o=g[c],p=!!(f?.digest||f?.message||f?.stack);return(0,d.jsx)("div",{className:`flex w-full items-center justify-center px-6 py-10 ${l?"min-h-[calc(100vh-4rem)]":"min-h-screen"}`,style:{background:"page"===m?"radial-gradient(circle at top, var(--color-body-gradient-blue), transparent 35%), var(--color-bg-base)":"transparent"},children:(0,d.jsx)("div",{className:"w-full max-w-[36rem] rounded-[28px] border p-6 sm:p-8",style:{background:"linear-gradient(180deg, color-mix(in srgb, var(--color-bg-elevated) 88%, transparent) 0%, var(--color-bg-surface) 100%)",borderColor:"var(--color-border-default)",boxShadow:"var(--detail-card-shadow)"},children:(0,d.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start",children:[(0,d.jsx)(h,{accent:o.accent}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,d.jsx)("div",{className:"mb-3 inline-flex items-center rounded-full border px-2.5 py-1 font-[var(--font-mono)] text-[10px] font-medium uppercase tracking-[0.22em]",style:{color:o.accent,background:o.bg,borderColor:o.border},children:o.label}),(0,d.jsx)("h1",{className:"text-[24px] font-semibold tracking-[-0.04em] text-[var(--color-text-primary)]",children:a}),(0,d.jsx)("p",{className:"mt-2 max-w-[34rem] text-[14px] leading-6 text-[var(--color-text-secondary)]",children:b})]})]}),(j||k)&&(0,d.jsxs)("div",{className:"flex flex-wrap gap-3",children:[j?(0,d.jsx)(i,{action:j,primary:!0}):null,k?(0,d.jsx)(i,{action:k}):null]}),n,p?(0,d.jsxs)("details",{className:"rounded-2xl border",style:{background:"color-mix(in srgb, var(--color-bg-elevated) 84%, transparent)",borderColor:"var(--color-border-subtle)"},children:[(0,d.jsx)("summary",{className:"cursor-pointer list-none px-4 py-3 text-[12px] font-medium text-[var(--color-text-secondary)]",children:e}),(0,d.jsxs)("div",{className:"border-t px-4 py-4",style:{borderColor:"var(--color-border-subtle)"},children:[f?.digest?(0,d.jsxs)("p",{className:"mb-3 font-[var(--font-mono)] text-[11px] text-[var(--color-text-tertiary)]",children:["digest: ",f.digest]}):null,f?.message?(0,d.jsx)("p",{className:"mb-3 text-[12px] leading-5 text-[var(--color-text-secondary)]",children:f.message}):null,f?.stack?(0,d.jsx)("pre",{className:"overflow-x-auto whitespace-pre-wrap font-[var(--font-mono)] text-[11px] leading-5 text-[var(--color-text-tertiary)]",children:f.stack}):null]})]}):null]})})})}},53829:(a,b,c)=>{"use strict";c.d(b,{Kk:()=>f,uy:()=>e});var d=c(69440);function e(a){return a.replace(/[^\w\s-]/g,"").slice(0,50)||"AO"}function f(a,b){let c=(b.charAt(0)||"A").toUpperCase(),e=function(a){let b=0;for(let c=0;c<a.length;c++)b=a.charCodeAt(c)+((b<<5)-b);return(b%360+360)%360}(b),f=Math.round(.19*a),g=Math.round(.625*a);return(0,d.jsx)("div",{style:{width:`${a}px`,height:`${a}px`,borderRadius:`${f}px`,background:`hsl(${e}, 60%, 45%)`,display:"flex",alignItems:"center",justifyContent:"center",color:"white",fontSize:`${g}px`,fontWeight:700,fontFamily:"sans-serif"},children:c})}},64277:(a,b,c)=>{"use strict";c.d(b,{Bq:()=>g,P_:()=>f,cf:()=>h});var d=c(34657),e=c(18699);let f=(0,d.cache)(()=>{try{let a=(0,e.Z9)(),b=Object.keys(a.projects)[0];if(b)return(a.projects[b].name??b)||b||"ao"}catch{}return"ao"}),g=(0,d.cache)(()=>{try{let a=(0,e.Z9)(),b=Object.keys(a.projects)[0];if(b)return b}catch{}return"ao"}),h=(0,d.cache)(()=>{try{let a=(0,e.Z9)();return Object.entries(a.projects).map(([a,b])=>({id:a,name:b.name??a,sessionPrefix:b.sessionPrefix??a}))}catch{return[]}})},69324:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>g});var d=c(2718),e=c(38552);c(89583);var f=c(53545);function g({error:a,reset:b}){let c=(0,e.useRouter)();return(0,d.jsx)(f.ErrorDisplay,{title:"Something went wrong",message:"The dashboard hit an unexpected error. Try reloading the route data or head back to the main dashboard.",tone:"warning",primaryAction:{label:"Try again",onClick:()=>{b(),c.refresh()}},secondaryAction:{label:"Back to dashboard",href:"/"},error:a,compact:!0,chrome:"card"})}},72547:(a,b,c)=>{"use strict";c.d(b,{ServiceWorkerRegistrar:()=>d});let d=(0,c(63332).registerClientReference)(function(){throw Error("Attempted to call ServiceWorkerRegistrar() from the server but ServiceWorkerRegistrar is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/private/tmp/agent-orchestrator/packages/web/src/components/ServiceWorkerRegistrar.tsx","ServiceWorkerRegistrar")},73007:(a,b,c)=>{"use strict";c.d(b,{ErrorDisplay:()=>d});let d=(0,c(63332).registerClientReference)(function(){throw Error("Attempted to call ErrorDisplay() from the server but ErrorDisplay is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/private/tmp/agent-orchestrator/packages/web/src/components/ErrorDisplay.tsx","ErrorDisplay")},77688:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f});var d=c(2718);c(89583);var e=c(53545);function f({error:a,reset:b}){return(0,d.jsx)("html",{lang:"en",className:"dark",children:(0,d.jsx)("body",{className:"bg-[var(--color-bg-base)] text-[var(--color-text-primary)] antialiased",children:(0,d.jsx)(e.ErrorDisplay,{title:"Something broke at the app shell",message:"The dashboard could not recover from this error at the layout level. Try again first, then reload the page if it still fails.",tone:"error",primaryAction:{label:"Try again",onClick:b},secondaryAction:{label:"Reload page",onClick:()=>window.location.reload()},error:a})})})}},87954:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f}),c(64277),c(53829);var d=c(29393);let e={size:{width:180,height:180},contentType:"image/png"};async function f(a){let{__metadata_id__:b,...c}=await a.params,f=(0,d.fillMetadataSegment)(".",c,"apple-icon"),{generateImageMetadata:g}=e;function h(a,b){let c={alt:a.alt,type:a.contentType||"image/png",url:f+(b?"/"+b:"")+"?95aeb60ec7acf330"},{size:d}=a;return d&&(c.sizes=d.width+"x"+d.height),c}return g?(await g({params:c})).map((a,b)=>{let c=(a.id||b)+"";return h(a,c)}):[h(e,"")]}},90660:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,68151,23)),Promise.resolve().then(c.t.bind(c,95611,23)),Promise.resolve().then(c.t.bind(c,73806,23)),Promise.resolve().then(c.t.bind(c,15754,23)),Promise.resolve().then(c.t.bind(c,74286,23)),Promise.resolve().then(c.t.bind(c,95822,23)),Promise.resolve().then(c.t.bind(c,5035,23)),Promise.resolve().then(c.t.bind(c,25742,23))},91604:(a,b,c)=>{Promise.resolve().then(c.bind(c,18248)),Promise.resolve().then(c.bind(c,5401))},94975:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f}),c(64277),c(53829);var d=c(29393);let e={size:{width:32,height:32},contentType:"image/png"};async function f(a){let{__metadata_id__:b,...c}=await a.params,f=(0,d.fillMetadataSegment)(".",c,"icon"),{generateImageMetadata:g}=e;function h(a,b){let c={alt:a.alt,type:a.contentType||"image/png",url:f+(b?"/"+b:"")+"?fde4afff4688df3a"},{size:d}=a;return d&&(c.sizes=d.width+"x"+d.height),c}return g?(await g({params:c})).map((a,b)=>{let c=(a.id||b)+"";return h(a,c)}):[h(e,"")]}},96086:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(63332).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/private/tmp/agent-orchestrator/packages/web/src/app/error.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/private/tmp/agent-orchestrator/packages/web/src/app/error.tsx","default")},96708:(a,b,c)=>{Promise.resolve().then(c.bind(c,73007))},98879:(a,b,c)=>{Promise.resolve().then(c.bind(c,96086))}};
|
|
@@ -1,391 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=627,exports.ids=[627],exports.modules={78627:(a,b,c)=>{c.d(b,{ix:()=>aK,wp:()=>aM,Z1:()=>aB,uj:()=>aL,Az:()=>aF});var d=c(18699),e=c(31421),f=c(57975),g=c(58500),h=c(77598),i=c(73024),j=c(48161),k=c(76760);let l=(0,f.promisify)(e.execFile),m=/^[a-zA-Z0-9_-]+$/;async function n(...a){let{stdout:b}=await l("tmux",a,{timeout:5e3});return b.trimEnd()}let o={manifest:{name:"tmux",slot:"runtime",description:"Runtime plugin: tmux sessions",version:"0.1.0"},create:function(){return{name:"tmux",async create(a){var b=a.sessionId;if(!m.test(b))throw Error(`Invalid session ID "${b}": must match ${m}`);let c=a.sessionId,e=[];for(let[b,c]of Object.entries(a.environment??{}))e.push("-e",`${b}=${c}`);await n("new-session","-d","-s",c,"-c",a.workspacePath,...e);try{if(a.launchCommand.length>200){let b=function(a){let b=(0,k.join)((0,j.tmpdir)(),`ao-launch-${(0,h.randomUUID)()}.sh`),c=`#!/usr/bin/env bash
|
|
2
|
-
rm -- "$0" 2>/dev/null || true
|
|
3
|
-
${a}
|
|
4
|
-
`;return(0,i.writeFileSync)(b,c,{encoding:"utf-8",mode:448}),`bash ${(0,d.TQ)(b)}`}(a.launchCommand);await n("send-keys","-t",c,"-l",b),await (0,g.setTimeout)(300),await n("send-keys","-t",c,"Enter")}else await n("send-keys","-t",c,a.launchCommand,"Enter")}catch(b){try{await n("kill-session","-t",c)}catch{}let a=b instanceof Error?b.message:String(b);throw Error(`Failed to send launch command to session "${c}": ${a}`,{cause:b})}return{id:c,runtimeName:"tmux",data:{createdAt:Date.now(),workspacePath:a.workspacePath}}},async destroy(a){try{await n("kill-session","-t",a.id)}catch{}},async sendMessage(a,b){if(await n("send-keys","-t",a.id,"C-u"),b.includes("\n")||b.length>200){let c=`ao-${(0,h.randomUUID)()}`,d=(0,k.join)((0,j.tmpdir)(),`ao-send-${(0,h.randomUUID)()}.txt`);(0,i.writeFileSync)(d,b,{encoding:"utf-8",mode:384});try{await n("load-buffer","-b",c,d),await n("paste-buffer","-b",c,"-t",a.id,"-d")}finally{try{(0,i.unlinkSync)(d)}catch{}try{await n("delete-buffer","-b",c)}catch{}}}else await n("send-keys","-t",a.id,"-l",b);await (0,g.setTimeout)(300),await n("send-keys","-t",a.id,"Enter")},async getOutput(a,b=50){try{return await n("capture-pane","-t",a.id,"-p","-S",`-${b}`)}catch{return""}},async isAlive(a){try{return await n("has-session","-t",a.id),!0}catch{return!1}},async getMetrics(a){let b=a.data.createdAt??Date.now();return{uptimeMs:Date.now()-b}},getAttachInfo:async a=>({type:"tmux",target:a.id,command:`tmux attach -t ${a.id}`})}}};var p=c(51455);let q=(0,f.promisify)(e.execFile),r=`#!/usr/bin/env bash
|
|
5
|
-
# Metadata Updater Hook for Agent Orchestrator
|
|
6
|
-
#
|
|
7
|
-
# This PostToolUse hook automatically updates session metadata when:
|
|
8
|
-
# - gh pr create: extracts PR URL and writes to metadata
|
|
9
|
-
# - git checkout -b / git switch -c: extracts branch name and writes to metadata
|
|
10
|
-
# - gh pr merge: updates status to "merged"
|
|
11
|
-
|
|
12
|
-
set -euo pipefail
|
|
13
|
-
|
|
14
|
-
# Configuration
|
|
15
|
-
AO_DATA_DIR="\${AO_DATA_DIR:-$HOME/.ao-sessions}"
|
|
16
|
-
|
|
17
|
-
# Read hook input from stdin
|
|
18
|
-
input=$(cat)
|
|
19
|
-
|
|
20
|
-
# Extract fields from JSON (using jq if available, otherwise basic parsing)
|
|
21
|
-
if command -v jq &>/dev/null; then
|
|
22
|
-
tool_name=$(echo "$input" | jq -r '.tool_name // empty')
|
|
23
|
-
command=$(echo "$input" | jq -r '.tool_input.command // empty')
|
|
24
|
-
output=$(echo "$input" | jq -r '.tool_response // empty')
|
|
25
|
-
exit_code=$(echo "$input" | jq -r '.exit_code // 0')
|
|
26
|
-
else
|
|
27
|
-
# Fallback: basic JSON parsing without jq
|
|
28
|
-
tool_name=$(echo "$input" | grep -o '"tool_name"[[:space:]]*:[[:space:]]*"[^"]*"' | cut -d'"' -f4 || echo "")
|
|
29
|
-
command=$(echo "$input" | grep -o '"command"[[:space:]]*:[[:space:]]*"[^"]*"' | cut -d'"' -f4 || echo "")
|
|
30
|
-
output=$(echo "$input" | grep -o '"tool_response"[[:space:]]*:[[:space:]]*"[^"]*"' | cut -d'"' -f4 || echo "")
|
|
31
|
-
exit_code=$(echo "$input" | grep -o '"exit_code"[[:space:]]*:[[:space:]]*[0-9]*' | grep -o '[0-9]*$' || echo "0")
|
|
32
|
-
fi
|
|
33
|
-
|
|
34
|
-
# Only process successful commands (exit code 0)
|
|
35
|
-
if [[ "$exit_code" -ne 0 ]]; then
|
|
36
|
-
echo '{}'
|
|
37
|
-
exit 0
|
|
38
|
-
fi
|
|
39
|
-
|
|
40
|
-
# Only process Bash tool calls
|
|
41
|
-
if [[ "$tool_name" != "Bash" ]]; then
|
|
42
|
-
echo '{}' # Empty JSON output
|
|
43
|
-
exit 0
|
|
44
|
-
fi
|
|
45
|
-
|
|
46
|
-
# Validate AO_SESSION is set
|
|
47
|
-
if [[ -z "\${AO_SESSION:-}" ]]; then
|
|
48
|
-
echo '{"systemMessage": "AO_SESSION environment variable not set, skipping metadata update"}'
|
|
49
|
-
exit 0
|
|
50
|
-
fi
|
|
51
|
-
|
|
52
|
-
# Construct metadata file path
|
|
53
|
-
# AO_DATA_DIR is already set to the project-specific sessions directory
|
|
54
|
-
metadata_file="$AO_DATA_DIR/$AO_SESSION"
|
|
55
|
-
|
|
56
|
-
# Ensure metadata file exists
|
|
57
|
-
if [[ ! -f "$metadata_file" ]]; then
|
|
58
|
-
echo '{"systemMessage": "Metadata file not found: '"$metadata_file"'"}'
|
|
59
|
-
exit 0
|
|
60
|
-
fi
|
|
61
|
-
|
|
62
|
-
# Update a single key in metadata
|
|
63
|
-
update_metadata_key() {
|
|
64
|
-
local key="$1"
|
|
65
|
-
local value="$2"
|
|
66
|
-
|
|
67
|
-
# Create temp file
|
|
68
|
-
local temp_file="\${metadata_file}.tmp"
|
|
69
|
-
|
|
70
|
-
# Escape special sed characters in value (& | / \\)
|
|
71
|
-
local escaped_value=$(echo "$value" | sed 's/[&|\\/]/\\\\&/g')
|
|
72
|
-
|
|
73
|
-
# Check if key already exists
|
|
74
|
-
if grep -q "^$key=" "$metadata_file" 2>/dev/null; then
|
|
75
|
-
# Update existing key
|
|
76
|
-
sed "s|^$key=.*|$key=$escaped_value|" "$metadata_file" > "$temp_file"
|
|
77
|
-
else
|
|
78
|
-
# Append new key
|
|
79
|
-
cp "$metadata_file" "$temp_file"
|
|
80
|
-
echo "$key=$value" >> "$temp_file"
|
|
81
|
-
fi
|
|
82
|
-
|
|
83
|
-
# Atomic replace
|
|
84
|
-
mv "$temp_file" "$metadata_file"
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
# ============================================================================
|
|
88
|
-
# Command Detection and Parsing
|
|
89
|
-
# ============================================================================
|
|
90
|
-
|
|
91
|
-
# Strip leading directory-change prefixes so that commands like
|
|
92
|
-
# cd ~/.worktrees/project && gh pr create ...
|
|
93
|
-
# are correctly detected. Agents frequently cd into a worktree first.
|
|
94
|
-
# Store the regex pattern in a variable for clarity (avoids shell quoting confusion).
|
|
95
|
-
# Uses space-padded (&&|;) to avoid breaking on paths containing & or ; chars.
|
|
96
|
-
cd_prefix_pattern='^[[:space:]]*cd[[:space:]]+.*[[:space:]]+(&&|;)[[:space:]]+(.*)'
|
|
97
|
-
clean_command="$command"
|
|
98
|
-
while [[ "$clean_command" =~ ^[[:space:]]*cd[[:space:]] ]]; do
|
|
99
|
-
if [[ "$clean_command" =~ $cd_prefix_pattern ]]; then
|
|
100
|
-
clean_command="\${BASH_REMATCH[2]}"
|
|
101
|
-
else
|
|
102
|
-
break
|
|
103
|
-
fi
|
|
104
|
-
done
|
|
105
|
-
|
|
106
|
-
# Detect: gh pr create
|
|
107
|
-
if [[ "$clean_command" =~ ^gh[[:space:]]+pr[[:space:]]+create ]]; then
|
|
108
|
-
# Extract PR URL from output
|
|
109
|
-
pr_url=$(echo "$output" | grep -Eo 'https://github[.]com/[^/]+/[^/]+/pull/[0-9]+' | head -1)
|
|
110
|
-
|
|
111
|
-
if [[ -n "$pr_url" ]]; then
|
|
112
|
-
update_metadata_key "pr" "$pr_url"
|
|
113
|
-
update_metadata_key "status" "pr_open"
|
|
114
|
-
echo '{"systemMessage": "Updated metadata: PR created at '"$pr_url"'"}'
|
|
115
|
-
exit 0
|
|
116
|
-
fi
|
|
117
|
-
fi
|
|
118
|
-
|
|
119
|
-
# Detect: git checkout -b <branch> or git switch -c <branch>
|
|
120
|
-
if [[ "$clean_command" =~ ^git[[:space:]]+checkout[[:space:]]+-b[[:space:]]+([^[:space:]]+) ]] || \\
|
|
121
|
-
[[ "$clean_command" =~ ^git[[:space:]]+switch[[:space:]]+-c[[:space:]]+([^[:space:]]+) ]]; then
|
|
122
|
-
branch="\${BASH_REMATCH[1]}"
|
|
123
|
-
|
|
124
|
-
if [[ -n "$branch" ]]; then
|
|
125
|
-
update_metadata_key "branch" "$branch"
|
|
126
|
-
echo '{"systemMessage": "Updated metadata: branch = '"$branch"'"}'
|
|
127
|
-
exit 0
|
|
128
|
-
fi
|
|
129
|
-
fi
|
|
130
|
-
|
|
131
|
-
# Detect: git checkout <branch> (without -b) or git switch <branch> (without -c)
|
|
132
|
-
# Only update if the branch name looks like a feature branch (contains / or -)
|
|
133
|
-
if [[ "$clean_command" =~ ^git[[:space:]]+checkout[[:space:]]+([^[:space:]-]+[/-][^[:space:]]+) ]] || \\
|
|
134
|
-
[[ "$clean_command" =~ ^git[[:space:]]+switch[[:space:]]+([^[:space:]-]+[/-][^[:space:]]+) ]]; then
|
|
135
|
-
branch="\${BASH_REMATCH[1]}"
|
|
136
|
-
|
|
137
|
-
# Avoid updating for checkout of commits/tags
|
|
138
|
-
if [[ -n "$branch" && "$branch" != "HEAD" ]]; then
|
|
139
|
-
update_metadata_key "branch" "$branch"
|
|
140
|
-
echo '{"systemMessage": "Updated metadata: branch = '"$branch"'"}'
|
|
141
|
-
exit 0
|
|
142
|
-
fi
|
|
143
|
-
fi
|
|
144
|
-
|
|
145
|
-
# Detect: gh pr merge
|
|
146
|
-
if [[ "$clean_command" =~ ^gh[[:space:]]+pr[[:space:]]+merge ]]; then
|
|
147
|
-
update_metadata_key "status" "merged"
|
|
148
|
-
echo '{"systemMessage": "Updated metadata: status = merged"}'
|
|
149
|
-
exit 0
|
|
150
|
-
fi
|
|
151
|
-
|
|
152
|
-
# No matching command, exit silently
|
|
153
|
-
echo '{}'
|
|
154
|
-
exit 0
|
|
155
|
-
`;function s(a){return a.replace(/\\/g,"/").replace(/:/g,"").replace(/[/.]/g,"-")}async function t(a){let b;try{b=await (0,p.readdir)(a)}catch{return null}let c=b.filter(a=>a.endsWith(".jsonl")&&!a.startsWith("agent-"));if(0===c.length)return null;let d=await Promise.all(c.map(async b=>{let c=(0,k.join)(a,b);try{let a=await (0,p.stat)(c);return{path:c,mtime:a.mtimeMs}}catch{return{path:c,mtime:0}}}));return d.sort((a,b)=>b.mtime-a.mtime),d[0]?.path??null}async function u(a,b=131072){let c,d;try{let{size:e=0}=await (0,p.stat)(a);if(d=Math.max(0,e-b),0===d)c=await (0,p.readFile)(a,"utf-8");else{let b=await (0,p.open)(a,"r");try{let a=e-d,f=Buffer.allocUnsafe(a);await b.read(f,0,a,d),c=f.toString("utf-8")}finally{await b.close()}}}catch{return[]}let e=c.indexOf("\n"),f=d>0&&e>=0?c.slice(e+1):c,g=[];for(let a of f.split("\n")){let b=a.trim();if(b)try{let a=JSON.parse(b);"object"!=typeof a||null===a||Array.isArray(a)||g.push(a)}catch{}}return g}let v=null;async function w(){let a=Date.now();if(v&&a-v.timestamp<5e3)return v.promise?v.promise:v.output;let b=q("ps",["-eo","pid,tty,args"],{timeout:5e3}).then(({stdout:a})=>(v?.promise===b&&(v={output:a,timestamp:Date.now()}),a));v={output:"",timestamp:a,promise:b};try{return await b}catch{return v?.promise===b&&(v=null),""}}async function x(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await q("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:5e3}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return null;let d=await w();if(!d)return null;let e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)claude(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return parseInt(b[0]??"0",10)}return null}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),c}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return c}return null}catch{return null}}async function y(a,b){let c=(0,k.join)(a,".claude"),d=(0,k.join)(c,"settings.json"),e=(0,k.join)(c,"metadata-updater.sh");try{await (0,p.mkdir)(c,{recursive:!0})}catch{}await (0,p.writeFile)(e,r,"utf-8"),await (0,p.chmod)(e,493);let f={};if((0,i.existsSync)(d))try{let a=await (0,p.readFile)(d,"utf-8");f=JSON.parse(a)}catch{}let g=f.hooks??{},h=g.PostToolUse??[],j=-1,l=-1;for(let a=0;a<h.length;a++){let b=h[a];if("object"!=typeof b||null===b||Array.isArray(b))continue;let c=b.hooks;if(Array.isArray(c)){for(let b=0;b<c.length;b++){let d=c[b];if(!("object"!=typeof d||null===d||Array.isArray(d))&&"string"==typeof d.command&&d.command.includes("metadata-updater.sh")){j=a,l=b;break}}if(j>=0)break}}-1===j?h.push({matcher:"Bash",hooks:[{type:"command",command:b,timeout:5e3}]}):h[j].hooks[l].command=b,g.PostToolUse=h,f.hooks=g,await (0,p.writeFile)(d,JSON.stringify(f,null,2)+"\n","utf-8")}let z={manifest:{name:"claude-code",slot:"agent",description:"Agent plugin: Claude Code CLI",version:"0.1.0",displayName:"Claude Code"},create:function(){return{name:"claude-code",processName:"claude",promptDelivery:"post-launch",getLaunchCommand(a){let b=["claude"],c=(0,d.DD)(a.permissions);return("permissionless"===c||"auto-edit"===c)&&b.push("--dangerously-skip-permissions"),a.model&&b.push("--model",(0,d.TQ)(a.model)),a.systemPromptFile?b.push("--append-system-prompt",`"$(cat ${(0,d.TQ)(a.systemPromptFile)})"`):a.systemPrompt&&b.push("--append-system-prompt",(0,d.TQ)(a.systemPrompt)),b.join(" ")},getEnvironment(a){let b={};return b.CLAUDECODE="",b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b},detectActivity:a=>(function(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[❯>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/Do you want to proceed\?/i.test(d)||/\(Y\)es.*\(N\)o/i.test(d)||/bypass.*permissions/i.test(d)?"waiting_input":"active"})(a),isProcessRunning:async a=>null!==await x(a),async getActivityState(a,b){let c=b??d.PE,e=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:e};if(!a.workspacePath)return null;let f=s(a.workspacePath),g=(0,k.join)((0,j.homedir)(),".claude","projects",f),h=await t(g);if(!h)return{state:"idle",timestamp:a.createdAt};let i=await (0,d.XI)(h);if(!i)return null;let l=Date.now()-i.modifiedAt.getTime(),m=i.modifiedAt,n=Math.min(d.V1,c);switch(i.lastType){case"user":case"tool_use":case"progress":default:if(l<=n)return{state:"active",timestamp:m};return{state:l>c?"idle":"ready",timestamp:m};case"assistant":case"system":case"summary":case"result":return{state:l>c?"idle":"ready",timestamp:m};case"permission_request":return{state:"waiting_input",timestamp:m};case"error":return{state:"blocked",timestamp:m}}},async getSessionInfo(a){if(!a.workspacePath)return null;let b=s(a.workspacePath),c=(0,k.join)((0,j.homedir)(),".claude","projects",b),d=await t(c);if(!d)return null;let e=await u(d);if(0===e.length)return null;let f=(0,k.basename)(d,".jsonl"),g=function(a){for(let b=a.length-1;b>=0;b--){let c=a[b];if(c?.type==="summary"&&c.summary)return{summary:c.summary,isFallback:!1}}for(let b of a)if(b?.type==="user"&&b.message?.content&&"string"==typeof b.message.content){let a=b.message.content.trim();if(a.length>0)return{summary:a.length>120?a.substring(0,120)+"...":a,isFallback:!0}}return null}(e);return{summary:g?.summary??null,summaryIsFallback:g?.isFallback,agentSessionId:f,cost:function(a){let b=0,c=0,d=0;for(let e of a)"number"==typeof e.costUSD?d+=e.costUSD:"number"==typeof e.estimatedCostUsd&&(d+=e.estimatedCostUsd),e.usage?(b+=e.usage.input_tokens??0,b+=e.usage.cache_read_input_tokens??0,b+=e.usage.cache_creation_input_tokens??0,c+=e.usage.output_tokens??0):("number"==typeof e.inputTokens&&(b+=e.inputTokens),"number"==typeof e.outputTokens&&(c+=e.outputTokens));if(0!==b||0!==c||0!==d)return 0===d&&(b>0||c>0)&&(d=b/1e6*3+c/1e6*15),{inputTokens:b,outputTokens:c,estimatedCostUsd:d}}(e)}},async getRestoreCommand(a,b){if(!a.workspacePath)return null;let c=s(a.workspacePath),e=(0,k.join)((0,j.homedir)(),".claude","projects",c),f=await t(e);if(!f)return null;let g=(0,k.basename)(f,".jsonl");if(!g)return null;let h=["claude","--resume",(0,d.TQ)(g)],i=(0,d.DD)(b.agentConfig?.permissions);return("permissionless"===i||"auto-edit"===i)&&h.push("--dangerously-skip-permissions"),b.agentConfig?.model&&h.push("--model",(0,d.TQ)(b.agentConfig.model)),h.join(" ")},async setupWorkspaceHooks(a,b){await y(a,".claude/metadata-updater.sh")},async postLaunchSetup(a){a.workspacePath&&await y(a.workspacePath,".claude/metadata-updater.sh")}}},detect:function(){try{return(0,e.execFileSync)("claude",["--version"],{stdio:"ignore"}),!0}catch{return!1}}},A=(0,f.promisify)(e.execFile);function B(a){if("number"==typeof a){if(!Number.isFinite(a))return null;let b=new Date(a);return Number.isNaN(b.getTime())?null:b}if("string"!=typeof a)return null;let b=a.trim();if(0===b.length)return null;if(/^\d+$/.test(b)){let a=Number(b);if(!Number.isFinite(a))return null;let c=new Date(a);return Number.isNaN(c.getTime())?null:c}let c=Date.parse(b);return Number.isFinite(c)?new Date(c):null}async function C(a){try{let{stdout:b}=await A("opencode",["session","list","--format","json"],{timeout:3e4}),c=function(a){let b;try{b=JSON.parse(a)}catch{return[]}return Array.isArray(b)?b.filter(a=>!!a&&"object"==typeof a&&void 0!==(0,d.Hr)(a.id)):[]}(b);if(a.metadata?.opencodeSessionId){let b=c.find(b=>b.id===a.metadata.opencodeSessionId);if(b)return b}let e=c.filter(b=>b.title===`AO:${a.id}`);if(0===e.length)return null;if(1===e.length)return e[0];return e.reduce((a,b)=>{let c=B(a.updated)?.getTime()??0;return(B(b.updated)?.getTime()??0)>c?b:a})}catch{return null}}let D={manifest:{name:"opencode",slot:"agent",description:"Agent plugin: OpenCode",version:"0.1.0",displayName:"OpenCode"},create:function(){return{name:"opencode",processName:"opencode",getLaunchCommand(a){let b,c=[],e=[],f=(0,d.Hr)(a.projectConfig.agentConfig?.opencodeSessionId);if(f&&c.push("--session",(0,d.TQ)(f)),a.subagent&&e.push("--agent",(0,d.TQ)(a.subagent)),a.prompt?b=a.systemPromptFile?`"$(cat ${(0,d.TQ)(a.systemPromptFile)}; printf '\\n\\n'; printf %s ${(0,d.TQ)(a.prompt)})"`:a.systemPrompt?(0,d.TQ)(`${a.systemPrompt}
|
|
156
|
-
|
|
157
|
-
${a.prompt}`):(0,d.TQ)(a.prompt):a.systemPromptFile?b=`"$(cat ${(0,d.TQ)(a.systemPromptFile)})"`:a.systemPrompt&&(b=(0,d.TQ)(a.systemPrompt)),a.model&&e.push("--model",(0,d.TQ)(a.model)),!f){let c=["--format","json","--title",(0,d.TQ)(`AO:${a.sessionId}`),...e],f=`
|
|
158
|
-
let buffer = '';
|
|
159
|
-
let captured = null;
|
|
160
|
-
process.stdin.on('data', chunk => {
|
|
161
|
-
buffer += chunk;
|
|
162
|
-
const lines = buffer.split('\\n');
|
|
163
|
-
buffer = lines.pop() || '';
|
|
164
|
-
for (const line of lines) {
|
|
165
|
-
if (captured) continue;
|
|
166
|
-
const trimmed = line.trim();
|
|
167
|
-
if (!trimmed) continue;
|
|
168
|
-
try {
|
|
169
|
-
const obj = JSON.parse(trimmed);
|
|
170
|
-
const sid = (typeof obj.session_id === 'string' && obj.session_id) || (typeof obj.sessionID === 'string' && obj.sessionID);
|
|
171
|
-
if (sid && /^ses_[A-Za-z0-9_-]+$/.test(sid)) {
|
|
172
|
-
captured = sid;
|
|
173
|
-
}
|
|
174
|
-
} catch {}
|
|
175
|
-
}
|
|
176
|
-
}).on('end', () => {
|
|
177
|
-
if (buffer.trim()) {
|
|
178
|
-
try {
|
|
179
|
-
const obj = JSON.parse(buffer.trim());
|
|
180
|
-
const sid = (typeof obj.session_id === 'string' && obj.session_id) || (typeof obj.sessionID === 'string' && obj.sessionID);
|
|
181
|
-
if (sid && /^ses_[A-Za-z0-9_-]+$/.test(sid)) {
|
|
182
|
-
captured = sid;
|
|
183
|
-
}
|
|
184
|
-
} catch {}
|
|
185
|
-
}
|
|
186
|
-
if (captured) {
|
|
187
|
-
process.stdout.write(captured);
|
|
188
|
-
process.exit(0);
|
|
189
|
-
}
|
|
190
|
-
process.exit(1);
|
|
191
|
-
});
|
|
192
|
-
`.trim().replace(/\n/g," ").replace(/\s+/g," "),g=`
|
|
193
|
-
let input = '';
|
|
194
|
-
process.stdin.on('data', c => input += c).on('end', () => {
|
|
195
|
-
const title = process.argv[1];
|
|
196
|
-
let rows;
|
|
197
|
-
try { rows = JSON.parse(input); } catch { process.exit(1); }
|
|
198
|
-
if (!Array.isArray(rows)) process.exit(1);
|
|
199
|
-
const isValidId = id => /^ses_[A-Za-z0-9_-]+$/.test(id);
|
|
200
|
-
const timestamp = value => {
|
|
201
|
-
if (typeof value === 'number' && Number.isFinite(value)) return value;
|
|
202
|
-
if (typeof value === 'string') {
|
|
203
|
-
const parsed = Date.parse(value);
|
|
204
|
-
return Number.isNaN(parsed) ? Number.NEGATIVE_INFINITY : parsed;
|
|
205
|
-
}
|
|
206
|
-
return Number.NEGATIVE_INFINITY;
|
|
207
|
-
};
|
|
208
|
-
const matches = rows
|
|
209
|
-
.filter(r => r && r.title === title && typeof r.id === 'string' && isValidId(r.id))
|
|
210
|
-
.sort((a, b) => {
|
|
211
|
-
const ta = timestamp(a.updated);
|
|
212
|
-
const tb = timestamp(b.updated);
|
|
213
|
-
if (ta === tb) return 0;
|
|
214
|
-
return tb - ta;
|
|
215
|
-
});
|
|
216
|
-
if (matches.length === 0) process.exit(1);
|
|
217
|
-
process.stdout.write(matches[0].id);
|
|
218
|
-
});
|
|
219
|
-
`.trim().replace(/\n/g," ").replace(/\s+/g," "),h=["opencode","run",...c,"--command","true"].join(" "),i=[...b?["--prompt",b]:[],...e],j=i.length>0?` ${i.join(" ")}`:"",k=(0,d.TQ)(`failed to discover OpenCode session ID for AO:${a.sessionId}`);return`SES_ID=$(${h} | node -e ${(0,d.TQ)(f)}); if [ -z "$SES_ID" ]; then SES_ID=$(opencode session list --format json | node -e ${(0,d.TQ)(g)} ${(0,d.TQ)(`AO:${a.sessionId}`)}); fi; [ -n "$SES_ID" ] && exec opencode --session "$SES_ID"${j}; echo ${k} >&2; exit 1`}return b&&c.push("--prompt",b),c.push(...e),["opencode",...c].join(" ")},getEnvironment(a){let b={};return b.AO_SESSION_ID=a.sessionId,a.issueId&&(b.AO_ISSUE_ID=a.issueId),b.PATH=(0,d.Te)(process.env.PATH),b.GH_PATH=d.C3,b},detectActivity(a){if(!a.trim())return"idle";let b=a.trim().split("\n"),c=b[b.length-1]?.trim()??"";if(/^[>$#]\s*$/.test(c))return"idle";let d=b.slice(-5).join("\n");return/\(Y\)es.*\(N\)o/i.test(d)||/approval required/i.test(d)||/Do you want to proceed\?/i.test(d)||/Allow .+\?/i.test(d)?"waiting_input":"active"},async getActivityState(a,b){let c=b??d.PE,e=Math.min(d.V1,c),f=new Date;if(!a.runtimeHandle||!await this.isProcessRunning(a.runtimeHandle))return{state:"exited",timestamp:f};let g=null;if(a.workspacePath){g=await (0,d.Ah)(a.workspacePath);let b=(0,d.Bm)(g);if(b)return b}let h=await C(a);if(h){let a=B(h.updated);if(a){let b=Math.max(0,Date.now()-a.getTime());return b<=e?{state:"active",timestamp:a}:b<=c?{state:"ready",timestamp:a}:{state:"idle",timestamp:a}}}let i=(0,d.Vo)(g,e,c);return i||null},async recordActivity(a,b){a.workspacePath&&await (0,d.Jy)(a.workspacePath,b,a=>this.detectActivity(a))},async isProcessRunning(a){try{if("tmux"===a.runtimeName&&a.id){let{stdout:b}=await A("tmux",["list-panes","-t",a.id,"-F","#{pane_tty}"],{timeout:3e4}),c=b.trim().split("\n").map(a=>a.trim()).filter(Boolean);if(0===c.length)return!1;let{stdout:d}=await A("ps",["-eo","pid,tty,args"],{timeout:3e4}),e=new Set(c.map(a=>a.replace(/^\/dev\//,""))),f=/(?:^|\/)opencode(?:\s|$)/;for(let a of d.split("\n")){let b=a.trimStart().split(/\s+/);if(b.length<3||!e.has(b[1]??""))continue;let c=b.slice(2).join(" ");if(f.test(c))return!0}return!1}let b=a.data.pid,c="number"==typeof b?b:Number(b);if(Number.isFinite(c)&&c>0)try{return process.kill(c,0),!0}catch(a){if(a instanceof Error&&"code"in a&&"EPERM"===a.code)return!0}return!1}catch{return!1}},async getSessionInfo(a){let b=await C(a);return b?{summary:b.title??null,summaryIsFallback:!0,agentSessionId:b.id}:null},async getRestoreCommand(a,b){let c=(0,d.Hr)(a.metadata?.opencodeSessionId)??(await C(a))?.id??null;if(!c)return null;let e=["opencode","--session",(0,d.TQ)(c)],f=b.agentConfig;return f?.model&&e.push("--model",(0,d.TQ)(f.model)),e.join(" ")},async setupWorkspaceHooks(a,b){await (0,d.J0)(a)},async postLaunchSetup(a){a.workspacePath&&await (0,d.J0)(a.workspacePath)}}},detect:function(){try{return(0,e.execFileSync)("opencode",["version"],{stdio:"ignore"}),!0}catch{return!1}}},E=(0,f.promisify)(e.execFile);async function F(a,...b){let{stdout:c}=await E("git",b,{cwd:a});return c.trimEnd()}async function G(a){try{return await F(a,"remote","get-url","origin"),!0}catch{return!1}}async function H(a,b){try{return await F(a,"rev-parse","--verify","--quiet",b),!0}catch{return!1}}async function I(a,b,c){if(c?.hasOrigin??await G(a)){if(c?.branch){let b=`origin/${c.branch}`;if(await H(a,b))return b}let d=`origin/${b}`;if(await H(a,d))return d}let d=`refs/heads/${b}`;if(await H(a,d))return d;throw Error(`Unable to resolve base ref for default branch "${b}"`)}let J=/^[a-zA-Z0-9_-]+$/;function K(a,b){if(!J.test(a))throw Error(`Invalid ${b} "${a}": must match ${J}`)}function L(a){return a.startsWith("~/")?(0,k.join)((0,j.homedir)(),a.slice(2)):a}let M={manifest:{name:"worktree",slot:"workspace",description:"Workspace plugin: git worktrees",version:"0.1.0"},create:function(a){let b=a?.worktreeDir?L(a.worktreeDir):(0,k.join)((0,j.homedir)(),".worktrees");return{name:"worktree",async create(a){K(a.projectId,"projectId"),K(a.sessionId,"sessionId");let c=L(a.project.path),d=(0,k.join)(b,a.projectId),e=(0,k.join)(d,a.sessionId);(0,i.mkdirSync)(d,{recursive:!0});let f=await G(c);if(f)try{await F(c,"fetch","origin","--quiet")}catch{}let g=await I(c,a.project.defaultBranch,{hasOrigin:f});try{await F(c,"worktree","add","-b",a.branch,e,g)}catch(d){let b=d instanceof Error?d.message:String(d);if(!b.includes("already exists"))throw Error(`Failed to create worktree for branch "${a.branch}": ${b}`,{cause:d});await F(c,"worktree","add",e,g);try{await F(e,"checkout",a.branch)}catch(d){try{await F(c,"worktree","remove","--force",e)}catch{}let b=d instanceof Error?d.message:String(d);throw Error(`Failed to checkout branch "${a.branch}" in worktree: ${b}`,{cause:d})}}return{path:e,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async destroy(a){try{let b=await F(a,"rev-parse","--path-format=absolute","--git-common-dir"),c=(0,k.resolve)(b,"..");await F(c,"worktree","remove","--force",a)}catch{(0,i.existsSync)(a)&&(0,i.rmSync)(a,{recursive:!0,force:!0})}},async list(a){K(a,"projectId");let c=(0,k.join)(b,a);if(!(0,i.existsSync)(c))return[];let d=(0,i.readdirSync)(c,{withFileTypes:!0}).filter(a=>a.isDirectory()).map(a=>(0,k.join)(c,a.name));if(0===d.length)return[];let e="";for(let a of d)try{e=await F(a,"worktree","list","--porcelain");break}catch{continue}if(!e)return[];let f=[];for(let b of e.split("\n\n")){let d=b.trim().split("\n"),e="",g="";for(let a of d)a.startsWith("worktree ")?e=a.slice(9):a.startsWith("branch ")&&(g=a.slice(7).replace("refs/heads/",""));if(e&&(e===c||e.startsWith(c+"/"))){let b=(0,k.basename)(e);f.push({path:e,branch:g||"detached",sessionId:b,projectId:a})}}return f},async exists(a){if(!(0,i.existsSync)(a))return!1;try{return await E("git",["rev-parse","--is-inside-work-tree"],{cwd:a,timeout:3e4}),!0}catch{return!1}},async restore(a,b){let c=L(a.project.path);try{await F(c,"worktree","prune")}catch{}let d=await G(c);if(d)try{await F(c,"fetch","origin","--quiet")}catch{}try{await F(c,"worktree","add",b,a.branch)}catch{let e=await I(c,a.project.defaultBranch,{branch:a.branch,hasOrigin:d});if(e.startsWith("origin/"))try{await F(c,"worktree","add","-b",a.branch,b,e)}catch{await F(c,"worktree","add","-b",a.branch,b,`refs/heads/${a.project.defaultBranch}`)}else await F(c,"worktree","add","-b",a.branch,b,e)}return{path:b,branch:a.branch,sessionId:a.sessionId,projectId:a.projectId}},async postCreate(a,b){let c=L(b.path);if(b.symlinks)for(let d of b.symlinks){if(d.startsWith("/")||d.includes(".."))throw Error(`Invalid symlink path "${d}": must be a relative path without ".." segments`);let b=(0,k.join)(c,d),e=(0,k.resolve)(a.path,d);if(!e.startsWith(a.path+"/")&&e!==a.path)throw Error(`Symlink target "${d}" resolves outside workspace: ${e}`);if((0,i.existsSync)(b)){try{let a=(0,i.lstatSync)(e);(a.isSymbolicLink()||a.isFile()||a.isDirectory())&&(0,i.rmSync)(e,{recursive:!0,force:!0})}catch{}(0,i.mkdirSync)((0,k.dirname)(e),{recursive:!0}),(0,i.symlinkSync)(b,e)}}if(b.postCreate)for(let c of b.postCreate)await E("sh",["-c",c],{cwd:a.path})}}}};class N{constructor(a){if(this.cache=new Map,this.accessOrder=[],this.maxSize=a,a<=0)throw Error("LRUCache maxSize must be greater than 0")}get(a){if(this.cache.has(a))return this.moveToEnd(a),this.cache.get(a)}set(a,b){if(this.cache.has(a)){this.moveToEnd(a),this.cache.set(a,b);return}if(this.cache.set(a,b),this.accessOrder.push(a),this.accessOrder.length>this.maxSize){let a=this.accessOrder.shift();void 0!==a&&this.cache.delete(a)}}delete(a){this.cache.delete(a);let b=this.accessOrder.indexOf(a);-1!==b&&this.accessOrder.splice(b,1)}clear(){this.cache.clear(),this.accessOrder=[]}get size(){return this.cache.size}has(a){return this.cache.has(a)}keys(){return[...this.accessOrder]}moveToEnd(a){let b=this.accessOrder.indexOf(a);-1!==b&&(this.accessOrder.splice(b,1),this.accessOrder.push(a))}toMap(){return new Map(this.cache)}}let O=(0,f.promisify)(e.execFile),P={prList:new N(100),commitStatus:new N(500)},Q=new N(200),R=new N(200);async function S(a){let b=[],c=!1;if(0===a.length)return{shouldRefresh:!1,details:["No PRs to check"]};let d=new Map;for(let b of a){let a=`${b.owner}/${b.repo}`;d.has(a)||d.set(a,[]);let c=d.get(a);c&&c.push(b)}let e=!1;for(let[a]of d){let[d,f]=a.split("/");await U(d,f)&&(e=!0,c=!0,b.push(`PR list changed for ${a} (Guard 1)`))}if(!e)for(let d of a){let a=`${d.owner}/${d.repo}#${d.number}`,e=Q.get(a);if(e&&null===e.headSha){c=!0,b.push(`First time seeing PR #${d.number} (Guard 2: no cached head SHA)`);continue}e&&e.headSha&&await V(d.owner,d.repo,e.headSha)&&(c=!0,b.push(`CI status changed for ${d.owner}/${d.repo}#${d.number} (Guard 2)`))}return{shouldRefresh:c,details:b}}async function T(){try{await O("gh",["--version"],{timeout:5e3})}catch{let a=Error("gh CLI not available or not authenticated. GraphQL batch enrichment requires gh CLI to be installed and configured.");throw a.cause="GH_CLI_UNAVAILABLE",a}}async function U(a,b){let c=`${a}/${b}`,d=P.prList.get(c),e=["api","--method","GET",`repos/${c}/pulls?state=open&sort=updated&direction=desc&per_page=1`,"-i"];d&&e.push("-H",`If-None-Match: ${d}`);try{let{stdout:c}=await O("gh",e,{timeout:1e4}),d=c.trim();if(d.includes("HTTP/1.1 304")||d.includes("HTTP/2 304"))return!1;let f=d.match(/etag:\s*(.+)/i);if(f){let c=f[1].trim();P.prList.set(`${a}/${b}`,c)}return!0}catch(b){let a=b instanceof Error?b.message:String(b);return console.warn(`[ETag Guard 1] PR list check failed for ${c}: ${a}`),!0}}async function V(a,b,c){let d=`${a}/${b}#${c}`,e=P.commitStatus.get(d),f=["api","--method","GET",`repos/${a}/${b}/commits/${c}/status`,"-i"];e&&f.push("-H",`If-None-Match: ${e}`);try{let{stdout:d}=await O("gh",f,{timeout:1e4}),e=d.trim();if(e.includes("HTTP/1.1 304")||e.includes("HTTP/2 304"))return!1;let g=e.match(/etag:\s*(.+)/i);if(g){let d=g[1].trim();P.commitStatus.set(`${a}/${b}#${c}`,d)}return!0}catch(b){let a=b instanceof Error?b.message:String(b);return console.warn(`[ETag Guard 2] Commit status check failed for ${d}: ${a}`),!0}}let W=`
|
|
220
|
-
title
|
|
221
|
-
state
|
|
222
|
-
additions
|
|
223
|
-
deletions
|
|
224
|
-
isDraft
|
|
225
|
-
mergeable
|
|
226
|
-
mergeStateStatus
|
|
227
|
-
reviewDecision
|
|
228
|
-
headRefName
|
|
229
|
-
headRefOid
|
|
230
|
-
reviews(last: 5) {
|
|
231
|
-
nodes {
|
|
232
|
-
author { login }
|
|
233
|
-
state
|
|
234
|
-
submittedAt
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
commits(last: 1) {
|
|
238
|
-
nodes {
|
|
239
|
-
commit {
|
|
240
|
-
statusCheckRollup {
|
|
241
|
-
state
|
|
242
|
-
contexts(first: 20) {
|
|
243
|
-
nodes {
|
|
244
|
-
... on CheckRun {
|
|
245
|
-
name
|
|
246
|
-
status
|
|
247
|
-
conclusion
|
|
248
|
-
detailsUrl
|
|
249
|
-
}
|
|
250
|
-
... on StatusContext {
|
|
251
|
-
context
|
|
252
|
-
state
|
|
253
|
-
targetUrl
|
|
254
|
-
}
|
|
255
|
-
}
|
|
256
|
-
pageInfo {
|
|
257
|
-
hasNextPage
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
}
|
|
261
|
-
}
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
`;async function X(a){let{query:b,variables:c}=function(a){if(0===a.length)return{query:"",variables:{}};let b=[],c={};a.forEach((a,d)=>{let e=`pr${d}`;b.push(`
|
|
265
|
-
${e}: repository(owner: $${e}Owner, name: $${e}Name) {
|
|
266
|
-
... on Repository {
|
|
267
|
-
pullRequest(number: $${e}Number) { ${W} }
|
|
268
|
-
}
|
|
269
|
-
}
|
|
270
|
-
`),c[`${e}Owner`]=a.owner,c[`${e}Name`]=a.repo,c[`${e}Number`]=a.number});let d=Object.entries(c).map(([a,b])=>`$${a}: ${"number"==typeof b?"Int!":"String!"}`).join(", ");return{query:`query BatchPRs(${d}) {
|
|
271
|
-
${b.join("\n")}
|
|
272
|
-
}`,variables:c}}(a);if(!b||0===a.length)return{};await T();let d=[];for(let[a,b]of Object.entries(c))"string"==typeof b?d.push("-f",`${a}=${b}`):d.push("-F",`${a}=${b}`);let e=["api","graphql",...d,"-f",`query=${b}`],f=3e4+Math.max(0,(a.length-10)*2e3),{stdout:g}=await O("gh",e,{maxBuffer:0xa00000,timeout:f}),h=JSON.parse(g.trim());if(h.errors&&h.errors.length>0){let a=h.errors.map(a=>a.message).join("; ");throw Error(`GraphQL query errors: ${a}`)}return h.data??{}}async function Y(a,b){let c=new Map;if(0===a.length)return c;let d=await S(a);if(!d.shouldRefresh){let e=[];for(let b of a){let a=`${b.owner}/${b.repo}#${b.number}`,d=R.get(a);d?c.set(a,d):e.push(b)}if(0===e.length)return b?.log("info",`[ETag Guard] Skipping GraphQL batch - all ${c.size} PRs cached. Reasons: ${d.details.join(", ")}`),c;b?.log("info",`[ETag Guard] Partial cache: ${c.size} cached, ${e.length} missing. Fetching missing PRs via GraphQL.`),a=e}let e=[];for(let b=0;b<a.length;b+=25)e.push(a.slice(b,b+25));for(let a=0;a<e.length;a++){let d,f=e[a],g=c.size,h=Date.now();try{let i=await X(f);d=Date.now()-h,f.forEach((a,b)=>{let d=`pr${b}`,e=`${a.owner}/${a.repo}#${a.number}`,f=i[d];if(f?.pullRequest){let a=function(a){if(!a||"object"!=typeof a||void 0===a.state&&void 0===a.title&&void 0===a.reviews&&void 0===a.commits)return null;let b=function(a){let b="string"==typeof a?a.toUpperCase():"";return"MERGED"===b?"merged":"CLOSED"===b?"closed":"open"}(a.state),c="string"==typeof a.title?a.title:void 0,d="number"==typeof a.additions?a.additions:0,e="number"==typeof a.deletions?a.deletions:0,f=!0===a.isDraft,g="string"==typeof a.headRefOid?a.headRefOid:"string"==typeof a.headSha?a.headSha:null,h=a.mergeable,i="string"==typeof a.mergeStateStatus?a.mergeStateStatus.toUpperCase():"",j="CONFLICTING"===h,k="BEHIND"===i,l=function(a){let b="string"==typeof a?a.toUpperCase():"";return"APPROVED"===b?"approved":"CHANGES_REQUESTED"===b?"changes_requested":"REVIEW_REQUIRED"===b?"pending":"none"}(a.reviewDecision),m=a.commits,n=m?.nodes?.[0]?.commit?.statusCheckRollup,o=n?function(a){if(!a||"object"!=typeof a)return"none";let b="string"==typeof a.state?a.state.toUpperCase():"";return"SUCCESS"===b?"passing":"FAILURE"===b||"ERROR"===b?"failing":"PENDING"===b||"EXPECTED"===b?"pending":"TIMED_OUT"===b||"CANCELLED"===b||"ACTION_REQUIRED"===b?"failing":"QUEUED"===b||"IN_PROGRESS"===b||"WAITING"===b?"pending":"none"}(n):"none",p=n?.contexts,q=p?.pageInfo,r=null!=q&&"object"==typeof q&&!0===q.hasNextPage,s=p&&!r?function(a){if(!a||"object"!=typeof a)return[];let b=a.nodes;if(!Array.isArray(b))return[];let c=[];for(let a of b)if(a&&"object"==typeof a){if("string"==typeof a.name&&"string"==typeof a.status){let b,d=a.status.toUpperCase(),e="string"==typeof a.conclusion?a.conclusion.toUpperCase():null;b="COMPLETED"===d?"SUCCESS"===e?"passed":"SKIPPED"===e||"NEUTRAL"===e||"STALE"===e||"NOT_REQUIRED"===e||"NONE"===e?"skipped":"FAILURE"===e||"TIMED_OUT"===e||"CANCELLED"===e||"ACTION_REQUIRED"===e||"ERROR"===e?"failed":"skipped":"IN_PROGRESS"===d?"running":"pending",c.push({name:a.name,status:b,conclusion:e??void 0,url:"string"==typeof a.detailsUrl?a.detailsUrl:void 0});continue}if("string"==typeof a.context&&"string"==typeof a.state){let b,d=a.state.toUpperCase();b="SUCCESS"===d?"passed":"FAILURE"===d||"ERROR"===d?"failed":"pending",c.push({name:a.context,status:b,conclusion:d,url:"string"==typeof a.targetUrl?a.targetUrl:void 0})}}return c}(p):void 0,t=[];"failing"===o&&t.push("CI is failing"),"changes_requested"===l&&t.push("Changes requested in review"),"pending"===l&&t.push("Review required"),j&&t.push("Merge conflicts"),k&&t.push("Branch is behind base branch"),f&&t.push("PR is still a draft");let u="open"===b&&("passing"===o||"none"===o)&&("approved"===l||"none"===l)&&!j&&!k&&!f;return{data:{state:b,ciStatus:o,reviewDecision:l,mergeable:u,title:c,additions:d,deletions:e,isDraft:f,hasConflicts:j,isBehind:k,blockers:t,...void 0!==s?{ciChecks:s}:{}},headSha:g}}(f.pullRequest);if(a){let{data:b,headSha:d}=a;c.set(e,b),Q.set(e,{headSha:d,ciStatus:b.ciStatus}),R.set(e,b)}}});let j=c.size;if(j>g){let c={batchIndex:a,totalBatches:e.length,prCount:j-g,durationMs:d};b?.recordSuccess(c),b?.log("info",`[GraphQL Batch Success] Batch ${a+1}/${e.length} succeeded: added ${j-g} PRs to cache (${d}ms)`)}}catch(g){d=Date.now()-h;let c=g instanceof Error?g.message:String(g);b?.recordFailure({batchIndex:a,totalBatches:e.length,prCount:f.length,error:c,durationMs:d}),console.error(`[GraphQL Batch Warning] Batch enrichment partially failed: ${c}`)}}return c}function Z(a,b){let c=b.toLowerCase();for(let[b,d]of Object.entries(a))if(b.toLowerCase()===c){if(Array.isArray(d))return d[0];return d}}function $(a){if("string"!=typeof a)return;let b=new Date(a);return Number.isNaN(b.getTime())?void 0:b}function _(a){return"string"!=typeof a||0===a.length?void 0:a.startsWith("refs/heads/")?a.slice(11):a.startsWith("refs/")?void 0:a}let aa=(0,f.promisify)(e.execFile),ab=new Set(["cursor[bot]","github-actions[bot]","codecov[bot]","sonarcloud[bot]","dependabot[bot]","renovate[bot]","codeclimate[bot]","deepsource-autofix[bot]","snyk-bot","lgtm-com[bot]"]);async function ac(a,b,c){try{let{stdout:d}=await aa(a,b,{...c?{cwd:c}:{},maxBuffer:0xa00000,timeout:3e4});return d.trim()}catch(c){throw Error(`${a} ${b.slice(0,3).join(" ")} failed: ${c.message}`,{cause:c})}}async function ad(a){return ac("gh",a)}async function ae(a,b){return ac("gh",a,b)}async function af(a,b){return ac("git",a,b)}function ag(a){let b=a.split("/");if(2!==b.length||!b[0]||!b[1])throw Error(`Invalid repo format "${a}", expected "owner/repo"`);return[b[0],b[1]]}function ah(a,b){let[c,d]=ag(b);return{number:a.number,url:a.url,title:a.title,owner:c,repo:d,branch:a.headRefName,baseBranch:a.baseRefName,isDraft:a.isDraft}}function ai(a){let b=(a??"").toUpperCase();return"IN_PROGRESS"===b?"running":"PENDING"===b||"QUEUED"===b||"REQUESTED"===b||"WAITING"===b||"EXPECTED"===b?"pending":"SUCCESS"===b?"passed":"FAILURE"===b||"TIMED_OUT"===b||"CANCELLED"===b||"ACTION_REQUIRED"===b||"ERROR"===b?"failed":("SKIPPED"===b||"NEUTRAL"===b||"STALE"===b||"NOT_REQUIRED"===b,"skipped")}async function aj(a){let b=JSON.parse(await ad(["pr","view",String(a.number),"--repo",al(a),"--json","statusCheckRollup"]));return(Array.isArray(b.statusCheckRollup)?b.statusCheckRollup:[]).map(a=>{if(!a||"object"!=typeof a)return null;let b="string"==typeof a.name&&a.name||"string"==typeof a.context&&a.context;if(!b)return null;let c="string"==typeof a.conclusion?a.conclusion:"string"==typeof a.state?a.state:"string"==typeof a.status?a.status:void 0,d="string"==typeof a.link&&a.link||"string"==typeof a.detailsUrl&&a.detailsUrl||"string"==typeof a.targetUrl&&a.targetUrl||void 0,e="string"==typeof a.startedAt?a.startedAt:"string"==typeof a.createdAt?a.createdAt:void 0,f="string"==typeof a.completedAt?a.completedAt:void 0,g={name:b,status:ai(c),conclusion:"string"==typeof c?c.toUpperCase():void 0,startedAt:e?new Date(e):void 0,completedAt:f?new Date(f):void 0};return d&&(g.url=d),g}).filter(a=>null!==a)}function ak(a){let b=a.scm?.webhook;return{enabled:b?.enabled!==!1,path:b?.path??"/api/webhooks/github",secretEnvVar:b?.secretEnvVar,signatureHeader:b?.signatureHeader??"x-hub-signature-256",eventHeader:b?.eventHeader??"x-github-event",deliveryHeader:b?.deliveryHeader??"x-github-delivery",maxBodyBytes:b?.maxBodyBytes}}function al(a){return`${a.owner}/${a.repo}`}function am(a){if(!a)return new Date(0);let b=new Date(a);return isNaN(b.getTime())?new Date(0):b}let an={manifest:{name:"github",slot:"scm",description:"SCM plugin: GitHub PRs, CI checks, reviews, merge readiness",version:"0.1.0"},create:function(){return{name:"github",async verifyWebhook(a,b){let c=ak(b);if(!c.enabled)return{ok:!1,reason:"Webhook is disabled for this project"};if("POST"!==a.method.toUpperCase())return{ok:!1,reason:"Webhook requests must use POST"};if(void 0!==c.maxBodyBytes&&Buffer.byteLength(a.body,"utf8")>c.maxBodyBytes)return{ok:!1,reason:"Webhook payload exceeds configured maxBodyBytes"};let d=Z(a.headers,c.eventHeader);if(!d)return{ok:!1,reason:`Missing ${c.eventHeader} header`};let e=Z(a.headers,c.deliveryHeader),f=c.secretEnvVar;if(!f)return{ok:!0,deliveryId:e,eventType:d};let g=process.env[f];if(!g)return{ok:!1,reason:`Webhook secret env var ${f} is not configured`};let i=Z(a.headers,c.signatureHeader);return i?!function(a,b,c){if(!c.startsWith("sha256="))return!1;let d=(0,h.createHmac)("sha256",b).update(a).digest("hex"),e=c.slice(7),f=Buffer.from(d,"hex"),g=Buffer.from(e,"hex");return f.length===g.length&&(0,h.timingSafeEqual)(f,g)}(a.rawBody??a.body,g,i)?{ok:!1,reason:"Webhook signature verification failed",deliveryId:e,eventType:d}:{ok:!0,deliveryId:e,eventType:d}:{ok:!1,reason:`Missing ${c.signatureHeader} header`}},async parseWebhook(a,b){let c=ak(b),d=function(a){let b=JSON.parse(a);if(!b||"object"!=typeof b||Array.isArray(b))throw Error("Webhook payload must be a JSON object");return b}(a.body);return function(a,b,c){let d=Z(a.headers,c.eventHeader);if(!d)return null;let e=Z(a.headers,c.deliveryHeader),f=function(a){let b=a.repository;if(!b||"object"!=typeof b)return;let c=b.owner,d=c&&"object"==typeof c?c.login:void 0,e="string"==typeof d?d:void 0,f="string"==typeof b.name?b.name:void 0;if(e&&f)return{owner:e,name:f}}(b),g="string"==typeof b.action?b.action:d;if("pull_request"===d){let a=b.pull_request;if(!a||"object"!=typeof a)return null;let c=a.head;return{provider:"github",kind:"pull_request",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof b.number?b.number:"number"==typeof a.number?a.number:void 0,branch:"string"==typeof c?.ref?c.ref:void 0,sha:"string"==typeof c?.sha?c.sha:void 0,timestamp:$(a.updated_at),data:b}}if("pull_request_review"===d||"pull_request_review_comment"===d){let a=b.pull_request;if(!a||"object"!=typeof a)return null;let c=a.head;return{provider:"github",kind:"pull_request_review"===d?"review":"comment",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof b.number?b.number:"number"==typeof a.number?a.number:void 0,branch:"string"==typeof c?.ref?c.ref:void 0,sha:"string"==typeof c?.sha?c.sha:void 0,timestamp:"pull_request_review"===d?$(b.review?.submitted_at):$(b.comment?.updated_at??b.comment?.created_at),data:b}}if("issue_comment"===d){let a=b.issue;return a&&"object"==typeof a&&"pull_request"in a?{provider:"github",kind:"comment",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof a.number?a.number:void 0,timestamp:$(b.comment?.updated_at??b.comment?.created_at),data:b}:null}if("check_run"===d||"check_suite"===d){let a=b[d],c=(Array.isArray(a?.pull_requests)?a?.pull_requests:[])[0];return{provider:"github",kind:"ci",action:g,rawEventType:d,deliveryId:e,repository:f,prNumber:"number"==typeof c?.number?c.number:void 0,branch:"string"==typeof a?.head_branch?a.head_branch:"string"==typeof a?.check_suite?.head_branch?(a?.check_suite).head_branch:void 0,sha:"string"==typeof a?.head_sha?a.head_sha:void 0,timestamp:$(a?.updated_at),data:b}}if("status"===d){let a=Array.isArray(b.branches)?b.branches:[];return{provider:"github",kind:"ci",action:"string"==typeof b.state?b.state:g,rawEventType:d,deliveryId:e,repository:f,branch:_(a[0]?.name??b.ref),sha:"string"==typeof b.sha?b.sha:void 0,timestamp:$(b.updated_at),data:b}}if("push"===d){let a=b.head_commit&&"object"==typeof b.head_commit?b.head_commit:void 0;return{provider:"github",kind:"push",action:g,rawEventType:d,deliveryId:e,repository:f,branch:_(b.ref),sha:"string"==typeof b.after?b.after:void 0,timestamp:$(a?.timestamp??b.updated_at),data:b}}return{provider:"github",kind:"unknown",action:g,rawEventType:d,deliveryId:e,repository:f,timestamp:$(b.updated_at),data:b}}(a,d,c)},async detectPR(a,b){if(!a.branch)return null;ag(b.repo);try{let c=await ad(["pr","list","--repo",b.repo,"--head",a.branch,"--json","number,url,title,headRefName,baseRefName,isDraft","--limit","1"]),d=JSON.parse(c);if(0===d.length)return null;return ah(d[0],b.repo)}catch{return null}},resolvePR:async(a,b)=>ah(JSON.parse(await ad(["pr","view",a,"--repo",b.repo,"--json","number,url,title,headRefName,baseRefName,isDraft"])),b.repo),async assignPRToCurrentUser(a){await ad(["pr","edit",String(a.number),"--repo",al(a),"--add-assignee","@me"])},async checkoutPR(a,b){if(await af(["branch","--show-current"],b)===a.branch)return!1;if(await af(["status","--porcelain"],b))throw Error(`Workspace has uncommitted changes; cannot switch to PR branch "${a.branch}" safely`);return await ae(["pr","checkout",String(a.number),"--repo",al(a)],b),!0},async getPRState(a){let b=JSON.parse(await ad(["pr","view",String(a.number),"--repo",al(a),"--json","state"])).state.toUpperCase();return"MERGED"===b?"merged":"CLOSED"===b?"closed":"open"},async getPRSummary(a){let b=JSON.parse(await ad(["pr","view",String(a.number),"--repo",al(a),"--json","state,title,additions,deletions"])),c=b.state.toUpperCase();return{state:"MERGED"===c?"merged":"CLOSED"===c?"closed":"open",title:b.title??"",additions:b.additions??0,deletions:b.deletions??0}},async mergePR(a,b="squash"){await ad(["pr","merge",String(a.number),"--repo",al(a),"rebase"===b?"--rebase":"merge"===b?"--merge":"--squash","--delete-branch"])},async closePR(a){await ad(["pr","close",String(a.number),"--repo",al(a)])},async getCIChecks(a){try{let b=await ad(["pr","checks",String(a.number),"--repo",al(a),"--json","name,state,link,startedAt,completedAt"]);return JSON.parse(b).map(a=>{let b=a.state?.toUpperCase();return{name:a.name,status:ai(b),url:a.link||void 0,conclusion:b||void 0,startedAt:a.startedAt?new Date(a.startedAt):void 0,completedAt:a.completedAt?new Date(a.completedAt):void 0}})}catch(b){if(b instanceof Error&&/pr checks/i.test(b.message)&&/unknown json field/i.test(b.message))return aj(a);throw Error("Failed to fetch CI checks",{cause:b})}},async getCISummary(a){let b;try{b=await this.getCIChecks(a)}catch{try{let b=await this.getPRState(a);if("merged"===b||"closed"===b)return"none"}catch{}return"failing"}return 0===b.length?"none":b.some(a=>"failed"===a.status)?"failing":b.some(a=>"pending"===a.status||"running"===a.status)?"pending":b.some(a=>"passed"===a.status)?"passing":"none"},getReviews:async a=>JSON.parse(await ad(["pr","view",String(a.number),"--repo",al(a),"--json","reviews"])).reviews.map(a=>{let b,c=a.state?.toUpperCase();return b="APPROVED"===c?"approved":"CHANGES_REQUESTED"===c?"changes_requested":"DISMISSED"===c?"dismissed":"PENDING"===c?"pending":"commented",{author:a.author?.login??"unknown",state:b,body:a.body||void 0,submittedAt:am(a.submittedAt)}}),async getReviewDecision(a){let b=(JSON.parse(await ad(["pr","view",String(a.number),"--repo",al(a),"--json","reviewDecision"])).reviewDecision??"").toUpperCase();return"APPROVED"===b?"approved":"CHANGES_REQUESTED"===b?"changes_requested":"REVIEW_REQUIRED"===b?"pending":"none"},async getPendingComments(a){try{let b=await ad(["api","graphql","-f",`owner=${a.owner}`,"-f",`name=${a.repo}`,"-F",`number=${a.number}`,"-f",`query=query($owner: String!, $name: String!, $number: Int!) {
|
|
273
|
-
repository(owner: $owner, name: $name) {
|
|
274
|
-
pullRequest(number: $number) {
|
|
275
|
-
reviewThreads(first: 100) {
|
|
276
|
-
nodes {
|
|
277
|
-
isResolved
|
|
278
|
-
comments(first: 1) {
|
|
279
|
-
nodes {
|
|
280
|
-
id
|
|
281
|
-
author { login }
|
|
282
|
-
body
|
|
283
|
-
path
|
|
284
|
-
line
|
|
285
|
-
url
|
|
286
|
-
createdAt
|
|
287
|
-
}
|
|
288
|
-
}
|
|
289
|
-
}
|
|
290
|
-
}
|
|
291
|
-
}
|
|
292
|
-
}
|
|
293
|
-
}`]);return JSON.parse(b).data.repository.pullRequest.reviewThreads.nodes.filter(a=>{if(a.isResolved)return!1;let b=a.comments.nodes[0];if(!b)return!1;let c=b.author?.login??"";return!ab.has(c)}).map(a=>{let b=a.comments.nodes[0];return{id:b.id,author:b.author?.login??"unknown",body:b.body,path:b.path||void 0,line:b.line??void 0,isResolved:a.isResolved,createdAt:am(b.createdAt),url:b.url}})}catch(a){throw Error("Failed to fetch pending comments",{cause:a})}},async getAutomatedComments(a){try{let b=[];for(let c=1;;c++){let d=await ad(["api","--method","GET",`repos/${al(a)}/pulls/${a.number}/comments?per_page=100&page=${c}`]),e=JSON.parse(d);if(0===e.length||(b.push(...e),e.length<100))break}return b.filter(a=>ab.has(a.user?.login??"")).map(a=>{let b="info",c=a.body.toLowerCase();return c.includes("error")||c.includes("bug")||c.includes("critical")||c.includes("potential issue")?b="error":(c.includes("warning")||c.includes("suggest")||c.includes("consider"))&&(b="warning"),{id:String(a.id),botName:a.user?.login??"unknown",body:a.body,path:a.path||void 0,line:a.line??a.original_line??void 0,severity:b,createdAt:am(a.created_at),url:a.html_url}})}catch(a){throw Error("Failed to fetch automated comments",{cause:a})}},async getMergeability(a){let b=[];if("merged"===await this.getPRState(a))return{mergeable:!0,ciPassing:!0,approved:!0,noConflicts:!0,blockers:[]};let c=JSON.parse(await ad(["pr","view",String(a.number),"--repo",al(a),"--json","mergeable,reviewDecision,mergeStateStatus,isDraft"])),e=await this.getCISummary(a),f=e===d.U1.PASSING||e===d.U1.NONE;f||b.push(`CI is ${e}`);let g=(c.reviewDecision??"").toUpperCase();"CHANGES_REQUESTED"===g?b.push("Changes requested in review"):"REVIEW_REQUIRED"===g&&b.push("Review required");let h=(c.mergeable??"").toUpperCase(),i=(c.mergeStateStatus??"").toUpperCase();return"CONFLICTING"===h?b.push("Merge conflicts"):("UNKNOWN"===h||""===h)&&b.push("Merge status unknown (GitHub is computing)"),"BEHIND"===i?b.push("Branch is behind base branch"):"BLOCKED"===i?b.push("Merge is blocked by branch protection"):"UNSTABLE"===i&&b.push("Required checks are failing"),c.isDraft&&b.push("PR is still a draft"),{mergeable:0===b.length,ciPassing:f,approved:"APPROVED"===g,noConflicts:"MERGEABLE"===h,blockers:b}},enrichSessionsPRBatch:async(a,b)=>Y(a,b)}}},ao=(0,f.promisify)(e.execFile);async function ap(a){try{let{stdout:b}=await ao("gh",a,{maxBuffer:0xa00000,timeout:3e4});return b.trim()}catch(b){throw Error(`gh ${a.slice(0,3).join(" ")} failed: ${b.message}`,{cause:b})}}function aq(a,b){let c=function a(b){if(!(b instanceof Error))return"";let c=[b.message];return"string"==typeof b.stderr&&c.push(b.stderr),"string"==typeof b.stdout&&c.push(b.stdout),b.cause instanceof Error&&c.push(a(b.cause)),c.join("\n").toLowerCase()}(a);return!!c&&(c.includes("unknown json field")||c.includes("unknown field")||c.includes("invalid field"))&&c.includes(b.toLowerCase())}async function ar(a,b){try{return await ap(["issue","view",a,"--repo",b.repo,"--json","number,title,body,url,state,stateReason,labels,assignees"])}catch(c){if(!aq(c,"stateReason"))throw c;return ap(["issue","view",a,"--repo",b.repo,"--json","number,title,body,url,state,labels,assignees"])}}async function as(a){let b=[...a,"--json","number,title,body,url,state,stateReason,labels,assignees"];try{return await ap(b)}catch(b){if(!aq(b,"stateReason"))throw b;return ap([...a,"--json","number,title,body,url,state,labels,assignees"])}}function at(a,b){return"CLOSED"===a.toUpperCase()?b?.toUpperCase()==="NOT_PLANNED"?"cancelled":"closed":"open"}let au={manifest:{name:"github",slot:"tracker",description:"Tracker plugin: GitHub Issues",version:"0.1.0"},create:function(){return{name:"github",async getIssue(a,b){let c=JSON.parse(await ar(a,b));return{id:String(c.number),title:c.title,description:c.body??"",url:c.url,state:at(c.state,c.stateReason),labels:c.labels.map(a=>a.name),assignee:c.assignees[0]?.login}},isCompleted:async(a,b)=>"CLOSED"===JSON.parse(await ap(["issue","view",a,"--repo",b.repo,"--json","state"])).state.toUpperCase(),issueUrl(a,b){let c=a.replace(/^#/,"");return`https://github.com/${b.repo}/issues/${c}`},issueLabel(a,b){let c=a.match(/\/issues\/(\d+)/);if(c)return`#${c[1]}`;let d=a.split("/"),e=d[d.length-1];return e?`#${e}`:a},branchName(a,b){let c=a.replace(/^#/,"");return`feat/issue-${c}`},async generatePrompt(a,b){let c=await this.getIssue(a,b),d=[`You are working on GitHub issue #${c.id}: ${c.title}`,`Issue URL: ${c.url}`,""];return c.labels.length>0&&d.push(`Labels: ${c.labels.join(", ")}`),c.description&&d.push("## Description","",c.description),d.push("","Please implement the changes described in this issue. When done, commit and push your changes."),d.join("\n")},async listIssues(a,b){let c=["issue","list","--repo",b.repo,"--limit",String(a.limit??30)];return"closed"===a.state?c.push("--state","closed"):"all"===a.state?c.push("--state","all"):c.push("--state","open"),a.labels&&a.labels.length>0&&c.push("--label",a.labels.join(",")),a.assignee&&c.push("--assignee",a.assignee),JSON.parse(await as(c)).map(a=>({id:String(a.number),title:a.title,description:a.body??"",url:a.url,state:at(a.state,a.stateReason),labels:a.labels.map(a=>a.name),assignee:a.assignees[0]?.login}))},async updateIssue(a,b,c){"closed"===b.state?await ap(["issue","close",a,"--repo",c.repo]):"open"===b.state&&await ap(["issue","reopen",a,"--repo",c.repo]),b.removeLabels&&b.removeLabels.length>0&&await ap(["issue","edit",a,"--repo",c.repo,"--remove-label",b.removeLabels.join(",")]),b.labels&&b.labels.length>0&&await ap(["issue","edit",a,"--repo",c.repo,"--add-label",b.labels.join(",")]),b.assignee&&await ap(["issue","edit",a,"--repo",c.repo,"--add-assignee",b.assignee]),b.comment&&await ap(["issue","comment",a,"--repo",c.repo,"--body",b.comment])},async createIssue(a,b){let c=["issue","create","--repo",b.repo,"--title",a.title,"--body",a.description??""];a.labels&&a.labels.length>0&&c.push("--label",a.labels.join(",")),a.assignee&&c.push("--assignee",a.assignee);let d=await ap(c),e=d.match(/\/issues\/(\d+)/);if(!e)throw Error(`Failed to parse issue URL from gh output: ${d}`);let f=e[1];return this.getIssue(f,b)}}}};var av=c(44708);function aw(a){switch(a){case"completed":return"closed";case"canceled":return"cancelled";case"started":return"in_progress";default:return"open"}}let ax=`
|
|
294
|
-
id
|
|
295
|
-
identifier
|
|
296
|
-
title
|
|
297
|
-
description
|
|
298
|
-
url
|
|
299
|
-
priority
|
|
300
|
-
state { name type }
|
|
301
|
-
labels { nodes { name } }
|
|
302
|
-
assignee { name displayName }
|
|
303
|
-
team { key }
|
|
304
|
-
`;function ay(a){return{name:"linear",async getIssue(b,c){let d=(await a(`query($id: String!) {
|
|
305
|
-
issue(id: $id) {
|
|
306
|
-
${ax}
|
|
307
|
-
}
|
|
308
|
-
}`,{id:b})).issue;return{id:d.identifier,title:d.title,description:d.description??"",url:d.url,state:aw(d.state.type),labels:d.labels.nodes.map(a=>a.name),assignee:d.assignee?.displayName??d.assignee?.name,priority:d.priority}},async isCompleted(b,c){let d=(await a(`query($id: String!) {
|
|
309
|
-
issue(id: $id) {
|
|
310
|
-
state { type }
|
|
311
|
-
}
|
|
312
|
-
}`,{id:b})).issue.state.type;return"completed"===d||"canceled"===d},issueUrl(a,b){let c=b.tracker?.workspaceSlug;return c?`https://linear.app/${c}/issue/${a}`:`https://linear.app/issue/${a}`},issueLabel(a,b){let c=a.match(/\/issue\/([A-Z]+-\d+)/);if(c)return c[1];let d=a.split("/");return d[d.length-1]||a},branchName:(a,b)=>`feat/${a}`,async generatePrompt(a,b){let c=await this.getIssue(a,b),d=[`You are working on Linear ticket ${c.id}: ${c.title}`,`Issue URL: ${c.url}`,""];return c.labels.length>0&&d.push(`Labels: ${c.labels.join(", ")}`),void 0!==c.priority&&d.push(`Priority: ${{0:"No priority",1:"Urgent",2:"High",3:"Normal",4:"Low"}[c.priority]??String(c.priority)}`),c.description&&d.push("## Description","",c.description),d.push("","Please implement the changes described in this ticket. When done, commit and push your changes."),d.join("\n")},async listIssues(b,c){let d={},e={};"closed"===b.state?d.state={type:{in:["completed","canceled"]}}:"all"!==b.state&&(d.state={type:{nin:["completed","canceled"]}}),b.assignee&&(d.assignee={displayName:{eq:b.assignee}}),b.labels&&b.labels.length>0&&(d.labels={name:{in:b.labels}});let f=c.tracker?.teamId;return f&&(d.team={id:{eq:f}}),e.filter=Object.keys(d).length>0?d:void 0,e.first=b.limit??30,(await a(`query($filter: IssueFilter, $first: Int!) {
|
|
313
|
-
issues(filter: $filter, first: $first) {
|
|
314
|
-
nodes {
|
|
315
|
-
${ax}
|
|
316
|
-
}
|
|
317
|
-
}
|
|
318
|
-
}`,e)).issues.nodes.map(a=>({id:a.identifier,title:a.title,description:a.description??"",url:a.url,state:aw(a.state.type),labels:a.labels.nodes.map(a=>a.name),assignee:a.assignee?.displayName??a.assignee?.name,priority:a.priority}))},async updateIssue(b,c,d){let e=await a(`query($id: String!) {
|
|
319
|
-
issue(id: $id) {
|
|
320
|
-
id
|
|
321
|
-
team { id }
|
|
322
|
-
}
|
|
323
|
-
}`,{id:b}),f=e.issue.id,g=e.issue.team.id;if(c.state){let b=await a(`query($teamId: ID!) {
|
|
324
|
-
workflowStates(filter: { team: { id: { eq: $teamId } } }) {
|
|
325
|
-
nodes { id name type }
|
|
326
|
-
}
|
|
327
|
-
}`,{teamId:g}),d="closed"===c.state?"completed":"open"===c.state?"unstarted":"started",e=b.workflowStates.nodes.find(a=>a.type===d);if(!e)throw Error(`No workflow state of type "${d}" found for team ${g}`);await a(`mutation($id: String!, $stateId: String!) {
|
|
328
|
-
issueUpdate(id: $id, input: { stateId: $stateId }) {
|
|
329
|
-
success
|
|
330
|
-
}
|
|
331
|
-
}`,{id:f,stateId:e.id})}if(c.assignee){let b=(await a(`query($filter: UserFilter) {
|
|
332
|
-
users(filter: $filter) {
|
|
333
|
-
nodes { id displayName name }
|
|
334
|
-
}
|
|
335
|
-
}`,{filter:{displayName:{eq:c.assignee}}})).users.nodes[0];b&&await a(`mutation($id: String!, $assigneeId: String!) {
|
|
336
|
-
issueUpdate(id: $id, input: { assigneeId: $assigneeId }) {
|
|
337
|
-
success
|
|
338
|
-
}
|
|
339
|
-
}`,{id:f,assigneeId:b.id})}if(c.labels&&c.labels.length>0){let b=new Set((await a(`query($id: String!) {
|
|
340
|
-
issue(id: $id) {
|
|
341
|
-
labels { nodes { id } }
|
|
342
|
-
}
|
|
343
|
-
}`,{id:f})).issue.labels.nodes.map(a=>a.id)),d=new Map((await a(`query($teamId: ID) {
|
|
344
|
-
issueLabels(filter: { team: { id: { eq: $teamId } } }) {
|
|
345
|
-
nodes { id name }
|
|
346
|
-
}
|
|
347
|
-
}`,{teamId:g})).issueLabels.nodes.map(a=>[a.name,a.id]));for(let a of c.labels){let c=d.get(a);c&&b.add(c)}await a(`mutation($id: String!, $labelIds: [String!]!) {
|
|
348
|
-
issueUpdate(id: $id, input: { labelIds: $labelIds }) {
|
|
349
|
-
success
|
|
350
|
-
}
|
|
351
|
-
}`,{id:f,labelIds:[...b]})}c.comment&&await a(`mutation($issueId: String!, $body: String!) {
|
|
352
|
-
commentCreate(input: { issueId: $issueId, body: $body }) {
|
|
353
|
-
success
|
|
354
|
-
}
|
|
355
|
-
}`,{issueId:f,body:c.comment})},async createIssue(b,c){let d=c.tracker?.teamId;if(!d)throw Error("Linear tracker requires 'teamId' in project tracker config");let e={title:b.title,description:b.description??"",teamId:d};void 0!==b.priority&&(e.priority=b.priority);let f=(await a(`mutation($title: String!, $description: String!, $teamId: String!, $priority: Int) {
|
|
356
|
-
issueCreate(input: {
|
|
357
|
-
title: $title,
|
|
358
|
-
description: $description,
|
|
359
|
-
teamId: $teamId,
|
|
360
|
-
priority: $priority
|
|
361
|
-
}) {
|
|
362
|
-
success
|
|
363
|
-
issue {
|
|
364
|
-
${ax}
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
}`,e)).issueCreate.issue,g={id:f.identifier,title:f.title,description:f.description??"",url:f.url,state:aw(f.state.type),labels:f.labels.nodes.map(a=>a.name),assignee:f.assignee?.displayName??f.assignee?.name,priority:f.priority};if(b.assignee)try{let c=(await a(`query($filter: UserFilter) {
|
|
368
|
-
users(filter: $filter) {
|
|
369
|
-
nodes { id displayName name }
|
|
370
|
-
}
|
|
371
|
-
}`,{filter:{displayName:{eq:b.assignee}}})).users.nodes[0];c&&(await a(`mutation($id: String!, $assigneeId: String!) {
|
|
372
|
-
issueUpdate(id: $id, input: { assigneeId: $assigneeId }) {
|
|
373
|
-
success
|
|
374
|
-
}
|
|
375
|
-
}`,{id:f.id,assigneeId:c.id}),g.assignee=b.assignee)}catch{}if(b.labels&&b.labels.length>0)try{let c=await a(`query($teamId: ID) {
|
|
376
|
-
issueLabels(filter: { team: { id: { eq: $teamId } } }) {
|
|
377
|
-
nodes { id name }
|
|
378
|
-
}
|
|
379
|
-
}`,{teamId:d}),e=new Map(c.issueLabels.nodes.map(a=>[a.name,a.id])),h=[],i=[];for(let a of b.labels){let b=e.get(a);b&&(i.push(b),h.push(a))}i.length>0&&(await a(`mutation($id: String!, $labelIds: [String!]!) {
|
|
380
|
-
issueUpdate(id: $id, input: { labelIds: $labelIds }) {
|
|
381
|
-
success
|
|
382
|
-
}
|
|
383
|
-
}`,{id:f.id,labelIds:i}),g.labels=h)}catch{}return g}}}let az={manifest:{name:"linear",slot:"tracker",description:"Tracker plugin: Linear issue tracker",version:"0.1.0"},create:function(){let a=process.env.COMPOSIO_API_KEY;if(a){let b,c=process.env.COMPOSIO_ENTITY_ID??"default";return ay(async(d,e)=>{let f,g=(await (!b&&(b=(async()=>{try{let{Composio:b}=await Promise.resolve().then(function(){var a=Error("Cannot find module '@composio/core'");throw a.code="MODULE_NOT_FOUND",a});return new b({apiKey:a}).tools}catch(b){let a=b instanceof Error?b.message:String(b);if(a.includes("Cannot find module")||a.includes("Cannot find package")||a.includes("ERR_MODULE_NOT_FOUND"))throw Error("Composio SDK (@composio/core) is not installed. Install it with: pnpm add @composio/core",{cause:b});throw b}})()),b)).execute("LINEAR_RUN_QUERY_OR_MUTATION",{entityId:c,arguments:{query_or_mutation:d,variables:e?JSON.stringify(e):"{}"}}),h=new Promise((a,b)=>{f=setTimeout(()=>{b(Error("Composio Linear API request timed out after 30s"))},3e4)});g.catch(()=>{}),h.catch(()=>{});try{let a=await Promise.race([g,h]);if(!a.successful)throw Error(`Composio Linear API error: ${a.error??"unknown error"}`);if(!a.data)throw Error("Composio Linear API returned no data");return a.data}finally{clearTimeout(f)}})}return ay((a,b)=>{let c=function(){let a=process.env.LINEAR_API_KEY;if(!a)throw Error("LINEAR_API_KEY environment variable is required for the Linear tracker plugin");return a}(),d=JSON.stringify({query:a,variables:b});return new Promise((a,b)=>{let e=new URL("https://api.linear.app/graphql"),f=!1,g=a=>{f||(f=!0,a())},h=(0,av.request)({hostname:e.hostname,path:e.pathname,method:"POST",headers:{"Content-Type":"application/json",Authorization:c,"Content-Length":Buffer.byteLength(d)}},c=>{let d=[];c.on("error",a=>g(()=>b(a))),c.on("data",a=>d.push(a)),c.on("end",()=>{g(()=>{try{let e=Buffer.concat(d).toString("utf-8"),f=c.statusCode??0;if(f<200||f>=300)return void b(Error(`Linear API returned HTTP ${f}: ${e.slice(0,200)}`));let g=JSON.parse(e);if(g.errors&&g.errors.length>0)return void b(Error(`Linear API error: ${g.errors[0].message}`));if(!g.data)return void b(Error("Linear API returned no data"));a(g.data)}catch(a){b(a)}})})});h.setTimeout(3e4,()=>{g(()=>{h.destroy(),b(Error("Linear API request timed out after 30s"))})}),h.on("error",a=>g(()=>b(a))),h.write(d),h.end()})})}},aA=globalThis;function aB(){return aA._aoServices?Promise.resolve(aA._aoServices):(aA._aoServicesInit||(aA._aoServicesInit=aC().catch(a=>{throw aA._aoServicesInit=void 0,a})),aA._aoServicesInit)}async function aC(){let a=(0,d.Z9)(),b=(0,d.R)();b.register(o),b.register(z),b.register(D),b.register(M),b.register(an),b.register(au),b.register(az);let c=(0,d.Qu)({config:a,registry:b}),e=(0,d.C1)({config:a,registry:b,sessionManager:c});e.start(3e4);let f={config:a,registry:b,sessionManager:c,lifecycleManager:e};return aA._aoServices=f,f}let aD="agent:backlog",aE=globalThis;function aF(){aE._aoBacklogStarted||(aE._aoBacklogStarted=!0,aJ(),aE._aoBacklogTimer=setInterval(()=>void aJ(),6e4))}let aG=new Set;async function aH(a,b,c){for(let d of a.filter(a=>"merged"===a.status&&a.issueId&&!aG.has(`${a.projectId}:${a.issueId}`))){let a=`${d.projectId}:${d.issueId}`,e=b.projects[d.projectId];if(!e?.tracker?.plugin){aG.add(a);continue}let f=c.get("tracker",e.tracker.plugin);if(!f?.updateIssue){aG.add(a);continue}let g=d.issueId;if(!g){aG.add(a);continue}try{await f.updateIssue(g,{labels:["merged-unverified"],removeLabels:["agent:backlog","agent:in-progress"],comment:"PR merged. Issue awaiting human verification on staging."},e)}catch(a){console.error(`[backlog] Failed to close issue ${d.issueId}:`,a)}aG.add(a)}}async function aI(a,b){for(let[,c]of Object.entries(a.projects)){let a;if(!c.tracker?.plugin)continue;let d=b.get("tracker",c.tracker.plugin);if(d?.listIssues&&d.updateIssue){try{a=await d.listIssues({state:"open",labels:["agent:done"],limit:20},c)}catch{continue}for(let b of a)try{await d.updateIssue(b.id,{labels:[aD],removeLabels:["agent:done"],comment:"Issue reopened — returning to agent backlog."},c),console.log(`[backlog] Relabeled reopened issue ${b.id} → ${aD}`)}catch(a){console.error(`[backlog] Failed to relabel reopened issue ${b.id}:`,a)}}}}async function aJ(){try{let{config:a,registry:b,sessionManager:c}=await aB(),e=await c.list();await aH(e,a,b),await aI(a,b);let f=Object.entries(a.projects).map(([a,b])=>b.sessionPrefix??a),g=e.filter(b=>!(0,d.tT)(b,a.projects[b.projectId]?.sessionPrefix??b.projectId,f)&&!d.CM.has(b.status)),h=new Set(g.map(a=>a.issueId?.toLowerCase()).filter(a=>!!a)),i=5-g.length;if(i<=0)return;for(let[e,f]of Object.entries(a.projects)){let a;if(i<=0)break;if(!f.tracker?.plugin)continue;let g=b.get("tracker",f.tracker.plugin);if(g?.listIssues){try{a=await g.listIssues({state:"open",labels:[aD],limit:10},f)}catch{continue}for(let b of a){if(i<=0)break;if(!h.has(b.id.toLowerCase()))try{let a=f.decomposer;if(a?.enabled){let h=`${b.title}
|
|
384
|
-
|
|
385
|
-
${b.description}`,j={...d.$J,...a};console.log(`[backlog] Decomposing issue ${b.id}: "${b.title}"`);let k=await (0,d.o)(h,j),l=(0,d.Lg)(k.tree);if(l.length<=1)await c.spawn({projectId:e,issueId:b.id}),i--;else if(j.requireApproval){let a=(0,d.Pp)(k.tree);g.updateIssue&&await g.updateIssue(b.id,{comment:`## Decomposition Plan
|
|
386
|
-
|
|
387
|
-
\`\`\`
|
|
388
|
-
${a}
|
|
389
|
-
\`\`\`
|
|
390
|
-
|
|
391
|
-
${l.length} subtasks identified. Remove \`agent:backlog\` and add \`agent:decompose-approved\` to execute.`,labels:["agent:decompose-pending"],removeLabels:["agent:backlog"]},f),console.log(`[backlog] Posted decomposition plan for ${b.id} (${l.length} subtasks, awaiting approval)`);continue}else for(let a of(console.log(`[backlog] Auto-executing decomposition for ${b.id} (${l.length} subtasks)`),l)){if(i<=0)break;let f=(0,d.A7)(k.tree,a.id);await c.spawn({projectId:e,issueId:b.id,lineage:a.lineage,siblings:f}),i--}}else await c.spawn({projectId:e,issueId:b.id}),i--;h.add(b.id.toLowerCase()),g.updateIssue&&await g.updateIssue(b.id,{labels:["agent:in-progress"],removeLabels:["agent:backlog"],comment:"Claimed by agent orchestrator — session spawned."},f)}catch(a){console.error(`[backlog] Failed to spawn session for issue ${b.id}:`,a)}}}}}catch(a){console.error("[backlog] Poll failed:",a)}}async function aK(){let a=[];try{let{config:b,registry:c}=await aB();for(let[d,e]of Object.entries(b.projects)){if(!e.tracker?.plugin)continue;let b=c.get("tracker",e.tracker.plugin);if(b?.listIssues)try{for(let c of(await b.listIssues({state:"open",labels:[aD],limit:20},e)))a.push({...c,projectId:d})}catch{}}}catch{}return a}async function aL(){let a=[];try{let{config:b,registry:c}=await aB();for(let[d,e]of Object.entries(b.projects)){if(!e.tracker?.plugin)continue;let b=c.get("tracker",e.tracker.plugin);if(b?.listIssues)try{for(let c of(await b.listIssues({state:"open",labels:["merged-unverified"],limit:20},e)))a.push({...c,projectId:d})}catch{}}}catch{}return a}function aM(a,b){return b?.scm?.plugin?a.get("scm",b.scm.plugin):null}}};
|