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.
Files changed (114) hide show
  1. package/manifest.json +1 -1
  2. package/package.json +1 -1
  3. package/runtime/.next/BUILD_ID +1 -1
  4. package/runtime/.next/app-path-routes-manifest.json +1 -1
  5. package/runtime/.next/build-manifest.json +2 -2
  6. package/runtime/.next/prerender-manifest.json +1 -1
  7. package/runtime/.next/server/app/_not-found.html +1 -1
  8. package/runtime/.next/server/app/_not-found.rsc +1 -1
  9. package/runtime/.next/server/app/api/push/vapid.body +1 -1
  10. package/runtime/.next/server/app-paths-manifest.json +27 -27
  11. package/runtime/.next/server/pages/404.html +1 -1
  12. package/runtime/.next/server/pages/500.html +1 -1
  13. package/runtime/.next/server/server-reference-manifest.json +1 -1
  14. package/runtime/lib/remote-control/component-version.mjs +13 -0
  15. package/runtime/lib/remote-control/macos-helper-app.mjs +86 -35
  16. package/runtime/lib/remote-control/remote-authorization.mjs +1 -1
  17. package/runtime/lib/remote-control/windows-helper-app.mjs +201 -0
  18. package/runtime/lib/remote-control/windows-helper.mjs +12 -12
  19. package/runtime/native/agentroam-remote-component.json +1 -0
  20. package/runtime/node_modules/.package-lock.json +117 -117
  21. package/runtime/node_modules/asn1js/README.md +50 -32
  22. package/runtime/node_modules/asn1js/build/index.es.js +860 -353
  23. package/runtime/node_modules/asn1js/build/index.js +860 -353
  24. package/runtime/node_modules/asn1js/package.json +20 -17
  25. package/runtime/package-lock.json +134 -134
  26. package/runtime/webapp/dist/assets/{AiHubPane-Cu92elLn.js → AiHubPane-ChqCR_y0.js} +1 -1
  27. package/runtime/webapp/dist/assets/{App-CIoUFqUR.js → App-KFs0NxCF.js} +3 -3
  28. package/runtime/webapp/dist/assets/{BrowserLivePanel-BsthwY1a.js → BrowserLivePanel-CsScRv23.js} +1 -1
  29. package/runtime/webapp/dist/assets/{CollaborationDashboard-DG7Y0h1s.js → CollaborationDashboard-HF8ltJSE.js} +1 -1
  30. package/runtime/webapp/dist/assets/{CollaborationPage-DA902wqi.js → CollaborationPage-BgLQAQjm.js} +1 -1
  31. package/runtime/webapp/dist/assets/{FilePreview-CGjiY6Oh.js → FilePreview-DiHfafCP.js} +3 -3
  32. package/runtime/webapp/dist/assets/{FileTree-BC45MKRL.js → FileTree-PvPJgMg5.js} +1 -1
  33. package/runtime/webapp/dist/assets/{FlowStudioPane-9TrQcObf.js → FlowStudioPane-C5GM9JC-.js} +1 -1
  34. package/runtime/webapp/dist/assets/{RemoteDesktopPage-DMnDxASQ.js → RemoteDesktopPage-BDpFrmKy.js} +1 -1
  35. package/runtime/webapp/dist/assets/{TerminalPane-Ds9JxVMt.js → TerminalPane-D-Yj-chg.js} +1 -1
  36. package/runtime/webapp/dist/assets/{abnfDiagram-VCTEODGH-2YNJ76WG.js → abnfDiagram-VCTEODGH-Cw_sGqxb.js} +1 -1
  37. package/runtime/webapp/dist/assets/{arc-CcKuP0ye.js → arc-CCCMJyI8.js} +1 -1
  38. package/runtime/webapp/dist/assets/{architectureDiagram-5GKGNRK7-Bw49xhZn.js → architectureDiagram-5GKGNRK7-DlkkDiCM.js} +1 -1
  39. package/runtime/webapp/dist/assets/{artifact-links-OG5Ksgyd.js → artifact-links-BHjZ3nlR.js} +1 -1
  40. package/runtime/webapp/dist/assets/{blockDiagram-I7D4REHJ-Dqm_qfY7.js → blockDiagram-I7D4REHJ-Ci_dfCdR.js} +1 -1
  41. package/runtime/webapp/dist/assets/{c4Diagram-7LVT6UL2-CASULDQ9.js → c4Diagram-7LVT6UL2-DI10DGne.js} +1 -1
  42. package/runtime/webapp/dist/assets/channel-NIixBBfi.js +1 -0
  43. package/runtime/webapp/dist/assets/{chunk-2Q5K7J3B-yEnUXBZC.js → chunk-2Q5K7J3B-CT0BORhC.js} +1 -1
  44. package/runtime/webapp/dist/assets/{chunk-5VM5RSS4-Djs5IDQf.js → chunk-5VM5RSS4-hg-DY-5r.js} +1 -1
  45. package/runtime/webapp/dist/assets/{chunk-F27PBJKO-CdLh9ewF.js → chunk-F27PBJKO-DngPgytW.js} +1 -1
  46. package/runtime/webapp/dist/assets/{chunk-IMKFNOWR-I-pRrlxR.js → chunk-IMKFNOWR-5CWl6SEz.js} +1 -1
  47. package/runtime/webapp/dist/assets/{chunk-JWPE2WC7-BD2Gv69T.js → chunk-JWPE2WC7-D3j6hMZe.js} +1 -1
  48. package/runtime/webapp/dist/assets/{chunk-POPQ4Y6H-BhuerIJs.js → chunk-POPQ4Y6H-C8GSJtEY.js} +1 -1
  49. package/runtime/webapp/dist/assets/{chunk-SVP7TREG-AWEtUvjM.js → chunk-SVP7TREG-C5HQHSea.js} +1 -1
  50. package/runtime/webapp/dist/assets/{chunk-TICWLB2K-BiO_dQcW.js → chunk-TICWLB2K-B2AwbLWh.js} +1 -1
  51. package/runtime/webapp/dist/assets/{chunk-XXDRQBXY-zkjO5GCv.js → chunk-XXDRQBXY-_j-3Zf7f.js} +1 -1
  52. package/runtime/webapp/dist/assets/classDiagram-ZZMXUADV-CGa6hDyt.js +1 -0
  53. package/runtime/webapp/dist/assets/classDiagram-v2-VYDZK3BY-CGa6hDyt.js +1 -0
  54. package/runtime/webapp/dist/assets/{clipboard-CvdeFLww.js → clipboard-Cwf2Psxb.js} +1 -1
  55. package/runtime/webapp/dist/assets/{codeSyntax-ByG7L1fi.js → codeSyntax-Dnkv_4aa.js} +1 -1
  56. package/runtime/webapp/dist/assets/{collaboration-Be_9WEiY.js → collaboration-DHDzNCPO.js} +1 -1
  57. package/runtime/webapp/dist/assets/{cose-bilkent-JH36ORCC-CAxuJw-v.js → cose-bilkent-JH36ORCC-DTE5n0M0.js} +1 -1
  58. package/runtime/webapp/dist/assets/{cynefin-OW5HDTMX-hLWhgC57.js → cynefin-OW5HDTMX-mEPaurNe.js} +1 -1
  59. package/runtime/webapp/dist/assets/{cynefinDiagram-5FMLGOSQ-uelhySIx.js → cynefinDiagram-5FMLGOSQ-Ci281Jxk.js} +1 -1
  60. package/runtime/webapp/dist/assets/{dagre-GXQ25YYZ-DPO7KxIX.js → dagre-GXQ25YYZ-DTnnlrAX.js} +1 -1
  61. package/runtime/webapp/dist/assets/{diagram-S7CK7UJ4-B8jQa5Lm.js → diagram-S7CK7UJ4-2UuWvA7i.js} +1 -1
  62. package/runtime/webapp/dist/assets/{diagram-UQ7AKVKN-DdymRFf0.js → diagram-UQ7AKVKN-DaWqSqMe.js} +1 -1
  63. package/runtime/webapp/dist/assets/{diagram-VSXAHHWV-BHAv1Uzp.js → diagram-VSXAHHWV-DSZtnJiB.js} +1 -1
  64. package/runtime/webapp/dist/assets/{diagram-VX7I27RA-DlRev6E7.js → diagram-VX7I27RA-3T-5Agty.js} +1 -1
  65. package/runtime/webapp/dist/assets/{diagram-Z3DM3KII-DspqqK0b.js → diagram-Z3DM3KII-xmDPknxw.js} +1 -1
  66. package/runtime/webapp/dist/assets/{ebnfDiagram-PWID7BFC-BwStWg-O.js → ebnfDiagram-PWID7BFC-JQEYWOvZ.js} +1 -1
  67. package/runtime/webapp/dist/assets/{erDiagram-RLTQ6QDP-jUH66GeO.js → erDiagram-RLTQ6QDP-B6narI72.js} +1 -1
  68. package/runtime/webapp/dist/assets/{file-types-Bbr1oDan.js → file-types-Cs4tHNVf.js} +1 -1
  69. package/runtime/webapp/dist/assets/{flowDiagram-HODETNUW-b2JhyYZh.js → flowDiagram-HODETNUW-CK7DK3Gk.js} +1 -1
  70. package/runtime/webapp/dist/assets/{ganttDiagram-EL5Y4UJY-k6xQA8nM.js → ganttDiagram-EL5Y4UJY-BcDmlNwh.js} +1 -1
  71. package/runtime/webapp/dist/assets/{gitGraphDiagram-WWUBYQGX-Cg8O3XcX.js → gitGraphDiagram-WWUBYQGX-RdFAuhWE.js} +1 -1
  72. package/runtime/webapp/dist/assets/{index-CQepZy15.js → index-CFGPpdBY.js} +4 -4
  73. package/runtime/webapp/dist/assets/{infoDiagram-27XIBGKW-BEZuUiUV.js → infoDiagram-27XIBGKW-ElVqnYMm.js} +1 -1
  74. package/runtime/webapp/dist/assets/{ishikawaDiagram-5VMMS53U-D8cPBWA9.js → ishikawaDiagram-5VMMS53U-CTeLVA0R.js} +1 -1
  75. package/runtime/webapp/dist/assets/{journeyDiagram-3NMN7TZE-BiCIZoXl.js → journeyDiagram-3NMN7TZE-ByxrFxTv.js} +1 -1
  76. package/runtime/webapp/dist/assets/{kanban-definition-UXKFOSKX-DBGsdTe3.js → kanban-definition-UXKFOSKX-BqiTQeMN.js} +1 -1
  77. package/runtime/webapp/dist/assets/{layout-CESwBcoQ.js → layout-BZCWCzvh.js} +1 -1
  78. package/runtime/webapp/dist/assets/{linear-meicA11o.js → linear-DXrM6MzH.js} +1 -1
  79. package/runtime/webapp/dist/assets/{loader-circle-gCGomGeo.js → loader-circle-CRhbj_Kf.js} +1 -1
  80. package/runtime/webapp/dist/assets/{mermaid.core-BsSrKkY-.js → mermaid.core-DTDkmQ6m.js} +5 -5
  81. package/runtime/webapp/dist/assets/{mindmap-definition-YA3MSWOX-Ci76EHnj.js → mindmap-definition-YA3MSWOX-DqCPnFQf.js} +1 -1
  82. package/runtime/webapp/dist/assets/{page-CaBcebHM.js → page-qprcLw0l.js} +3 -3
  83. package/runtime/webapp/dist/assets/{pegDiagram-XKGWAZYB-BJ9fzsRy.js → pegDiagram-XKGWAZYB-D63yrQuq.js} +1 -1
  84. package/runtime/webapp/dist/assets/{pieDiagram-E7YTZNPT-Dr_g_s7V.js → pieDiagram-E7YTZNPT-DCzTnhwu.js} +1 -1
  85. package/runtime/webapp/dist/assets/{quadrantDiagram-AXDQQJYC-DRUIkYzL.js → quadrantDiagram-AXDQQJYC-B3Bb7MB-.js} +1 -1
  86. package/runtime/webapp/dist/assets/{railroadDiagram-O6MQD6OU-z_f3jTzL.js → railroadDiagram-O6MQD6OU-Cknh6Ei1.js} +1 -1
  87. package/runtime/webapp/dist/assets/{requirementDiagram-BXWQKSXE-BZ9192zw.js → requirementDiagram-BXWQKSXE-BYtbQioD.js} +1 -1
  88. package/runtime/webapp/dist/assets/{rotate-ccw-CU6Ofovh.js → rotate-ccw-B-nRINvb.js} +1 -1
  89. package/runtime/webapp/dist/assets/{rotate-cw-CI-k2c-H.js → rotate-cw-DVGqAFQz.js} +1 -1
  90. package/runtime/webapp/dist/assets/{sankeyDiagram-P5KCCOFB-D_bYtKCw.js → sankeyDiagram-P5KCCOFB-k_Vb3RIX.js} +1 -1
  91. package/runtime/webapp/dist/assets/{send-B_L3JVTV.js → send-C4oDLFFm.js} +1 -1
  92. package/runtime/webapp/dist/assets/{sequenceDiagram-WJ2MYXX4-BRPkyVwo.js → sequenceDiagram-WJ2MYXX4-Bc9Pcv0e.js} +1 -1
  93. package/runtime/webapp/dist/assets/{sizeCapture-INFHLROL-D0IXlEUO.js → sizeCapture-INFHLROL-0YYAh6Pi.js} +1 -1
  94. package/runtime/webapp/dist/assets/{smartphone-BaM-cilR.js → smartphone-0wJ6lsYD.js} +1 -1
  95. package/runtime/webapp/dist/assets/{stateDiagram-D77RDMKH-DOPcJmKu.js → stateDiagram-D77RDMKH-CIqzUhPM.js} +1 -1
  96. package/runtime/webapp/dist/assets/stateDiagram-v2-MP3YSRHH-DLwWK8OY.js +1 -0
  97. package/runtime/webapp/dist/assets/{swimlanes-42K2YHIH-DkWPxpZR.js → swimlanes-42K2YHIH-D1NpIz9q.js} +1 -1
  98. package/runtime/webapp/dist/assets/swimlanesDiagram-VR7AAH4N-C4Bc5Vem.js +8 -0
  99. package/runtime/webapp/dist/assets/{timeline-definition-24CTP7MA-DSSrwQZc.js → timeline-definition-24CTP7MA-Dxw_7egm.js} +1 -1
  100. package/runtime/webapp/dist/assets/{trash-2-CCZMuVfC.js → trash-2-CVH0gGlm.js} +1 -1
  101. package/runtime/webapp/dist/assets/{vennDiagram-4TSXK5OY-QRwqQ2e4.js → vennDiagram-4TSXK5OY-DhGn0ZVr.js} +1 -1
  102. package/runtime/webapp/dist/assets/{wardleyDiagram-VM6X3IG4-BOSS_TSY.js → wardleyDiagram-VM6X3IG4-CZmbL_Wo.js} +1 -1
  103. package/runtime/webapp/dist/assets/{web-DX0wjWUS.js → web-BK27Wi1i.js} +1 -1
  104. package/runtime/webapp/dist/assets/{web-ebzGWnSw.js → web-BPW_Ymbe.js} +1 -1
  105. package/runtime/webapp/dist/assets/{x-CbdLQm7m.js → x-Pd8Ro-NN.js} +1 -1
  106. package/runtime/webapp/dist/assets/{xychartDiagram-S5SC5T6Z-D9Rp3n6B.js → xychartDiagram-S5SC5T6Z-Cd1HAnc7.js} +1 -1
  107. package/runtime/webapp/dist/index.html +1 -1
  108. package/runtime/webapp/dist/assets/channel-xKavBx6z.js +0 -1
  109. package/runtime/webapp/dist/assets/classDiagram-ZZMXUADV-B6zj-gda.js +0 -1
  110. package/runtime/webapp/dist/assets/classDiagram-v2-VYDZK3BY-B6zj-gda.js +0 -1
  111. package/runtime/webapp/dist/assets/stateDiagram-v2-MP3YSRHH-CosKh0dU.js +0 -1
  112. package/runtime/webapp/dist/assets/swimlanesDiagram-VR7AAH4N-eLjpgpHz.js +0 -8
  113. /package/runtime/.next/static/{1ar2wXugWliv3TmyVCQiY → 3znfZrYYbguBkCBygHPcf}/_buildManifest.js +0 -0
  114. /package/runtime/.next/static/{1ar2wXugWliv3TmyVCQiY → 3znfZrYYbguBkCBygHPcf}/_ssgManifest.js +0 -0
package/manifest.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "packageVersion": "0.2.0-preview.56",
2
+ "packageVersion": "0.2.0-preview.57",
3
3
  "target": "windows-amd64",
4
4
  "schemaVersion": 2,
5
5
  "capabilities": {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentroam-runtime-win32-x64",
3
- "version": "0.2.0-preview.56",
3
+ "version": "0.2.0-preview.57",
4
4
  "description": "AgentRoam server runtime for Windows x64",
5
5
  "license": "MIT",
6
6
  "os": [
@@ -1 +1 @@
1
- 1ar2wXugWliv3TmyVCQiY
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/[runId]/events/route":"/api/flow/v1/runs/[runId]/events","/api/flow/v1/runs/[runId]/cancel/route":"/api/flow/v1/runs/[runId]/cancel","/api/flow/v1/runs/route":"/api/flow/v1/runs","/api/mcp/connect/route":"/api/mcp/connect","/api/mcp/servers/route":"/api/mcp/servers","/api/memory/[key]/route":"/api/memory/[key]","/api/memory/route":"/api/memory","/api/mcp/disconnect/route":"/api/mcp/disconnect","/api/plugins/load/route":"/api/plugins/load","/api/projects/[id]/route":"/api/projects/[id]","/api/projects/roots/route":"/api/projects/roots","/api/projects/check/route":"/api/projects/check","/api/push/unsubscribe/route":"/api/push/unsubscribe","/api/projects/directories/route":"/api/projects/directories","/api/push/vapid/route":"/api/push/vapid","/api/push/subscribe/route":"/api/push/subscribe","/api/remote-tools/register/route":"/api/remote-tools/register","/api/projects/route":"/api/projects","/api/sessions/[id]/fork-at/route":"/api/sessions/[id]/fork-at","/api/skills/route":"/api/skills","/api/tool-policies/[policyId]/route":"/api/tool-policies/[policyId]","/api/tools/route":"/api/tools","/api/web-auth/revoke-all/route":"/api/web-auth/revoke-all","/api/web-auth/logout/route":"/api/web-auth/logout","/api/web-auth/setup/route":"/api/web-auth/setup","/api/web-console/history/route":"/api/web-console/history","/api/web-console/preferences/route":"/api/web-console/preferences","/api/web-auth/login/route":"/api/web-auth/login","/api/agent-workspaces/[workspaceId]/sessions/route":"/api/agent-workspaces/[workspaceId]/sessions","/api/agent/abort/route":"/api/agent/abort","/api/agent-workspaces/route":"/api/agent-workspaces","/api/agent/answer/route":"/api/agent/answer","/api/agent/harness/status/route":"/api/agent/harness/status","/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/steer/route":"/api/agent/steer","/api/business/route":"/api/business","/api/agent/codex-sharing/route":"/api/agent/codex-sharing","/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/sessions/[id]/fork/route":"/api/sessions/[id]/fork","/api/agent/run/route":"/api/agent/run","/api/sessions/[id]/changes/route":"/api/sessions/[id]/changes","/api/sessions/[id]/handoff/route":"/api/sessions/[id]/handoff","/api/sessions/[id]/release/route":"/api/sessions/[id]/release","/api/client-logs/route":"/api/client-logs","/api/sessions/[id]/native-goal/route":"/api/sessions/[id]/native-goal","/api/sessions/[id]/query-index/route":"/api/sessions/[id]/query-index","/api/settings/route":"/api/settings","/api/sessions/[id]/tool-result/route":"/api/sessions/[id]/tool-result","/api/sessions/route":"/api/sessions","/api/sessions/[id]/thread-goal/route":"/api/sessions/[id]/thread-goal","/api/tool-policies/route":"/api/tool-policies","/api/update/status/route":"/api/update/status","/api/update/install/route":"/api/update/install","/api/update/check/route":"/api/update/check","/api/sessions/[id]/goals/route":"/api/sessions/[id]/goals","/api/web-auth/status/route":"/api/web-auth/status","/api/web-console/bootstrap/route":"/api/web-console/bootstrap","/api/sessions/[id]/route":"/api/sessions/[id]","/api/web-console/computer-settings/route":"/api/web-console/computer-settings","/api/web-console/device-state/route":"/api/web-console/device-state","/api/web-console/computers/route":"/api/web-console/computers","/web/page":"/web"}
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/1ar2wXugWliv3TmyVCQiY/_buildManifest.js",
9
- "static/1ar2wXugWliv3TmyVCQiY/_ssgManifest.js"
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/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},"/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}},"dynamicRoutes":{},"notFoundRoutes":[],"preview":{"previewModeId":"436bb2d66305425d515350bf83c189c6","previewModeSigningKey":"66688b79cfb8a19c488d1c4eeb79dae6ce91966400bf188ee216d0d7a9db3ed9","previewModeEncryptionKey":"1e0cc620a419c66ef819710c787ea469b20428d3c2d34ac917df672affa7b6ab"}}
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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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\":\"1ar2wXugWliv3TmyVCQiY\",\"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
+ <!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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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:["1ar2wXugWliv3TmyVCQiY",[[["",{"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"}]]]]]
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":"BIJQS7DoG9EMdXGnZpnlc_6FZPdczR6fmxV5n9HhzAB4shktAZA_VXj83XS19Ob3ZOjG11HR_rpme-X7rbhd-wM"}
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/projects/roots/route": "app/api/projects/roots/route.js",
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/push/unsubscribe/route": "app/api/push/unsubscribe/route.js",
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/skills/route": "app/api/skills/route.js",
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/revoke-all/route": "app/api/web-auth/revoke-all/route.js",
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/web-auth/login/route": "app/api/web-auth/login/route.js",
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/answer/route": "app/api/agent/answer/route.js",
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/settings/route": "app/api/settings/route.js",
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/update/status/route": "app/api/update/status/route.js",
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/bootstrap/route": "app/api/web-console/bootstrap/route.js",
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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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\":\"1ar2wXugWliv3TmyVCQiY\",\"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
+ <!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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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/1ar2wXugWliv3TmyVCQiY/_buildManifest.js" defer=""></script><script src="/_next/static/1ar2wXugWliv3TmyVCQiY/_ssgManifest.js" defer=""></script></head><body><div id="__next"><div style="font-family:system-ui,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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":"1ar2wXugWliv3TmyVCQiY","nextExport":true,"isFallback":false,"gip":true,"scriptLoader":[]}</script></body></html>
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,&quot;Segoe UI&quot;,Roboto,Helvetica,Arial,sans-serif,&quot;Apple Color Emoji&quot;,&quot;Segoe UI Emoji&quot;;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":"F7azUBvP/6FsIgNFPAyV03PFrMCqqkynxVpzTi4qSsU="}
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 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;
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'), 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;
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: this.updatePending, ...(this.updatePending ? { pendingVersion: source?.version } : {}) };
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
- 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);
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
- if (installed && used.includes(installedExecutable)) {
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
- this.updatePending = true;
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 removed after replacement; running old copies were
175
- // checked above. No permission records or user data are cleared.
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 === 'darwin' ? await this.helper.describe?.() : undefined;
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`). */