agentroam-runtime-win32-x64 0.2.0-preview.53 → 0.2.0-preview.55
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/manifest.json +1 -1
- package/package.json +1 -1
- package/runtime/.next/BUILD_ID +1 -1
- package/runtime/.next/app-path-routes-manifest.json +1 -1
- package/runtime/.next/build-manifest.json +2 -2
- package/runtime/.next/prerender-manifest.json +1 -1
- package/runtime/.next/server/app/_not-found.html +1 -1
- package/runtime/.next/server/app/_not-found.rsc +1 -1
- package/runtime/.next/server/app-paths-manifest.json +27 -27
- package/runtime/.next/server/pages/404.html +1 -1
- package/runtime/.next/server/pages/500.html +1 -1
- package/runtime/.next/server/server-reference-manifest.json +1 -1
- package/runtime/lib/remote-control/helper-manager.mjs +13 -16
- package/runtime/lib/remote-control/macos-helper-app.mjs +181 -0
- package/runtime/lib/remote-control/remote-authorization.mjs +2 -1
- package/runtime/webapp/dist/assets/{AiHubPane-28mWQJ4O.js → AiHubPane-Cu92elLn.js} +1 -1
- package/runtime/webapp/dist/assets/{App-ekMWYwJF.js → App-CIoUFqUR.js} +3 -3
- package/runtime/webapp/dist/assets/{BrowserLivePanel-jpMOjMFS.js → BrowserLivePanel-BsthwY1a.js} +1 -1
- package/runtime/webapp/dist/assets/{CollaborationDashboard-DWlttP3f.js → CollaborationDashboard-DG7Y0h1s.js} +1 -1
- package/runtime/webapp/dist/assets/{CollaborationPage-CsXdyER9.js → CollaborationPage-DA902wqi.js} +1 -1
- package/runtime/webapp/dist/assets/{FilePreview-C8hi9jdd.js → FilePreview-CGjiY6Oh.js} +3 -3
- package/runtime/webapp/dist/assets/{FileTree-Bl3OeqMa.js → FileTree-BC45MKRL.js} +1 -1
- package/runtime/webapp/dist/assets/{FlowStudioPane-B2Crgund.js → FlowStudioPane-9TrQcObf.js} +1 -1
- package/runtime/webapp/dist/assets/{RemoteDesktopPage-BuGJBiP2.js → RemoteDesktopPage-DMnDxASQ.js} +1 -1
- package/runtime/webapp/dist/assets/{TerminalPane-JNs8BUgC.js → TerminalPane-Ds9JxVMt.js} +1 -1
- package/runtime/webapp/dist/assets/{abnfDiagram-VCTEODGH-Da5MSN2N.js → abnfDiagram-VCTEODGH-2YNJ76WG.js} +1 -1
- package/runtime/webapp/dist/assets/{arc-CJB563ao.js → arc-CcKuP0ye.js} +1 -1
- package/runtime/webapp/dist/assets/{architectureDiagram-5GKGNRK7-DHyh6h-n.js → architectureDiagram-5GKGNRK7-Bw49xhZn.js} +1 -1
- package/runtime/webapp/dist/assets/{artifact-links-CPifzsfG.js → artifact-links-OG5Ksgyd.js} +1 -1
- package/runtime/webapp/dist/assets/{blockDiagram-I7D4REHJ-Cuk8q0Bq.js → blockDiagram-I7D4REHJ-Dqm_qfY7.js} +1 -1
- package/runtime/webapp/dist/assets/{c4Diagram-7LVT6UL2-BCPECNbi.js → c4Diagram-7LVT6UL2-CASULDQ9.js} +1 -1
- package/runtime/webapp/dist/assets/channel-xKavBx6z.js +1 -0
- package/runtime/webapp/dist/assets/{chunk-2Q5K7J3B-B1J-5flF.js → chunk-2Q5K7J3B-yEnUXBZC.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-5VM5RSS4-CaM_vBe1.js → chunk-5VM5RSS4-Djs5IDQf.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-F27PBJKO-BDwB4XD_.js → chunk-F27PBJKO-CdLh9ewF.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-IMKFNOWR-N5RKmqRM.js → chunk-IMKFNOWR-I-pRrlxR.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-JWPE2WC7-B1hPaIN0.js → chunk-JWPE2WC7-BD2Gv69T.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-POPQ4Y6H-DtWE5sgA.js → chunk-POPQ4Y6H-BhuerIJs.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-SVP7TREG-5FC9DbzN.js → chunk-SVP7TREG-AWEtUvjM.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-TICWLB2K-CpXAEy0r.js → chunk-TICWLB2K-BiO_dQcW.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-XXDRQBXY-b8vc4bP6.js → chunk-XXDRQBXY-zkjO5GCv.js} +1 -1
- package/runtime/webapp/dist/assets/classDiagram-ZZMXUADV-B6zj-gda.js +1 -0
- package/runtime/webapp/dist/assets/classDiagram-v2-VYDZK3BY-B6zj-gda.js +1 -0
- package/runtime/webapp/dist/assets/{clipboard-3WFkCzei.js → clipboard-CvdeFLww.js} +1 -1
- package/runtime/webapp/dist/assets/{codeSyntax-DS1_JVNX.js → codeSyntax-ByG7L1fi.js} +1 -1
- package/runtime/webapp/dist/assets/{collaboration-D-rkE6BZ.js → collaboration-Be_9WEiY.js} +1 -1
- package/runtime/webapp/dist/assets/{cose-bilkent-JH36ORCC-KBhpU3xZ.js → cose-bilkent-JH36ORCC-CAxuJw-v.js} +1 -1
- package/runtime/webapp/dist/assets/{cynefin-OW5HDTMX-DcTIXxSW.js → cynefin-OW5HDTMX-hLWhgC57.js} +1 -1
- package/runtime/webapp/dist/assets/{cynefinDiagram-5FMLGOSQ-BDw54V_6.js → cynefinDiagram-5FMLGOSQ-uelhySIx.js} +1 -1
- package/runtime/webapp/dist/assets/{dagre-GXQ25YYZ-BH9md9Zn.js → dagre-GXQ25YYZ-DPO7KxIX.js} +1 -1
- package/runtime/webapp/dist/assets/{diagram-S7CK7UJ4-D_g32W87.js → diagram-S7CK7UJ4-B8jQa5Lm.js} +1 -1
- package/runtime/webapp/dist/assets/{diagram-UQ7AKVKN-CS8ZEPA3.js → diagram-UQ7AKVKN-DdymRFf0.js} +1 -1
- package/runtime/webapp/dist/assets/{diagram-VSXAHHWV-VvEP2JUb.js → diagram-VSXAHHWV-BHAv1Uzp.js} +1 -1
- package/runtime/webapp/dist/assets/{diagram-VX7I27RA-BfoXLyAq.js → diagram-VX7I27RA-DlRev6E7.js} +1 -1
- package/runtime/webapp/dist/assets/{diagram-Z3DM3KII-BpzHahJO.js → diagram-Z3DM3KII-DspqqK0b.js} +1 -1
- package/runtime/webapp/dist/assets/{ebnfDiagram-PWID7BFC-CAGXPKzY.js → ebnfDiagram-PWID7BFC-BwStWg-O.js} +1 -1
- package/runtime/webapp/dist/assets/{erDiagram-RLTQ6QDP-DXgIcNCs.js → erDiagram-RLTQ6QDP-jUH66GeO.js} +1 -1
- package/runtime/webapp/dist/assets/{file-types-BzGqzhLB.js → file-types-Bbr1oDan.js} +1 -1
- package/runtime/webapp/dist/assets/{flowDiagram-HODETNUW-CflNqqOn.js → flowDiagram-HODETNUW-b2JhyYZh.js} +1 -1
- package/runtime/webapp/dist/assets/{ganttDiagram-EL5Y4UJY-BXuekM-f.js → ganttDiagram-EL5Y4UJY-k6xQA8nM.js} +1 -1
- package/runtime/webapp/dist/assets/{gitGraphDiagram-WWUBYQGX-bYPad77G.js → gitGraphDiagram-WWUBYQGX-Cg8O3XcX.js} +1 -1
- package/runtime/webapp/dist/assets/{index-Br90NYRo.js → index-CQepZy15.js} +4 -4
- package/runtime/webapp/dist/assets/{infoDiagram-27XIBGKW-CQPIcUL0.js → infoDiagram-27XIBGKW-BEZuUiUV.js} +1 -1
- package/runtime/webapp/dist/assets/{ishikawaDiagram-5VMMS53U-DEq3JCpB.js → ishikawaDiagram-5VMMS53U-D8cPBWA9.js} +1 -1
- package/runtime/webapp/dist/assets/{journeyDiagram-3NMN7TZE-BOsgjYtC.js → journeyDiagram-3NMN7TZE-BiCIZoXl.js} +1 -1
- package/runtime/webapp/dist/assets/{kanban-definition-UXKFOSKX-DQoyHlvK.js → kanban-definition-UXKFOSKX-DBGsdTe3.js} +1 -1
- package/runtime/webapp/dist/assets/{layout-Dvzdsu8z.js → layout-CESwBcoQ.js} +1 -1
- package/runtime/webapp/dist/assets/{linear-CZ1jj4Qd.js → linear-meicA11o.js} +1 -1
- package/runtime/webapp/dist/assets/{loader-circle-QarW4WFo.js → loader-circle-gCGomGeo.js} +1 -1
- package/runtime/webapp/dist/assets/{mermaid.core-KMEOhVvg.js → mermaid.core-BsSrKkY-.js} +5 -5
- package/runtime/webapp/dist/assets/{mindmap-definition-YA3MSWOX-D9I0keet.js → mindmap-definition-YA3MSWOX-Ci76EHnj.js} +1 -1
- package/runtime/webapp/dist/assets/{page-AR_mj5nj.js → page-CaBcebHM.js} +3 -3
- package/runtime/webapp/dist/assets/{pegDiagram-XKGWAZYB-DDAP2JW5.js → pegDiagram-XKGWAZYB-BJ9fzsRy.js} +1 -1
- package/runtime/webapp/dist/assets/{pieDiagram-E7YTZNPT-IH7ebgtF.js → pieDiagram-E7YTZNPT-Dr_g_s7V.js} +1 -1
- package/runtime/webapp/dist/assets/{quadrantDiagram-AXDQQJYC-DPPZl9Er.js → quadrantDiagram-AXDQQJYC-DRUIkYzL.js} +1 -1
- package/runtime/webapp/dist/assets/{railroadDiagram-O6MQD6OU-DNvgDa9Z.js → railroadDiagram-O6MQD6OU-z_f3jTzL.js} +1 -1
- package/runtime/webapp/dist/assets/{requirementDiagram-BXWQKSXE-BnwKpB1I.js → requirementDiagram-BXWQKSXE-BZ9192zw.js} +1 -1
- package/runtime/webapp/dist/assets/{rotate-ccw-DpluTZOU.js → rotate-ccw-CU6Ofovh.js} +1 -1
- package/runtime/webapp/dist/assets/{rotate-cw-7IpfF4VS.js → rotate-cw-CI-k2c-H.js} +1 -1
- package/runtime/webapp/dist/assets/{sankeyDiagram-P5KCCOFB-6DPBxCTG.js → sankeyDiagram-P5KCCOFB-D_bYtKCw.js} +1 -1
- package/runtime/webapp/dist/assets/{send-zD9gXsHU.js → send-B_L3JVTV.js} +1 -1
- package/runtime/webapp/dist/assets/{sequenceDiagram-WJ2MYXX4-9tGhIDjG.js → sequenceDiagram-WJ2MYXX4-BRPkyVwo.js} +1 -1
- package/runtime/webapp/dist/assets/{sizeCapture-INFHLROL-DOG6MmJx.js → sizeCapture-INFHLROL-D0IXlEUO.js} +1 -1
- package/runtime/webapp/dist/assets/{smartphone-CMucPYln.js → smartphone-BaM-cilR.js} +1 -1
- package/runtime/webapp/dist/assets/{stateDiagram-D77RDMKH-BH_8rviv.js → stateDiagram-D77RDMKH-DOPcJmKu.js} +1 -1
- package/runtime/webapp/dist/assets/stateDiagram-v2-MP3YSRHH-CosKh0dU.js +1 -0
- package/runtime/webapp/dist/assets/{swimlanes-42K2YHIH-C1OBfphK.js → swimlanes-42K2YHIH-DkWPxpZR.js} +1 -1
- package/runtime/webapp/dist/assets/swimlanesDiagram-VR7AAH4N-eLjpgpHz.js +8 -0
- package/runtime/webapp/dist/assets/{timeline-definition-24CTP7MA-C7NbwS8G.js → timeline-definition-24CTP7MA-DSSrwQZc.js} +1 -1
- package/runtime/webapp/dist/assets/{trash-2-CzmPRys1.js → trash-2-CCZMuVfC.js} +1 -1
- package/runtime/webapp/dist/assets/{vennDiagram-4TSXK5OY-BAv8h8Fn.js → vennDiagram-4TSXK5OY-QRwqQ2e4.js} +1 -1
- package/runtime/webapp/dist/assets/{wardleyDiagram-VM6X3IG4-DwXhvlJe.js → wardleyDiagram-VM6X3IG4-BOSS_TSY.js} +1 -1
- package/runtime/webapp/dist/assets/{web-C9euibRI.js → web-DX0wjWUS.js} +1 -1
- package/runtime/webapp/dist/assets/{web-BIr9lkvO.js → web-ebzGWnSw.js} +1 -1
- package/runtime/webapp/dist/assets/{x-rqFWnP_p.js → x-CbdLQm7m.js} +1 -1
- package/runtime/webapp/dist/assets/{xychartDiagram-S5SC5T6Z-CRXqCYvA.js → xychartDiagram-S5SC5T6Z-D9Rp3n6B.js} +1 -1
- package/runtime/webapp/dist/index.html +1 -1
- package/runtime/webapp/dist/assets/channel-C5zXYGqL.js +0 -1
- package/runtime/webapp/dist/assets/classDiagram-ZZMXUADV-LwOeM-av.js +0 -1
- package/runtime/webapp/dist/assets/classDiagram-v2-VYDZK3BY-LwOeM-av.js +0 -1
- package/runtime/webapp/dist/assets/stateDiagram-v2-MP3YSRHH-a8sCg_CM.js +0 -1
- package/runtime/webapp/dist/assets/swimlanesDiagram-VR7AAH4N-JsP2CwDv.js +0 -8
- /package/runtime/.next/static/{gT1sVPKvoSQGi2K39GoT_ → lQstNMvvKpEl9ExIG_tUW}/_buildManifest.js +0 -0
- /package/runtime/.next/static/{gT1sVPKvoSQGi2K39GoT_ → lQstNMvvKpEl9ExIG_tUW}/_ssgManifest.js +0 -0
package/manifest.json
CHANGED
package/package.json
CHANGED
package/runtime/.next/BUILD_ID
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
lQstNMvvKpEl9ExIG_tUW
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"/_not-found/page":"/_not-found","/api/collaboration/route":"/api/collaboration","/api/auth/verify/route":"/api/auth/verify","/api/
|
|
1
|
+
{"/_not-found/page":"/_not-found","/api/collaboration/route":"/api/collaboration","/api/auth/verify/route":"/api/auth/verify","/api/mcp/connect/route":"/api/mcp/connect","/api/flow/v1/runs/[runId]/cancel/route":"/api/flow/v1/runs/[runId]/cancel","/api/flow/v1/runs/[runId]/events/route":"/api/flow/v1/runs/[runId]/events","/api/flow/v1/runs/route":"/api/flow/v1/runs","/api/mcp/disconnect/route":"/api/mcp/disconnect","/api/memory/[key]/route":"/api/memory/[key]","/api/plugins/load/route":"/api/plugins/load","/api/memory/route":"/api/memory","/api/projects/[id]/route":"/api/projects/[id]","/api/projects/check/route":"/api/projects/check","/api/projects/roots/route":"/api/projects/roots","/api/mcp/servers/route":"/api/mcp/servers","/api/projects/route":"/api/projects","/api/projects/directories/route":"/api/projects/directories","/api/push/vapid/route":"/api/push/vapid","/api/push/unsubscribe/route":"/api/push/unsubscribe","/api/sessions/[id]/fork-at/route":"/api/sessions/[id]/fork-at","/api/push/subscribe/route":"/api/push/subscribe","/api/remote-tools/register/route":"/api/remote-tools/register","/api/skills/route":"/api/skills","/api/tools/route":"/api/tools","/api/tool-policies/[policyId]/route":"/api/tool-policies/[policyId]","/api/web-auth/login/route":"/api/web-auth/login","/api/web-auth/setup/route":"/api/web-auth/setup","/api/web-auth/revoke-all/route":"/api/web-auth/revoke-all","/api/web-console/history/route":"/api/web-console/history","/api/web-console/preferences/route":"/api/web-console/preferences","/api/web-auth/logout/route":"/api/web-auth/logout","/api/agent-workspaces/[workspaceId]/sessions/route":"/api/agent-workspaces/[workspaceId]/sessions","/api/agent/codex-sharing/route":"/api/agent/codex-sharing","/api/agent/abort/route":"/api/agent/abort","/api/agent-workspaces/route":"/api/agent-workspaces","/api/agent/model/route":"/api/agent/model","/api/agent/harness/status/route":"/api/agent/harness/status","/api/agent/runtime-health/route":"/api/agent/runtime-health","/api/agent/models/route":"/api/agent/models","/api/agent/answer/route":"/api/agent/answer","/api/agent/steer/route":"/api/agent/steer","/api/flow/v1/catalog/route":"/api/flow/v1/catalog","/api/business/route":"/api/business","/api/flow-studio/config/route":"/api/flow-studio/config","/api/agent/stream/route":"/api/agent/stream","/api/sessions/[id]/changes/route":"/api/sessions/[id]/changes","/api/agent/run/route":"/api/agent/run","/api/sessions/[id]/fork/route":"/api/sessions/[id]/fork","/api/sessions/[id]/query-index/route":"/api/sessions/[id]/query-index","/api/client-logs/route":"/api/client-logs","/api/sessions/[id]/release/route":"/api/sessions/[id]/release","/api/sessions/[id]/handoff/route":"/api/sessions/[id]/handoff","/api/sessions/[id]/native-goal/route":"/api/sessions/[id]/native-goal","/api/sessions/[id]/goals/route":"/api/sessions/[id]/goals","/api/sessions/[id]/tool-result/route":"/api/sessions/[id]/tool-result","/api/tool-policies/route":"/api/tool-policies","/api/update/status/route":"/api/update/status","/api/settings/route":"/api/settings","/api/sessions/[id]/route":"/api/sessions/[id]","/api/sessions/route":"/api/sessions","/api/sessions/[id]/thread-goal/route":"/api/sessions/[id]/thread-goal","/api/update/check/route":"/api/update/check","/api/web-console/bootstrap/route":"/api/web-console/bootstrap","/api/update/install/route":"/api/update/install","/api/web-auth/status/route":"/api/web-auth/status","/api/web-console/device-state/route":"/api/web-console/device-state","/api/web-console/computer-settings/route":"/api/web-console/computer-settings","/api/web-console/computers/route":"/api/web-console/computers","/web/page":"/web"}
|
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
"devFiles": [],
|
|
6
6
|
"ampDevFiles": [],
|
|
7
7
|
"lowPriorityFiles": [
|
|
8
|
-
"static/
|
|
9
|
-
"static/
|
|
8
|
+
"static/lQstNMvvKpEl9ExIG_tUW/_buildManifest.js",
|
|
9
|
+
"static/lQstNMvvKpEl9ExIG_tUW/_ssgManifest.js"
|
|
10
10
|
],
|
|
11
11
|
"rootMainFiles": [
|
|
12
12
|
"static/chunks/webpack-df5191d21627ba96.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":4,"routes":{"/api/mcp/servers":{"initialHeaders":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/mcp/layout,_N_T_/api/mcp/servers/layout,_N_T_/api/mcp/servers/route,_N_T_/api/mcp/servers"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/api/mcp/servers","dataRoute":null},"/api/push/vapid":{"initialHeaders":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/push/layout,_N_T_/api/push/vapid/layout,_N_T_/api/push/vapid/route,_N_T_/api/push/vapid"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/api/push/vapid","dataRoute":null},"/api/tools":{"initialHeaders":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/tools/layout,_N_T_/api/tools/route,_N_T_/api/tools"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/api/tools","dataRoute":null}},"dynamicRoutes":{},"notFoundRoutes":[],"preview":{"previewModeId":"
|
|
1
|
+
{"version":4,"routes":{"/api/mcp/servers":{"initialHeaders":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/mcp/layout,_N_T_/api/mcp/servers/layout,_N_T_/api/mcp/servers/route,_N_T_/api/mcp/servers"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/api/mcp/servers","dataRoute":null},"/api/push/vapid":{"initialHeaders":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/push/layout,_N_T_/api/push/vapid/layout,_N_T_/api/push/vapid/route,_N_T_/api/push/vapid"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/api/push/vapid","dataRoute":null},"/api/tools":{"initialHeaders":{"content-type":"application/json","x-next-cache-tags":"_N_T_/layout,_N_T_/api/layout,_N_T_/api/tools/layout,_N_T_/api/tools/route,_N_T_/api/tools"},"experimentalBypassFor":[{"type":"header","key":"Next-Action"},{"type":"header","key":"content-type","value":"multipart/form-data;.*"}],"initialRevalidateSeconds":false,"srcRoute":"/api/tools","dataRoute":null}},"dynamicRoutes":{},"notFoundRoutes":[],"preview":{"previewModeId":"bbbc00fe993bf7074a3dcd9b23e8db25","previewModeSigningKey":"80cb6d9a2825abaabcd98ef222125a8aa5b14384b630eede6eccee59171625a6","previewModeEncryptionKey":"d4a6d0af6d7ff87a8e9ca1fd2d7bba2ddd616625b876c1d096017116a74fe5a4"}}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="zh-CN" style="background:#070a0b;color-scheme:dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-df5191d21627ba96.js"/><script src="/_next/static/chunks/3cc391f0-d7ec74603652803d.js" async=""></script><script src="/_next/static/chunks/183-d2f78a21998813ba.js" async=""></script><script src="/_next/static/chunks/main-app-f508b4b3ab30eea6.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="theme-color" content="#070a0b"/><meta name="color-scheme" content="dark"/><title>AgentRoam</title><meta name="description" content="General-purpose AI agent API server"/><link rel="manifest" href="/manifest.webmanifest" crossorigin="use-credentials"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="AgentRoam"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><link rel="icon" href="/pwa/icon-192.png"/><link rel="apple-touch-icon" href="/pwa/icon-192.png"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body style="margin:0;min-height:100dvh;background:#070a0b"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/pwa/install.js" defer=""></script><script src="/_next/static/chunks/webpack-df5191d21627ba96.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:I[7709,[],\"\"]\n3:I[1338,[],\"\"]\n4:I[1573,[],\"\"]\na:I[6554,[],\"\"]\n5:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n6:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n7:{\"display\":\"inline-block\"}\n8:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nb:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L1\",null,{\"buildId\":\"
|
|
1
|
+
<!DOCTYPE html><html lang="zh-CN" style="background:#070a0b;color-scheme:dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-df5191d21627ba96.js"/><script src="/_next/static/chunks/3cc391f0-d7ec74603652803d.js" async=""></script><script src="/_next/static/chunks/183-d2f78a21998813ba.js" async=""></script><script src="/_next/static/chunks/main-app-f508b4b3ab30eea6.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="theme-color" content="#070a0b"/><meta name="color-scheme" content="dark"/><title>AgentRoam</title><meta name="description" content="General-purpose AI agent API server"/><link rel="manifest" href="/manifest.webmanifest" crossorigin="use-credentials"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="AgentRoam"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><link rel="icon" href="/pwa/icon-192.png"/><link rel="apple-touch-icon" href="/pwa/icon-192.png"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body style="margin:0;min-height:100dvh;background:#070a0b"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/pwa/install.js" defer=""></script><script src="/_next/static/chunks/webpack-df5191d21627ba96.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:I[7709,[],\"\"]\n3:I[1338,[],\"\"]\n4:I[1573,[],\"\"]\na:I[6554,[],\"\"]\n5:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n6:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n7:{\"display\":\"inline-block\"}\n8:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nb:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L1\",null,{\"buildId\":\"lQstNMvvKpEl9ExIG_tUW\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L2\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[null,[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"style\":{\"background\":\"#070a0b\",\"colorScheme\":\"dark\"},\"children\":[\"$\",\"body\",null,{\"style\":{\"margin\":0,\"minHeight\":\"100dvh\",\"background\":\"#070a0b\"},\"children\":[[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$5\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$6\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$7\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$8\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}],[\"$\",\"script\",null,{\"src\":\"/pwa/install.js\",\"defer\":true}]]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$L9\"],\"globalErrorComponent\":\"$a\",\"missingSlots\":\"$Wb\"}]\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"name\":\"theme-color\",\"content\":\"#070a0b\"}],[\"$\",\"meta\",\"2\",{\"name\":\"color-scheme\",\"content\":\"dark\"}],[\"$\",\"meta\",\"3\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"4\",{\"children\":\"AgentRoam\"}],[\"$\",\"meta\",\"5\",{\"name\":\"description\",\"content\":\"General-purpose AI agent API server\"}],[\"$\",\"link\",\"6\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"use-credentials\"}],[\"$\",\"meta\",\"7\",{\"name\":\"apple-mobile-web-app-capable\",\"content\":\"yes\"}],[\"$\",\"meta\",\"8\",{\"name\":\"apple-mobile-web-app-title\",\"content\":\"AgentRoam\"}],[\"$\",\"meta\",\"9\",{\"name\":\"apple-mobile-web-app-status-bar-style\",\"content\":\"black-translucent\"}],[\"$\",\"link\",\"10\",{\"rel\":\"icon\",\"href\":\"/pwa/icon-192.png\"}],[\"$\",\"link\",\"11\",{\"rel\":\"apple-touch-icon\",\"href\":\"/pwa/icon-192.png\"}]]\n2:null\n"])</script></body></html>
|
|
@@ -4,6 +4,6 @@
|
|
|
4
4
|
5:{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"}
|
|
5
5
|
6:{"display":"inline-block"}
|
|
6
6
|
7:{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0}
|
|
7
|
-
0:["
|
|
7
|
+
0:["lQstNMvvKpEl9ExIG_tUW",[[["",{"children":["/_not-found",{"children":["__PAGE__",{}]}]},"$undefined","$undefined",true],["",{"children":["/_not-found",{"children":["__PAGE__",{},[["$L1",[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":{"fontFamily":"system-ui,\"Segoe UI\",Roboto,Helvetica,Arial,sans-serif,\"Apple Color Emoji\",\"Segoe UI Emoji\"","height":"100vh","textAlign":"center","display":"flex","flexDirection":"column","alignItems":"center","justifyContent":"center"},"children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":{"display":"inline-block","margin":"0 20px 0 0","padding":"0 23px 0 0","fontSize":24,"fontWeight":500,"verticalAlign":"top","lineHeight":"49px"},"children":"404"}],["$","div",null,{"style":{"display":"inline-block"},"children":["$","h2",null,{"style":{"fontSize":14,"fontWeight":400,"lineHeight":"49px","margin":0},"children":"This page could not be found."}]}]]}]}]],null],null],null]},[null,["$","$L2",null,{"parallelRouterKey":"children","segmentPath":["children","/_not-found","children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":"$undefined","notFoundStyles":"$undefined"}]],null]},[[null,["$","html",null,{"lang":"zh-CN","style":{"background":"#070a0b","colorScheme":"dark"},"children":["$","body",null,{"style":{"margin":0,"minHeight":"100dvh","background":"#070a0b"},"children":[["$","$L2",null,{"parallelRouterKey":"children","segmentPath":["children"],"error":"$undefined","errorStyles":"$undefined","errorScripts":"$undefined","template":["$","$L3",null,{}],"templateStyles":"$undefined","templateScripts":"$undefined","notFound":[["$","title",null,{"children":"404: This page could not be found."}],["$","div",null,{"style":"$4","children":["$","div",null,{"children":[["$","style",null,{"dangerouslySetInnerHTML":{"__html":"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}"}}],["$","h1",null,{"className":"next-error-h1","style":"$5","children":"404"}],["$","div",null,{"style":"$6","children":["$","h2",null,{"style":"$7","children":"This page could not be found."}]}]]}]}]],"notFoundStyles":[]}],["$","script",null,{"src":"/pwa/install.js","defer":true}]]}]}]],null],null],["$L8",["$","meta",null,{"name":"robots","content":"noindex"}]]]]]
|
|
8
8
|
8:[["$","meta","0",{"name":"viewport","content":"width=device-width, initial-scale=1"}],["$","meta","1",{"name":"theme-color","content":"#070a0b"}],["$","meta","2",{"name":"color-scheme","content":"dark"}],["$","meta","3",{"charSet":"utf-8"}],["$","title","4",{"children":"AgentRoam"}],["$","meta","5",{"name":"description","content":"General-purpose AI agent API server"}],["$","link","6",{"rel":"manifest","href":"/manifest.webmanifest","crossOrigin":"use-credentials"}],["$","meta","7",{"name":"apple-mobile-web-app-capable","content":"yes"}],["$","meta","8",{"name":"apple-mobile-web-app-title","content":"AgentRoam"}],["$","meta","9",{"name":"apple-mobile-web-app-status-bar-style","content":"black-translucent"}],["$","link","10",{"rel":"icon","href":"/pwa/icon-192.png"}],["$","link","11",{"rel":"apple-touch-icon","href":"/pwa/icon-192.png"}]]
|
|
9
9
|
1:null
|
|
@@ -2,68 +2,68 @@
|
|
|
2
2
|
"/_not-found/page": "app/_not-found/page.js",
|
|
3
3
|
"/api/collaboration/route": "app/api/collaboration/route.js",
|
|
4
4
|
"/api/auth/verify/route": "app/api/auth/verify/route.js",
|
|
5
|
-
"/api/flow/v1/runs/[runId]/cancel/route": "app/api/flow/v1/runs/[runId]/cancel/route.js",
|
|
6
5
|
"/api/mcp/connect/route": "app/api/mcp/connect/route.js",
|
|
7
|
-
"/api/
|
|
8
|
-
"/api/memory/route": "app/api/memory/route.js",
|
|
6
|
+
"/api/flow/v1/runs/[runId]/cancel/route": "app/api/flow/v1/runs/[runId]/cancel/route.js",
|
|
9
7
|
"/api/flow/v1/runs/[runId]/events/route": "app/api/flow/v1/runs/[runId]/events/route.js",
|
|
10
8
|
"/api/flow/v1/runs/route": "app/api/flow/v1/runs/route.js",
|
|
11
|
-
"/api/mcp/
|
|
9
|
+
"/api/mcp/disconnect/route": "app/api/mcp/disconnect/route.js",
|
|
12
10
|
"/api/memory/[key]/route": "app/api/memory/[key]/route.js",
|
|
13
11
|
"/api/plugins/load/route": "app/api/plugins/load/route.js",
|
|
12
|
+
"/api/memory/route": "app/api/memory/route.js",
|
|
14
13
|
"/api/projects/[id]/route": "app/api/projects/[id]/route.js",
|
|
15
|
-
"/api/projects/directories/route": "app/api/projects/directories/route.js",
|
|
16
|
-
"/api/projects/roots/route": "app/api/projects/roots/route.js",
|
|
17
14
|
"/api/projects/check/route": "app/api/projects/check/route.js",
|
|
18
|
-
"/api/
|
|
15
|
+
"/api/projects/roots/route": "app/api/projects/roots/route.js",
|
|
16
|
+
"/api/mcp/servers/route": "app/api/mcp/servers/route.js",
|
|
19
17
|
"/api/projects/route": "app/api/projects/route.js",
|
|
20
|
-
"/api/
|
|
18
|
+
"/api/projects/directories/route": "app/api/projects/directories/route.js",
|
|
21
19
|
"/api/push/vapid/route": "app/api/push/vapid/route.js",
|
|
20
|
+
"/api/push/unsubscribe/route": "app/api/push/unsubscribe/route.js",
|
|
22
21
|
"/api/sessions/[id]/fork-at/route": "app/api/sessions/[id]/fork-at/route.js",
|
|
22
|
+
"/api/push/subscribe/route": "app/api/push/subscribe/route.js",
|
|
23
23
|
"/api/remote-tools/register/route": "app/api/remote-tools/register/route.js",
|
|
24
24
|
"/api/skills/route": "app/api/skills/route.js",
|
|
25
25
|
"/api/tools/route": "app/api/tools/route.js",
|
|
26
|
-
"/api/web-auth/revoke-all/route": "app/api/web-auth/revoke-all/route.js",
|
|
27
|
-
"/api/web-auth/logout/route": "app/api/web-auth/logout/route.js",
|
|
28
|
-
"/api/web-console/history/route": "app/api/web-console/history/route.js",
|
|
29
26
|
"/api/tool-policies/[policyId]/route": "app/api/tool-policies/[policyId]/route.js",
|
|
30
|
-
"/api/web-auth/setup/route": "app/api/web-auth/setup/route.js",
|
|
31
27
|
"/api/web-auth/login/route": "app/api/web-auth/login/route.js",
|
|
28
|
+
"/api/web-auth/setup/route": "app/api/web-auth/setup/route.js",
|
|
29
|
+
"/api/web-auth/revoke-all/route": "app/api/web-auth/revoke-all/route.js",
|
|
30
|
+
"/api/web-console/history/route": "app/api/web-console/history/route.js",
|
|
32
31
|
"/api/web-console/preferences/route": "app/api/web-console/preferences/route.js",
|
|
32
|
+
"/api/web-auth/logout/route": "app/api/web-auth/logout/route.js",
|
|
33
|
+
"/api/agent-workspaces/[workspaceId]/sessions/route": "app/api/agent-workspaces/[workspaceId]/sessions/route.js",
|
|
33
34
|
"/api/agent/codex-sharing/route": "app/api/agent/codex-sharing/route.js",
|
|
35
|
+
"/api/agent/abort/route": "app/api/agent/abort/route.js",
|
|
34
36
|
"/api/agent-workspaces/route": "app/api/agent-workspaces/route.js",
|
|
35
|
-
"/api/agent/answer/route": "app/api/agent/answer/route.js",
|
|
36
|
-
"/api/agent-workspaces/[workspaceId]/sessions/route": "app/api/agent-workspaces/[workspaceId]/sessions/route.js",
|
|
37
|
-
"/api/agent/harness/status/route": "app/api/agent/harness/status/route.js",
|
|
38
37
|
"/api/agent/model/route": "app/api/agent/model/route.js",
|
|
38
|
+
"/api/agent/harness/status/route": "app/api/agent/harness/status/route.js",
|
|
39
39
|
"/api/agent/runtime-health/route": "app/api/agent/runtime-health/route.js",
|
|
40
|
-
"/api/agent/abort/route": "app/api/agent/abort/route.js",
|
|
41
40
|
"/api/agent/models/route": "app/api/agent/models/route.js",
|
|
41
|
+
"/api/agent/answer/route": "app/api/agent/answer/route.js",
|
|
42
42
|
"/api/agent/steer/route": "app/api/agent/steer/route.js",
|
|
43
|
+
"/api/flow/v1/catalog/route": "app/api/flow/v1/catalog/route.js",
|
|
43
44
|
"/api/business/route": "app/api/business/route.js",
|
|
44
45
|
"/api/flow-studio/config/route": "app/api/flow-studio/config/route.js",
|
|
45
|
-
"/api/flow/v1/catalog/route": "app/api/flow/v1/catalog/route.js",
|
|
46
46
|
"/api/agent/stream/route": "app/api/agent/stream/route.js",
|
|
47
47
|
"/api/sessions/[id]/changes/route": "app/api/sessions/[id]/changes/route.js",
|
|
48
|
-
"/api/sessions/[id]/fork/route": "app/api/sessions/[id]/fork/route.js",
|
|
49
|
-
"/api/sessions/[id]/handoff/route": "app/api/sessions/[id]/handoff/route.js",
|
|
50
48
|
"/api/agent/run/route": "app/api/agent/run/route.js",
|
|
51
|
-
"/api/sessions/[id]/
|
|
52
|
-
"/api/sessions/[id]/release/route": "app/api/sessions/[id]/release/route.js",
|
|
49
|
+
"/api/sessions/[id]/fork/route": "app/api/sessions/[id]/fork/route.js",
|
|
53
50
|
"/api/sessions/[id]/query-index/route": "app/api/sessions/[id]/query-index/route.js",
|
|
54
|
-
"/api/sessions/[id]/thread-goal/route": "app/api/sessions/[id]/thread-goal/route.js",
|
|
55
51
|
"/api/client-logs/route": "app/api/client-logs/route.js",
|
|
56
|
-
"/api/sessions/route": "app/api/sessions/route.js",
|
|
52
|
+
"/api/sessions/[id]/release/route": "app/api/sessions/[id]/release/route.js",
|
|
53
|
+
"/api/sessions/[id]/handoff/route": "app/api/sessions/[id]/handoff/route.js",
|
|
54
|
+
"/api/sessions/[id]/native-goal/route": "app/api/sessions/[id]/native-goal/route.js",
|
|
55
|
+
"/api/sessions/[id]/goals/route": "app/api/sessions/[id]/goals/route.js",
|
|
57
56
|
"/api/sessions/[id]/tool-result/route": "app/api/sessions/[id]/tool-result/route.js",
|
|
58
|
-
"/api/settings/route": "app/api/settings/route.js",
|
|
59
57
|
"/api/tool-policies/route": "app/api/tool-policies/route.js",
|
|
60
|
-
"/api/update/
|
|
58
|
+
"/api/update/status/route": "app/api/update/status/route.js",
|
|
59
|
+
"/api/settings/route": "app/api/settings/route.js",
|
|
61
60
|
"/api/sessions/[id]/route": "app/api/sessions/[id]/route.js",
|
|
61
|
+
"/api/sessions/route": "app/api/sessions/route.js",
|
|
62
|
+
"/api/sessions/[id]/thread-goal/route": "app/api/sessions/[id]/thread-goal/route.js",
|
|
62
63
|
"/api/update/check/route": "app/api/update/check/route.js",
|
|
63
|
-
"/api/update/status/route": "app/api/update/status/route.js",
|
|
64
64
|
"/api/web-console/bootstrap/route": "app/api/web-console/bootstrap/route.js",
|
|
65
|
+
"/api/update/install/route": "app/api/update/install/route.js",
|
|
65
66
|
"/api/web-auth/status/route": "app/api/web-auth/status/route.js",
|
|
66
|
-
"/api/sessions/[id]/goals/route": "app/api/sessions/[id]/goals/route.js",
|
|
67
67
|
"/api/web-console/device-state/route": "app/api/web-console/device-state/route.js",
|
|
68
68
|
"/api/web-console/computer-settings/route": "app/api/web-console/computer-settings/route.js",
|
|
69
69
|
"/api/web-console/computers/route": "app/api/web-console/computers/route.js",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html lang="zh-CN" style="background:#070a0b;color-scheme:dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-df5191d21627ba96.js"/><script src="/_next/static/chunks/3cc391f0-d7ec74603652803d.js" async=""></script><script src="/_next/static/chunks/183-d2f78a21998813ba.js" async=""></script><script src="/_next/static/chunks/main-app-f508b4b3ab30eea6.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="theme-color" content="#070a0b"/><meta name="color-scheme" content="dark"/><title>AgentRoam</title><meta name="description" content="General-purpose AI agent API server"/><link rel="manifest" href="/manifest.webmanifest" crossorigin="use-credentials"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="AgentRoam"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><link rel="icon" href="/pwa/icon-192.png"/><link rel="apple-touch-icon" href="/pwa/icon-192.png"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body style="margin:0;min-height:100dvh;background:#070a0b"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/pwa/install.js" defer=""></script><script src="/_next/static/chunks/webpack-df5191d21627ba96.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:I[7709,[],\"\"]\n3:I[1338,[],\"\"]\n4:I[1573,[],\"\"]\na:I[6554,[],\"\"]\n5:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n6:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n7:{\"display\":\"inline-block\"}\n8:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nb:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L1\",null,{\"buildId\":\"
|
|
1
|
+
<!DOCTYPE html><html lang="zh-CN" style="background:#070a0b;color-scheme:dark"><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="preload" as="script" fetchPriority="low" href="/_next/static/chunks/webpack-df5191d21627ba96.js"/><script src="/_next/static/chunks/3cc391f0-d7ec74603652803d.js" async=""></script><script src="/_next/static/chunks/183-d2f78a21998813ba.js" async=""></script><script src="/_next/static/chunks/main-app-f508b4b3ab30eea6.js" async=""></script><meta name="robots" content="noindex"/><title>404: This page could not be found.</title><meta name="theme-color" content="#070a0b"/><meta name="color-scheme" content="dark"/><title>AgentRoam</title><meta name="description" content="General-purpose AI agent API server"/><link rel="manifest" href="/manifest.webmanifest" crossorigin="use-credentials"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-title" content="AgentRoam"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><link rel="icon" href="/pwa/icon-192.png"/><link rel="apple-touch-icon" href="/pwa/icon-192.png"/><script src="/_next/static/chunks/polyfills-42372ed130431b0a.js" noModule=""></script></head><body style="margin:0;min-height:100dvh;background:#070a0b"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding:0 23px 0 0;font-size:24px;font-weight:500;vertical-align:top;line-height:49px">404</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:49px;margin:0">This page could not be found.</h2></div></div></div><script src="/pwa/install.js" defer=""></script><script src="/_next/static/chunks/webpack-df5191d21627ba96.js" async=""></script><script>(self.__next_f=self.__next_f||[]).push([0]);self.__next_f.push([2,null])</script><script>self.__next_f.push([1,"1:I[7709,[],\"\"]\n3:I[1338,[],\"\"]\n4:I[1573,[],\"\"]\na:I[6554,[],\"\"]\n5:{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"}\n6:{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"}\n7:{\"display\":\"inline-block\"}\n8:{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0}\nb:[]\n"])</script><script>self.__next_f.push([1,"0:[\"$\",\"$L1\",null,{\"buildId\":\"lQstNMvvKpEl9ExIG_tUW\",\"assetPrefix\":\"\",\"urlParts\":[\"\",\"_not-found\"],\"initialTree\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{}]}]},\"$undefined\",\"$undefined\",true],\"initialSeedData\":[\"\",{\"children\":[\"/_not-found\",{\"children\":[\"__PAGE__\",{},[[\"$L2\",[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":{\"fontFamily\":\"system-ui,\\\"Segoe UI\\\",Roboto,Helvetica,Arial,sans-serif,\\\"Apple Color Emoji\\\",\\\"Segoe UI Emoji\\\"\",\"height\":\"100vh\",\"textAlign\":\"center\",\"display\":\"flex\",\"flexDirection\":\"column\",\"alignItems\":\"center\",\"justifyContent\":\"center\"},\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":{\"display\":\"inline-block\",\"margin\":\"0 20px 0 0\",\"padding\":\"0 23px 0 0\",\"fontSize\":24,\"fontWeight\":500,\"verticalAlign\":\"top\",\"lineHeight\":\"49px\"},\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":{\"display\":\"inline-block\"},\"children\":[\"$\",\"h2\",null,{\"style\":{\"fontSize\":14,\"fontWeight\":400,\"lineHeight\":\"49px\",\"margin\":0},\"children\":\"This page could not be found.\"}]}]]}]}]],null],null],null]},[null,[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\",\"/_not-found\",\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":\"$undefined\",\"notFoundStyles\":\"$undefined\"}]],null]},[[null,[\"$\",\"html\",null,{\"lang\":\"zh-CN\",\"style\":{\"background\":\"#070a0b\",\"colorScheme\":\"dark\"},\"children\":[\"$\",\"body\",null,{\"style\":{\"margin\":0,\"minHeight\":\"100dvh\",\"background\":\"#070a0b\"},\"children\":[[\"$\",\"$L3\",null,{\"parallelRouterKey\":\"children\",\"segmentPath\":[\"children\"],\"error\":\"$undefined\",\"errorStyles\":\"$undefined\",\"errorScripts\":\"$undefined\",\"template\":[\"$\",\"$L4\",null,{}],\"templateStyles\":\"$undefined\",\"templateScripts\":\"$undefined\",\"notFound\":[[\"$\",\"title\",null,{\"children\":\"404: This page could not be found.\"}],[\"$\",\"div\",null,{\"style\":\"$5\",\"children\":[\"$\",\"div\",null,{\"children\":[[\"$\",\"style\",null,{\"dangerouslySetInnerHTML\":{\"__html\":\"body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}\"}}],[\"$\",\"h1\",null,{\"className\":\"next-error-h1\",\"style\":\"$6\",\"children\":\"404\"}],[\"$\",\"div\",null,{\"style\":\"$7\",\"children\":[\"$\",\"h2\",null,{\"style\":\"$8\",\"children\":\"This page could not be found.\"}]}]]}]}]],\"notFoundStyles\":[]}],[\"$\",\"script\",null,{\"src\":\"/pwa/install.js\",\"defer\":true}]]}]}]],null],null],\"couldBeIntercepted\":false,\"initialHead\":[[\"$\",\"meta\",null,{\"name\":\"robots\",\"content\":\"noindex\"}],\"$L9\"],\"globalErrorComponent\":\"$a\",\"missingSlots\":\"$Wb\"}]\n"])</script><script>self.__next_f.push([1,"9:[[\"$\",\"meta\",\"0\",{\"name\":\"viewport\",\"content\":\"width=device-width, initial-scale=1\"}],[\"$\",\"meta\",\"1\",{\"name\":\"theme-color\",\"content\":\"#070a0b\"}],[\"$\",\"meta\",\"2\",{\"name\":\"color-scheme\",\"content\":\"dark\"}],[\"$\",\"meta\",\"3\",{\"charSet\":\"utf-8\"}],[\"$\",\"title\",\"4\",{\"children\":\"AgentRoam\"}],[\"$\",\"meta\",\"5\",{\"name\":\"description\",\"content\":\"General-purpose AI agent API server\"}],[\"$\",\"link\",\"6\",{\"rel\":\"manifest\",\"href\":\"/manifest.webmanifest\",\"crossOrigin\":\"use-credentials\"}],[\"$\",\"meta\",\"7\",{\"name\":\"apple-mobile-web-app-capable\",\"content\":\"yes\"}],[\"$\",\"meta\",\"8\",{\"name\":\"apple-mobile-web-app-title\",\"content\":\"AgentRoam\"}],[\"$\",\"meta\",\"9\",{\"name\":\"apple-mobile-web-app-status-bar-style\",\"content\":\"black-translucent\"}],[\"$\",\"link\",\"10\",{\"rel\":\"icon\",\"href\":\"/pwa/icon-192.png\"}],[\"$\",\"link\",\"11\",{\"rel\":\"apple-touch-icon\",\"href\":\"/pwa/icon-192.png\"}]]\n2:null\n"])</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>500: Internal Server Error</title><meta name="next-head-count" content="3"/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-df5191d21627ba96.js" defer=""></script><script src="/_next/static/chunks/framework-7bac12ed8564755e.js" defer=""></script><script src="/_next/static/chunks/main-0de4062ff39c4193.js" defer=""></script><script src="/_next/static/chunks/pages/_app-389e6eb8abb0af2d.js" defer=""></script><script src="/_next/static/chunks/pages/_error-7cee5565b5ef9bcb.js" defer=""></script><script src="/_next/static/
|
|
1
|
+
<!DOCTYPE html><html><head><meta charSet="utf-8"/><meta name="viewport" content="width=device-width"/><title>500: Internal Server Error</title><meta name="next-head-count" content="3"/><noscript data-n-css=""></noscript><script defer="" nomodule="" src="/_next/static/chunks/polyfills-42372ed130431b0a.js"></script><script src="/_next/static/chunks/webpack-df5191d21627ba96.js" defer=""></script><script src="/_next/static/chunks/framework-7bac12ed8564755e.js" defer=""></script><script src="/_next/static/chunks/main-0de4062ff39c4193.js" defer=""></script><script src="/_next/static/chunks/pages/_app-389e6eb8abb0af2d.js" defer=""></script><script src="/_next/static/chunks/pages/_error-7cee5565b5ef9bcb.js" defer=""></script><script src="/_next/static/lQstNMvvKpEl9ExIG_tUW/_buildManifest.js" defer=""></script><script src="/_next/static/lQstNMvvKpEl9ExIG_tUW/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,"Segoe UI",Roboto,Helvetica,Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji";height:100vh;text-align:center;display:flex;flex-direction:column;align-items:center;justify-content:center"><div style="line-height:48px"><style>body{color:#000;background:#fff;margin:0}.next-error-h1{border-right:1px solid rgba(0,0,0,.3)}@media (prefers-color-scheme:dark){body{color:#fff;background:#000}.next-error-h1{border-right:1px solid rgba(255,255,255,.3)}}</style><h1 class="next-error-h1" style="display:inline-block;margin:0 20px 0 0;padding-right:23px;font-size:24px;font-weight:500;vertical-align:top">500</h1><div style="display:inline-block"><h2 style="font-size:14px;font-weight:400;line-height:28px">Internal Server Error<!-- -->.</h2></div></div></div></div><script id="__NEXT_DATA__" type="application/json">{"props":{"pageProps":{"statusCode":500}},"page":"/_error","query":{},"buildId":"lQstNMvvKpEl9ExIG_tUW","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"node":{},"edge":{},"encryptionKey":"
|
|
1
|
+
{"node":{},"edge":{},"encryptionKey":"yCW5VLFQ7Q4Z8zbIeu5GjWLgFF4gcmvo1/Xakyy6o+A="}
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { homedir } from 'node:os';
|
|
3
1
|
import { createServer } from 'node:net';
|
|
4
2
|
import { mkdtemp, chmod, rm, access } from 'node:fs/promises';
|
|
5
3
|
import { join } from 'node:path';
|
|
6
|
-
import {
|
|
4
|
+
import { MacRemoteHelperApp, bundledRemoteAppPath } from './macos-helper-app.mjs';
|
|
7
5
|
import { execFile } from 'node:child_process';
|
|
8
6
|
import { promisify } from 'node:util';
|
|
9
7
|
const run = promisify(execFile);
|
|
@@ -61,23 +59,17 @@ export function decodeVideoFrames(input) {
|
|
|
61
59
|
return { frames, remaining: Buffer.from(input.subarray(offset)) };
|
|
62
60
|
}
|
|
63
61
|
|
|
64
|
-
function defaultAppPath() {
|
|
65
|
-
const installed = join(homedir(), 'Library/Application Support/AgentRoamRemoteDesktop/Services.noindex/AgentRoam Remote Desktop.app');
|
|
66
|
-
const bundled = fileURLToPath(new URL('../../native/AgentRoam Remote Desktop.app', import.meta.url));
|
|
67
|
-
const executable = 'Contents/MacOS/agentroam-remote-desktop';
|
|
68
|
-
try {
|
|
69
|
-
if (readFileSync(join(installed, executable)).equals(readFileSync(join(bundled, executable)))) return installed;
|
|
70
|
-
} catch { /* Use this runtime's bundled version when not installed or outdated. */ }
|
|
71
|
-
return bundled;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
62
|
export class RemoteHelper {
|
|
75
|
-
constructor({ appPath
|
|
76
|
-
this.
|
|
63
|
+
constructor({ appPath, launch, application = appPath || launch ? null : new MacRemoteHelperApp(), stopTimeoutMs = 1000 } = {}) {
|
|
64
|
+
this.application = application;
|
|
65
|
+
this.appPath = appPath ?? application?.appPath ?? bundledRemoteAppPath();
|
|
66
|
+
this.launch = launch ?? ((socket, videoSocket) => run('/usr/bin/open', ['-n', this.appPath, '--args', socket, videoSocket, String(process.pid)]));
|
|
67
|
+
this.stopTimeoutMs = stopTimeoutMs; this.pending = new Map(); this.videoListeners = new Set(); this.audioListeners = new Set(); this.sequence = 0; this.generation = 0;
|
|
77
68
|
}
|
|
78
69
|
onVideo(listener) { this.videoListeners.add(listener); return () => this.videoListeners.delete(listener); }
|
|
79
70
|
onAudio(listener) { this.audioListeners.add(listener); return () => this.audioListeners.delete(listener); }
|
|
80
|
-
async available() { try { await access(join(this.appPath, 'Contents/MacOS/agentroam-remote-desktop')); return true; } catch { return false; } }
|
|
71
|
+
async available() { if (this.application) return this.application.available(); try { await access(join(this.appPath, 'Contents/MacOS/agentroam-remote-desktop')); return true; } catch { return false; } }
|
|
72
|
+
async describe() { return this.application ? this.application.describe() : { name: 'AgentRoam Remote Desktop', path: this.appPath, version: 'unknown' }; }
|
|
81
73
|
start() {
|
|
82
74
|
if (this.socket && !this.socket.destroyed && this.videoSocket && !this.videoSocket.destroyed) return Promise.resolve();
|
|
83
75
|
if (!this.starting) this.starting = this.open().finally(() => { this.starting = null; });
|
|
@@ -87,6 +79,11 @@ export class RemoteHelper {
|
|
|
87
79
|
await this.stop();
|
|
88
80
|
const generation = this.generation;
|
|
89
81
|
if (!await this.available()) throw new Error('当前 CLI 未包含远程授权组件,请升级 CLI');
|
|
82
|
+
if (this.application) return this.application.withPreparedApp(() => this.openPrepared(generation));
|
|
83
|
+
return this.openPrepared(generation);
|
|
84
|
+
}
|
|
85
|
+
async openPrepared(generation) {
|
|
86
|
+
if (generation !== this.generation) throw new Error('远程授权组件启动已取消');
|
|
90
87
|
this.directory = await mkdtemp('/tmp/agentroam-remote-');
|
|
91
88
|
await chmod(this.directory, 0o700);
|
|
92
89
|
if (generation !== this.generation) { await this.stop(); throw new Error('远程授权组件启动已取消'); }
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { execFile, spawn } from 'node:child_process';
|
|
2
|
+
import { createHash } from 'node:crypto';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { access, cp, lstat, mkdir, mkdtemp, open, readFile, readdir, rename, rm } from 'node:fs/promises';
|
|
5
|
+
import { homedir } from 'node:os';
|
|
6
|
+
import { dirname, join, resolve } from 'node:path';
|
|
7
|
+
import { fileURLToPath } from 'node:url';
|
|
8
|
+
import { promisify } from 'node:util';
|
|
9
|
+
|
|
10
|
+
const run = promisify(execFile);
|
|
11
|
+
const bundleId = 'com.agentroam.remote-desktop';
|
|
12
|
+
const executable = 'Contents/MacOS/agentroam-remote-desktop';
|
|
13
|
+
const metadata = 'Contents/Resources/agentroam-component.json';
|
|
14
|
+
const versionPattern = /^(\d+)\.(\d+)\.(\d+)(?:-preview\.(\d+))?$/;
|
|
15
|
+
|
|
16
|
+
export function bundledRemoteAppPath() {
|
|
17
|
+
const native = fileURLToPath(new URL('../../native/', import.meta.url));
|
|
18
|
+
const payload = join(native, 'Support.noindex/AgentRoam Remote Desktop.app');
|
|
19
|
+
return existsSync(payload) ? payload : join(native, 'AgentRoam Remote Desktop.app');
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function compareVersions(left, right) {
|
|
23
|
+
const parts = (version) => {
|
|
24
|
+
const match = versionPattern.exec(version);
|
|
25
|
+
return match ? [Number(match[1]), Number(match[2]), Number(match[3]), match[4] === undefined ? Infinity : Number(match[4])] : [-1];
|
|
26
|
+
};
|
|
27
|
+
const a = parts(left), b = parts(right);
|
|
28
|
+
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
29
|
+
if ((a[i] ?? 0) !== (b[i] ?? 0)) return (a[i] ?? 0) > (b[i] ?? 0) ? 1 : -1;
|
|
30
|
+
}
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
async function readBundle(path) {
|
|
35
|
+
try { await access(join(path, executable)); } catch (error) { if (error.code === 'ENOENT') return null; throw error; }
|
|
36
|
+
const plist = await readFile(join(path, 'Contents/Info.plist'), 'utf8');
|
|
37
|
+
if (!/<key>CFBundleIdentifier<\/key>\s*<string>com\.agentroam\.remote-desktop<\/string>/.test(plist)) {
|
|
38
|
+
throw new Error('远控组件应用标识不匹配,未覆盖现有应用');
|
|
39
|
+
}
|
|
40
|
+
let version = 'legacy';
|
|
41
|
+
try {
|
|
42
|
+
const value = JSON.parse(await readFile(join(path, metadata), 'utf8'));
|
|
43
|
+
if (value.bundleId !== bundleId || !versionPattern.test(value.version)) throw new Error('远控组件版本信息无效');
|
|
44
|
+
version = value.version;
|
|
45
|
+
} catch (error) { if (error.code !== 'ENOENT') throw error; }
|
|
46
|
+
const hash = createHash('sha256');
|
|
47
|
+
async function visit(directory, relative = '') {
|
|
48
|
+
for (const entry of (await readdir(directory, { withFileTypes: true })).sort((a, b) => a.name.localeCompare(b.name))) {
|
|
49
|
+
const name = join(relative, entry.name), target = join(directory, entry.name);
|
|
50
|
+
if (entry.isDirectory()) await visit(target, name);
|
|
51
|
+
else if (entry.isFile()) { hash.update(name); hash.update('\0'); hash.update(await readFile(target)); hash.update('\0'); }
|
|
52
|
+
else throw new Error('远控组件包含非普通文件,未安装');
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
await visit(path);
|
|
56
|
+
return { version, hash: hash.digest('hex') };
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async function processPathsInUse() {
|
|
60
|
+
const { stdout } = await run('/usr/sbin/lsof', ['-nP', '-a', '-u', String(process.getuid()), '-d', 'txt', '-Fn'], { timeout: 5000, maxBuffer: 16 * 1024 * 1024 });
|
|
61
|
+
const paths = stdout.split('\n').filter(line => line.startsWith('n/')).map(line => line.slice(1));
|
|
62
|
+
if (!paths.length) throw new Error('无法确认旧远控组件是否仍在使用,请稍后重试');
|
|
63
|
+
return paths;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function verifyBundle(path) {
|
|
67
|
+
await run('/usr/bin/codesign', ['--verify', '--deep', '--strict', path], { timeout: 10000, maxBuffer: 4096 });
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
async function registerApp(path, oldPath) {
|
|
71
|
+
const register = '/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister';
|
|
72
|
+
// Unregister the old launch target, retaining the package payload for repair.
|
|
73
|
+
if (oldPath !== path) await run(register, ['-u', oldPath], { timeout: 5000, maxBuffer: 4096 }).catch(() => {});
|
|
74
|
+
await run(register, ['-f', path], { timeout: 5000, maxBuffer: 4096 });
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export async function acquireMacInstallLock(path, timeoutMs) {
|
|
78
|
+
const handle = await open(path, 'a', 0o600);
|
|
79
|
+
try {
|
|
80
|
+
// BSD flock belongs to the shared open-file description. lockf acquires
|
|
81
|
+
// it on inherited fd 3; our handle retains it until close or process exit.
|
|
82
|
+
// Keep the file so concurrent installers always lock the same inode.
|
|
83
|
+
await new Promise((resolve, reject) => {
|
|
84
|
+
const child = spawn('/usr/bin/lockf', ['-s', '-t', String(Math.ceil(timeoutMs / 1000)), '3'], { stdio: ['ignore', 'ignore', 'ignore', handle.fd] });
|
|
85
|
+
child.once('error', reject);
|
|
86
|
+
child.once('exit', code => code === 0 ? resolve() : reject(new Error(code === 75 ? '另一实例正在更新远控组件,请稍后重试' : '无法锁定远控组件安装位置')));
|
|
87
|
+
});
|
|
88
|
+
return () => handle.close();
|
|
89
|
+
} catch (error) { await handle.close(); throw error; }
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/** One installed app per user; npm version directories only carry its payload. */
|
|
93
|
+
export class MacRemoteHelperApp {
|
|
94
|
+
constructor({ sourcePath = bundledRemoteAppPath(), appPath = join(homedir(), 'Library/Application Support/AgentRoamRemoteDesktop/Services.noindex/AgentRoam Remote Desktop.app'), pathsInUse = processPathsInUse, verify = verifyBundle, register = registerApp, acquireLock = acquireMacInstallLock, lockTimeoutMs = 10000 } = {}) {
|
|
95
|
+
Object.assign(this, { sourcePath, appPath, pathsInUse, verify, register, acquireLock, lockTimeoutMs });
|
|
96
|
+
this.updatePending = false;
|
|
97
|
+
}
|
|
98
|
+
async available() { try { await access(join(this.sourcePath, executable)); return true; } catch { return false; } }
|
|
99
|
+
async registerInstalled(hash) {
|
|
100
|
+
if (this.registeredHash === hash) return;
|
|
101
|
+
await this.register(this.appPath, this.sourcePath);
|
|
102
|
+
this.registeredHash = hash;
|
|
103
|
+
}
|
|
104
|
+
async describe() {
|
|
105
|
+
const installed = await readBundle(this.appPath);
|
|
106
|
+
const source = await readBundle(this.sourcePath);
|
|
107
|
+
return { name: 'AgentRoam Remote Desktop', path: this.appPath, version: installed?.version ?? source?.version ?? 'unknown', fingerprint: (installed ?? source)?.hash.slice(0, 12), installed: Boolean(installed), updatePending: this.updatePending, ...(this.updatePending ? { pendingVersion: source?.version } : {}) };
|
|
108
|
+
}
|
|
109
|
+
lock() { return this.acquireLock(join(dirname(this.appPath), '.remote-helper-install.lock'), this.lockTimeoutMs); }
|
|
110
|
+
prepare() { return this.withPreparedApp(path => path); }
|
|
111
|
+
async withPreparedApp(use) {
|
|
112
|
+
await mkdir(dirname(this.appPath), { recursive: true, mode: 0o700 });
|
|
113
|
+
const unlock = await this.lock();
|
|
114
|
+
try {
|
|
115
|
+
let existing = await lstat(this.appPath).catch(error => { if (error.code !== 'ENOENT') throw error; return null; });
|
|
116
|
+
if (existing && (!existing.isDirectory() || existing.isSymbolicLink())) throw new Error('远控组件安装位置不是普通应用目录,未覆盖');
|
|
117
|
+
const backup = join(dirname(this.appPath), '.remote-helper-previous.app');
|
|
118
|
+
const previous = await lstat(backup).catch(error => { if (error.code !== 'ENOENT') throw error; return null; });
|
|
119
|
+
if (previous) {
|
|
120
|
+
if (!previous.isDirectory() || previous.isSymbolicLink() || !await readBundle(backup)) throw new Error('远控组件更新备份无效,未覆盖');
|
|
121
|
+
// Recover a process exit between the two renames before considering
|
|
122
|
+
// the current CLI's version, which might be older than the backup.
|
|
123
|
+
if (!existing) {
|
|
124
|
+
await this.verify(backup);
|
|
125
|
+
await rename(backup, this.appPath);
|
|
126
|
+
existing = await lstat(this.appPath);
|
|
127
|
+
} else {
|
|
128
|
+
if (!await readBundle(this.appPath)) throw new Error('远控组件更新未完成,已保留旧应用备份');
|
|
129
|
+
await this.verify(this.appPath);
|
|
130
|
+
await rm(backup, { recursive: true });
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
const source = await readBundle(this.sourcePath);
|
|
134
|
+
if (!source) throw new Error('当前 CLI 未包含远程授权组件,请升级 CLI');
|
|
135
|
+
const installed = await readBundle(this.appPath);
|
|
136
|
+
const used = await this.pathsInUse();
|
|
137
|
+
const installedExecutable = join(this.appPath, executable);
|
|
138
|
+
const otherHelpers = used.filter(path => path.endsWith('/AgentRoam Remote Desktop.app/' + executable) && resolve(path) !== resolve(installedExecutable));
|
|
139
|
+
if (otherHelpers.length) throw new Error('旧位置的远控组件仍在使用,请先结束旧版 AgentRoam 的桌面共享,再重新检测');
|
|
140
|
+
// Repeated launches never rewrite an identical app. An older CLI cannot
|
|
141
|
+
// roll the shared component back after a newer CLI has installed it.
|
|
142
|
+
if (installed && (installed.hash === source.hash || installed.version !== 'legacy' && compareVersions(installed.version, source.version) >= 0)) {
|
|
143
|
+
await this.verify(this.appPath);
|
|
144
|
+
await this.registerInstalled(installed.hash);
|
|
145
|
+
this.updatePending = false;
|
|
146
|
+
return await use(this.appPath);
|
|
147
|
+
}
|
|
148
|
+
if (installed && used.includes(installedExecutable)) {
|
|
149
|
+
await this.verify(this.appPath);
|
|
150
|
+
await this.registerInstalled(installed.hash);
|
|
151
|
+
this.updatePending = true;
|
|
152
|
+
return await use(this.appPath);
|
|
153
|
+
}
|
|
154
|
+
const staging = await mkdtemp(join(dirname(this.appPath), '.remote-helper-update-'));
|
|
155
|
+
const staged = join(staging, 'AgentRoam Remote Desktop.app');
|
|
156
|
+
let moved = false;
|
|
157
|
+
try {
|
|
158
|
+
await cp(this.sourcePath, staged, { recursive: true, dereference: true });
|
|
159
|
+
await this.verify(staged);
|
|
160
|
+
if ((await readBundle(staged))?.hash !== source.hash) throw new Error('远控组件复制校验失败');
|
|
161
|
+
if (existing) { await rename(this.appPath, backup); moved = true; }
|
|
162
|
+
try { await rename(staged, this.appPath); }
|
|
163
|
+
catch (error) {
|
|
164
|
+
if (moved) {
|
|
165
|
+
try { await rename(backup, this.appPath); moved = false; }
|
|
166
|
+
catch { throw new Error(`远控组件更新失败,旧应用保留在 ${backup}`); }
|
|
167
|
+
}
|
|
168
|
+
throw error;
|
|
169
|
+
}
|
|
170
|
+
this.updatePending = false;
|
|
171
|
+
await this.registerInstalled(source.hash);
|
|
172
|
+
if (moved) await rm(backup, { recursive: true });
|
|
173
|
+
} finally {
|
|
174
|
+
// Backups are only removed after replacement; running old copies were
|
|
175
|
+
// checked above. No permission records or user data are cleared.
|
|
176
|
+
await rm(staging, { recursive: true, force: true });
|
|
177
|
+
}
|
|
178
|
+
return await use(this.appPath);
|
|
179
|
+
} finally { await unlock(); }
|
|
180
|
+
}
|
|
181
|
+
}
|