agentroam-runtime-darwin-arm64 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 (116) hide show
  1. package/manifest.json +2 -2
  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/Support.noindex/AgentRoam Remote Desktop.app/Contents/MacOS/agentroam-remote-desktop +0 -0
  20. package/runtime/native/Support.noindex/AgentRoam Remote Desktop.app/Contents/Resources/agentroam-component.json +1 -1
  21. package/runtime/native/Support.noindex/AgentRoam Remote Desktop.app/Contents/_CodeSignature/CodeResources +2 -2
  22. package/runtime/node_modules/.package-lock.json +117 -117
  23. package/runtime/node_modules/asn1js/README.md +50 -32
  24. package/runtime/node_modules/asn1js/build/index.es.js +860 -353
  25. package/runtime/node_modules/asn1js/build/index.js +860 -353
  26. package/runtime/node_modules/asn1js/package.json +20 -17
  27. package/runtime/package-lock.json +134 -134
  28. package/runtime/webapp/dist/assets/{AiHubPane-Cu92elLn.js → AiHubPane-ChqCR_y0.js} +1 -1
  29. package/runtime/webapp/dist/assets/{App-CIoUFqUR.js → App-KFs0NxCF.js} +3 -3
  30. package/runtime/webapp/dist/assets/{BrowserLivePanel-BsthwY1a.js → BrowserLivePanel-CsScRv23.js} +1 -1
  31. package/runtime/webapp/dist/assets/{CollaborationDashboard-DG7Y0h1s.js → CollaborationDashboard-HF8ltJSE.js} +1 -1
  32. package/runtime/webapp/dist/assets/{CollaborationPage-DA902wqi.js → CollaborationPage-BgLQAQjm.js} +1 -1
  33. package/runtime/webapp/dist/assets/{FilePreview-CGjiY6Oh.js → FilePreview-DiHfafCP.js} +3 -3
  34. package/runtime/webapp/dist/assets/{FileTree-BC45MKRL.js → FileTree-PvPJgMg5.js} +1 -1
  35. package/runtime/webapp/dist/assets/{FlowStudioPane-9TrQcObf.js → FlowStudioPane-C5GM9JC-.js} +1 -1
  36. package/runtime/webapp/dist/assets/{RemoteDesktopPage-DMnDxASQ.js → RemoteDesktopPage-BDpFrmKy.js} +1 -1
  37. package/runtime/webapp/dist/assets/{TerminalPane-Ds9JxVMt.js → TerminalPane-D-Yj-chg.js} +1 -1
  38. package/runtime/webapp/dist/assets/{abnfDiagram-VCTEODGH-2YNJ76WG.js → abnfDiagram-VCTEODGH-Cw_sGqxb.js} +1 -1
  39. package/runtime/webapp/dist/assets/{arc-CcKuP0ye.js → arc-CCCMJyI8.js} +1 -1
  40. package/runtime/webapp/dist/assets/{architectureDiagram-5GKGNRK7-Bw49xhZn.js → architectureDiagram-5GKGNRK7-DlkkDiCM.js} +1 -1
  41. package/runtime/webapp/dist/assets/{artifact-links-OG5Ksgyd.js → artifact-links-BHjZ3nlR.js} +1 -1
  42. package/runtime/webapp/dist/assets/{blockDiagram-I7D4REHJ-Dqm_qfY7.js → blockDiagram-I7D4REHJ-Ci_dfCdR.js} +1 -1
  43. package/runtime/webapp/dist/assets/{c4Diagram-7LVT6UL2-CASULDQ9.js → c4Diagram-7LVT6UL2-DI10DGne.js} +1 -1
  44. package/runtime/webapp/dist/assets/channel-NIixBBfi.js +1 -0
  45. package/runtime/webapp/dist/assets/{chunk-2Q5K7J3B-yEnUXBZC.js → chunk-2Q5K7J3B-CT0BORhC.js} +1 -1
  46. package/runtime/webapp/dist/assets/{chunk-5VM5RSS4-Djs5IDQf.js → chunk-5VM5RSS4-hg-DY-5r.js} +1 -1
  47. package/runtime/webapp/dist/assets/{chunk-F27PBJKO-CdLh9ewF.js → chunk-F27PBJKO-DngPgytW.js} +1 -1
  48. package/runtime/webapp/dist/assets/{chunk-IMKFNOWR-I-pRrlxR.js → chunk-IMKFNOWR-5CWl6SEz.js} +1 -1
  49. package/runtime/webapp/dist/assets/{chunk-JWPE2WC7-BD2Gv69T.js → chunk-JWPE2WC7-D3j6hMZe.js} +1 -1
  50. package/runtime/webapp/dist/assets/{chunk-POPQ4Y6H-BhuerIJs.js → chunk-POPQ4Y6H-C8GSJtEY.js} +1 -1
  51. package/runtime/webapp/dist/assets/{chunk-SVP7TREG-AWEtUvjM.js → chunk-SVP7TREG-C5HQHSea.js} +1 -1
  52. package/runtime/webapp/dist/assets/{chunk-TICWLB2K-BiO_dQcW.js → chunk-TICWLB2K-B2AwbLWh.js} +1 -1
  53. package/runtime/webapp/dist/assets/{chunk-XXDRQBXY-zkjO5GCv.js → chunk-XXDRQBXY-_j-3Zf7f.js} +1 -1
  54. package/runtime/webapp/dist/assets/classDiagram-ZZMXUADV-CGa6hDyt.js +1 -0
  55. package/runtime/webapp/dist/assets/classDiagram-v2-VYDZK3BY-CGa6hDyt.js +1 -0
  56. package/runtime/webapp/dist/assets/{clipboard-CvdeFLww.js → clipboard-Cwf2Psxb.js} +1 -1
  57. package/runtime/webapp/dist/assets/{codeSyntax-ByG7L1fi.js → codeSyntax-Dnkv_4aa.js} +1 -1
  58. package/runtime/webapp/dist/assets/{collaboration-Be_9WEiY.js → collaboration-DHDzNCPO.js} +1 -1
  59. package/runtime/webapp/dist/assets/{cose-bilkent-JH36ORCC-CAxuJw-v.js → cose-bilkent-JH36ORCC-DTE5n0M0.js} +1 -1
  60. package/runtime/webapp/dist/assets/{cynefin-OW5HDTMX-hLWhgC57.js → cynefin-OW5HDTMX-mEPaurNe.js} +1 -1
  61. package/runtime/webapp/dist/assets/{cynefinDiagram-5FMLGOSQ-uelhySIx.js → cynefinDiagram-5FMLGOSQ-Ci281Jxk.js} +1 -1
  62. package/runtime/webapp/dist/assets/{dagre-GXQ25YYZ-DPO7KxIX.js → dagre-GXQ25YYZ-DTnnlrAX.js} +1 -1
  63. package/runtime/webapp/dist/assets/{diagram-S7CK7UJ4-B8jQa5Lm.js → diagram-S7CK7UJ4-2UuWvA7i.js} +1 -1
  64. package/runtime/webapp/dist/assets/{diagram-UQ7AKVKN-DdymRFf0.js → diagram-UQ7AKVKN-DaWqSqMe.js} +1 -1
  65. package/runtime/webapp/dist/assets/{diagram-VSXAHHWV-BHAv1Uzp.js → diagram-VSXAHHWV-DSZtnJiB.js} +1 -1
  66. package/runtime/webapp/dist/assets/{diagram-VX7I27RA-DlRev6E7.js → diagram-VX7I27RA-3T-5Agty.js} +1 -1
  67. package/runtime/webapp/dist/assets/{diagram-Z3DM3KII-DspqqK0b.js → diagram-Z3DM3KII-xmDPknxw.js} +1 -1
  68. package/runtime/webapp/dist/assets/{ebnfDiagram-PWID7BFC-BwStWg-O.js → ebnfDiagram-PWID7BFC-JQEYWOvZ.js} +1 -1
  69. package/runtime/webapp/dist/assets/{erDiagram-RLTQ6QDP-jUH66GeO.js → erDiagram-RLTQ6QDP-B6narI72.js} +1 -1
  70. package/runtime/webapp/dist/assets/{file-types-Bbr1oDan.js → file-types-Cs4tHNVf.js} +1 -1
  71. package/runtime/webapp/dist/assets/{flowDiagram-HODETNUW-b2JhyYZh.js → flowDiagram-HODETNUW-CK7DK3Gk.js} +1 -1
  72. package/runtime/webapp/dist/assets/{ganttDiagram-EL5Y4UJY-k6xQA8nM.js → ganttDiagram-EL5Y4UJY-BcDmlNwh.js} +1 -1
  73. package/runtime/webapp/dist/assets/{gitGraphDiagram-WWUBYQGX-Cg8O3XcX.js → gitGraphDiagram-WWUBYQGX-RdFAuhWE.js} +1 -1
  74. package/runtime/webapp/dist/assets/{index-CQepZy15.js → index-CFGPpdBY.js} +4 -4
  75. package/runtime/webapp/dist/assets/{infoDiagram-27XIBGKW-BEZuUiUV.js → infoDiagram-27XIBGKW-ElVqnYMm.js} +1 -1
  76. package/runtime/webapp/dist/assets/{ishikawaDiagram-5VMMS53U-D8cPBWA9.js → ishikawaDiagram-5VMMS53U-CTeLVA0R.js} +1 -1
  77. package/runtime/webapp/dist/assets/{journeyDiagram-3NMN7TZE-BiCIZoXl.js → journeyDiagram-3NMN7TZE-ByxrFxTv.js} +1 -1
  78. package/runtime/webapp/dist/assets/{kanban-definition-UXKFOSKX-DBGsdTe3.js → kanban-definition-UXKFOSKX-BqiTQeMN.js} +1 -1
  79. package/runtime/webapp/dist/assets/{layout-CESwBcoQ.js → layout-BZCWCzvh.js} +1 -1
  80. package/runtime/webapp/dist/assets/{linear-meicA11o.js → linear-DXrM6MzH.js} +1 -1
  81. package/runtime/webapp/dist/assets/{loader-circle-gCGomGeo.js → loader-circle-CRhbj_Kf.js} +1 -1
  82. package/runtime/webapp/dist/assets/{mermaid.core-BsSrKkY-.js → mermaid.core-DTDkmQ6m.js} +5 -5
  83. package/runtime/webapp/dist/assets/{mindmap-definition-YA3MSWOX-Ci76EHnj.js → mindmap-definition-YA3MSWOX-DqCPnFQf.js} +1 -1
  84. package/runtime/webapp/dist/assets/{page-CaBcebHM.js → page-qprcLw0l.js} +3 -3
  85. package/runtime/webapp/dist/assets/{pegDiagram-XKGWAZYB-BJ9fzsRy.js → pegDiagram-XKGWAZYB-D63yrQuq.js} +1 -1
  86. package/runtime/webapp/dist/assets/{pieDiagram-E7YTZNPT-Dr_g_s7V.js → pieDiagram-E7YTZNPT-DCzTnhwu.js} +1 -1
  87. package/runtime/webapp/dist/assets/{quadrantDiagram-AXDQQJYC-DRUIkYzL.js → quadrantDiagram-AXDQQJYC-B3Bb7MB-.js} +1 -1
  88. package/runtime/webapp/dist/assets/{railroadDiagram-O6MQD6OU-z_f3jTzL.js → railroadDiagram-O6MQD6OU-Cknh6Ei1.js} +1 -1
  89. package/runtime/webapp/dist/assets/{requirementDiagram-BXWQKSXE-BZ9192zw.js → requirementDiagram-BXWQKSXE-BYtbQioD.js} +1 -1
  90. package/runtime/webapp/dist/assets/{rotate-ccw-CU6Ofovh.js → rotate-ccw-B-nRINvb.js} +1 -1
  91. package/runtime/webapp/dist/assets/{rotate-cw-CI-k2c-H.js → rotate-cw-DVGqAFQz.js} +1 -1
  92. package/runtime/webapp/dist/assets/{sankeyDiagram-P5KCCOFB-D_bYtKCw.js → sankeyDiagram-P5KCCOFB-k_Vb3RIX.js} +1 -1
  93. package/runtime/webapp/dist/assets/{send-B_L3JVTV.js → send-C4oDLFFm.js} +1 -1
  94. package/runtime/webapp/dist/assets/{sequenceDiagram-WJ2MYXX4-BRPkyVwo.js → sequenceDiagram-WJ2MYXX4-Bc9Pcv0e.js} +1 -1
  95. package/runtime/webapp/dist/assets/{sizeCapture-INFHLROL-D0IXlEUO.js → sizeCapture-INFHLROL-0YYAh6Pi.js} +1 -1
  96. package/runtime/webapp/dist/assets/{smartphone-BaM-cilR.js → smartphone-0wJ6lsYD.js} +1 -1
  97. package/runtime/webapp/dist/assets/{stateDiagram-D77RDMKH-DOPcJmKu.js → stateDiagram-D77RDMKH-CIqzUhPM.js} +1 -1
  98. package/runtime/webapp/dist/assets/stateDiagram-v2-MP3YSRHH-DLwWK8OY.js +1 -0
  99. package/runtime/webapp/dist/assets/{swimlanes-42K2YHIH-DkWPxpZR.js → swimlanes-42K2YHIH-D1NpIz9q.js} +1 -1
  100. package/runtime/webapp/dist/assets/swimlanesDiagram-VR7AAH4N-C4Bc5Vem.js +8 -0
  101. package/runtime/webapp/dist/assets/{timeline-definition-24CTP7MA-DSSrwQZc.js → timeline-definition-24CTP7MA-Dxw_7egm.js} +1 -1
  102. package/runtime/webapp/dist/assets/{trash-2-CCZMuVfC.js → trash-2-CVH0gGlm.js} +1 -1
  103. package/runtime/webapp/dist/assets/{vennDiagram-4TSXK5OY-QRwqQ2e4.js → vennDiagram-4TSXK5OY-DhGn0ZVr.js} +1 -1
  104. package/runtime/webapp/dist/assets/{wardleyDiagram-VM6X3IG4-BOSS_TSY.js → wardleyDiagram-VM6X3IG4-CZmbL_Wo.js} +1 -1
  105. package/runtime/webapp/dist/assets/{web-DX0wjWUS.js → web-BK27Wi1i.js} +1 -1
  106. package/runtime/webapp/dist/assets/{web-ebzGWnSw.js → web-BPW_Ymbe.js} +1 -1
  107. package/runtime/webapp/dist/assets/{x-CbdLQm7m.js → x-Pd8Ro-NN.js} +1 -1
  108. package/runtime/webapp/dist/assets/{xychartDiagram-S5SC5T6Z-D9Rp3n6B.js → xychartDiagram-S5SC5T6Z-Cd1HAnc7.js} +1 -1
  109. package/runtime/webapp/dist/index.html +1 -1
  110. package/runtime/webapp/dist/assets/channel-xKavBx6z.js +0 -1
  111. package/runtime/webapp/dist/assets/classDiagram-ZZMXUADV-B6zj-gda.js +0 -1
  112. package/runtime/webapp/dist/assets/classDiagram-v2-VYDZK3BY-B6zj-gda.js +0 -1
  113. package/runtime/webapp/dist/assets/stateDiagram-v2-MP3YSRHH-CosKh0dU.js +0 -1
  114. package/runtime/webapp/dist/assets/swimlanesDiagram-VR7AAH4N-eLjpgpHz.js +0 -8
  115. /package/runtime/.next/static/{1ar2wXugWliv3TmyVCQiY → 3znfZrYYbguBkCBygHPcf}/_buildManifest.js +0 -0
  116. /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": "darwin-arm64",
4
4
  "schemaVersion": 2,
5
5
  "capabilities": {
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "minimumNodeVersion": "22.22.0",
9
9
  "nativeFiles": {
10
- "native/Support.noindex/AgentRoam Remote Desktop.app/Contents/MacOS/agentroam-remote-desktop": "5dbd492bbc03b10ce3a6bef5587e257a422245f92f89610014b9d0ebeeb2f057",
10
+ "native/Support.noindex/AgentRoam Remote Desktop.app/Contents/MacOS/agentroam-remote-desktop": "9426b472920e536c9a5a7bf92e3e6703a4f10410d7ad5a6d5a8958f460953145",
11
11
  "node_modules/better-sqlite3/prebuilds/darwin-arm64.node": "98e0e8acd01c632fe5615243e1296af0372826f8783b18fc31c506f73c47459c",
12
12
  "node_modules/node-pty/prebuilds/darwin-arm64/pty.node": "e6457d66f45af3facd02920a5b212164e80fe0bb758afe6e6eab1eceeba3fc9a",
13
13
  "node_modules/node-pty/prebuilds/darwin-arm64/spawn-helper": "21c589109bca43e287df884f3c34ab888033a83927ea7d273949ac5030583f26"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentroam-runtime-darwin-arm64",
3
- "version": "0.2.0-preview.56",
3
+ "version": "0.2.0-preview.57",
4
4
  "description": "AgentRoam server runtime for macOS arm64",
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);