agentroam-runtime-win32-x64 0.2.0-preview.53 → 0.2.0-preview.55

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