@xopcai/xopc 0.0.272 → 0.0.274

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 (151) hide show
  1. package/README.md +1 -5
  2. package/README.zh-CN.md +1 -5
  3. package/dist/browser-ext/dist/assets/{auth-C1QI-uMG.js → auth-O8RiOF3l.js} +265 -100
  4. package/dist/browser-ext/dist/background.js +1 -22
  5. package/dist/browser-ext/dist/sidepanel.html +1 -1
  6. package/dist/browser-ext/dist/sidepanel.js +68 -36
  7. package/dist/browser-ext/manifest.json +1 -12
  8. package/dist/extensions/telegram/xopc.extension.json +1 -1
  9. package/dist/gateway/static/root/assets/{activity-store-DffqjeqQ.js → activity-store-SJZ5fS17.js} +1 -1
  10. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Cwj4HCYY.js → agent-avatar-dicebear-BckaANxj.js} +1 -1
  11. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-6CLfLxVc.js → agent-defaults-settings-panel-B8eyC6K1.js} +1 -1
  12. package/dist/gateway/static/root/assets/agents-CSWj_yo1.js +1 -0
  13. package/dist/gateway/static/root/assets/{api-CGLdye4i.js → api-CnJAVHBu.js} +1 -1
  14. package/dist/gateway/static/root/assets/app-link-BiBXVEvp.js +1 -0
  15. package/dist/gateway/static/root/assets/{app-management-settings-panel-BLujSbaw.js → app-management-settings-panel-DY-Zbgmt.js} +1 -1
  16. package/dist/gateway/static/root/assets/{appearance-settings-BXMcueb8.js → appearance-settings-CoJR7ZRl.js} +1 -1
  17. package/dist/gateway/static/root/assets/{apps-page-BEgy4hY3.js → apps-page-CSMvkuot.js} +1 -1
  18. package/dist/gateway/static/root/assets/{archive-plugin-D4bUampf.js → archive-plugin-BwAlRT53.js} +1 -1
  19. package/dist/gateway/static/root/assets/attachment-load-R835uxgL.js +1 -0
  20. package/dist/gateway/static/root/assets/{attachment-preview-renderer-BDTD8YUe.js → attachment-preview-renderer-CfEDFYPE.js} +1 -1
  21. package/dist/gateway/static/root/assets/attachment-process-heavy-C5CqLCsX.js +5 -0
  22. package/dist/gateway/static/root/assets/{automations-page-dQyolNmy.js → automations-page-BEZy0P_u.js} +1 -1
  23. package/dist/gateway/static/root/assets/automations-workspace-CpaI13J7.js +6 -0
  24. package/dist/gateway/static/root/assets/{binary-plugins-bbvp81h2.js → binary-plugins-CESFx3yb.js} +2 -2
  25. package/dist/gateway/static/root/assets/{block-editor-C8e6Wri4.js → block-editor-DDJcf2wR.js} +3 -3
  26. package/dist/gateway/static/root/assets/{browser-automation-inputs-oJWJtQa6.js → browser-automation-inputs-DGCqIPXT.js} +1 -1
  27. package/dist/gateway/static/root/assets/{browser-automations-page-CAcJQSjN.js → browser-automations-page-BH4lSfr5.js} +2 -2
  28. package/dist/gateway/static/root/assets/browser-settings-page-CbTooPd2.js +8 -0
  29. package/dist/gateway/static/root/assets/capabilities-settings-panel-C4LZWHhv.js +8 -0
  30. package/dist/gateway/static/root/assets/channels-settings-BAljmSa7.js +1 -0
  31. package/dist/gateway/static/root/assets/{channels-status-swr-CfOPNnVr.js → channels-status-swr-BTT2sIGg.js} +1 -1
  32. package/dist/gateway/static/root/assets/{chat-terminal-dock-9ZOl92kh.js → chat-terminal-dock-D8U97O95.js} +2 -2
  33. package/dist/gateway/static/root/assets/connectors-page-CVRMjNNr.js +2 -0
  34. package/dist/gateway/static/root/assets/{date-picker-Dj6FRLF9.js → date-picker-7sDSMswL.js} +1 -1
  35. package/dist/gateway/static/root/assets/{dependency-picker-D1q89tVc.js → dependency-picker-DMIC86ZW.js} +1 -1
  36. package/dist/gateway/static/root/assets/{desktop-pet-DfqZBvhp.js → desktop-pet-BtdiY5jK.js} +1 -1
  37. package/dist/gateway/static/root/assets/{desktop-pet-settings-HCEh2MOm.js → desktop-pet-settings-D_B8azDH.js} +1 -1
  38. package/dist/gateway/static/root/assets/device-pairing-wizard-Dmh3Nh4d.js +1 -0
  39. package/dist/gateway/static/root/assets/excel-worksheet-utils-DpdB-DjU.js +1 -0
  40. package/dist/gateway/static/root/assets/{extension-debug-page-C8cAWVoK.js → extension-debug-page-CoFKb01d.js} +1 -1
  41. package/dist/gateway/static/root/assets/{extension-page-5N87Vaym.js → extension-page-CEkNsCAY.js} +1 -1
  42. package/dist/gateway/static/root/assets/{extension-settings-page-D85SAUFP.js → extension-settings-page-Bi2R8P5j.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-config-swr-BjsDnB_n.js → gateway-config-swr-cd8owslz.js} +1 -1
  44. package/dist/gateway/static/root/assets/gateway-settings-q9p3sduo.js +1 -0
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-BIf0eLWX.js → gateway-startup-retry-CVTa5HSS.js} +1 -1
  46. package/dist/gateway/static/root/assets/{heartbeat-settings-BpDWGE1a.js → heartbeat-settings-DQtelFiU.js} +1 -1
  47. package/dist/gateway/static/root/assets/home-page-COpGnTFZ.js +1 -0
  48. package/dist/gateway/static/root/assets/{image-generation-api-1m8xTVS_.js → image-generation-api-DtMRG1oF.js} +1 -1
  49. package/dist/gateway/static/root/assets/{index-C6PmD0cK.js → index-SxqsTD4i.js} +35 -35
  50. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Byy8mCSq.js → keyboard-shortcuts-settings-BuYmZS1K.js} +1 -1
  51. package/dist/gateway/static/root/assets/local-app-workbench-page-DV_17Zxc.js +2 -0
  52. package/dist/gateway/static/root/assets/{local-apps-page-BPo0wBgM.js → local-apps-page-CExnZyGZ.js} +1 -1
  53. package/dist/gateway/static/root/assets/{locale-store-CRNble2Z.js → locale-store-BkJ7g35d.js} +1 -1
  54. package/dist/gateway/static/root/assets/{logs-page-X5FdLlXK.js → logs-page-CA5ArMoN.js} +2 -2
  55. package/dist/gateway/static/root/assets/management-settings-1UiJPrkX.js +1 -0
  56. package/dist/gateway/static/root/assets/markdown-view-B2IR4E2r.js +201 -0
  57. package/dist/gateway/static/root/assets/{media-plugins-Bzka9qXu.js → media-plugins-nNFOk9HL.js} +1 -1
  58. package/dist/gateway/static/root/assets/{messages-DH_HCgmw.js → messages-BGc-OJWg.js} +2 -2
  59. package/dist/gateway/static/root/assets/note-detail-panel-B5OQ0fBY.js +5 -0
  60. package/dist/gateway/static/root/assets/notes-page-CVPPMVDl.js +8 -0
  61. package/dist/gateway/static/root/assets/{page-tabs-Ys0p65Lt.js → page-tabs-CRombigq.js} +1 -1
  62. package/dist/gateway/static/root/assets/{preview-open-alternatives-iknB5xEp.js → preview-open-alternatives-Bcuj43lk.js} +1 -1
  63. package/dist/gateway/static/root/assets/{proactive-card-BPZDgNNR.js → proactive-card-Cb3Xeoyx.js} +1 -1
  64. package/dist/gateway/static/root/assets/{proactive-page-CxdZR-p2.js → proactive-page-TbF9KVpm.js} +1 -1
  65. package/dist/gateway/static/root/assets/{product-open-page-W1o3f-kz.js → product-open-page-DsQcgZkI.js} +1 -1
  66. package/dist/gateway/static/root/assets/project-detail-page-B9OQ2l9x.js +1 -0
  67. package/dist/gateway/static/root/assets/projects-page-DCqSTNkY.js +1 -0
  68. package/dist/gateway/static/root/assets/{registry-api-DmYFpjsH.js → registry-api-CTq8EECj.js} +1 -1
  69. package/dist/gateway/static/root/assets/remote-access-hub-d9Fg70gX.js +1 -0
  70. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DP1XyYO8.js → runtime-tools-settings-panel-BudlvBu-.js} +2 -2
  71. package/dist/gateway/static/root/assets/{schema-form-BMYKdzsH.js → schema-form-Ch3MEX4h.js} +1 -1
  72. package/dist/gateway/static/root/assets/sessions-page-D8RiQ-ag.js +1 -0
  73. package/dist/gateway/static/root/assets/settings-advanced-gate-DVH_l6Hr.js +1 -0
  74. package/dist/gateway/static/root/assets/{settings-form-section-2LGjz7bu.js → settings-form-section-CIA1AA-A.js} +1 -1
  75. package/dist/gateway/static/root/assets/{settings-page-7DjpC9_C.js → settings-page-B0Khoduh.js} +1 -1
  76. package/dist/gateway/static/root/assets/{setup-status-panel-Dj9jFWJt.js → setup-status-panel-COJFl4N_.js} +1 -1
  77. package/dist/gateway/static/root/assets/share-preview-page-Cj9XWg-X.js +2 -0
  78. package/dist/gateway/static/root/assets/shares-settings-_OuE6A0G.js +1 -0
  79. package/dist/gateway/static/root/assets/skill-reload-api-BM4Ezjbx.js +1 -0
  80. package/dist/gateway/static/root/assets/{skills-page-DNEScMZH.js → skills-page-Dyh1kf9t.js} +1 -1
  81. package/dist/gateway/static/root/assets/{skills-page.utils-q88l65YU.js → skills-page.utils-DsQZkMti.js} +1 -1
  82. package/dist/gateway/static/root/assets/{system-settings-panel-8NIssGKj.js → system-settings-panel-BSho_Tpk.js} +1 -1
  83. package/dist/gateway/static/root/assets/task-detail-page-B5HWM12k.js +1 -0
  84. package/dist/gateway/static/root/assets/{theme-store-BXZG3S25.js → theme-store-mV6Cm2vj.js} +1 -1
  85. package/dist/gateway/static/root/assets/{tunnel-api-CWsRPM84.js → tunnel-api-4DUHxSQG.js} +1 -1
  86. package/dist/gateway/static/root/assets/{use-autosave-BwQuoTQU.js → use-autosave-BG8Yx7hj.js} +1 -1
  87. package/dist/gateway/static/root/assets/user-model-page-IjVyv5jj.js +2 -0
  88. package/dist/gateway/static/root/assets/{voice-api-key-field-Bd03Ic0s.js → voice-api-key-field-DYXwDhHq.js} +1 -1
  89. package/dist/gateway/static/root/assets/{voice-config-api-gggUp3u9.js → voice-config-api-D3DdcH4H.js} +1 -1
  90. package/dist/gateway/static/root/assets/{work-discovery-overlay-DF8PR_pK.js → work-discovery-overlay-CQqjzaRo.js} +1 -1
  91. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BiAAWlir.js → workflow-run-setup-panel-C5H-Fd-U.js} +2 -2
  92. package/dist/gateway/static/root/assets/workflows-page-D1hMyPsY.js +6 -0
  93. package/dist/gateway/static/root/index.html +10 -9
  94. package/dist/package.js +1 -1
  95. package/dist/packages/gateway-contract/src/device-pairing.js +41 -2
  96. package/dist/src/agent/service.js +20 -16
  97. package/dist/src/browser/native-messaging-host.d.ts +1 -1
  98. package/dist/src/browser/native-messaging-host.js +3 -2
  99. package/dist/src/browser/providers/browser-ext-install.d.ts +6 -0
  100. package/dist/src/browser/providers/browser-ext-install.js +16 -1
  101. package/dist/src/cli/commands/gateway/run-foreground.js +8 -5
  102. package/dist/src/cli/commands/gateway/service.js +4 -3
  103. package/dist/src/cli/commands/gateway/token.js +28 -1
  104. package/dist/src/gateway/device-routes.js +4 -3
  105. package/dist/src/gateway/hono/app.js +5 -2
  106. package/dist/src/gateway/hono/routes/agent-stream.js +1 -1
  107. package/dist/src/gateway/hono/routes/browser.js +26 -0
  108. package/dist/src/gateway/hono/routes/device-pairing-approval.d.ts +9 -2
  109. package/dist/src/gateway/hono/routes/device-pairing-approval.js +50 -10
  110. package/dist/src/gateway/hono/routes/devices.d.ts +2 -1
  111. package/dist/src/gateway/hono/routes/devices.js +33 -16
  112. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +1 -1
  113. package/dist/src/gateway/hono/routes/session-input-handler.js +1 -1
  114. package/dist/src/gateway/hono/routes/side-chats.js +1 -1
  115. package/dist/src/gateway/hono/routes/tunnel.js +34 -2
  116. package/dist/src/gateway/rate-limit/buckets.js +2 -1
  117. package/dist/src/gateway/service/run-gateway-agent.js +1 -1
  118. package/dist/src/storage/sqlite/device-pairing-approval.js +4 -4
  119. package/dist/src/tui/tui.js +1 -1
  120. package/dist/src/tunnel/xopc-cloud-registration.d.ts +5 -0
  121. package/dist/src/tunnel/xopc-cloud-registration.js +17 -11
  122. package/package.json +3 -3
  123. package/dist/browser-ext/dist/pairing-handoff.js +0 -51
  124. package/dist/gateway/static/root/assets/agents-B6mu64fY.js +0 -1
  125. package/dist/gateway/static/root/assets/attachment-load-CBGNA2Ys.js +0 -2
  126. package/dist/gateway/static/root/assets/attachment-process-heavy-B2_kr5EA.js +0 -11
  127. package/dist/gateway/static/root/assets/automations-workspace-DxRFrmrV.js +0 -6
  128. package/dist/gateway/static/root/assets/browser-settings-page-TLAlqcPo.js +0 -8
  129. package/dist/gateway/static/root/assets/capabilities-settings-panel-z-K_jrZz.js +0 -8
  130. package/dist/gateway/static/root/assets/channels-settings-Dzrk33aB.js +0 -1
  131. package/dist/gateway/static/root/assets/connectors-page-B1dIoRNi.js +0 -2
  132. package/dist/gateway/static/root/assets/device-pairing-wizard-CPth92s6.js +0 -1
  133. package/dist/gateway/static/root/assets/excel-worksheet-utils-EyvwNT4X.js +0 -1
  134. package/dist/gateway/static/root/assets/gateway-settings-Dqx8PmcT.js +0 -1
  135. package/dist/gateway/static/root/assets/home-page-DJaqpC8-.js +0 -1
  136. package/dist/gateway/static/root/assets/local-app-workbench-page-l2AEiG2C.js +0 -2
  137. package/dist/gateway/static/root/assets/management-settings-DT6NoIjm.js +0 -1
  138. package/dist/gateway/static/root/assets/markdown-view-AglreSOj.js +0 -201
  139. package/dist/gateway/static/root/assets/note-detail-panel-BUJPoaGZ.js +0 -5
  140. package/dist/gateway/static/root/assets/notes-page-BwFpWRuo.js +0 -8
  141. package/dist/gateway/static/root/assets/project-detail-page-BU1RKAcy.js +0 -1
  142. package/dist/gateway/static/root/assets/projects-page-z0X0tL8G.js +0 -1
  143. package/dist/gateway/static/root/assets/remote-access-hub-NNTut2I8.js +0 -1
  144. package/dist/gateway/static/root/assets/sessions-page-B6SsHlz5.js +0 -1
  145. package/dist/gateway/static/root/assets/settings-advanced-gate-BQu8bAcN.js +0 -1
  146. package/dist/gateway/static/root/assets/share-preview-page-BxYdSi8c.js +0 -2
  147. package/dist/gateway/static/root/assets/shares-settings-CMqE0KuK.js +0 -1
  148. package/dist/gateway/static/root/assets/skill-reload-api-BXqSJymN.js +0 -1
  149. package/dist/gateway/static/root/assets/task-detail-page-L6dp9v2y.js +0 -1
  150. package/dist/gateway/static/root/assets/user-model-page-D4BucMrZ.js +0 -2
  151. package/dist/gateway/static/root/assets/workflows-page-DryKUMfA.js +0 -6
@@ -1,4 +1,4 @@
1
- import { R as RealtimeClient, j as gatewayFetch, b as activeTabId, r as readBrowserOutbox, w as writeBrowserOutbox, g as deleteBrowserOutbox, f as currentTabDescriptor, T as TAB_BINDING_PREFIX, k as getAccessProfile, q as runWithTabSiteAccess, P as PENDING_CONTEXT_KEY, d as captureTabWithPermission, p as pairGateway, s as setAutoConnectEnabled, t as takePendingPairingLink, m as readProfile, h as discoverLocalGateway, a as PENDING_PAIRING_LINK_KEY, o as revokeAndForgetProfile } from './assets/auth-C1QI-uMG.js';
1
+ import { R as RealtimeClient, j as gatewayFetch, a as activeTabId, r as readBrowserOutbox, w as writeBrowserOutbox, g as deleteBrowserOutbox, f as currentTabDescriptor, T as TAB_BINDING_PREFIX, k as getAccessProfile, q as runWithTabSiteAccess, P as PENDING_CONTEXT_KEY, d as captureTabWithPermission, p as pairGateway, s as setAutoConnectEnabled, l as readPendingBrowserPairing, m as readProfile, h as discoverLocalGateway, c as cancelPendingBrowserPairing, o as revokeAndForgetProfile } from './assets/auth-O8RiOF3l.js';
2
2
 
3
3
  true &&(function polyfill() {
4
4
  const relList = document.createElement("link").relList;
@@ -27544,29 +27544,51 @@ function watchSidePanelTheme(gatewayUrl) {
27544
27544
  async function reconnectBrowserBridge() {
27545
27545
  await chrome.runtime.sendMessage({ type: "browser/reconnect" }).catch(() => void 0);
27546
27546
  }
27547
+ function pairingErrorMessage(cause) {
27548
+ const message = cause instanceof Error ? cause.message : String(cause);
27549
+ if (message === "Gateway site permission was not granted") {
27550
+ return "Chrome needs access to the Gateway address. Select Connect again and allow the site permission.";
27551
+ }
27552
+ if (message === "PAIRING_EXPIRED" || message === "Pairing expired" || message === "Pairing invitation has expired") {
27553
+ return "This invitation expired. Create and copy a new invitation from Device access.";
27554
+ }
27555
+ if (message === "PAIRING_DEVICE_MISMATCH") {
27556
+ return "This invitation was created for a phone. Create a browser invitation instead.";
27557
+ }
27558
+ if (message === "No Gateway route could be reached") {
27559
+ return "None of the Gateway addresses responded. Check that the Gateway is online and its secure connection is active.";
27560
+ }
27561
+ if (message.startsWith("PAIRING_ROUTE_PERMISSION_REQUIRED:")) {
27562
+ return "The current Gateway address did not respond. Select Continue to allow the next address listed in the invitation.";
27563
+ }
27564
+ return message;
27565
+ }
27547
27566
  function SidePanelApp() {
27548
27567
  const [profile, setProfile] = reactExports.useState();
27549
- const [pairingLink, setPairingLink] = reactExports.useState("");
27568
+ const [invitation, setInvitation] = reactExports.useState("");
27550
27569
  const [confirmationCode, setConfirmationCode] = reactExports.useState("");
27551
27570
  const [state, setState] = reactExports.useState("loading");
27552
27571
  const [error, setError] = reactExports.useState("");
27553
- const [localPairingLink, setLocalPairingLink] = reactExports.useState("");
27572
+ const [localInvitation, setLocalInvitation] = reactExports.useState("");
27573
+ const [nextOrigin, setNextOrigin] = reactExports.useState();
27554
27574
  const initializationStarted = reactExports.useRef(false);
27555
27575
  const pairingStarted = reactExports.useRef(false);
27556
- const connect = reactExports.useCallback(async (link) => {
27576
+ const connect = reactExports.useCallback(async (value, origin) => {
27557
27577
  if (pairingStarted.current) return;
27558
27578
  pairingStarted.current = true;
27559
27579
  setState("pairing");
27560
27580
  setError("");
27561
- setPairingLink(link);
27581
+ setConfirmationCode("");
27582
+ setInvitation(value);
27562
27583
  try {
27563
- const paired = await pairGateway(link, setConfirmationCode);
27584
+ const paired = await pairGateway(value, setConfirmationCode, origin);
27564
27585
  await setAutoConnectEnabled(true);
27565
27586
  await reconnectBrowserBridge();
27566
27587
  setProfile(paired);
27567
27588
  setState("online");
27568
27589
  } catch (cause) {
27569
- setError(cause instanceof Error ? cause.message : String(cause));
27590
+ setError(pairingErrorMessage(cause));
27591
+ setNextOrigin((await readPendingBrowserPairing())?.nextOrigin);
27570
27592
  setState("unpaired");
27571
27593
  } finally {
27572
27594
  pairingStarted.current = false;
@@ -27576,11 +27598,6 @@ function SidePanelApp() {
27576
27598
  if (initializationStarted.current) return;
27577
27599
  initializationStarted.current = true;
27578
27600
  void (async () => {
27579
- const handedOff = await takePendingPairingLink();
27580
- if (handedOff) {
27581
- await connect(handedOff);
27582
- return;
27583
- }
27584
27601
  const stored = await readProfile();
27585
27602
  if (stored) {
27586
27603
  await reconnectBrowserBridge();
@@ -27588,30 +27605,28 @@ function SidePanelApp() {
27588
27605
  setState("online");
27589
27606
  return;
27590
27607
  }
27608
+ const pending = await readPendingBrowserPairing();
27609
+ if (pending) {
27610
+ setInvitation(pending.invitation);
27611
+ setNextOrigin(pending.nextOrigin);
27612
+ if (!pending.nextOrigin) await connect(pending.invitation);
27613
+ else setState("unpaired");
27614
+ return;
27615
+ }
27591
27616
  const local = await discoverLocalGateway();
27592
27617
  if (!local) {
27593
27618
  setState("unpaired");
27594
27619
  return;
27595
27620
  }
27596
- setLocalPairingLink(local.pairingLink);
27597
- await connect(local.pairingLink);
27621
+ setLocalInvitation(local.invitation);
27622
+ await connect(local.invitation);
27598
27623
  })();
27599
27624
  }, [connect]);
27600
- reactExports.useEffect(() => {
27601
- const handleStorageChange = (changes, area) => {
27602
- if (area !== "session" || !changes[PENDING_PAIRING_LINK_KEY]?.newValue) return;
27603
- void takePendingPairingLink().then((link) => {
27604
- if (link) void connect(link);
27605
- });
27606
- };
27607
- chrome.storage.onChanged.addListener(handleStorageChange);
27608
- return () => chrome.storage.onChanged.removeListener(handleStorageChange);
27609
- }, [connect]);
27610
27625
  reactExports.useEffect(() => watchSidePanelTheme(profile?.gatewayUrl), [profile?.gatewayUrl]);
27611
27626
  async function disconnect() {
27612
27627
  await revokeAndForgetProfile();
27613
27628
  setProfile(void 0);
27614
- setLocalPairingLink("");
27629
+ setLocalInvitation("");
27615
27630
  setState("unpaired");
27616
27631
  }
27617
27632
  async function connectLocalGateway() {
@@ -27620,8 +27635,22 @@ function SidePanelApp() {
27620
27635
  try {
27621
27636
  const local = await discoverLocalGateway({ force: true });
27622
27637
  if (!local) throw new Error("No local xopc Gateway was found");
27623
- setLocalPairingLink(local.pairingLink);
27624
- await connect(local.pairingLink);
27638
+ setLocalInvitation(local.invitation);
27639
+ await connect(local.invitation);
27640
+ } catch (cause) {
27641
+ setError(cause instanceof Error ? cause.message : String(cause));
27642
+ setState("unpaired");
27643
+ }
27644
+ }
27645
+ async function cancelPairing() {
27646
+ setState("pairing");
27647
+ setError("");
27648
+ try {
27649
+ await cancelPendingBrowserPairing();
27650
+ setInvitation("");
27651
+ setNextOrigin(void 0);
27652
+ setConfirmationCode("");
27653
+ setState("unpaired");
27625
27654
  } catch (cause) {
27626
27655
  setError(cause instanceof Error ? cause.message : String(cause));
27627
27656
  setState("unpaired");
@@ -27641,26 +27670,29 @@ function SidePanelApp() {
27641
27670
  state !== "online" ? /* @__PURE__ */ jsxRuntimeExports.jsxs("section", { className: "center", children: [
27642
27671
  state === "loading" ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "muted", children: "Loading…" }) : null,
27643
27672
  state === "unpaired" || state === "pairing" ? /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "card", children: [
27644
- /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { children: "Connect to xopc" }),
27645
- localPairingLink ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
27673
+ /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { children: "Connect a Gateway" }),
27674
+ localInvitation ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
27646
27675
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "muted", children: "A local xopc Gateway was found. xopc connects automatically on this computer." }),
27647
- /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "primary local-connect", onClick: () => void connect(localPairingLink), disabled: state === "pairing", children: state === "pairing" ? "Connecting…" : "Retry local connection" }),
27648
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pairing-divider", children: "or use a pairing link" })
27676
+ /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "primary local-connect", onClick: () => void connect(localInvitation), disabled: state === "pairing", children: state === "pairing" ? "Connecting…" : "Retry local connection" }),
27677
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pairing-divider", children: "or paste an invitation" })
27649
27678
  ] }) : /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
27650
- /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "muted", children: "Connect to a local Gateway, or paste a pairing link for another Gateway." }),
27679
+ /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "muted", children: "Connect locally, or paste the one-time invitation copied from Device access." }),
27651
27680
  /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "primary local-connect", onClick: () => void connectLocalGateway(), disabled: state === "pairing", children: state === "pairing" ? "Connecting…" : "Connect local Gateway" }),
27652
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pairing-divider", children: "or use a pairing link" })
27681
+ /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "pairing-divider", children: "or paste an invitation" })
27653
27682
  ] }),
27654
27683
  /* @__PURE__ */ jsxRuntimeExports.jsxs("label", { className: "field", children: [
27655
- "Pairing link",
27656
- /* @__PURE__ */ jsxRuntimeExports.jsx("textarea", { rows: 4, value: pairingLink, onChange: (event) => setPairingLink(event.target.value), disabled: state === "pairing" })
27684
+ "One-time invitation",
27685
+ /* @__PURE__ */ jsxRuntimeExports.jsx("textarea", { rows: 4, value: invitation, onChange: (event) => setInvitation(event.target.value), disabled: state === "pairing" })
27657
27686
  ] }),
27658
27687
  confirmationCode ? /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
27659
27688
  /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "muted", children: "Confirm this code in the Gateway:" }),
27660
27689
  /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "approval-code", children: confirmationCode })
27661
27690
  ] }) : null,
27662
27691
  error ? /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "error-text", children: error }) : null,
27663
- /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "actions", children: /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "primary", onClick: () => void connect(pairingLink), disabled: !pairingLink.trim() || state === "pairing", children: state === "pairing" ? "Waiting for approval…" : "Connect" }) })
27692
+ /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "actions", children: [
27693
+ /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "primary", onClick: () => void connect(invitation, nextOrigin), disabled: !invitation.trim() || state === "pairing", children: state === "pairing" ? "Waiting for approval…" : nextOrigin ? `Allow ${new URL(nextOrigin).host} and continue` : "Connect" }),
27694
+ invitation ? /* @__PURE__ */ jsxRuntimeExports.jsx("button", { onClick: () => void cancelPairing(), disabled: state === "pairing", children: "Cancel pairing" }) : null
27695
+ ] })
27664
27696
  ] }) : null
27665
27697
  ] }) : /* @__PURE__ */ jsxRuntimeExports.jsx(ChatPanel, {}),
27666
27698
  state === "online" && profile ? /* @__PURE__ */ jsxRuntimeExports.jsx("button", { className: "disconnect-link", onClick: disconnect, title: `Disconnect ${profile.gatewayName}`, children: "Disconnect" }) : null
@@ -2,7 +2,7 @@
2
2
  "manifest_version": 3,
3
3
  "minimum_chrome_version": "120",
4
4
  "name": "xopc",
5
- "version": "0.0.272",
5
+ "version": "0.0.274",
6
6
  "description": "Chat with xopc and explicitly share or control the current page.",
7
7
  "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAqnpr4vpLC/nmvy+wiOWk3SWlp2nEZkFijfk8ivGw7StNZgCK90nOMvwhdEtlkk3GOWDvdVnq8HxCsM3UNQ8FnGUyerpH1FJXqXuradxeHf8ZxFjiQU/mIWfnKbUuONWQORon3/pigyoXoK/VUXgg0Wbm/rbVwsS0bv+25R6m+mZgBspOLeKuoH7ivhL+48WV6POtMBsFPZweY26477EM7ukh+56Ff5ENevB8ymxBBn7qK5ZoeZd2a23U8ioX5TsHfe6fnrjitPWjIxD8G0NoKQxcaa/Mo+xs+T6UiLKxP0wjz5bm7jB5H+CXtkRJqzBWUB0h+RSLJckzZfA8BAJrRwIDAQAB",
8
8
  "permissions": [
@@ -28,17 +28,6 @@
28
28
  "service_worker": "dist/background.js",
29
29
  "type": "module"
30
30
  },
31
- "content_scripts": [
32
- {
33
- "matches": [
34
- "https://link.xopc.ai/connect*"
35
- ],
36
- "js": [
37
- "dist/pairing-handoff.js"
38
- ],
39
- "run_at": "document_idle"
40
- }
41
- ],
42
31
  "side_panel": {
43
32
  "default_path": "dist/sidepanel.html"
44
33
  },
@@ -2,7 +2,7 @@
2
2
  "id": "telegram",
3
3
  "name": "Telegram Channel",
4
4
  "description": "Bundled Telegram Bot channel (private workspace sources; ships inside @xopcai/xopc dist/)",
5
- "version": "0.0.272",
5
+ "version": "0.0.274",
6
6
  "kind": "channel",
7
7
  "main": "src/index.js",
8
8
  "channels": [
@@ -1 +1 @@
1
- import{p as e}from"./locale-store-CRNble2Z.js";var t=`xopc.activity-center.v1`,n=80,r=720*60*60*1e3;function i(e){return e===`error`?`failed`:e===`warning`?`attention`:`done`}function a(){if(!(typeof window>`u`))return window.location.hash.replace(/^#/,``)||`${window.location.pathname}${window.location.search}`||void 0}function o(){try{let e=globalThis.localStorage?.getItem(t);if(!e)return[];let i=JSON.parse(e);if(!Array.isArray(i.items))return[];let a=Date.now()-r,o=i.items.filter(e=>e&&typeof e.id==`string`&&typeof e.title==`string`).filter(e=>Number.isFinite(e.updatedAt)&&e.updatedAt>=a).slice(0,n);return o.length!==i.items.length&&s(o),o}catch{return[]}}function s(e){try{globalThis.localStorage?.setItem(t,JSON.stringify({items:e}))}catch{}}function c(e){return`${e.toString(36)}-${Math.random().toString(36).slice(2,8)}`}var l=e(e=>({items:o(),add:t=>e(e=>{let r=t.title.trim();if(!r)return e;let o=Date.now(),l=t.tone??`info`,u=t.dedupeKey?e.items.findIndex(e=>e.dedupeKey===t.dedupeKey):-1,d=[{id:u>=0?e.items[u].id:c(o),tone:l,status:t.status??i(l),title:r,message:t.message?.trim()||void 0,source:t.source?.trim()||void 0,href:t.href??a(),dedupeKey:t.dedupeKey,createdAt:u>=0?e.items[u].createdAt:o,updatedAt:o,read:t.read??!1,occurrences:u>=0?e.items[u].occurrences+1:1},...u>=0?e.items.filter((e,t)=>t!==u):e.items].slice(0,n);return s(d),{items:d}}),markAllRead:()=>e(e=>{let t=e.items.map(e=>({...e,read:!0}));return s(t),{items:t}}),remove:t=>e(e=>{let n=e.items.filter(e=>e.id!==t);return s(n),{items:n}}),clearFinished:()=>e(e=>{let t=e.items.filter(e=>e.status!==`done`);return s(t),{items:t}}),clear:()=>{s([]),e({items:[]})}}));function u(e){l.getState().add(e)}export{u as t};
1
+ import{p as e}from"./locale-store-BkJ7g35d.js";var t=`xopc.activity-center.v1`,n=80,r=720*60*60*1e3;function i(e){return e===`error`?`failed`:e===`warning`?`attention`:`done`}function a(){if(!(typeof window>`u`))return window.location.hash.replace(/^#/,``)||`${window.location.pathname}${window.location.search}`||void 0}function o(){try{let e=globalThis.localStorage?.getItem(t);if(!e)return[];let i=JSON.parse(e);if(!Array.isArray(i.items))return[];let a=Date.now()-r,o=i.items.filter(e=>e&&typeof e.id==`string`&&typeof e.title==`string`).filter(e=>Number.isFinite(e.updatedAt)&&e.updatedAt>=a).slice(0,n);return o.length!==i.items.length&&s(o),o}catch{return[]}}function s(e){try{globalThis.localStorage?.setItem(t,JSON.stringify({items:e}))}catch{}}function c(e){return`${e.toString(36)}-${Math.random().toString(36).slice(2,8)}`}var l=e(e=>({items:o(),add:t=>e(e=>{let r=t.title.trim();if(!r)return e;let o=Date.now(),l=t.tone??`info`,u=t.dedupeKey?e.items.findIndex(e=>e.dedupeKey===t.dedupeKey):-1,d=[{id:u>=0?e.items[u].id:c(o),tone:l,status:t.status??i(l),title:r,message:t.message?.trim()||void 0,source:t.source?.trim()||void 0,href:t.href??a(),dedupeKey:t.dedupeKey,createdAt:u>=0?e.items[u].createdAt:o,updatedAt:o,read:t.read??!1,occurrences:u>=0?e.items[u].occurrences+1:1},...u>=0?e.items.filter((e,t)=>t!==u):e.items].slice(0,n);return s(d),{items:d}}),markAllRead:()=>e(e=>{let t=e.items.map(e=>({...e,read:!0}));return s(t),{items:t}}),remove:t=>e(e=>{let n=e.items.filter(e=>e.id!==t);return s(n),{items:n}}),clearFinished:()=>e(e=>{let t=e.items.filter(e=>e.status!==`done`);return s(t),{items:t}}),clear:()=>{s([]),e({items:[]})}}));function u(e){l.getState().add(e)}export{u as t};