@aoagents/ao-web 0.3.0 → 0.4.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 +179 -187
- package/.next/app-path-routes-manifest.json +9 -10
- package/.next/build-manifest.json +6 -6
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +34 -34
- package/.next/react-loadable-manifest.json +14 -14
- package/.next/required-server-files.json +3 -3
- 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 +8 -11
- 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 -1
- package/.next/server/app/api/browse-directory/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/filesystem/browse/route.js +1 -1
- package/.next/server/app/api/filesystem/browse/route_client-reference-manifest.js +1 -1
- 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 -1
- package/.next/server/app/api/projects/[id]/route.js.nft.json +1 -1
- package/.next/server/app/api/projects/[id]/route_client-reference-manifest.js +1 -1
- package/.next/server/app/api/projects/reload/route.js +1 -1
- package/.next/server/app/api/projects/reload/route.js.nft.json +1 -1
- package/.next/server/app/api/projects/reload/route_client-reference-manifest.js +1 -1
- 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_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 -1
- package/.next/server/app/api/sessions/patches/route.js.nft.json +1 -1
- package/.next/server/app/api/sessions/patches/route_client-reference-manifest.js +1 -1
- 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/apple-icon.body +0 -0
- 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 +9 -12
- 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/icon.body +0 -0
- 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 -2
- package/.next/server/app/projects/[projectId]/page.js.nft.json +1 -1
- package/.next/server/app/projects/[projectId]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/projects/[projectId]/sessions/[id]/page.js +2 -2
- package/.next/server/app/projects/[projectId]/sessions/[id]/page.js.nft.json +1 -1
- package/.next/server/app/projects/[projectId]/sessions/[id]/page_client-reference-manifest.js +1 -1
- package/.next/server/app/projects/[projectId]/settings/page.js +2 -2
- package/.next/server/app/projects/[projectId]/settings/page.js.nft.json +1 -1
- package/.next/server/app/projects/[projectId]/settings/page_client-reference-manifest.js +1 -1
- 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 -2
- 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 +9 -12
- package/.next/server/app-paths-manifest.json +9 -10
- package/.next/server/chunks/1172.js +1 -1
- package/.next/server/chunks/1271.js +1 -1
- package/.next/server/chunks/1876.js +9 -0
- package/.next/server/chunks/3714.js +1 -1
- package/.next/server/chunks/4520.js +1 -1
- package/.next/server/chunks/7167.js +1 -0
- package/.next/server/chunks/7173.js +9 -0
- package/.next/server/chunks/8539.js +3 -0
- package/.next/server/chunks/9223.js +440 -0
- package/.next/server/chunks/9381.js +658 -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/server-reference-manifest.json +1 -1
- package/.next/static/5nmlY5IOwz-Od3p2SB2hh/_buildManifest.js +1 -0
- package/.next/static/chunks/1383.faf35b62c555f5a1.js +1 -0
- package/.next/static/chunks/3764.ba81c7b8d5b21136.js +1 -0
- package/.next/static/chunks/3780-e20898ff49ddc867.js +1 -0
- package/.next/static/chunks/4465-0c7772f1499dffa4.js +1 -0
- package/.next/static/chunks/5795-b96fd46c8c7344fc.js +1 -0
- package/.next/static/chunks/7008-6e85da85f12f9858.js +1 -0
- package/.next/static/chunks/app/_not-found/page-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/backlog/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/browse-directory/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/filesystem/browse/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/issues/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/observability/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/orchestrators/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/projects/[id]/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/projects/reload/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/projects/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/prs/[id]/merge/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/runtime/terminal/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/kill/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/message/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/remap/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/restore/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/send/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/sessions/patches/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/setup-labels/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/spawn/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/verify/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/api/webhooks/[...slug]/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/apple-icon/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/dev/terminal-test/page-095511c7a110fbc9.js +1 -0
- package/.next/static/chunks/app/error-3ebcf3275d91d60a.js +1 -0
- package/.next/static/chunks/app/global-error-8f082029a4cf6af1.js +1 -0
- package/.next/static/chunks/app/icon/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/icon-192/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/icon-512/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/layout-be776dec5531d47b.js +1 -0
- package/.next/static/chunks/app/loading-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/{not-found-824d5d3c6e296eeb.js → not-found-0eb78483b8277b8d.js} +1 -1
- package/.next/static/chunks/app/orchestrators/page-406e530b0d4ad46f.js +1 -0
- package/.next/static/chunks/app/page-a92f3646b54545b0.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/loading-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/page-d14fdcff4998d3bf.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-96fc04db76c65761.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/settings/page-ce2e904def1bef9c.js +1 -0
- package/.next/static/chunks/app/prs/page-95dbbebb4d372535.js +1 -0
- package/.next/static/chunks/app/sessions/[id]/error-5468aace23fd8872.js +1 -0
- package/.next/static/chunks/app/sessions/[id]/loading-3b8a01e726e988c8.js +1 -0
- package/.next/static/chunks/app/sessions/[id]/{not-found-824d5d3c6e296eeb.js → not-found-0eb78483b8277b8d.js} +1 -1
- package/.next/static/chunks/app/sessions/[id]/page-8ef744531757185e.js +1 -0
- package/.next/static/chunks/app/test-direct/page-ab98dc9b04bacaa5.js +1 -0
- package/.next/static/chunks/{main-app-690acf9d5d2050c9.js → main-app-4b27cdf1baf203ad.js} +1 -1
- package/.next/static/chunks/{webpack-d4ff5ed5e153ca3e.js → webpack-ab12779265bdb8f9.js} +1 -1
- package/.next/static/css/397ea3e60645d3f3.css +1 -0
- package/dist-server/mux-websocket.js +135 -123
- package/dist-server/tmux-utils.js +99 -9
- package/next.config.js +6 -0
- package/package.json +18 -16
- package/.next/server/app/api/events/route.js +0 -9
- package/.next/server/app/api/events/route.js.nft.json +0 -1
- package/.next/server/app/api/events/route_client-reference-manifest.js +0 -1
- package/.next/server/chunks/252.js +0 -11
- package/.next/server/chunks/2810.js +0 -1
- package/.next/server/chunks/3602.js +0 -382
- package/.next/server/chunks/3667.js +0 -277
- package/.next/server/chunks/6172.js +0 -9
- package/.next/server/chunks/8367.js +0 -3
- package/.next/static/chunks/3697.4d6d86c5f0caf73e.js +0 -1
- package/.next/static/chunks/4465-aaba60a6355de914.js +0 -1
- package/.next/static/chunks/6078.47ce88bee96cfaee.js +0 -1
- package/.next/static/chunks/6607-405ce4d15e595f4a.js +0 -1
- package/.next/static/chunks/7008-71ebb186f0549f41.js +0 -1
- package/.next/static/chunks/9331-fcdd652218ac6f68.js +0 -1
- package/.next/static/chunks/app/_not-found/page-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/backlog/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/browse-directory/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/events/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/filesystem/browse/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/issues/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/observability/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/orchestrators/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/projects/[id]/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/projects/reload/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/projects/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/prs/[id]/merge/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/runtime/terminal/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/kill/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/message/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/remap/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/restore/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/send/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/sessions/patches/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/sessions/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/setup-labels/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/spawn/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/verify/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/api/webhooks/[...slug]/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/apple-icon/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/dev/terminal-test/page-5765f0465db56fed.js +0 -1
- package/.next/static/chunks/app/error-670f1d8bf2b6859c.js +0 -1
- package/.next/static/chunks/app/global-error-ca06d2b1be2d4ae0.js +0 -1
- package/.next/static/chunks/app/icon/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/icon-192/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/icon-512/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/layout-ddf79478d9a673bb.js +0 -1
- package/.next/static/chunks/app/loading-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/orchestrators/page-4c190484788aaaa3.js +0 -1
- package/.next/static/chunks/app/page-d3b83ad5f09b6ec7.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/loading-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/page-9f3dfbea006747cf.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-a7090a06948f9a6b.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/settings/page-219df6dcbc6d1107.js +0 -1
- package/.next/static/chunks/app/prs/page-a285e930235a23af.js +0 -1
- package/.next/static/chunks/app/sessions/[id]/error-eb0973907da68a37.js +0 -1
- package/.next/static/chunks/app/sessions/[id]/loading-e2dea9178b4af8db.js +0 -1
- package/.next/static/chunks/app/sessions/[id]/page-98f398b822092218.js +0 -1
- package/.next/static/chunks/app/test-direct/page-f9bff7d7b4dfe728.js +0 -1
- package/.next/static/css/46a7e8e962075e54.css +0 -1
- package/.next/static/css/577ea7f5ad4f0576.css +0 -1
- package/.next/static/media/4cf2300e9c8272f7-s.p.woff2 +0 -0
- package/.next/static/media/558ca1a6aa3cb55e-s.p.woff2 +0 -0
- package/.next/static/media/64d784ea54a4acde-s.woff2 +0 -0
- package/.next/static/media/6d831b18ae5b01dc-s.woff2 +0 -0
- package/.next/static/media/8d697b304b401681-s.woff2 +0 -0
- package/.next/static/media/ac0e76ddaeeb7981-s.woff2 +0 -0
- package/.next/static/media/ba015fad6dcf6784-s.woff2 +0 -0
- package/.next/static/media/edc640959b0c7826-s.woff2 +0 -0
- package/.next/static/media/ff71da380fbe67dd-s.woff2 +0 -0
- package/.next/static/q6yh3n8jgvyI9JIbexzuH/_buildManifest.js +0 -1
- /package/.next/static/{q6yh3n8jgvyI9JIbexzuH → 5nmlY5IOwz-Od3p2SB2hh}/_ssgManifest.js +0 -0
|
@@ -1,277 +0,0 @@
|
|
|
1
|
-
exports.id=3667,exports.ids=[3667],exports.modules={2499:(a,b,c)=>{"use strict";c.d(b,{u3Y:()=>d.u3,U10:()=>d.U1,kw3:()=>d.kw,V1$:()=>d.V1,PES:()=>d.PE,mUH:()=>I,C3x:()=>ck,Agm:()=>d.Ag,D83:()=>d.D8,dtV:()=>A,CMu:()=>d.CM,CK3:()=>d.CK,HrC:()=>bs,Te2:()=>cn,Bmx:()=>cg,Gfg:()=>b0,C1z:()=>cb,RaB:()=>aB,SkT:()=>b1,Qum:()=>bN,My0:()=>u,yAg:()=>cc,ccZ:()=>l,Vo2:()=>ch,NoB:()=>B,oJ6:()=>m,tE3:()=>n,tTz:()=>d.tT,zi:()=>d.zi,Z9L:()=>at,G_c:()=>J,rSb:()=>L,m5Y:()=>W,DD3:()=>d.DD,DkI:()=>bc,Ahw:()=>cf,XIc:()=>by,giR:()=>b2,JyZ:()=>ci,t9S:()=>U,Vtt:()=>O,fzr:()=>bz,J06:()=>ct,kct:()=>bw,cv0:()=>cw,inW:()=>N});var d=c(15407),e=c(77598),f=c(73024),g=c(76760),h=c(48161),i=c(34446),j=c(20642),k=c(89981);function l(a){if(a.length<=4)return a.toLowerCase();let b=a.match(/[A-Z]/g);if(b&&b.length>1)return b.join("").toLowerCase();if(a.includes("-")||a.includes("_")){let b=a.includes("-")?"-":"_";return a.split(b).map(a=>a[0]).join("").toLowerCase()}return a.slice(0,3).toLowerCase()}function m(a){return(0,g.join)(p("~/.agent-orchestrator"),r(a))}function n(a){return(0,g.join)(m(a),"sessions")}function o(a,b,c){return`${r(a)}-${b}-${c}`}function p(a){return a.startsWith("~/")?(0,g.join)((0,h.homedir)(),a.slice(2)):a}function q(a,b){let c,d=(0,g.join)(m(b),".origin");try{c=(0,f.realpathSync)(a)}catch{c=(0,g.resolve)(a)}if((0,f.existsSync)(d))(0,f.readFileSync)(d,"utf-8").trim()!==c&&(0,f.writeFileSync)(d,c,"utf-8");else{let a=m(b);(0,f.mkdirSync)(a,{recursive:!0}),(0,f.writeFileSync)(d,c,"utf-8")}}function r(a){if(!a)throw Error("storageKey is required");return a}function s(a,b){let c=`${a}.tmp.${process.pid}.${Date.now()}`;(0,f.writeFileSync)(c,b,"utf-8"),(0,f.renameSync)(c,a)}function t(a){let b=a.toLowerCase();return"github.com"===b||b.endsWith(".github.com")?"github":"gitlab.com"===b||b.endsWith(".gitlab.com")?"gitlab":"bitbucket.org"===b||b.endsWith(".bitbucket.org")||b.endsWith(".bitbucket.com")?"bitbucket":"unknown"}function u(a){let b=(0,g.join)(a,".git","HEAD");if((0,f.existsSync)(b)){let c=(0,f.readFileSync)(b,"utf-8").trim().match(/^ref: refs\/heads\/(.+)$/);if(c){for(let b of["main","master","next","develop"]){let c=(0,g.join)(a,".git","refs","remotes","origin",b),d=(0,g.join)(a,".git","packed-refs");if((0,f.existsSync)(c)||(0,f.existsSync)(d)&&(0,f.readFileSync)(d,"utf-8").includes(`refs/remotes/origin/${b}`))return b}return c[1]}}return"main"}function v(a,b,c={}){let d=c.timeoutMs??1e4,e=c.staleMs??6e4;(0,f.mkdirSync)((0,g.dirname)(a),{recursive:!0});let h=Date.now()+d,i=null,j=10;for(;null===i;)try{i=(0,f.openSync)(a,"wx")}catch(b){var k;if("EEXIST"!==b.code)throw Error(`Failed to acquire file lock: ${a}`,{cause:b});try{let b=(0,f.statSync)(a);if(Date.now()-b.mtimeMs>e){(0,f.rmSync)(a,{force:!0});continue}}catch{continue}if(Date.now()>h)throw Error(`Timed out waiting for file lock: ${a}`,{cause:b});k=j,Atomics.wait(new Int32Array(new SharedArrayBuffer(4)),0,0,k),j=Math.min(2*j,250)}try{return b()}finally{try{(0,f.closeSync)(i)}catch{}try{(0,f.rmSync)(a,{force:!0})}catch{}}}function w(a){let b,c=a.trim(),d=c.match(/^git@([^:]+):(.+)$/);if(d){let a=d[1].toLowerCase(),b=x(y(d[2]));return`https://${a}/${b}`}let e=c.replace(/^[A-Za-z][A-Za-z0-9+.-]*:\/\//,a=>a.toLowerCase());try{b=new URL(e)}catch{throw Error(`Invalid origin URL: ${a}`)}let f=b.hostname.toLowerCase(),g=x(y(b.pathname));return`https://${f}${g}`}function x(a){return a.replace(/\.git$/i,"")}function y(a){return"/"===a?"":a.replace(/\/+$/,"")}function z(a){return`${a}.lock`}class A extends Error{constructor(a,b,c){super(`Project "${b}" already owns storage key "${a}". Refusing to register "${c}" against the same repo slice without confirmation.`),this.storageKey=a,this.existingProjectId=b,this.projectId=c,this.name="StorageKeyCollisionError"}}function B(){if(process.env.AO_GLOBAL_CONFIG)return(0,g.resolve)(process.env.AO_GLOBAL_CONFIG);let a=process.env.XDG_CONFIG_HOME;return a?(0,g.join)(a,"agent-orchestrator","config.yaml"):(0,g.join)((0,h.homedir)(),".agent-orchestrator","config.yaml")}let C=k.Ik({owner:k.Yj(),name:k.Yj(),platform:k.k5(["github","gitlab","bitbucket"]),originUrl:k.Yj()}),D=new Set(["projectId","path","storageKey","repo","defaultBranch","source","registeredAt","displayName","sessionPrefix"]),E=["agent-orchestrator.yaml","agent-orchestrator.yml"],F=new Set(["repo","defaultBranch","originUrl","projectId","path","storageKey"]),G=k.Ik({projectId:k.Yj().optional(),path:k.Yj(),storageKey:k.Yj().optional(),repo:C.optional(),defaultBranch:k.Yj().optional(),source:k.Yj().optional(),registeredAt:k.ai().optional(),displayName:k.Yj().optional(),sessionPrefix:k.Yj().optional()}),H=k.Ik({port:k.ai().default(3e3),terminalPort:k.ai().optional(),directTerminalPort:k.ai().optional(),readyThresholdMs:k.ai().nonnegative().default(3e5),defaults:k.Ik({runtime:k.Yj().default("tmux"),agent:k.Yj().default("claude-code"),workspace:k.Yj().default("worktree"),notifiers:k.YO(k.Yj()).default(["composio","desktop"]),orchestrator:k.Ik({agent:k.Yj().optional()}).optional(),worker:k.Ik({agent:k.Yj().optional()}).optional()}).default({}),projects:k.g1(G).default({}),projectOrder:k.YO(k.Yj()).optional(),notifiers:k.g1(k.Ik({plugin:k.Yj()}).passthrough()).default({}),notificationRouting:k.g1(k.YO(k.Yj())).default({urgent:["desktop","composio"],action:["desktop","composio"],warning:["composio"],info:["composio"]}),reactions:k.g1(k.Ik({}).passthrough()).default({})}).passthrough(),I=k.Ik({repo:k.Yj().optional(),defaultBranch:k.Yj().optional(),runtime:k.Yj().optional(),agent:k.Yj().optional(),workspace:k.Yj().optional(),tracker:k.Ik({plugin:k.Yj()}).passthrough().optional(),scm:k.Ik({plugin:k.Yj(),webhook:k.Ik({enabled:k.zM().optional(),path:k.Yj().optional(),secretEnvVar:k.Yj().optional(),signatureHeader:k.Yj().optional(),eventHeader:k.Yj().optional(),deliveryHeader:k.Yj().optional(),maxBodyBytes:k.ai().optional()}).optional()}).passthrough().optional(),symlinks:k.YO(k.Yj()).optional(),postCreate:k.YO(k.Yj()).optional(),agentConfig:k.Ik({permissions:k.k5(["permissionless","default","auto-edit","suggest","skip"]).optional(),model:k.Yj().optional(),orchestratorModel:k.Yj().optional()}).passthrough().optional(),orchestrator:k.Ik({agent:k.Yj().optional(),agentConfig:k.Ik({}).passthrough().optional()}).optional(),worker:k.Ik({agent:k.Yj().optional(),agentConfig:k.Ik({}).passthrough().optional()}).optional(),reactions:k.g1(k.Ik({}).passthrough()).optional(),agentRules:k.Yj().optional(),agentRulesFile:k.Yj().optional(),orchestratorRules:k.Yj().optional(),orchestratorSessionStrategy:k.k5(["reuse","delete","ignore","delete-new","ignore-new","kill-previous"]).optional(),opencodeIssueSessionStrategy:k.k5(["reuse","delete","ignore"]).optional(),decomposer:k.Ik({}).passthrough().optional()}).passthrough();function J(a,b={}){let c=a??B();if(!(0,f.existsSync)(c))return null;let{parsed:e,migrationSummary:i}=function(a,b){let c=Z(a);if(!c)return{parsed:null,migrationSummary:null};if(!Y(c).changed)return{parsed:c,migrationSummary:null};let d=null,e=()=>{let b=Z(a);if(!b){c=null;return}let e=Y(b);c=b,e.changed&&(d=function(a){if(0===a.strippedProjects.length)return"[ao] migrated legacy project registry fields in global config";let b=a.strippedProjects.reduce((a,b)=>a+b.strippedFieldCount,0),c=a.strippedProjects.map(a=>`${a.projectId} (${a.strippedFieldCount})`).join(", ");return`[ao] stripped ${b} legacy project registry fields from ${a.strippedProjects.length} project${1===a.strippedProjects.length?"":"s"}: ${c}`}(e),K(H.parse(b),a))};return b.alreadyLocked?e():v(z(a),e),{parsed:c,migrationSummary:d}}(c,b);if(!e)return null;i&&console.info(i);let j=H.parse(e);for(let[a,b]of Object.entries(j.projects))b.path=function(a,b){if("~"===b)return(0,h.homedir)();if(b.startsWith("~/")){let c=(0,h.homedir)(),e=(0,g.resolve)(c,b.slice(2));if(!function(a,b){let c=(0,g.relative)(a,b);return""===c||!c.startsWith("..")&&!c.startsWith(`..${g.sep}`)}(c,e))throw new d.c5(a,`Project path "${b}" escapes the home directory and cannot be loaded from the global registry.`);return e}return(0,g.resolve)(b)}(a,b.path);return j}function K(a,b){let c=b??B(),d=(0,g.dirname)(c);(0,f.mkdirSync)(d,{recursive:!0}),s(c,(0,i.As)(a,{indent:2}))}function L(a){for(let b of E.map(b=>(0,g.join)(a,b))){let a;if((0,f.existsSync)(b)){try{let c=(0,f.readFileSync)(b,"utf-8");a=(0,i.qg)(c)}catch(a){return{kind:"malformed",path:b,error:`Failed to parse local config at ${b}: ${a instanceof Error?a.message:String(a)}`}}if(!a||"object"!=typeof a)return{kind:"invalid",path:b,error:`Local config at ${b} must parse to an object`};if("projects"in a)return{kind:"old-format",path:b,error:`Local config at ${b} still uses a wrapped projects: format`};try{return{kind:"loaded",path:b,config:I.parse(a)}}catch(a){return{kind:"invalid",path:b,error:`Local config at ${b} failed validation: ${a instanceof Error?a.message:String(a)}`}}}}return{kind:"missing"}}function M(a){let b={...a};for(let a of F)Reflect.deleteProperty(b,a);return b}function N(a,b,c=function(a){for(let b of E){let c=(0,g.join)(a,b);if((0,f.existsSync)(c))return c}return(0,g.join)(a,E[0])}(a)){(0,f.mkdirSync)((0,g.dirname)(c),{recursive:!0});let d=I.parse(M(b));return s(c,(0,i.As)(d,{indent:2})),c}function O(a,b){let c=L(b);if("old-format"!==c.kind||!c.path)throw Error(`No wrapped local config found for project "${a}" at ${b}`);let d=c.path,e=(0,f.readFileSync)(d,"utf-8"),g=(0,i.qg)(e);if(!g||"object"!=typeof g||!V(g))throw Error(`Local config at ${d} is not a wrapped old-format config.`);let h=(g.projects??{})[a];if(!h||"object"!=typeof h)throw Error(`Wrapped local config at ${d} does not contain project "${a}".`);let{name:j,path:k,sessionPrefix:l,storageKey:m,originUrl:n,projectId:o,source:p,registeredAt:q,displayName:r,...s}=h;N(b,s,d)}function P(a){let b=(0,g.resolve)(a);for(;;){if((0,f.existsSync)((0,g.join)(b,".git")))return b;let c=(0,g.dirname)(b);if(c===b)return(0,g.resolve)(a);b=c}}function Q(a,b){let c=P(a),d=void 0!==b?b:function(a){let b=function(a){let b=(0,g.join)(a,".git");if(!(0,f.existsSync)(b))return null;if((0,f.statSync)(b).isDirectory()){let a=(0,g.join)(b,"config");return(0,f.existsSync)(a)?a:null}let c=(0,f.readFileSync)(b,"utf-8").trim().match(/^gitdir:\s*(.+)$/i);if(!c)return null;let d=(0,g.resolve)(a,c[1]),e=(0,g.join)(d,"config");if((0,f.existsSync)(e))return e;let h=(0,g.join)(d,"commondir");if(!(0,f.existsSync)(h))return null;let i=(0,g.resolve)(d,(0,f.readFileSync)(h,"utf-8").trim()),j=(0,g.join)(i,"config");return(0,f.existsSync)(j)?j:null}(P(a));if(!b)return null;let c=(0,f.readFileSync)(b,"utf-8").split(/\r?\n/),d=!1;for(let a of c){let b=a.match(/^\s*\[(.+)\]\s*$/);if(b){d='remote "origin"'===b[1];continue}if(!d)continue;let c=a.match(/^\s*url\s*=\s*(.+)\s*$/);if(c?.[1])return c[1].trim()}return null}(a),h=null===d?null:w(d);return{gitRoot:c,originUrl:h,storageKey:function({originUrl:a,gitRoot:b,projectPath:c}){let d=null!==a?w(a):`local://${(0,g.resolve)(b)}`,f=function(a,b){let c=(0,g.relative)((0,g.resolve)(a),(0,g.resolve)(b));if(""===c||"."===c)return"";let d=c.split(g.sep);if(".."===d[0])throw Error(`projectPath ${b} is not within gitRoot ${a}`);return d.join("/")}(b,c),h=`${d}#${f}`;return(0,e.createHash)("sha256").update(h).digest("hex").slice(0,12)}({originUrl:h,gitRoot:c,projectPath:a})}}function R(a){if(!a)return;let b=w(a);if(b.startsWith("https://"))try{let a=new URL(b),c=a.pathname.split("/").filter(Boolean);if(c.length<2)return;let d=c[c.length-1],e=c.slice(0,-1).join("/"),f=t(a.host);if("unknown"===f)return;return{owner:e,name:d,platform:f,originUrl:b}}catch{return}}function S(a,b,c){for(let[d,e]of Object.entries(a.projects))if(d!==c&&e.storageKey===b)return d;return null}function T(a,b){if((0,f.existsSync)(a)&&a!==b){if((0,f.existsSync)(b))throw Error(`Cannot move storage directory to ${b}: destination already exists`);(0,f.mkdirSync)((0,g.dirname)(b),{recursive:!0}),(0,f.renameSync)(a,b)}}function U(a,b,c,d,e,h){let i="string"==typeof e?{}:e??{},j="string"==typeof e?e:h??B(),k=(0,g.resolve)(c),m=(0,f.realpathSync)((0,g.resolve)(c)),n=Q(m);v(z(j),()=>{let c=J(j,{alreadyLocked:!0})??X(),e=c.projects[a];if(e?.path&&(0,g.resolve)(e.path)!==m)throw Error(`Project id "${a}" is already registered for "${e.path}". Choose a different configProjectKey to add "${m}" as a separate project.`);for(let[b,d]of Object.entries(c.projects))if(b!==a&&d.path===m&&!i.allowStorageKeyReuse)throw new A(d.storageKey??n.storageKey,b,a);let f=e?.storageKey??n.storageKey,h=S(c,f,a);if(h&&!i.allowStorageKeyReuse)throw new A(f,h,a);let o=e?.repo??R(n.originUrl),p=e?.defaultBranch??d?.defaultBranch??"main",q=e?.sessionPrefix??d?.sessionPrefix??l((0,g.basename)(k)),r=e?.source??(o?"ao-project-add":"local"),s=e?.registeredAt??Math.floor(Date.now()/1e3),t=function(a,b,c){for(let[d,e]of Object.entries(a.projects))if(d!==c&&(e.sessionPrefix??l((0,g.basename)(e.path??d)))===b)return d;return null}(c,q,a);if(t)throw Error(`Duplicate session prefix detected: "${q}"
|
|
2
|
-
Projects "${t}" and "${a}" would generate the same prefix.
|
|
3
|
-
|
|
4
|
-
Choose a different configProjectKey or add an explicit sessionPrefix before registering the project.`);c.projects[a]={projectId:a,path:m,storageKey:f,...o?{repo:o}:{},defaultBranch:p,source:r,registeredAt:s,displayName:b,sessionPrefix:q},K(c,j)})}function V(a){return!!a&&"object"==typeof a&&"projects"in a&&"object"==typeof a.projects&&Object.values(a.projects).some(a=>null!=a&&"object"==typeof a&&"path"in a)}function W(a,b){let c=b??B(),d=(0,f.readFileSync)(a,"utf-8"),j=(0,i.qg)(d);if(!V(j))throw Error(`File at ${a} is not an old-format config.`);let k=j.projects??{},l=X();for(let[b,c]of("number"==typeof j.port&&(l.port=j.port),null!==j.terminalPort&&void 0!==j.terminalPort&&(l.terminalPort=j.terminalPort),null!==j.directTerminalPort&&void 0!==j.directTerminalPort&&(l.directTerminalPort=j.directTerminalPort),null!==j.readyThresholdMs&&void 0!==j.readyThresholdMs&&(l.readyThresholdMs=j.readyThresholdMs),null!==j.defaults&&void 0!==j.defaults&&(l.defaults=j.defaults),null!==j.notifiers&&void 0!==j.notifiers&&(l.notifiers=j.notifiers),null!==j.notificationRouting&&void 0!==j.notificationRouting&&(l.notificationRouting=j.notificationRouting),null!==j.reactions&&void 0!==j.reactions&&(l.reactions=j.reactions),Object.entries(k))){if(!c.path)continue;let d="string"==typeof c.path&&c.path.startsWith("~/")?(0,g.join)((0,h.homedir)(),c.path.slice(2)):c.path,i="string"==typeof c.storageKey?c.storageKey:function(a,b){let c=(0,g.dirname)((0,f.realpathSync)(a)),d=(0,e.createHash)("sha256").update(c).digest("hex").slice(0,12);return`${d}-${(0,g.basename)(b)}`}(a,d),j="string"==typeof c.originUrl?R(c.originUrl):void 0;l.projects[b]={projectId:b,path:d,storageKey:i,...j?{repo:j}:{},..."string"==typeof c.defaultBranch?{defaultBranch:c.defaultBranch}:{},source:"migrated",registeredAt:Math.floor(Date.now()/1e3),displayName:c.name??b,..."string"==typeof c.sessionPrefix?{sessionPrefix:c.sessionPrefix}:{}}}for(let[b,d]of(K(l,c),Object.entries(k))){if(!d.path)continue;let b="string"==typeof d.path&&d.path.startsWith("~/")?(0,g.join)((0,h.homedir)(),d.path.slice(2)):d.path,{name:c,path:e,sessionPrefix:f,storageKey:j,originUrl:k,...l}=d;s((0,g.join)(b,(0,g.basename)(a)),(0,i.As)(l,{indent:2}))}return c}function X(){return{port:3e3,readyThresholdMs:3e5,defaults:{runtime:"tmux",agent:"claude-code",workspace:"worktree",notifiers:["composio","desktop"]},projects:{},notifiers:{},notificationRouting:{urgent:["desktop","composio"],action:["desktop","composio"],warning:["composio"],info:["composio"]},reactions:{}}}function Y(a){let b=a.projects;if(!b||"object"!=typeof b)return{changed:!1,strippedProjects:[]};let c=!1,d=[];for(let[a,e]of Object.entries(b)){if(!e||"object"!=typeof e)continue;let b=e.projectId!==a||"string"==typeof e.name&&"string"!=typeof e.displayName||"string"==typeof e.repo||"string"==typeof e.originUrl&&void 0===e.repo,f=function(a,b){let c=0;if(b.projectId=a,"string"==typeof b.name&&"string"!=typeof b.displayName&&(b.displayName=b.name),"string"==typeof b.originUrl&&void 0===b.repo){let a=R(b.originUrl);a&&(b.repo=a)}if("string"==typeof b.repo){let a=function(a){if("string"!=typeof a)return;let b=a.trim();if(!b)return;if(b.startsWith("http://")||b.startsWith("https://")||b.startsWith("git@"))return R(b);let c=b.split("/").filter(Boolean);if(2===c.length)return R(`https://github.com/${c[0]}/${c[1]}`);if(c.length>=3&&c[0].includes(".")){let a=c[0];if("unknown"===t(a))return;let b=c.slice(1,-1).join("/"),d=c[c.length-1];return R(`https://${a}/${b}/${d}`)}}(b.repo);a?b.repo=a:delete b.repo}for(let a of(delete b.name,delete b.originUrl,Object.keys(b)))D.has(a)||(Reflect.deleteProperty(b,a),c+=1);return{strippedFieldCount:c}}(a,e);f.strippedFieldCount>0&&d.push({projectId:a,strippedFieldCount:f.strippedFieldCount}),(f.strippedFieldCount>0||b)&&(c=!0)}return{changed:c,strippedProjects:d}}function Z(a){let b=(0,f.readFileSync)(a,"utf-8"),c=(0,i.qg)(b);return c&&"object"==typeof c?c:null}function $(a,b,c){let h=function(a,b,c){let h=b.projects[a];if(!h||!h.path)return null;let i=function(a,b,c,d=!1){let h=b.projects[a];if(!h?.path)return null;if("string"==typeof h.storageKey)return h;let i=Q(h.path).storageKey,j=S(b,i,a);if(j)throw new A(i,j,a);let k=c??B(),l=()=>{var c,d;let i=J(k,{alreadyLocked:!0})??b,j=i.projects[a];if(!j?.path)return;let l="string"==typeof j.storageKey?j.storageKey:(c=j.path,(0,e.createHash)("sha256").update((0,g.resolve)(c)).digest("hex").slice(0,12)),n=Q(j.path,"string"==typeof j.repo?.originUrl?j.repo.originUrl:void 0),o=S(i,n.storageKey,a);if(o)throw new A(n.storageKey,o,a);let q=m(n.storageKey),r=(d=j.path,(0,g.join)(p("~/.agent-orchestrator"),`${l}-${(0,g.basename)(d)}`)),s=m(l);l!==n.storageKey?(0,f.existsSync)(s)?T(s,q):(0,f.existsSync)(r)&&T(r,q):(0,f.existsSync)(r)&&r!==q&&!(0,f.existsSync)(q)&&T(r,q),j.projectId=a,j.storageKey=n.storageKey,j.repo||(j.repo=R(n.originUrl)),K(i,k),h.storageKey=j.storageKey,h.repo=j.repo,console.info(`[ao] migrated storage identity for "${a}" to "${j.storageKey}" (${j.repo?.originUrl??`local://${(0,g.resolve)(n.gitRoot)}`})`)};return d?l():v(z(k),l),h}(a,b,c);if(!i)return null;let j=i.path,k=i.displayName??a,n=i.storageKey,o="string"==typeof i.sessionPrefix&&i.sessionPrefix.length>0?i.sessionPrefix:l((0,g.basename)(j)),q="string"==typeof i.defaultBranch&&i.defaultBranch.length>0?i.defaultBranch:"main",r=i.repo&&"string"==typeof i.repo.owner&&"string"==typeof i.repo.name?`${i.repo.owner}/${i.repo.name}`:void 0,s={name:k,path:j,storageKey:n,...r?{repo:r}:{},...i.repo?.originUrl?{originUrl:i.repo.originUrl}:{},sessionPrefix:o,defaultBranch:q},t=c=>{let e={...c},f=b.defaults??{};void 0===e.runtime&&(e.runtime=f.runtime),void 0===e.agent&&(e.agent=f.agent),void 0===e.workspace&&(e.workspace=f.workspace);let g={...f.orchestrator??{},...e.orchestrator??{}};Object.keys(g).length>0&&(e.orchestrator=g);let h={...f.worker??{},...e.worker??{}};Object.keys(h).length>0&&(e.worker=h);let i=["runtime","agent","workspace"].filter(a=>{let b=e[a];return"string"!=typeof b||0===b.length});if(i.length>0)throw new d.c5(a,`Project "${a}" is missing required behavior fields with no defaults: ${i.join(", ")}`);return e},u=L(j);if("loaded"===u.kind&&u.config)return{...t(M(u.config)),...s};let w="missing"!==u.kind?u.error??"Failed to load local config":void 0;return{...w?{}:t({}),...s,...w?{resolveError:w}:{}}}(a,b,c);if(!h)throw new d.c5(a,`Unknown project: ${a}`);if("string"==typeof h.resolveError&&h.resolveError.length>0)throw new d.c5(a,h.resolveError);return h}function _(a,b,c){a.plugin||a.package||a.path||b.addIssue({code:j.eq.custom,message:`${c} config requires either 'plugin' (for built-ins) or 'package'/'path' (for external plugins)`}),a.package&&a.path&&b.addIssue({code:j.eq.custom,message:`${c} config cannot have both 'package' and 'path' - use one or the other`})}let aa=k.Ik({auto:k.zM().default(!0),action:k.k5(["send-to-agent","notify","auto-merge"]).default("notify"),message:k.Yj().optional(),priority:k.k5(["urgent","action","warning","info"]).optional(),retries:k.ai().optional(),escalateAfter:k.KC([k.ai(),k.Yj()]).optional(),threshold:k.Yj().optional(),includeSummary:k.zM().optional()}),ab=k.Ik({plugin:k.Yj().optional(),package:k.Yj().optional(),path:k.Yj().optional()}).passthrough().superRefine((a,b)=>_(a,b,"Tracker")),ac=k.Ik({plugin:k.Yj().optional(),package:k.Yj().optional(),path:k.Yj().optional(),webhook:k.Ik({enabled:k.zM().default(!0),path:k.Yj().optional(),secretEnvVar:k.Yj().optional(),signatureHeader:k.Yj().optional(),eventHeader:k.Yj().optional(),deliveryHeader:k.Yj().optional(),maxBodyBytes:k.ai().int().positive().optional()}).optional()}).passthrough().superRefine((a,b)=>_(a,b,"SCM")),ad=k.Ik({plugin:k.Yj().optional(),package:k.Yj().optional(),path:k.Yj().optional()}).passthrough().superRefine((a,b)=>_(a,b,"Notifier")),ae=k.k5(["permissionless","default","auto-edit","suggest","skip"]).default("permissionless").transform(a=>"skip"===a?"permissionless":a),af=k.Ik({permissions:ae,model:k.Yj().optional(),orchestratorModel:k.Yj().optional(),opencodeSessionId:k.Yj().optional()}).passthrough(),ag=k.Ik({permissions:k.KC([k.k5(["permissionless","default","auto-edit","suggest"]),k.eu("skip")]).optional(),model:k.Yj().optional(),orchestratorModel:k.Yj().optional(),opencodeSessionId:k.Yj().optional()}).passthrough(),ah=k.Ik({agent:k.Yj().optional()}).optional(),ai=k.Ik({agent:k.Yj().optional(),agentConfig:ag.optional()}).optional(),aj=k.Ik({name:k.Yj().optional(),repo:k.Yj().optional(),path:k.Yj(),defaultBranch:k.Yj().default("main"),sessionPrefix:k.Yj().regex(/^[a-zA-Z0-9_-]+$/,"sessionPrefix must match [a-zA-Z0-9_-]+").optional(),storageKey:k.Yj().optional(),originUrl:k.Yj().optional(),resolveError:k.Yj().optional(),runtime:k.Yj().optional(),agent:k.Yj().optional(),workspace:k.Yj().optional(),tracker:ab.optional(),scm:ac.optional(),symlinks:k.YO(k.Yj()).optional(),postCreate:k.YO(k.Yj()).optional(),agentConfig:af.default({}),orchestrator:ai,worker:ai,reactions:k.g1(aa.partial()).optional(),agentRules:k.Yj().optional(),agentRulesFile:k.Yj().optional(),orchestratorRules:k.Yj().optional(),orchestratorSessionStrategy:k.k5(["reuse","delete","ignore","delete-new","ignore-new","kill-previous"]).optional(),opencodeIssueSessionStrategy:k.k5(["reuse","delete","ignore"]).optional()}),ak=k.Ik({runtime:k.Yj().default("tmux"),agent:k.Yj().default("claude-code"),workspace:k.Yj().default("worktree"),notifiers:k.YO(k.Yj()).default([]),orchestrator:ah,worker:ah}),al=k.Ik({name:k.Yj(),source:k.k5(["registry","npm","local"]),package:k.Yj().optional(),version:k.Yj().optional(),path:k.Yj().optional(),enabled:k.zM().default(!0)}).superRefine((a,b)=>{"local"!==a.source||a.path||b.addIssue({code:j.eq.custom,path:["path"],message:"Local plugins require a path"}),"registry"!==a.source&&"npm"!==a.source||a.package||b.addIssue({code:j.eq.custom,path:["package"],message:"Registry and npm plugins require a package name"})}),am=k.Ik({preventIdleSleep:k.zM().default("darwin"===process.platform)}).default({}),an=k.Ik({attentionZones:k.k5(["simple","detailed"]).default("simple")}),ao=k.Ik({autoCleanupOnMerge:k.zM().default(!0),mergeCleanupIdleGraceMs:k.ai().nonnegative().refine(a=>0===a||a>=1e4,{message:"mergeCleanupIdleGraceMs is in milliseconds; values between 1 and 9999 are likely a units mistake (use 0 to disable the gate, or e.g. 10000 for 10s, 300000 for 5min)"}).default(3e5)}).default({}),ap=k.Ik({port:k.ai().default(3e3),terminalPort:k.ai().optional(),directTerminalPort:k.ai().optional(),readyThresholdMs:k.ai().nonnegative().default(3e5),power:am,lifecycle:ao,defaults:ak.default({}),plugins:k.YO(al).default([]),dashboard:an.optional(),projects:k.g1(k.Yj().regex(/^[a-zA-Z0-9_-]+$/,"Project ID must match [a-zA-Z0-9_-]+ (no dots, slashes, or special characters)"),aj),notifiers:k.g1(ad).default({}),notificationRouting:k.g1(k.YO(k.Yj())).default({}),reactions:k.g1(aa).default({})});function aq(a){return a.startsWith("~/")?(0,g.join)((0,h.homedir)(),a.slice(2)):a}function ar(a,b){if(a){let b=a.split("/"),c=b[b.length-1]??a,d=c.match(/^ao-plugin-(?:runtime|agent|workspace|tracker|scm|notifier|terminal)-(.+)$/);return d?.[1]?d[1]:c}if(b){let a=b.split("/").filter(a=>a&&"."!==a&&".."!==a);return a[a.length-1]??b}return"unknown"}function as(a,b,c,d){if(!a.package&&!a.path)return null;a.path&&(a.path=aq(a.path));let e=a.plugin;return a.plugin||(a.plugin=ar(a.package,a.path)),{source:b,location:c,slot:d,package:a.package,path:a.path,expectedPluginName:e}}function at(a){let b=a??function(a){if(process.env.AO_CONFIG_PATH){let a=(0,g.resolve)(process.env.AO_CONFIG_PATH);if((0,f.existsSync)(a))return a}let b=a=>{for(let b of["agent-orchestrator.yaml","agent-orchestrator.yml"]){let c=(0,g.resolve)(a,b);if((0,f.existsSync)(c))return c}let c=(0,g.resolve)(a,"..");return c===a?null:b(c)},c=b(process.cwd());if(c)return c;let d=B();if((0,f.existsSync)(d))return d;for(let a of[(0,g.resolve)((0,h.homedir)(),".agent-orchestrator.yaml"),(0,g.resolve)((0,h.homedir)(),".agent-orchestrator.yml"),(0,g.resolve)((0,h.homedir)(),".config","agent-orchestrator","config.yaml")])if((0,f.existsSync)(a))return a;return null}();if(!b)throw new d.kw;let c=(0,f.readFileSync)(b,"utf-8"),j=(0,i.qg)(c),k=function(a){if(!(0,f.existsSync)(a))return"missing";let b=(0,f.readFileSync)(a,"utf-8"),c=(0,i.qg)(b);return c&&"object"==typeof c&&"projects"in c?"wrapped":"flat-or-nonobject"}(b),l=(0,g.resolve)(b)===(0,g.resolve)(B()),m=l||"wrapped"!==k?j:j&&"object"==typeof j&&"projects"in j&&j.projects&&"object"==typeof j.projects?{...j,projects:Object.fromEntries(Object.entries(j.projects).map(([a,c])=>c&&"object"==typeof c?"string"==typeof c.storageKey||"string"!=typeof c.path?[a,c]:[a,{...c,storageKey:function(a,b){let c=(0,f.realpathSync)(a),d=(0,g.dirname)(c),h=(0,e.createHash)("sha256").update(d).digest("hex").slice(0,12);return`${h}-${(0,g.basename)(b)}`}(b,c.path)}]:[a,c]))}:j,n=l?function(a){let b=J(a);if(!b)return null;let c={},e={};for(let[f,g]of Object.entries(b.projects))try{c[f]=$(f,b,a)}catch(a){if(!(a instanceof d.c5))throw a;e[f]={projectId:f,path:g.path,storageKey:g.storageKey??"",resolveError:a.message}}return{...au({port:b.port,terminalPort:b.terminalPort,directTerminalPort:b.directTerminalPort,readyThresholdMs:b.readyThresholdMs,defaults:b.defaults,notifiers:b.notifiers,notificationRouting:b.notificationRouting,reactions:b.reactions,projects:c}),degradedProjects:e}}(b)??au(m):"wrapped"===k?au(m):function(a,b){let c=B(),d=J(c);if(!d)return null;let e=(()=>{try{return(0,f.realpathSync)((0,g.resolve)((0,g.dirname)(a)))}catch{return(0,g.resolve)((0,g.dirname)(a))}})(),h=Object.entries(d.projects).find(([,a])=>{if("string"!=typeof a.path)return!1;try{return(0,f.realpathSync)((0,g.resolve)(a.path))===e}catch{return(0,g.resolve)(a.path)===e}});if(!h)return null;let[i]=h,j=$(i,d,c);return{...au({port:d.port,terminalPort:d.terminalPort,directTerminalPort:d.directTerminalPort,readyThresholdMs:d.readyThresholdMs,defaults:d.defaults,notifiers:d.notifiers,notificationRouting:d.notificationRouting,reactions:d.reactions,projects:{[i]:{...j}}}),degradedProjects:{}}}(b)??au(m);return n.configPath=b,"degradedProjects"in n||(n.degradedProjects={}),n}function au(a){var b;let c=ap.parse(a);(b=c=function(a){for(let[b,c]of Object.entries(a.projects)){c.name||(c.name=b),c.sessionPrefix||(c.sessionPrefix=l((0,g.basename)(c.path)));let a=function(a){if("gitlab"===a.scm?.plugin)return"gitlab";let b=a.scm?.host;if("string"==typeof b&&b.toLowerCase().includes("gitlab")||"gitlab"===a.tracker?.plugin)return"gitlab";let c=a.tracker?.host;return"string"==typeof c&&c.toLowerCase().includes("gitlab")?"gitlab":"github"}(c);!c.scm&&c.repo?.includes("/")&&(c.scm={plugin:a}),!c.tracker&&c.repo?.includes("/")&&(c.tracker={plugin:a})}return a}(c=function(a){for(let b of Object.values(a.projects))b.path=aq(b.path);for(let b of a.plugins??[])b.path&&(b.path=aq(b.path));return a}(c))).reactions={"pr-closed":{auto:!0,action:"notify",priority:"action",message:"A PR was closed without merging. Decide whether to learn from the closure, resume the work, or terminate the session."},"ci-failed":{auto:!0,action:"send-to-agent",message:"CI is failing on your PR. Run `gh pr checks` to see the failures, fix them, and push.",retries:2,escalateAfter:2},"changes-requested":{auto:!0,action:"send-to-agent",message:"There are review comments on your PR. Check with `gh pr view --comments` and `gh api` for inline comments. Address each one, push fixes, and reply.",escalateAfter:"30m"},"bugbot-comments":{auto:!0,action:"send-to-agent",message:"Automated review comments found on your PR. Fix the issues flagged by the bot.",escalateAfter:"30m"},"merge-conflicts":{auto:!0,action:"send-to-agent",message:"Your branch has merge conflicts. Rebase on the default branch and resolve them.",escalateAfter:"15m"},"approved-and-green":{auto:!1,action:"notify",priority:"action",message:"PR is ready to merge"},"agent-idle":{auto:!0,action:"send-to-agent",message:"You appear to be idle. If your task is not complete, continue working — write the code, commit, push, and create a PR. If you are blocked, explain what is blocking you.",retries:2,escalateAfter:"15m"},"agent-stuck":{auto:!0,action:"notify",priority:"urgent",threshold:"10m"},"agent-needs-input":{auto:!0,action:"notify",priority:"urgent"},"agent-exited":{auto:!0,action:"notify",priority:"urgent"},"all-complete":{auto:!0,action:"notify",priority:"info",includeSummary:!0},...b.reactions};let d=function(a){let b=[];for(let[c,d]of Object.entries(a.projects)){if(d.tracker){let a=as(d.tracker,`projects.${c}.tracker`,{kind:"project",projectId:c,configType:"tracker"},"tracker");a&&b.push(a)}if(d.scm){let a=as(d.scm,`projects.${c}.scm`,{kind:"project",projectId:c,configType:"scm"},"scm");a&&b.push(a)}}for(let[c,d]of Object.entries(a.notifiers??{}))if(d){let a=as(d,`notifiers.${c}`,{kind:"notifier",notifierId:c},"notifier");a&&b.push(a)}return b}(c=b);return d.length>0&&(c.plugins=function(a,b){let c=[...a??[]],d=new Set;for(let a of c)a.package&&d.add(`package:${a.package}`),a.path&&d.add(`path:${a.path}`);for(let a of b){let b=a.package?`package:${a.package}`:`path:${a.path}`;if(d.has(b)){let b=c.find(b=>a.package&&b.package===a.package||a.path&&b.path===a.path);b&&!1===b.enabled&&(b.enabled=!0);continue}d.add(b);let e=a.expectedPluginName??ar(a.package,a.path);c.push({name:e,source:a.package?"npm":"local",package:a.package,path:a.path,enabled:!0})}return c}(c.plugins,d),c._externalPluginEntries=d),!function(a){let b=new Set,c=new Map;for(let[d,e]of Object.entries(a.projects)){if(b.has(d))throw Error(`Duplicate project ID detected: "${d}"
|
|
5
|
-
Each project entry must use a unique registry key.`);if(b.add(d),!e.storageKey)continue;let a=c.get(e.storageKey);if(a&&a!==d)throw Error(`Duplicate storage key detected: "${e.storageKey}"
|
|
6
|
-
Projects "${a}" and "${d}" point at the same storage identity.
|
|
7
|
-
|
|
8
|
-
This usually indicates a registration collision. Re-register or relink one of the projects so each projectId owns a unique storageKey.`);c.set(e.storageKey,d)}let d=new Set,e={};for(let[b,c]of Object.entries(a.projects)){let f=c.sessionPrefix||l(b);if(d.has(f)){let d=e[f];throw Error(`Duplicate session prefix detected: "${f}"
|
|
9
|
-
Projects "${d}" and "${b}" would generate the same prefix.
|
|
10
|
-
|
|
11
|
-
To fix this, add an explicit sessionPrefix to one of these projects:
|
|
12
|
-
|
|
13
|
-
projects:
|
|
14
|
-
${d}:
|
|
15
|
-
path: ${a.projects[d]?.path}
|
|
16
|
-
sessionPrefix: ${f}1 # Add explicit prefix
|
|
17
|
-
${b}:
|
|
18
|
-
path: ${c.path}
|
|
19
|
-
sessionPrefix: ${f}2 # Add explicit prefix
|
|
20
|
-
`)}d.add(f),e[f]=b}}(c),c}var av=c(73136);let aw=["dist/index.js","index.js"],ax=[{slot:"runtime",name:"tmux",pkg:"@aoagents/ao-plugin-runtime-tmux"},{slot:"runtime",name:"process",pkg:"@aoagents/ao-plugin-runtime-process"},{slot:"agent",name:"claude-code",pkg:"@aoagents/ao-plugin-agent-claude-code"},{slot:"agent",name:"codex",pkg:"@aoagents/ao-plugin-agent-codex"},{slot:"agent",name:"aider",pkg:"@aoagents/ao-plugin-agent-aider"},{slot:"agent",name:"cursor",pkg:"@aoagents/ao-plugin-agent-cursor"},{slot:"agent",name:"opencode",pkg:"@aoagents/ao-plugin-agent-opencode"},{slot:"workspace",name:"worktree",pkg:"@aoagents/ao-plugin-workspace-worktree"},{slot:"workspace",name:"clone",pkg:"@aoagents/ao-plugin-workspace-clone"},{slot:"tracker",name:"github",pkg:"@aoagents/ao-plugin-tracker-github"},{slot:"tracker",name:"linear",pkg:"@aoagents/ao-plugin-tracker-linear"},{slot:"tracker",name:"gitlab",pkg:"@aoagents/ao-plugin-tracker-gitlab"},{slot:"scm",name:"github",pkg:"@aoagents/ao-plugin-scm-github"},{slot:"scm",name:"gitlab",pkg:"@aoagents/ao-plugin-scm-gitlab"},{slot:"notifier",name:"composio",pkg:"@aoagents/ao-plugin-notifier-composio"},{slot:"notifier",name:"desktop",pkg:"@aoagents/ao-plugin-notifier-desktop"},{slot:"notifier",name:"discord",pkg:"@aoagents/ao-plugin-notifier-discord"},{slot:"notifier",name:"openclaw",pkg:"@aoagents/ao-plugin-notifier-openclaw"},{slot:"notifier",name:"slack",pkg:"@aoagents/ao-plugin-notifier-slack"},{slot:"notifier",name:"webhook",pkg:"@aoagents/ao-plugin-notifier-webhook"},{slot:"terminal",name:"iterm2",pkg:"@aoagents/ao-plugin-terminal-iterm2"},{slot:"terminal",name:"web",pkg:"@aoagents/ao-plugin-terminal-web"}];function ay(a,b,c){let d=c.plugin;return"string"==typeof d&&d.length>0?d===a:b===a}function az(a){return!!a&&"object"==typeof a&&!!(a.manifest&&"function"==typeof a.create)}function aA(a){if(az(a))return a;if(a&&"object"==typeof a&&"default"in a){let b=a.default;if(az(b))return b}return null}function aB(){let a=new Map;function b(b,c,d,e){a.set(`${b}:${c}`,{manifest:d,instance:e})}function c(a,d,e=!1){let{manifest:f}=a,g=function(a,b,c=!1){let d=new Map,e=Object.entries(b.notifiers??{}),f=b.notifiers?.[a];for(let[b,c]of(f&&"object"==typeof f&&ay(a,a,f)&&d.set(a,f),e))c&&"object"==typeof c&&ay(a,b,c)&&d.set(b,c);return[...d.entries()].map(([d,e])=>({registrationName:d,config:function(a,b,c,d,e,f=!1){if("package"in d&&"path"in d)throw Error(`In ${a} "${c}": both "package" and "path" are specified. Use "package" for npm plugins or "path" for local plugins, not both.`);let g=!f&&ax.some(c=>c.slot===a&&c.name===b);if((d.package||g)&&"path"in d){let e=d.package?`npm package "${d.package}"`:`built-in plugin "${b}"`;throw Error(`In ${a} "${c}": "path" field conflicts with reserved plugin loading field. You're loading via ${e}, but also have a "path" field which would be stripped. Rename your configuration field to something else (e.g., "apiPath", "webhookPath").`)}let{plugin:h,package:i,path:j,...k}=d;return e?{...k,configPath:e}:k}("notifier",a,d,e,b.configPath,c)}))}(f.name,d,e);if(0===g.length)return void b(f.slot,f.name,f,a.create(void 0));for(let[c,d]of g.entries()){let e=a.create(d.config);b(f.slot,d.registrationName,f,e),0===c&&d.registrationName!==f.name&&b(f.slot,f.name,f,e)}}return{register(a,c){let{manifest:d}=a,e=a.create(c);b(d.slot,d.name,d,e)},get(b,c){let d=a.get(`${b}:${c}`);return d?d.instance:null},list(b){let c=new Map;for(let[d,e]of a)d.startsWith(`${b}:`)&&!c.has(e.manifest.name)&&c.set(e.manifest.name,e.manifest);return[...c.values()]},async loadBuiltins(a,b){let d=b??(a=>import(a));for(let b of ax){let e;try{e=aA(await d(b.pkg))}catch{continue}if(e)try{a&&"notifier"===e.manifest.slot?c(e,a):this.register(e)}catch(a){process.stderr.write(`[plugin-registry] Failed to load built-in plugin "${b.name}": ${a}
|
|
21
|
-
`)}}},async loadFromConfig(a,b){await this.loadBuiltins(a,b);let d=b??(a=>import(a)),e=function(a){let b=new Map;if(!a)return b;for(let c of a){let a=c.package?`package:${c.package}`:`path:${c.path}`,d=b.get(a);d?d.push(c):b.set(a,[c])}return b}(a._externalPluginEntries);for(let b of a.plugins??[]){if(!1===b.enabled)continue;let i=function(a,b){switch(a.source){case"local":{if(!a.path)return null;let c=function(a){let b;if(!(0,f.existsSync)(a))return null;try{b=(0,f.statSync)(a)}catch{return null}if(b.isFile())return a;if(!b.isDirectory())return null;let c=(0,g.join)(a,"package.json");if((0,f.existsSync)(c))try{let b=(0,f.readFileSync)(c,"utf-8"),d=JSON.parse(b),e=function(a){if("string"==typeof a)return a;if(!a||"object"!=typeof a)return null;let b=a["."];if("string"==typeof b)return b;if(b&&"object"==typeof b){let a=b.import;if("string"==typeof a)return a;let c=b.default;if("string"==typeof c)return c}let c=a.import;if("string"==typeof c)return c;let d=a.default;return"string"==typeof d?d:null}(d.exports);if(e){let b=(0,g.resolve)(a,e);if((0,f.existsSync)(b))return b}if("string"==typeof d.module){let b=(0,g.resolve)(a,d.module);if((0,f.existsSync)(b))return b}if("string"==typeof d.main){let b=(0,g.resolve)(a,d.main);if((0,f.existsSync)(b))return b}}catch{}for(let b of aw){let c=(0,g.join)(a,b);if((0,f.existsSync)(c))return c}return null}(function(a,b){if((0,g.isAbsolute)(a))return a;let c=b?(0,g.dirname)(b):process.cwd();return(0,g.resolve)(c,a)}(a.path,b.configPath));return c?(0,av.pathToFileURL)(c).href:null}case"registry":case"npm":var c;return a.package??(!(c=a.name)||c.startsWith(".")||c.startsWith("/")?null:c.startsWith("@")||c.includes("/")?c:null);default:return null}}(b,a);if(!i){process.stderr.write(`[plugin-registry] Could not resolve specifier for plugin "${b.name}" (source: ${b.source})
|
|
22
|
-
`);continue}try{let f=aA(await d(i));if(!f)continue;for(let c of b.package?e.get(`package:${b.package}`)??[]:b.path?e.get(`path:${b.path}`)??[]:[])try{var h=f.manifest;if(c.expectedPluginName&&c.expectedPluginName!==h.name){let a=c.package?"package":"path";throw Error(`Plugin manifest.name mismatch at ${c.source}: expected "${c.expectedPluginName}" but ${a} "${i}" has manifest.name "${h.name}". Either update the 'plugin' field to match the actual manifest.name, or remove it to auto-infer.`)}!function(a,b,c){let{location:d,slot:e,source:f}=b;if("project"===d.kind){let{projectId:b,configType:e}=d,f=c.projects[b];f?.[e]&&(f[e].plugin=a.name)}else if("notifier"===d.kind){let{notifierId:b}=d,e=c.notifiers[b];e&&(e.plugin=a.name)}a.slot!==e&&process.stderr.write(`[plugin-registry] Plugin at ${f} has slot "${a.slot}" but was configured as "${e}". The plugin will be registered under its declared slot "${a.slot}".
|
|
23
|
-
`)}(f.manifest,c,a)}catch(a){process.stderr.write(`[plugin-registry] Config validation failed for ${c.source}: ${a}
|
|
24
|
-
`)}"notifier"===f.manifest.slot?c(f,a,!0):this.register(f)}catch(a){process.stderr.write(`[plugin-registry] Failed to load plugin "${i}": ${a}
|
|
25
|
-
`)}}}}}function aC(a){let b={};for(let c of a.split("\n")){let a=c.trim();if(!a||a.startsWith("#"))continue;let d=a.indexOf("=");if(-1===d)continue;let e=a.slice(0,d).trim(),f=a.slice(d+1).trim();e&&(b[e]=f)}return b}let aD=/\/(\d+)$/;function aE(a){let b=function(a){try{return new URL(a)}catch{return null}}(a),c=b?.pathname.split("/").filter(Boolean)??[],d=c.findIndex(a=>"pull"===a);if(d>=2&&d+1<c.length){let b=c[d-2],e=c[d-1],f=c[d+1];if(b&&e&&f&&/^\d+$/.test(f))return{owner:b,repo:e,number:Number.parseInt(f,10),url:a}}let e=c.findIndex((a,b)=>"-"===a&&"merge_requests"===c[b+1]&&b>=2&&b+2<c.length);if(e>=2){let b=c[e-2],d=c[e-1],f=c[e+2];if(b&&d&&f&&/^\d+$/.test(f))return{owner:b,repo:d,number:Number.parseInt(f,10),url:a}}let f=a.match(aD);return f?{owner:"",repo:"",number:parseInt(f[1],10),url:a}:null}let aF=new Set(["spawning","working","detecting","pr_open","ci_failed","review_pending","changes_requested","approved","mergeable","merged","cleanup","needs_input","stuck","errored","killed","idle","done","terminated"]);function aG(a){try{return JSON.parse(a)}catch{return null}}function aH(a){return"starting"===a?"working":a&&aF.has(a)?a:"spawning"}let aI=k.Yj().nullable(),aJ=k.Ik({id:k.Yj(),runtimeName:k.Yj(),data:k.vk(a=>null===a||"object"!=typeof a||Array.isArray(a)?{}:a,k.g1(k.L5()))}),aK=k.Ik({version:k.eu(2),session:k.Ik({kind:k.k5(["worker","orchestrator"]),state:k.k5(["not_started","working","idle","needs_input","stuck","detecting","done","terminated"]),reason:k.k5(["spawn_requested","agent_acknowledged","task_in_progress","pr_created","pr_closed_waiting_decision","fixing_ci","resolving_review_comments","awaiting_user_input","awaiting_external_review","research_complete","merged_waiting_decision","manually_killed","runtime_lost","agent_process_exited","probe_failure","error_in_process"]),startedAt:aI,completedAt:aI,terminatedAt:aI,lastTransitionAt:k.Yj()}).partial().optional(),pr:k.Ik({state:k.k5(["none","open","merged","closed"]),reason:k.k5(["not_created","in_progress","ci_failing","review_pending","changes_requested","approved","merge_ready","merged","closed_unmerged"]),number:k.ai().int().nullable(),url:k.Yj().nullable(),lastObservedAt:aI}).partial().optional(),runtime:k.Ik({state:k.k5(["unknown","alive","exited","missing","probe_failed"]),reason:k.k5(["spawn_incomplete","process_running","process_missing","tmux_missing","manual_kill_requested","probe_error"]),lastObservedAt:aI,handle:aJ.nullable(),tmuxName:k.Yj().nullable()}).partial().optional()});function aL(a,b=null){if("string"!=typeof a)return b;let c=Date.parse(a);return Number.isNaN(c)?b:new Date(c).toISOString()}function aM(a,b=new Date){return{version:2,session:{kind:a,state:"not_started",reason:"spawn_requested",startedAt:null,completedAt:null,terminatedAt:null,lastTransitionAt:b.toISOString()},pr:{state:"none",reason:"not_created",number:null,url:null,lastObservedAt:null},runtime:{state:"unknown",reason:"spawn_incomplete",lastObservedAt:null,handle:null,tmuxName:null}}}function aN(a,b={}){let c=b.status??aH(a.status),d=b.sessionKind??("orchestrator"===a.role||b.sessionId?.endsWith("-orchestrator")?"orchestrator":"worker"),e=b.createdAt?.toISOString()??aL(a.createdAt,new Date().toISOString())??new Date().toISOString(),f=function(a){switch(a){case"spawning":return{state:"not_started",reason:"spawn_requested"};case"needs_input":return{state:"needs_input",reason:"awaiting_user_input"};case"stuck":return{state:"stuck",reason:"probe_failure"};case"errored":return{state:"terminated",reason:"error_in_process"};case"killed":case"terminated":case"cleanup":return{state:"terminated",reason:"manually_killed"};case"done":return{state:"done",reason:"research_complete"};case"merged":return{state:"idle",reason:"merged_waiting_decision"};case"idle":return{state:"idle",reason:"awaiting_external_review"};default:return{state:"working",reason:"task_in_progress"}}}(c),g=function(a,b){let c=a.pr??null;if(!c)return"merged"===b?{state:"merged",reason:"merged",number:null,url:null}:{state:"none",reason:"not_created",number:null,url:null};let d=aE(c);return{state:"merged"===b?"merged":"open",reason:"merged"===b?"merged":"in_progress",number:d?.number??null,url:c}}(a,c),h=function(a,b){let c=a.tmuxName?.trim()||null,d=b??(a.runtimeHandle?aG(a.runtimeHandle):null);return d||c?{state:"unknown",reason:"spawn_incomplete",handle:d??null,tmuxName:c}:{state:"unknown",reason:"spawn_incomplete",handle:null,tmuxName:null}}(a,b.runtimeHandle??null);return{version:2,session:{kind:d,state:f.state,reason:f.reason,startedAt:"spawning"===c?null:e,completedAt:"done"===c?e:null,terminatedAt:"killed"===c||"terminated"===c||"cleanup"===c?e:null,lastTransitionAt:e},pr:{state:g.state,reason:g.reason,number:g.number,url:g.url,lastObservedAt:g.url?e:null},runtime:{state:h.state,reason:h.reason,lastObservedAt:h.handle||h.tmuxName?e:null,handle:h.handle,tmuxName:h.tmuxName}}}function aO(a,b={}){let c=a.statePayload&&"2"===a.stateVersion?aG(a.statePayload):null,d=aK.safeParse(c);return d.success?function(a,b,c={}){let d=aN(b,c),e=a.session,f=a.pr,g=a.runtime,h=Object.hasOwn(e??{},"kind"),i=Object.hasOwn(e??{},"state"),j=Object.hasOwn(e??{},"reason"),k=Object.hasOwn(e??{},"startedAt"),l=Object.hasOwn(e??{},"completedAt"),m=Object.hasOwn(e??{},"terminatedAt"),n=Object.hasOwn(e??{},"lastTransitionAt"),o=Object.hasOwn(f??{},"state"),p=Object.hasOwn(f??{},"reason"),q=Object.hasOwn(f??{},"number"),r=Object.hasOwn(f??{},"url"),s=Object.hasOwn(f??{},"lastObservedAt"),t=Object.hasOwn(g??{},"state"),u=Object.hasOwn(g??{},"reason"),v=Object.hasOwn(g??{},"lastObservedAt"),w=Object.hasOwn(g??{},"handle"),x=Object.hasOwn(g??{},"tmuxName");return{version:2,session:{kind:h?e?.kind==="orchestrator"?"orchestrator":"worker":d.session.kind,state:i?e?.state??d.session.state:d.session.state,reason:j?e?.reason??d.session.reason:d.session.reason,startedAt:k?aL(e?.startedAt):d.session.startedAt,completedAt:l?aL(e?.completedAt):d.session.completedAt,terminatedAt:m?aL(e?.terminatedAt):d.session.terminatedAt,lastTransitionAt:n?aL(e?.lastTransitionAt,d.session.lastTransitionAt)??d.session.lastTransitionAt:d.session.lastTransitionAt},pr:{state:o?f?.state??d.pr.state:d.pr.state,reason:p?f?.reason??d.pr.reason:d.pr.reason,number:q?"number"==typeof f?.number?f.number:null:d.pr.number,url:r?"string"==typeof f?.url?f.url:null:d.pr.url,lastObservedAt:s?aL(f?.lastObservedAt):d.pr.lastObservedAt},runtime:{state:t?g?.state??d.runtime.state:d.runtime.state,reason:u?g?.reason??d.runtime.reason:d.runtime.reason,lastObservedAt:v?aL(g?.lastObservedAt):d.runtime.lastObservedAt,handle:w?function(a){if(!a||"object"!=typeof a||"string"!=typeof a.id||"string"!=typeof a.runtimeName)return null;let b=a.data;return{id:a.id,runtimeName:a.runtimeName,data:b&&"object"==typeof b?b:{}}}(g?.handle):d.runtime.handle,tmuxName:x?"string"==typeof g?.tmuxName?g.tmuxName:null:d.runtime.tmuxName}}}(d.data,a,b):aN(a,b)}function aP(a,b="working"){if("terminated"===a.session.state&&("cleanup"===b||"errored"===b||"killed"===b||"terminated"===b))return b;switch(a.session.state){case"not_started":return"spawning";case"needs_input":return"needs_input";case"stuck":return"stuck";case"done":return"done";case"terminated":return"terminated";case"detecting":return"detecting"}if("merged"===a.pr.state)return"merged";if("open"===a.pr.state)return"ci_failing"===a.pr.reason?"ci_failed":"changes_requested"===a.pr.reason?"changes_requested":"review_pending"===a.pr.reason?"review_pending":"approved"===a.pr.reason?"approved":"merge_ready"===a.pr.reason?"mergeable":"pr_open";switch(a.session.state){case"idle":return"idle";case"working":return"working";default:return b}}function aQ(a,b){return{stateVersion:"2",statePayload:JSON.stringify(a),status:aP(a,b),pr:a.pr.url??"",runtimeHandle:a.runtime.handle?JSON.stringify(a.runtime.handle):"",tmuxName:a.runtime.tmuxName??"",role:"orchestrator"===a.session.kind?"orchestrator":""}}function aR(a){return{version:2,session:{...a.session},pr:{...a.pr},runtime:{...a.runtime,handle:a.runtime.handle?{id:a.runtime.handle.id,runtimeName:a.runtime.handle.runtimeName,data:structuredClone(a.runtime.handle.data)}:null}}}let aS=/^[a-zA-Z0-9_-]+$/;function aT(a,b="session ID"){if(!aS.test(a))throw Error(`Invalid ${b}: ${a}`)}function aU(a){return Object.entries(a).filter(([,a])=>void 0!==a&&""!==a).map(([a,b])=>`${a}=${b.replace(/[\r\n]/g," ")}`).join("\n")+"\n"}function aV(a,b){return aT(b),(0,g.join)(a,b)}function aW(a,b){let c=aV(a,b);return(0,f.existsSync)(c)?aC((0,f.readFileSync)(c,"utf-8")):null}function aX(a,b,c){let d=aV(a,b);(0,f.mkdirSync)((0,g.dirname)(d),{recursive:!0});let e={worktree:c.worktree,branch:c.branch,status:c.status};c.tmuxName&&(e.tmuxName=c.tmuxName),c.issue&&(e.issue=c.issue),c.pr&&(e.pr=c.pr),c.prAutoDetect&&(e.prAutoDetect=c.prAutoDetect),c.summary&&(e.summary=c.summary),c.project&&(e.project=c.project),c.agent&&(e.agent=c.agent),c.createdAt&&(e.createdAt=c.createdAt),c.runtimeHandle&&(e.runtimeHandle=c.runtimeHandle),c.stateVersion&&(e.stateVersion=c.stateVersion),c.statePayload&&(e.statePayload=c.statePayload),c.restoredAt&&(e.restoredAt=c.restoredAt),c.role&&(e.role=c.role),void 0!==c.dashboardPort&&(e.dashboardPort=String(c.dashboardPort)),void 0!==c.terminalWsPort&&(e.terminalWsPort=String(c.terminalWsPort)),void 0!==c.directTerminalWsPort&&(e.directTerminalWsPort=String(c.directTerminalWsPort)),c.opencodeSessionId&&(e.opencodeSessionId=c.opencodeSessionId),c.pinnedSummary&&(e.pinnedSummary=c.pinnedSummary),c.userPrompt&&(e.userPrompt=c.userPrompt),s(d,aU(e))}function aY(a,b,c){!function(a,b,c,d={}){let e=aV(a,b),h={};if((0,f.existsSync)(e))h=aC((0,f.readFileSync)(e,"utf-8"));else if(!d.createIfMissing)return;let i=Object.fromEntries(Object.entries(c({...h})).filter(([,a])=>void 0!==a&&""!==a));(0,f.mkdirSync)((0,g.dirname)(e),{recursive:!0}),s(e,aU(i))}(a,b,a=>(function(a,b){let c={...a};for(let[a,d]of Object.entries(b))if(void 0!==d)if(""===d){let{[a]:b,...d}=c;c=d}else c[a]=d;return c})(a,c),{createIfMissing:!0})}function aZ(a,b,c=!0){let d=aV(a,b);if((0,f.existsSync)(d)){if(c){let c=(0,g.join)(a,"archive");(0,f.mkdirSync)(c,{recursive:!0});let e=new Date().toISOString().replace(/[:.]/g,"-"),h=(0,g.join)(c,`${b}_${e}`);(0,f.writeFileSync)(h,(0,f.readFileSync)(d,"utf-8"))}(0,f.unlinkSync)(d)}}function a$(a,b){aT(b);let c=(0,g.join)(a,"archive");if(!(0,f.existsSync)(c))return null;let d=`${b}_`,e=null;for(let a of(0,f.readdirSync)(c)){if(!a.startsWith(d))continue;let b=a[d.length];!b||b<"0"||b>"9"||(!e||a>e)&&(e=a)}if(!e)return null;try{return aC((0,f.readFileSync)((0,g.join)(c,e),"utf-8"))}catch{return null}}function a_(a){return(0,f.existsSync)(a)?(0,f.readdirSync)(a).filter(b=>{if("archive"===b||b.startsWith(".")||!aS.test(b))return!1;try{return(0,f.statSync)((0,g.join)(a,b)).isFile()}catch{return!1}}):[]}function a0(a,b){let c=aV(a,b);(0,f.mkdirSync)((0,g.dirname)(c),{recursive:!0});try{let a=(0,f.openSync)(c,f.constants.O_WRONLY|f.constants.O_CREAT|f.constants.O_EXCL);return(0,f.closeSync)(a),!0}catch{return!1}}let a1=new Set(["active","ready","idle","blocked"]),a2=new Set(["active","ready"]),a3=new Set(["idle","blocked"]);function a4(a,b=new Date){if(!a)return"none";let c=Math.max(0,b.getTime()-a.getTime());return c<=6e4?"strong":c<=3e5?"weak":"stale"}function a5(a,b={}){return{state:a,activity:b.activity??null,timestamp:b.timestamp,source:b.source??"none",detail:b.detail}}function a6(a,b,c=new Date){return a1.has(a.state)?!a.timestamp&&a3.has(a.state)?a5("stale",{activity:a.state,source:b,detail:"missing_timestamp"}):a.timestamp?a2.has(a.state)&&"stale"===a4(a.timestamp,c)?a5("stale",{activity:a.state,timestamp:a.timestamp,source:b,detail:"stale_timestamp"}):a5("valid",{activity:a.state,timestamp:a.timestamp,source:b}):a5("valid",{activity:a.state,source:b}):a5("valid",{activity:a.state,timestamp:a.timestamp,source:b})}function a7(a){return"valid"===a.state&&a.timestamp instanceof Date&&null!==a.activity&&a3.has(a.activity)}function a8(a){let b="none"===a.source?"":` via_${a.source}`,c=a.activity?` activity=${a.activity}`:"",d=a.timestamp?` at=${a.timestamp.toISOString()}`:"",e=a.detail?` detail=${a.detail}`:"";return`activity_signal=${a.state}${b}${c}${d}${e}`}var a9=c(51455);let ba=["started","working","waiting","needs_input","fixing_ci","addressing_reviews","pr_created","draft_pr_created","ready_for_review","completed"],bb={STATE:"agentReportedState",AT:"agentReportedAt",NOTE:"agentReportedNote",PR_NUMBER:"agentReportedPrNumber",PR_URL:"agentReportedPrUrl",PR_IS_DRAFT:"agentReportedPrIsDraft"};async function bc(a,b){let c=function(a,b){return aT(b),(0,g.join)((0,g.join)(a,".agent-report-audit"),`${b}.ndjson`)}(a,b);return(0,f.existsSync)(c)?(await (0,a9.readFile)(c,"utf8")).split("\n").map(a=>a.trim()).filter(a=>a.length>0).flatMap(a=>{try{let b=JSON.parse(a);if("string"!=typeof b.timestamp||"string"!=typeof b.actor||"acknowledge"!==b.source&&"report"!==b.source||!ba.includes(b.reportState)||"boolean"!=typeof b.accepted||!b.before||!b.after)return[];return[b]}catch{return[]}}).reverse():[]}function bd(a){if(!a)return null;let b=a[bb.STATE],c=a[bb.AT];if(!b||!c||!ba.includes(b))return null;let d=Date.parse(c);if(Number.isNaN(d))return null;let e=a[bb.NOTE],f=a[bb.PR_NUMBER],g=f&&/^\d+$/.test(f)?Number.parseInt(f,10):void 0,h=a[bb.PR_URL]||void 0,i=a[bb.PR_IS_DRAFT];return{state:b,timestamp:new Date(d).toISOString(),note:e&&e.length>0?e:void 0,prNumber:g,prUrl:h,prIsDraft:"true"===i||"false"!==i&&void 0}}function be(a,b=new Date){if(!a)return!1;let c=Date.parse(a);return!Number.isNaN(c)&&b.getTime()-c>3e5}function bf(a){var b;let c="now"in a&&a.now?a.now:new Date,f=c.toISOString(),g=(b=a.evidence,(0,e.createHash)("sha256").update(b.replace(/\sactivity=[^\s]+/g,"").replace(/\sat=[^\s]+/g,"").trim()).digest("hex").slice(0,12)),h="previousEvidenceHash"in a?a.previousEvidenceHash:void 0,i="detectingStartedAt"in a?a.detectingStartedAt:void 0,j=void 0!==h&&h!==g,k=j?f:i??f,l=j?1:a.currentAttempts+1,m=be(k,c);return l>3||m?{status:d.SB.STUCK,evidence:a.evidence,detectingAttempts:l,detectingStartedAt:k,detectingEvidenceHash:g,sessionState:"stuck",sessionReason:a.idleWasBlocked?"error_in_process":"probe_failure"}:{status:d.SB.DETECTING,evidence:a.evidence,detectingAttempts:l,detectingStartedAt:k,detectingEvidenceHash:g,sessionState:"detecting",sessionReason:a.reason??"probe_failure"}}function bg(a){return a===d.bz.MERGED?{status:d.SB.MERGED,evidence:"pr_merged",detectingAttempts:0,prState:"merged",prReason:"merged",sessionState:"idle",sessionReason:"merged_waiting_decision"}:a===d.bz.CLOSED?{status:d.SB.IDLE,evidence:"pr_closed",detectingAttempts:0,prState:"closed",prReason:"closed_unmerged",sessionState:"idle",sessionReason:"pr_closed_waiting_decision"}:null}function bh(a){if(a.ciFailing)return{status:d.SB.CI_FAILED,evidence:"ci_failing",detectingAttempts:0,prState:"open",prReason:"ci_failing",sessionState:"working",sessionReason:"fixing_ci"};if("changes_requested"===a.reviewDecision)return{status:d.SB.CHANGES_REQUESTED,evidence:"review_changes_requested",detectingAttempts:0,prState:"open",prReason:"changes_requested",sessionState:"working",sessionReason:"resolving_review_comments"};if("approved"===a.reviewDecision||"none"===a.reviewDecision){if(a.mergeable)return{status:d.SB.MERGEABLE,evidence:"merge_ready",detectingAttempts:0,prState:"open",prReason:"merge_ready",sessionState:"idle",sessionReason:"awaiting_external_review"};if("approved"===a.reviewDecision)return{status:d.SB.APPROVED,evidence:"review_approved",detectingAttempts:0,prState:"open",prReason:"approved",sessionState:"idle",sessionReason:"awaiting_external_review"}}return"pending"===a.reviewDecision?{status:d.SB.REVIEW_PENDING,evidence:"review_pending",detectingAttempts:0,prState:"open",prReason:"review_pending",sessionState:"idle",sessionReason:"awaiting_external_review"}:a.shouldEscalateIdleToStuck?{status:d.SB.STUCK,evidence:`idle_beyond_threshold ${a.activityEvidence}`,detectingAttempts:0,prState:"open",prReason:"in_progress",sessionState:"stuck",sessionReason:a.idleWasBlocked?"error_in_process":"probe_failure"}:{status:d.SB.PR_OPEN,evidence:"pr_open",detectingAttempts:0,prState:"open",prReason:"in_progress",sessionState:"idle",sessionReason:"pr_created"}}function bi(a){if(!a)return 0;let b=Number.parseInt(a,10);return Number.isFinite(b)&&b>0?b:0}function bj(a){let b=bg(a.prState);return b||bh({reviewDecision:a.reviewDecision,ciFailing:a.ciStatus===d.U1.FAILING,mergeable:a.mergeable,shouldEscalateIdleToStuck:a.shouldEscalateIdleToStuck,idleWasBlocked:a.idleWasBlocked,activityEvidence:a.activityEvidence})}let bk={acknowledgeTimeoutMs:6e5,staleReportTimeoutMs:18e5,checkAcknowledge:!0,checkStale:!0,checkBlocked:!0},bl=new Set(["done","terminated","killed","cleanup","merged","errored"]),bm={LAST_AUDITED_AT:"reportWatcherLastAuditedAt",ACTIVE_TRIGGER:"reportWatcherActiveTrigger",TRIGGER_ACTIVATED_AT:"reportWatcherTriggerActivatedAt",TRIGGER_COUNT:"reportWatcherTriggerCount"};var bn=c(31421),bo=c(57975);let bp=`You are an AI coding agent managed by the Agent Orchestrator (ao).
|
|
26
|
-
|
|
27
|
-
## Session Lifecycle
|
|
28
|
-
- You are running inside a managed session. Focus on the assigned task.
|
|
29
|
-
- When you finish your work, create a PR and push it. The orchestrator will handle CI monitoring and review routing.
|
|
30
|
-
- If you're told to take over or continue work on an existing PR, run \`ao session claim-pr <pr-number-or-url>\` from inside this session before making changes.
|
|
31
|
-
- If CI fails, the orchestrator will send you the failures — fix them and push again.
|
|
32
|
-
- If reviewers request changes, the orchestrator will forward their comments — address each one, push fixes, and reply to the comments.
|
|
33
|
-
|
|
34
|
-
## Reporting Progress to AO
|
|
35
|
-
The orchestrator infers your status from runtime signals, but explicit reports are always preferred — they are accurate and fresh. Run these commands from the session shell (AO_SESSION_ID is pre-set for you):
|
|
36
|
-
|
|
37
|
-
- \`ao acknowledge\` — run once after reading the initial task so AO knows you picked it up.
|
|
38
|
-
- \`ao report working\` — declare you are actively making progress (useful after pauses or long thinking blocks).
|
|
39
|
-
- \`ao report waiting\` — you are blocked on something AO cannot unblock on its own (e.g. waiting for a human, external service).
|
|
40
|
-
- \`ao report needs-input\` — you need a decision or info from the human before proceeding.
|
|
41
|
-
- \`ao report fixing-ci\` — you are working specifically on making CI green again.
|
|
42
|
-
- \`ao report addressing-reviews\` — you are working on reviewer-requested changes.
|
|
43
|
-
- \`ao report pr-created --pr-url <url>\` / \`draft-pr-created\` / \`ready-for-review\` — declare PR workflow milestones as soon as you create or update the PR.
|
|
44
|
-
- \`ao report completed\` — you finished non-coding research or analysis work that doesn't produce a PR.
|
|
45
|
-
|
|
46
|
-
Rules:
|
|
47
|
-
- Do NOT self-report \`done\`, \`terminated\`, or terminal PR states like \`merged\`/\`closed\` — AO owns those transitions via SCM ground truth.
|
|
48
|
-
- A fresh report is trusted over weak inference but runtime death, activity-based waiting_input, and SCM events (merged/closed PR, CI failure, reviews) still take precedence.
|
|
49
|
-
- Use \`--note "<text>"\` to attach a short rationale when the state change is non-obvious.
|
|
50
|
-
|
|
51
|
-
## Git Workflow
|
|
52
|
-
- Always create a feature branch from the default branch (never commit directly to it).
|
|
53
|
-
- Use conventional commit messages (feat:, fix:, chore:, etc.).
|
|
54
|
-
- Push your branch and create a PR when the implementation is ready.
|
|
55
|
-
- Keep PRs focused — one issue per PR.
|
|
56
|
-
|
|
57
|
-
## PR Best Practices
|
|
58
|
-
- Write a clear PR title and description explaining what changed and why.
|
|
59
|
-
- Link the issue in the PR description so it auto-closes when merged.
|
|
60
|
-
- If the repo has CI checks, make sure they pass before requesting review.
|
|
61
|
-
- Respond to every review comment, even if just to acknowledge it.`,bq=`You are an AI coding agent managed by the Agent Orchestrator (ao).
|
|
62
|
-
|
|
63
|
-
## Session Lifecycle
|
|
64
|
-
- You are running inside a managed session. Focus on the assigned task.
|
|
65
|
-
- No remote repository is configured — work locally. PR, CI, and review features are unavailable.
|
|
66
|
-
|
|
67
|
-
## Reporting Progress to AO
|
|
68
|
-
Explicit reports help the orchestrator track your state accurately. Run these from the session shell (AO_SESSION_ID is pre-set):
|
|
69
|
-
- \`ao acknowledge\` — run once after reading the initial task.
|
|
70
|
-
- \`ao report working\` / \`waiting\` / \`needs-input\` — declare your current phase.
|
|
71
|
-
- \`ao report pr-created --pr-url <url>\` or \`draft-pr-created\` / \`ready-for-review\` — declare non-terminal PR workflow events when relevant.
|
|
72
|
-
- \`ao report completed\` — finish non-coding research or analysis work.
|
|
73
|
-
Do NOT self-report \`done\` or \`terminated\` — AO owns those transitions.
|
|
74
|
-
|
|
75
|
-
## Git Workflow
|
|
76
|
-
- Always create a feature branch from the default branch (never commit directly to it).
|
|
77
|
-
- Use conventional commit messages (feat:, fix:, chore:, etc.).`,br=/^ses_[A-Za-z0-9_-]+$/;function bs(a){if("string"!=typeof a)return;let b=a.trim();if(0!==b.length)return br.test(b)?b:void 0}let bt="\x3c!-- AO_ORCHESTRATOR_PROMPT_START --\x3e",bu="\x3c!-- AO_ORCHESTRATOR_PROMPT_END --\x3e";function bv(a,b){let c=(0,g.join)(a,"AGENTS.md");(0,f.mkdirSync)(a,{recursive:!0});let d=(function(a){let b=a.indexOf(bt),c=a.indexOf(bu);if(-1===b||-1===c||c<b)return a;let d=a.slice(0,b).trimEnd(),e=a.slice(c+bu.length).trimStart();return d&&e?`${d}
|
|
78
|
-
|
|
79
|
-
${e}`:d||e})((0,f.existsSync)(c)?(0,f.readFileSync)(c,"utf-8"):"").trimEnd(),e=[bt,"## Agent Orchestrator\n",(0,f.readFileSync)(b,"utf-8").trim(),bu].join("\n"),h=d?`${d}
|
|
80
|
-
|
|
81
|
-
${e}
|
|
82
|
-
`:`${e}
|
|
83
|
-
`;return(0,f.writeFileSync)(c,h,"utf-8"),c}function bw(a){return"'"+a.replace(/'/g,"'\\''")+"'"}async function bx(a){let b=await (0,a9.open)(a,"r");try{let{size:a}=await b.stat();if(0===a)return null;let c=[],d=0,e=a;for(;e>0;){let a=Math.min(4096,e);e-=a;let f=Buffer.alloc(a);await b.read(f,0,a,e),c.unshift(f),d+=a;let g=Buffer.concat(c,d).toString("utf-8").split("\n");for(let a=g.length-1;a>=0;a--){let b=g[a].trim();if(b&&(a>0||0===e))return b}}return Buffer.concat(c,d).toString("utf-8").trim()||null}finally{await b.close()}}async function by(a){try{let[b,c]=await Promise.all([bx(a),(0,a9.stat)(a)]);if(!b)return null;let d=JSON.parse(b);if("object"==typeof d&&null!==d&&!Array.isArray(d)){let a="string"==typeof d.type?d.type:null,b=null;if("object"==typeof d.payload&&null!==d.payload&&!Array.isArray(d.payload)){let a=d.payload;"string"==typeof a.type&&(b=a.type)}return{lastType:a,payloadType:b,modifiedAt:c.mtime}}return{lastType:null,payloadType:null,modifiedAt:c.mtime}}catch{return null}}function bz(a,b){for(let[c,d]of Object.entries(a.projects)){let a=d.sessionPrefix;if(b===a||b.startsWith(`${a}-`))return c}}function bA(a,b,c,e){return(0,d.tT)({id:a,metadata:b},c,e)?"orchestrator":"worker"}function bB(a){let{role:b,project:c,defaults:e,persistedAgent:f,spawnAgentOverride:g}=a,h="orchestrator"===b?c.orchestrator:c.worker,i="orchestrator"===b?e.orchestrator:e.worker,j=c.agentConfig??{},k=h?.agentConfig??{},l=f||("worker"===b?g??h?.agent??c.agent??i?.agent??e.agent:h?.agent??c.agent??i?.agent??e.agent),m={...j};for(let[a,b]of Object.entries(k))void 0!==b&&(m[a]=b);let n="orchestrator"===b?k.orchestratorModel??k.model??j.orchestratorModel??j.model:k.model??j.model;void 0!==n&&(m.model=n);let o=(0,d.DD)("string"==typeof m.permissions?m.permissions:void 0);void 0!==o&&(m.permissions=o);let p="string"==typeof m.subagent?m.subagent:void 0;return{role:b,agentName:l,agentConfig:m,model:n,permissions:o,subagent:p}}let bC=(0,bo.promisify)(bn.execFile);async function bD(a){let b,c=bs(a);if(c){for(let a of[0,200,600]){a>0&&await new Promise(b=>setTimeout(b,a));try{await bC("opencode",["session","delete",c],{timeout:3e4});return}catch(a){if(function(a){if(!(a instanceof Error))return!1;let b=[a.message,a.stderr,a.stdout].filter(Boolean).join("\n");return/session not found/i.test(b)}(a))return;b=a}}throw b instanceof Error?b:Error(String(b))}}async function bE(a=1e4){try{let{stdout:b}=await bC("opencode",["session","list","--format","json"],{timeout:a}),c=aG(b);if(!Array.isArray(c))return[];return c.flatMap(a=>{let b;if(!a||"object"!=typeof a)return[];let c="string"==typeof a.title?a.title:"",d=bs(a.id);if(!d)return[];let e=a.updated;if("number"==typeof e&&Number.isFinite(e))b=e;else if("string"==typeof e){let a=Date.parse(e);Number.isNaN(a)||(b=a)}return[{id:d,title:c,...void 0!==b?{updatedAt:b}:{}}]})}catch{return[]}}async function bF(a,b=1e4,c){let d=await (c??bE(b)),e=`AO:${a}`;return d.filter(a=>a.title===e).sort((a,b)=>{let c=a.updatedAt??-1/0,d=b.updatedAt??-1/0;return c===d?0:d-c}).map(a=>a.id)}async function bG(a,b,c){return(await bF(a,b,c))[0]}function bH(a){return a.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}let bI=new Set(["pr_open","ci_failed","review_pending","changes_requested","approved","mergeable"]),bJ=new Set([...bI,"merged"]);function bK(a){return new Promise(b=>setTimeout(b,a))}async function bL(a){try{let{stdout:b}=await bC("tmux",["display-message","-p","-t",a,"#{pane_current_command}"],{timeout:5e3}),c=b.trim();return c.length>0?c:null}catch{return null}}function bM(a,b,c,d,e,f){let g="orchestrator"===b.role||d&&RegExp(`^${bH(d)}-orchestrator-\\d+$`).test(a)?"orchestrator":"worker";return function(a,b,c={}){let d=void 0!==c.runtimeHandle?c.runtimeHandle:b.runtimeHandle?aG(b.runtimeHandle):null,e=aO(b,{sessionId:a,status:c.status??aH(b.status),runtimeHandle:d,createdAt:c.createdAt,sessionKind:c.sessionKind}),f=c.status??aP(e,aH(b.status)),g=e.pr.url??b.pr,h="true"===b[bb.PR_IS_DRAFT];return{id:a,projectId:b.project??c.projectId??"",status:f,activity:c.activity??null,activitySignal:c.activitySignal?c.activitySignal:void 0===c.activity||null===c.activity?a5("unavailable"):a5("valid",{activity:c.activity,timestamp:c.lastActivityAt,source:"exited"===c.activity?"runtime":"native"}),lifecycle:e,branch:b.branch||null,issueId:b.issue||null,pr:g?(()=>{let a=aE(g);return{number:e.pr.number??a?.number??0,url:g,title:"",owner:a?.owner??"",repo:a?.repo??"",branch:b.branch??"",baseBranch:"",isDraft:h}})():null,workspacePath:b.worktree||null,runtimeHandle:e.runtime.handle??d,agentInfo:b.summary?{summary:b.summary,agentSessionId:null}:null,createdAt:b.createdAt?new Date(b.createdAt):c.createdAt??new Date,lastActivityAt:c.lastActivityAt??new Date,restoredAt:c.restoredAt??(b.restoredAt?new Date(b.restoredAt):void 0),metadata:b}}(a,b,{projectId:c,sessionKind:g,createdAt:e,lastActivityAt:f??new Date})}function bN(a){let{config:b,registry:c}=a;function e(a){return n(a.storageKey)}function i(a){return(0,g.resolve)(a).replace(/\/$/,"")}function j(a,b,c){return!!a&&i(c)!==i(a.path)&&(function(a,b){var c;let d=[(c=a.storageKey,(0,g.join)(m(c),"worktrees"))],e=new Set;for(let c of(b&&e.add(b),e.add((0,g.basename)(a.path)),e))d.push((0,g.join)((0,h.homedir)(),".worktrees",c));return d})(a,b).some(a=>(function(a,b){let c=i(a),d=i(b);return c===d||c.startsWith(`${d}/`)})(c,a))}function k(a){let b=(0,g.join)(a,"archive");if(!(0,f.existsSync)(b))return[];let c=new Set;for(let a of(0,f.readdirSync)(b)){let b=a.match(/^([a-zA-Z0-9_-]+)_\d/);b?.[1]&&c.add(b[1])}return[...c]}function l(a,b,c){return!!b&&("orchestrator"===b.role||!!c&&(a===`${c}-orchestrator`||RegExp(`^${bH(c)}-orchestrator-\\d+$`).test(a)))}function p(a,b,c){return b===`${a.sessionPrefix}-orchestrator`||l(b,c??{},a.sessionPrefix)}function r(a,b){let c={...a};for(let[a,d]of Object.entries(b))if(void 0!==d){if(""===d){let{[a]:b,...d}=c;c=d;continue}c[a]=d}return c}function t(a,b,c){let d=aR(aO(b,{sessionId:a,status:aH(b.status)}));return c(d),d}function u(a,b){return aQ(b,aH(a.status))}function v(a,b,c,d){let e=(0,g.join)(a,b),h=d;if(!h)try{h=(0,f.statSync)(e).mtime}catch{h=void 0}if(aY(a,b,c),h)try{(0,f.utimesSync)(e,h,h)}catch{}}let w=null;function x(){w=null}function y(a,b,c){let d={...b,raw:{...b.raw}};if(!l(d.sessionName,d.raw,c))return d;let e={};if("orchestrator"!==d.raw.role&&(e.role="orchestrator"),d.raw.pr&&(e.pr=""),"off"!==d.raw.prAutoDetect&&(e.prAutoDetect="off"),bJ.has(d.raw.status??"")&&(e.status="working"),Object.keys(e).length>0){let b=t(d.sessionName,d.raw,a=>{a.session.kind="orchestrator",a.pr.state="none",a.pr.reason="not_created",a.pr.number=null,a.pr.url=null,a.pr.lastObservedAt=null,"working"===e.status&&(a.session.state="working",a.session.reason="task_in_progress")});v(a,d.sessionName,{...e,...u(d.raw,b)},d.modifiedAt),d.raw=r(d.raw,{...e,...u(d.raw,b)})}return d}function z(a){let b=Date.parse(a.raw.restoredAt??a.raw.createdAt??"");return a.modifiedAt?a.modifiedAt.getTime():Number.isNaN(b)?0:b}function A(a){let b=e(a);if(!(0,f.existsSync)(b))return[];let c=a_(b).flatMap(a=>{let c,d=aW(b,a);if(!d)return[];try{c=(0,f.statSync)((0,g.join)(b,a)).mtime}catch{}return[{sessionName:a,raw:d,modifiedAt:c}]});return function(a,b,c){let d=b.map(a=>({...a,raw:{...a.raw}})),e=new Map;for(let b of d){if("2"!==b.raw.stateVersion||!b.raw.statePayload){let d=aR(aO(b.raw,{sessionId:b.sessionName,status:aH(b.raw.status),createdAt:b.raw.createdAt?new Date(b.raw.createdAt):void 0,sessionKind:l(b.sessionName,b.raw,c)?"orchestrator":"worker"})),e=u(b.raw,d);v(a,b.sessionName,e,b.modifiedAt),b.raw=r(b.raw,e)}if(l(b.sessionName,b.raw,c)){b.raw=y(a,b,c).raw;continue}let d=b.raw.pr;if(!d)continue;let f=e.get(d)??[];f.push(b),e.set(d,f)}for(let b of e.values()){if(b.length<2)continue;let[c,...d]=[...b].sort((a,b)=>{let c=Number(bI.has(b.raw.status??""))-Number(bI.has(a.raw.status??""));if(0!==c)return c;let d=z(b)-z(a);return 0!==d?d:b.sessionName.localeCompare(a.sessionName)});for(let b of d){let c={pr:"",prAutoDetect:"off",...bI.has(b.raw.status??"")?{status:"working"}:{}},d=t(b.sessionName,b.raw,a=>{a.pr.state="none",a.pr.reason="not_created",a.pr.number=null,a.pr.url=null,a.pr.lastObservedAt=null,"working"===c.status&&(a.session.state="working",a.session.reason="task_in_progress")}),e=u(b.raw,d);v(a,b.sessionName,{...c,...e},b.modifiedAt),b.raw=r(b.raw,{...c,...e})}}return d}(b,c,a.sessionPrefix)}function B(a,b){!function(a,b,c){let d;aT(b);let e=(0,g.join)(a,"archive");if(!(0,f.existsSync)(e))return;let h=`${b}_`,i=null;for(let a of(0,f.readdirSync)(e)){if(!a.startsWith(h))continue;let b=a[h.length];!b||b<"0"||b>"9"||(!i||a>i)&&(i=a)}if(!i)return;let j=(0,g.join)(e,i);try{d=aC((0,f.readFileSync)(j,"utf-8"))}catch{return!1}for(let[a,b]of Object.entries(c))if(void 0!==b)if(""===b){let{[a]:b,...c}=d;d=c}else d[a]=b;s(j,aU(d))}(a,b,{opencodeSessionId:"",opencodeCleanedAt:new Date().toISOString()})}function C(a){let b=a=>{let b=a.match(/-(\d+)$/);if(!b)return;let c=Number.parseInt(b[1],10);return Number.isNaN(c)?void 0:c};return[...a].sort((a,c)=>{let d=b(a),e=b(c);return void 0!==d&&void 0!==e&&d!==e?e-d:void 0!==d&&void 0===e?-1:void 0===d&&void 0!==e?1:c.localeCompare(a)})}async function D(a){let{sessionsDir:b,criteria:c,strategy:d,includeTitleDiscoveryForSessionId:e=!1}=a;if("ignore"===d)return;let f=function(a,b){let c=[],d=(a,d)=>{if(!d||"opencode"!==d.agent||void 0!==b.issueId&&d.issue!==b.issueId||void 0!==b.sessionId&&a!==b.sessionId)return;let e=bs(d?.opencodeSessionId);e&&c.push(e)};for(let b of C(a_(a)))d(b,aW(a,b));for(let b of C(k(a)))d(b,a$(a,b));return b.sessionId&&d(b.sessionId,a$(a,b.sessionId)),[...new Set(c)]}(b,c);if("delete"===d){for(let a of(e&&c.sessionId&&(f=[...f,...await bF(c.sessionId)]),[...new Set(f)]))await bD(a);return}return 0===f.length&&c.sessionId&&(f=await bF(c.sessionId)),f[0]}async function E(a){try{let{stdout:b}=await bC("git",["ls-remote","--heads","origin",`session/${a.sessionPrefix}-*`],{cwd:a.path,timeout:5e3});return b.split("\n").flatMap(b=>{let c=b.trim();if(!c)return[];let d=(c.split(/\s+/)[1]??"").match(RegExp(`refs/heads/session/${bH(a.sessionPrefix)}-(\\d+)$`));if(!d)return[];let e=Number.parseInt(d[1],10);return Number.isNaN(e)?[]:[e]}).filter((a,b,c)=>c.indexOf(a)===b)}catch{return[]}}async function F(a,b){let c=new Set;for(let d of[...a_(b),...k(b)]){let b=function(a,b){let c=a.match(RegExp(`^${bH(b)}-(\\d+)$`));if(!c)return;let d=Number.parseInt(c[1],10);return Number.isNaN(d)?void 0:d}(d,a.sessionPrefix);void 0!==b&&c.add(b)}for(let b of(await E(a)))c.add(b);let d=function(a,b){let c=0,d=RegExp(`^${bH(b)}-(\\d+)$`);for(let b of a){let a=b.match(d);if(a){let b=parseInt(a[1],10);b>c&&(c=b)}}return c+1}([...c].map(b=>`${a.sessionPrefix}-${b}`),a.sessionPrefix);for(let e=0;e<1e4;e++){let e=`${a.sessionPrefix}-${d}`,f=a.path?o(a.storageKey,a.sessionPrefix,d):void 0;if(!c.has(d)&&a0(b,e))return{num:d,sessionId:e,tmuxName:f};c.add(d),d+=1}throw Error(`Failed to reserve session ID after 10000 attempts (prefix: ${a.sessionPrefix})`)}function G(a,d){let e=c.get("runtime",a.runtime??b.defaults.runtime),f=c.get("agent",d??a.agent??b.defaults.agent),g=c.get("workspace",a.workspace??b.defaults.workspace);return{runtime:e,agent:f,workspace:g,tracker:a.tracker?.plugin?c.get("tracker",a.tracker.plugin):null,scm:a.scm?.plugin?c.get("scm",a.scm.plugin):null}}function H(a,c,d){return bB({role:bA(c,d,a.sessionPrefix,Object.values(b.projects).map(a=>a.sessionPrefix)),project:a,defaults:b.defaults,persistedAgent:d.agent})}async function I(a,b,c,d,e){if("opencode"!==d||bs(a.metadata.opencodeSessionId))return;let f=await bG(b,1e4,e);f&&(a.metadata.opencodeSessionId=f,aY(c,b,{opencodeSessionId:f}))}function J(a){for(let[c,d]of Object.entries(b.projects)){let b,h=e(d),i=aW(h,a);if(i){try{b=(0,f.statSync)((0,g.join)(h,a)).mtime}catch{b=void 0}return{raw:y(h,{sessionName:a,raw:i,modifiedAt:b},d.sessionPrefix).raw,sessionsDir:h,project:d,projectId:c}}}return null}function K(a){let b=J(a);if(!b)throw new d.Ag(a);return b}async function L(a,c,d,e,f,g,h){await I(a,c,d,f,h);let i=a.metadata.tmuxName?.trim(),j="string"==typeof i&&i.length>0,k=null!==a.runtimeHandle||j;k?!a.runtimeHandle&&j&&(a.runtimeHandle={id:i,runtimeName:e.runtime??b.defaults.runtime,data:{}}):a.runtimeHandle={id:c,runtimeName:e.runtime??b.defaults.runtime,data:{}},await N(a,g,k)}let M=new Set(["killed","done","merged","terminated","cleanup"]);async function N(a,c,d){if(d&&a.runtimeHandle&&c.runtime&&"spawning"!==a.status)try{if(!await c.runtime.isAlive(a.runtimeHandle)){a.lifecycle.runtime.state="missing",a.lifecycle.runtime.reason="tmux"===a.runtimeHandle.runtimeName?"tmux_missing":"process_missing",a.lifecycle.runtime.lastObservedAt=new Date().toISOString(),"done"!==a.lifecycle.session.state&&"terminated"!==a.lifecycle.session.state&&(a.lifecycle.session.state="detecting",a.lifecycle.session.reason="runtime_lost",a.lifecycle.session.lastTransitionAt=new Date().toISOString()),M.has(a.status)||(a.status="killed"),a.activity="exited",a.activitySignal=a5("valid",{activity:"exited",source:"runtime"});return}}catch{a.lifecycle.runtime.state="probe_failed",a.lifecycle.runtime.reason="probe_error",a.lifecycle.runtime.lastObservedAt=new Date().toISOString()}if(a.activitySignal=a5("unavailable"),c.agent){try{let d=await c.agent.getActivityState(a,b.readyThresholdMs);null!==d?(a.activitySignal=a6(d,"native"),a.activity=d.state,a.lifecycle.runtime.state="alive",a.lifecycle.runtime.reason="process_running",a.lifecycle.runtime.lastObservedAt=new Date().toISOString(),d.timestamp&&d.timestamp>a.lastActivityAt&&(a.lastActivityAt=d.timestamp)):a.activitySignal=a5("null",{source:"native"})}catch{a.activitySignal=a5("probe_failure",{source:"native"})}try{let b=await c.agent.getSessionInfo(a);b&&(a.agentInfo=b)}catch{}}}async function O(a){let c,d=Object.entries(b.projects).flatMap(([b,c])=>a&&b!==a||!c.storageKey?[]:A(c).map(a=>({sessionName:a.sessionName,projectId:b,raw:a.raw}))).map(async({sessionName:a,projectId:d,raw:h})=>{let i,j,k=b.projects[d];if(!k)return null;let l=e(k);try{let b=(0,g.join)(l,a),c=(0,f.statSync)(b);i=c.birthtime,j=c.mtime}catch{}let m=bM(a,h,d,k.sessionPrefix,i,j),n=H(k,a,h).agentName,o=G(k,n),p="opencode"===n?c??=bE():void 0,q=null,r=new Promise(a=>{q=setTimeout(a,12e3)}),s=L(m,a,l,k,n,o,p).catch(()=>{});try{await Promise.race([s,r])}finally{q&&clearTimeout(q)}return m});return(await Promise.all(d)).filter(a=>null!==a)}async function P(a){if(w&&Date.now()<w.expiresAt)return a?w.sessions.filter(b=>b.projectId===a):w.sessions;let b=await O();return w={sessions:b,expiresAt:Date.now()+35e3},a?b.filter(b=>b.projectId===a):b}async function Q(a){for(let[c,d]of Object.entries(b.projects)){let b,h;if(!d.storageKey)continue;let i=e(d),j=aW(i,a);if(!j)continue;try{let c=(0,g.join)(i,a),d=(0,f.statSync)(c);b=d.birthtime,h=d.mtime}catch{}let k=y(i,{sessionName:a,raw:j,modifiedAt:h},d.sessionPrefix),l=bM(a,k.raw,c,d.sessionPrefix,b,h),m=H(d,a,k.raw).agentName,n=G(d,m);return await L(l,a,i,d,m,n),l}return null}async function R(a,f){let g=J(a);if(!g){for(let c of Object.values(b.projects))if(c&&a$(e(c),a))return{cleaned:!1,alreadyTerminated:!0};throw new d.Ag(a)}let{raw:h,sessionsDir:i,project:k,projectId:l}=g,m=aO(h);if(m?.session.state==="terminated"){try{aZ(i,a,!0)}catch{}return{cleaned:!1,alreadyTerminated:!0}}let n=f?.reason??"manually_killed",o=H(k,a,h).agentName;if(h.runtimeHandle){let a=aG(h.runtimeHandle);if(a){let d=c.get("runtime",a.runtimeName??(k?k.runtime??b.defaults.runtime:b.defaults.runtime));if(d)try{await d.destroy(a)}catch{}}}let p=h.worktree;if(p&&j(k,l,p)){let a=k?G(k).workspace:c.get("workspace",b.defaults.workspace);if(a)try{await a.destroy(p)}catch{}}let q=!1;if(f?.purgeOpenCode===!0&&"opencode"===o){let b=bs(h.opencodeSessionId)??await bG(a,1e4);if(b)try{await bD(b),q=!0}catch{}}let r="pr_merged"===n?"pr_merged_cleanup":"auto_cleanup"===n?"auto_cleanup":"manual_kill_requested",s=t(a,h,a=>{a.session.state="terminated",a.session.reason=n,a.session.terminatedAt=new Date().toISOString(),a.session.lastTransitionAt=a.session.terminatedAt,a.runtime.state=h.runtimeHandle||h.tmuxName?"missing":"exited",a.runtime.reason=r,a.runtime.lastObservedAt=new Date().toISOString()});return aY(i,a,{...u(h,s)}),aZ(i,a,!0),x(),q&&B(i,a),{cleaned:!0,alreadyTerminated:!1}}async function S(a,c){let f={killed:[],skipped:[],errors:[]},g=await O(a),h=new Set(g.map(a=>`${a.projectId}:${a.id}`)),i=new Set,j=new Set,l=(a,b)=>`${a}:${b}`,m=a=>{let b=a.indexOf(":");return -1===b?{projectId:"",id:a}:{projectId:a.slice(0,b),id:a.slice(b+1)}},n=(a,b)=>{let c=l(a,b);j.delete(c),i.add(c)},o=(a,b)=>{let c=l(a,b);i.has(c)||j.add(c)},q=c?.purgeOpenCode!==!1;for(let a of g)try{let e=b.projects[a.projectId];if(!e||p(e,a.id,a.metadata)){o(a.projectId,a.id);continue}let f=G(e),g=!1;if(a.pr&&f.scm)try{await f.scm.getPRState(a.pr)===d.bz.CLOSED&&(g=!0)}catch{}if(!g&&a.issueId&&f.tracker)try{await f.tracker.isCompleted(a.issueId,e)&&(g=!0)}catch{}if(!g&&a.runtimeHandle&&f.runtime)try{await f.runtime.isAlive(a.runtimeHandle)||(g=!0)}catch{}g?(c?.dryRun||await R(a.id,{purgeOpenCode:q}),n(a.projectId,a.id)):o(a.projectId,a.id)}catch(b){f.errors.push({sessionId:a.id,error:b instanceof Error?b.message:String(b)})}for(let[d,g]of Object.entries(b.projects)){if(a&&d!==a)continue;let b=e(g);for(let a of k(b)){if(h.has(`${d}:${a}`))continue;let e=a$(b,a);if(!e)continue;if(p(g,a,e)){o(d,a);continue}let i=H(g,a,e).agentName,j=bs(e.opencodeSessionId);if("opencode"===i&&e.opencodeCleanedAt){o(d,a);continue}if("opencode"===i&&j&&q){if(!c?.dryRun)try{await bD(j),B(b,a)}catch(b){f.errors.push({sessionId:a,error:`Failed to delete OpenCode session ${j}: ${b instanceof Error?b.message:String(b)}`});continue}n(d,a)}else o(d,a)}}let r=[...i,...j],s=new Map;for(let a of r){let{id:b}=m(a);s.set(b,(s.get(b)??0)+1)}let t=a=>{let{projectId:b,id:c}=m(a);return(s.get(c)??0)>1?`${b}:${c}`:c};return f.killed=[...i].map(t),f.skipped=[...j].map(t),f}async function T(a,e){let{raw:f,sessionsDir:g,project:h}=K(a),i=H(h,a,f).agentName;if("opencode"===i&&!bs(f.opencodeSessionId)){let b=await bG(a,1e4);b&&(f.opencodeSessionId=b,aY(g,a,{opencodeSessionId:b}),x())}let j=f.runtimeHandle?aG(f.runtimeHandle):null,k=j?.runtimeName??h.runtime??b.defaults.runtime,l=c.get("runtime",k);if(!l)throw Error(`No runtime plugin for session ${a}`);let m=c.get("agent",i);if(!m)throw Error(`No agent plugin for session ${a}`);let n=async a=>{try{return await l.getOutput(a,20)??""}catch{return""}},o=a=>{if(!a)return null;try{return m.detectActivity(a)}catch{return null}},p=a=>a.includes("Press up to edit queued messages"),q=async()=>{let a=bs(f.opencodeSessionId);if("opencode"!==i||!a)return;let b=await bE(1e4);return b.find(b=>b.id===a)?.updatedAt},r=async(a,b)=>{let c=a.runtimeHandle;if(!c)return;let d=Date.now()+b,e=null,f=0;for(;;){let[a,b,g,h]=await Promise.all([l.isAlive(c).catch(()=>!0),m.isProcessRunning(c).catch(()=>!0),n(c),"tmux"===c.runtimeName?bL(c.id):Promise.resolve(m.processName)]),i=g.trim().length>0,j=null===h||h===m.processName,k=i?g.trimEnd():null,o=null!==k&&k===e;if(a&&b&&j&&(p(g)||o)){if((f+=1)>=2)return}else f=0;if(e=k,Date.now()>=d)return;await bK(500)}},s=async a=>{let b=a.runtimeHandle;if(!b)return!1;let c=Date.now()+5e3;for(;;){let[a,d,e,f]=await Promise.all([l.isAlive(b).catch(()=>!0),m.isProcessRunning(b).catch(()=>!0),n(b),"tmux"===b.runtimeName?bL(b.id):Promise.resolve(m.processName)]),g=null===f||f===m.processName;if(a&&g&&(d||e.trim().length>0))return!0;if(Date.now()>=c)return!1;await bK(500)}},t=async(b,c)=>{if("done"===c.lifecycle.session.state)throw Error(`Cannot send to session ${a}: ${b}`);try{let b=await V(a);if(!await s(b))throw Error("restored session did not become ready for delivery");return b}catch(d){let c=d instanceof Error?d.message:String(d);throw Error(`Cannot send to session ${a}: ${b} (${c})`,{cause:d})}},u=async(b=!1)=>{let c=await Q(a);if(!c)throw new d.Ag(a);let e=c.runtimeHandle??{id:a,runtimeName:k,data:{}},f=c.runtimeHandle?c:{...c,runtimeHandle:e};if(b||(0,d.qX)(f))return t(b?"session needed to be restarted before delivery":"session is not running",f);let[g,h]=await Promise.all([l.isAlive(e).catch(()=>!0),m.isProcessRunning(e).catch(()=>!0)]);return("spawning"===f.status&&g&&(await r(f,2e4),[g,h]=await Promise.all([l.isAlive(e).catch(()=>!0),m.isProcessRunning(e).catch(()=>!0)])),g&&h)?f:t(g?"agent process is not running":"runtime is not alive",f)},v=async b=>{let c=b.runtimeHandle;if(!c)throw Error(`Session ${a} has no runtime handle`);let d=await n(c),f=o(d)??b.activity,g=await q();await l.sendMessage(c,e);for(let a=1;a<=6;a++){await bK(500);let a=await n(c),e=o(a)??b.activity,h=await q();if(void 0!==g&&void 0!==h&&h>g||p(a)||a.length>0&&a!==d||"active"!==f&&"active"===e||"waiting_input"!==f&&"waiting_input"===e)break}},w=await u();try{await v(w)}catch(a){if(!(void 0===w.restoredAt&&(0,d.qX)(w))){if(a instanceof Error)throw a;throw Error(String(a),{cause:a})}w=await u(!0);try{await v(w)}catch(a){if(a instanceof Error)throw a;throw Error(String(a),{cause:a})}}}async function U(a,b,c){let e,f=b.trim();if(!f)throw Error("PR reference is required");let{raw:g,sessionsDir:h,project:i,projectId:j}=K(a);if(l(a,g,i.sessionPrefix))throw Error(`Session ${a} is an orchestrator session and cannot claim PRs`);let k=G(i,H(i,a,g).agentName).scm;if(!k?.resolvePR||!k.checkoutPR)throw Error(`SCM plugin ${i.scm?.plugin?`"${i.scm.plugin}" `:""}does not support claiming existing PRs`);let m=await k.resolvePR(f,i),n=await k.getPRState(m);if(n!==d.bz.OPEN)throw Error(`Cannot claim PR #${m.number} because it is ${n}`);let o=new Set;for(let{sessionName:b,raw:c}of A(i).filter(b=>b.sessionName!==a)){if(!c||l(b,c,i.sessionPrefix))continue;let a=c.pr===m.url,d=c.branch===m.branch&&(c.prAutoDetect??"on")!=="off";(a||d)&&o.add(b)}let p=[...o],q=g.worktree;if(!q)throw Error(`Session ${a} has no workspace to check out PR #${m.number}`);let r=await k.checkoutPR(m,q),s=t(a,g,a=>{a.pr.state="open",a.pr.reason="in_progress",a.pr.number=m.number,a.pr.url=m.url,a.pr.lastObservedAt=new Date().toISOString()});for(let b of(aY(h,a,{pr:m.url,status:aP(s,aH(g.status)),branch:m.branch,prAutoDetect:"",...u(g,s)}),x(),p)){let a=aW(h,b);if(!a)continue;let c=t(b,a,b=>{b.pr.state="none",b.pr.reason="not_created",b.pr.number=null,b.pr.url=null,b.pr.lastObservedAt=null,bI.has(a.status??"")&&(b.session.state="working",b.session.reason="task_in_progress")});aY(h,b,{pr:"",prAutoDetect:"off",...bI.has(a.status??"")?{status:"working"}:{},...u(a,c)}),x()}let v=!1;if(c?.assignOnGithub)if(k.assignPRToCurrentUser)try{await k.assignPRToCurrentUser(m),v=!0}catch(a){e=a instanceof Error?a.message:String(a)}else e=`SCM plugin "${k.name}" does not support assigning PRs`;return{sessionId:a,projectId:j,pr:m,branchChanged:r,githubAssigned:v,githubAssignmentError:e,takenOverFrom:p}}async function V(a){let c,h,i,j=null,k=null,l=!1,n=J(a);if(n&&(j=n.raw,k=n.sessionsDir,c=n.project,h=n.projectId),!j)for(let[d,f]of Object.entries(b.projects)){let b=e(f),g=a$(b,a);if(g){j=g,k=b,c=f,h=d,l=!0;break}}if(!j||!k||!c||!h)throw new d.Ag(a);let o=H(c,a,j);if("opencode"===o.agentName&&!bs(j.opencodeSessionId)){let b=await bG(a,1e4);if(!b)throw new d.D8(a,"OpenCode session mapping is missing");j={...j,opencodeSessionId:b},l||aY(k,a,{opencodeSessionId:b})}let p=bM(a,j,h,c.sessionPrefix),q=G(c,o.agentName);if(await N(p,q,!0),!(0,d.qX)(p)){if("done"===p.lifecycle.session.state)throw new d.D8(a,`session state is "${p.lifecycle.session.state}"`);throw new d.D8(a,"session is not in a terminal state")}if(l&&aX(k,a,{worktree:j.worktree??"",branch:j.branch??"",status:j.status??"terminated",stateVersion:j.stateVersion,statePayload:j.statePayload,role:j.role,tmuxName:j.tmuxName,issue:j.issue,pr:j.pr,prAutoDetect:"off"===j.prAutoDetect?"off":"on"===j.prAutoDetect?"on":void 0,summary:j.summary,project:j.project,agent:j.agent,createdAt:j.createdAt,runtimeHandle:j.runtimeHandle,opencodeSessionId:j.opencodeSessionId,pinnedSummary:j.pinnedSummary}),!q.runtime)throw Error(`Runtime plugin '${c.runtime??b.defaults.runtime}' not found`);if(!q.agent)throw Error(`Agent plugin '${o.agentName}' not found`);let r=j.worktree||c.path;if(!(q.workspace?.exists?await q.workspace.exists(r):(0,f.existsSync)(r))){if(!q.workspace?.restore)throw new d.CK(r,"workspace plugin does not support restore");if(!p.branch)throw new d.CK(r,"branch metadata is missing");try{let b=await q.workspace.restore({projectId:h,project:c,sessionId:a,branch:p.branch},r);q.workspace.postCreate&&await q.workspace.postCreate(b,c)}catch(a){throw new d.CK(r,`restore failed: ${a instanceof Error?a.message:String(a)}`)}}if("opencode"===q.agent.name&&"orchestrator"===o.role){let b=m(c.storageKey),d=(0,g.join)(b,`orchestrator-prompt-${a}.md`);if((0,f.existsSync)(d))try{bv(r,d)}catch(a){throw Error(`failed to restore OpenCode orchestrator AGENTS.md: ${a instanceof Error?a.message:String(a)}`,{cause:a})}}if(p.runtimeHandle)try{await q.runtime.destroy(p.runtimeHandle)}catch{}let s={...c,agentConfig:{...o.agentConfig,..."orchestrator"===o.role?{permissions:"permissionless"}:{},...p.metadata?.opencodeSessionId?{opencodeSessionId:p.metadata.opencodeSessionId}:{}}},t={sessionId:a,projectConfig:s,issueId:p.issueId??void 0,permissions:"orchestrator"===o.role?"permissionless":o.permissions,model:o.model,subagent:o.subagent};i=q.agent.getRestoreCommand?await q.agent.getRestoreCommand(p,s)??q.agent.getLaunchCommand(t):q.agent.getLaunchCommand(t);let u=q.agent.getEnvironment(t),v=j.tmuxName,w=await q.runtime.create({sessionId:v??a,workspacePath:r,launchCommand:i,environment:{...u,AO_SESSION:a,AO_DATA_DIR:k,AO_SESSION_NAME:a,...v&&{AO_TMUX_NAME:v},AO_CALLER_TYPE:"agent",...h&&{AO_PROJECT_ID:h},AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}}),y=new Date().toISOString();aY(k,a,{status:"spawning",runtimeHandle:JSON.stringify(w),restoredAt:y}),x();let z={...p,status:"spawning",activity:"active",workspacePath:r,runtimeHandle:w,restoredAt:new Date(y)};if(q.agent.postLaunchSetup)try{let b={...z.metadata??{}};await q.agent.postLaunchSetup(z);let c=z.metadata??{},d=Object.fromEntries(Object.entries(c).filter(([a,c])=>b[a]!==c));Object.keys(d).length>0&&(aY(k,a,d),x())}catch{}return z}return{spawn:async function(a){let c,h,i,k,l=b.projects[a.projectId];if(!l)throw Error(`Unknown project: ${a.projectId}`);let m=bB({role:"worker",project:l,defaults:b.defaults,spawnAgentOverride:a.agent}),n=G(l,m.agentName);if(!n.runtime)throw Error(`Runtime plugin '${l.runtime??b.defaults.runtime}' not found`);if(!n.agent)throw Error(`Agent plugin '${m.agentName}' not found`);if(a.issueId&&n.tracker)try{c=await n.tracker.getIssue(a.issueId,l)}catch(b){if((0,d.Fx)(b));else throw Error(`Failed to fetch issue ${a.issueId}: ${b}`,{cause:b})}let o=e(l);b.configPath&&q(b.configPath,l.storageKey);let{sessionId:p,tmuxName:r}=await F(l,o);if(a.branch)h=a.branch;else if(a.issueId&&n.tracker&&c){let b=c.branchName;h=b&&function(a){if(!a||"@"===a||a.startsWith(".")||a.endsWith(".")||a.endsWith("/")||a.endsWith(".lock")||a.includes("..")||a.includes("//")||a.includes("/.")||a.includes("@{")||a.startsWith("/"))return!1;for(let b=0;b<a.length;b++){let c=a.charCodeAt(b);if(c<=31||127===c)return!1}return!/[\s~^:?*[\\]/.test(a)}(b)?b:n.tracker.branchName(a.issueId,l)}else if(a.issueId){let b=a.issueId,c=/^[A-Za-z0-9][A-Za-z0-9._-]*$/.test(b)&&!b.includes("..")?b:b.toLowerCase().replace(/[^a-z0-9]+/g,"-").slice(0,60).replace(/^-+|-+$/g,"");h=`feat/${c||p}`}else h=`session/${p}`;let s=l.path;if(n.workspace)try{let b=await n.workspace.create({projectId:a.projectId,project:l,sessionId:p,branch:h});if(s=b.path,n.workspace.postCreate)try{await n.workspace.postCreate(b,l)}catch(b){if(j(l,a.projectId,s))try{await n.workspace.destroy(s)}catch{}throw b}}catch(a){try{aZ(o,p,!1)}catch{}throw a}if(a.issueId&&n.tracker&&c)try{i=await n.tracker.generatePrompt(a.issueId,l)}catch{}let t=function(a){let b=function(a){let b=[];if(a.agentRules&&b.push(a.agentRules),a.agentRulesFile){let c=(0,g.resolve)(a.path,a.agentRulesFile);try{let a=(0,f.readFileSync)(c,"utf-8").trim();a&&b.push(a)}catch{}}return b.length>0?b.join("\n\n"):null}(a.project),c=[];return c.push(a.project.repo?bp:bq),c.push(function(a){let{project:b,projectId:c,issueId:d,issueContext:e}=a,f=[];if(f.push("## Project Context"),f.push(`- Project: ${b.name??c}`),b.repo&&f.push(`- Repository: ${b.repo}`),f.push(`- Default branch: ${b.defaultBranch}`),b.tracker&&f.push(`- Tracker: ${b.tracker.plugin}`),d&&(f.push(`
|
|
84
|
-
## Task`),f.push(`Work on issue: ${d}`),f.push(`Create a branch named so that it auto-links to the issue tracker (e.g. feat/${d}).`)),e&&(f.push(`
|
|
85
|
-
## Issue Details`),f.push(e)),b.reactions){let a=[];for(let[c,d]of Object.entries(b.reactions))d.auto&&"send-to-agent"===d.action&&a.push(`- ${c}: auto-handled (you'll receive instructions)`);a.length>0&&(f.push(`
|
|
86
|
-
## Automated Reactions`),f.push("The orchestrator will automatically handle these events:"),f.push(...a))}return f.join("\n")}(a)),b&&c.push(`## Project Rules
|
|
87
|
-
${b}`),a.userPrompt&&c.push(`## Additional Instructions
|
|
88
|
-
${a.userPrompt}`),c.join("\n\n")}({project:l,projectId:a.projectId,issueId:a.issueId,issueContext:i,userPrompt:a.prompt}),u=l.opencodeIssueSessionStrategy??"reuse",v="opencode"===n.agent.name&&a.issueId?await D({sessionsDir:o,criteria:{issueId:a.issueId},strategy:u}):void 0,w={sessionId:p,projectConfig:{...l,agentConfig:{...m.agentConfig,...v?{opencodeSessionId:v}:{}}},issueId:a.issueId,prompt:t,permissions:m.permissions,model:m.model,subagent:a.subagent??m.subagent};try{let c=n.agent.getLaunchCommand(w),d=n.agent.getEnvironment(w);k=await n.runtime.create({sessionId:r??p,workspacePath:s,launchCommand:c,environment:{...d,AO_SESSION:p,AO_DATA_DIR:o,AO_SESSION_NAME:p,...r&&{AO_TMUX_NAME:r},AO_CALLER_TYPE:"agent",AO_PROJECT_ID:a.projectId,AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}})}catch(b){if(n.workspace&&j(l,a.projectId,s))try{await n.workspace.destroy(s)}catch{}try{aZ(o,p,!1)}catch{}throw b}let y=new Date,z=aM("worker",y);z.runtime.handle=k,z.runtime.tmuxName=r??null;let A={id:p,projectId:a.projectId,status:aP(z),activity:"active",activitySignal:a5("valid",{activity:"active",timestamp:y,source:"runtime"}),lifecycle:z,branch:h,issueId:a.issueId??null,pr:null,workspacePath:s,runtimeHandle:k,agentInfo:null,createdAt:y,lastActivityAt:y,metadata:{...v?{opencodeSessionId:v}:{},...a.prompt?{userPrompt:a.prompt}:{}}};try{if(aX(o,p,{worktree:s,branch:h,status:aP(z),...aQ(z),tmuxName:r,issue:a.issueId,project:a.projectId,agent:m.agentName,createdAt:y.toISOString(),runtimeHandle:JSON.stringify(k),opencodeSessionId:v,userPrompt:a.prompt}),n.agent.postLaunchSetup&&await n.agent.postLaunchSetup(A),"opencode"===n.agent.name&&"reuse"===u&&!A.metadata.opencodeSessionId){let a=await bG(p,1e4);a&&(A.metadata.opencodeSessionId=a)}Object.keys(A.metadata||{}).length>0&&aY(o,p,A.metadata),x()}catch(b){try{await n.runtime.destroy(k)}catch{}if(n.workspace&&j(l,a.projectId,s))try{await n.workspace.destroy(s)}catch{}try{aZ(o,p,!1)}catch{}throw x(),b}let B=!1;if("post-launch"===n.agent.promptDelivery&&w.prompt){let a;for(let b=1;b<=3;b++)try{await new Promise(a=>setTimeout(a,3e3*b)),await n.runtime.sendMessage(k,w.prompt),B=!0;break}catch(c){a=c instanceof Error?c:Error(String(c)),console.error(`[session-manager] Prompt delivery attempt ${b}/3 failed: ${a.message}`)}B||console.error(`[session-manager] FAILED to deliver prompt to session ${p} after 3 attempts. User must send manually with 'ao send'. Last error: ${a?.message}`),A.metadata.promptDelivered=String(B)}else w.prompt&&(A.metadata.promptDelivered="true");return A.metadata.promptDelivered&&(aY(o,p,A.metadata),x()),A},spawnOrchestrator:async function(a){var c;let d,h,i,j,l=b.projects[a.projectId];if(!l)throw Error(`Unknown project: ${a.projectId}`);let n=bB({role:"orchestrator",project:l,defaults:b.defaults,spawnAgentOverride:a.agent}),p=G(l,n.agentName);if(!p.runtime)throw Error(`Runtime plugin '${l.runtime??b.defaults.runtime}' not found`);if(!p.agent)throw Error(`Agent plugin '${n.agentName}' not found`);let r="kill-previous"===(c=l.orchestratorSessionStrategy)||"delete-new"===c?"delete":"ignore-new"===c?"ignore":c??"reuse",s=e(l);b.configPath&&q(b.configPath,l.storageKey);let t=function(a,c){let d=`${a.sessionPrefix}-orchestrator`,e=new Set,f=RegExp(`^${bH(d)}-(\\d+)$`);for(let a of[...a_(c),...k(c)]){let b=a.match(f);if(b){let a=Number.parseInt(b[1],10);Number.isNaN(a)||e.add(a)}}for(let[c,e]of Object.entries(b.projects)){let b=e.sessionPrefix??c;if(b!==a.sessionPrefix&&b===d)throw Error(`Cannot spawn orchestrator for project "${a.sessionPrefix}": the orchestrator ID prefix "${d}" conflicts with the session prefix of project "${c}" ("${b}"). Rename one of the project sessionPrefix values to avoid this overlap.`)}let g=1;for(let f=0;f<1e4;f++){if(!e.has(g)){let e=`${d}-${g}`,f=b.configPath?o(a.storageKey,d,g):void 0;if(a0(c,e))return{num:g,sessionId:e,tmuxName:f}}g+=1}throw Error(`Failed to reserve orchestrator session ID after 10000 attempts (prefix: ${d})`)}(l,s),u=t.sessionId,v=t.tmuxName,w=`orchestrator/${u}`;if(!p.workspace){try{aZ(s,u,!1)}catch{}throw Error(`spawnOrchestrator requires a workspace plugin but none is configured for project '${a.projectId}'`)}try{d=(await p.workspace.create({projectId:a.projectId,project:l,sessionId:u,branch:w})).path}catch(a){try{aZ(s,u,!1)}catch{}throw a}let y=async a=>{try{await p.workspace.destroy(d)}catch{}try{aZ(s,u,!1)}catch{}if(a)try{(0,f.unlinkSync)(a)}catch{}};try{p.agent.setupWorkspaceHooks&&await p.agent.setupWorkspaceHooks(d,{dataDir:s})}catch(a){throw await y(),a}if(a.systemPrompt)try{let b=m(l.storageKey);(0,f.mkdirSync)(b,{recursive:!0}),h=(0,g.join)(b,`orchestrator-prompt-${u}.md`),(0,f.writeFileSync)(h,a.systemPrompt,"utf-8")}catch(a){throw await y(h),a}if("opencode"===p.agent.name&&h)try{bv(d,h)}catch(a){throw await y(h),a}try{i="opencode"===p.agent.name&&"reuse"===r?await D({sessionsDir:s,criteria:{sessionId:u},strategy:"reuse"}):void 0,"opencode"===p.agent.name&&"delete"===r&&await D({sessionsDir:s,criteria:{sessionId:u},strategy:"delete",includeTitleDiscoveryForSessionId:!0})}catch(a){throw await y(h),a}let z={sessionId:u,projectConfig:{...l,agentConfig:{...n.agentConfig,permissions:"permissionless",...i?{opencodeSessionId:i}:{}}},permissions:"permissionless",model:n.model,systemPromptFile:h,subagent:n.subagent},A=p.agent.getLaunchCommand(z),B=p.agent.getEnvironment(z);try{j=await p.runtime.create({sessionId:v??u,workspacePath:d,launchCommand:A,environment:{...B,AO_SESSION:u,AO_DATA_DIR:s,AO_SESSION_NAME:u,...v&&{AO_TMUX_NAME:v},AO_CALLER_TYPE:"orchestrator",AO_PROJECT_ID:a.projectId,AO_CONFIG_PATH:b.configPath,...void 0!==b.port&&null!==b.port&&{AO_PORT:String(b.port)}}})}catch(a){throw await y(h),a}let C=new Date,E=aM("orchestrator",C);E.session.state="working",E.session.reason="task_in_progress",E.session.startedAt=C.toISOString(),E.session.lastTransitionAt=C.toISOString(),E.runtime.handle=j,E.runtime.tmuxName=v??null;let F={id:u,projectId:a.projectId,status:aP(E),activity:"active",activitySignal:a5("valid",{activity:"active",timestamp:C,source:"runtime"}),lifecycle:E,branch:w,issueId:null,pr:null,workspacePath:d,runtimeHandle:j,agentInfo:null,createdAt:C,lastActivityAt:C,metadata:{...i?{opencodeSessionId:i}:{}}};try{if(aX(s,u,{worktree:d,branch:w,status:aP(E),...aQ(E),role:"orchestrator",tmuxName:v,project:a.projectId,agent:n.agentName,createdAt:C.toISOString(),runtimeHandle:JSON.stringify(j),opencodeSessionId:i}),p.agent.postLaunchSetup&&await p.agent.postLaunchSetup(F),"opencode"===p.agent.name&&"reuse"===r&&!F.metadata.opencodeSessionId){let a=await bG(u,1e4);a&&(F.metadata.opencodeSessionId=a)}Object.keys(F.metadata||{}).length>0&&aY(s,u,F.metadata),x()}catch(a){try{await p.runtime.destroy(j)}catch{}throw await y(h),a}return F},restore:V,list:O,listCached:P,invalidateCache:x,get:Q,kill:R,cleanup:S,send:T,claimPR:U,remap:async function(a,b=!1){let{raw:c,sessionsDir:d,project:e}=K(a);if("opencode"!==H(e,a,c).agentName)throw Error(`Session ${a} is not using the opencode agent`);let f=bs(c.opencodeSessionId),g=b?await bG(a,1e4):f??await bG(a,1e4);if(!g)throw Error(`OpenCode session mapping is missing for ${a}`);return aY(d,a,{opencodeSessionId:g}),g}}}let bO={debug:10,info:20,warn:30,error:40};function bP(){return new Date().toISOString()}function bQ(a){return a.replace(/[^a-zA-Z0-9_-]+/g,"-").replace(/^-+|-+$/g,"")||"component"}function bR(a){return bO[a]>=bO[function(){let a=process.env.AO_LOG_LEVEL?.trim().toLowerCase();return"debug"===a||"info"===a||"warn"===a||"error"===a?a:"warn"}()]}function bS(a,b){(function(){let a=process.env.AO_OBSERVABILITY_STDERR?.trim().toLowerCase();return"1"===a||"true"===a||"yes"===a||"on"===a})()&&bR(b)&&process.stderr.write(`${JSON.stringify({...a,level:b})}
|
|
89
|
-
`)}function bT(a){let b=(0,g.join)(function(a){let b=function(a){let b;try{b=(0,f.realpathSync)(a)}catch{b=(0,g.resolve)(a)}let c=(0,g.dirname)(b);return(0,e.createHash)("sha256").update(c).digest("hex").slice(0,12)}(a);return(0,g.join)(p("~/.agent-orchestrator"),`${b}-observability`)}(a.configPath),"processes");return(0,f.mkdirSync)(b,{recursive:!0}),b}function bU(a,b){return(0,g.join)(bT(a),`${bQ(b)}-${process.pid}.json`)}function bV(a){let b=a.replace(/\s+/g," ").trim();return b.length>256?`${b.slice(0,256)}…`:b}function bW(a){if(a)return function a(b,c=0){return null==b?b:"string"==typeof b?bV(b):"number"==typeof b||"boolean"==typeof b?b:c>=4?"[truncated]":Array.isArray(b)?b.slice(0,25).map(b=>a(b,c+1)):"object"==typeof b?Object.fromEntries(Object.entries(b).slice(0,25).map(([b,d])=>[b,/token|secret|password|cookie|authorization|api[-_]?key|prompt|message|note/i.test(b)?"[redacted]":a(d,c+1)])):String(b)}(a)}function bX(a){if(a)return bV(a)}function bY(a){if(a)return bV(a)}function bZ(a,b,c){let d=`${a}.1`;(0,f.existsSync)(a)&&(0,f.statSync)(a).size>=c&&((0,f.existsSync)(d)&&(0,f.unlinkSync)(d),(0,f.renameSync)(a,d)),(0,f.appendFileSync)(a,`${JSON.stringify(b)}
|
|
90
|
-
`,"utf-8")}function b$(a,b){return b.localeCompare(a)}function b_(a){switch(a){case"error":return 3;case"warn":return 2;default:return 1}}function b0(a="ao"){return`${a}-${(0,e.randomUUID)()}`}function b1(a,b){let c=bQ(b);function d(b,d){try{var e,h;let i=bU(a,c),j=function(a,b){if(!(0,f.existsSync)(a))return{version:1,component:b,pid:process.pid,updatedAt:bP(),metrics:{},traces:[],sessions:{},health:{}};try{let c=JSON.parse((0,f.readFileSync)(a,"utf-8"));return{version:1,component:b,pid:process.pid,updatedAt:"string"==typeof c.updatedAt?c.updatedAt:bP(),metrics:c.metrics&&"object"==typeof c.metrics?c.metrics:{},traces:Array.isArray(c.traces)?c.traces:[],sessions:c.sessions&&"object"==typeof c.sessions?c.sessions:{},health:c.health&&"object"==typeof c.health?c.health:{}}}catch{return{version:1,component:b,pid:process.pid,updatedAt:bP(),metrics:{},traces:[],sessions:{},health:{}}}}(i,c);b(j);let k=bU(a,j.component);j.updatedAt=bP();let l=`${k}.tmp.${process.pid}.${Date.now()}`;(0,f.writeFileSync)(l,`${JSON.stringify(j,null,2)}
|
|
91
|
-
`,"utf-8"),(0,f.renameSync)(l,k),d&&bR(d.level)&&(e=d.payload,h=d.level,bZ((0,g.join)(bT(a),`${bQ(c)}-${process.pid}.ndjson`),{...e,level:h},5242880),bS(d.payload,d.level))}catch(d){let b={source:"ao-observability",timestamp:bP(),component:c,outcome:"failure",operation:"observability.write",reason:d instanceof Error?d.message:String(d)};try{let c=(0,g.join)(bT(a),"observability-errors.ndjson");bZ(c,b,524288)}catch{}bS(b,"error")}}return{component:c,recordOperation(a){let b=bP(),f=a.operation??a.metric,g=a.level??("failure"===a.outcome?"error":"info"),h={id:(0,e.randomUUID)(),timestamp:b,component:c,operation:f,outcome:a.outcome,correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,path:bY(a.path),reason:bX(a.reason),durationMs:a.durationMs,data:bW(a.data)};d(c=>{var d,e;let g=(d=a.metric,e=a.projectId,`${e??"unknown"}::${d}`),i=c.metrics[g]??{total:0,success:0,failure:0};if(i.total+=1,i.lastAt=b,"success"===a.outcome?(i.success+=1,i.lastSuccessAt=b):(i.failure+=1,i.lastFailureAt=b,i.lastFailureReason=bX(a.reason)),c.metrics[g]=i,c.traces=[h,...c.traces].sort((a,b)=>b$(a.timestamp,b.timestamp)).slice(0,80),a.sessionId){c.sessions[a.sessionId]={sessionId:a.sessionId,projectId:a.projectId,correlationId:a.correlationId,operation:f,outcome:a.outcome,updatedAt:b,reason:bX(a.reason)};let d=Object.entries(c.sessions).sort(([,a],[,b])=>b$(a.updatedAt,b.updatedAt));c.sessions=Object.fromEntries(d.slice(0,200))}},{level:g,payload:{source:"ao-observability",timestamp:b,component:c,metric:a.metric,operation:f,outcome:a.outcome,correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,reason:bX(a.reason),durationMs:a.durationMs,path:bY(a.path),data:bW(a.data)}})},recordDiagnostic(a){let b=bP(),f=a.level??"info",g={id:(0,e.randomUUID)(),timestamp:b,component:c,operation:a.operation,outcome:"success",correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,path:bY(a.path),data:{message:bV(a.message),...bW(a.data)}};d(c=>{if(c.traces=[g,...c.traces].sort((a,b)=>b$(a.timestamp,b.timestamp)).slice(0,80),a.sessionId){c.sessions[a.sessionId]={sessionId:a.sessionId,projectId:a.projectId,correlationId:a.correlationId,operation:a.operation,outcome:"success",updatedAt:b};let d=Object.entries(c.sessions).sort(([,a],[,b])=>b$(a.updatedAt,b.updatedAt));c.sessions=Object.fromEntries(d.slice(0,200))}},{level:f,payload:{source:"ao-observability",timestamp:b,component:c,operation:a.operation,correlationId:a.correlationId,projectId:a.projectId,sessionId:a.sessionId,path:bY(a.path),data:{message:bV(a.message),...bW(a.data)}}})},setHealth(a){let b=bP();d(d=>{d.health[a.surface]={surface:a.surface,status:a.status,updatedAt:b,component:c,projectId:a.projectId,correlationId:a.correlationId,reason:bX(a.reason),details:bW(a.details)}},{level:"error"===a.status?"error":"warn"===a.status?"warn":"info",payload:{source:"ao-observability",timestamp:b,component:c,surface:a.surface,status:a.status,projectId:a.projectId,correlationId:a.correlationId,reason:bX(a.reason),details:bW(a.details)}})}}}function b2(a){let b=bT(a),c={};for(let a of(0,f.readdirSync)(b)){let d;if(!a.endsWith(".json"))continue;let e=(0,g.join)(b,a);try{d=JSON.parse((0,f.readFileSync)(e,"utf-8"))}catch{continue}if(d&&"object"==typeof d){for(let[a,b]of Object.entries(d.metrics??{})){let{projectId:e,metric:f}=function(a){let b=a.indexOf("::");if(-1===b)return{metric:a};let c=a.slice(0,b);return{projectId:"unknown"===c?void 0:c,metric:a.slice(b+2)}}(a);if(!e)continue;let g=c[e]??(c[e]={projectId:e,updatedAt:d.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}});g.metrics[f]=function(a,b){let c={total:(a?.total??0)+(b.total??0),success:(a?.success??0)+(b.success??0),failure:(a?.failure??0)+(b.failure??0),lastAt:a?.lastAt,lastSuccessAt:a?.lastSuccessAt,lastFailureAt:a?.lastFailureAt,lastFailureReason:a?.lastFailureReason};return b.lastAt&&(!c.lastAt||b.lastAt>c.lastAt)&&(c.lastAt=b.lastAt),b.lastSuccessAt&&(!c.lastSuccessAt||b.lastSuccessAt>c.lastSuccessAt)&&(c.lastSuccessAt=b.lastSuccessAt),b.lastFailureAt&&(!c.lastFailureAt||b.lastFailureAt>c.lastFailureAt)&&(c.lastFailureAt=b.lastFailureAt,c.lastFailureReason=b.lastFailureReason),c}(g.metrics[f],b),d.updatedAt>g.updatedAt&&(g.updatedAt=d.updatedAt)}for(let a of d.traces??[]){if(!a.projectId)continue;let b=c[a.projectId]??(c[a.projectId]={projectId:a.projectId,updatedAt:a.timestamp,metrics:{},health:{},recentTraces:[],sessions:{}});b.recentTraces.push(a),a.timestamp>b.updatedAt&&(b.updatedAt=a.timestamp)}for(let a of Object.values(d.health??{})){let b=a.projectId;if(!b)continue;let d=c[b]??(c[b]={projectId:b,updatedAt:a.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}}),e=d.health[a.surface];(!e||a.updatedAt>=e.updatedAt)&&(d.health[a.surface]=a),a.updatedAt>d.updatedAt&&(d.updatedAt=a.updatedAt)}for(let a of Object.values(d.sessions??{})){if(!a.projectId)continue;let b=c[a.projectId]??(c[a.projectId]={projectId:a.projectId,updatedAt:a.updatedAt,metrics:{},health:{},recentTraces:[],sessions:{}}),d=b.sessions[a.sessionId];(!d||a.updatedAt>=d.updatedAt)&&(b.sessions[a.sessionId]=a),a.updatedAt>b.updatedAt&&(b.updatedAt=a.updatedAt)}}}let d="ok";for(let a of Object.values(c))for(let b of(a.recentTraces=a.recentTraces.sort((a,b)=>b$(a.timestamp,b.timestamp)).slice(0,80),Object.values(a.health)))b_(b.status)>b_(d)&&(d=b.status);return{generatedAt:bP(),overallStatus:d,projects:c}}function b3(a){let b=a.match(/^(\d+)(s|m|h)$/);if(!b)return 0;let c=parseInt(b[1],10);switch(b[2]){case"s":return 1e3*c;case"m":return 6e4*c;case"h":return 36e5*c;default:return 0}}function b4(a){return a.includes("stuck")||a.includes("needs_input")||a.includes("errored")?"urgent":a.startsWith("summary.")?"info":a.includes("approved")||a.includes("ready")||a.includes("merged")||a.includes("completed")?"action":a.includes("fail")||a.includes("changes_requested")||a.includes("conflicts")?"warning":"info"}function b5(a,b){return{id:(0,e.randomUUID)(),type:a,priority:b.priority??b4(a),sessionId:b.sessionId,projectId:b.projectId,timestamp:new Date,message:b.message,data:b.data??{}}}function b6(a,b){switch(b){case"working":return"session.working";case"pr_open":return"pr.created";case"ci_failed":return"ci.failing";case"review_pending":return"review.pending";case"changes_requested":return"review.changes_requested";case"approved":return"review.approved";case"mergeable":return"merge.ready";case"merged":return"merge.completed";case"needs_input":return"session.needs_input";case"stuck":return"session.stuck";case"errored":return"session.errored";case"killed":return"session.killed";default:return null}}function b7(a){switch(a){case"pr.closed":return"pr-closed";case"ci.failing":return"ci-failed";case"review.changes_requested":return"changes-requested";case"automated_review.found":return"bugbot-comments";case"merge.conflicts":return"merge-conflicts";case"merge.ready":return"approved-and-green";case"session.stuck":return"agent-stuck";case"session.needs_input":return"agent-needs-input";case"session.killed":return"agent-exited";case"summary.all_complete":return"all-complete";default:return null}}function b8(a){let b=b6(void 0,a);if(!b)return"info";let c=b4(b);return"urgent"===c?"error":"warning"===c?"warn":"info"}function b9(a){return"detecting"===a.session.state?a.session.reason:"not_created"!==a.pr.reason&&"in_progress"!==a.pr.reason?a.pr.reason:"process_running"!==a.runtime.reason?a.runtime.reason:a.session.reason}function ca(a,b,c,d,e,f,g,h){return{oldStatus:c,newStatus:d,statusTransition:g,previousSessionState:a.session.state,newSessionState:b.session.state,previousSessionReason:a.session.reason,newSessionReason:b.session.reason,previousPRState:a.pr.state,newPRState:b.pr.state,previousPRReason:a.pr.reason,newPRReason:b.pr.reason,previousRuntimeState:a.runtime.state,newRuntimeState:b.runtime.state,previousRuntimeReason:a.runtime.reason,newRuntimeReason:b.runtime.reason,primaryReason:b9(b),evidence:e,signalsConsulted:e.split(/\s+/).map(a=>a.trim()).filter(a=>a.length>0),detectingAttempts:f,recoveryAction:h?.result?.action??null,reactionKey:h?.key??null,reactionSuccess:h?.result?.success??null,escalated:h?.result?.escalated??null}}function cb(a){let{config:b,registry:c,sessionManager:e,projectId:f}=a,g=b1(b,"lifecycle-manager"),h=new Map,i=new Map,j=null,k=!1,l=!1,m=new Map,o=new Map;async function p(a){m.clear();let d=new Map,e=new Set;for(let c of a){if(!c.pr)continue;let a=b.projects[c.projectId];if(!a?.scm?.plugin)continue;let f=`${c.pr.owner}/${c.pr.repo}#${c.pr.number}`;if(e.has(f))continue;e.add(f);let g=a.scm.plugin;d.has(g)||d.set(g,[]);let h=d.get(g);h&&h.push(c.pr)}for(let[a,b]of d){let d=c.get("scm",a);if(!d?.enrichSessionsPRBatch)continue;let e=Date.now();try{for(let[c,h]of(await d.enrichSessionsPRBatch(b,{recordSuccess(c){let d=Date.now()-e;g?.recordOperation({metric:"graphql_batch",operation:"batch_enrichment",correlationId:b0("graphql-batch"),outcome:"success",projectId:f,durationMs:d,data:{plugin:a,prCount:b.length,prKeys:b.map(a=>`${a.owner}/${a.repo}#${a.number}`)},level:"info"})},recordFailure(c){let d=Date.now()-e;g?.recordOperation({metric:"graphql_batch",operation:"batch_enrichment",correlationId:b0("graphql-batch"),outcome:"failure",reason:c.error,level:"warn",data:{plugin:a,prCount:b.length,error:c.error,durationMs:d}})},log(b,c){g?.recordDiagnostic?.({operation:"batch_enrichment.log",correlationId:b0("graphql-batch"),projectId:f,message:c,level:b,data:{plugin:a,source:"ao-graphql-batch"}})}})))m.set(c,h)}catch(e){let c=e instanceof Error?e.message:String(e),d=b0("batch-enrichment");g?.recordOperation?.({metric:"lifecycle_poll",operation:"batch_enrichment",correlationId:d,outcome:"failure",reason:c,level:"warn",data:{plugin:a,prCount:b.length}})}}}function q(a,b){let c=u(a,"agent-stuck"),d=c?.threshold;if("string"!=typeof d)return!1;let e=b3(d);return!(e<=0)&&Date.now()-b.getTime()>e}async function r(a){let e=b.projects[a.projectId];if(!e)return{status:a.status,evidence:"project_missing",detectingAttempts:bi(a.metadata.detectingAttempts)};let f=aR(a.lifecycle),h=new Date().toISOString(),i=bB({role:bA(a.id,a.metadata,e.sessionPrefix,Object.values(b.projects).map(a=>a.sessionPrefix)),project:e,defaults:b.defaults,persistedAgent:a.metadata.agent}).agentName,j=c.get("agent",i),k=e.scm?.plugin?c.get("scm",e.scm.plugin):null,l=null,o=!1,p=a.status!==d.SB.SPAWNING,r=bi(a.metadata.detectingAttempts),s=a.metadata.detectingStartedAt||void 0,t=a.metadata.detectingEvidenceHash||void 0,u=(b={status:aP(f,a.status),evidence:"lifecycle_commit",detectingAttempts:r})=>(b.prState&&(f.pr.state=b.prState,f.pr.lastObservedAt=h),b.prReason&&(f.pr.reason=b.prReason),b.sessionState&&b.sessionReason&&(f.session.state=b.sessionState,f.session.reason=b.sessionReason,f.session.lastTransitionAt=h,"working"===b.sessionState&&null===f.session.startedAt&&(f.session.startedAt=h),"done"===b.sessionState&&null===f.session.completedAt&&(f.session.completedAt=h),"terminated"===b.sessionState&&null===f.session.terminatedAt&&(f.session.terminatedAt=h)),a.lifecycle=f,a.status=b.status,a.activitySignal=w,{status:b.status,evidence:b.evidence,detectingAttempts:b.detectingAttempts,detectingStartedAt:b.detectingStartedAt,detectingEvidenceHash:b.detectingEvidenceHash}),v={state:"unknown",failed:!1};if(a.runtimeHandle&&p){let d=c.get("runtime",e.runtime??b.defaults.runtime);if(d)try{let b=await d.isAlive(a.runtimeHandle);f.runtime.lastObservedAt=h,v={state:b?"alive":"dead",failed:!1},b?(f.runtime.state="alive",f.runtime.reason="process_running"):(f.runtime.state="missing",f.runtime.reason="tmux"===a.runtimeHandle.runtimeName?"tmux_missing":"process_missing")}catch{f.runtime.state="probe_failed",f.runtime.reason="probe_error",f.runtime.lastObservedAt=h,v={state:"unknown",failed:!0}}}let w=a5("unavailable"),x={state:"unknown",failed:!1},y=a8(w);if(j&&(a.runtimeHandle||a.workspacePath))try{if(j.recordActivity&&a.workspacePath&&a.runtimeHandle&&p)try{let d=c.get("runtime",e.runtime??b.defaults.runtime),f=d?await d.getOutput(a.runtimeHandle,10):"";f&&await j.recordActivity(a,f)}catch(b){g?.recordOperation?.({metric:"lifecycle_poll",operation:"activity.record",outcome:"failure",correlationId:b0("lifecycle-poll"),projectId:a.projectId,sessionId:a.id,reason:b instanceof Error?b.message:String(b),level:"warn"})}let i=await j.getActivityState(a,b.readyThresholdMs);if(i){if(w=a6(i,"native"),y=a8(w),f.runtime.lastObservedAt=h,"missing"!==f.runtime.state&&"probe_failed"!==f.runtime.state&&(f.runtime.state="alive",f.runtime.reason="process_running"),"waiting_input"===i.state)return u({status:d.SB.NEEDS_INPUT,evidence:y,detectingAttempts:0,sessionState:"needs_input",sessionReason:"awaiting_user_input"});"exited"===i.state&&p&&(x={state:"dead",failed:!1},f.runtime.state="exited",f.runtime.reason="process_missing"),a7(w)&&(l=w.timestamp,o="blocked"===w.activity)}else if(a.runtimeHandle&&p){w=a5("null",{source:"native"}),y=a8(w);let g=c.get("runtime",e.runtime??b.defaults.runtime),i=g?await g.getOutput(a.runtimeHandle,10):"";if(i){let b=j.detectActivity(i);if(w=a6({state:b},"terminal"),y=a8(w),"waiting_input"===b)return u({status:d.SB.NEEDS_INPUT,evidence:y,detectingAttempts:0,sessionState:"needs_input",sessionReason:"awaiting_user_input"});try{let b=await j.isProcessRunning(a.runtimeHandle);x={state:b?"alive":"dead",failed:!1},b||(f.runtime.state="exited",f.runtime.reason="process_missing",f.runtime.lastObservedAt=h)}catch{x={state:"unknown",failed:!0}}}}else w=a5("null",{source:"native"}),y=a8(w)}catch{if(y=a8(w=a5("probe_failure",{source:"native"})),"stuck"===f.session.state||"needs_input"===f.session.state||"detecting"===f.session.state)return u({status:a.status,evidence:y,detectingAttempts:r});return u(bf({currentAttempts:r,idleWasBlocked:o,evidence:y,detectingStartedAt:s,previousEvidenceHash:t}))}if("unknown"===x.state&&a.runtimeHandle&&p&&j)try{let b=await j.isProcessRunning(a.runtimeHandle);x={state:b?"alive":"dead",failed:!1},b||(f.runtime.state="exited",f.runtime.reason="process_missing",f.runtime.lastObservedAt=h)}catch{x={state:"unknown",failed:!0}}let z=function(a){let b=function(a,b=new Date){return"valid"===a.state&&a.timestamp instanceof Date&&null!==a.activity&&a2.has(a.activity)&&"stale"!==a4(a.timestamp,b)}(a.activitySignal);return a.runtimeProbe.failed||a.processProbe.failed?bf({currentAttempts:a.currentAttempts,idleWasBlocked:a.idleWasBlocked,evidence:`probe_failed runtime=${a.runtimeProbe.state} process=${a.processProbe.state} ${a.activityEvidence}`,detectingStartedAt:a.detectingStartedAt,previousEvidenceHash:a.previousEvidenceHash}):"dead"===a.runtimeProbe.state&&"alive"===a.processProbe.state||"alive"===a.runtimeProbe.state&&"dead"===a.processProbe.state||"dead"===a.runtimeProbe.state&&b?bf({currentAttempts:a.currentAttempts,idleWasBlocked:a.idleWasBlocked,evidence:`signal_disagreement runtime=${a.runtimeProbe.state} process=${a.processProbe.state} ${a.activityEvidence}`,reason:"dead"===a.runtimeProbe.state?"runtime_lost":"agent_process_exited",detectingStartedAt:a.detectingStartedAt,previousEvidenceHash:a.previousEvidenceHash}):"dead"===a.runtimeProbe.state&&"unknown"===a.processProbe.state&&a.canProbeRuntimeIdentity?bf({currentAttempts:a.currentAttempts,idleWasBlocked:a.idleWasBlocked,evidence:`runtime_dead process_unknown ${a.activityEvidence}`,reason:"runtime_lost",detectingStartedAt:a.detectingStartedAt,previousEvidenceHash:a.previousEvidenceHash}):"dead"!==a.runtimeProbe.state||"dead"!==a.processProbe.state||b?null:{status:d.SB.KILLED,evidence:`runtime_dead process_dead ${a.activityEvidence}`,detectingAttempts:0,sessionState:"terminated",sessionReason:"runtime_lost"}}({currentAttempts:r,runtimeProbe:v,processProbe:x,canProbeRuntimeIdentity:p,activitySignal:w,activityEvidence:y,idleWasBlocked:o,detectingStartedAt:s,previousEvidenceHash:t});if(z)return u(z);if(!a.pr&&k&&a.branch&&"off"!==a.metadata.prAutoDetect&&"orchestrator"!==a.metadata.role&&!a.id.endsWith("-orchestrator"))try{let b=await k.detectPR(a,e);if(b){a.pr=b,f.pr.state="open",f.pr.reason="in_progress",f.pr.number=b.number,f.pr.url=b.url,f.pr.lastObservedAt=h;let c=n(e.storageKey);aY(c,a.id,{pr:b.url})}}catch(b){g?.recordOperation?.({metric:"lifecycle_poll",operation:"scm.detect_pr",outcome:"failure",correlationId:b0("lifecycle-poll"),projectId:a.projectId,sessionId:a.id,reason:b instanceof Error?b.message:String(b),level:"warn"})}if(a.pr&&k)try{let b=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,c=m.get(b);f.pr.number=a.pr.number,f.pr.url=a.pr.url,f.pr.lastObservedAt=h;let e=!!(null!==l&&a7(w))&&q(a,l);if(c)return u(function(a,b){let c=bg(a.state);return c||bh({reviewDecision:a.reviewDecision,ciFailing:a.ciStatus===d.U1.FAILING,mergeable:a.mergeable,shouldEscalateIdleToStuck:b.shouldEscalateIdleToStuck,idleWasBlocked:b.idleWasBlocked,activityEvidence:b.activityEvidence})}(c,{shouldEscalateIdleToStuck:e,idleWasBlocked:o,activityEvidence:y}));let g=await k.getPRState(a.pr);if(g===d.bz.MERGED||g===d.bz.CLOSED)return u(bj({prState:g,ciStatus:d.U1.NONE,reviewDecision:"none",mergeable:!1,shouldEscalateIdleToStuck:e,idleWasBlocked:o,activityEvidence:y}));let i=await k.getCISummary(a.pr);if(i===d.U1.FAILING)return u(bj({prState:g,ciStatus:i,reviewDecision:"none",mergeable:!1,shouldEscalateIdleToStuck:e,idleWasBlocked:o,activityEvidence:y}));let j=await k.getReviewDecision(a.pr),n="approved"===j||"none"===j?await k.getMergeability(a.pr):{mergeable:!1};return u(bj({prState:g,ciStatus:i,reviewDecision:j,mergeable:n.mergeable,shouldEscalateIdleToStuck:e,idleWasBlocked:o,activityEvidence:y}))}catch(b){g?.recordOperation?.({metric:"lifecycle_poll",operation:"scm.poll_pr",outcome:"failure",correlationId:b0("lifecycle-poll"),projectId:a.projectId,sessionId:a.id,reason:b instanceof Error?b.message:String(b),level:"warn"})}let A=bd(a.metadata);if(A&&function(a,b=new Date,c=3e5,d=6e4){let e=Date.parse(a.timestamp);if(Number.isNaN(e))return!1;let f=b.getTime();return!(e>f+d)&&f-e<=c}(A)&&"orchestrator"!==f.session.kind&&"terminated"!==f.session.state&&"done"!==f.session.state){let b=function(a){switch(a){case"started":return{sessionState:"working",sessionReason:"agent_acknowledged"};case"working":case"draft_pr_created":return{sessionState:"working",sessionReason:"task_in_progress"};case"waiting":case"ready_for_review":return{sessionState:"idle",sessionReason:"awaiting_external_review"};case"needs_input":return{sessionState:"needs_input",sessionReason:"awaiting_user_input"};case"fixing_ci":return{sessionState:"working",sessionReason:"fixing_ci"};case"addressing_reviews":return{sessionState:"working",sessionReason:"resolving_review_comments"};case"pr_created":return{sessionState:"idle",sessionReason:"pr_created"};case"completed":return{sessionState:"idle",sessionReason:"research_complete"}}}(A.state);return u({status:aP({...f,session:{...f.session,state:b.sessionState,reason:b.sessionReason}},a.status),evidence:`agent_report:${A.state}`,detectingAttempts:0,sessionState:b.sessionState,sessionReason:b.sessionReason})}return l&&a7(w)&&q(a,l)?u({status:d.SB.STUCK,evidence:`idle_beyond_threshold ${y}`,detectingAttempts:0,sessionState:"stuck",sessionReason:o?"error_in_process":"probe_failure"}):"valid"!==w.state&&(a.status===d.SB.DETECTING||a.status===d.SB.STUCK||a.status===d.SB.NEEDS_INPUT||"detecting"===f.session.state||"stuck"===f.session.state||"needs_input"===f.session.state)?u("unavailable"!==w.state||"stuck"!==f.session.state||"probe_failure"!==f.session.reason||"alive"!==v.state||v.failed?{status:aP(f,a.status),evidence:y,detectingAttempts:0}:{status:d.SB.DETECTING,evidence:y,detectingAttempts:0,sessionState:"detecting",sessionReason:"probe_failure"}):u(a.status===d.SB.SPAWNING||a.status===d.SB.DETECTING||a.status===d.SB.STUCK||a.status===d.SB.NEEDS_INPUT?{status:d.SB.WORKING,evidence:y,detectingAttempts:0,sessionState:"working",sessionReason:"task_in_progress"}:{status:a.status,evidence:y,detectingAttempts:0})}async function s(a,b,c,d){let f=`${a}:${c}`,g=i.get(f);g||(g={attempts:0,firstTriggered:new Date},i.set(f,g)),g.attempts++;let h=d.retries??1/0,j=d.escalateAfter,k=!1;if(g.attempts>h&&(k=!0),"string"==typeof j){let a=b3(j);a>0&&Date.now()-g.firstTriggered.getTime()>a&&(k=!0)}if("number"==typeof j&&g.attempts>j&&(k=!0),k){let e=b5("reaction.escalated",{sessionId:a,projectId:b,message:`Reaction '${c}' escalated after ${g.attempts} attempts`,data:{reactionKey:c,attempts:g.attempts}});return await A(e,d.priority??"urgent"),{reactionType:c,success:!0,action:"escalated",escalated:!0}}let l=d.action??"notify";switch(l){case"send-to-agent":if(d.message)try{return await e.send(a,d.message),{reactionType:c,success:!0,action:"send-to-agent",message:d.message,escalated:!1}}catch{return{reactionType:c,success:!1,action:"send-to-agent",escalated:!1}}break;case"notify":{let e=b5("reaction.triggered",{sessionId:a,projectId:b,message:`Reaction '${c}' triggered notification`,data:{reactionKey:c}});return await A(e,d.priority??"info"),{reactionType:c,success:!0,action:"notify",escalated:!1}}case"auto-merge":{let d=b5("reaction.triggered",{sessionId:a,projectId:b,message:`Reaction '${c}' triggered auto-merge`,data:{reactionKey:c}});return await A(d,"action"),{reactionType:c,success:!0,action:"auto-merge",escalated:!1}}}return{reactionType:c,success:!1,action:l,escalated:!1}}function t(a,b){i.delete(`${a}:${b}`)}function u(a,c){let d=b.projects[a.projectId],e=b.reactions[c],f=d?.reactions?.[c];return(f?{...e,...f}:e)||null}function v(a,c){let d=b.projects[a.projectId];if(!d)return;let f=n(d.storageKey),g=aQ(aR(a.lifecycle),a.status),h={...c,...g};aY(f,a.id,h),e.invalidateCache();let i=Object.fromEntries(Object.entries(a.metadata).filter(([a])=>{let b=h[a];return void 0===b||""!==b}));for(let[a,b]of Object.entries(h))void 0!==b&&""!==b&&(i[a]=b);a.metadata=i,a.status=aP(a.lifecycle,a.status)}function w(a){return[...a].sort().join(",")}async function x(a,e,f,g){let h=b.projects[a.projectId];if(!h||!a.pr)return;let i=h.scm?.plugin?c.get("scm",h.scm.plugin):null;if(!i)return;let j="changes-requested",k="bugbot-comments";if(d.CM.has(f)||"open"!==a.lifecycle.pr.state){t(a.id,j),t(a.id,k),o.delete(a.id),v(a,{lastPendingReviewFingerprint:"",lastPendingReviewDispatchHash:"",lastPendingReviewDispatchAt:"",lastAutomatedReviewFingerprint:"",lastAutomatedReviewDispatchHash:"",lastAutomatedReviewDispatchAt:""});return}if(g?.key!==j&&g?.key!==k){let b=o.get(a.id)??0;if(Date.now()-b<12e4)return}o.set(a.id,Date.now());let[l,m]=await Promise.allSettled([i.getPendingComments(a.pr),i.getAutomatedComments(a.pr)]),n="fulfilled"===l.status&&Array.isArray(l.value)?l.value:null,p="fulfilled"===m.status&&Array.isArray(m.value)?m.value:null;if(null!==n){let b=w(n.map(a=>a.id)),c=a.metadata.lastPendingReviewFingerprint??"",d=a.metadata.lastPendingReviewDispatchHash??"";if(b!==c&&g?.key!==j&&t(a.id,j),b!==c&&v(a,{lastPendingReviewFingerprint:b}),b){if(g?.key===j&&g.result?.success)d!==b&&v(a,{lastPendingReviewDispatchHash:b,lastPendingReviewDispatchAt:new Date().toISOString()});else if((e===f||"changes_requested"!==f)&&b!==d){let c=u(a,j);c&&c.action&&(!1!==c.auto||"notify"===c.action)&&(await s(a.id,a.projectId,j,c)).success&&v(a,{lastPendingReviewDispatchHash:b,lastPendingReviewDispatchAt:new Date().toISOString()})}}else t(a.id,j),v(a,{lastPendingReviewFingerprint:"",lastPendingReviewDispatchHash:"",lastPendingReviewDispatchAt:""})}if(null!==p){let b=w(p.map(a=>a.id)),c=a.metadata.lastAutomatedReviewFingerprint??"",d=a.metadata.lastAutomatedReviewDispatchHash??"";if(b!==c&&(t(a.id,k),v(a,{lastAutomatedReviewFingerprint:b})),b){if(b!==d){let c=u(a,k);c&&c.action&&(!1!==c.auto||"notify"===c.action)&&(await s(a.id,a.projectId,k,c)).success&&v(a,{lastAutomatedReviewDispatchHash:b,lastAutomatedReviewDispatchAt:new Date().toISOString()})}}else t(a.id,k),v(a,{lastAutomatedReviewFingerprint:"",lastAutomatedReviewDispatchHash:"",lastAutomatedReviewDispatchAt:""})}}async function y(a,d,f,g){let h,i=b.projects[a.projectId];if(!i||!a.pr)return;let j=i.scm?.plugin?c.get("scm",i.scm.plugin):null;if(!j)return;let k="ci-failed";if("merged"===f||"killed"===f){t(a.id,k),v(a,{lastCIFailureFingerprint:"",lastCIFailureDispatchHash:"",lastCIFailureDispatchAt:""});return}if("ci_failed"!==f){a.metadata.lastCIFailureFingerprint&&(t(a.id,k),v(a,{lastCIFailureFingerprint:"",lastCIFailureDispatchHash:"",lastCIFailureDispatchAt:""}));return}let l=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,n=m.get(l);if(n?.ciChecks!==void 0)h=n.ciChecks;else try{h=await j.getCIChecks(a.pr)}catch{return}let o=h.filter(a=>"failed"===a.status||a.conclusion?.toUpperCase()==="FAILURE");if(0===o.length)return;let p=w(o.map(a=>`${a.name}:${a.status}:${a.conclusion??""}`)),q=a.metadata.lastCIFailureFingerprint??"",r=a.metadata.lastCIFailureDispatchHash??"";if(p!==q&&g?.key!==k&&t(a.id,k),p!==q&&v(a,{lastCIFailureFingerprint:p}),g?.key===k&&g.result?.success||p===r)return;let s=u(a,k);if(s&&s.action&&(!1!==s.auto||"notify"===s.action)){let b=function(a){let b=["CI checks are failing on your PR. Here are the failed checks:",""];for(let c of a){let a=c.conclusion??c.status,d=c.url?` — ${c.url}`:"";b.push(`- **${c.name}**: ${a}${d}`)}return b.push("","Investigate the failures, fix the issues, and push again."),b.join("\n")}(o);try{if("send-to-agent"===s.action)await e.send(a.id,b);else{let c=b5("ci.failing",{sessionId:a.id,projectId:a.projectId,message:b,data:{failedChecks:o.map(a=>a.name)}});await A(c,s.priority??"warning")}v(a,{lastCIFailureDispatchHash:p,lastCIFailureDispatchAt:new Date().toISOString()})}catch{}}}async function z(a,d){let f,g=b.projects[a.projectId];if(!g||!a.pr)return;let h=g.scm?.plugin?c.get("scm",g.scm.plugin):null;if(!h)return;let i="merge-conflicts";if("open"!==a.lifecycle.pr.state||"killed"===d){t(a.id,i),v(a,{lastMergeConflictDispatched:""});return}if("pr_open"!==d&&"ci_failed"!==d&&"review_pending"!==d&&"changes_requested"!==d&&"approved"!==d&&"mergeable"!==d)return;let j=`${a.pr.owner}/${a.pr.repo}#${a.pr.number}`,k=m.get(j);if(k)f=k.hasConflicts??!1;else try{f=!(await h.getMergeability(a.pr)).noConflicts}catch{return}let l=a.metadata.lastMergeConflictDispatched??"";if(f){if("true"===l)return;let b=u(a,i);if(b&&b.action&&(!1!==b.auto||"notify"===b.action))try{if("send-to-agent"===b.action){let c=b.message??"Your branch has merge conflicts. Rebase on the default branch and resolve them.";await e.send(a.id,c)}else{let c=b5("merge.conflicts",{sessionId:a.id,projectId:a.projectId,message:`${a.id}: PR has merge conflicts`});await A(c,b.priority??"warning")}v(a,{lastMergeConflictDispatched:"true"})}catch{}}else"true"===l&&(t(a.id,i),v(a,{lastMergeConflictDispatched:""}))}async function A(a,d){let e={...a,priority:d};for(let a of b.notificationRouting[d]??b.defaults.notifiers){let d=function(a,b){let c=a.notifiers?.[b];return c?.plugin?{reference:b,pluginName:c.plugin}:{reference:b,pluginName:b}}(b,a),f=c.get("notifier",d.reference)??c.get("notifier",d.pluginName);if(f)try{await f.notify(e)}catch{}}}async function B(a){if(a.status!==d.SB.MERGED)return;let{autoCleanupOnMerge:c=!0,mergeCleanupIdleGraceMs:f=3e5}=b.lifecycle??{};if(!c)return;let i=new Date().toISOString(),j=a.metadata.mergedPendingCleanupSince||i,k=Date.parse(j),l=!!Number.isFinite(k)&&Date.now()-k>=f,m=a.activity;if((m===d.u3.ACTIVE||m===d.u3.WAITING_INPUT||m===d.u3.BLOCKED)&&!l){a.metadata.mergedPendingCleanupSince||v(a,{mergedPendingCleanupSince:i}),g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.merge_cleanup.deferred",outcome:"success",correlationId:b0("lifecycle-merge-cleanup"),projectId:a.projectId,sessionId:a.id,reason:b9(a.lifecycle),data:{activity:m,pendingSince:j,graceMs:f},level:"info"});return}let n=b0("lifecycle-merge-cleanup");try{let b=await e.kill(a.id,{purgeOpenCode:!0,reason:"pr_merged"});g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.merge_cleanup.completed",outcome:"success",correlationId:n,projectId:a.projectId,sessionId:a.id,reason:b9(a.lifecycle),data:{cleaned:b.cleaned,alreadyTerminated:b.alreadyTerminated,graceElapsed:l,activity:m},level:"info"}),h.delete(a.id)}catch(b){a.metadata.mergedPendingCleanupSince||v(a,{mergedPendingCleanupSince:i}),g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.merge_cleanup.failed",outcome:"failure",correlationId:n,projectId:a.projectId,sessionId:a.id,reason:b instanceof Error?b.message:String(b),level:"warn"})}}async function C(a){var b;let c,e=h.get(a.id)??(a.metadata?.status||a.status),f=aR(a.lifecycle),i=a.lifecycle.pr.state,j=await r(a),k=j.status,m=a.metadata.statePayload!==JSON.stringify(a.lifecycle),n=j.evidence,o=j.detectingAttempts>0?String(j.detectingAttempts):"",p=j.detectingStartedAt??"",q=j.detectingEvidenceHash??"",w=k===d.SB.STUCK&&(j.detectingAttempts>3||be(p))?a.metadata.detectingEscalatedAt||new Date().toISOString():"",C={};if(a.metadata.lifecycleEvidence!==n&&(C.lifecycleEvidence=n),(a.metadata.detectingAttempts||"")!==o&&(C.detectingAttempts=o),(a.metadata.detectingStartedAt||"")!==p&&(C.detectingStartedAt=p),(a.metadata.detectingEvidenceHash||"")!==q&&(C.detectingEvidenceHash=q),(a.metadata.detectingEscalatedAt||"")!==w&&(C.detectingEscalatedAt=w),Object.keys(C).length>0&&v(a,C),k!==e){let b=b0("lifecycle-transition");h.set(a.id,k),v(a,{status:k}),g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.transition",outcome:"success",correlationId:b,projectId:a.projectId,sessionId:a.id,reason:b9(a.lifecycle),data:ca(f,a.lifecycle,e,k,j.evidence,j.detectingAttempts,!0),level:b8(k)}),d.CM.has(k)||(l=!1);let i=b6(void 0,e);if(i){let b=b7(i);b&&t(a.id,b)}let m=b6(e,k);if(m){let d=!1,h=b7(m);if(h){let i=u(a,h);if(i&&i.action&&(!1!==i.auto||"notify"===i.action)){let l=await s(a.id,a.projectId,h,i);c={key:h,result:l},g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.transition.reaction",outcome:l.success?"success":"failure",correlationId:b,projectId:a.projectId,sessionId:a.id,reason:b9(a.lifecycle),data:ca(f,a.lifecycle,e,k,j.evidence,j.detectingAttempts,!0,c),level:l.success?"info":"warn"}),d=!0}}if(!d){let b=b4(m),c=b5(m,{sessionId:a.id,projectId:a.projectId,message:`${a.id}: ${e} → ${k}`,data:{oldStatus:e,newStatus:k}});await A(c,b)}}}else h.set(a.id,k),m&&(v(a,{status:k}),g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.sync",outcome:"success",correlationId:b0("lifecycle-sync"),projectId:a.projectId,sessionId:a.id,reason:b9(a.lifecycle),data:ca(f,a.lifecycle,e,k,j.evidence,j.detectingAttempts,!1),level:b8(k)}));let E=i===(b=a.lifecycle.pr.state)?null:"closed"===b?"pr.closed":null;if(E){let b=!1,c=b7(E);if(c){let d=u(a,c);d&&d.action&&(!1!==d.auto||"notify"===d.action)&&(await s(a.id,a.projectId,c,d),b=!0)}if(!b){let b=b5(E,{sessionId:a.id,projectId:a.projectId,message:`${a.id}: PR ${i} → ${a.lifecycle.pr.state}`,data:{oldPRState:i,newPRState:a.lifecycle.pr.state,prNumber:a.lifecycle.pr.number,prUrl:a.lifecycle.pr.url}});await A(b,b4(E))}}if(a.agentInfo?.summary&&!a.agentInfo.summaryIsFallback&&!a.metadata.pinnedSummary){let b=a.agentInfo.summary.replace(/[\n\r]/g," ").trim();if(b.length>=5)try{v(a,{pinnedSummary:b})}catch{}}await Promise.allSettled([x(a,e,k,c),y(a,e,k,c),z(a,k)]),await D(a),await B(a)}async function D(a){let b=function(a,b={},c=new Date){if(bl.has(a.status)||a.lifecycle?.session.kind==="orchestrator")return null;let d={...bk,...b},e=bd(a.metadata),f=function(a,b,c,d){if(!d.checkBlocked||!b)return null;if("needs_input"===b.state){let a=Date.parse(b.timestamp),d=Number.isNaN(a)?void 0:c.getTime()-a;return{trigger:"agent_needs_input",message:`Agent needs input: ${b.note??"waiting for user decision"}`,checkedAt:c.toISOString(),report:b,timeSinceReportMs:d}}return null}(0,e,c,d);if(f)return f;let g=function(a,b,c,d){if(!d.checkAcknowledge||b)return null;let e=a.createdAt??a.metadata.createdAt;if(!e)return null;let f="string"==typeof e?Date.parse(e):e.getTime();if(Number.isNaN(f))return null;let g=c.getTime()-f;return g<d.acknowledgeTimeoutMs?null:{trigger:"no_acknowledge",message:`Agent has not acknowledged task after ${Math.round(g/6e4)} minutes`,checkedAt:c.toISOString(),report:null,timeSinceSpawnMs:g}}(a,e,c,d);if(g)return g;let h=function(a,b,c,d){if(!d.checkStale||!b)return null;let e=Date.parse(b.timestamp);if(Number.isNaN(e))return null;let f=c.getTime()-e;return f<d.staleReportTimeoutMs||"waiting"===b.state||"needs_input"===b.state?null:{trigger:"stale_report",message:`Agent report is stale (${Math.round(f/6e4)} minutes since last report)`,checkedAt:c.toISOString(),report:b,timeSinceReportMs:f}}(0,e,c,d);return h||null}(a),c=new Date().toISOString();if(!b||!b.trigger){a.metadata[bm.ACTIVE_TRIGGER]&&v(a,{[bm.LAST_AUDITED_AT]:c,[bm.ACTIVE_TRIGGER]:"",[bm.TRIGGER_ACTIVATED_AT]:"",[bm.TRIGGER_COUNT]:""});return}let d=function(a){switch(a){case"no_acknowledge":return"report-no-acknowledge";case"stale_report":return"report-stale";case"agent_needs_input":return"report-needs-input"}}(b.trigger),e=u(a,d),f=parseInt(a.metadata[bm.TRIGGER_COUNT]??"0",10),h=a.metadata[bm.ACTIVE_TRIGGER]!==b.trigger;v(a,{[bm.LAST_AUDITED_AT]:c,[bm.ACTIVE_TRIGGER]:b.trigger,[bm.TRIGGER_ACTIVATED_AT]:h?c:a.metadata[bm.TRIGGER_ACTIVATED_AT]??c,[bm.TRIGGER_COUNT]:String(h?1:f+1)}),g.recordOperation({metric:"lifecycle_poll",operation:"report_watcher.audit",outcome:"success",correlationId:b0("report-watcher"),projectId:a.projectId,sessionId:a.id,reason:b.trigger,data:{trigger:b.trigger,message:b.message,timeSinceSpawnMs:b.timeSinceSpawnMs,timeSinceReportMs:b.timeSinceReportMs,reportState:b.report?.state},level:"warn"}),h&&e&&!1!==e.auto&&await s(a.id,a.projectId,d,e)}async function E(){let a=b0("lifecycle-poll"),c=Date.now();if(!k){k=!0;try{let j=await e.list(f),k=j.filter(a=>{if(!d.CM.has(a.status))return!0;let b=h.get(a.id);return void 0!==b&&b!==a.status});await p(k),await Promise.allSettled(k.map(a=>C(a)));let m=new Set(j.map(a=>a.id));for(let a of h.keys())m.has(a)||h.delete(a);for(let a of i.keys()){let b=a.split(":")[0];b&&!m.has(b)&&i.delete(a)}for(let a of o.keys())m.has(a)||o.delete(a);let n=j.filter(a=>!d.CM.has(a.status));if(j.length>0&&0===n.length&&!l){l=!0;let a=b7("summary.all_complete");if(a){let c=b.reactions[a];c&&c.action&&(!1!==c.auto||"notify"===c.action)&&await s("system","all",a,c)}}f&&(g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.poll",outcome:"success",correlationId:a,projectId:f,durationMs:Date.now()-c,data:{sessionCount:j.length,activeSessionCount:n.length},level:"info"}),g.setHealth({surface:"lifecycle.worker",status:"ok",projectId:f,correlationId:a,details:{projectId:f,sessionCount:j.length,activeSessionCount:n.length}}))}catch(d){let b=d instanceof Error?d.message:String(d);g.recordOperation({metric:"lifecycle_poll",operation:"lifecycle.poll",outcome:"failure",correlationId:a,projectId:f,durationMs:Date.now()-c,reason:b,level:"error"}),g.setHealth({surface:"lifecycle.worker",status:"error",projectId:f,correlationId:a,reason:b,details:f?{projectId:f}:{projectScope:"all"}})}finally{k=!1}}}return{start(a=3e4){j||(j=setInterval(()=>void E(),a),E())},stop(){j&&(clearInterval(j),j=null)},getStates:()=>new Map(h),async check(a){let b=await e.get(a);if(!b)throw Error(`Session ${a} not found`);await C(b)}}}function cc(a){let b=function(a){let{config:b,projectId:c,project:d}=a,e=!!d.repo;return{projectId:c,projectName:d.name,projectRepo:d.repo??"not configured",projectDefaultBranch:d.defaultBranch,projectSessionPrefix:d.sessionPrefix,projectPath:d.path,dashboardPort:String(b.port??3e3),automatedReactionsSection:function(a){let b="*".repeat(2),c=a=>`${b}${a}${b}`,d=[];for(let[b,e]of Object.entries(a.reactions??{})){if(e.auto&&"send-to-agent"===e.action){d.push(`- ${c(b)}: Auto-sends instruction to agent (retries: ${e.retries??"none"}, escalates after: ${e.escalateAfter??"never"})`);continue}e.auto&&"notify"===e.action&&d.push(`- ${c(b)}: Notifies human (priority: ${e.priority??"info"})`)}return 0===d.length?"":d.join("\n")}(d),projectSpecificRulesSection:function(a){let b=a.orchestratorRules?.trim();return b||""}(d),repoConfiguredSection:e?"true":"",repoNotConfiguredSection:e?"":"true"}}(a);return(function(a,b){let c=a.replace(/\{\{([a-zA-Z0-9_]+)\}\}/g,"").match(/\{\{[^}]+\}\}/);if(c)throw Error(`Unresolved template placeholder: ${c[0]}`);return a.replace(/\{\{([a-zA-Z0-9_]+)\}\}/g,(a,c)=>{if(!Object.prototype.hasOwnProperty.call(b,c))throw Error(`Unresolved template placeholder: ${c}`);return b[c]})})(function(a,b){let c=[["REPO_CONFIGURED_SECTION_START","REPO_CONFIGURED_SECTION_END",b.repoConfiguredSection],["REPO_NOT_CONFIGURED_SECTION_START","REPO_NOT_CONFIGURED_SECTION_END",b.repoNotConfiguredSection],["AUTOMATED_REACTIONS_SECTION_START","AUTOMATED_REACTIONS_SECTION_END",b.automatedReactionsSection],["PROJECT_SPECIFIC_RULES_SECTION_START","PROJECT_SPECIFIC_RULES_SECTION_END",b.projectSpecificRulesSection]],d=a;for(let[a,b,e]of c){let c=`{{${a}}}`,f=`{{${b}}}`;for(;;){let a=d.indexOf(c),b=d.indexOf(f);if(-1===a&&-1===b)break;if(-1===a||-1===b||b<a)throw Error(`Malformed optional section block: expected ${c} before ${f}`);let g=b+f.length,h=d.slice(a+c.length,b);if(h.includes(c))throw Error(`Nested optional section blocks are not supported: ${c} before ${f}`);let i=e?h:"",j=d.slice(0,a),k=d.slice(g);d=i?j+i+k:function(a,b){let c=a.match(/\n*$/)?.[0]??"",d=b.match(/^\n*/)?.[0]??"",e=c.length+d.length>=2?"\n\n":c+d;return a.slice(0,a.length-c.length)+e+b.slice(d.length)}(j,k)}}return d}('# {{projectName}} Orchestrator\n\nYou are the **orchestrator agent** for the {{projectName}} project.\n\nYour role is to coordinate and manage worker agent sessions. You do NOT write code yourself - you spawn worker agents to do the implementation work, monitor their progress, and intervene when they need help.\n\n## Non-Negotiable Rules\n\n- Investigations from the orchestrator session are **read-only**. Inspect status, logs, metadata, PR state, and worker output, but do not edit repository files or implement fixes from the orchestrator session.\n- Any code change, test run tied to implementation, git branch work, or PR takeover must be delegated to a **worker session**.\n- The orchestrator session must never own a PR. Never claim a PR into the orchestrator session, and never treat the orchestrator as the worker responsible for implementation.\n- If an investigation discovers follow-up work, either spawn a worker session or direct an existing worker session with clear instructions.\n- **Always use `ao send` to communicate with sessions** - never use raw `tmux send-keys` or `tmux capture-pane`. Direct tmux access bypasses busy detection, retry logic, and input sanitization, and breaks multi-line input for some agents (e.g. Codex).\n- When a session might be busy, use `ao send --no-wait <session> <message>` to send without waiting for the session to become idle.\n\n## Project Info\n\n- **Name**: {{projectName}}\n- **Repository**: {{projectRepo}}\n- **Default Branch**: {{projectDefaultBranch}}\n- **Session Prefix**: {{projectSessionPrefix}}\n- **Local Path**: {{projectPath}}\n- **Dashboard Port**: {{dashboardPort}}\n\n## Quick Start\n\n```bash\n# See all sessions at a glance\nao status\n\n{{REPO_CONFIGURED_SECTION_START}}# Spawn sessions for issues (GitHub: #123, Linear: INT-1234, etc.)\nao spawn INT-1234\nao spawn --claim-pr 123\nao batch-spawn INT-1 INT-2 INT-3\n\n{{REPO_CONFIGURED_SECTION_END}}# Spawn a session without a tracker issue (prompt-driven)\nao spawn --prompt "Refactor the auth module to use JWT"\n\n# List sessions\nao session ls -p {{projectId}}\n\n# Send message to a session\nao send {{projectSessionPrefix}}-1 "Your message here"\n\n{{REPO_CONFIGURED_SECTION_START}}# Claim an existing PR for a worker session\nao session claim-pr 123 {{projectSessionPrefix}}-1\n\n{{REPO_CONFIGURED_SECTION_END}}# Kill a session\nao session kill {{projectSessionPrefix}}-1\n{{REPO_CONFIGURED_SECTION_START}}\n# Open all sessions in terminal tabs\nao open {{projectId}}{{REPO_CONFIGURED_SECTION_END}}\n```\n\n{{REPO_NOT_CONFIGURED_SECTION_START}}\n\n> **Note:** No repository remote is configured. Issue tracking, PR, and CI features are unavailable.\n> Add a `repo` field (owner/repo) to `agent-orchestrator.yaml` to enable them.\n{{REPO_NOT_CONFIGURED_SECTION_END}}\n\n## Available Commands\n\n- `ao status`: Show all sessions{{REPO_CONFIGURED_SECTION_START}} with PR/CI/review status{{REPO_CONFIGURED_SECTION_END}}\n- `ao spawn [issue] [--prompt <text>]{{REPO_CONFIGURED_SECTION_START}} [--claim-pr <pr>]{{REPO_CONFIGURED_SECTION_END}}`: Spawn a worker session{{REPO_CONFIGURED_SECTION_START}}; use issue ID or --prompt for freeform tasks{{REPO_CONFIGURED_SECTION_END}}{{REPO_NOT_CONFIGURED_SECTION_START}} with --prompt for freeform tasks{{REPO_NOT_CONFIGURED_SECTION_END}}\n {{REPO_CONFIGURED_SECTION_START}}- `ao batch-spawn <issues...>`: Spawn multiple sessions in parallel (project auto-detected)\n {{REPO_CONFIGURED_SECTION_END}}- `ao session ls [-p project]`: List all sessions (optionally filter by project)\n {{REPO_CONFIGURED_SECTION_START}}- `ao session claim-pr <pr> [session]`: Attach an existing PR to a worker session\n {{REPO_CONFIGURED_SECTION_END}}- `ao session attach <session>`: Attach to a session\'s tmux window\n- `ao session kill <session>`: Kill a specific session\n- `ao session cleanup [-p project]`: Kill cleanup-eligible sessions (closed work or dead runtimes)\n- `ao send <session> <message>`: Send a message to a running session\n- `ao send --no-wait <session> <message>`: Send without waiting for session to become idle\n- `ao dashboard`: Start the web dashboard (http://localhost:{{dashboardPort}})\n- `ao open <project>`: Open all project sessions in terminal tabs\n\n## Session Management\n\n### Spawning Sessions\n\nWhen you spawn a session:\n\n1. A git worktree is created from `{{projectDefaultBranch}}`\n2. A feature branch is created (e.g., `feat/INT-1234` for issues, `session/<id>` for prompt-driven)\n3. A tmux session is started (e.g., `{{projectSessionPrefix}}-1`)\n4. The agent is launched with context about the issue or prompt\n5. Metadata is written to the project-specific sessions directory\n\nA tracker issue is **not required**. Use `--prompt` to spawn freeform sessions:\n\n```bash\nao spawn --prompt "Add rate limiting to the /api/upload endpoint"\n```\n\n### Monitoring Progress\n\nUse `ao status` to see:\n\n- Current session status (working, pr_open, review_pending, etc.)\n {{REPO_CONFIGURED_SECTION_START}}- PR state (open/merged/closed)\n- CI status (passing/failing/pending)\n- Review decision (approved/changes_requested/pending)\n- Unresolved comments count\n {{REPO_CONFIGURED_SECTION_END}}\n\n### Explicit Agent Reports\n\nWorker agents self-declare their workflow phase using `ao acknowledge` and `ao report <state>` (started, working, waiting, needs-input, fixing-ci, addressing-reviews, pr-created, draft-pr-created, ready-for-review, completed). These reports are persisted alongside the canonical lifecycle and may inform lifecycle inference, but do not replace runtime/activity/SCM-derived truth.\n\n- Never run `ao acknowledge` or `ao report` from the orchestrator session - they are worker-only commands.\n- Fresh reports (<5 min) are useful hints when inference is weak, but runtime death, activity-based waiting_input, and SCM truth (merged/closed PR, CI failure, review decisions) still take precedence.\n- Use `--pr-url` / `--pr-number` on PR workflow reports when the agent knows them; merged/closed remain SCM-owned.\n- If an agent reports `waiting` but a PR actually merged, trust the PR state and follow up.\n\n### Sending Messages\n\nSend instructions to a running agent:\n\n```bash\nao send {{projectSessionPrefix}}-1 "Please address the review comments on your PR"\n```\n\n{{REPO_CONFIGURED_SECTION_START}}### PR Takeover\n\nIf a worker session needs to continue work on an existing PR:\n\n```bash\nao session claim-pr 123 {{projectSessionPrefix}}-1\n# or do it at spawn time\nao spawn --claim-pr 123\n```\n\nThis updates AO metadata, switches the worker worktree onto the PR branch, and lets lifecycle reactions keep routing CI and review feedback to that worker session.\n\nNever claim a PR into `{{projectSessionPrefix}}-orchestrator`. If a PR needs implementation or takeover, delegate it to a worker session instead.\n{{REPO_CONFIGURED_SECTION_END}}\n\n### Investigation Workflow\n\nWhen debugging or triaging from the orchestrator session:\n\n1. Inspect with read-only commands such as `ao status`, `ao session ls`, `ao session attach`, and SCM/tracker lookups.\n2. Decide whether a worker already owns the work or a new worker is needed.\n3. Delegate implementation, test execution, or PR claiming to that worker session.\n4. Return to monitoring and coordination once the worker has the task.\n\n### Cleanup\n\nRemove completed sessions:\n\n```bash\nao session cleanup -p {{projectId}} # Kill sessions whose work closed or runtime has exited\n```\n\n## Dashboard\n\nThe web dashboard runs at **http://localhost:{{dashboardPort}}**.\n\nFeatures:\n\n- Live session cards with activity status\n- PR table with CI checks and review state\n- Attention zones (merge ready, needs response, working, done)\n- One-click actions (send message, kill, merge PR)\n- Real-time updates via Server-Sent Events\n\n{{AUTOMATED_REACTIONS_SECTION_START}}\n\n## Automated Reactions\n\nThe system automatically handles these events:\n\n{{automatedReactionsSection}}\n{{AUTOMATED_REACTIONS_SECTION_END}}\n\n## Common Workflows\n\n{{REPO_CONFIGURED_SECTION_START}}### Bulk Issue Processing\n\n1. Get list of issues from tracker (GitHub/Linear/etc.)\n2. Use `ao batch-spawn` to spawn sessions for each issue\n3. Monitor with `ao status` or the dashboard\n4. Agents will fetch, implement, test, PR, and respond to reviews\n5. Use `ao session cleanup` when work is truly finished or the runtime is gone\n\n{{REPO_CONFIGURED_SECTION_END}}### Handling Stuck Agents\n\n1. Check `ao status` for sessions in "stuck" or "needs_input" state\n2. Attach with `ao session attach <session>` to see what they\'re doing\n3. Send clarification or instructions with `ao send <session> \'...\'`\n4. Or kill and respawn with fresh context if needed\n\n{{REPO_CONFIGURED_SECTION_START}}### PR Review Flow\n\n1. Agent creates PR and pushes\n2. CI runs automatically\n3. If CI fails: reaction auto-sends fix instructions to agent\n4. If reviewers request changes: reaction auto-sends comments to agent\n5. When approved + green: notify human to merge (unless auto-merge enabled)\n\n{{REPO_CONFIGURED_SECTION_END}}### Manual Intervention\n\nWhen an agent needs human judgment:\n\n1. You\'ll get a notification (desktop/slack/webhook)\n2. Check the dashboard or `ao status` for details\n3. Attach to the session if needed: `ao session attach <session>`\n4. Send instructions: `ao send <session> \'...\'`\n5. Or handle the human-only action yourself{{REPO_CONFIGURED_SECTION_START}} (merge PR, close issue, etc.){{REPO_CONFIGURED_SECTION_END}} while keeping implementation in worker sessions.\n\n## Tips\n\n1. **Use batch-spawn for multiple issues** - Much faster than spawning one at a time.\n\n2. **Check status before spawning** - Avoid creating duplicate sessions for issues already being worked on.\n\n3. **Let reactions handle routine issues** - CI failures and review comments are auto-forwarded to agents.\n\n4. **Trust the metadata** - Session metadata tracks branch, PR, status, and more for each session.\n\n5. **Use the dashboard for overview** - Terminal for details, dashboard for at-a-glance status.\n\n6. **Cleanup regularly** - `ao session cleanup` removes sessions that are truly cleanup-eligible and keeps things tidy.\n\n7. **Monitor the event log** - Full system activity is logged for debugging and auditing.\n\n8. **Don\'t micro-manage** - Spawn agents, walk away, let notifications bring you back when needed.\n\n{{PROJECT_SPECIFIC_RULES_SECTION_START}}\n\n## Project-Specific Rules\n\n{{projectSpecificRulesSection}}\n{{PROJECT_SPECIFIC_RULES_SECTION_END}}\n'.trim(),b),b).trim()}function cd(a){return(0,g.join)(a,".ao","activity.jsonl")}async function ce(a,b,c,d){let e=cd(a);await (0,a9.mkdir)((0,g.dirname)(e),{recursive:!0});let f={ts:new Date().toISOString(),state:b,source:c,...void 0!==d&&("waiting_input"===b||"blocked"===b)&&{trigger:d}};await (0,a9.appendFile)(e,JSON.stringify(f)+"\n","utf-8")}async function cf(a){let b=cd(a);try{let{open:a}=await Promise.resolve().then(c.t.bind(c,51455,19)),d=await a(b,"r");try{let a=await d.stat();if(0===a.size)return null;let b=Math.min(a.size,4096),c=Math.max(0,a.size-b),e=Buffer.alloc(b),{bytesRead:f}=await d.read(e,0,b,c);if(0===f)return null;let g=e.subarray(0,f).toString("utf-8").split("\n").filter(a=>a.trim());if(c>0&&g.length>1&&(g=g.slice(1)),0===g.length)return null;let h=null;for(let a=g.length-1;a>=0;a--)try{h=JSON.parse(g[a]);break}catch{continue}if(null===h||"object"!=typeof h||null===h||Array.isArray(h))return null;let i=h,j=new Set(["active","ready","idle","waiting_input","blocked","exited"]),k=new Set(["terminal","native"]);if("string"!=typeof i.ts||"string"!=typeof i.state||"string"!=typeof i.source||!j.has(i.state)||!k.has(i.source))return null;return{entry:{ts:i.ts,state:i.state,source:i.source,..."string"==typeof i.trigger&&{trigger:i.trigger}},modifiedAt:a.mtime}}finally{await d.close()}}catch{return null}}function cg(a){if(!a)return null;let{entry:b}=a;if("waiting_input"===b.state||"blocked"===b.state){let a=new Date(b.ts);if(Number.isNaN(a.getTime()))return null;if(Date.now()-a.getTime()<=3e5)return{state:b.state,timestamp:a}}return null}function ch(a,b,c){let d;if(!a)return null;let{entry:e}=a,f=new Date(e.ts);if(Number.isNaN(f.getTime()))return null;if("waiting_input"===e.state||"blocked"===e.state)return Date.now()-f.getTime()<=3e5?{state:e.state,timestamp:f}:{state:"idle",timestamp:f};let g=Math.max(0,Date.now()-f.getTime());d=g<=b?"active":g<=c?"ready":"idle";let h={active:0,ready:1,idle:2},i=h[e.state]??2;return{state:(h[d]??2)>=i?d:e.state,timestamp:f}}async function ci(a,b,c){let{state:d,trigger:e}=function(a,b){let c=b(a),d="waiting_input"===c||"blocked"===c?a.trim().split("\n").slice(-3).join("\n"):void 0;return{state:c,trigger:d}}(b,c);if("waiting_input"!==d&&"blocked"!==d){let b=await cf(a);if(b&&b.entry.state===d&&Date.now()-b.modifiedAt.getTime()<2e4)return}await ce(a,d,"terminal",e)}let cj="/usr/local/bin",ck=`${cj}/gh`;function cl(){return(0,g.join)((0,h.homedir)(),".ao","bin")}let cm="0.3.0";function cn(a){let b=(a??"/usr/bin:/bin").split(":").filter(Boolean),c=[],d=new Set,e=a=>{!a||d.has(a)||(c.push(a),d.add(a))};for(let a of(e(cl()),e(cj),b))e(a);return c.join(":")}let co=`#!/usr/bin/env bash
|
|
92
|
-
# ao-metadata-helper — shared by gh/git wrappers
|
|
93
|
-
# Provides: update_ao_metadata <key> <value>
|
|
94
|
-
|
|
95
|
-
update_ao_metadata() {
|
|
96
|
-
local key="$1" value="$2"
|
|
97
|
-
local ao_dir="\${AO_DATA_DIR:-}"
|
|
98
|
-
local ao_session="\${AO_SESSION:-}"
|
|
99
|
-
|
|
100
|
-
[[ -z "$ao_dir" || -z "$ao_session" ]] && return 0
|
|
101
|
-
|
|
102
|
-
# Validate: session name must not contain path separators or traversal
|
|
103
|
-
case "$ao_session" in
|
|
104
|
-
*/* | *..*) return 0 ;;
|
|
105
|
-
esac
|
|
106
|
-
|
|
107
|
-
# Validate: ao_dir must be an absolute path under known ao directories or /tmp
|
|
108
|
-
case "$ao_dir" in
|
|
109
|
-
"$HOME"/.ao/* | "$HOME"/.agent-orchestrator/* | /tmp/*) ;;
|
|
110
|
-
*) return 0 ;;
|
|
111
|
-
esac
|
|
112
|
-
|
|
113
|
-
local metadata_file="$ao_dir/$ao_session"
|
|
114
|
-
|
|
115
|
-
# Resolve symlinks and verify canonicalized paths are still within trusted roots
|
|
116
|
-
local real_dir real_ao_dir
|
|
117
|
-
real_ao_dir="$(cd "$ao_dir" 2>/dev/null && pwd -P)" || return 0
|
|
118
|
-
real_dir="$(cd "$(dirname "$metadata_file")" 2>/dev/null && pwd -P)" || return 0
|
|
119
|
-
|
|
120
|
-
# Re-validate real_ao_dir against trusted roots after canonicalization
|
|
121
|
-
# (prevents /tmp/../../home/user from escaping the allowlist)
|
|
122
|
-
case "$real_ao_dir" in
|
|
123
|
-
"$HOME"/.ao/* | "$HOME"/.ao | "$HOME"/.agent-orchestrator/* | "$HOME"/.agent-orchestrator | /tmp/*) ;;
|
|
124
|
-
*) return 0 ;;
|
|
125
|
-
esac
|
|
126
|
-
|
|
127
|
-
[[ "$real_dir" == "$real_ao_dir"* ]] || return 0
|
|
128
|
-
|
|
129
|
-
[[ -f "$metadata_file" ]] || return 0
|
|
130
|
-
|
|
131
|
-
# Validate key — only allow alphanumeric, underscore, hyphen (prevents sed injection)
|
|
132
|
-
[[ "$key" =~ ^[a-zA-Z0-9_-]+$ ]] || return 0
|
|
133
|
-
|
|
134
|
-
local temp_file="\${metadata_file}.tmp.$$"
|
|
135
|
-
|
|
136
|
-
# Strip newlines from value to prevent metadata line injection
|
|
137
|
-
local clean_value="$(printf '%s' "$value" | tr -d '\\n')"
|
|
138
|
-
|
|
139
|
-
# Escape sed metacharacters in value (& expands to matched text, | breaks delimiter)
|
|
140
|
-
local escaped_value="$(printf '%s' "$clean_value" | sed 's/[&|\\\\]/\\\\&/g')"
|
|
141
|
-
|
|
142
|
-
if grep -q "^\${key}=" "$metadata_file" 2>/dev/null; then
|
|
143
|
-
sed "s|^\${key}=.*|\${key}=\${escaped_value}|" "$metadata_file" > "$temp_file"
|
|
144
|
-
else
|
|
145
|
-
cp "$metadata_file" "$temp_file"
|
|
146
|
-
printf '%s=%s\\n' "$key" "$clean_value" >> "$temp_file"
|
|
147
|
-
fi
|
|
148
|
-
|
|
149
|
-
mv "$temp_file" "$metadata_file"
|
|
150
|
-
}
|
|
151
|
-
`,cp=`#!/usr/bin/env bash
|
|
152
|
-
# ao gh wrapper — auto-updates session metadata on PR operations
|
|
153
|
-
|
|
154
|
-
# Find real gh by removing our wrapper directory from PATH
|
|
155
|
-
ao_bin_dir="$(cd "$(dirname "$0")" && pwd)"
|
|
156
|
-
clean_path="$(echo "$PATH" | tr ':' '\\n' | grep -Fxv "$ao_bin_dir" | grep . | tr '\\n' ':')"
|
|
157
|
-
clean_path="\${clean_path%:}"
|
|
158
|
-
real_gh=""
|
|
159
|
-
|
|
160
|
-
# Prefer explicit gh path when provided by AO environment.
|
|
161
|
-
# Guard against recursive self-reference to the wrapper in ~/.ao/bin.
|
|
162
|
-
if [[ -n "\${GH_PATH:-}" && -x "$GH_PATH" ]]; then
|
|
163
|
-
gh_dir="$(cd "$(dirname "$GH_PATH")" 2>/dev/null && pwd)"
|
|
164
|
-
if [[ "$gh_dir" != "$ao_bin_dir" ]]; then
|
|
165
|
-
real_gh="$GH_PATH"
|
|
166
|
-
fi
|
|
167
|
-
fi
|
|
168
|
-
|
|
169
|
-
if [[ -z "$real_gh" ]]; then
|
|
170
|
-
real_gh="$(PATH="$clean_path" command -v gh 2>/dev/null)"
|
|
171
|
-
fi
|
|
172
|
-
|
|
173
|
-
if [[ -z "$real_gh" ]]; then
|
|
174
|
-
echo "ao-wrapper: gh not found in PATH" >&2
|
|
175
|
-
exit 127
|
|
176
|
-
fi
|
|
177
|
-
|
|
178
|
-
# Source the metadata helper
|
|
179
|
-
source "$ao_bin_dir/ao-metadata-helper.sh" 2>/dev/null || true
|
|
180
|
-
|
|
181
|
-
# Only capture output for commands we need to parse (pr/create).
|
|
182
|
-
# All other commands pass through transparently without stream merging.
|
|
183
|
-
case "$1/$2" in
|
|
184
|
-
pr/create)
|
|
185
|
-
tmpout="$(mktemp)"
|
|
186
|
-
trap 'rm -f "$tmpout"' EXIT
|
|
187
|
-
|
|
188
|
-
"$real_gh" "$@" 2>&1 | tee "$tmpout"
|
|
189
|
-
exit_code=\${PIPESTATUS[0]}
|
|
190
|
-
|
|
191
|
-
if [[ $exit_code -eq 0 ]]; then
|
|
192
|
-
output="$(cat "$tmpout")"
|
|
193
|
-
pr_url="$(echo "$output" | grep -Eo 'https?://[^/]+/[^/]+/[^/]+/pull/[0-9]+' | head -1)"
|
|
194
|
-
report_state="pr_created"
|
|
195
|
-
report_draft="false"
|
|
196
|
-
for arg in "$@"; do
|
|
197
|
-
if [[ "$arg" == "--draft" || "$arg" == "-d" ]]; then
|
|
198
|
-
report_state="draft_pr_created"
|
|
199
|
-
report_draft="true"
|
|
200
|
-
break
|
|
201
|
-
fi
|
|
202
|
-
done
|
|
203
|
-
if [[ -n "$pr_url" ]]; then
|
|
204
|
-
update_ao_metadata pr "$pr_url"
|
|
205
|
-
update_ao_metadata agentReportedPrUrl "$pr_url"
|
|
206
|
-
fi
|
|
207
|
-
pr_number="$(printf '%s' "$pr_url" | grep -Eo '[0-9]+$' | head -1)"
|
|
208
|
-
if [[ -n "$pr_number" ]]; then
|
|
209
|
-
update_ao_metadata agentReportedPrNumber "$pr_number"
|
|
210
|
-
fi
|
|
211
|
-
update_ao_metadata agentReportedState "$report_state"
|
|
212
|
-
update_ao_metadata agentReportedAt "$(date -u +%Y-%m-%dT%H:%M:%SZ)"
|
|
213
|
-
update_ao_metadata agentReportedPrIsDraft "$report_draft"
|
|
214
|
-
fi
|
|
215
|
-
|
|
216
|
-
exit $exit_code
|
|
217
|
-
;;
|
|
218
|
-
*)
|
|
219
|
-
exec "$real_gh" "$@"
|
|
220
|
-
;;
|
|
221
|
-
esac
|
|
222
|
-
`,cq=`#!/usr/bin/env bash
|
|
223
|
-
# ao git wrapper — auto-updates session metadata on branch operations
|
|
224
|
-
|
|
225
|
-
# Find real git by removing our wrapper directory from PATH
|
|
226
|
-
ao_bin_dir="$(cd "$(dirname "$0")" && pwd)"
|
|
227
|
-
clean_path="$(echo "$PATH" | tr ':' '\\n' | grep -Fxv "$ao_bin_dir" | grep . | tr '\\n' ':')"
|
|
228
|
-
clean_path="\${clean_path%:}"
|
|
229
|
-
real_git="$(PATH="$clean_path" command -v git 2>/dev/null)"
|
|
230
|
-
|
|
231
|
-
if [[ -z "$real_git" ]]; then
|
|
232
|
-
echo "ao-wrapper: git not found in PATH" >&2
|
|
233
|
-
exit 127
|
|
234
|
-
fi
|
|
235
|
-
|
|
236
|
-
# Source the metadata helper
|
|
237
|
-
source "$ao_bin_dir/ao-metadata-helper.sh" 2>/dev/null || true
|
|
238
|
-
|
|
239
|
-
# Run real git
|
|
240
|
-
"$real_git" "$@"
|
|
241
|
-
exit_code=$?
|
|
242
|
-
|
|
243
|
-
# Only update metadata on success
|
|
244
|
-
if [[ $exit_code -eq 0 ]]; then
|
|
245
|
-
case "$1/$2" in
|
|
246
|
-
checkout/-b)
|
|
247
|
-
update_ao_metadata branch "$3"
|
|
248
|
-
;;
|
|
249
|
-
switch/-c)
|
|
250
|
-
update_ao_metadata branch "$3"
|
|
251
|
-
;;
|
|
252
|
-
checkout/*|switch/*)
|
|
253
|
-
# Existing branch switch — only track feature-looking branches (contain / or -)
|
|
254
|
-
# Skip flags (e.g. -B), HEAD, tags, commit hashes, and simple names like "main"
|
|
255
|
-
branch="$2"
|
|
256
|
-
# If $2 is a flag, the actual branch name is in $3
|
|
257
|
-
if [[ "$branch" == -* ]]; then branch="$3"; fi
|
|
258
|
-
if [[ -n "$branch" && "$branch" != "HEAD" && "$branch" != -* && "$branch" == *[/-]* ]]; then
|
|
259
|
-
update_ao_metadata branch "$branch"
|
|
260
|
-
fi
|
|
261
|
-
;;
|
|
262
|
-
esac
|
|
263
|
-
fi
|
|
264
|
-
|
|
265
|
-
exit $exit_code
|
|
266
|
-
`,cr=`
|
|
267
|
-
## Agent Orchestrator (ao) Session
|
|
268
|
-
|
|
269
|
-
You are running inside an Agent Orchestrator managed workspace.
|
|
270
|
-
Session metadata is updated automatically via shell wrappers.
|
|
271
|
-
|
|
272
|
-
If automatic updates fail, you can manually update metadata:
|
|
273
|
-
\`\`\`bash
|
|
274
|
-
~/.ao/bin/ao-metadata-helper.sh # sourced automatically
|
|
275
|
-
# Then call: update_ao_metadata <key> <value>
|
|
276
|
-
\`\`\`
|
|
277
|
-
`;async function cs(a,b,c){let d=(0,e.randomBytes)(6).toString("hex"),f=`${a}.tmp.${d}`;await (0,a9.writeFile)(f,b,{encoding:"utf-8",mode:c}),await (0,a9.rename)(f,a)}async function ct(a){await (0,a9.mkdir)(cl(),{recursive:!0});let b=(0,g.join)(cl(),".ao-version"),c=!0;try{(await (0,a9.readFile)(b,"utf-8")).trim()===cm&&(c=!1)}catch{}c&&(await cs((0,g.join)(cl(),"ao-metadata-helper.sh"),co,493),await cs((0,g.join)(cl(),"gh"),cp,493),await cs((0,g.join)(cl(),"git"),cq,493),await cs(b,cm,420));let d=(0,g.join)(a,".ao","AGENTS.md");await (0,a9.mkdir)((0,g.join)(a,".ao"),{recursive:!0}),await (0,a9.writeFile)(d,cr.trimStart(),"utf-8")}let cu={BUG_REPORT:"bug_report",IMPROVEMENT_SUGGESTION:"improvement_suggestion"},cv=k.Yj().transform(a=>a.trim().replace(/\s+/g," ")).pipe(k.Yj().min(1));function cw(a){let b=J();if(!b?.projects[a])return;let{[a]:c,...d}=b.projects;if(b.projects=d,b.projectOrder){let c=b.projectOrder.filter(b=>b!==a);b.projectOrder=c.length>0?c:void 0}K(b)}k.Ik({title:cv,body:cv,evidence:k.YO(cv).min(1),session:cv,source:cv,confidence:k.ai().finite().min(0).max(1)}).strict(),cu.BUG_REPORT,cu.IMPROVEMENT_SUGGESTION,k.Yj().regex(/^report_[A-Za-z0-9_-]+$/),k.Yj().datetime({offset:!0}),k.Yj().regex(/^[a-f0-9]{16}$/)},15407:(a,b,c)=>{"use strict";c.d(b,{Ag:()=>t,CK:()=>s,CM:()=>h,D8:()=>r,DD:()=>p,Fx:()=>q,PE:()=>e,SB:()=>g,U1:()=>o,V1:()=>f,bz:()=>n,c5:()=>v,kw:()=>u,qX:()=>l,tT:()=>m,u3:()=>d,zi:()=>k});let d={ACTIVE:"active",READY:"ready",IDLE:"idle",WAITING_INPUT:"waiting_input",BLOCKED:"blocked",EXITED:"exited"},e=3e5,f=3e4,g={SPAWNING:"spawning",WORKING:"working",DETECTING:"detecting",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"},h=new Set(["killed","terminated","done","cleanup","errored","merged"]),i=new Set(["exited"]),j=new Set(["merged"]);function k(a){return a.lifecycle?"done"===a.lifecycle.session.state||"terminated"===a.lifecycle.session.state||"merged"===a.lifecycle.pr.state||"missing"===a.lifecycle.runtime.state||"exited"===a.lifecycle.runtime.state:h.has(a.status)||null!==a.activity&&i.has(a.activity)}function l(a){if(a.lifecycle){var b;return k(a)&&!j.has(a.status)&&(b=a.lifecycle,b.pr?.state!=="merged")}return k(a)&&!j.has(a.status)}function m(a,b,c){if(a.metadata?.role==="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 n={OPEN:"open",MERGED:"merged",CLOSED:"closed"},o={PENDING:"pending",PASSING:"passing",FAILING:"failing",NONE:"none"};function p(a){if(a)return"permissionless"!==a&&"default"!==a&&"auto-edit"!==a&&"suggest"!==a?"skip"===a?"permissionless":void 0:a}function q(a){if(!a||"object"!=typeof a)return!1;let b=a.message?.toLowerCase()||"";return b.includes("issue")&&(b.includes("not found")||b.includes("does not exist"))||b.includes("no issue found")||b.includes("could not find issue")||b.includes("could not resolve to an issue")||b.includes("no issue with identifier")||b.includes("invalid issue format")}class r extends Error{constructor(a,b){super(`Session ${a} cannot be restored: ${b}`),this.sessionId=a,this.reason=b,this.name="SessionNotRestorableError"}}class s extends Error{constructor(a,b){super(`Workspace missing at ${a}${b?`: ${b}`:""}`),this.path=a,this.detail=b,this.name="WorkspaceMissingError"}}class t extends Error{constructor(a){super(`Session not found: ${a}`),this.sessionId=a,this.name="SessionNotFoundError"}}class u extends Error{constructor(a){super(a??"No agent-orchestrator.yaml found. Run `ao start` to create one."),this.name="ConfigNotFoundError"}}class v extends Error{constructor(a,b){super(b),this.projectId=a,this.name="ProjectResolveError"}}},26785:()=>{},90337:()=>{}};
|