@xopcai/xopc 0.0.273 → 0.0.275

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 (171) hide show
  1. package/dist/browser-ext/_locales/en/messages.json +215 -0
  2. package/dist/browser-ext/_locales/zh_CN/messages.json +215 -0
  3. package/dist/browser-ext/dist/assets/{auth-DkwOUI6_.js → auth-ClQTK565.js} +291 -115
  4. package/dist/browser-ext/dist/assets/{sidepanel-C86O7q5Y.css → sidepanel-CeGqObOa.css} +41 -20
  5. package/dist/browser-ext/dist/background.js +36 -4
  6. package/dist/browser-ext/dist/sidepanel.html +2 -2
  7. package/dist/browser-ext/dist/sidepanel.js +457 -310
  8. package/dist/browser-ext/manifest.json +6 -4
  9. package/dist/extensions/telegram/xopc.extension.json +1 -1
  10. package/dist/gateway/static/root/assets/{activity-store-cF7IX2RP.js → activity-store-SJZ5fS17.js} +1 -1
  11. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BrgxX8nG.js → agent-avatar-dicebear-Dx6x7MXq.js} +1 -1
  12. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-DvhuRCLA.js → agent-defaults-settings-panel-BuxTpjkf.js} +1 -1
  13. package/dist/gateway/static/root/assets/agents-_f9HEOol.js +1 -0
  14. package/dist/gateway/static/root/assets/{api-CYkdUpkx.js → api-CnJAVHBu.js} +1 -1
  15. package/dist/gateway/static/root/assets/{app-management-settings-panel-DfoNzWIa.js → app-management-settings-panel-BYKWXcVl.js} +1 -1
  16. package/dist/gateway/static/root/assets/{appearance-settings-czbLdCqj.js → appearance-settings-BmhSJc4X.js} +1 -1
  17. package/dist/gateway/static/root/assets/apps-page-DYTnK9lL.js +1 -0
  18. package/dist/gateway/static/root/assets/{archive-plugin-D14P13mX.js → archive-plugin-BY6ncIeE.js} +1 -1
  19. package/dist/gateway/static/root/assets/attachment-load-B6cw8KtO.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-DM7ZEewI.js → automations-page-D1WwsSf3.js} +1 -1
  23. package/dist/gateway/static/root/assets/automations-workspace-CjF56MI_.js +6 -0
  24. package/dist/gateway/static/root/assets/{binary-plugins-CxNg6InF.js → binary-plugins-CC-wYm0K.js} +2 -2
  25. package/dist/gateway/static/root/assets/{block-editor-D22VcYnC.js → block-editor-D8rh9KNe.js} +3 -3
  26. package/dist/gateway/static/root/assets/{browser-automation-inputs-6NWTLEpd.js → browser-automation-inputs-DGCqIPXT.js} +1 -1
  27. package/dist/gateway/static/root/assets/{browser-automations-page-BrqySdbW.js → browser-automations-page-CMrffyct.js} +2 -2
  28. package/dist/gateway/static/root/assets/browser-settings-page-1onvP1Se.js +8 -0
  29. package/dist/gateway/static/root/assets/capabilities-settings-panel-C9ZSJxjr.js +8 -0
  30. package/dist/gateway/static/root/assets/{channels-settings-yHsY174W.js → channels-settings-CvLTnI99.js} +1 -1
  31. package/dist/gateway/static/root/assets/{channels-status-swr-BUZimNmp.js → channels-status-swr-BTT2sIGg.js} +1 -1
  32. package/dist/gateway/static/root/assets/{chat-terminal-dock-CZPBNpMI.js → chat-terminal-dock-F_dUdZ8l.js} +2 -2
  33. package/dist/gateway/static/root/assets/connectors-page-D7NHV8B2.js +2 -0
  34. package/dist/gateway/static/root/assets/{date-picker-Da_0QyLe.js → date-picker-MHuajwQ-.js} +1 -1
  35. package/dist/gateway/static/root/assets/{dependency-picker-D_djqzy7.js → dependency-picker-BcMJJI9X.js} +1 -1
  36. package/dist/gateway/static/root/assets/{desktop-pet-Celmbw-T.js → desktop-pet-DlNm_7H0.js} +1 -1
  37. package/dist/gateway/static/root/assets/{desktop-pet-settings-CqNNgF45.js → desktop-pet-settings-BI1JQMnE.js} +1 -1
  38. package/dist/gateway/static/root/assets/device-pairing-wizard-Cp5jO5B_.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-ku3kCjvH.js → extension-debug-page-DZr0GkkA.js} +1 -1
  41. package/dist/gateway/static/root/assets/{extension-page-C7FpHwL4.js → extension-page-QsHoQ6VX.js} +1 -1
  42. package/dist/gateway/static/root/assets/{extension-settings-page-OMj2tU2_.js → extension-settings-page-I2YX4Tzb.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-config-swr-6eb1vKE1.js → gateway-config-swr-cd8owslz.js} +1 -1
  44. package/dist/gateway/static/root/assets/gateway-settings-GwfQu8rN.js +1 -0
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-DUFFCU8H.js → gateway-startup-retry-CVTa5HSS.js} +1 -1
  46. package/dist/gateway/static/root/assets/{heartbeat-settings-CSFzOACM.js → heartbeat-settings-D-hVYXzL.js} +1 -1
  47. package/dist/gateway/static/root/assets/home-page-SEW_0k8Q.js +1 -0
  48. package/dist/gateway/static/root/assets/{image-generation-api-C1cHRBRp.js → image-generation-api-DtMRG1oF.js} +1 -1
  49. package/dist/gateway/static/root/assets/{index-C6OWYFtQ.js → index-DfZZLrWp.js} +35 -35
  50. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BuvD3iv8.js → keyboard-shortcuts-settings-D_I-hiG2.js} +1 -1
  51. package/dist/gateway/static/root/assets/{local-app-workbench-page-CaC4-THD.js → local-app-workbench-page-BcY7wIHs.js} +2 -2
  52. package/dist/gateway/static/root/assets/{local-apps-page-DdJ8zwBp.js → local-apps-page-DniZuXJJ.js} +1 -1
  53. package/dist/gateway/static/root/assets/{locale-store-BBSCIl4I.js → locale-store-BkJ7g35d.js} +1 -1
  54. package/dist/gateway/static/root/assets/{logs-page-BaR2he0K.js → logs-page-DIiOMrJ_.js} +2 -2
  55. package/dist/gateway/static/root/assets/management-settings-BPw41YX6.js +1 -0
  56. package/dist/gateway/static/root/assets/{markdown-view-c5vtnYe8.js → markdown-view-B2IR4E2r.js} +1 -1
  57. package/dist/gateway/static/root/assets/{media-plugins-D_a6GDY6.js → media-plugins-BoP3LSQz.js} +1 -1
  58. package/dist/gateway/static/root/assets/{messages-DjuBdDCn.js → messages-BGc-OJWg.js} +2 -2
  59. package/dist/gateway/static/root/assets/note-detail-panel-BI2xr54R.js +5 -0
  60. package/dist/gateway/static/root/assets/notes-page-CM7Ns8i1.js +8 -0
  61. package/dist/gateway/static/root/assets/{page-tabs-C7Le9bSI.js → page-tabs-B21WfV92.js} +1 -1
  62. package/dist/gateway/static/root/assets/{preview-open-alternatives-B2pOxJBK.js → preview-open-alternatives-BZoDpPqV.js} +1 -1
  63. package/dist/gateway/static/root/assets/{proactive-card-BlQ1vCtV.js → proactive-card-Bw9CbzUX.js} +1 -1
  64. package/dist/gateway/static/root/assets/{proactive-page-CghKTfYa.js → proactive-page-Czw_CEDB.js} +1 -1
  65. package/dist/gateway/static/root/assets/{product-open-page-DpjiHgwu.js → product-open-page-DsQcgZkI.js} +1 -1
  66. package/dist/gateway/static/root/assets/project-detail-page-jOECabbf.js +1 -0
  67. package/dist/gateway/static/root/assets/projects-page-Ck9j5q0x.js +1 -0
  68. package/dist/gateway/static/root/assets/{registry-api-CyQ4k1Ux.js → registry-api-CTq8EECj.js} +1 -1
  69. package/dist/gateway/static/root/assets/remote-access-hub-2xcpaLTC.js +1 -0
  70. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Bl4ArLHf.js → runtime-tools-settings-panel-Bz5gIRjy.js} +2 -2
  71. package/dist/gateway/static/root/assets/{schema-form-KQFmfWd4.js → schema-form-CqM0ntNm.js} +1 -1
  72. package/dist/gateway/static/root/assets/sessions-page-CE9MK60k.js +1 -0
  73. package/dist/gateway/static/root/assets/settings-advanced-gate-D0grhQan.js +1 -0
  74. package/dist/gateway/static/root/assets/{settings-form-section-Dbnls9ty.js → settings-form-section-LqcDYJ2m.js} +1 -1
  75. package/dist/gateway/static/root/assets/{settings-page-CDKirYRG.js → settings-page-BpvBmheO.js} +1 -1
  76. package/dist/gateway/static/root/assets/setup-status-panel-CYuqNzWH.js +1 -0
  77. package/dist/gateway/static/root/assets/share-preview-page-F3qhAryJ.js +2 -0
  78. package/dist/gateway/static/root/assets/shares-settings-B4wSoQM3.js +1 -0
  79. package/dist/gateway/static/root/assets/skill-reload-api-C3LD7fkR.js +1 -0
  80. package/dist/gateway/static/root/assets/{skills-page-Bd0_ED_p.js → skills-page-D9fI548d.js} +1 -1
  81. package/dist/gateway/static/root/assets/{skills-page.utils-rA-XT-YG.js → skills-page.utils-DZNmyYqU.js} +1 -1
  82. package/dist/gateway/static/root/assets/{system-settings-panel-CSkMrHLz.js → system-settings-panel-CMsmFOhV.js} +1 -1
  83. package/dist/gateway/static/root/assets/task-detail-page-DRwTJ8E0.js +1 -0
  84. package/dist/gateway/static/root/assets/{theme-store-DWpIEWen.js → theme-store-mV6Cm2vj.js} +1 -1
  85. package/dist/gateway/static/root/assets/tunnel-api-DGaqXwql.js +1 -0
  86. package/dist/gateway/static/root/assets/{use-autosave-DkQAIAuB.js → use-autosave-bXCl0Y0j.js} +1 -1
  87. package/dist/gateway/static/root/assets/user-model-page-B3RjDSri.js +2 -0
  88. package/dist/gateway/static/root/assets/{voice-api-key-field-BrqcH0P-.js → voice-api-key-field-Cx9rl7mP.js} +1 -1
  89. package/dist/gateway/static/root/assets/{voice-config-api-BJ95Z3pT.js → voice-config-api-D3DdcH4H.js} +1 -1
  90. package/dist/gateway/static/root/assets/{work-discovery-overlay-vfTWKm13.js → work-discovery-overlay-ywJpaqKp.js} +1 -1
  91. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-CHdr_ng9.js → workflow-run-setup-panel-DyGukxOL.js} +2 -2
  92. package/dist/gateway/static/root/assets/workflows-page-CifIqO2B.js +6 -0
  93. package/dist/gateway/static/root/index.html +9 -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/child-agent-factory.d.ts +3 -0
  97. package/dist/src/agent/child-agent-factory.js +2 -1
  98. package/dist/src/agent/external-tools/endpoint-provider.js +1 -1
  99. package/dist/src/agent/service.js +20 -16
  100. package/dist/src/agent/tools/factory.d.ts +1 -0
  101. package/dist/src/agent/tools/factory.js +21 -4
  102. package/dist/src/agent/workflow/workflow-child-tools.js +2 -0
  103. package/dist/src/browser/native-messaging-host.d.ts +1 -1
  104. package/dist/src/browser/native-messaging-host.js +3 -2
  105. package/dist/src/browser/providers/browser-ext-install.d.ts +1 -1
  106. package/dist/src/browser/providers/browser-ext-install.js +8 -3
  107. package/dist/src/browser/providers/realtime-extension.d.ts +4 -1
  108. package/dist/src/browser/providers/realtime-extension.js +26 -10
  109. package/dist/src/browser/readiness.d.ts +4 -1
  110. package/dist/src/browser/readiness.js +11 -5
  111. package/dist/src/cli/commands/onboard.js +1 -1
  112. package/dist/src/gateway/gateway-workflow-host.types.d.ts +2 -0
  113. package/dist/src/gateway/heartbeat/service.js +1 -1
  114. package/dist/src/gateway/hono/app.js +5 -2
  115. package/dist/src/gateway/hono/routes/agent-stream.js +1 -1
  116. package/dist/src/gateway/hono/routes/browser.js +24 -11
  117. package/dist/src/gateway/hono/routes/device-pairing-approval.d.ts +9 -2
  118. package/dist/src/gateway/hono/routes/device-pairing-approval.js +50 -10
  119. package/dist/src/gateway/hono/routes/devices.d.ts +2 -1
  120. package/dist/src/gateway/hono/routes/devices.js +33 -16
  121. package/dist/src/gateway/hono/routes/endpoint-tools.js +9 -0
  122. package/dist/src/gateway/hono/routes/models.js +6 -0
  123. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +1 -1
  124. package/dist/src/gateway/hono/routes/session-input-handler.js +1 -1
  125. package/dist/src/gateway/hono/routes/side-chats.js +1 -1
  126. package/dist/src/gateway/hono/routes/tunnel.js +34 -2
  127. package/dist/src/gateway/hono/routes/voice.js +1 -1
  128. package/dist/src/gateway/rate-limit/buckets.js +2 -1
  129. package/dist/src/gateway/service/run-gateway-agent.js +1 -1
  130. package/dist/src/heartbeat/index.js +1 -1
  131. package/dist/src/providers/model-catalog-persistence.js +4 -0
  132. package/dist/src/providers/model-catalog-types.d.ts +1 -0
  133. package/dist/src/providers/xopc-cloud-model-source.js +12 -1
  134. package/dist/src/storage/sqlite/device-pairing-approval.js +3 -1
  135. package/dist/src/storage/sqlite/endpoint-session-binding-repository.d.ts +1 -0
  136. package/dist/src/storage/sqlite/endpoint-session-binding-repository.js +9 -1
  137. package/dist/src/storage/sqlite/index.d.ts +1 -1
  138. package/dist/src/storage/sqlite/index.js +2 -2
  139. package/dist/src/tui/tui.js +1 -1
  140. package/dist/src/tunnel/xopc-cloud-registration.d.ts +5 -0
  141. package/dist/src/tunnel/xopc-cloud-registration.js +17 -11
  142. package/dist/src/workflows/service/workflow-run-service.js +4 -1
  143. package/package.json +2 -2
  144. package/dist/gateway/static/root/assets/agents-C0By2FIo.js +0 -1
  145. package/dist/gateway/static/root/assets/apps-page-BSJXKWcE.js +0 -1
  146. package/dist/gateway/static/root/assets/attachment-load-Dok_B1Gv.js +0 -2
  147. package/dist/gateway/static/root/assets/attachment-process-heavy-B2_kr5EA.js +0 -11
  148. package/dist/gateway/static/root/assets/automations-workspace--1TsZf3O.js +0 -6
  149. package/dist/gateway/static/root/assets/browser-settings-page-DOHgQer_.js +0 -8
  150. package/dist/gateway/static/root/assets/capabilities-settings-panel-Bpse_5K-.js +0 -8
  151. package/dist/gateway/static/root/assets/connectors-page-B_wLKGnH.js +0 -2
  152. package/dist/gateway/static/root/assets/device-pairing-wizard-B5_w9qlm.js +0 -1
  153. package/dist/gateway/static/root/assets/excel-worksheet-utils-EyvwNT4X.js +0 -1
  154. package/dist/gateway/static/root/assets/gateway-settings-CH-6vkgN.js +0 -1
  155. package/dist/gateway/static/root/assets/home-page-BJebAKB-.js +0 -1
  156. package/dist/gateway/static/root/assets/management-settings-r-iYWZFY.js +0 -1
  157. package/dist/gateway/static/root/assets/note-detail-panel-BV6nbgac.js +0 -5
  158. package/dist/gateway/static/root/assets/notes-page-BmLKoWwi.js +0 -8
  159. package/dist/gateway/static/root/assets/project-detail-page-CV8Lh296.js +0 -1
  160. package/dist/gateway/static/root/assets/projects-page-COweOaJP.js +0 -1
  161. package/dist/gateway/static/root/assets/remote-access-hub-ChPPGVU5.js +0 -1
  162. package/dist/gateway/static/root/assets/sessions-page-DgmHibOK.js +0 -1
  163. package/dist/gateway/static/root/assets/settings-advanced-gate-DV7kMco2.js +0 -1
  164. package/dist/gateway/static/root/assets/setup-status-panel-SQmtWoOs.js +0 -1
  165. package/dist/gateway/static/root/assets/share-preview-page-DwgLjS1m.js +0 -2
  166. package/dist/gateway/static/root/assets/shares-settings-Cs5bUrYw.js +0 -1
  167. package/dist/gateway/static/root/assets/skill-reload-api-DyKrjq7F.js +0 -1
  168. package/dist/gateway/static/root/assets/task-detail-page-CEQU-L_G.js +0 -1
  169. package/dist/gateway/static/root/assets/tunnel-api-COJcGnEi.js +0 -1
  170. package/dist/gateway/static/root/assets/user-model-page-BQAU55lf.js +0 -2
  171. package/dist/gateway/static/root/assets/workflows-page-hwRJD7vR.js +0 -6
@@ -73,12 +73,26 @@ svg { display: block; }
73
73
  .brand { display: flex; align-items: center; gap: 8px; flex: 1; font-size: 15px; font-weight: 700; letter-spacing: -.01em; }
74
74
  .brand-mark { width: 25px; height: 25px; display: grid; place-items: center; border: 1px solid var(--edge); border-radius: 8px; background: var(--surface-panel); color: var(--accent); box-shadow: 0 1px 2px rgb(17 17 17 / 5%); }
75
75
  .brand-mark svg { width: 15px; height: 15px; stroke-width: 1.7; }
76
- .status { margin-right: 76px; display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: var(--fg-muted); }
76
+ .status { display: inline-flex; align-items: center; gap: 6px; font-size: 11px; color: var(--fg-muted); }
77
77
  .status-dot, .mini-status { width: 7px; height: 7px; flex: 0 0 auto; border-radius: 999px; background: var(--fg-disabled); }
78
78
  .status-dot.online, .mini-status.online { background: var(--success); box-shadow: 0 0 0 3px color-mix(in srgb, var(--success) 12%, transparent); }
79
79
  .status-dot.error { background: var(--danger); }
80
- .disconnect-link { position: absolute; z-index: 3; top: 13px; right: 13px; border: 0; border-radius: 6px; padding: 3px 7px; background: transparent; color: var(--fg-muted); font-size: 11px; }
81
- .disconnect-link:hover { background: var(--surface-hover); color: var(--fg); }
80
+ .header-actions { position: relative; flex: 0 0 auto; }
81
+ .header-icon-button { width: 32px; height: 32px; display: grid; place-items: center; border: 1px solid transparent; border-radius: 9px; background: transparent; color: var(--fg-muted); }
82
+ .header-icon-button:hover, .header-icon-button[aria-expanded='true'] { border-color: var(--edge); background: var(--surface-hover); color: var(--fg); }
83
+ .header-icon-button svg { width: 17px; height: 17px; }
84
+ .settings-menu { position: absolute; z-index: 30; top: calc(100% + 8px); right: 0; width: min(260px, calc(100vw - 28px)); overflow: hidden; border: 1px solid var(--edge-strong); border-radius: 13px; padding: 7px; background: var(--surface-panel); box-shadow: var(--shadow-popover); }
85
+ .settings-menu-title { padding: 7px 8px 9px; font-size: 12px; font-weight: 680; }
86
+ .settings-group { border-top: 1px solid var(--edge); padding: 8px 0; }
87
+ .settings-label { display: flex; align-items: center; gap: 7px; padding: 2px 8px 7px; color: var(--fg-subtle); font-size: 10px; font-weight: 650; }
88
+ .settings-label svg { width: 14px; height: 14px; }
89
+ .settings-options { display: grid; grid-template-columns: 1fr 1fr; gap: 5px; }
90
+ .settings-options button { min-width: 0; height: 34px; display: flex; align-items: center; justify-content: center; gap: 5px; border: 1px solid var(--edge); border-radius: 8px; background: var(--surface-base); color: var(--fg-muted); font-size: 11px; }
91
+ .settings-options button:hover { border-color: var(--edge-strong); background: var(--surface-hover); color: var(--fg); }
92
+ .settings-options button.active { border-color: color-mix(in srgb, var(--accent) 35%, var(--edge)); background: var(--accent-soft); color: var(--accent-fg); font-weight: 650; }
93
+ .settings-options button svg { width: 13px; height: 13px; }
94
+ .settings-disconnect { width: 100%; border: 0; border-top: 1px solid var(--edge); padding: 10px 8px 6px; background: transparent; color: var(--danger); font-size: 11px; text-align: left; }
95
+ .settings-disconnect:hover { color: color-mix(in srgb, var(--danger) 82%, var(--fg)); }
82
96
 
83
97
  .center { flex: 1; display: grid; place-items: center; padding: 24px; overflow: auto; }
84
98
  .card { width: min(100%, 420px); border: 1px solid var(--edge); border-radius: 16px; padding: 22px; background: var(--surface-panel); box-shadow: var(--shadow-surface); }
@@ -211,13 +225,14 @@ svg { display: block; }
211
225
  @keyframes pulse { 50% { opacity: .35; transform: scale(.8); } }
212
226
  @keyframes skeleton { to { background-position: -200% 0; } }
213
227
 
214
- .composer { position: relative; flex: 0 0 auto; margin: 0 10px 10px; border: 1px solid var(--edge-strong); border-radius: 15px; background: var(--surface-panel); padding: 8px; box-shadow: var(--shadow-surface); transition: border-color 120ms ease, box-shadow 120ms ease; }
215
- .composer:focus-within { border-color: color-mix(in srgb, var(--accent) 45%, var(--edge)); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 7%, transparent), var(--shadow-surface); }
216
- .composer.dragging { border-color: var(--accent); box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 12%, transparent), var(--shadow-surface); }
217
- .file-drop-overlay { position: absolute; z-index: 20; inset: 0; display: flex; align-items: center; justify-content: center; gap: 7px; border-radius: 14px; background: color-mix(in srgb, var(--accent-soft) 94%, var(--surface-panel)); color: var(--accent-fg); font-size: 12px; font-weight: 650; pointer-events: none; }
228
+ .composer { position: relative; flex: 0 0 auto; margin: 0 12px 12px; overflow: visible; border: 1px solid var(--edge); border-radius: 18px; background: var(--surface-panel); padding: 10px 10px 8px; box-shadow: var(--shadow-surface); transition: border-color 120ms ease, box-shadow 120ms ease; }
229
+ .composer:focus-within { border-color: var(--edge-strong); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 7%, transparent), var(--shadow-surface); }
230
+ .composer.dragging { border-color: var(--accent); box-shadow: 0 0 0 2px color-mix(in srgb, var(--accent) 12%, transparent), var(--shadow-surface); }
231
+ .file-drop-overlay { position: absolute; z-index: 20; inset: 0; display: flex; align-items: center; justify-content: center; gap: 7px; border-radius: 17px; background: color-mix(in srgb, var(--accent-soft) 94%, var(--surface-panel)); color: var(--accent-fg); font-size: 12px; font-weight: 650; pointer-events: none; }
218
232
  .file-drop-overlay svg { width: 17px; height: 17px; }
219
- .composer-input-row { min-height: 38px; display: flex; align-items: flex-end; gap: 7px; }
220
- .composer textarea { min-width: 0; min-height: 34px; max-height: 144px; flex: 1; resize: none; overflow-y: auto; border: 0; padding: 7px 2px 6px; outline: none; background: transparent; color: var(--fg); font-size: 13px; line-height: 1.5; }
233
+ .composer-input-row { min-height: 58px; display: block; }
234
+ .composer textarea { width: 100%; min-width: 0; min-height: 54px; max-height: 144px; display: block; resize: none; overflow-y: auto; border: 0; padding: 5px 8px 8px; outline: none; background: transparent; color: var(--fg); font-size: 14px; line-height: 1.55; }
235
+ .composer textarea::placeholder { color: var(--fg-disabled); }
221
236
  .composer-icon-button { width: 34px; height: 34px; border-color: transparent; color: var(--fg-muted); }
222
237
  .tools-anchor { position: relative; flex: 0 0 auto; }
223
238
  .tools-menu { position: absolute; z-index: 12; left: -1px; bottom: calc(100% + 9px); width: min(310px, calc(100vw - 38px)); overflow: hidden; border: 1px solid var(--edge-strong); border-radius: 13px; background: var(--surface-panel); padding: 6px; box-shadow: var(--shadow-popover); }
@@ -232,20 +247,23 @@ svg { display: block; }
232
247
  .tools-menu button.active-access { background: var(--success-soft); }
233
248
  .tools-menu button.active-access > svg { color: var(--success); }
234
249
  .tools-menu button.active-access > svg:last-child { width: 13px; height: 13px; color: var(--fg-subtle); }
235
- .send-button { width: 34px; height: 34px; flex: 0 0 auto; display: grid; place-items: center; border: 0; border-radius: 10px; background: var(--accent); color: #fff; transition: background-color 120ms ease, transform 120ms ease; }
250
+ .send-button { width: 34px; height: 34px; flex: 0 0 auto; display: grid; place-items: center; border: 0; border-radius: 9px; background: transparent; color: var(--accent-fg); transition: background-color 120ms ease, color 120ms ease, transform 120ms ease; }
236
251
  .send-button svg { width: 17px; height: 17px; }
237
- .send-button:hover:not(:disabled) { background: var(--accent-hover); transform: translateY(-1px); }
238
- .send-button:disabled { background: var(--surface-active); color: var(--fg-disabled); }
239
- .stop-button { background: var(--fg); color: var(--surface-panel); }
240
- .stop-button:hover:not(:disabled) { background: var(--fg-muted); }
241
- .composer-footer { min-height: 25px; display: flex; align-items: center; gap: 8px; padding: 4px 3px 0 5px; }
252
+ .send-button:hover:not(:disabled) { background: var(--accent-soft); transform: translateY(-1px); }
253
+ .send-button:disabled { background: transparent; color: var(--fg-disabled); }
254
+ .stop-button { background: var(--surface-hover); color: var(--fg-muted); }
255
+ .stop-button:hover:not(:disabled) { background: var(--surface-active); color: var(--fg); }
256
+ .composer-footer { min-height: 36px; display: flex; align-items: center; justify-content: space-between; gap: 8px; padding: 3px 0 0; }
257
+ .composer-toolbar-start, .composer-toolbar-end { min-width: 0; display: flex; align-items: center; gap: 6px; }
258
+ .composer-toolbar-end { margin-left: auto; }
242
259
  .composer-state { min-width: 0; display: flex; align-items: center; gap: 5px; color: var(--fg-subtle); font-size: 9px; }
260
+ .composer-state-label { overflow: hidden; white-space: nowrap; text-overflow: ellipsis; }
243
261
  .access-pill { display: inline-flex; align-items: center; gap: 3px; border-radius: 999px; padding: 2px 5px; background: var(--success-soft); color: color-mix(in srgb, var(--success) 72%, var(--fg)); font-weight: 600; }
244
262
  .access-pill svg { width: 10px; height: 10px; }
245
- .model-controls { min-width: 0; margin-left: auto; display: flex; align-items: center; gap: 3px; }
246
- .model-controls select { min-width: 0; max-width: 112px; border: 0; border-radius: 5px; padding: 2px 3px; outline: none; background: transparent; color: var(--fg-subtle); font-size: 9px; text-overflow: ellipsis; }
247
- .model-controls select:hover { background: var(--surface-hover); color: var(--fg-muted); }
248
- .model-controls select:last-child { max-width: 64px; }
263
+ .model-controls { min-width: 0; height: 32px; display: flex; align-items: center; gap: 0; border-radius: 9px; padding: 0 2px; background: var(--surface-hover); }
264
+ .model-controls select { min-width: 0; max-width: 118px; height: 28px; border: 0; border-radius: 7px; padding: 4px 5px; outline: none; background: transparent; color: var(--fg-muted); font-size: 10px; font-weight: 560; text-overflow: ellipsis; }
265
+ .model-controls select:hover, .model-controls select:focus { background: var(--surface-active); color: var(--fg); }
266
+ .model-controls select:last-child { max-width: 72px; color: var(--fg-subtle); }
249
267
 
250
268
  .composer-contexts { display: flex; flex-wrap: wrap; gap: 5px; margin-bottom: 6px; }
251
269
  .context-chip, .attachment-chip { min-width: 0; max-width: 100%; display: flex; align-items: center; gap: 5px; border: 1px solid color-mix(in srgb, var(--accent) 24%, var(--edge)); border-radius: 8px; padding: 5px 6px; color: var(--accent-fg); background: var(--accent-soft); font-size: 10px; }
@@ -290,7 +308,10 @@ svg { display: block; }
290
308
  .status { margin-right: 68px; }
291
309
  .messages { padding-inline: 12px; }
292
310
  .message.user { width: 92%; }
293
- .model-controls select { max-width: 86px; }
311
+ .composer { margin-inline: 8px; }
312
+ .composer-state-label { display: none; }
313
+ .model-controls select { max-width: 82px; }
314
+ .model-controls select:last-child { max-width: 58px; }
294
315
  .quick-prompts { gap: 6px; }
295
316
  }
296
317
 
@@ -1,4 +1,4 @@
1
- import { h as endpointToolContentSchema, E as ENDPOINT_PROTOCOL_VERSION, c as canonicalJson, T as TAB_BINDING_PREFIX, b as captureTabWithPermission, P as PENDING_CONTEXT_KEY, k as readProfile, l as registerBrowserEndpoint, j as getAccessProfile, R as RealtimeClient, d as createBrowserEndpointHello, i as gatewayFetch } from './assets/auth-DkwOUI6_.js';
1
+ import { i as endpointToolContentSchema, E as ENDPOINT_PROTOCOL_VERSION, b as canonicalJson, T as TAB_BINDING_PREFIX, d as captureTabWithPermission, P as PENDING_CONTEXT_KEY, w as t, o as readProfile, q as registerBrowserEndpoint, l as getAccessProfile, R as RealtimeClient, e as createBrowserEndpointHello, k as gatewayFetch } from './assets/auth-ClQTK565.js';
2
2
 
3
3
  const BROWSER_EXTENSION_PROTOCOL_VERSION = 4;
4
4
  const BROWSER_CONTROL_ENDPOINT_TOOL_NAME = "browser.control";
@@ -1143,11 +1143,20 @@ function diff(previous, next) {
1143
1143
 
1144
1144
  const log = createLogger("Background");
1145
1145
  const BACKGROUND_CLIENT_ID_KEY = "xopc.browser.background-client-id";
1146
+ const RECONNECT_ALARM = "xopc.browser.reconnect";
1147
+ const RECONNECT_DELAY_MINUTES = 1;
1146
1148
  let realtime;
1147
1149
  let endpointClaim;
1148
1150
  let lastConnectionError;
1149
1151
  let connectTask;
1150
1152
  let connectionGeneration = 0;
1153
+ function clearReconnectAlarm() {
1154
+ void chrome.alarms.clear(RECONNECT_ALARM);
1155
+ }
1156
+ function scheduleReconnectAlarm() {
1157
+ if (endpointClaim) return;
1158
+ chrome.alarms.create(RECONNECT_ALARM, { delayInMinutes: RECONNECT_DELAY_MINUTES });
1159
+ }
1151
1160
  const browserToolRegistry = new EndpointToolRegistry([{
1152
1161
  descriptor: BROWSER_CONTROL_ENDPOINT_DESCRIPTOR,
1153
1162
  execute: async (args) => {
@@ -1210,7 +1219,11 @@ async function connect(generation) {
1210
1219
  createWebSocket: (url) => new WebSocket(url),
1211
1220
  onStateChange: (state, error) => {
1212
1221
  lastConnectionError = error;
1213
- if (state === "connected") lastConnectionError = void 0;
1222
+ if (state === "connected") {
1223
+ lastConnectionError = void 0;
1224
+ } else {
1225
+ scheduleReconnectAlarm();
1226
+ }
1214
1227
  if (error) log.warn("Browser Realtime connection changed", { state, error });
1215
1228
  }
1216
1229
  });
@@ -1219,6 +1232,7 @@ async function connect(generation) {
1219
1232
  onReady: ({ endpointId, turnToken }) => {
1220
1233
  endpointClaim = { endpointId, token: turnToken };
1221
1234
  lastConnectionError = void 0;
1235
+ clearReconnectAlarm();
1222
1236
  endpointHost.connect((message) => client.sendEndpointMessage(message));
1223
1237
  void chrome.runtime.sendMessage({ type: "browser/endpoint-ready", claim: endpointClaim }).catch(() => void 0);
1224
1238
  log.info("Browser control connected through Gateway Realtime", { endpointId });
@@ -1229,6 +1243,7 @@ async function connect(generation) {
1229
1243
  onDisconnected: () => {
1230
1244
  endpointClaim = void 0;
1231
1245
  endpointHost.disconnect();
1246
+ scheduleReconnectAlarm();
1232
1247
  }
1233
1248
  });
1234
1249
  if (generation !== connectionGeneration || realtime) return;
@@ -1247,6 +1262,7 @@ function connectWithLogging() {
1247
1262
  const generation = connectionGeneration;
1248
1263
  connectTask = connect(generation).catch((error) => {
1249
1264
  lastConnectionError = error instanceof Error ? error.message : String(error);
1265
+ scheduleReconnectAlarm();
1250
1266
  log.warn("Could not connect browser Realtime transport", { error: lastConnectionError });
1251
1267
  }).finally(() => {
1252
1268
  connectTask = void 0;
@@ -1284,17 +1300,33 @@ chrome.runtime.onInstalled.addListener(() => {
1284
1300
  chrome.contextMenus.removeAll(() => {
1285
1301
  chrome.contextMenus.create({
1286
1302
  id: "xopc-ask-selection",
1287
- title: "Ask xopc about “%s”",
1303
+ title: t("contextMenuAskSelection"),
1288
1304
  contexts: ["selection"]
1289
1305
  });
1290
1306
  });
1291
1307
  connectWithLogging();
1292
1308
  });
1293
1309
  chrome.runtime.onStartup.addListener(connectWithLogging);
1310
+ chrome.alarms.onAlarm.addListener((alarm) => {
1311
+ if (alarm.name !== RECONNECT_ALARM) return;
1312
+ void readProfile().then((profile) => {
1313
+ if (!profile) {
1314
+ clearReconnectAlarm();
1315
+ return;
1316
+ }
1317
+ if (endpointClaim) {
1318
+ clearReconnectAlarm();
1319
+ return;
1320
+ }
1321
+ disconnect();
1322
+ connectWithLogging();
1323
+ });
1324
+ });
1294
1325
  chrome.storage.onChanged.addListener((changes, area) => {
1295
1326
  if (area === "local" && changes["xopc.browser.profile"]) {
1296
1327
  disconnect();
1297
- connectWithLogging();
1328
+ if (changes["xopc.browser.profile"].newValue) connectWithLogging();
1329
+ else clearReconnectAlarm();
1298
1330
  }
1299
1331
  });
1300
1332
  void chrome.sidePanel.setPanelBehavior({ openPanelOnActionClick: true });
@@ -5,8 +5,8 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>xopc</title>
7
7
  <script type="module" crossorigin src="./sidepanel.js"></script>
8
- <link rel="modulepreload" crossorigin href="./assets/auth-DkwOUI6_.js">
9
- <link rel="stylesheet" crossorigin href="./assets/sidepanel-C86O7q5Y.css">
8
+ <link rel="modulepreload" crossorigin href="./assets/auth-ClQTK565.js">
9
+ <link rel="stylesheet" crossorigin href="./assets/sidepanel-CeGqObOa.css">
10
10
  </head>
11
11
  <body>
12
12
  <div id="root"></div>