@xopcai/xopc 0.0.253 → 0.0.255

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 (203) hide show
  1. package/dist/browser-ext/dist/background.js +59 -13
  2. package/dist/browser-ext/dist/content.js +0 -5
  3. package/dist/browser-ext/manifest.json +2 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{activity-store-CeS1bgXP.js → activity-store-DvjK5FEm.js} +1 -1
  6. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BdF3HhCW.js → agent-avatar-dicebear-Cqspzbf_.js} +1 -1
  7. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CL3Mi-uM.js +1 -0
  8. package/dist/gateway/static/root/assets/agents-odqXmGhA.js +1 -0
  9. package/dist/gateway/static/root/assets/{api-zMPeC0yU.js → api-CsYi3heY.js} +1 -1
  10. package/dist/gateway/static/root/assets/{app-management-settings-panel-BaAFln8W.js → app-management-settings-panel-Gd4a5hdE.js} +1 -1
  11. package/dist/gateway/static/root/assets/{appearance-settings-CXvsoBlw.js → appearance-settings-CZ6KOnbd.js} +1 -1
  12. package/dist/gateway/static/root/assets/apps-page-DyBDoCam.js +1 -0
  13. package/dist/gateway/static/root/assets/{archive-plugin-C0o_mVQI.js → archive-plugin-y82Rwhjm.js} +1 -1
  14. package/dist/gateway/static/root/assets/{attachment-load-B5Ry3tGL.js → attachment-load-D46SGNpv.js} +1 -1
  15. package/dist/gateway/static/root/assets/{automations-page-DY5QAEQd.js → automations-page-wilciIZ1.js} +1 -1
  16. package/dist/gateway/static/root/assets/automations-workspace-8U86Umig.js +6 -0
  17. package/dist/gateway/static/root/assets/{binary-plugins-BydpEgBA.js → binary-plugins-CuMkNNCe.js} +1 -1
  18. package/dist/gateway/static/root/assets/{block-editor-D0CpUOMo.js → block-editor-DFnPsrxI.js} +44 -44
  19. package/dist/gateway/static/root/assets/{browser-automation-inputs-DzbTsGI6.js → browser-automation-inputs-hlmcSp4p.js} +1 -1
  20. package/dist/gateway/static/root/assets/{browser-automations-page-D7fZYjni.js → browser-automations-page-OjZvbARU.js} +2 -2
  21. package/dist/gateway/static/root/assets/browser-settings-page-DOUG84qV.js +8 -0
  22. package/dist/gateway/static/root/assets/capabilities-settings-panel-CG73Mwi8.js +7 -0
  23. package/dist/gateway/static/root/assets/channels-settings-MDywEWWM.js +1 -0
  24. package/dist/gateway/static/root/assets/{channels-status-swr-BGGRTkn6.js → channels-status-swr-D1HHFzkE.js} +1 -1
  25. package/dist/gateway/static/root/assets/{chat-terminal-dock-_CP4nvlg.js → chat-terminal-dock-Ce_T9BPq.js} +2 -2
  26. package/dist/gateway/static/root/assets/connectors-page-D29p6Zvm.js +2 -0
  27. package/dist/gateway/static/root/assets/{cron-expression-g2U8Rllf.js → cron-expression-BRrCwYyD.js} +1 -1
  28. package/dist/gateway/static/root/assets/date-picker-C35RuuWW.js +1 -0
  29. package/dist/gateway/static/root/assets/{dependency-picker-D-0gcbbM.js → dependency-picker-4pNXVcRM.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-settings-D7kvWQ9H.js → desktop-pet-settings-BvV1UA5g.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-Cl3JRIu6.js → desktop-pet-z91GYnPf.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-debug-page-DtP2tJHY.js → extension-debug-page-CkVF5HvV.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-page-CphZDdoT.js → extension-page-DW0zQGaB.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-settings-page-CsxVLV4-.js → extension-settings-page-BLQhizZ3.js} +1 -1
  35. package/dist/gateway/static/root/assets/{gateway-config-swr-BW3Bx-aV.js → gateway-config-swr-02BBC1mK.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-settings-DxBZ05dX.js → gateway-settings-rAXx8FGP.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-startup-retry-DAq74TZe.js → gateway-startup-retry-XZnY6621.js} +1 -1
  38. package/dist/gateway/static/root/assets/heartbeat-settings-BaW_r1t9.js +1 -0
  39. package/dist/gateway/static/root/assets/home-page-BoTS8-Z9.js +1 -0
  40. package/dist/gateway/static/root/assets/{image-generation-api-MPuaXDRs.js → image-generation-api-CIcKz4Xs.js} +1 -1
  41. package/dist/gateway/static/root/assets/index-DsonmRCH.css +2 -0
  42. package/dist/gateway/static/root/assets/index-PksHo9hS.js +74 -0
  43. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CfhaTqgE.js → keyboard-shortcuts-settings-yfaGz6SE.js} +1 -1
  44. package/dist/gateway/static/root/assets/{local-app-workbench-page-CR6asX7L.js → local-app-workbench-page-B3flRQH1.js} +2 -2
  45. package/dist/gateway/static/root/assets/{local-apps-page-g01W3kEK.js → local-apps-page-Cp-nEtgV.js} +1 -1
  46. package/dist/gateway/static/root/assets/{locale-store-BkeaPZpn.js → locale-store-VsboRLD7.js} +1 -1
  47. package/dist/gateway/static/root/assets/logs-page-DkqsRCri.js +2 -0
  48. package/dist/gateway/static/root/assets/{management-settings-DeGxJF_Z.js → management-settings-24_JyDPk.js} +1 -1
  49. package/dist/gateway/static/root/assets/{markdown-view-Ca7BRBLL.js → markdown-view-CPXhy6nh.js} +1 -1
  50. package/dist/gateway/static/root/assets/{media-plugins-FmOhmzlD.js → media-plugins-CwLvIb9r.js} +1 -1
  51. package/dist/gateway/static/root/assets/messages-DngsF_Kx.js +3 -0
  52. package/dist/gateway/static/root/assets/{mobile-pairing-wizard-BXNbn05L.js → mobile-pairing-wizard-BbJCDv57.js} +1 -1
  53. package/dist/gateway/static/root/assets/note-detail-panel-OklYXK7y.js +5 -0
  54. package/dist/gateway/static/root/assets/notes-page-BjfgJIQw.js +8 -0
  55. package/dist/gateway/static/root/assets/{page-tabs-pyukZ1PJ.js → page-tabs-0YXn9Gkl.js} +1 -1
  56. package/dist/gateway/static/root/assets/popover-select-CKBYnT3c.js +1 -0
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-slFHoMUe.js → preview-open-alternatives-2jVV5kfZ.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-CXa3FNNk.js → product-open-page-D7p0NfTK.js} +1 -1
  59. package/dist/gateway/static/root/assets/project-detail-page-rLNM2mP0.js +1 -0
  60. package/dist/gateway/static/root/assets/projects-page-D6jY2ZWl.js +1 -0
  61. package/dist/gateway/static/root/assets/{registry-api-CviQoUBf.js → registry-api-DlTWbXQA.js} +1 -1
  62. package/dist/gateway/static/root/assets/remote-access-hub-CZZg0kXc.js +1 -0
  63. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-O9D9o7-O.js → runtime-tools-settings-panel-B-NDgmJ4.js} +2 -2
  64. package/dist/gateway/static/root/assets/{schema-form-8FesicnL.js → schema-form-DZYeBS1v.js} +1 -1
  65. package/dist/gateway/static/root/assets/sessions-page-BvuxJegi.js +1 -0
  66. package/dist/gateway/static/root/assets/settings-advanced-gate-BAQHP4mB.js +1 -0
  67. package/dist/gateway/static/root/assets/{settings-form-section-CBic9TFH.js → settings-form-section-zy5UMvPk.js} +1 -1
  68. package/dist/gateway/static/root/assets/{settings-page-Xz66_Mjg.js → settings-page-CTuipbJq.js} +1 -1
  69. package/dist/gateway/static/root/assets/setup-status-panel-BkWoc5j5.js +1 -0
  70. package/dist/gateway/static/root/assets/{share-preview-page--JpjwB58.js → share-preview-page-D3Uawo_h.js} +1 -1
  71. package/dist/gateway/static/root/assets/shares-settings-B2doziIn.js +1 -0
  72. package/dist/gateway/static/root/assets/skill-reload-api-D2ymjqG5.js +1 -0
  73. package/dist/gateway/static/root/assets/{skills-page-fVKExKv5.js → skills-page-DDbabz7p.js} +1 -1
  74. package/dist/gateway/static/root/assets/{skills-page.utils-Yv9u3uJp.js → skills-page.utils-DkGhbiMa.js} +1 -1
  75. package/dist/gateway/static/root/assets/{system-settings-panel-CCWjVdc2.js → system-settings-panel-Fc-WbX6-.js} +1 -1
  76. package/dist/gateway/static/root/assets/task-detail-page-7w7eB9nB.js +1 -0
  77. package/dist/gateway/static/root/assets/{theme-store-BtkaVpMm.js → theme-store-vdB57bTn.js} +1 -1
  78. package/dist/gateway/static/root/assets/{tunnel-api-C__W9BaN.js → tunnel-api-DZ0evABj.js} +1 -1
  79. package/dist/gateway/static/root/assets/{use-autosave-Dow9RRcq.js → use-autosave-Ckof_m7e.js} +1 -1
  80. package/dist/gateway/static/root/assets/user-model-page-CcNCyrXZ.js +2 -0
  81. package/dist/gateway/static/root/assets/{voice-api-key-field-CvF3lEyx.js → voice-api-key-field-CnmtpWlq.js} +1 -1
  82. package/dist/gateway/static/root/assets/{voice-config-api-BEUVAyM6.js → voice-config-api-OA04c71t.js} +1 -1
  83. package/dist/gateway/static/root/assets/{work-discovery-overlay-B9PDfReq.js → work-discovery-overlay-sxvsDIC3.js} +1 -1
  84. package/dist/gateway/static/root/assets/workflow-run-setup-panel-CUCfBpPF.js +3 -0
  85. package/dist/gateway/static/root/assets/workflows-page-Bp-nvnLa.js +5 -0
  86. package/dist/gateway/static/root/index.html +11 -11
  87. package/dist/package.js +1 -1
  88. package/dist/src/agent/agent-manager.js +4 -4
  89. package/dist/src/agent/background-review/run-background-review.js +1 -1
  90. package/dist/src/agent/embedded/model-runtime.js +1 -1
  91. package/dist/src/agent/embedded/run-for-session.js +1 -1
  92. package/dist/src/agent/image/tool-model-config.js +1 -1
  93. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
  94. package/dist/src/agent/service.js +2 -2
  95. package/dist/src/agent/session/session-inspector.js +1 -1
  96. package/dist/src/agent/skills/hub-lock.js +1 -1
  97. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  98. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +17 -2
  99. package/dist/src/agent/tools/browser/tool/schemas.d.ts +85 -1
  100. package/dist/src/agent/tools/browser/tool/schemas.js +212 -5
  101. package/dist/src/agent/tools/create-share-tool.js +39 -1
  102. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  103. package/dist/src/ai-assist/text-assist.js +1 -1
  104. package/dist/src/auth/credentials.js +2 -2
  105. package/dist/src/auth/oauth/xopc-cloud.js +1 -1
  106. package/dist/src/auth/profiles/store.js +1 -1
  107. package/dist/src/auth/sync-provider-auth.js +2 -2
  108. package/dist/src/browser/drivers/extension-driver.d.ts +4 -4
  109. package/dist/src/browser/drivers/extension-driver.js +20 -8
  110. package/dist/src/browser/drivers/playwright-driver.js +1 -1
  111. package/dist/src/browser/providers/browser-ext-install.d.ts +3 -0
  112. package/dist/src/browser/providers/browser-ext-install.js +19 -4
  113. package/dist/src/browser/providers/extension.d.ts +14 -1
  114. package/dist/src/browser/providers/extension.js +89 -11
  115. package/dist/src/browser/providers/playwright-install.js +8 -12
  116. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  117. package/dist/src/cli/commands/models.js +1 -1
  118. package/dist/src/cli/commands/tunnel.js +3 -3
  119. package/dist/src/config/index.js +4 -4
  120. package/dist/src/config/loader.js +2 -2
  121. package/dist/src/config/models-json.js +1 -1
  122. package/dist/src/extensions/lockfile.js +1 -1
  123. package/dist/src/gateway/agents-admin.js +1 -1
  124. package/dist/src/gateway/device-routes.js +1 -1
  125. package/dist/src/gateway/file-path-classifier.js +1 -1
  126. package/dist/src/gateway/heartbeat/service.js +1 -1
  127. package/dist/src/gateway/hono/lib/config-payload.js +2 -2
  128. package/dist/src/gateway/hono/routes/browser.js +149 -27
  129. package/dist/src/gateway/hono/routes/lazy-bundles.js +3 -3
  130. package/dist/src/gateway/hono/routes/models.js +1 -1
  131. package/dist/src/gateway/hono/routes/sessions.js +1 -1
  132. package/dist/src/gateway/hono/routes/shares.js +404 -7
  133. package/dist/src/gateway/hono/routes/site-shares.js +19 -13
  134. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  135. package/dist/src/gateway/hono/routes/workflows.js +2 -2
  136. package/dist/src/gateway/service/config-coordinator.js +1 -1
  137. package/dist/src/gateway/service/sessions-api.js +1 -1
  138. package/dist/src/gateway/service.js +13 -13
  139. package/dist/src/heartbeat/index.js +1 -1
  140. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  141. package/dist/src/providers/index.js +2 -2
  142. package/dist/src/providers/model-registry.js +1 -1
  143. package/dist/src/providers/model-thinking.js +57 -20
  144. package/dist/src/providers/register-runtime-providers.js +1 -1
  145. package/dist/src/remote-access/exposure-manager.js +1 -1
  146. package/dist/src/session/index.js +1 -1
  147. package/dist/src/session/store.js +1 -1
  148. package/dist/src/share/hosted-note-publication.d.ts +22 -0
  149. package/dist/src/share/hosted-note-publication.js +96 -0
  150. package/dist/src/share/hosted-session-share.d.ts +86 -7
  151. package/dist/src/share/hosted-session-share.js +72 -15
  152. package/dist/src/share/hosted-static-site-publication.d.ts +16 -0
  153. package/dist/src/share/hosted-static-site-publication.js +108 -0
  154. package/dist/src/share/hosted-static-site-publish.d.ts +23 -0
  155. package/dist/src/share/hosted-static-site-publish.js +53 -0
  156. package/dist/src/share/note-share-service.d.ts +1 -0
  157. package/dist/src/share/note-share-service.js +4 -4
  158. package/dist/src/share/share-url.d.ts +1 -1
  159. package/dist/src/share/share-url.js +14 -9
  160. package/dist/src/tasks/home-query-service.js +2 -2
  161. package/dist/src/tui/backends/embedded-backend.js +2 -2
  162. package/dist/src/tui/tui-agent-events.js +1 -1
  163. package/dist/src/tui/tui-startup-resources.js +1 -1
  164. package/dist/src/tui/tui.js +1 -1
  165. package/dist/src/tunnel/index.js +1 -1
  166. package/dist/src/tunnel/tunnel-service.js +1 -1
  167. package/dist/src/voice/realtime/agentEngine.js +17 -0
  168. package/dist/src/voice/realtime/memory-context.js +1 -1
  169. package/dist/src/voice/realtime/playback-echo.d.ts +2 -0
  170. package/dist/src/voice/realtime/playback-echo.js +15 -0
  171. package/dist/src/work-discovery/service.js +1 -1
  172. package/dist/src/workflows/service/workflow-run-service.js +2 -2
  173. package/package.json +2 -2
  174. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-Bs34Kp0K.js +0 -1
  175. package/dist/gateway/static/root/assets/agents-DARlgjTm.js +0 -1
  176. package/dist/gateway/static/root/assets/apps-page-BhgvfBJT.js +0 -1
  177. package/dist/gateway/static/root/assets/automations-workspace-BzX4lILP.js +0 -6
  178. package/dist/gateway/static/root/assets/browser-settings-page-BBdMqxl0.js +0 -3
  179. package/dist/gateway/static/root/assets/capabilities-settings-panel-D_WfftDW.js +0 -7
  180. package/dist/gateway/static/root/assets/channels-settings-bdRLT9KA.js +0 -1
  181. package/dist/gateway/static/root/assets/connectors-page-CPDjU5wU.js +0 -2
  182. package/dist/gateway/static/root/assets/date-picker-SmVlhtj_.js +0 -1
  183. package/dist/gateway/static/root/assets/heartbeat-settings-DWcKsIoZ.js +0 -1
  184. package/dist/gateway/static/root/assets/home-page-BdvLZKQZ.js +0 -1
  185. package/dist/gateway/static/root/assets/index-C7RDs6S-.js +0 -74
  186. package/dist/gateway/static/root/assets/index-Cu8xqZQ9.css +0 -2
  187. package/dist/gateway/static/root/assets/logs-page-ZP4QTWoC.js +0 -2
  188. package/dist/gateway/static/root/assets/messages-C72stReU.js +0 -3
  189. package/dist/gateway/static/root/assets/note-detail-panel-EeVeF4II.js +0 -5
  190. package/dist/gateway/static/root/assets/notes-page-D7bMff96.js +0 -8
  191. package/dist/gateway/static/root/assets/popover-select-C-Hj-nXR.js +0 -1
  192. package/dist/gateway/static/root/assets/project-detail-page-BDF88VdN.js +0 -1
  193. package/dist/gateway/static/root/assets/projects-page-DeTD6pu1.js +0 -1
  194. package/dist/gateway/static/root/assets/remote-access-hub-CxKrdQ6a.js +0 -1
  195. package/dist/gateway/static/root/assets/sessions-page-DUFJN-2t.js +0 -1
  196. package/dist/gateway/static/root/assets/settings-advanced-gate-CcSYDjaH.js +0 -1
  197. package/dist/gateway/static/root/assets/setup-status-panel-C6DuwrP5.js +0 -1
  198. package/dist/gateway/static/root/assets/shares-settings-CovcdHSC.js +0 -1
  199. package/dist/gateway/static/root/assets/skill-reload-api-CrHagTsE.js +0 -1
  200. package/dist/gateway/static/root/assets/task-detail-page-I8hueJnG.js +0 -1
  201. package/dist/gateway/static/root/assets/user-model-page-CU6nxmoM.js +0 -2
  202. package/dist/gateway/static/root/assets/workflow-run-setup-panel-kWGFkhjz.js +0 -3
  203. package/dist/gateway/static/root/assets/workflows-page-B4Is5E42.js +0 -5
@@ -1,3 +1,14 @@
1
+ const BROWSER_EXTENSION_PROTOCOL_VERSION = 3;
2
+
3
+ const XOPC_EXT_PORT = 19820;
4
+ const XOPC_EXT_HOST = "127.0.0.1";
5
+ const XOPC_EXT_WS_URL = `ws://${XOPC_EXT_HOST}:${XOPC_EXT_PORT}/browser-ext`;
6
+ const WS_RECONNECT_BASE_DELAY = 2e3;
7
+ const WS_RECONNECT_MAX_DELAY = 5e3;
8
+ const WS_KEEPALIVE_INTERVAL = 2e4;
9
+ const WS_WATCHDOG_ALARM = "xopc-ws-watchdog";
10
+ const WS_WATCHDOG_PERIOD_MINUTES = 0.5;
11
+
1
12
  const LOG_COLORS = {
2
13
  debug: "color: #888",
3
14
  info: "color: #3b82f6",
@@ -270,6 +281,15 @@ async function closeAllSessions() {
270
281
  const observations = /* @__PURE__ */ new Map();
271
282
  async function executeBrowserCommand(command) {
272
283
  const startedAt = Date.now();
284
+ if (command.protocolVersion !== BROWSER_EXTENSION_PROTOCOL_VERSION) {
285
+ return {
286
+ id: command.id,
287
+ result: fail(
288
+ "DRIVER_UNAVAILABLE",
289
+ `Browser protocol mismatch. Expected ${BROWSER_EXTENSION_PROTOCOL_VERSION}; reload the xopc extension.`
290
+ )
291
+ };
292
+ }
273
293
  try {
274
294
  const result = await execute(command.input, command.timeoutMs, command.visualFallback, startedAt);
275
295
  return { id: command.id, result };
@@ -515,37 +535,42 @@ function diff(previous, next) {
515
535
  };
516
536
  }
517
537
 
518
- const XOPC_EXT_PORT = 19820;
519
- const XOPC_EXT_HOST = "127.0.0.1";
520
- const XOPC_EXT_WS_URL = `ws://${XOPC_EXT_HOST}:${XOPC_EXT_PORT}/browser-ext`;
521
- const WS_RECONNECT_BASE_DELAY = 2e3;
522
- const WS_RECONNECT_MAX_DELAY = 5e3;
523
-
524
538
  const log = createLogger("Background");
525
539
  let ws = null;
526
540
  let reconnectTimer = null;
541
+ let keepAliveTimer = null;
527
542
  let reconnectDelay = WS_RECONNECT_BASE_DELAY;
528
543
  let intentionalClose = false;
529
544
  function connect() {
530
545
  if (ws && (ws.readyState === WebSocket.OPEN || ws.readyState === WebSocket.CONNECTING)) return;
531
546
  intentionalClose = false;
532
- ws = new WebSocket(XOPC_EXT_WS_URL);
533
- ws.onopen = () => {
547
+ const socket = new WebSocket(XOPC_EXT_WS_URL);
548
+ ws = socket;
549
+ socket.onopen = () => {
550
+ if (ws !== socket) {
551
+ socket.close();
552
+ return;
553
+ }
534
554
  reconnectDelay = WS_RECONNECT_BASE_DELAY;
535
555
  sendStatus();
556
+ startKeepAlive();
536
557
  log.info("Connected to xopc daemon");
537
558
  };
538
- ws.onmessage = async (event) => {
559
+ socket.onmessage = async (event) => {
560
+ if (ws !== socket) return;
539
561
  try {
540
562
  const command = JSON.parse(String(event.data));
541
563
  const result = await executeBrowserCommand(command);
542
- ws?.send(JSON.stringify(result));
564
+ if (socket.readyState === WebSocket.OPEN) socket.send(JSON.stringify(result));
543
565
  } catch (error) {
544
566
  log.error("Failed to process browser command", { error: error instanceof Error ? error.message : String(error) });
545
567
  }
546
568
  };
547
- ws.onclose = () => {
569
+ socket.onclose = (event) => {
570
+ if (ws !== socket) return;
571
+ stopKeepAlive();
548
572
  ws = null;
573
+ log.warn("Disconnected from xopc daemon", { code: event.code, reason: event.reason, wasClean: event.wasClean });
549
574
  if (!intentionalClose) scheduleReconnect();
550
575
  };
551
576
  }
@@ -553,11 +578,28 @@ function sendStatus() {
553
578
  if (ws?.readyState !== WebSocket.OPEN) return;
554
579
  const status = {
555
580
  type: "status",
581
+ protocolVersion: BROWSER_EXTENSION_PROTOCOL_VERSION,
582
+ extensionVersion: chrome.runtime.getManifest().version,
556
583
  connected: true,
557
584
  sessionCount: automationSessions.size
558
585
  };
559
586
  ws.send(JSON.stringify(status));
560
587
  }
588
+ function startKeepAlive() {
589
+ stopKeepAlive();
590
+ keepAliveTimer = setInterval(() => {
591
+ if (ws?.readyState !== WebSocket.OPEN) {
592
+ stopKeepAlive();
593
+ return;
594
+ }
595
+ const message = { type: "keepalive", timestamp: Date.now() };
596
+ ws.send(JSON.stringify(message));
597
+ }, WS_KEEPALIVE_INTERVAL);
598
+ }
599
+ function stopKeepAlive() {
600
+ if (keepAliveTimer) clearInterval(keepAliveTimer);
601
+ keepAliveTimer = null;
602
+ }
561
603
  function scheduleReconnect() {
562
604
  if (reconnectTimer) clearTimeout(reconnectTimer);
563
605
  reconnectTimer = setTimeout(() => {
@@ -568,6 +610,7 @@ function scheduleReconnect() {
568
610
  }
569
611
  function disconnect() {
570
612
  intentionalClose = true;
613
+ stopKeepAlive();
571
614
  if (reconnectTimer) clearTimeout(reconnectTimer);
572
615
  reconnectTimer = null;
573
616
  ws?.close();
@@ -581,12 +624,15 @@ chrome.runtime.onMessage.addListener((message, _sender, sendResponse) => {
581
624
  } else if (message.type === "popup/disconnect") {
582
625
  disconnect();
583
626
  sendResponse({ ok: true });
584
- } else if (message.type === "content/heartbeat") sendResponse({ ok: true });
585
- else sendResponse({ ok: false, error: `Unknown message: ${message.type}` });
627
+ } else sendResponse({ ok: false, error: `Unknown message: ${message.type}` });
586
628
  return true;
587
629
  });
588
630
  chrome.runtime.onInstalled.addListener(connect);
589
631
  chrome.runtime.onStartup.addListener(connect);
632
+ chrome.alarms.onAlarm.addListener((alarm) => {
633
+ if (alarm.name === WS_WATCHDOG_ALARM && !intentionalClose) connect();
634
+ });
635
+ void chrome.alarms.create(WS_WATCHDOG_ALARM, { periodInMinutes: WS_WATCHDOG_PERIOD_MINUTES });
590
636
  connect();
591
637
  self.addEventListener("beforeunload", () => {
592
638
  disconnect();
@@ -189,8 +189,3 @@ chrome.runtime.onMessage.addListener(
189
189
  return true;
190
190
  }
191
191
  );
192
- setInterval(() => {
193
- if (!chrome.runtime?.id) return;
194
- chrome.runtime.sendMessage({ type: "content/heartbeat" }).catch(() => {
195
- });
196
- }, 3e4);
@@ -1,7 +1,8 @@
1
1
  {
2
2
  "manifest_version": 3,
3
+ "minimum_chrome_version": "120",
3
4
  "name": "xopc Browser Bridge",
4
- "version": "0.0.253",
5
+ "version": "0.0.255",
5
6
  "description": "Browser automation bridge for xopc — executes commands in Chrome via the local xopc daemon.",
6
7
  "permissions": [
7
8
  "debugger",
@@ -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.253",
5
+ "version": "0.0.255",
6
6
  "kind": "channel",
7
7
  "main": "src/index.js",
8
8
  "channels": [
@@ -1 +1 @@
1
- import{f as e}from"./locale-store-BkeaPZpn.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{f as e}from"./locale-store-VsboRLD7.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};