@aoagents/ao-web 0.5.0 → 0.7.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 +196 -182
- package/.next/app-path-routes-manifest.json +19 -17
- package/.next/build-manifest.json +6 -6
- package/.next/next-server.js.nft.json +1 -1
- package/.next/prerender-manifest.json +21 -21
- package/.next/react-loadable-manifest.json +5 -3
- package/.next/required-server-files.json +4 -5
- 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 -8
- 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 +5 -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/update/route.js +1 -0
- package/.next/server/app/api/update/route.js.nft.json +1 -0
- package/.next/server/app/api/update/route_client-reference-manifest.js +1 -0
- 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/version/route.js +1 -0
- package/.next/server/app/api/version/route.js.nft.json +1 -0
- package/.next/server/app/api/version/route_client-reference-manifest.js +1 -0
- 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 -9
- 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 -9
- package/.next/server/app-paths-manifest.json +19 -17
- package/.next/server/chunks/1271.js +1 -1
- package/.next/server/chunks/1876.js +2 -2
- package/.next/server/chunks/303.js +3 -0
- package/.next/server/chunks/3714.js +1 -1
- package/.next/server/chunks/4520.js +1 -1
- package/.next/server/chunks/6013.js +884 -0
- package/.next/server/chunks/6848.js +1 -0
- package/.next/server/chunks/7167.js +1 -1
- package/.next/server/chunks/7173.js +1 -1
- package/.next/server/chunks/7227.js +604 -0
- package/.next/server/middleware-build-manifest.js +1 -1
- package/.next/server/middleware-react-loadable-manifest.js +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/9nr0fNWbZcuWTqhM2HhrH/_buildManifest.js +1 -0
- package/.next/static/chunks/1654.ac304fc9e36ec94a.js +1 -0
- package/.next/static/chunks/3764.cdef4e76dbc23af8.js +1 -0
- package/.next/static/chunks/3780-7bdc52d8370adf2f.js +1 -0
- package/.next/static/chunks/{5795-b96fd46c8c7344fc.js → 5795-a4dd81606df09bc4.js} +1 -1
- package/.next/static/chunks/6231-57dd9c1e306c7069.js +1 -0
- package/.next/static/chunks/app/_not-found/page-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/backlog/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/browse-directory/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/filesystem/browse/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/issues/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/observability/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/orchestrators/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/projects/[id]/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/projects/reload/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/projects/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/prs/[id]/merge/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/runtime/terminal/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/kill/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/message/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/remap/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/restore/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/sessions/[id]/send/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/sessions/patches/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/sessions/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/setup-labels/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/spawn/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/update/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/verify/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/version/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/api/webhooks/[...slug]/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/apple-icon/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/dev/terminal-test/page-9aa423dfd54c8325.js +1 -0
- package/.next/static/chunks/app/{error-da1d10c96ff5dd29.js → error-65c526052680c0dc.js} +1 -1
- package/.next/static/chunks/app/{global-error-ca06d2b1be2d4ae0.js → global-error-63dcb797b2c3ee60.js} +1 -1
- package/.next/static/chunks/app/icon/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/icon-192/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/icon-512/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/{layout-bb6db479523cb3d6.js → layout-36ab0168ddb22083.js} +1 -1
- package/.next/static/chunks/app/loading-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/manifest.webmanifest/route-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/{not-found-824d5d3c6e296eeb.js → not-found-a693bed1f9e1893f.js} +1 -1
- package/.next/static/chunks/app/orchestrators/{page-f07983413ed1a44b.js → page-376a92db51deb112.js} +1 -1
- package/.next/static/chunks/app/page-587d546e62c0796f.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/loading-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/page-bd8fc2a1decb649d.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-bd33f6ffda513080.js +1 -0
- package/.next/static/chunks/app/projects/[projectId]/settings/page-11facc471a63de50.js +1 -0
- package/.next/static/chunks/app/prs/page-f34f66ad51106080.js +1 -0
- package/.next/static/chunks/app/sessions/[id]/{error-8de5b24e86eeae7b.js → error-df65e7b626bbb713.js} +1 -1
- package/.next/static/chunks/app/sessions/[id]/loading-8b5044bdc951ae98.js +1 -0
- package/.next/static/chunks/app/sessions/[id]/{not-found-824d5d3c6e296eeb.js → not-found-a693bed1f9e1893f.js} +1 -1
- package/.next/static/chunks/app/sessions/[id]/page-3ea4aa79275ea449.js +1 -0
- package/.next/static/chunks/app/test-direct/page-edfc701a9300105b.js +1 -0
- package/.next/static/chunks/{main-app-690acf9d5d2050c9.js → main-app-decbc53736801215.js} +1 -1
- package/.next/static/chunks/{webpack-d2dfbd3e9262b74e.js → webpack-ecf0988dbb79e19b.js} +1 -1
- package/.next/static/css/b93232cd4a58743d.css +1 -0
- package/dist-server/direct-terminal-ws.js +12 -2
- package/dist-server/mux-websocket.js +319 -76
- package/dist-server/start-all.js +28 -6
- package/dist-server/tmux-utils.js +124 -2
- package/next.config.js +26 -0
- package/package.json +26 -12
- package/.next/server/chunks/1172.js +0 -1
- package/.next/server/chunks/3131.js +0 -3
- package/.next/server/chunks/801.js +0 -658
- package/.next/server/chunks/9223.js +0 -440
- package/.next/static/YR6Xi4DC5A7S7E2PoZuif/_buildManifest.js +0 -1
- package/.next/static/chunks/1383.c891a8ba72ee600c.js +0 -1
- package/.next/static/chunks/3764.89a5955e46eb74b4.js +0 -1
- package/.next/static/chunks/3780-52c4733ce6591b8d.js +0 -1
- package/.next/static/chunks/4465-17154f7a01abfe85.js +0 -1
- package/.next/static/chunks/app/_not-found/page-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/backlog/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/browse-directory/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/filesystem/browse/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/issues/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/observability/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/orchestrators/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/projects/[id]/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/projects/reload/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/projects/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/prs/[id]/merge/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/runtime/terminal/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/kill/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/message/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/remap/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/restore/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/sessions/[id]/send/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/sessions/patches/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/sessions/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/setup-labels/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/spawn/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/verify/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/api/webhooks/[...slug]/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/apple-icon/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/dev/terminal-test/page-5819e40b3d4754ef.js +0 -1
- package/.next/static/chunks/app/icon/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/icon-192/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/icon-512/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/loading-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/manifest.webmanifest/route-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/page-6aa506a579ac9949.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/loading-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/page-49eb5b990c74ca8f.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/sessions/[id]/page-2450704c6b66a4b4.js +0 -1
- package/.next/static/chunks/app/projects/[projectId]/settings/page-d1da671e72a7bd5e.js +0 -1
- package/.next/static/chunks/app/prs/page-2332a7180a47f28c.js +0 -1
- package/.next/static/chunks/app/sessions/[id]/loading-3b8a01e726e988c8.js +0 -1
- package/.next/static/chunks/app/sessions/[id]/page-b60b49ccbafe51c9.js +0 -1
- package/.next/static/chunks/app/test-direct/page-eb366dde03fab6a7.js +0 -1
- package/.next/static/css/fcafd381715071b8.css +0 -1
- /package/.next/static/{YR6Xi4DC5A7S7E2PoZuif → 9nr0fNWbZcuWTqhM2HhrH}/_ssgManifest.js +0 -0
|
@@ -4,10 +4,13 @@
|
|
|
4
4
|
* Extracted from direct-terminal-ws.ts and terminal-websocket.ts
|
|
5
5
|
* so the logic can be properly unit tested.
|
|
6
6
|
*/
|
|
7
|
-
import { execFileSync } from "node:child_process";
|
|
8
|
-
import { readdirSync, existsSync } from "node:fs";
|
|
7
|
+
import { execFile, execFileSync } from "node:child_process";
|
|
8
|
+
import { readdirSync, existsSync, readFileSync } from "node:fs";
|
|
9
9
|
import { homedir } from "node:os";
|
|
10
10
|
import { join } from "node:path";
|
|
11
|
+
import { promisify } from "node:util";
|
|
12
|
+
import { isWindows } from "@aoagents/ao-core";
|
|
13
|
+
const execFileAsync = promisify(execFile);
|
|
11
14
|
/** Session ID validation regex — alphanumeric, hyphens, underscores only */
|
|
12
15
|
export const SESSION_ID_PATTERN = /^[a-zA-Z0-9_-]+$/;
|
|
13
16
|
/** Hash prefix pattern — 12-char lowercase hex, as generated by generateConfigHash */
|
|
@@ -90,6 +93,8 @@ export function validateSessionId(sessionId) {
|
|
|
90
93
|
* @param execFn - Injectable execFileSync for testing. Defaults to child_process.execFileSync.
|
|
91
94
|
*/
|
|
92
95
|
export function findTmux(execFn = execFileSync) {
|
|
96
|
+
if (isWindows())
|
|
97
|
+
return null;
|
|
93
98
|
const candidates = [
|
|
94
99
|
"/opt/homebrew/bin/tmux", // macOS ARM (Homebrew)
|
|
95
100
|
"/usr/local/bin/tmux", // macOS Intel (Homebrew)
|
|
@@ -106,6 +111,35 @@ export function findTmux(execFn = execFileSync) {
|
|
|
106
111
|
}
|
|
107
112
|
return "tmux"; // Fall back to bare name
|
|
108
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Check whether a tmux session with the given name exists.
|
|
116
|
+
*
|
|
117
|
+
* Uses `=` exact-match prefix so the lookup never falls back to tmux's
|
|
118
|
+
* default prefix matching (where "ao-1" would match "ao-15"). The caller
|
|
119
|
+
* must already have the canonical tmux session name (typically the value
|
|
120
|
+
* returned by `resolveTmuxSession`).
|
|
121
|
+
*
|
|
122
|
+
* Async: this runs from inside node-pty's `onExit` callback on every agent
|
|
123
|
+
* exit, and the WebSocket server is single-threaded. A synchronous
|
|
124
|
+
* `execFileSync` here would block the event loop — and every WebSocket
|
|
125
|
+
* connection, HTTP request, and in-flight terminal — for up to the 5 s
|
|
126
|
+
* subprocess timeout when tmux is slow to respond. Use the promisified
|
|
127
|
+
* `execFile` form instead.
|
|
128
|
+
*
|
|
129
|
+
* @returns true if the session exists, false otherwise (including tmux
|
|
130
|
+
* not running, no sessions, or any unexpected error)
|
|
131
|
+
*/
|
|
132
|
+
export async function tmuxHasSession(tmuxPath, tmuxSessionName, execFn = execFileAsync) {
|
|
133
|
+
if (!tmuxPath)
|
|
134
|
+
return false;
|
|
135
|
+
try {
|
|
136
|
+
await execFn(tmuxPath, ["has-session", "-t", `=${tmuxSessionName}`], { timeout: 5000 });
|
|
137
|
+
return true;
|
|
138
|
+
}
|
|
139
|
+
catch {
|
|
140
|
+
return false;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
109
143
|
/**
|
|
110
144
|
* Resolve a user-facing session ID to its actual tmux session name.
|
|
111
145
|
*
|
|
@@ -132,6 +166,8 @@ export function findTmux(execFn = execFileSync) {
|
|
|
132
166
|
* @returns The actual tmux session name, or null if not found
|
|
133
167
|
*/
|
|
134
168
|
export function resolveTmuxSession(sessionId, tmuxPath, execFn = execFileSync, fs = defaultFs, projectId) {
|
|
169
|
+
if (!tmuxPath)
|
|
170
|
+
return null;
|
|
135
171
|
// Try exact match first using = prefix for exact matching (e.g., "ao-orchestrator")
|
|
136
172
|
// Without =, tmux uses prefix matching: "ao-1" would match "ao-15"
|
|
137
173
|
try {
|
|
@@ -177,3 +213,89 @@ export function resolveTmuxSession(sessionId, tmuxPath, execFn = execFileSync, f
|
|
|
177
213
|
}
|
|
178
214
|
return null;
|
|
179
215
|
}
|
|
216
|
+
/**
|
|
217
|
+
* Resolve a user-facing session ID to its Windows named pipe path.
|
|
218
|
+
*
|
|
219
|
+
* V2 layout (current): JSON metadata at
|
|
220
|
+
* `~/.agent-orchestrator/projects/{projectId}/sessions/{sessionId}.json`
|
|
221
|
+
* with `runtimeHandle.data.pipePath` as a top-level field.
|
|
222
|
+
*
|
|
223
|
+
* V1 layout (legacy fallback): line-delimited key=value at
|
|
224
|
+
* `~/.agent-orchestrator/{storageKey}/sessions/{sessionId}` where
|
|
225
|
+
* storageKey is bare 12-hex or `{hash}-{projectName}`. Kept so users
|
|
226
|
+
* who haven't run `ao migrate-storage` still see live sessions.
|
|
227
|
+
*
|
|
228
|
+
* When `projectId` is provided, only that project's metadata file is read.
|
|
229
|
+
* Without it (legacy callers), walks all projects and returns the first
|
|
230
|
+
* matching pipePath — which can collide when two projects share a sessionId.
|
|
231
|
+
*
|
|
232
|
+
* @returns Full pipe path (e.g., "\\\\.\\pipe\\ao-pty-win1-orchestrator"), or null
|
|
233
|
+
*/
|
|
234
|
+
export function resolvePipePath(sessionId, projectId, fs = defaultFs) {
|
|
235
|
+
if (!isWindows())
|
|
236
|
+
return null;
|
|
237
|
+
const readFile = fs.readFile ?? ((p) => readFileSync(p, "utf8"));
|
|
238
|
+
const aoBase = join(fs.homedir(), ".agent-orchestrator");
|
|
239
|
+
const readPipeFromV2 = (project) => {
|
|
240
|
+
const sessionFile = join(aoBase, "projects", project, "sessions", `${sessionId}.json`);
|
|
241
|
+
if (!fs.exists(sessionFile))
|
|
242
|
+
return null;
|
|
243
|
+
try {
|
|
244
|
+
const meta = JSON.parse(readFile(sessionFile));
|
|
245
|
+
const pipePath = meta.runtimeHandle?.data?.pipePath;
|
|
246
|
+
return typeof pipePath === "string" && pipePath.length > 0 ? pipePath : null;
|
|
247
|
+
}
|
|
248
|
+
catch {
|
|
249
|
+
return null;
|
|
250
|
+
}
|
|
251
|
+
};
|
|
252
|
+
// V2: prefer the caller's projectId when provided; otherwise walk all projects
|
|
253
|
+
const projectsDir = join(aoBase, "projects");
|
|
254
|
+
if (projectId) {
|
|
255
|
+
const pipe = readPipeFromV2(projectId);
|
|
256
|
+
if (pipe)
|
|
257
|
+
return pipe;
|
|
258
|
+
}
|
|
259
|
+
else if (fs.exists(projectsDir)) {
|
|
260
|
+
let projects;
|
|
261
|
+
try {
|
|
262
|
+
projects = fs.readdir(projectsDir);
|
|
263
|
+
}
|
|
264
|
+
catch {
|
|
265
|
+
projects = [];
|
|
266
|
+
}
|
|
267
|
+
for (const project of projects) {
|
|
268
|
+
const pipe = readPipeFromV2(project);
|
|
269
|
+
if (pipe)
|
|
270
|
+
return pipe;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
// V1 fallback: line-delimited key=value under {storageKey}/sessions/{sessionId}
|
|
274
|
+
for (const storageKey of findStorageKeysForSession(sessionId, {
|
|
275
|
+
readdir: fs.readdir,
|
|
276
|
+
exists: fs.exists,
|
|
277
|
+
homedir: fs.homedir,
|
|
278
|
+
})) {
|
|
279
|
+
const sessionFile = join(aoBase, storageKey, "sessions", sessionId);
|
|
280
|
+
let content;
|
|
281
|
+
try {
|
|
282
|
+
content = readFile(sessionFile);
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
continue;
|
|
286
|
+
}
|
|
287
|
+
const match = content.match(/^runtimeHandle=(.+)$/m);
|
|
288
|
+
if (!match)
|
|
289
|
+
continue;
|
|
290
|
+
try {
|
|
291
|
+
const handle = JSON.parse(match[1]);
|
|
292
|
+
const pipePath = handle.data?.pipePath;
|
|
293
|
+
if (pipePath && pipePath.length > 0)
|
|
294
|
+
return pipePath;
|
|
295
|
+
}
|
|
296
|
+
catch {
|
|
297
|
+
continue;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
return null;
|
|
301
|
+
}
|
package/next.config.js
CHANGED
|
@@ -1,9 +1,11 @@
|
|
|
1
|
+
import os from "os";
|
|
1
2
|
import path from "path";
|
|
2
3
|
import { fileURLToPath } from "url";
|
|
3
4
|
|
|
4
5
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
5
6
|
|
|
6
7
|
/** @type {import('next').NextConfig} */
|
|
8
|
+
const homeDir = os.homedir().replace(/\\/g, "/");
|
|
7
9
|
const nextConfig = {
|
|
8
10
|
outputFileTracingRoot: path.join(__dirname, "../.."),
|
|
9
11
|
transpilePackages: [
|
|
@@ -21,6 +23,30 @@ const nextConfig = {
|
|
|
21
23
|
"yaml",
|
|
22
24
|
"zod",
|
|
23
25
|
],
|
|
26
|
+
webpack: (config, { isServer }) => {
|
|
27
|
+
if (process.platform === "win32") {
|
|
28
|
+
config.snapshot = {
|
|
29
|
+
...config.snapshot,
|
|
30
|
+
managedPaths: [/^(.+?[\\/]node_modules[\\/])/],
|
|
31
|
+
};
|
|
32
|
+
// Prevent nft from globbing the home directory during server file tracing.
|
|
33
|
+
// ao-core resolves paths like ~/.agent-orchestrator at runtime; nft tries to
|
|
34
|
+
// scan them at build time and hits EPERM on Windows junction points
|
|
35
|
+
// (e.g. C:\Users\<user>\Application Data).
|
|
36
|
+
if (isServer) {
|
|
37
|
+
const tracePlugin = config.plugins.find(
|
|
38
|
+
(p) => p.constructor?.name === "TraceEntryPointsPlugin"
|
|
39
|
+
);
|
|
40
|
+
if (tracePlugin) {
|
|
41
|
+
tracePlugin.traceIgnores = [
|
|
42
|
+
...(tracePlugin.traceIgnores ?? []),
|
|
43
|
+
`${homeDir}/**`,
|
|
44
|
+
];
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
return config;
|
|
49
|
+
},
|
|
24
50
|
async headers() {
|
|
25
51
|
return [
|
|
26
52
|
{
|
package/package.json
CHANGED
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@aoagents/ao-web",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.7.0",
|
|
4
4
|
"description": "Web dashboard for agent-orchestrator",
|
|
5
|
+
"license": "MIT",
|
|
5
6
|
"type": "module",
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "https://github.com/ComposioHQ/agent-orchestrator.git",
|
|
10
|
+
"directory": "packages/web"
|
|
11
|
+
},
|
|
12
|
+
"homepage": "https://github.com/ComposioHQ/agent-orchestrator",
|
|
13
|
+
"bugs": {
|
|
14
|
+
"url": "https://github.com/ComposioHQ/agent-orchestrator/issues"
|
|
15
|
+
},
|
|
16
|
+
"publishConfig": {
|
|
17
|
+
"access": "public"
|
|
18
|
+
},
|
|
6
19
|
"files": [
|
|
7
20
|
".next/server",
|
|
8
21
|
".next/static",
|
|
@@ -21,17 +34,18 @@
|
|
|
21
34
|
"react-dom": "^19.0.0",
|
|
22
35
|
"server-only": "^0.0.1",
|
|
23
36
|
"ws": "^8.19.0",
|
|
24
|
-
"@aoagents/ao-core": "0.
|
|
25
|
-
"@aoagents/ao-plugin-agent-
|
|
26
|
-
"@aoagents/ao-plugin-agent-
|
|
27
|
-
"@aoagents/ao-plugin-agent-
|
|
28
|
-
"@aoagents/ao-plugin-agent-
|
|
29
|
-
"@aoagents/ao-plugin-
|
|
30
|
-
"@aoagents/ao-plugin-agent-
|
|
31
|
-
"@aoagents/ao-plugin-runtime-
|
|
32
|
-
"@aoagents/ao-plugin-
|
|
33
|
-
"@aoagents/ao-plugin-tracker-
|
|
34
|
-
"@aoagents/ao-plugin-
|
|
37
|
+
"@aoagents/ao-core": "0.7.0",
|
|
38
|
+
"@aoagents/ao-plugin-agent-claude-code": "0.7.0",
|
|
39
|
+
"@aoagents/ao-plugin-agent-codex": "0.7.0",
|
|
40
|
+
"@aoagents/ao-plugin-agent-kimicode": "0.7.0",
|
|
41
|
+
"@aoagents/ao-plugin-agent-cursor": "0.7.0",
|
|
42
|
+
"@aoagents/ao-plugin-runtime-tmux": "0.7.0",
|
|
43
|
+
"@aoagents/ao-plugin-agent-opencode": "0.7.0",
|
|
44
|
+
"@aoagents/ao-plugin-runtime-process": "0.7.0",
|
|
45
|
+
"@aoagents/ao-plugin-scm-github": "0.7.0",
|
|
46
|
+
"@aoagents/ao-plugin-tracker-github": "0.7.0",
|
|
47
|
+
"@aoagents/ao-plugin-tracker-linear": "0.7.0",
|
|
48
|
+
"@aoagents/ao-plugin-workspace-worktree": "0.7.0"
|
|
35
49
|
},
|
|
36
50
|
"optionalDependencies": {
|
|
37
51
|
"node-pty": "^1.1.0"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";exports.id=1172,exports.ids=[1172],exports.modules={13219:(a,b,c)=>{c.d(b,{Dashboard:()=>d});let d=(0,c(10864).registerClientReference)(function(){throw Error("Attempted to call Dashboard() from the server but Dashboard is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/Users/equinox/agent-orchestrator/packages/web/src/components/Dashboard.tsx","Dashboard")},16602:(a,b,c)=>{c.d(b,{Dashboard:()=>L});var d=c(33666),e=c(81115),f=c(47489),g=c.n(f),h=c(50436),i=c(52754),j=c(37155),k=c(85489),l=c(61875),m=c(82732),n=c(37501),o=c(88950);let p=new Set,q=(0,e.memo)(function({session:a,onSend:b,onKill:c,onMerge:f,onRestore:g}){var h,i;let[q,r]=(0,e.useState)(!1),[s,t]=(0,e.useState)(null),[u,v]=(0,e.useState)(null),[w,x]=(0,e.useState)(null),[y,z]=(0,e.useState)(null),[A,B]=(0,e.useState)(!1),[C,D]=(0,e.useState)(""),E=(0,e.useRef)(null),F=(0,e.useRef)(null),[G]=(0,e.useState)(()=>p.has(a.id)),H=(0,j.ng)(a),I=a.pr,J=async c=>{let d=c.trim();if(!d||null!==w)return!1;x(d),z(null);try{return await Promise.resolve(b?.(a.id,d)),z(d),F.current&&clearTimeout(F.current),F.current=setTimeout(()=>z(null),2e3),!0}catch{return!1}finally{x(null)}},K=async a=>{"Enter"===a.key&&!a.shiftKey&&(a.preventDefault(),await J(C)&&D(""))},L=async(c,d)=>{if(null===s){t(c),v(null);try{await Promise.resolve(b?.(a.id,d)),E.current&&clearTimeout(E.current),E.current=setTimeout(()=>t(null),2e3)}catch{t(null),v(c),E.current&&clearTimeout(E.current),E.current=setTimeout(()=>v(null),2e3)}}},M=!!I&&(0,j.fZ)(I),N=!!I&&(0,j.sZ)(I),O=function(a){let b=a.pr;if(!b||"open"!==b.state||(0,j.fZ)(b)||(0,j.sZ)(b))return[];let c=a.metadata,e=[],f=a.lifecycle?.prReason??null,g=c.status,h=b.ciStatus===j.U1.FAILING||"ci_failing"===f||"ci_failed"===g,i="changes_requested"===b.reviewDecision||"changes_requested"===f||"changes_requested"===g,k=!b.mergeability.noConflicts;if(h){let a=b.ciChecks.find(a=>"failed"===a.status),d=b.ciChecks.filter(a=>"failed"===a.status).length;0===d&&b.ciStatus!==j.U1.FAILING?e.push({key:"ci-fail",type:"ci",icon:"✗",label:"CI failing",url:b.url+"/checks",notified:!!c.lastCIFailureDispatchHash,actionLabel:"Ask to fix",actionMessage:`Please fix the failing CI checks on ${b.url}`}):0===d?e.push({key:"ci-unknown",type:"ci",icon:"?",label:"CI unknown",url:b.url+"/checks"}):e.push({key:"ci-fail",type:"ci",icon:"✗",count:d,label:`check${d>1?"s":""} failing`,url:a?.url??b.url+"/checks",notified:!!c.lastCIFailureDispatchHash,actionLabel:"Ask to fix",actionMessage:`Please fix the failing CI checks on ${b.url}`})}if(i?e.push({key:"changes",type:"changes",icon:"↻",label:"changes requested",url:b.url,notified:!!c.lastPendingReviewDispatchHash,actionLabel:"Ask to address",actionMessage:`Please address the requested changes on ${b.url}`}):b.isDraft||"pending"!==b.reviewDecision&&"none"!==b.reviewDecision||e.push({key:"review",type:"review",icon:(0,d.jsxs)("svg",{width:"9",height:"9",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,d.jsx)("path",{d:"M17 21v-2a4 4 0 0 0-4-4H5a4 4 0 0 0-4 4v2"}),(0,d.jsx)("circle",{cx:"9",cy:"7",r:"4"}),(0,d.jsx)("path",{d:"M23 21v-2a4 4 0 0 0-3-3.87M16 3.13a4 4 0 0 1 0 7.75"})]}),label:"needs review",url:b.url,actionLabel:"Ask to post",actionMessage:`Post ${b.url} on slack asking for a review.`}),k&&e.push({key:"conflict",type:"conflict",icon:"⚠",label:"merge conflict",url:b.url,notified:"true"===c.lastMergeConflictDispatched,actionLabel:"Ask to fix",actionMessage:`Please resolve the merge conflicts on ${b.url} by rebasing on the base branch`}),b.unresolvedThreads>0){let a=b.unresolvedComments[0]?.url??b.url+"/files";e.push({key:"comments",type:"comment",icon:"\uD83D\uDCAC",label:"unresolved comments",count:b.unresolvedThreads,url:a,actionLabel:"Ask to resolve",actionMessage:`Please address all unresolved review comments on ${b.url}`})}return e}(a),P=!M&&I?.mergeability.mergeable&&"open"===I.state,Q=(0,j.nH)(a),R=(0,j.wy)(a),S=(0,l.Pn)(a),T=(h=a,i=H,P||"merge"===i?"mergeable":h.lifecycle?.sessionState==="detecting"?"detecting":"respond"===i?(0,j.Ou)(h):h.lifecycle?.prReason==="ci_failing"||"ci_failed"===h.status?"ci failing":"review"===i?(0,j.of)(h):(0,j.Ou)(h)),U=M||!I||N?[]:I.ciChecks.filter(a=>"passed"===a.status).slice(0,3),V=(0,j.dG)(a)||"done"===H,W=a.lifecycle?`Session ${(0,j.Ou)(a)} \xb7 PR ${(0,j.of)(a)} \xb7 Runtime ${(0,j.Kw)(a)}`:null,X=a.issueLabel?`${a.issueLabel}${a.issueTitle?` \xb7 ${a.issueTitle}`:""}`:a.issueTitle??(a.summary&&a.summary!==S?a.summary:null),Y=P?"session-card--merge-frame":O.length>0?"session-card--alert-frame":"session-card--fixed",Z=P?"session-card--accent-merge":"working"===H?"session-card--accent-working":"respond"===H?"session-card--accent-respond":"review"===H||"pending"===H?"session-card--accent-attention":"session-card--accent-default";if(V){let b=function(a){let b=a.activity,c=a.status,e=a.lifecycle?.prState??a.pr?.state;return"merged"===e||"merged"===c?{label:"merged",pillClass:"done-status-pill--merged",icon:(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2.5",viewBox:"0 0 24 24",className:"h-3 w-3",children:(0,d.jsx)("path",{d:"M20 6 9 17l-5-5"})})}:"closed"===e?{label:"closed",pillClass:"done-status-pill--exited",icon:(0,d.jsxs)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",className:"h-3 w-3",children:[(0,d.jsx)("circle",{cx:"12",cy:"12",r:"9"}),(0,d.jsx)("path",{d:"M9 12h6"})]})}:a.lifecycle?.sessionState==="terminated"||"killed"===c||"terminated"===c?{label:(0,j.Ou)(a),pillClass:"done-status-pill--killed",icon:(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2.5",viewBox:"0 0 24 24",className:"h-3 w-3",children:(0,d.jsx)("path",{d:"M18 6 6 18M6 6l12 12"})})}:{label:"exited"===b?"exited":(0,j.Ou)(a),pillClass:"done-status-pill--exited",icon:(0,d.jsxs)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",className:"h-3 w-3",children:[(0,d.jsx)("circle",{cx:"12",cy:"12",r:"9"}),(0,d.jsx)("path",{d:"M9 12h6"})]})}}(a);return(0,d.jsxs)("div",{className:(0,k.cn)("session-card-done",q&&"done-expanded"),onClick:a=>{a.target.closest("a, button, textarea")||r(!q)},children:[(0,d.jsxs)("div",{className:"flex items-center gap-2 px-3.5 pt-3 pb-1.5",children:[(0,d.jsxs)("span",{className:(0,k.cn)("done-status-pill",b.pillClass),children:[b.icon,b.label]}),(0,d.jsx)("span",{className:"font-[var(--font-mono)] text-[10px] tracking-wide text-[var(--color-text-muted)]",children:a.id}),(0,d.jsx)("div",{className:"flex-1"}),R&&(0,d.jsxs)("button",{onClick:b=>{b.stopPropagation(),g?.(a.id)},className:"done-restore-btn",children:[(0,d.jsxs)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",className:"h-3 w-3",children:[(0,d.jsx)("polyline",{points:"1 4 1 10 7 10"}),(0,d.jsx)("path",{d:"M3.51 15a9 9 0 1 0 2.13-9.36L1 10"})]}),"restore"]})]}),(0,d.jsx)("div",{className:"px-3.5 pb-2",children:(0,d.jsx)("p",{className:"session-card-done__title text-[13px] font-semibold leading-snug [display:-webkit-box] [-webkit-box-orient:vertical] [-webkit-line-clamp:2] overflow-hidden",children:S})}),(0,d.jsxs)("div",{className:"flex flex-wrap items-center gap-1.5 px-3.5 pb-3",children:[a.branch&&(0,d.jsxs)("span",{className:"done-meta-chip font-[var(--font-mono)]",children:[(0,d.jsxs)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",className:"h-2.5 w-2.5 opacity-50",children:[(0,d.jsx)("path",{d:"M6 3v12M18 9a3 3 0 0 1-3 3H9a3 3 0 0 0-3 3"}),(0,d.jsx)("circle",{cx:"18",cy:"6",r:"3"})]}),a.branch]}),I&&(0,d.jsxs)("a",{href:I.url,target:"_blank",rel:"noopener noreferrer",onClick:a=>a.stopPropagation(),className:"done-meta-chip font-[var(--font-mono)] font-bold text-[var(--color-text-primary)] no-underline underline-offset-2 hover:underline",children:["#",I.number]}),I&&!M&&(N?(0,d.jsx)("span",{className:"inline-block h-[14px] w-16 animate-pulse rounded-full bg-[var(--color-bg-subtle)]"}):(0,d.jsxs)("span",{className:"done-meta-chip font-[var(--font-mono)]",children:[(0,d.jsxs)("span",{className:"text-[var(--color-status-ready)]",children:["+",I.additions]})," ",(0,d.jsxs)("span",{className:"text-[var(--color-status-error)]",children:["-",I.deletions]})," ",(0,n.i_)(I.additions,I.deletions),(0,d.jsx)("span",{className:"sr-only",children:`+${I.additions} -${I.deletions} ${(0,n.i_)(I.additions,I.deletions)}`})]})),(0,d.jsx)("a",{href:(0,o.Nc)(a.projectId,a.id),onClick:a=>a.stopPropagation(),className:"done-meta-chip font-[var(--font-mono)] font-semibold text-[var(--color-accent)] no-underline hover:underline",children:"View current context"})]}),q&&(0,d.jsxs)("div",{className:"done-expand-section px-3.5 py-3",children:[a.summary&&I?.title&&a.summary!==I.title&&(0,d.jsxs)("div",{className:"mb-3",children:[(0,d.jsxs)("div",{className:"done-detail-heading",children:[(0,d.jsx)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:(0,d.jsx)("path",{d:"M4 6h16M4 12h16M4 18h10"})}),"Summary"]}),(0,d.jsx)("p",{className:"text-[12px] leading-relaxed text-[var(--color-text-secondary)]",children:a.summary})]}),a.issueUrl&&(0,d.jsxs)("div",{className:"mb-3",children:[(0,d.jsxs)("div",{className:"done-detail-heading",children:[(0,d.jsxs)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[(0,d.jsx)("circle",{cx:"12",cy:"12",r:"10"}),(0,d.jsx)("path",{d:"M12 8v4M12 16h.01"})]}),"Issue"]}),(0,d.jsxs)("a",{href:a.issueUrl,target:"_blank",rel:"noopener noreferrer",onClick:a=>a.stopPropagation(),className:"text-[12px] text-[var(--color-accent)] hover:underline",children:[a.issueLabel||a.issueUrl,a.issueTitle&&`: ${a.issueTitle}`]})]}),I&&I.ciChecks.length>0&&(0,d.jsxs)("div",{className:"mb-3",children:[(0,d.jsxs)("div",{className:"done-detail-heading",children:[(0,d.jsxs)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[(0,d.jsx)("path",{d:"M9 12l2 2 4-4"}),(0,d.jsx)("circle",{cx:"12",cy:"12",r:"10"})]}),"CI Checks"]}),(0,d.jsx)(m.zm,{checks:I.ciChecks})]}),I&&(0,d.jsxs)("div",{className:"mb-3",children:[(0,d.jsxs)("div",{className:"done-detail-heading",children:[(0,d.jsxs)("svg",{fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[(0,d.jsx)("path",{d:"M15 22v-4a4.8 4.8 0 0 0-1-3.5c3 0 6-2 6-5.5.08-1.25-.27-2.48-1-3.5.28-1.15.28-2.35 0-3.5 0 0-1 0-3 1.5-2.64-.5-5.36-.5-8 0C6 2 5 2 5 2c-.3 1.15-.3 2.35 0 3.5A5.403 5.403 0 0 0 4 9c0 3.5 3 5.5 6 5.5-.39.49-.68 1.05-.85 1.65S8.93 17.38 9 18v4"}),(0,d.jsx)("path",{d:"M9 18c-4.51 2-5-2-7-2"})]}),"PR"]}),(0,d.jsxs)("p",{className:"text-[12px] text-[var(--color-text-secondary)]",children:[(0,d.jsx)("a",{href:I.url,target:"_blank",rel:"noopener noreferrer",onClick:a=>a.stopPropagation(),className:"hover:underline",children:I.title}),N?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("br",{}),(0,d.jsxs)("span",{className:"mt-1 inline-flex items-center gap-2 text-[10px] text-[var(--color-text-muted)]",children:[(0,d.jsx)("span",{className:"inline-block h-3 w-12 animate-pulse rounded bg-[var(--color-bg-subtle)]"}),(0,d.jsx)("span",{children:"PR details loading..."})]})]}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("br",{}),(0,d.jsxs)("span",{className:"mt-1 inline-flex items-center gap-2",children:[(0,d.jsxs)("span",{className:"done-meta-chip font-[var(--font-mono)]",children:[(0,d.jsxs)("span",{className:"text-[var(--color-status-ready)]",children:["+",I.additions]})," ",(0,d.jsxs)("span",{className:"text-[var(--color-status-error)]",children:["-",I.deletions]})]}),(0,d.jsx)("span",{className:"text-[var(--color-text-muted)]",children:"\xb7"}),(0,d.jsxs)("span",{className:"text-[10px] text-[var(--color-text-muted)]",children:["mergeable: ",I.mergeability.mergeable?"yes":"no"]}),(0,d.jsx)("span",{className:"text-[var(--color-text-muted)]",children:"\xb7"}),(0,d.jsxs)("span",{className:"text-[10px] text-[var(--color-text-muted)]",children:["review: ",I.reviewDecision]})]})]})]})]}),!I&&(0,d.jsx)("p",{className:"text-[12px] text-[var(--color-text-tertiary)]",children:"No PR associated with this session."})]})]})}let $=Q?"exited":P||"merge"===H||"review"===H?"ready":"respond"===H?"waiting":"pending"===H?"idle":"working"===H?"working":"idle";return(0,d.jsxs)("div",{className:(0,k.cn)("session-card border",!G&&"kanban-card-enter",Y,Z,P&&"card-merge-ready"),children:[(0,d.jsxs)("div",{className:"session-card__header",children:[(0,d.jsx)("span",{className:(0,k.cn)("card__adot","working"===$&&"card__adot--working","ready"===$&&"card__adot--ready","idle"===$&&"card__adot--idle","waiting"===$&&"card__adot--waiting","exited"===$&&"card__adot--exited")}),(0,d.jsx)("span",{className:"card__id",children:a.id}),(0,d.jsx)("div",{className:"flex-1"}),R&&(0,d.jsxs)("button",{onClick:b=>{b.stopPropagation(),g?.(a.id)},className:"session-card__control session-card__restore-control",children:[(0,d.jsxs)("svg",{className:"session-card__control-icon",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[(0,d.jsx)("path",{d:"M20 11a8 8 0 0 0-14.9-3.98"}),(0,d.jsx)("path",{d:"M4 5v4h4"}),(0,d.jsx)("path",{d:"M4 13a8 8 0 0 0 14.9 3.98"}),(0,d.jsx)("path",{d:"M20 19v-4h-4"})]}),"restore"]}),!Q&&(0,d.jsxs)("a",{href:(0,o.$l)(a.projectId,a.id,"#session-terminal-section"),onClick:a=>a.stopPropagation(),className:"session-card__control session-card__terminal-link",children:[(0,d.jsxs)("svg",{className:"session-card__control-icon",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[(0,d.jsx)("rect",{x:"2",y:"4",width:"20",height:"16",rx:"2"}),(0,d.jsx)("path",{d:"M6 10l4 2-4 2"}),(0,d.jsx)("path",{d:"M14 14h4"})]}),"terminal"]})]}),(0,d.jsxs)("div",{className:"session-card__body flex min-h-0 flex-1 flex-col",children:[(0,d.jsx)("div",{className:"card__title-wrap",children:(0,d.jsx)("p",{className:"card__title",children:S})}),(0,d.jsxs)("div",{className:"card__meta",children:[a.branch&&(0,d.jsx)("span",{className:"card__branch",children:a.branch}),a.branch&&I?(0,d.jsx)("span",{className:"card__meta-sep","aria-hidden":"true",children:"\xb7"}):null,I&&(0,d.jsxs)("a",{href:I.url,target:"_blank",rel:"noopener noreferrer",onClick:a=>a.stopPropagation(),className:"card__pr",children:["#",I.number]}),I&&!M&&(N?(0,d.jsx)("span",{className:"inline-block h-[14px] w-16 animate-pulse rounded-full bg-[var(--color-bg-subtle)]"}):(0,d.jsxs)("span",{className:"card__diff inline-flex items-center",children:[(0,d.jsxs)("span",{className:"card__diff-add",children:["+",I.additions]})," ",(0,d.jsxs)("span",{className:"card__diff-del",children:["-",I.deletions]})," ",(0,d.jsx)("span",{className:"card__diff-size",children:(0,n.i_)(I.additions,I.deletions)}),(0,d.jsx)("span",{className:"sr-only",children:`+${I.additions} -${I.deletions} ${(0,n.i_)(I.additions,I.deletions)}`})]}))]}),X&&(0,d.jsx)("div",{className:"px-[10px] pb-[5px]",children:"merge"===H||P?(0,d.jsxs)("p",{className:"session-card__secondary session-card__secondary--merge",children:[(0,d.jsx)("svg",{width:"9",height:"9",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24","aria-hidden":"true",children:(0,d.jsx)("path",{d:"M20 6 9 17l-5-5"})}),(0,d.jsx)("span",{children:X})]}):(0,d.jsx)("p",{className:"session-card__secondary",children:X})}),W&&(0,d.jsx)("div",{className:"px-[10px] pb-[5px]",children:(0,d.jsx)("p",{className:"text-[10px] leading-relaxed text-[var(--color-text-tertiary)]",children:W})}),M&&I?.state==="open"&&(0,d.jsx)("div",{className:"px-[10px] pb-[5px]",children:(0,d.jsxs)("span",{className:"inline-flex items-center gap-1 text-[10px] text-[var(--color-text-muted)]",children:[(0,d.jsxs)("svg",{className:"h-3 w-3 text-[var(--color-text-tertiary)]",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[(0,d.jsx)("circle",{cx:"12",cy:"12",r:"10"}),(0,d.jsx)("path",{d:"M12 8v4M12 16h.01"})]}),"PR data rate limited"]})}),U.length>0&&(0,d.jsx)("div",{className:"card__ci",children:U.map(a=>{let b=(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("svg",{width:"8",height:"8",fill:"none",stroke:"currentColor",strokeWidth:"2.5",viewBox:"0 0 24 24","aria-hidden":"true",children:(0,d.jsx)("path",{d:"M20 6 9 17l-5-5"})}),a.name]});return a.url?(0,d.jsx)("a",{href:a.url,target:"_blank",rel:"noopener noreferrer",className:"ci-chip ci-chip--pass",onClick:a=>a.stopPropagation(),children:b},a.name):(0,d.jsx)("span",{className:"ci-chip ci-chip--pass",children:b},a.name)})}),!M&&O.length>0&&(0,d.jsx)("div",{className:"card__alerts flex flex-col",children:O.slice(0,3).map(a=>(0,d.jsxs)("div",{className:(0,k.cn)("alert-row",`alert-row--${a.type}`),children:[(0,d.jsx)("span",{className:"alert-row__icon",children:a.icon}),(0,d.jsxs)("span",{className:"alert-row__text",children:[(0,d.jsxs)("a",{href:a.url,target:"_blank",rel:"noopener noreferrer",onClick:a=>a.stopPropagation(),children:[void 0!==a.count&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("span",{className:"font-bold",children:a.count})," "]}),a.label]}),a.notified&&(0,d.jsxs)("span",{className:"alert-row__notified",title:"Agent has been notified",children:[" ","\xb7 notified"]})]}),a.actionLabel&&(0,d.jsx)("button",{onClick:b=>{b.stopPropagation(),L(a.key,a.actionMessage??"")},disabled:s===a.key,className:"alert-row__action",children:s===a.key?"sent!":u===a.key?"failed":a.actionLabel})]},a.key))}),"respond"===H&&(0,d.jsxs)("div",{className:"quick-reply",onClick:a=>a.stopPropagation(),children:[a.summary&&!a.summaryIsFallback&&(0,d.jsxs)("div",{className:"card__agent-msg",children:[(0,d.jsx)("svg",{className:"card__agent-msg-icon",width:"10",height:"10",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24","aria-hidden":"true",children:(0,d.jsx)("path",{d:"M21 15a2 2 0 0 1-2 2H7l-4 4V5a2 2 0 0 1 2-2h14a2 2 0 0 1 2 2z"})}),(0,d.jsx)("span",{children:a.summary})]}),(0,d.jsx)("a",{href:(0,o.Nc)(a.projectId,a.id),onClick:a=>a.stopPropagation(),className:"card__view-context",children:"View current context →"}),!Q&&(0,d.jsxs)(d.Fragment,{children:[(0,d.jsxs)("div",{className:"card__presets",children:[(0,d.jsx)("button",{className:"card__preset",onClick:()=>void J("continue"),disabled:null!==w,children:"continue"===w?"Sending...":"continue"===y?"Sent":"Continue"}),(0,d.jsx)("button",{className:"card__preset",onClick:()=>void J("abort"),disabled:null!==w,children:"abort"===w?"Sending...":"abort"===y?"Sent":"Abort"}),(0,d.jsx)("button",{className:"card__preset",onClick:()=>void J("skip"),disabled:null!==w,children:"skip"===w?"Sending...":"skip"===y?"Sent":"Skip"})]}),(0,d.jsx)("div",{className:"card__reply-wrap",children:(0,d.jsx)("textarea",{className:"card__reply",placeholder:null!==w?"Sending...":"Type a reply... (Enter to send)","aria-label":"Type a reply to the agent",value:C,onChange:a=>D(a.target.value),onKeyDown:a=>{K(a)},rows:1,disabled:null!==w})})]})]}),(0,d.jsxs)("div",{className:"session-card__footer",children:[(0,d.jsx)("span",{className:"card__status min-w-0 truncate",title:a.userPrompt??void 0,children:!a.issueUrl&&a.userPrompt?a.userPrompt.length>60?a.userPrompt.slice(0,60)+"…":a.userPrompt:T}),P&&I?(0,d.jsxs)("button",{onClick:a=>{a.stopPropagation(),f?.(I.number)},className:"session-card__control session-card__merge-control",children:[(0,d.jsxs)("svg",{className:"session-card__control-icon",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[(0,d.jsx)("circle",{cx:"6",cy:"6",r:"2"}),(0,d.jsx)("circle",{cx:"18",cy:"18",r:"2"}),(0,d.jsx)("circle",{cx:"18",cy:"6",r:"2"}),(0,d.jsx)("path",{d:"M8 6h5a3 3 0 0 1 3 3v7"})]}),"Merge PR #",I.number]}):!Q&&(0,d.jsx)("button",{onClick:b=>{if(b.stopPropagation(),!A)return void B(!0);B(!1),c?.(a.id)},onMouseLeave:()=>B(!1),onBlur:()=>B(!1),"aria-label":A?"Confirm terminate session":"Terminate session",className:(0,k.cn)("session-card__control session-card__terminate btn--danger",A&&"is-confirming"),children:A?(0,d.jsx)("span",{className:"font-mono text-[10px] font-semibold tracking-[0.04em]",children:"kill?"}):(0,d.jsxs)("svg",{className:"session-card__control-icon",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[(0,d.jsx)("path",{d:"M3 6h18"}),(0,d.jsx)("path",{d:"M8 6V4h8v2"}),(0,d.jsx)("path",{d:"M19 6l-1 14H6L5 6"})]})})]})]})]})},function(a,b){return a.session===b.session&&a.onSend===b.onSend&&a.onKill===b.onKill&&a.onMerge===b.onMerge&&a.onRestore===b.onRestore}),r={merge:{label:"Ready",emptyMessage:"Nothing cleared to land yet."},action:{label:"Action",emptyMessage:"No agents need your input."},respond:{label:"Respond",emptyMessage:"No agents need your input."},review:{label:"Review",emptyMessage:"No code waiting for review."},pending:{label:"Pending",emptyMessage:"Nothing blocked."},working:{label:"Working",emptyMessage:"No agents running."},done:{label:"Done",emptyMessage:"No completed sessions."}},s=(0,e.memo)(function({level:a,sessions:b,onSend:c,onKill:f,onMerge:g,onRestore:h,collapsed:i,onToggle:j,compactMobile:k,onPreview:l,resetKey:m}){let n=r[a],o=void 0!==j,[p,s]=(0,e.useState)(!1),u=o&&k&&!p?b.slice(0,5):b,v=b.length-u.length;return o?(0,d.jsxs)("div",{className:`accordion-section${i?" accordion-section--collapsed":" accordion-section--expanded"}`,"data-level":a,children:[(0,d.jsxs)("button",{type:"button",className:"accordion-header",onClick:()=>j(a),"aria-expanded":!i,"aria-controls":`accordion-body-${a}`,children:[(0,d.jsx)("span",{className:"accordion-header__dot","data-level":a}),(0,d.jsx)("span",{className:"accordion-header__label",children:n.label}),(0,d.jsx)("span",{className:"accordion-header__count",children:b.length}),(0,d.jsx)("span",{className:"accordion-header__chevron","aria-hidden":"true",children:"▶"})]}),(0,d.jsx)("div",{id:`accordion-body-${a}`,className:"accordion-body",children:b.length>0?(0,d.jsxs)("div",{className:k?"mobile-session-list":"flex flex-col gap-2 p-3",children:[u.map(b=>k?(0,d.jsx)(t,{session:b,level:a,onPreview:l},b.id):(0,d.jsx)(q,{session:b,onSend:c,onKill:f,onMerge:g,onRestore:h},b.id)),k&&v>0?(0,d.jsxs)("button",{type:"button",className:"mobile-session-list__view-all",onClick:()=>s(!0),children:["View all ",b.length]}):null]}):k?(0,d.jsx)("div",{className:"mobile-session-list",children:(0,d.jsx)("div",{className:"mobile-session-list__empty",children:n.emptyMessage})}):null})]}):(0,d.jsxs)("div",{className:"kanban-column","data-level":a,children:[(0,d.jsx)("div",{className:"kanban-column__header",children:(0,d.jsxs)("div",{className:"kanban-column__title-row",children:[(0,d.jsx)("div",{className:"kanban-column__dot","data-level":a}),(0,d.jsx)("span",{className:"kanban-column__title",children:n.label}),(0,d.jsx)("span",{className:"kanban-column__count",children:b.length})]})}),(0,d.jsx)("div",{className:"kanban-column-body",children:b.length>0?(0,d.jsx)("div",{className:"kanban-column__stack",children:b.map(a=>(0,d.jsx)(q,{session:a,onSend:c,onKill:f,onMerge:g,onRestore:h},a.id))}):null})]})},function(a,b){return a.level===b.level&&a.collapsed===b.collapsed&&a.onToggle===b.onToggle&&a.onSend===b.onSend&&a.onKill===b.onKill&&a.onMerge===b.onMerge&&a.onRestore===b.onRestore&&a.compactMobile===b.compactMobile&&a.onPreview===b.onPreview&&a.resetKey===b.resetKey&&a.sessions.length===b.sessions.length&&a.sessions.every((a,c)=>a===b.sessions[c])});function t({session:a,level:b,onPreview:c}){let e=[a.branch,a.pr?`PR #${a.pr.number}`:null,a.issueLabel].filter(Boolean);return(0,d.jsxs)("div",{className:"mobile-session-row",children:[(0,d.jsxs)("button",{type:"button",className:"mobile-session-row__preview",onClick:()=>c?.(a),"aria-label":`Open ${(0,l.Pn)(a)}`,children:[(0,d.jsxs)("div",{className:"mobile-session-row__line",children:[(0,d.jsx)("span",{className:"mobile-session-row__dot","data-level":b,"aria-hidden":"true"}),(0,d.jsx)("span",{className:"mobile-session-row__title",children:(0,l.Pn)(a)})]}),(0,d.jsx)("div",{className:"mobile-session-row__meta",children:e.length>0?e.join(" \xb7 "):"No branch or PR metadata"})]}),(0,d.jsxs)("div",{className:"mobile-session-row__side",children:[(0,d.jsx)(u,{session:a,level:b}),(0,d.jsx)("a",{href:(0,o.Nc)(a.projectId,a.id),className:"mobile-session-row__open","aria-label":`Go to ${(0,l.Pn)(a)}`,children:(0,d.jsxs)("svg",{className:"mobile-session-row__open-icon",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,d.jsx)("path",{d:"M4 17V7a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v10a2 2 0 0 1-2 2H6a2 2 0 0 1-2-2Z"}),(0,d.jsx)("path",{d:"m8 10 2 2-2 2M12 14h4"})]})})]})]})}function u({session:a,level:b}){let c=r[b].label.toLowerCase();if("merge"===b&&a.pr&&(0,j.QN)(a.pr))c="ready";else if("action"===b)c="needs_input"===a.status?"needs input":"stuck"===a.status?"stuck":"errored"===a.status?"errored":"waiting_input"===a.activity?"waiting":"exited"===a.activity?"crashed":"blocked"===a.activity?"blocked":"ci_failed"===a.status?"ci failed":"changes_requested"===a.status?"changes":a.pr?.ciStatus==="failing"?"ci failed":a.pr?.reviewDecision==="changes_requested"?"changes":a.pr&&!a.pr.mergeability.noConflicts?"conflicts":"action";else"respond"===b?c="waiting_input"===a.activity?"waiting":"needs input":"review"===b?c=a.pr?.reviewDecision==="changes_requested"?"changes":"review":"pending"===b?c=a.pr?.unresolvedThreads?"threads":"pending":"working"===b&&(c="idle"===a.activity?"idle":"active");return(0,d.jsx)("span",{className:"mobile-session-row__chip",children:c})}var v=c(18768),w=c(20057),x=c(58976),y=c(31849);let z=["Working","Pending","Review","Respond","Merge"];function A({message:a,orchestratorHref:b,onSpawnOrchestrator:c=null,spawnLabel:e="Spawn Orchestrator",spawnDisabled:f=!1}){return(0,d.jsxs)("div",{className:"board-wrapper",children:[(0,d.jsx)("div",{className:"kanban-ghost","aria-hidden":"true",children:z.map(a=>(0,d.jsx)("div",{className:"kanban-ghost__col",children:(0,d.jsx)("div",{className:"kanban-ghost__head",children:a})},a))}),(0,d.jsx)("div",{className:"board-center",children:(0,d.jsxs)("div",{className:"empty-state",role:"status",children:[(0,d.jsx)("div",{className:"empty-state__icon",children:(0,d.jsxs)("svg",{width:"22",height:"22",viewBox:"0 0 24 24",fill:"none","aria-hidden":"true",children:[(0,d.jsx)("circle",{cx:"12",cy:"5.5",r:"2.5",fill:"rgba(249,115,22,0.18)",stroke:"#f97316",strokeWidth:"1.5"}),(0,d.jsx)("circle",{cx:"5.5",cy:"17",r:"2.5",fill:"var(--color-bg-subtle)",stroke:"var(--color-border-strong)",strokeWidth:"1.5"}),(0,d.jsx)("circle",{cx:"18.5",cy:"17",r:"2.5",fill:"var(--color-bg-subtle)",stroke:"var(--color-border-strong)",strokeWidth:"1.5"}),(0,d.jsx)("line",{x1:"12",y1:"8",x2:"6.7",y2:"14.8",stroke:"rgba(249,115,22,0.22)",strokeWidth:"1",strokeDasharray:"2.5 2"}),(0,d.jsx)("line",{x1:"12",y1:"8",x2:"17.3",y2:"14.8",stroke:"rgba(249,115,22,0.22)",strokeWidth:"1",strokeDasharray:"2.5 2"}),(0,d.jsx)("line",{x1:"7.8",y1:"17",x2:"16.2",y2:"17",stroke:"var(--color-border-subtle)",strokeWidth:"1",strokeDasharray:"2.5 2"})]})}),a?(0,d.jsx)("p",{className:"empty-state__text",children:a}):(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("p",{className:"empty-state__headline",children:"Ready to orchestrate"}),(0,d.jsx)("p",{className:"empty-state__hint",children:"Open the main orchestrator to start a session and fan out parallel agents across your codebase."}),b?(0,d.jsxs)("a",{href:b,className:"empty-state__cta",children:[(0,d.jsxs)("svg",{width:"12",height:"12",fill:"none",stroke:"currentColor",strokeWidth:"1.6",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,d.jsx)("circle",{cx:"12",cy:"5",r:"2",fill:"currentColor",stroke:"none"}),(0,d.jsx)("path",{d:"M12 7v4M12 11H6M12 11h6M6 11v3M12 11v3M18 11v3"}),(0,d.jsx)("circle",{cx:"6",cy:"17",r:"2"}),(0,d.jsx)("circle",{cx:"12",cy:"17",r:"2"}),(0,d.jsx)("circle",{cx:"18",cy:"17",r:"2"})]}),"Open Orchestrator"]}):c?(0,d.jsxs)("button",{type:"button",className:"empty-state__cta",onClick:c,disabled:f,children:[(0,d.jsxs)("svg",{width:"12",height:"12",fill:"none",stroke:"currentColor",strokeWidth:"1.6",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,d.jsx)("circle",{cx:"12",cy:"5",r:"2",fill:"currentColor",stroke:"none"}),(0,d.jsx)("path",{d:"M12 7v4M12 11H6M12 11h6M6 11v3M12 11v3M18 11v3"}),(0,d.jsx)("circle",{cx:"6",cy:"17",r:"2"}),(0,d.jsx)("circle",{cx:"12",cy:"17",r:"2"}),(0,d.jsx)("circle",{cx:"18",cy:"17",r:"2"})]}),e]}):null]})]})})]})}var B=c(71276);function C({status:a}){return"connected"===a?null:"disconnected"===a?(0,d.jsx)("button",{type:"button",className:"connection-bar connection-bar--disconnected","aria-live":"assertive","aria-atomic":"true",onClick:()=>window.location.reload(),children:"Offline \xb7 tap to retry"}):(0,d.jsx)("div",{className:"connection-bar connection-bar--reconnecting",role:"status","aria-live":"polite","aria-atomic":"true",children:"Reconnecting…"})}let D=[/\bBearer\s+[A-Za-z0-9._\-+/=]+\b/gi,/\bsk-[A-Za-z0-9]{10,}\b/g,/\beyJ[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\.[A-Za-z0-9_-]{8,}\b/g];function E({projectId:a}){let{showToast:b}=(0,B.d)(),[c,f]=(0,e.useState)(!1),g=(0,e.useCallback)(async()=>{if(!c){f(!0);try{let c,d=await fetch("/api/observability",{credentials:"same-origin"});if(!d.ok)return void b("Could not fetch observability snapshot","error");let e=d.headers.get("x-correlation-id");try{c=await d.json()}catch{b("Could not parse observability snapshot","error");return}let f=function a(b,c=new WeakSet){if("string"==typeof b)return D.reduce((a,b)=>a.replace(b,"[REDACTED]"),b);if(Array.isArray(b))return b.map(b=>a(b,c));if(b&&"object"==typeof b){if(c.has(b))return"[Circular]";c.add(b);let d={};for(let[e,f]of Object.entries(b))d[e]=a(f,c);return d}return b}(function(a,b){if(!b||!a||"object"!=typeof a)return a;let c={...a},d=c.projects;if(d&&"object"==typeof d&&!Array.isArray(d)){let a=d[b];c.projects=void 0===a?{}:{[b]:a}}return c}(c,a)),g={copiedAt:new Date().toISOString(),pageHref:`${window.location.origin}${window.location.pathname}`,projectId:a??null,correlationId:e,userAgent:navigator.userAgent,observability:f};await navigator.clipboard.writeText(JSON.stringify(g,null,2)),b("Debug bundle copied to clipboard","success")}catch{b("Could not copy debug bundle","error")}finally{f(!1)}}},[c,a,b]);return(0,d.jsxs)("button",{type:"button",className:"orchestrator-btn flex min-h-[44px] min-w-[44px] items-center gap-2 px-4 py-2 text-[12px] font-semibold text-[var(--color-text-secondary)] transition-colors hover:bg-[var(--color-bg-hover)] disabled:opacity-50",onClick:()=>void g(),disabled:c,"aria-label":"Copy debug bundle for issue reports",children:[(0,d.jsxs)("svg",{width:"12",height:"12",viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:"2","aria-hidden":"true",children:[(0,d.jsx)("rect",{x:"9",y:"9",width:"13",height:"13",rx:"2",ry:"2"}),(0,d.jsx)("path",{d:"M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1"})]}),"Copy debug info"]})}var F=c(70162);let G=["working","pending","action","merge"],H=["working","pending","review","respond","merge"],I=[];function J({session:a,onRestore:b}){let c=!a.summaryIsFallback&&a.summary||a.issueTitle||a.summary||a.id,e=a.pr?.state==="merged"||"merged"===a.status,f="killed"===a.status||"terminated"===a.status,g=!j.N_.has(a.status),h=`done-card__badge ${f?"done-card__badge--terminated":"done-card__badge--merged"}`;return(0,d.jsxs)("div",{className:"done-card",children:[(0,d.jsx)("p",{className:"done-card__title",children:c}),(0,d.jsxs)("div",{className:"done-card__meta",children:[(0,d.jsx)("span",{className:h,children:e?"merged":f?"terminated":"done"}),a.pr?(0,d.jsxs)("a",{href:a.pr.url,target:"_blank",rel:"noopener noreferrer",className:"done-card__pr",onClick:a=>a.stopPropagation(),children:[(0,d.jsxs)("svg",{width:"9",height:"9",fill:"none",stroke:"currentColor",strokeWidth:"1.8",viewBox:"0 0 24 24",children:[(0,d.jsx)("circle",{cx:"18",cy:"18",r:"3"}),(0,d.jsx)("circle",{cx:"6",cy:"6",r:"3"}),(0,d.jsx)("path",{d:"M6 9v3a6 6 0 0 0 6 6h3"})]}),"#",a.pr.number]}):null,(0,d.jsx)("span",{className:"done-card__age",children:function(a){if(!a)return"just now";let b=new Date(a).getTime();if(!Number.isFinite(b))return"just now";let c=Date.now()-b;if(c<=0)return"just now";let d=Math.floor(c/1e3),e=Math.floor(d/60),f=Math.floor(e/60),g=Math.floor(f/24);return d<60?`${d}s ago`:e<60?`${e}m ago`:f<24?`${f}h ago`:`${g}d ago`}(a.lastActivityAt)}),g?(0,d.jsx)("button",{type:"button",className:"done-card__restore",onClick:c=>{c.stopPropagation(),b(a.id)},children:"Restore"}):null]})]})}function K({initialSessions:a,projectId:b,projectName:c,projects:f=[],orchestrators:k,attentionZones:l="simple",dashboardLoadError:m}){let n=(0,x.eT)(),p="detailed"===l?H:G,q=(0,e.useMemo)(()=>{let b={};for(let c of a)b[c.id]=(0,j.ng)(c,l);return b},[a,l]),{sessions:r,attentionLevels:t,liveSessionsResolved:u,loadError:z}=(0,w.D)({initialSessions:a,muxSessions:n?.status==="connected"?n.sessions:void 0,muxLastError:n?.lastError,initialAttentionLevels:q,attentionZones:l}),D=(0,e.useMemo)(()=>b?r.filter(a=>a.projectId===b):r,[r,b]),K=n?.status==="disconnected"?"disconnected":n?.status==="connected"?"connected":"reconnecting",L=z??(m&&u?void 0:m),N=(0,h.useSearchParams)(),O=(0,h.useRouter)(),P=(0,e.useRef)(O);P.current=O;let Q=N.get("session")??void 0,[R,S]=(0,e.useState)(!1),[T,U]=(0,e.useState)(k??I),[V,W]=(0,e.useState)([]),[X,Y]=(0,e.useState)({}),[Z,$]=(0,e.useState)(!1),[_,aa]=(0,e.useState)(!1),ab=(0,i.U)(i.D),ac=N.get("debug"),{showToast:ad}=(0,B.d)(),[ae,af]=(0,e.useState)(!1),ag=(0,e.useRef)(r);ag.current=r;let ah=f.length>1&&void 0===b,ai=(0,e.useMemo)(()=>b?T.find(a=>a.projectId===b)??null:null,[T,b]),aj=ai?(0,o.Nc)(ai.projectId,ai.id):null,ak=!ah&&!!b&&f.some(a=>a.id===b&&!a.resolveError)&&!aj,al=b?f.find(a=>a.id===b)??null:null,am=!!b&&V.includes(b),an=b?X[b]??null:null,ao=(0,e.useMemo)(()=>ah||!Q?D:D.filter(a=>a.id===Q),[D,ah,Q]),ap=(0,e.useMemo)(()=>{let a={merge:[],action:[],respond:[],review:[],pending:[],working:[],done:[]};for(let b of ao)a[(0,j.ng)(b,l)].push(b);return a},[ao,l]),aq=(0,e.useMemo)(()=>{let a=new Map;for(let b of r){let c=a.get(b.projectId);if(c){c.push(b);continue}a.set(b.projectId,[b])}return a},[r]),ar=(0,e.useMemo)(()=>ah?f.map(a=>{let b=aq.get(a.id)??[],c={merge:0,action:0,respond:0,review:0,pending:0,working:0,done:0};for(let a of b)c[(0,j.ng)(a,l)]++;return{project:a,orchestrator:T.find(b=>b.projectId===a.id)??null,sessionCount:b.length,openPRCount:b.filter(a=>a.pr?.state==="open").length,counts:c}}):[],[T,ah,l,f,aq]),as=(0,e.useCallback)(async(a,b)=>{try{let c=await fetch(`/api/sessions/${encodeURIComponent(a)}/send`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({message:b})});if(!c.ok){let b=await c.text()||"Unknown error";console.error(`Failed to send message to ${a}:`,b),ad(`Send failed: ${b}`,"error");let d=Error(b);throw d.toastShown=!0,d}}catch(b){throw b instanceof Error&&"toastShown"in b&&b.toastShown||(console.error(`Network error sending message to ${a}:`,b),ad("Network error while sending message","error")),b}},[ad]),at=(0,e.useCallback)(async a=>{try{let b=await fetch(`/api/sessions/${encodeURIComponent(a)}/kill`,{method:"POST"});if(b.ok)ad("Session terminated","success");else{let c=await b.text();console.error(`Failed to kill ${a}:`,c),ad(`Terminate failed: ${c}`,"error")}}catch(b){console.error(`Network error killing ${a}:`,b),ad("Network error while terminating session","error")}},[ad]),au=(0,e.useCallback)(a=>{let b=ag.current.find(b=>b.id===a)??null;b&&at(b.id)},[at]),av=(0,e.useCallback)(async a=>{try{let b=await fetch(`/api/prs/${a}/merge`,{method:"POST"});if(b.ok)ad(`PR #${a} merged`,"success");else{let c=await b.text();console.error(`Failed to merge PR #${a}:`,c),ad(`Merge failed: ${c}`,"error");return}}catch(b){console.error(`Network error merging PR #${a}:`,b),ad("Network error while merging PR","error")}},[ad]),aw=(0,e.useCallback)(async a=>{try{let b=await fetch(`/api/sessions/${encodeURIComponent(a)}/restore`,{method:"POST"});if(b.ok)ad("Session restored","success"),P.current.refresh();else{let c=await b.text();console.error(`Failed to restore ${a}:`,c),ad(`Restore failed: ${c}`,"error")}}catch(b){console.error(`Network error restoring ${a}:`,b),ad("Network error while restoring session","error")}},[ad]),ax=async a=>{W(b=>b.includes(a.id)?b:[...b,a.id]),Y(({[a.id]:b,...c})=>c);try{let b=await fetch("/api/orchestrators",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({projectId:a.id})}),c=await b.json().catch(()=>null);if(!b.ok||!c?.orchestrator)throw Error(c?.error??`Failed to spawn orchestrator for ${a.name}`);let d=c.orchestrator;U(b=>{let c=b.filter(b=>b.projectId!==a.id);return c.push(d),c})}catch(c){let b=c instanceof Error?c.message:"Failed to spawn orchestrator";Y(c=>({...c,[a.id]:b})),console.error(`Failed to spawn orchestrator for ${a.id}:`,c)}finally{W(b=>b.filter(b=>b!==a.id))}},ay=p.some(a=>ap[a].length>0),az=!ah&&!ay&&!L,aA=L?(0,d.jsxs)("div",{className:"dashboard-alert mb-6 flex flex-col gap-1.5 border border-[color-mix(in_srgb,var(--color-status-error)_28%,transparent)] bg-[color-mix(in_srgb,var(--color-status-error)_10%,transparent)] px-3.5 py-2.5 text-[11px] md:mb-4",role:"alert","aria-live":"assertive",children:[(0,d.jsx)("span",{className:"font-semibold text-[var(--color-status-error)]",children:"Orchestrator failed to load"}),(0,d.jsx)("span",{className:"break-words text-[var(--color-text-secondary)]",children:L}),(0,d.jsxs)("span",{className:"text-[var(--color-text-secondary)]",children:["Confirm ",(0,d.jsx)("span",{className:"font-mono text-[10px]",children:"agent-orchestrator.yaml"})," exists and is valid, then run ",(0,d.jsx)("span",{className:"font-mono text-[10px]",children:"ao doctor"})," for diagnostics."]})]}):null,aB=(0,e.useMemo)(()=>r.some(a=>a.pr&&(0,j.fZ)(a.pr)),[r]),aC="agent orchestrator"===c?.trim().toLowerCase()?b??c??(ah?"All projects":"Dashboard"):c??(ah?"All projects":"Dashboard"),aD=!ah&&aC.trim().length>0,aE=()=>{$(a=>!a)};return(0,d.jsx)(F.I.Provider,{value:{onToggleSidebar:aE,mobileSidebarOpen:_},children:(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(C,{status:K}),(0,d.jsxs)("div",{className:"dashboard-app-shell",children:[(0,d.jsxs)("header",{className:"dashboard-app-header",children:[(0,d.jsx)("button",{type:"button",className:"dashboard-app-sidebar-toggle",onClick:aE,"aria-label":"Toggle sidebar",children:ab?(0,d.jsx)("svg",{width:"16",height:"16",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24","aria-hidden":"true",children:(0,d.jsx)("path",{d:"M4 6h16M4 12h16M4 18h16"})}):(0,d.jsxs)("svg",{width:"14",height:"14",fill:"none",stroke:"currentColor",strokeWidth:"1.75",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,d.jsx)("rect",{x:"3",y:"3",width:"18",height:"18",rx:"2"}),(0,d.jsx)("path",{d:"M9 3v18"})]})}),(0,d.jsxs)("div",{className:"dashboard-app-header__brand",children:[(0,d.jsx)("span",{className:"dashboard-app-header__brand-dot","aria-hidden":"true"}),(0,d.jsx)("span",{children:"Agent Orchestrator"})]}),aD?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)("span",{className:"dashboard-app-header__sep","aria-hidden":"true"}),(0,d.jsx)("span",{className:"dashboard-app-header__project",children:aC})]}):null,ab||"1"!==ac&&"true"!==ac?null:(0,d.jsx)(E,{projectId:b}),(0,d.jsx)("div",{className:"dashboard-app-header__spacer"}),(0,d.jsx)("div",{className:"dashboard-app-header__actions",children:!ah&&aj?(0,d.jsxs)(g(),{href:aj,className:"dashboard-app-btn dashboard-app-btn--amber","aria-label":"Orchestrator",children:[(0,d.jsxs)("svg",{width:"12",height:"12",fill:"none",stroke:"currentColor",strokeWidth:"1.6",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,d.jsx)("circle",{cx:"12",cy:"5",r:"2",fill:"currentColor",stroke:"none"}),(0,d.jsx)("path",{d:"M12 7v4M12 11H6M12 11h6M6 11v3M12 11v3M18 11v3"}),(0,d.jsx)("circle",{cx:"6",cy:"17",r:"2"}),(0,d.jsx)("circle",{cx:"12",cy:"17",r:"2"}),(0,d.jsx)("circle",{cx:"18",cy:"17",r:"2"})]}),"Orchestrator"]}):ak&&al?(0,d.jsxs)("button",{type:"button",className:"dashboard-app-btn dashboard-app-btn--amber","aria-label":"Spawn Orchestrator",onClick:()=>void ax(al),disabled:am,children:[(0,d.jsxs)("svg",{width:"12",height:"12",fill:"none",stroke:"currentColor",strokeWidth:"1.6",viewBox:"0 0 24 24","aria-hidden":"true",children:[(0,d.jsx)("circle",{cx:"12",cy:"5",r:"2",fill:"currentColor",stroke:"none"}),(0,d.jsx)("path",{d:"M12 7v4M12 11H6M12 11h6M6 11v3M12 11v3M18 11v3"}),(0,d.jsx)("circle",{cx:"6",cy:"17",r:"2"}),(0,d.jsx)("circle",{cx:"12",cy:"17",r:"2"}),(0,d.jsx)("circle",{cx:"18",cy:"17",r:"2"})]}),am?"Spawning...":"Spawn Orchestrator"]}):null})]}),(0,d.jsxs)("div",{className:`dashboard-shell dashboard-shell--desktop${Z?" dashboard-shell--sidebar-collapsed":""}`,children:[(0,d.jsx)("div",{className:`sidebar-wrapper${_?" sidebar-wrapper--mobile-open":""}`,children:(0,d.jsx)(y.u,{projects:f,sessions:r,orchestrators:T,activeProjectId:b,activeSessionId:Q,collapsed:Z,onToggleCollapsed:()=>$(a=>!a),onMobileClose:()=>aa(!1)})}),_&&(0,d.jsx)("div",{className:"sidebar-mobile-backdrop",onClick:()=>aa(!1)}),(0,d.jsxs)("main",{className:"dashboard-main dashboard-main--desktop",children:[(0,d.jsx)(v.u,{attentionLevels:t,projectName:c}),(0,d.jsxs)("div",{className:"dashboard-main__subhead",children:[(0,d.jsx)("h1",{className:"dashboard-main__title",children:"Dashboard"}),(0,d.jsx)("p",{className:"dashboard-main__subtitle",children:"Live agent sessions, pull requests, and merge status."})]}),(0,d.jsxs)("div",{className:"dashboard-main__body",children:[aA,aB&&!R&&(0,d.jsxs)("div",{className:"dashboard-alert mb-4 flex items-center gap-2.5 border border-[color-mix(in_srgb,var(--color-status-attention)_25%,transparent)] bg-[var(--color-tint-yellow)] px-3.5 py-2.5 text-[11px] text-[var(--color-status-attention)]",children:[(0,d.jsxs)("svg",{className:"h-3.5 w-3.5 shrink-0",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:[(0,d.jsx)("circle",{cx:"12",cy:"12",r:"10"}),(0,d.jsx)("path",{d:"M12 8v4M12 16h.01"})]}),(0,d.jsx)("span",{className:"flex-1",children:"GitHub API rate limited — PR data (CI status, review state, sizes) may be stale. Will retry automatically on next refresh."}),(0,d.jsx)("button",{onClick:()=>S(!0),className:"ml-1 shrink-0 opacity-60 hover:opacity-100","aria-label":"Dismiss",children:(0,d.jsx)("svg",{className:"h-3.5 w-3.5",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:(0,d.jsx)("path",{d:"M18 6 6 18M6 6l12 12"})})})]}),ah&&(0,d.jsx)(M,{overviews:ar,onSpawnOrchestrator:ax,spawningProjectIds:V,spawnErrors:X,attentionZones:l}),!ah&&ay&&(0,d.jsx)("div",{className:"kanban-board-wrap",children:(0,d.jsx)("div",{className:"kanban-board","data-columns":p.length,style:{"--kanban-column-count":p.length},children:p.map(a=>(0,d.jsx)(s,{level:a,sessions:ap[a],onSend:as,onKill:au,onMerge:av,onRestore:aw},a))})}),az?(0,d.jsx)(A,{orchestratorHref:aj,onSpawnOrchestrator:ak&&al?()=>{ax(al)}:null,spawnLabel:am?"Spawning...":"Spawn Orchestrator",spawnDisabled:am}):null,!ah&&an?(0,d.jsx)("p",{className:"mt-3 text-[11px] text-[var(--color-status-error)]",children:an}):null,!ah&&ap.done.length>0&&(0,d.jsxs)("div",{className:"done-bar mt-6",children:[(0,d.jsxs)("button",{type:"button",className:"done-bar__toggle",onClick:()=>af(a=>!a),"aria-expanded":ae,children:[(0,d.jsx)("svg",{className:`done-bar__chevron${ae?" done-bar__chevron--open":""}`,fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24","aria-hidden":"true",children:(0,d.jsx)("path",{d:"m9 18 6-6-6-6"})}),(0,d.jsx)("span",{className:"done-bar__label",children:"Done / Terminated"}),(0,d.jsx)("span",{className:"done-bar__count",children:ap.done.length})]}),ae&&(0,d.jsx)("div",{className:"done-bar__cards",children:ap.done.map(a=>(0,d.jsx)(J,{session:a,onRestore:aw},a.id))})]})]})]})]})]})]})})}function L(a){return(0,d.jsx)(B.t,{children:(0,d.jsx)(K,{...a})})}function M({overviews:a,onSpawnOrchestrator:b,spawningProjectIds:c,spawnErrors:e,attentionZones:f}){return(0,d.jsx)("div",{className:"mb-8 grid gap-4 md:grid-cols-2 xl:grid-cols-3",children:a.map(({project:a,orchestrator:h,sessionCount:i,openPRCount:j,counts:k})=>(()=>{let l=!!a.resolveError,m=(0,o.bn)(a.id);return(0,d.jsxs)("section",{className:"border border-[var(--color-border-default)] bg-[var(--color-bg-surface)] p-4",children:[(0,d.jsxs)("div",{className:"mb-4 flex items-start justify-between gap-3",children:[(0,d.jsxs)("div",{children:[(0,d.jsx)("h2",{className:"text-[14px] font-semibold text-[var(--color-text-primary)]",children:a.name}),(0,d.jsx)("div",{className:"mt-1 text-[11px] text-[var(--color-text-muted)]",children:l?"Config needs repair":(0,d.jsxs)(d.Fragment,{children:[i," active session",1!==i?"s":"",j>0?` \xb7 ${j} open PR${1!==j?"s":""}`:""]})})]}),(0,d.jsx)(g(),{href:m,className:"border border-[var(--color-border-default)] px-3 py-1.5 text-[11px] font-medium text-[var(--color-text-secondary)] hover:bg-[var(--color-bg-hover)] hover:no-underline",children:"Open project"})]}),(0,d.jsxs)("div",{className:"mb-4 flex flex-wrap gap-2",children:[(0,d.jsx)(N,{label:"Merge",value:k.merge,tone:"ready"}),"detailed"===f?(0,d.jsxs)(d.Fragment,{children:[(0,d.jsx)(N,{label:"Respond",value:k.respond,tone:"error"}),(0,d.jsx)(N,{label:"Review",value:k.review,tone:"orange"})]}):(0,d.jsx)(N,{label:"Action",value:k.action,tone:"orange"}),(0,d.jsx)(N,{label:"Pending",value:k.pending,tone:"attention"}),(0,d.jsx)(N,{label:"Working",value:k.working,tone:"working"})]}),(0,d.jsxs)("div",{className:"border-t border-[var(--color-border-subtle)] pt-3",children:[(0,d.jsxs)("div",{className:"flex items-center justify-between gap-3",children:[(0,d.jsx)("div",{className:"text-[11px] text-[var(--color-text-muted)]",children:l?"Project config could not be resolved":h?"Per-project orchestrator available":"No running orchestrator"}),l?(0,d.jsx)(g(),{href:m,className:"border border-[var(--color-border-default)] px-3 py-1.5 text-[11px] font-semibold text-[var(--color-text-secondary)] hover:bg-[var(--color-bg-hover)] hover:no-underline",children:"Repair project"}):h?(0,d.jsxs)(g(),{href:(0,o.Nc)(h.projectId,h.id),className:"orchestrator-btn flex items-center gap-2 px-3 py-1.5 text-[11px] font-semibold hover:no-underline",children:[(0,d.jsx)("span",{className:"h-1.5 w-1.5 rounded-full bg-[var(--color-accent)] opacity-80"}),"orchestrator"]}):(0,d.jsx)("button",{type:"button",onClick:()=>void b(a),disabled:c.includes(a.id),className:"orchestrator-btn px-3 py-1.5 text-[11px] font-semibold disabled:cursor-wait disabled:opacity-70",children:c.includes(a.id)?"Spawning...":"Spawn Orchestrator"})]}),e[a.id]?(0,d.jsx)("p",{className:"mt-2 text-[11px] text-[var(--color-status-error)]",children:e[a.id]}):null]})]},a.id)})())})}function N({label:a,value:b,tone:c}){return(0,d.jsxs)("div",{className:"min-w-[78px] border border-[var(--color-border-subtle)] px-2.5 py-2",children:[(0,d.jsx)("div",{className:"text-[10px] uppercase tracking-[0.08em] text-[var(--color-text-tertiary)]",children:a}),(0,d.jsx)("div",{className:"project-metric__value mt-1 text-[18px] font-semibold tabular-nums","data-tone":c,children:b})]})}},70162:(a,b,c)=>{c.d(b,{I:()=>d});let d=(0,c(81115).createContext)(null)}};
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
exports.id=3131,exports.ids=[3131],exports.modules={2191:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f}),c(81249),c(13081);var d=c(6181);let e={size:{width:32,height:32},contentType:"image/png"};async function f(a){let{__metadata_id__:b,...c}=await a.params,f=(0,d.fillMetadataSegment)(".",c,"icon"),{generateImageMetadata:g}=e;function h(a,b){let c={alt:a.alt,type:a.contentType||"image/png",url:f+(b?"/"+b:"")+"?fde4afff4688df3a"},{size:d}=a;return d&&(c.sizes=d.width+"x"+d.height),c}return g?(await g({params:c})).map((a,b)=>{let c=(a.id||b)+"";return h(a,c)}):[h(e,"")]}},3964:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,57035,23)),Promise.resolve().then(c.t.bind(c,57543,23)),Promise.resolve().then(c.t.bind(c,970,23)),Promise.resolve().then(c.t.bind(c,84702,23)),Promise.resolve().then(c.t.bind(c,18706,23)),Promise.resolve().then(c.t.bind(c,11194,23)),Promise.resolve().then(c.t.bind(c,33151,23)),Promise.resolve().then(c.t.bind(c,75210,23))},8556:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>e});var d=c(68844);function e(){return(0,d.jsx)("div",{className:"flex min-h-screen items-center justify-center bg-[var(--color-bg-base)]",children:(0,d.jsxs)("div",{className:"flex flex-col items-center gap-3",children:[(0,d.jsx)("svg",{className:"h-5 w-5 animate-spin text-[var(--color-text-tertiary)]",fill:"none",stroke:"currentColor",strokeWidth:"2",viewBox:"0 0 24 24",children:(0,d.jsx)("path",{d:"M12 3a9 9 0 1 0 9 9"})}),(0,d.jsx)("p",{className:"text-[13px] text-[var(--color-text-tertiary)]",children:"Loading…"})]})})}},13081:(a,b,c)=>{"use strict";c.d(b,{Kk:()=>f,uy:()=>e});var d=c(68844);function e(a){return a.replace(/[^\w\s-]/g,"").slice(0,50)||"AO"}function f(a,b){let c=(b.charAt(0)||"A").toUpperCase(),e=function(a){let b=0;for(let c=0;c<a.length;c++)b=a.charCodeAt(c)+((b<<5)-b);return(b%360+360)%360}(b),f=Math.round(.19*a),g=Math.round(.625*a);return(0,d.jsx)("div",{style:{width:`${a}px`,height:`${a}px`,borderRadius:`${f}px`,background:`hsl(${e}, 60%, 45%)`,display:"flex",alignItems:"center",justifyContent:"center",color:"white",fontSize:`${g}px`,fontWeight:700,fontFamily:"sans-serif"},children:c})}},16819:(a,b,c)=>{"use strict";c.d(b,{ErrorDisplay:()=>d});let d=(0,c(10864).registerClientReference)(function(){throw Error("Attempted to call ErrorDisplay() from the server but ErrorDisplay is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/Users/equinox/agent-orchestrator/packages/web/src/components/ErrorDisplay.tsx","ErrorDisplay")},23041:(a,b,c)=>{"use strict";c.d(b,{ErrorDisplay:()=>j});var d=c(33666),e=c(47489),f=c.n(e);let g={error:{accent:"var(--color-status-error)",bg:"var(--color-tint-red)",border:"color-mix(in srgb, var(--color-status-error) 24%, transparent)",label:"error"},warning:{accent:"var(--color-status-attention)",bg:"var(--color-tint-yellow)",border:"color-mix(in srgb, var(--color-status-attention) 24%, transparent)",label:"warning"},"not-found":{accent:"var(--color-accent)",bg:"var(--color-tint-blue)",border:"color-mix(in srgb, var(--color-accent) 24%, transparent)",label:"missing"}};function h({accent:a}){return(0,d.jsx)("div",{className:"flex h-14 w-14 items-center justify-center rounded-2xl border",style:{background:`linear-gradient(180deg, color-mix(in srgb, ${a} 16%, var(--color-bg-elevated)) 0%, var(--color-bg-surface) 100%)`,borderColor:`color-mix(in srgb, ${a} 18%, var(--color-border-default))`,boxShadow:"var(--detail-card-shadow)"},children:(0,d.jsxs)("svg",{className:"h-7 w-7",fill:"none",stroke:"currentColor",strokeWidth:"1.6",style:{color:a},viewBox:"0 0 24 24",children:[(0,d.jsx)("rect",{x:"2.5",y:"4.5",width:"19",height:"15",rx:"3"}),(0,d.jsx)("path",{d:"M6.5 9.5l3.25 2.5-3.25 2.5M12.75 15h4.75"})]})})}function i({action:a,primary:b=!1}){let c=b?"inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-semibold transition-colors hover:no-underline":"inline-flex items-center justify-center rounded-full border px-4 py-2 text-[12px] font-medium transition-colors hover:no-underline",e=b?{background:"var(--color-accent)",color:"var(--color-text-inverse)",borderColor:"color-mix(in srgb, var(--color-accent) 72%, transparent)"}:{background:"var(--color-bg-surface)",color:"var(--color-text-secondary)",borderColor:"var(--color-border-default)"};return a.href?(0,d.jsx)(f(),{href:a.href,className:c,style:e,children:a.label}):(0,d.jsx)("button",{type:"button",onClick:a.onClick,className:c,style:e,children:a.label})}function j({title:a,message:b,tone:c="error",detailsTitle:e="Technical details",error:f,primaryAction:j,secondaryAction:k,compact:l=!1,chrome:m="page",children:n}){let o=g[c],p=!!(f?.digest||f?.message||f?.stack);return(0,d.jsx)("div",{className:`flex w-full items-center justify-center px-6 py-10 ${l?"min-h-[calc(100vh-4rem)]":"min-h-screen"}`,style:{background:"page"===m?"radial-gradient(circle at top, var(--color-body-gradient-blue), transparent 35%), var(--color-bg-base)":"transparent"},children:(0,d.jsx)("div",{className:"w-full max-w-[36rem] rounded-[28px] border p-6 sm:p-8",style:{background:"linear-gradient(180deg, color-mix(in srgb, var(--color-bg-elevated) 88%, transparent) 0%, var(--color-bg-surface) 100%)",borderColor:"var(--color-border-default)",boxShadow:"var(--detail-card-shadow)"},children:(0,d.jsxs)("div",{className:"flex flex-col gap-6",children:[(0,d.jsxs)("div",{className:"flex flex-col gap-4 sm:flex-row sm:items-start",children:[(0,d.jsx)(h,{accent:o.accent}),(0,d.jsxs)("div",{className:"min-w-0 flex-1",children:[(0,d.jsx)("div",{className:"mb-3 inline-flex items-center rounded-full border px-2.5 py-1 font-[var(--font-mono)] text-[10px] font-medium uppercase tracking-[0.22em]",style:{color:o.accent,background:o.bg,borderColor:o.border},children:o.label}),(0,d.jsx)("h1",{className:"text-[24px] font-semibold tracking-[-0.04em] text-[var(--color-text-primary)]",children:a}),(0,d.jsx)("p",{className:"mt-2 max-w-[34rem] text-[14px] leading-6 text-[var(--color-text-secondary)]",children:b})]})]}),(j||k)&&(0,d.jsxs)("div",{className:"flex flex-wrap gap-3",children:[j?(0,d.jsx)(i,{action:j,primary:!0}):null,k?(0,d.jsx)(i,{action:k}):null]}),n,p?(0,d.jsxs)("details",{className:"rounded-2xl border",style:{background:"color-mix(in srgb, var(--color-bg-elevated) 84%, transparent)",borderColor:"var(--color-border-subtle)"},children:[(0,d.jsx)("summary",{className:"cursor-pointer list-none px-4 py-3 text-[12px] font-medium text-[var(--color-text-secondary)]",children:e}),(0,d.jsxs)("div",{className:"border-t px-4 py-4",style:{borderColor:"var(--color-border-subtle)"},children:[f?.digest?(0,d.jsxs)("p",{className:"mb-3 font-[var(--font-mono)] text-[11px] text-[var(--color-text-tertiary)]",children:["digest: ",f.digest]}):null,f?.message?(0,d.jsx)("p",{className:"mb-3 text-[12px] leading-5 text-[var(--color-text-secondary)]",children:f.message}):null,f?.stack?(0,d.jsx)("pre",{className:"overflow-x-auto whitespace-pre-wrap font-[var(--font-mono)] text-[11px] leading-5 text-[var(--color-text-tertiary)]",children:f.stack}):null]})]}):null]})})})}},24553:()=>{},26400:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f});var d=c(33666);c(81115);var e=c(23041);function f({error:a,reset:b}){return(0,d.jsx)("html",{lang:"en",className:"dark",children:(0,d.jsx)("body",{className:"bg-[var(--color-bg-base)] text-[var(--color-text-primary)] antialiased",children:(0,d.jsx)(e.ErrorDisplay,{title:"Something broke at the app shell",message:"The dashboard could not recover from this error at the layout level. Try again first, then reload the page if it still fails.",tone:"error",primaryAction:{label:"Try again",onClick:b},secondaryAction:{label:"Reload page",onClick:()=>window.location.reload()},error:a})})})}},27926:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(10864).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/Users/equinox/agent-orchestrator/packages/web/src/app/global-error.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/Users/equinox/agent-orchestrator/packages/web/src/app/global-error.tsx","default")},37728:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f}),c(81249),c(13081);var d=c(6181);let e={size:{width:180,height:180},contentType:"image/png"};async function f(a){let{__metadata_id__:b,...c}=await a.params,f=(0,d.fillMetadataSegment)(".",c,"apple-icon"),{generateImageMetadata:g}=e;function h(a,b){let c={alt:a.alt,type:a.contentType||"image/png",url:f+(b?"/"+b:"")+"?95aeb60ec7acf330"},{size:d}=a;return d&&(c.sizes=d.width+"x"+d.height),c}return g?(await g({params:c})).map((a,b)=>{let c=(a.id||b)+"";return h(a,c)}):[h(e,"")]}},41936:(a,b,c)=>{Promise.resolve().then(c.bind(c,27926))},49905:(a,b,c)=>{"use strict";function d(){return null}c.d(b,{ServiceWorkerRegistrar:()=>d}),c(81115)},51664:(a,b,c)=>{Promise.resolve().then(c.bind(c,26400))},54433:(a,b,c)=>{Promise.resolve().then(c.bind(c,16819))},58976:(a,b,c)=>{"use strict";c.d(b,{eT:()=>h,i2:()=>j});var d=c(33666),e=c(81115),f=c.n(e);let g=f().createContext(void 0);function h(){return f().useContext(g)}function i(a,b){return b?`${b}:${a}`:a}function j({children:a}){let b=(0,e.useRef)(null),c=(0,e.useRef)(new Map),f=(0,e.useRef)(new Map),[h,j]=(0,e.useState)("connecting"),[k,l]=(0,e.useState)([]),[m,n]=(0,e.useState)(null),o=(0,e.useRef)(0),p=(0,e.useRef)(null),q=(0,e.useRef)({}),r=(0,e.useRef)(!1),s=(0,e.useCallback)(()=>{if(!b.current){j("connecting");try{let a=function(a){let b=window.location,c="https:"===b.protocol?"wss:":"ws:",d=a.proxyWsPath??process.env.NEXT_PUBLIC_TERMINAL_WS_PATH;if(d){let a=d.replace(/\/ws\/?$/,"");return`${c}//${b.host}${a}/mux`}if(""===b.port||"443"===b.port||"80"===b.port)return`${c}//${b.hostname}/ao-terminal-mux`;let e=a.directTerminalPort??process.env.NEXT_PUBLIC_DIRECT_TERMINAL_PORT??"14801";return`${c}//${b.hostname}:${e}/mux`}(q.current);console.log("[MuxProvider] Connecting to",a);let d=new WebSocket(a);b.current=d,d.addEventListener("open",()=>{if(r.current)return void d.close();for(let a of(console.log("[MuxProvider] Connected"),j("connected"),o.current=0,f.current.values())){let b={ch:"terminal",id:a.id,type:"open",...a.projectId&&{projectId:a.projectId},...a.tmuxName&&{tmuxName:a.tmuxName}};d.send(JSON.stringify(b))}d.send(JSON.stringify({ch:"subscribe",topics:["sessions"]}))}),d.addEventListener("message",a=>{try{let b=JSON.parse(a.data);if("terminal"===b.ch){let a=i(b.id,"projectId"in b?b.projectId:void 0);if("data"===b.type){let d=c.current.get(a);if(d)for(let a of d)a(b.data)}else if("opened"===b.type)f.current.has(a)||f.current.set(a,{id:b.id,..."projectId"in b&&b.projectId?{projectId:b.projectId}:{}});else if("exited"===b.type){f.current.delete(a);let d=c.current.get(a);if(d){let a=`\r
|
|
2
|
-
\x1b[31m[Terminal exited with code ${b.code}]\x1b[0m\r
|
|
3
|
-
`;for(let b of d)b(a)}}else"error"===b.type&&console.error(`[MuxProvider] Terminal error for ${b.id}:`,b.message)}else"sessions"===b.ch&&("snapshot"===b.type?(l(b.sessions),n(null)):"error"===b.type&&n(b.error))}catch(a){console.error("[MuxProvider] Error processing message:",a)}}),d.addEventListener("error",a=>{console.error("[MuxProvider] WebSocket error:",a)}),d.addEventListener("close",()=>{if(console.log("[MuxProvider] Disconnected"),b.current===d&&(b.current=null),r.current)return;let a=Math.min(1e3*Math.pow(2,o.current),3e4);o.current+=1,j("reconnecting"),p.current=setTimeout(()=>{console.log(`[MuxProvider] Reconnecting (attempt ${o.current})...`),s()},a)})}catch(a){console.error("[MuxProvider] Failed to create WebSocket:",a),j("disconnected")}}},[]),t=(0,e.useCallback)((a,d,e)=>{let g=i(a,e),h=c.current.get(g);if(h||(h=new Set,c.current.set(g,h)),h.add(d),!f.current.has(g)&&b.current?.readyState===WebSocket.OPEN){let c={ch:"terminal",id:a,type:"open",...e&&{projectId:e}};b.current.send(JSON.stringify(c))}return()=>{let a=c.current.get(g);a&&(a.delete(d),0===a.size&&c.current.delete(g))}},[]),u=(0,e.useCallback)((a,c,d)=>{if(b.current?.readyState===WebSocket.OPEN){let e={ch:"terminal",id:a,type:"data",data:c,...d&&{projectId:d}};b.current.send(JSON.stringify(e))}},[]),v=(0,e.useCallback)((a,c,d)=>{if(f.current.set(i(a,c),{id:a,projectId:c,tmuxName:d}),b.current?.readyState===WebSocket.OPEN){let e={ch:"terminal",id:a,type:"open",...c&&{projectId:c},...d&&{tmuxName:d}};b.current.send(JSON.stringify(e))}},[]),w=(0,e.useCallback)((a,c)=>{if(f.current.delete(i(a,c)),b.current?.readyState===WebSocket.OPEN){let d={ch:"terminal",id:a,type:"close",...c&&{projectId:c}};b.current.send(JSON.stringify(d))}},[]),x=(0,e.useCallback)((a,c,d,e)=>{if(b.current?.readyState===WebSocket.OPEN){let f={ch:"terminal",id:a,type:"resize",cols:c,rows:d,...e&&{projectId:e}};b.current.send(JSON.stringify(f))}},[]),y=(0,e.useMemo)(()=>({subscribeTerminal:t,writeTerminal:u,openTerminal:v,closeTerminal:w,resizeTerminal:x,status:h,sessions:k,lastError:m}),[t,u,v,w,x,h,k,m]);return(0,d.jsx)(g.Provider,{value:y,children:a})}},62108:(a,b,c)=>{Promise.resolve().then(c.t.bind(c,8125,23)),Promise.resolve().then(c.t.bind(c,6125,23)),Promise.resolve().then(c.t.bind(c,74148,23)),Promise.resolve().then(c.t.bind(c,10236,23)),Promise.resolve().then(c.t.bind(c,97760,23)),Promise.resolve().then(c.t.bind(c,9528,23)),Promise.resolve().then(c.t.bind(c,20225,23)),Promise.resolve().then(c.bind(c,23240))},62886:(a,b,c)=>{Promise.resolve().then(c.bind(c,89252))},63028:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>f});var d=c(68844),e=c(16819);function f(){return(0,d.jsx)(e.ErrorDisplay,{title:"Page not found",message:"This route does not exist in the dashboard. Return to the main view to pick an active project or session.",tone:"not-found",primaryAction:{label:"Back to dashboard",href:"/"}})}},69648:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>j,generateMetadata:()=>i,viewport:()=>h});var d=c(68844),e=c(81249),f=c(81871),g=c(94666);c(24553);let h={width:"device-width",initialScale:1,viewportFit:"cover",themeColor:[{media:"(prefers-color-scheme: light)",color:"#f5f3f0"},{media:"(prefers-color-scheme: dark)",color:"#121110"}]};async function i(){let a=(0,e.P_)();return{title:{template:`%s | ${a}`,default:`ao | ${a}`},description:"Dashboard for managing parallel AI coding agents",appleWebApp:{capable:!0,statusBarStyle:"black-translucent",title:`ao | ${a}`}}}function j({children:a}){return(0,d.jsx)("html",{lang:"en",className:"dark",suppressHydrationWarning:!0,children:(0,d.jsxs)("body",{className:"h-screen overflow-hidden bg-[var(--color-bg-base)] text-[var(--color-text-primary)] antialiased",children:[(0,d.jsx)(g.Providers,{children:a}),(0,d.jsx)(f.ServiceWorkerRegistrar,{})]})})}},71134:(a,b,c)=>{Promise.resolve().then(c.bind(c,82834))},71241:(a,b,c)=>{Promise.resolve().then(c.bind(c,88496)),Promise.resolve().then(c.bind(c,49905))},80969:(a,b,c)=>{Promise.resolve().then(c.bind(c,94666)),Promise.resolve().then(c.bind(c,81871))},81249:(a,b,c)=>{"use strict";c.d(b,{Bq:()=>m,P_:()=>l,cf:()=>n});var d=c(29685),e=c(73024),f=c(76760),g=c(35217);function h(){let a=(0,g.NoB)();try{return(0,g.Z9L)(a)}catch(a){if(a instanceof g.kw3||a instanceof Error&&"code"in a&&"ENOENT"===a.code)return(0,g.Z9L)();throw a}}function i(a){try{return(0,e.realpathSync)(a)}catch{return(0,f.resolve)(a)}}function j(a,b){let c=i(a);for(let[a,d]of Object.entries(b.projects))if("string"==typeof d.path&&i(d.path)===c)return a}function k(a=h()){try{let b=function(a){try{let b=function(a){let b=(0,f.resolve)(a);for(;;){for(let a of["agent-orchestrator.yaml","agent-orchestrator.yml"]){let c=(0,f.resolve)(b,a);if((0,e.existsSync)(c))return c}let a=(0,f.dirname)(b);if(a===b)return;b=a}}(process.cwd());if(!b)return;let c=(0,g.Z9L)(b),d=i((0,g.NoB)());if(i(c.configPath)!==d){for(let b of Object.values(c.projects)){if("string"!=typeof b.path)continue;let c=j(b.path,a);if(c)return c}return j((0,f.dirname)(c.configPath),a)}}catch{}}(a);if(b)return b;let c=i(process.cwd());return j(c,a)}catch{return}}let l=(0,d.cache)(()=>{try{let a=h(),b=k(a);if(b){let c=a.projects[b];return c?.name??b}let c=Object.keys(a.projects)[0];if(c)return(a.projects[c].name??c)||c||"ao"}catch{}return"ao"}),m=(0,d.cache)(()=>{try{let a=h(),b=k(a);if(b)return b;let c=Object.keys(a.projects)[0];if(c)return c}catch{}return"ao"}),n=(0,d.cache)(()=>{try{let a=h();return[...Object.entries(a.projects).map(([a,b])=>({id:a,name:b.name??a,sessionPrefix:b.sessionPrefix??a})),...Object.entries(a.degradedProjects).map(([a,b])=>({id:a,name:a,sessionPrefix:a,resolveError:b.resolveError}))]}catch{return[]}})},81871:(a,b,c)=>{"use strict";c.d(b,{ServiceWorkerRegistrar:()=>d});let d=(0,c(10864).registerClientReference)(function(){throw Error("Attempted to call ServiceWorkerRegistrar() from the server but ServiceWorkerRegistrar is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/Users/equinox/agent-orchestrator/packages/web/src/components/ServiceWorkerRegistrar.tsx","ServiceWorkerRegistrar")},82834:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>d});let d=(0,c(10864).registerClientReference)(function(){throw Error("Attempted to call the default export of \"/Users/equinox/agent-orchestrator/packages/web/src/app/error.tsx\" from the server, but it's on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/Users/equinox/agent-orchestrator/packages/web/src/app/error.tsx","default")},88496:(a,b,c)=>{"use strict";c.d(b,{Providers:()=>g});var d=c(33666),e=c(93463),f=c(58976);function g({children:a}){return(0,d.jsx)(e.N,{attribute:"class",defaultTheme:"dark",enableSystem:!1,children:(0,d.jsx)(f.i2,{children:a})})}},89252:(a,b,c)=>{"use strict";c.r(b),c.d(b,{default:()=>g});var d=c(33666),e=c(50436);c(81115);var f=c(23041);function g({error:a,reset:b}){let c=(0,e.useRouter)();return(0,d.jsx)(f.ErrorDisplay,{title:"Something went wrong",message:"The dashboard hit an unexpected error. Try reloading the route data or head back to the main dashboard.",tone:"warning",primaryAction:{label:"Try again",onClick:()=>{b(),c.refresh()}},secondaryAction:{label:"Back to dashboard",href:"/"},error:a,compact:!0,chrome:"card"})}},90881:(a,b,c)=>{Promise.resolve().then(c.bind(c,23041))},94666:(a,b,c)=>{"use strict";c.d(b,{Providers:()=>d});let d=(0,c(10864).registerClientReference)(function(){throw Error("Attempted to call Providers() from the server but Providers is on the client. It's not possible to invoke a client function from the server, it can only be rendered as a Component or passed to props of a Client Component.")},"/Users/equinox/agent-orchestrator/packages/web/src/app/providers.tsx","Providers")}};
|