agentroam-runtime-win32-x64 0.2.0-preview.56 → 0.2.0-preview.57
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/api/push/vapid.body +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/component-version.mjs +13 -0
- package/runtime/lib/remote-control/macos-helper-app.mjs +86 -35
- package/runtime/lib/remote-control/remote-authorization.mjs +1 -1
- package/runtime/lib/remote-control/windows-helper-app.mjs +201 -0
- package/runtime/lib/remote-control/windows-helper.mjs +12 -12
- package/runtime/native/agentroam-remote-component.json +1 -0
- package/runtime/node_modules/.package-lock.json +117 -117
- package/runtime/node_modules/asn1js/README.md +50 -32
- package/runtime/node_modules/asn1js/build/index.es.js +860 -353
- package/runtime/node_modules/asn1js/build/index.js +860 -353
- package/runtime/node_modules/asn1js/package.json +20 -17
- package/runtime/package-lock.json +134 -134
- package/runtime/webapp/dist/assets/{AiHubPane-Cu92elLn.js → AiHubPane-ChqCR_y0.js} +1 -1
- package/runtime/webapp/dist/assets/{App-CIoUFqUR.js → App-KFs0NxCF.js} +3 -3
- package/runtime/webapp/dist/assets/{BrowserLivePanel-BsthwY1a.js → BrowserLivePanel-CsScRv23.js} +1 -1
- package/runtime/webapp/dist/assets/{CollaborationDashboard-DG7Y0h1s.js → CollaborationDashboard-HF8ltJSE.js} +1 -1
- package/runtime/webapp/dist/assets/{CollaborationPage-DA902wqi.js → CollaborationPage-BgLQAQjm.js} +1 -1
- package/runtime/webapp/dist/assets/{FilePreview-CGjiY6Oh.js → FilePreview-DiHfafCP.js} +3 -3
- package/runtime/webapp/dist/assets/{FileTree-BC45MKRL.js → FileTree-PvPJgMg5.js} +1 -1
- package/runtime/webapp/dist/assets/{FlowStudioPane-9TrQcObf.js → FlowStudioPane-C5GM9JC-.js} +1 -1
- package/runtime/webapp/dist/assets/{RemoteDesktopPage-DMnDxASQ.js → RemoteDesktopPage-BDpFrmKy.js} +1 -1
- package/runtime/webapp/dist/assets/{TerminalPane-Ds9JxVMt.js → TerminalPane-D-Yj-chg.js} +1 -1
- package/runtime/webapp/dist/assets/{abnfDiagram-VCTEODGH-2YNJ76WG.js → abnfDiagram-VCTEODGH-Cw_sGqxb.js} +1 -1
- package/runtime/webapp/dist/assets/{arc-CcKuP0ye.js → arc-CCCMJyI8.js} +1 -1
- package/runtime/webapp/dist/assets/{architectureDiagram-5GKGNRK7-Bw49xhZn.js → architectureDiagram-5GKGNRK7-DlkkDiCM.js} +1 -1
- package/runtime/webapp/dist/assets/{artifact-links-OG5Ksgyd.js → artifact-links-BHjZ3nlR.js} +1 -1
- package/runtime/webapp/dist/assets/{blockDiagram-I7D4REHJ-Dqm_qfY7.js → blockDiagram-I7D4REHJ-Ci_dfCdR.js} +1 -1
- package/runtime/webapp/dist/assets/{c4Diagram-7LVT6UL2-CASULDQ9.js → c4Diagram-7LVT6UL2-DI10DGne.js} +1 -1
- package/runtime/webapp/dist/assets/channel-NIixBBfi.js +1 -0
- package/runtime/webapp/dist/assets/{chunk-2Q5K7J3B-yEnUXBZC.js → chunk-2Q5K7J3B-CT0BORhC.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-5VM5RSS4-Djs5IDQf.js → chunk-5VM5RSS4-hg-DY-5r.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-F27PBJKO-CdLh9ewF.js → chunk-F27PBJKO-DngPgytW.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-IMKFNOWR-I-pRrlxR.js → chunk-IMKFNOWR-5CWl6SEz.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-JWPE2WC7-BD2Gv69T.js → chunk-JWPE2WC7-D3j6hMZe.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-POPQ4Y6H-BhuerIJs.js → chunk-POPQ4Y6H-C8GSJtEY.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-SVP7TREG-AWEtUvjM.js → chunk-SVP7TREG-C5HQHSea.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-TICWLB2K-BiO_dQcW.js → chunk-TICWLB2K-B2AwbLWh.js} +1 -1
- package/runtime/webapp/dist/assets/{chunk-XXDRQBXY-zkjO5GCv.js → chunk-XXDRQBXY-_j-3Zf7f.js} +1 -1
- package/runtime/webapp/dist/assets/classDiagram-ZZMXUADV-CGa6hDyt.js +1 -0
- package/runtime/webapp/dist/assets/classDiagram-v2-VYDZK3BY-CGa6hDyt.js +1 -0
- package/runtime/webapp/dist/assets/{clipboard-CvdeFLww.js → clipboard-Cwf2Psxb.js} +1 -1
- package/runtime/webapp/dist/assets/{codeSyntax-ByG7L1fi.js → codeSyntax-Dnkv_4aa.js} +1 -1
- package/runtime/webapp/dist/assets/{collaboration-Be_9WEiY.js → collaboration-DHDzNCPO.js} +1 -1
- package/runtime/webapp/dist/assets/{cose-bilkent-JH36ORCC-CAxuJw-v.js → cose-bilkent-JH36ORCC-DTE5n0M0.js} +1 -1
- package/runtime/webapp/dist/assets/{cynefin-OW5HDTMX-hLWhgC57.js → cynefin-OW5HDTMX-mEPaurNe.js} +1 -1
- package/runtime/webapp/dist/assets/{cynefinDiagram-5FMLGOSQ-uelhySIx.js → cynefinDiagram-5FMLGOSQ-Ci281Jxk.js} +1 -1
- package/runtime/webapp/dist/assets/{dagre-GXQ25YYZ-DPO7KxIX.js → dagre-GXQ25YYZ-DTnnlrAX.js} +1 -1
- package/runtime/webapp/dist/assets/{diagram-S7CK7UJ4-B8jQa5Lm.js → diagram-S7CK7UJ4-2UuWvA7i.js} +1 -1
- package/runtime/webapp/dist/assets/{diagram-UQ7AKVKN-DdymRFf0.js → diagram-UQ7AKVKN-DaWqSqMe.js} +1 -1
- package/runtime/webapp/dist/assets/{diagram-VSXAHHWV-BHAv1Uzp.js → diagram-VSXAHHWV-DSZtnJiB.js} +1 -1
- package/runtime/webapp/dist/assets/{diagram-VX7I27RA-DlRev6E7.js → diagram-VX7I27RA-3T-5Agty.js} +1 -1
- package/runtime/webapp/dist/assets/{diagram-Z3DM3KII-DspqqK0b.js → diagram-Z3DM3KII-xmDPknxw.js} +1 -1
- package/runtime/webapp/dist/assets/{ebnfDiagram-PWID7BFC-BwStWg-O.js → ebnfDiagram-PWID7BFC-JQEYWOvZ.js} +1 -1
- package/runtime/webapp/dist/assets/{erDiagram-RLTQ6QDP-jUH66GeO.js → erDiagram-RLTQ6QDP-B6narI72.js} +1 -1
- package/runtime/webapp/dist/assets/{file-types-Bbr1oDan.js → file-types-Cs4tHNVf.js} +1 -1
- package/runtime/webapp/dist/assets/{flowDiagram-HODETNUW-b2JhyYZh.js → flowDiagram-HODETNUW-CK7DK3Gk.js} +1 -1
- package/runtime/webapp/dist/assets/{ganttDiagram-EL5Y4UJY-k6xQA8nM.js → ganttDiagram-EL5Y4UJY-BcDmlNwh.js} +1 -1
- package/runtime/webapp/dist/assets/{gitGraphDiagram-WWUBYQGX-Cg8O3XcX.js → gitGraphDiagram-WWUBYQGX-RdFAuhWE.js} +1 -1
- package/runtime/webapp/dist/assets/{index-CQepZy15.js → index-CFGPpdBY.js} +4 -4
- package/runtime/webapp/dist/assets/{infoDiagram-27XIBGKW-BEZuUiUV.js → infoDiagram-27XIBGKW-ElVqnYMm.js} +1 -1
- package/runtime/webapp/dist/assets/{ishikawaDiagram-5VMMS53U-D8cPBWA9.js → ishikawaDiagram-5VMMS53U-CTeLVA0R.js} +1 -1
- package/runtime/webapp/dist/assets/{journeyDiagram-3NMN7TZE-BiCIZoXl.js → journeyDiagram-3NMN7TZE-ByxrFxTv.js} +1 -1
- package/runtime/webapp/dist/assets/{kanban-definition-UXKFOSKX-DBGsdTe3.js → kanban-definition-UXKFOSKX-BqiTQeMN.js} +1 -1
- package/runtime/webapp/dist/assets/{layout-CESwBcoQ.js → layout-BZCWCzvh.js} +1 -1
- package/runtime/webapp/dist/assets/{linear-meicA11o.js → linear-DXrM6MzH.js} +1 -1
- package/runtime/webapp/dist/assets/{loader-circle-gCGomGeo.js → loader-circle-CRhbj_Kf.js} +1 -1
- package/runtime/webapp/dist/assets/{mermaid.core-BsSrKkY-.js → mermaid.core-DTDkmQ6m.js} +5 -5
- package/runtime/webapp/dist/assets/{mindmap-definition-YA3MSWOX-Ci76EHnj.js → mindmap-definition-YA3MSWOX-DqCPnFQf.js} +1 -1
- package/runtime/webapp/dist/assets/{page-CaBcebHM.js → page-qprcLw0l.js} +3 -3
- package/runtime/webapp/dist/assets/{pegDiagram-XKGWAZYB-BJ9fzsRy.js → pegDiagram-XKGWAZYB-D63yrQuq.js} +1 -1
- package/runtime/webapp/dist/assets/{pieDiagram-E7YTZNPT-Dr_g_s7V.js → pieDiagram-E7YTZNPT-DCzTnhwu.js} +1 -1
- package/runtime/webapp/dist/assets/{quadrantDiagram-AXDQQJYC-DRUIkYzL.js → quadrantDiagram-AXDQQJYC-B3Bb7MB-.js} +1 -1
- package/runtime/webapp/dist/assets/{railroadDiagram-O6MQD6OU-z_f3jTzL.js → railroadDiagram-O6MQD6OU-Cknh6Ei1.js} +1 -1
- package/runtime/webapp/dist/assets/{requirementDiagram-BXWQKSXE-BZ9192zw.js → requirementDiagram-BXWQKSXE-BYtbQioD.js} +1 -1
- package/runtime/webapp/dist/assets/{rotate-ccw-CU6Ofovh.js → rotate-ccw-B-nRINvb.js} +1 -1
- package/runtime/webapp/dist/assets/{rotate-cw-CI-k2c-H.js → rotate-cw-DVGqAFQz.js} +1 -1
- package/runtime/webapp/dist/assets/{sankeyDiagram-P5KCCOFB-D_bYtKCw.js → sankeyDiagram-P5KCCOFB-k_Vb3RIX.js} +1 -1
- package/runtime/webapp/dist/assets/{send-B_L3JVTV.js → send-C4oDLFFm.js} +1 -1
- package/runtime/webapp/dist/assets/{sequenceDiagram-WJ2MYXX4-BRPkyVwo.js → sequenceDiagram-WJ2MYXX4-Bc9Pcv0e.js} +1 -1
- package/runtime/webapp/dist/assets/{sizeCapture-INFHLROL-D0IXlEUO.js → sizeCapture-INFHLROL-0YYAh6Pi.js} +1 -1
- package/runtime/webapp/dist/assets/{smartphone-BaM-cilR.js → smartphone-0wJ6lsYD.js} +1 -1
- package/runtime/webapp/dist/assets/{stateDiagram-D77RDMKH-DOPcJmKu.js → stateDiagram-D77RDMKH-CIqzUhPM.js} +1 -1
- package/runtime/webapp/dist/assets/stateDiagram-v2-MP3YSRHH-DLwWK8OY.js +1 -0
- package/runtime/webapp/dist/assets/{swimlanes-42K2YHIH-DkWPxpZR.js → swimlanes-42K2YHIH-D1NpIz9q.js} +1 -1
- package/runtime/webapp/dist/assets/swimlanesDiagram-VR7AAH4N-C4Bc5Vem.js +8 -0
- package/runtime/webapp/dist/assets/{timeline-definition-24CTP7MA-DSSrwQZc.js → timeline-definition-24CTP7MA-Dxw_7egm.js} +1 -1
- package/runtime/webapp/dist/assets/{trash-2-CCZMuVfC.js → trash-2-CVH0gGlm.js} +1 -1
- package/runtime/webapp/dist/assets/{vennDiagram-4TSXK5OY-QRwqQ2e4.js → vennDiagram-4TSXK5OY-DhGn0ZVr.js} +1 -1
- package/runtime/webapp/dist/assets/{wardleyDiagram-VM6X3IG4-BOSS_TSY.js → wardleyDiagram-VM6X3IG4-CZmbL_Wo.js} +1 -1
- package/runtime/webapp/dist/assets/{web-DX0wjWUS.js → web-BK27Wi1i.js} +1 -1
- package/runtime/webapp/dist/assets/{web-ebzGWnSw.js → web-BPW_Ymbe.js} +1 -1
- package/runtime/webapp/dist/assets/{x-CbdLQm7m.js → x-Pd8Ro-NN.js} +1 -1
- package/runtime/webapp/dist/assets/{xychartDiagram-S5SC5T6Z-D9Rp3n6B.js → xychartDiagram-S5SC5T6Z-Cd1HAnc7.js} +1 -1
- package/runtime/webapp/dist/index.html +1 -1
- package/runtime/webapp/dist/assets/channel-xKavBx6z.js +0 -1
- package/runtime/webapp/dist/assets/classDiagram-ZZMXUADV-B6zj-gda.js +0 -1
- package/runtime/webapp/dist/assets/classDiagram-v2-VYDZK3BY-B6zj-gda.js +0 -1
- package/runtime/webapp/dist/assets/stateDiagram-v2-MP3YSRHH-CosKh0dU.js +0 -1
- package/runtime/webapp/dist/assets/swimlanesDiagram-VR7AAH4N-eLjpgpHz.js +0 -8
- /package/runtime/.next/static/{1ar2wXugWliv3TmyVCQiY → 3znfZrYYbguBkCBygHPcf}/_buildManifest.js +0 -0
- /package/runtime/.next/static/{1ar2wXugWliv3TmyVCQiY → 3znfZrYYbguBkCBygHPcf}/_ssgManifest.js +0 -0
package/manifest.json
CHANGED
package/package.json
CHANGED
package/runtime/.next/BUILD_ID
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
3znfZrYYbguBkCBygHPcf
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"/_not-found/page":"/_not-found","/api/collaboration/route":"/api/collaboration","/api/auth/verify/route":"/api/auth/verify","/api/flow/v1/runs/
|
|
1
|
+
{"/_not-found/page":"/_not-found","/api/collaboration/route":"/api/collaboration","/api/auth/verify/route":"/api/auth/verify","/api/flow/v1/runs/route":"/api/flow/v1/runs","/api/flow/v1/runs/[runId]/cancel/route":"/api/flow/v1/runs/[runId]/cancel","/api/mcp/connect/route":"/api/mcp/connect","/api/mcp/disconnect/route":"/api/mcp/disconnect","/api/mcp/servers/route":"/api/mcp/servers","/api/memory/[key]/route":"/api/memory/[key]","/api/plugins/load/route":"/api/plugins/load","/api/projects/[id]/route":"/api/projects/[id]","/api/flow/v1/runs/[runId]/events/route":"/api/flow/v1/runs/[runId]/events","/api/projects/check/route":"/api/projects/check","/api/projects/roots/route":"/api/projects/roots","/api/memory/route":"/api/memory","/api/projects/route":"/api/projects","/api/projects/directories/route":"/api/projects/directories","/api/push/subscribe/route":"/api/push/subscribe","/api/push/vapid/route":"/api/push/vapid","/api/remote-tools/register/route":"/api/remote-tools/register","/api/sessions/[id]/fork-at/route":"/api/sessions/[id]/fork-at","/api/push/unsubscribe/route":"/api/push/unsubscribe","/api/tool-policies/[policyId]/route":"/api/tool-policies/[policyId]","/api/tools/route":"/api/tools","/api/web-auth/login/route":"/api/web-auth/login","/api/web-auth/logout/route":"/api/web-auth/logout","/api/web-auth/revoke-all/route":"/api/web-auth/revoke-all","/api/web-auth/setup/route":"/api/web-auth/setup","/api/web-console/preferences/route":"/api/web-console/preferences","/api/skills/route":"/api/skills","/api/agent/answer/route":"/api/agent/answer","/api/agent-workspaces/[workspaceId]/sessions/route":"/api/agent-workspaces/[workspaceId]/sessions","/api/agent-workspaces/route":"/api/agent-workspaces","/api/agent/abort/route":"/api/agent/abort","/api/agent/model/route":"/api/agent/model","/api/agent/runtime-health/route":"/api/agent/runtime-health","/api/agent/models/route":"/api/agent/models","/api/agent/harness/status/route":"/api/agent/harness/status","/api/agent/codex-sharing/route":"/api/agent/codex-sharing","/api/agent/steer/route":"/api/agent/steer","/api/business/route":"/api/business","/api/flow/v1/catalog/route":"/api/flow/v1/catalog","/api/flow-studio/config/route":"/api/flow-studio/config","/api/agent/stream/route":"/api/agent/stream","/api/agent/run/route":"/api/agent/run","/api/client-logs/route":"/api/client-logs","/api/sessions/[id]/changes/route":"/api/sessions/[id]/changes","/api/sessions/[id]/fork/route":"/api/sessions/[id]/fork","/api/sessions/[id]/handoff/route":"/api/sessions/[id]/handoff","/api/sessions/[id]/release/route":"/api/sessions/[id]/release","/api/sessions/[id]/query-index/route":"/api/sessions/[id]/query-index","/api/sessions/[id]/native-goal/route":"/api/sessions/[id]/native-goal","/api/sessions/[id]/tool-result/route":"/api/sessions/[id]/tool-result","/api/tool-policies/route":"/api/tool-policies","/api/sessions/route":"/api/sessions","/api/update/check/route":"/api/update/check","/api/settings/route":"/api/settings","/api/update/install/route":"/api/update/install","/api/update/status/route":"/api/update/status","/api/sessions/[id]/route":"/api/sessions/[id]","/api/sessions/[id]/thread-goal/route":"/api/sessions/[id]/thread-goal","/api/web-console/bootstrap/route":"/api/web-console/bootstrap","/api/sessions/[id]/goals/route":"/api/sessions/[id]/goals","/api/web-auth/status/route":"/api/web-auth/status","/api/web-console/history/route":"/api/web-console/history","/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/3znfZrYYbguBkCBygHPcf/_buildManifest.js",
|
|
9
|
+
"static/3znfZrYYbguBkCBygHPcf/_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/
|
|
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":"06278e70329110e7cd52ef18fefb4cea","previewModeSigningKey":"a30af3006f4c56f220cc02680f72a89aae571d7b1f383d4a3479e81bc8c52c95","previewModeEncryptionKey":"e0abc1542fd7ccf4525e5ba565a15e2372ba5ca11cfc62f728a9c2c8e9b13c3a"}}
|
|
@@ -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\":\"3znfZrYYbguBkCBygHPcf\",\"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:["3znfZrYYbguBkCBygHPcf",[[["",{"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
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"publicKey":"
|
|
1
|
+
{"publicKey":"BEbayjxiZznLQOwqAngYSWUnpy0OlW4ijJqOilAWtG4LO9rjbT41Tdz9YPO-VZ1bhCYfqkYOG0yFhnHIg7I2fXU"}
|
|
@@ -2,70 +2,70 @@
|
|
|
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]/events/route": "app/api/flow/v1/runs/[runId]/events/route.js",
|
|
6
|
-
"/api/flow/v1/runs/[runId]/cancel/route": "app/api/flow/v1/runs/[runId]/cancel/route.js",
|
|
7
5
|
"/api/flow/v1/runs/route": "app/api/flow/v1/runs/route.js",
|
|
6
|
+
"/api/flow/v1/runs/[runId]/cancel/route": "app/api/flow/v1/runs/[runId]/cancel/route.js",
|
|
8
7
|
"/api/mcp/connect/route": "app/api/mcp/connect/route.js",
|
|
8
|
+
"/api/mcp/disconnect/route": "app/api/mcp/disconnect/route.js",
|
|
9
9
|
"/api/mcp/servers/route": "app/api/mcp/servers/route.js",
|
|
10
10
|
"/api/memory/[key]/route": "app/api/memory/[key]/route.js",
|
|
11
|
-
"/api/memory/route": "app/api/memory/route.js",
|
|
12
|
-
"/api/mcp/disconnect/route": "app/api/mcp/disconnect/route.js",
|
|
13
11
|
"/api/plugins/load/route": "app/api/plugins/load/route.js",
|
|
14
12
|
"/api/projects/[id]/route": "app/api/projects/[id]/route.js",
|
|
15
|
-
"/api/
|
|
13
|
+
"/api/flow/v1/runs/[runId]/events/route": "app/api/flow/v1/runs/[runId]/events/route.js",
|
|
16
14
|
"/api/projects/check/route": "app/api/projects/check/route.js",
|
|
17
|
-
"/api/
|
|
15
|
+
"/api/projects/roots/route": "app/api/projects/roots/route.js",
|
|
16
|
+
"/api/memory/route": "app/api/memory/route.js",
|
|
17
|
+
"/api/projects/route": "app/api/projects/route.js",
|
|
18
18
|
"/api/projects/directories/route": "app/api/projects/directories/route.js",
|
|
19
|
-
"/api/push/vapid/route": "app/api/push/vapid/route.js",
|
|
20
19
|
"/api/push/subscribe/route": "app/api/push/subscribe/route.js",
|
|
20
|
+
"/api/push/vapid/route": "app/api/push/vapid/route.js",
|
|
21
21
|
"/api/remote-tools/register/route": "app/api/remote-tools/register/route.js",
|
|
22
|
-
"/api/projects/route": "app/api/projects/route.js",
|
|
23
22
|
"/api/sessions/[id]/fork-at/route": "app/api/sessions/[id]/fork-at/route.js",
|
|
24
|
-
"/api/
|
|
23
|
+
"/api/push/unsubscribe/route": "app/api/push/unsubscribe/route.js",
|
|
25
24
|
"/api/tool-policies/[policyId]/route": "app/api/tool-policies/[policyId]/route.js",
|
|
26
25
|
"/api/tools/route": "app/api/tools/route.js",
|
|
27
|
-
"/api/web-auth/
|
|
26
|
+
"/api/web-auth/login/route": "app/api/web-auth/login/route.js",
|
|
28
27
|
"/api/web-auth/logout/route": "app/api/web-auth/logout/route.js",
|
|
28
|
+
"/api/web-auth/revoke-all/route": "app/api/web-auth/revoke-all/route.js",
|
|
29
29
|
"/api/web-auth/setup/route": "app/api/web-auth/setup/route.js",
|
|
30
|
-
"/api/web-console/history/route": "app/api/web-console/history/route.js",
|
|
31
30
|
"/api/web-console/preferences/route": "app/api/web-console/preferences/route.js",
|
|
32
|
-
"/api/
|
|
31
|
+
"/api/skills/route": "app/api/skills/route.js",
|
|
32
|
+
"/api/agent/answer/route": "app/api/agent/answer/route.js",
|
|
33
33
|
"/api/agent-workspaces/[workspaceId]/sessions/route": "app/api/agent-workspaces/[workspaceId]/sessions/route.js",
|
|
34
|
-
"/api/agent/abort/route": "app/api/agent/abort/route.js",
|
|
35
34
|
"/api/agent-workspaces/route": "app/api/agent-workspaces/route.js",
|
|
36
|
-
"/api/agent/
|
|
37
|
-
"/api/agent/harness/status/route": "app/api/agent/harness/status/route.js",
|
|
35
|
+
"/api/agent/abort/route": "app/api/agent/abort/route.js",
|
|
38
36
|
"/api/agent/model/route": "app/api/agent/model/route.js",
|
|
39
37
|
"/api/agent/runtime-health/route": "app/api/agent/runtime-health/route.js",
|
|
40
38
|
"/api/agent/models/route": "app/api/agent/models/route.js",
|
|
39
|
+
"/api/agent/harness/status/route": "app/api/agent/harness/status/route.js",
|
|
40
|
+
"/api/agent/codex-sharing/route": "app/api/agent/codex-sharing/route.js",
|
|
41
41
|
"/api/agent/steer/route": "app/api/agent/steer/route.js",
|
|
42
42
|
"/api/business/route": "app/api/business/route.js",
|
|
43
|
-
"/api/agent/codex-sharing/route": "app/api/agent/codex-sharing/route.js",
|
|
44
43
|
"/api/flow/v1/catalog/route": "app/api/flow/v1/catalog/route.js",
|
|
45
44
|
"/api/flow-studio/config/route": "app/api/flow-studio/config/route.js",
|
|
46
45
|
"/api/agent/stream/route": "app/api/agent/stream/route.js",
|
|
47
|
-
"/api/sessions/[id]/fork/route": "app/api/sessions/[id]/fork/route.js",
|
|
48
46
|
"/api/agent/run/route": "app/api/agent/run/route.js",
|
|
47
|
+
"/api/client-logs/route": "app/api/client-logs/route.js",
|
|
49
48
|
"/api/sessions/[id]/changes/route": "app/api/sessions/[id]/changes/route.js",
|
|
49
|
+
"/api/sessions/[id]/fork/route": "app/api/sessions/[id]/fork/route.js",
|
|
50
50
|
"/api/sessions/[id]/handoff/route": "app/api/sessions/[id]/handoff/route.js",
|
|
51
51
|
"/api/sessions/[id]/release/route": "app/api/sessions/[id]/release/route.js",
|
|
52
|
-
"/api/client-logs/route": "app/api/client-logs/route.js",
|
|
53
|
-
"/api/sessions/[id]/native-goal/route": "app/api/sessions/[id]/native-goal/route.js",
|
|
54
52
|
"/api/sessions/[id]/query-index/route": "app/api/sessions/[id]/query-index/route.js",
|
|
55
|
-
"/api/
|
|
53
|
+
"/api/sessions/[id]/native-goal/route": "app/api/sessions/[id]/native-goal/route.js",
|
|
56
54
|
"/api/sessions/[id]/tool-result/route": "app/api/sessions/[id]/tool-result/route.js",
|
|
57
|
-
"/api/sessions/route": "app/api/sessions/route.js",
|
|
58
|
-
"/api/sessions/[id]/thread-goal/route": "app/api/sessions/[id]/thread-goal/route.js",
|
|
59
55
|
"/api/tool-policies/route": "app/api/tool-policies/route.js",
|
|
60
|
-
"/api/
|
|
61
|
-
"/api/update/install/route": "app/api/update/install/route.js",
|
|
56
|
+
"/api/sessions/route": "app/api/sessions/route.js",
|
|
62
57
|
"/api/update/check/route": "app/api/update/check/route.js",
|
|
58
|
+
"/api/settings/route": "app/api/settings/route.js",
|
|
59
|
+
"/api/update/install/route": "app/api/update/install/route.js",
|
|
60
|
+
"/api/update/status/route": "app/api/update/status/route.js",
|
|
61
|
+
"/api/sessions/[id]/route": "app/api/sessions/[id]/route.js",
|
|
62
|
+
"/api/sessions/[id]/thread-goal/route": "app/api/sessions/[id]/thread-goal/route.js",
|
|
63
|
+
"/api/web-console/bootstrap/route": "app/api/web-console/bootstrap/route.js",
|
|
63
64
|
"/api/sessions/[id]/goals/route": "app/api/sessions/[id]/goals/route.js",
|
|
64
65
|
"/api/web-auth/status/route": "app/api/web-auth/status/route.js",
|
|
65
|
-
"/api/web-console/
|
|
66
|
-
"/api/sessions/[id]/route": "app/api/sessions/[id]/route.js",
|
|
67
|
-
"/api/web-console/computer-settings/route": "app/api/web-console/computer-settings/route.js",
|
|
66
|
+
"/api/web-console/history/route": "app/api/web-console/history/route.js",
|
|
68
67
|
"/api/web-console/device-state/route": "app/api/web-console/device-state/route.js",
|
|
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",
|
|
70
70
|
"/web/page": "app/web/page.js"
|
|
71
71
|
}
|
|
@@ -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\":\"3znfZrYYbguBkCBygHPcf\",\"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/3znfZrYYbguBkCBygHPcf/_buildManifest.js" defer=""></script><script src="/_next/static/3znfZrYYbguBkCBygHPcf/_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":"3znfZrYYbguBkCBygHPcf","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"node":{},"edge":{},"encryptionKey":"
|
|
1
|
+
{"node":{},"edge":{},"encryptionKey":"Df1U7Rwe56BWiOsGZfThtAERJB+CnuuPa4+KrZhFzPw="}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export const componentVersionPattern = /^(\d+)\.(\d+)\.(\d+)(?:-preview\.(\d+))?$/;
|
|
2
|
+
|
|
3
|
+
export function compareComponentVersions(left, right) {
|
|
4
|
+
const parts = (version) => {
|
|
5
|
+
const match = componentVersionPattern.exec(version);
|
|
6
|
+
return match ? [Number(match[1]), Number(match[2]), Number(match[3]), match[4] === undefined ? Infinity : Number(match[4])] : [-1];
|
|
7
|
+
};
|
|
8
|
+
const a = parts(left), b = parts(right);
|
|
9
|
+
for (let i = 0; i < Math.max(a.length, b.length); i++) {
|
|
10
|
+
if ((a[i] ?? 0) !== (b[i] ?? 0)) return (a[i] ?? 0) > (b[i] ?? 0) ? 1 : -1;
|
|
11
|
+
}
|
|
12
|
+
return 0;
|
|
13
|
+
}
|
|
@@ -6,12 +6,13 @@ import { homedir } from 'node:os';
|
|
|
6
6
|
import { dirname, join, resolve } from 'node:path';
|
|
7
7
|
import { fileURLToPath } from 'node:url';
|
|
8
8
|
import { promisify } from 'node:util';
|
|
9
|
+
import { setTimeout as delay } from 'node:timers/promises';
|
|
10
|
+
import { componentVersionPattern as versionPattern, compareComponentVersions as compareVersions } from './component-version.mjs';
|
|
9
11
|
|
|
10
12
|
const run = promisify(execFile);
|
|
11
13
|
const bundleId = 'com.agentroam.remote-desktop';
|
|
12
14
|
const executable = 'Contents/MacOS/agentroam-remote-desktop';
|
|
13
15
|
const metadata = 'Contents/Resources/agentroam-component.json';
|
|
14
|
-
const versionPattern = /^(\d+)\.(\d+)\.(\d+)(?:-preview\.(\d+))?$/;
|
|
15
16
|
|
|
16
17
|
export function bundledRemoteAppPath() {
|
|
17
18
|
const native = fileURLToPath(new URL('../../native/', import.meta.url));
|
|
@@ -19,18 +20,6 @@ export function bundledRemoteAppPath() {
|
|
|
19
20
|
return existsSync(payload) ? payload : join(native, 'AgentRoam Remote Desktop.app');
|
|
20
21
|
}
|
|
21
22
|
|
|
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
23
|
async function readBundle(path) {
|
|
35
24
|
try { await access(join(path, executable)); } catch (error) { if (error.code === 'ENOENT') return null; throw error; }
|
|
36
25
|
const plist = await readFile(join(path, 'Contents/Info.plist'), 'utf8');
|
|
@@ -56,11 +45,45 @@ async function readBundle(path) {
|
|
|
56
45
|
return { version, hash: hash.digest('hex') };
|
|
57
46
|
}
|
|
58
47
|
|
|
59
|
-
async function
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
if (
|
|
63
|
-
|
|
48
|
+
async function processIdentity(pid) {
|
|
49
|
+
let stdout;
|
|
50
|
+
try { ({ stdout } = await run('/bin/ps', ['-p', String(pid), '-o', 'uid=', '-o', 'lstart='], { timeout: 5000, maxBuffer: 4096 })); }
|
|
51
|
+
catch (error) { if (error.code === 1) return null; throw error; }
|
|
52
|
+
const match = /^(\d+)\s+(.+)$/.exec(stdout.trim());
|
|
53
|
+
if (!match || Number(match[1]) !== process.getuid()) throw new Error('无法确认旧远控进程归属,未退出该进程');
|
|
54
|
+
return stdout.trim().replace(/\s+/g, ' ');
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
export async function macHelperProcesses() {
|
|
58
|
+
const { stdout } = await run('/usr/sbin/lsof', ['-nP', '-a', '-u', String(process.getuid()), '-d', 'txt', '-Fpn'], { timeout: 5000, maxBuffer: 16 * 1024 * 1024 });
|
|
59
|
+
const candidates = new Map();
|
|
60
|
+
let pid;
|
|
61
|
+
for (const line of stdout.split('\n')) {
|
|
62
|
+
if (/^p\d+$/.test(line)) pid = Number(line.slice(1));
|
|
63
|
+
else if (pid && line.startsWith('n/') && line.endsWith('/AgentRoam Remote Desktop.app/' + executable)) candidates.set(pid, line.slice(1));
|
|
64
|
+
}
|
|
65
|
+
if (!/^p\d+$/m.test(stdout)) throw new Error('无法确认旧远控组件是否仍在使用,请稍后重试');
|
|
66
|
+
const result = [];
|
|
67
|
+
for (const [pid, path] of candidates) {
|
|
68
|
+
const identity = await processIdentity(pid);
|
|
69
|
+
if (identity) result.push({ pid, path, identity });
|
|
70
|
+
}
|
|
71
|
+
return result;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
export async function stopMacHelperProcesses(processes) {
|
|
75
|
+
for (const item of processes) {
|
|
76
|
+
const current = (await macHelperProcesses()).find(p => p.pid === item.pid);
|
|
77
|
+
if (!current) continue;
|
|
78
|
+
if (current.path !== item.path || current.identity !== item.identity) throw new Error('旧远控进程身份已变化,未退出该进程');
|
|
79
|
+
try { process.kill(item.pid, 'SIGTERM'); }
|
|
80
|
+
catch (error) { if (error.code === 'ESRCH') continue; throw error; }
|
|
81
|
+
const deadline = Date.now() + 10000;
|
|
82
|
+
while (await processIdentity(item.pid) === item.identity) {
|
|
83
|
+
if (Date.now() >= deadline) throw new Error('旧远控组件未退出,未替换现有应用');
|
|
84
|
+
await delay(100);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
64
87
|
}
|
|
65
88
|
|
|
66
89
|
async function verifyBundle(path) {
|
|
@@ -74,6 +97,11 @@ async function registerApp(path, oldPath) {
|
|
|
74
97
|
await run(register, ['-f', path], { timeout: 5000, maxBuffer: 4096 });
|
|
75
98
|
}
|
|
76
99
|
|
|
100
|
+
async function unregisterApp(path) {
|
|
101
|
+
const register = '/System/Library/Frameworks/CoreServices.framework/Frameworks/LaunchServices.framework/Support/lsregister';
|
|
102
|
+
await run(register, ['-u', path], { timeout: 5000, maxBuffer: 4096 });
|
|
103
|
+
}
|
|
104
|
+
|
|
77
105
|
export async function acquireMacInstallLock(path, timeoutMs) {
|
|
78
106
|
const handle = await open(path, 'a', 0o600);
|
|
79
107
|
try {
|
|
@@ -91,9 +119,8 @@ export async function acquireMacInstallLock(path, timeoutMs) {
|
|
|
91
119
|
|
|
92
120
|
/** One installed app per user; npm version directories only carry its payload. */
|
|
93
121
|
export class MacRemoteHelperApp {
|
|
94
|
-
constructor({ sourcePath = bundledRemoteAppPath(), appPath = join(homedir(), 'Library/Application Support/AgentRoamRemoteDesktop/Services.noindex/AgentRoam Remote Desktop.app'),
|
|
95
|
-
Object.assign(this, { sourcePath, appPath,
|
|
96
|
-
this.updatePending = false;
|
|
122
|
+
constructor({ sourcePath = bundledRemoteAppPath(), appPath = join(homedir(), 'Library/Application Support/AgentRoamRemoteDesktop/Services.noindex/AgentRoam Remote Desktop.app'), processes = macHelperProcesses, stopProcesses = stopMacHelperProcesses, verify = verifyBundle, register = registerApp, unregister = unregisterApp, acquireLock = acquireMacInstallLock, lockTimeoutMs = 10000 } = {}) {
|
|
123
|
+
Object.assign(this, { sourcePath, appPath, processes, stopProcesses, verify, register, unregister, acquireLock, lockTimeoutMs });
|
|
97
124
|
}
|
|
98
125
|
async available() { try { await access(join(this.sourcePath, executable)); return true; } catch { return false; } }
|
|
99
126
|
async registerInstalled(hash) {
|
|
@@ -104,7 +131,7 @@ export class MacRemoteHelperApp {
|
|
|
104
131
|
async describe() {
|
|
105
132
|
const installed = await readBundle(this.appPath);
|
|
106
133
|
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:
|
|
134
|
+
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: false };
|
|
108
135
|
}
|
|
109
136
|
lock() { return this.acquireLock(join(dirname(this.appPath), '.remote-helper-install.lock'), this.lockTimeoutMs); }
|
|
110
137
|
prepare() { return this.withPreparedApp(path => path); }
|
|
@@ -133,22 +160,45 @@ export class MacRemoteHelperApp {
|
|
|
133
160
|
const source = await readBundle(this.sourcePath);
|
|
134
161
|
if (!source) throw new Error('当前 CLI 未包含远程授权组件,请升级 CLI');
|
|
135
162
|
const installed = await readBundle(this.appPath);
|
|
136
|
-
const used = await this.pathsInUse();
|
|
137
163
|
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
164
|
// Repeated launches never rewrite an identical app. An older CLI cannot
|
|
141
165
|
// roll the shared component back after a newer CLI has installed it.
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
166
|
+
const keepInstalled = installed && (installed.hash === source.hash || installed.version !== 'legacy' && compareVersions(installed.version, source.version) >= 0);
|
|
167
|
+
const targetVersion = keepInstalled ? installed.version : source.version;
|
|
168
|
+
const running = await this.processes(), retired = [];
|
|
169
|
+
for (const item of running.filter(item => resolve(item.path) !== resolve(installedExecutable))) {
|
|
170
|
+
const path = item.path.slice(0, -('/' + executable).length);
|
|
171
|
+
if (resolve(path) === resolve(this.sourcePath)) { retired.push({ ...item, appPath: path, remove: false }); continue; }
|
|
172
|
+
const parent = dirname(path), native = parent.endsWith('/Support.noindex') ? dirname(parent) : parent;
|
|
173
|
+
const pkg = JSON.parse(await readFile(join(native, '../../package.json'), 'utf8').catch(() => { throw new Error('无法确认旧远控组件归属,未退出该进程'); }));
|
|
174
|
+
const info = await lstat(path);
|
|
175
|
+
if (!native.endsWith('/runtime/native') || pkg.name !== 'agentroam-runtime-darwin-arm64' || !versionPattern.test(pkg.version) || !info.isDirectory() || info.isSymbolicLink()) throw new Error('无法确认旧远控组件归属,未退出该进程');
|
|
176
|
+
const payload = await readBundle(path);
|
|
177
|
+
if (!payload) throw new Error('旧远控组件文件不完整,未退出该进程');
|
|
178
|
+
await this.verify(path);
|
|
179
|
+
if (compareVersions(payload.version === 'legacy' ? pkg.version : payload.version, targetVersion) > 0) throw new Error('检测到较新的远控组件,请使用最新 CLI 更新');
|
|
180
|
+
retired.push({ ...item, appPath: path, hash: payload.hash, remove: true });
|
|
147
181
|
}
|
|
148
|
-
|
|
182
|
+
const stop = [...retired, ...(!keepInstalled ? running.filter(item => resolve(item.path) === resolve(installedExecutable)) : [])];
|
|
183
|
+
const retire = async () => {
|
|
184
|
+
if (!stop.length) return;
|
|
185
|
+
await this.stopProcesses(stop);
|
|
186
|
+
const stoppedPaths = new Set(stop.map(item => resolve(item.path)));
|
|
187
|
+
if ((await this.processes()).some(item => stoppedPaths.has(resolve(item.path)))) throw new Error('旧远控组件仍在使用,未替换现有应用');
|
|
188
|
+
};
|
|
189
|
+
const cleanup = async () => {
|
|
190
|
+
for (const item of new Map(retired.filter(item => item.remove).map(item => [resolve(item.appPath), item])).values()) {
|
|
191
|
+
if ((await readBundle(item.appPath))?.hash !== item.hash) throw new Error('旧远控组件已变化,未删除');
|
|
192
|
+
if ((await this.processes()).some(process => resolve(process.path) === resolve(item.path))) throw new Error('旧远控组件重新启动,未删除');
|
|
193
|
+
await this.unregister(item.appPath);
|
|
194
|
+
await rm(item.appPath, { recursive: true });
|
|
195
|
+
}
|
|
196
|
+
};
|
|
197
|
+
if (keepInstalled) {
|
|
149
198
|
await this.verify(this.appPath);
|
|
199
|
+
await retire();
|
|
150
200
|
await this.registerInstalled(installed.hash);
|
|
151
|
-
|
|
201
|
+
await cleanup();
|
|
152
202
|
return await use(this.appPath);
|
|
153
203
|
}
|
|
154
204
|
const staging = await mkdtemp(join(dirname(this.appPath), '.remote-helper-update-'));
|
|
@@ -158,6 +208,7 @@ export class MacRemoteHelperApp {
|
|
|
158
208
|
await cp(this.sourcePath, staged, { recursive: true, dereference: true });
|
|
159
209
|
await this.verify(staged);
|
|
160
210
|
if ((await readBundle(staged))?.hash !== source.hash) throw new Error('远控组件复制校验失败');
|
|
211
|
+
await retire();
|
|
161
212
|
if (existing) { await rename(this.appPath, backup); moved = true; }
|
|
162
213
|
try { await rename(staged, this.appPath); }
|
|
163
214
|
catch (error) {
|
|
@@ -167,12 +218,12 @@ export class MacRemoteHelperApp {
|
|
|
167
218
|
}
|
|
168
219
|
throw error;
|
|
169
220
|
}
|
|
170
|
-
this.updatePending = false;
|
|
171
221
|
await this.registerInstalled(source.hash);
|
|
172
222
|
if (moved) await rm(backup, { recursive: true });
|
|
223
|
+
await cleanup();
|
|
173
224
|
} finally {
|
|
174
|
-
// Backups are only
|
|
175
|
-
//
|
|
225
|
+
// Backups are removed only after replacement. Permission records and
|
|
226
|
+
// user data are not part of component cleanup.
|
|
176
227
|
await rm(staging, { recursive: true, force: true });
|
|
177
228
|
}
|
|
178
229
|
return await use(this.appPath);
|
|
@@ -103,7 +103,7 @@ export class RemoteAuthorization {
|
|
|
103
103
|
}
|
|
104
104
|
async status(local = true) {
|
|
105
105
|
const unlock = this.platform === 'win32' && this.system ? await this.system.probe().then(p => p.available ? 'available' : 'missing').catch(() => 'missing') : 'unsupported';
|
|
106
|
-
const component = local && this.platform
|
|
106
|
+
const component = local && ['darwin', 'win32'].includes(this.platform) ? await this.helper.describe?.() : undefined;
|
|
107
107
|
return { local, platform: this.platform, supported: this.supported, installed: this.supported && await this.helper.available(), enabled: this.enabled, screen: this.screen, accessibility: this.accessibility, online: this.online, error: this.error, locked: this.locked, unlock, viewerCount: this.viewerCount, controlState: this.controlState, ...(component ? { component } : {}) };
|
|
108
108
|
}
|
|
109
109
|
/** Lock / wake / unlock entry point for paired remote viewers (`browser:system`). */
|