@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,14 +1,15 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../../package-version.js";
2
2
  import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
- import { init_paths, resolveBinDir } from "../../config/paths.js";
5
4
  import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
5
+ import { init_paths, resolveBinDir } from "../../config/paths.js";
6
6
  import { assertCacheDir } from "../cache-dir-policy.js";
7
7
  import { resolvePackageRoot } from "../../infra/update-check.js";
8
8
  import { dirname, join } from "node:path";
9
9
  import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
10
10
  import { fileURLToPath } from "node:url";
11
11
  import { spawn } from "node:child_process";
12
+ import { createHash } from "node:crypto";
12
13
  import { readFile, readdir, rm } from "node:fs/promises";
13
14
  //#region src/browser/providers/browser-ext-install.ts
14
15
  /**
@@ -42,6 +43,14 @@ function moduleDir() {
42
43
  function validateBrowserExtLayout(dir) {
43
44
  return BROWSER_EXT_REQUIRED_FILES.every((rel) => existsSync(join(dir, rel)));
44
45
  }
46
+ function browserExtContentHash(dir) {
47
+ const hash = createHash("sha256");
48
+ for (const relativePath of BROWSER_EXT_REQUIRED_FILES) {
49
+ hash.update(relativePath);
50
+ hash.update(readFileSync(join(dir, relativePath)));
51
+ }
52
+ return hash.digest("hex");
53
+ }
45
54
  function readManifestVersion(dir) {
46
55
  try {
47
56
  const raw = readFileSync(join(dir, "manifest.json"), "utf8");
@@ -55,7 +64,7 @@ async function readMeta(metaPath) {
55
64
  try {
56
65
  const raw = await readFile(metaPath, "utf8");
57
66
  const parsed = JSON.parse(raw);
58
- if (parsed && typeof parsed === "object" && typeof parsed.xopcVersion === "string") return parsed;
67
+ if (parsed && typeof parsed === "object" && typeof parsed.xopcVersion === "string" && typeof parsed.manifestVersion === "string" && typeof parsed.contentHash === "string" && parsed.source === "bundled" && typeof parsed.installPath === "string") return parsed;
59
68
  return null;
60
69
  } catch {
61
70
  return null;
@@ -121,7 +130,8 @@ function computeNeedsRefresh(params) {
121
130
  if (!params.installedPath || !validateBrowserExtLayout(params.installedPath)) return true;
122
131
  const installedManifest = readManifestVersion(params.installedPath);
123
132
  if (!installedManifest || installedManifest !== params.bundledManifestVersion) return true;
124
- if (!params.meta || params.meta.xopcVersion !== PACKAGE_VERSION) return true;
133
+ if (browserExtContentHash(params.installedPath) !== params.bundledContentHash) return true;
134
+ if (!params.meta || params.meta.xopcVersion !== PACKAGE_VERSION || params.meta.contentHash !== params.bundledContentHash) return true;
125
135
  return false;
126
136
  }
127
137
  async function cleanupStaleStaging(root) {
@@ -192,11 +202,13 @@ async function browserExtDoctor(opts) {
192
202
  const cacheDir = (opts?.cacheDir?.trim() ? assertCacheDir(opts.cacheDir) : resolveBinDir()) || resolveBinDir();
193
203
  const bundled = await resolveBundledBrowserExtDir();
194
204
  const bundledManifestVersion = bundled ? readManifestVersion(bundled.dir) : void 0;
205
+ const bundledContentHash = bundled ? browserExtContentHash(bundled.dir) : void 0;
195
206
  const meta = await readMeta(resolveMetaPath(cacheDir));
196
207
  const installedPath = resolveInstalledExtensionPath(cacheDir, meta);
197
208
  const needsRefresh = bundled ? computeNeedsRefresh({
198
209
  force: false,
199
210
  bundledManifestVersion: bundledManifestVersion ?? PACKAGE_VERSION,
211
+ bundledContentHash,
200
212
  installedPath,
201
213
  meta
202
214
  }) : false;
@@ -224,6 +236,7 @@ async function ensureBrowserExtensionArtifacts(opts) {
224
236
  const bundled = await resolveBundledBrowserExtDir();
225
237
  if (!bundled) throw new Error("Bundled browser extension not found. Reinstall xopc or run from a built checkout (pnpm run build).");
226
238
  const bundledManifestVersion = readManifestVersion(bundled.dir) ?? PACKAGE_VERSION;
239
+ const bundledContentHash = browserExtContentHash(bundled.dir);
227
240
  const root = browserExtRoot(cacheDir);
228
241
  mkdirSync(root, { recursive: true });
229
242
  await cleanupStaleStaging(root);
@@ -232,6 +245,7 @@ async function ensureBrowserExtensionArtifacts(opts) {
232
245
  const needsRefresh = computeNeedsRefresh({
233
246
  force: opts?.force,
234
247
  bundledManifestVersion,
248
+ bundledContentHash,
235
249
  installedPath,
236
250
  meta
237
251
  });
@@ -251,6 +265,7 @@ async function ensureBrowserExtensionArtifacts(opts) {
251
265
  const nextMeta = {
252
266
  xopcVersion: PACKAGE_VERSION,
253
267
  manifestVersion: bundledManifestVersion,
268
+ contentHash: bundledContentHash,
254
269
  source: "bundled",
255
270
  bundledFrom: bundled.bundledFrom,
256
271
  installedAt: (/* @__PURE__ */ new Date()).toISOString(),
@@ -351,4 +366,4 @@ async function openBrowserExtensionInstallUi(opts) {
351
366
  };
352
367
  }
353
368
  //#endregion
354
- export { BROWSER_EXT_REQUIRED_FILES, browserExtDoctor, computeNeedsRefresh, ensureBrowserExtensionArtifacts, ensureBrowserExtensionOnStartup, openBrowserExtensionInstallUi, readInstalledExtensionDir, resolveBundledBrowserExtDir, resolveInstalledExtensionPath, resolveWindowsExtensionManager, validateBrowserExtLayout };
369
+ export { BROWSER_EXT_REQUIRED_FILES, browserExtContentHash, browserExtDoctor, computeNeedsRefresh, ensureBrowserExtensionArtifacts, ensureBrowserExtensionOnStartup, openBrowserExtensionInstallUi, readInstalledExtensionDir, resolveBundledBrowserExtDir, resolveInstalledExtensionPath, resolveWindowsExtensionManager, validateBrowserExtLayout };
@@ -4,7 +4,7 @@
4
4
  * The xopc process starts a WebSocket server; the Chrome Extension connects as a client.
5
5
  * Commands are sent over the WS connection and results are returned asynchronously.
6
6
  */
7
- import type { BrowserActionInput, BrowserWireResult } from '@xopcai/browser-control-contract';
7
+ import { type BrowserActionInput, type BrowserWireResult } from '@xopcai/browser-control-contract';
8
8
  export interface ExtensionProviderConfig {
9
9
  /** WebSocket server port. Default: 19820. */
10
10
  port?: number;
@@ -26,7 +26,11 @@ export declare class ExtensionBrowserProvider {
26
26
  private clientWs;
27
27
  private pending;
28
28
  private commandCounter;
29
+ private socketConnected;
30
+ private handshakeReceived;
29
31
  private connected;
32
+ private extensionProtocolVersion;
33
+ private extensionVersion;
30
34
  private readonly config;
31
35
  private connectionWaiters;
32
36
  constructor(config?: ExtensionProviderConfig);
@@ -38,7 +42,16 @@ export declare class ExtensionBrowserProvider {
38
42
  send(input: BrowserActionInput, timeoutMs?: number, visualFallback?: boolean): Promise<BrowserWireResult>;
39
43
  /** Whether the extension is currently connected. */
40
44
  isConnected(): boolean;
45
+ getConnectionStatus(): {
46
+ socketConnected: boolean;
47
+ connected: boolean;
48
+ protocolVersion: number | null;
49
+ expectedProtocolVersion: number;
50
+ extensionVersion: string | null;
51
+ };
52
+ private protocolMismatchMessage;
41
53
  /** Shutdown the WebSocket server. */
42
54
  shutdown(): Promise<void>;
43
55
  private _handleMessage;
44
56
  }
57
+ export declare function isBrowserWireResult(value: unknown): value is BrowserWireResult;
@@ -1,6 +1,12 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  //#region src/browser/providers/extension.ts
4
+ /**
5
+ * Extension browser provider — connects to the xopc Chrome Extension via WebSocket.
6
+ *
7
+ * The xopc process starts a WebSocket server; the Chrome Extension connects as a client.
8
+ * Commands are sent over the WS connection and results are returned asynchronously.
9
+ */
4
10
  init_logger();
5
11
  const log = createLogger("ExtensionProvider");
6
12
  const DEFAULT_PORT = 19820;
@@ -18,7 +24,11 @@ var ExtensionBrowserProvider = class {
18
24
  clientWs = null;
19
25
  pending = /* @__PURE__ */ new Map();
20
26
  commandCounter = 0;
27
+ socketConnected = false;
28
+ handshakeReceived = false;
21
29
  connected = false;
30
+ extensionProtocolVersion = null;
31
+ extensionVersion = null;
22
32
  config;
23
33
  connectionWaiters = [];
24
34
  constructor(config) {
@@ -45,7 +55,7 @@ var ExtensionBrowserProvider = class {
45
55
  res.writeHead(200, { "Content-Type": "application/json" });
46
56
  res.end(JSON.stringify({
47
57
  ok: true,
48
- connected: this.connected
58
+ ...this.getConnectionStatus()
49
59
  }));
50
60
  });
51
61
  this.wss = new WebSocketServer({
@@ -54,17 +64,32 @@ var ExtensionBrowserProvider = class {
54
64
  });
55
65
  this.wss.on("connection", (ws) => {
56
66
  log.info("Chrome Extension connected");
67
+ const previousClient = this.clientWs;
57
68
  this.clientWs = ws;
58
- this.connected = true;
59
- for (const waiter of this.connectionWaiters) waiter.resolve();
60
- this.connectionWaiters = [];
69
+ this.socketConnected = true;
70
+ this.handshakeReceived = false;
71
+ this.connected = false;
72
+ this.extensionProtocolVersion = null;
73
+ this.extensionVersion = null;
74
+ if (previousClient && previousClient !== ws) try {
75
+ previousClient.close();
76
+ } catch {}
61
77
  ws.on("message", (data) => {
62
- this._handleMessage(data.toString());
78
+ this._handleMessage(data.toString(), ws);
63
79
  });
64
- ws.on("close", () => {
65
- log.warn("Chrome Extension disconnected");
80
+ ws.on("close", (code, reason) => {
81
+ if (this.clientWs !== ws) return;
82
+ log.warn({
83
+ code,
84
+ reason: reason.toString(),
85
+ pendingCount: this.pending.size
86
+ }, "Chrome Extension disconnected");
66
87
  this.clientWs = null;
88
+ this.socketConnected = false;
89
+ this.handshakeReceived = false;
67
90
  this.connected = false;
91
+ this.extensionProtocolVersion = null;
92
+ this.extensionVersion = null;
68
93
  for (const [id, req] of this.pending) {
69
94
  clearTimeout(req.timer);
70
95
  req.reject(/* @__PURE__ */ new Error("Extension disconnected"));
@@ -120,6 +145,7 @@ var ExtensionBrowserProvider = class {
120
145
  /** Wait for the Chrome Extension to connect. */
121
146
  async waitForConnection(timeoutMs) {
122
147
  if (this.connected) return;
148
+ if (this.socketConnected && this.handshakeReceived && this.extensionProtocolVersion !== 3) throw new Error(this.protocolMismatchMessage());
123
149
  const timeout = timeoutMs ?? this.config.connectionTimeout;
124
150
  return new Promise((resolve, reject) => {
125
151
  const timer = setTimeout(() => {
@@ -141,10 +167,14 @@ var ExtensionBrowserProvider = class {
141
167
  }
142
168
  /** Send one Browser Control v2 action to the extension. */
143
169
  async send(input, timeoutMs, visualFallback = true) {
144
- if (!this.connected || !this.clientWs) throw new Error("Extension not connected. Ensure the Chrome Extension is installed and connected.");
170
+ if (!this.connected || !this.clientWs) {
171
+ const detail = this.socketConnected ? this.protocolMismatchMessage() : "Extension not connected. Ensure the Chrome Extension is installed and connected.";
172
+ throw new Error(detail);
173
+ }
145
174
  const id = `cmd_${++this.commandCounter}_${Date.now()}`;
146
175
  const cmd = {
147
176
  id,
177
+ protocolVersion: 3,
148
178
  input,
149
179
  timeoutMs: timeoutMs ?? this.config.commandTimeout,
150
180
  visualFallback
@@ -172,6 +202,18 @@ var ExtensionBrowserProvider = class {
172
202
  isConnected() {
173
203
  return this.connected;
174
204
  }
205
+ getConnectionStatus() {
206
+ return {
207
+ socketConnected: this.socketConnected,
208
+ connected: this.connected,
209
+ protocolVersion: this.extensionProtocolVersion,
210
+ expectedProtocolVersion: 3,
211
+ extensionVersion: this.extensionVersion
212
+ };
213
+ }
214
+ protocolMismatchMessage() {
215
+ return `Browser extension protocol mismatch (expected 3, received ${this.extensionProtocolVersion ?? "unknown"}). Reload the extension in Chrome.`;
216
+ }
175
217
  /** Shutdown the WebSocket server. */
176
218
  async shutdown() {
177
219
  for (const waiter of this.connectionWaiters) waiter.reject(/* @__PURE__ */ new Error("Provider shutting down"));
@@ -200,15 +242,39 @@ var ExtensionBrowserProvider = class {
200
242
  this.server = null;
201
243
  }
202
244
  this.connected = false;
245
+ this.socketConnected = false;
246
+ this.handshakeReceived = false;
247
+ this.extensionProtocolVersion = null;
248
+ this.extensionVersion = null;
203
249
  log.info("Extension provider shut down");
204
250
  }
205
- _handleMessage(raw) {
251
+ _handleMessage(raw, sourceWs) {
252
+ if (sourceWs !== this.clientWs) return;
206
253
  try {
207
254
  const msg = JSON.parse(raw);
208
255
  if (msg.type === "status") {
209
- log.debug(msg, "Extension status");
256
+ const status = msg;
257
+ this.handshakeReceived = true;
258
+ this.extensionProtocolVersion = typeof status.protocolVersion === "number" ? status.protocolVersion : null;
259
+ this.extensionVersion = typeof status.extensionVersion === "string" ? status.extensionVersion : null;
260
+ this.connected = status.protocolVersion === 3;
261
+ if (this.connected) {
262
+ for (const waiter of this.connectionWaiters) waiter.resolve();
263
+ this.connectionWaiters = [];
264
+ log.debug(msg, "Compatible browser extension connected");
265
+ } else {
266
+ const error = new Error(this.protocolMismatchMessage());
267
+ for (const waiter of this.connectionWaiters) waiter.reject(error);
268
+ this.connectionWaiters = [];
269
+ log.warn({
270
+ expectedProtocolVersion: 3,
271
+ extensionProtocolVersion: this.extensionProtocolVersion,
272
+ extensionVersion: this.extensionVersion
273
+ }, "Browser extension protocol mismatch; reload the extension");
274
+ }
210
275
  return;
211
276
  }
277
+ if (isBrowserWireKeepAlive(msg)) return;
212
278
  if (msg.type === "network_event") {
213
279
  log.debug({
214
280
  listenerId: msg.listenerId,
@@ -221,6 +287,10 @@ var ExtensionBrowserProvider = class {
221
287
  if (pending) {
222
288
  clearTimeout(pending.timer);
223
289
  this.pending.delete(id);
290
+ if (!isBrowserWireResult(msg)) {
291
+ pending.reject(/* @__PURE__ */ new Error("Browser extension returned an incompatible response. Reload the extension in Chrome."));
292
+ return;
293
+ }
224
294
  pending.resolve(msg);
225
295
  }
226
296
  } catch (e) {
@@ -228,5 +298,13 @@ var ExtensionBrowserProvider = class {
228
298
  }
229
299
  }
230
300
  };
301
+ function isBrowserWireResult(value) {
302
+ if (!value || typeof value !== "object") return false;
303
+ const result = value.result;
304
+ return typeof value.id === "string" && Boolean(result) && typeof result === "object" && typeof result.ok === "boolean";
305
+ }
306
+ function isBrowserWireKeepAlive(value) {
307
+ return Boolean(value) && typeof value === "object" && value.type === "keepalive" && typeof value.timestamp === "number";
308
+ }
231
309
  //#endregion
232
- export { ExtensionBrowserProvider };
310
+ export { ExtensionBrowserProvider, isBrowserWireResult };
@@ -60,23 +60,19 @@ async function runPlaywrightChromiumInstallWithProgress(opts) {
60
60
  };
61
61
  let stdoutBuf = "";
62
62
  let stderrBuf = "";
63
+ const drainLines = (source, buffer) => {
64
+ const lines = buffer.split(/\r\n|\r|\n/);
65
+ const remainder = lines.pop() ?? "";
66
+ for (const line of lines) emitLine(source, line);
67
+ return remainder;
68
+ };
63
69
  child.stdout?.on("data", (chunk) => {
64
70
  stdoutBuf += chunk.toString();
65
- let idx;
66
- while ((idx = stdoutBuf.indexOf("\n")) !== -1) {
67
- const line = stdoutBuf.slice(0, idx);
68
- stdoutBuf = stdoutBuf.slice(idx + 1);
69
- emitLine("stdout", line);
70
- }
71
+ stdoutBuf = drainLines("stdout", stdoutBuf);
71
72
  });
72
73
  child.stderr?.on("data", (chunk) => {
73
74
  stderrBuf += chunk.toString();
74
- let idx;
75
- while ((idx = stderrBuf.indexOf("\n")) !== -1) {
76
- const line = stderrBuf.slice(0, idx);
77
- stderrBuf = stderrBuf.slice(idx + 1);
78
- emitLine("stderr", line);
79
- }
75
+ stderrBuf = drainLines("stderr", stderrBuf);
80
76
  });
81
77
  child.once("error", (err) => {
82
78
  clearTimeout(timer);
@@ -1,6 +1,6 @@
1
1
  import { getAgentDefaultModelRef, init_schema, parseModelRef } from "../../../../config/schema.js";
2
- import { init_loader, loadConfig } from "../../../../config/loader.js";
3
2
  import { PROVIDER_ENV_MAP, getApiKeyFromEnv, init_env_keys } from "../../../../providers/env-keys.js";
3
+ import { init_loader, loadConfig } from "../../../../config/loader.js";
4
4
  import { existsSync } from "node:fs";
5
5
  //#region src/cli/commands/doctor/checks/provider-auth.ts
6
6
  init_loader();
@@ -1,6 +1,6 @@
1
1
  import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
2
- import { loadConfig, saveConfig } from "../../config/loader.js";
3
2
  import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
3
+ import { loadConfig, saveConfig } from "../../config/loader.js";
4
4
  import { getAllModels, getAvailableModels, getConfiguredProviders, getProviderAuthState, getProviderDisplayName, init_providers, isProviderConfigured, providerSupportsApiKey, providerSupportsOAuth, resolveModel } from "../../providers/index.js";
5
5
  import { formatExamples, register } from "../registry.js";
6
6
  import { getContextWithOpts } from "../context.js";
@@ -2,12 +2,12 @@ import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { loadConfig, saveConfig } from "../../config/loader.js";
4
4
  import { resolveGatewayEffectiveHost } from "../../config/gateway-bind.js";
5
- import { loadTunnelState } from "../../tunnel/tunnel-state.js";
6
- import { formatExamples, register } from "../registry.js";
7
- import "../../config/index.js";
8
5
  import { ensureFrpcBinary } from "../../tunnel/frpc-binary.js";
9
6
  import { resolveTunnelBrokerUrl, resolveTunnelRegistrationSecret } from "../../tunnel/env.js";
7
+ import { loadTunnelState } from "../../tunnel/tunnel-state.js";
10
8
  import { getTunnelService } from "../../tunnel/tunnel-service.js";
9
+ import { formatExamples, register } from "../registry.js";
10
+ import "../../config/index.js";
11
11
  import { TUNNEL_RISK_SUMMARY_LINES, TunnelConsentError, assertTunnelMayStart, hasValidTunnelConsent } from "../../tunnel/consent.js";
12
12
  import { resolveFrpSubdomainHost } from "../../tunnel/frp-subdomain-host.js";
13
13
  import { applyTunnelConsentToConfig, mergeTunnelConfigPatch, setTunnelEnabledInConfig } from "../../tunnel/tunnel-config.js";
@@ -2,15 +2,15 @@ import { ENV_VARS, XOPC_DB_FILENAME, resolveHomeDir, resolveStateDir, resolveXop
2
2
  import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema } from "../../extensions/telegram/src/config-schema.js";
3
3
  import { WeixinAccountConfigSchema, WeixinConfigSchema } from "../../extensions/weixin/src/config-schema.js";
4
4
  import { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, ConnectorsConfigSchema, ExperimentalConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GatewayWebchatConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpOAuthConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelCatalogConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, RuntimeToolsConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TuiConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, VoiceConfigSchema, VoiceRefinementConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultImageGenerationModelConfig, getAgentDefaultImageModelConfig, getAgentDefaultModelRef, init_schema, parseModelRef } from "./schema.js";
5
- import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
5
+ import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
6
6
  import { expandWorkspacePathString, init_workspace_path, normalizeWorkspaceDir, resolveWorkspaceRoot } from "./workspace-path.js";
7
7
  import { resolveDefaultAgentWorkspaceDir } from "./workspace-defaults.js";
8
8
  import { resolveAgentDir as resolveAgentDir$1, resolveAgentHomeDir as resolveAgentHomeDir$1, resolveAgentWorkspaceDir } from "../agent/agent-scope.js";
9
- import { extractProfileAgentId, resolveEffectiveAgentConfigForAgent, resolveEffectiveAgentConfigForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
10
9
  import { FILENAMES, WORKSPACE_FILES, existsSync, hasBundledExtensionManifest, init_paths, resolveAgentAuthProfilesPath, resolveAgentDir, resolveAgentHomeDir, resolveAgentProfileDir, resolveAgentProfileMarkdownPath, resolveAuthProfilesPath, resolveBinDir, resolveBundledExtensionsDir, resolveBundledSkillsDir, resolveConfigPath, resolveCredentialsDir, resolveExtensionSdkPath, resolveExtensionsDir, resolveExtensionsLockPath, resolveInboxDir, resolveInboxMessagePath, resolveInboxPendingDir, resolveInboxProcessedDir, resolveLogPath, resolveLogsDir, resolveMcpOAuthPath, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
11
- import { init_loader, loadConfig, saveConfig } from "./loader.js";
12
- import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
13
10
  import { CustomModelSchema, ImageGenerationCapabilitiesSchema, ImageGenerationModelSchema, ImageGenerationProviderSchema, ModelOverrideSchema, ModelsJsonSchema, OpenAICompatSchema, OpenAICompletionsCompatSchema, OpenAIResponsesCompatSchema, OpenRouterRoutingSchema, ProviderConfigSchema, VercelGatewayRoutingSchema, getDefaultModelValues, init_models_json, loadModelsJson, modelsJsonExists, saveModelsJson, validateModelsConfig } from "./models-json.js";
11
+ import { init_loader, loadConfig, saveConfig } from "./loader.js";
12
+ import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
13
+ import { extractProfileAgentId, resolveEffectiveAgentConfigForAgent, resolveEffectiveAgentConfigForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
14
14
  import { canonicalizeConfiguredMcpServer, isKnownCliMcpTypeAlias, normalizeConfiguredMcpServers, resolveXopcMcpTransportAlias } from "./mcp-config-normalize.js";
15
15
  import { formatThinkingLevels, listThinkingLevels, normalizeElevatedMode, normalizeReasoningLevel, normalizeThinkLevel, normalizeVerboseLevel, thinkLevelToNumber } from "../agent/transcript/thinking-types.js";
16
16
  import { getWorkspacePath } from "./workspace-path-helpers.js";
@@ -2,10 +2,10 @@ import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
2
  import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
4
  import { ConfigSchema, init_schema } from "./schema.js";
5
- import { init_paths, resolveConfigPath } from "./paths.js";
6
5
  import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
7
- import { assertChannelPluginConfigs, init_validate_channel_configs } from "./validate-channel-configs.js";
6
+ import { init_paths, resolveConfigPath } from "./paths.js";
8
7
  import { init_resolution, setActivePlatformDiscovery } from "../platform/resolution.js";
8
+ import { assertChannelPluginConfigs, init_validate_channel_configs } from "./validate-channel-configs.js";
9
9
  import { dirname } from "path";
10
10
  import { existsSync, mkdirSync, promises, readFileSync } from "fs";
11
11
  import { config } from "dotenv";
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { init_paths, resolveModelsJsonPath } from "./paths.js";
3
2
  import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
3
+ import { init_paths, resolveModelsJsonPath } from "./paths.js";
4
4
  import { existsSync, readFileSync } from "fs";
5
5
  import { z } from "zod";
6
6
  //#region src/config/models-json.ts
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { init_paths, resolveExtensionsDir, resolveExtensionsLockPath } from "../config/paths.js";
4
3
  import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
+ import { init_paths, resolveExtensionsDir, resolveExtensionsLockPath } from "../config/paths.js";
5
5
  import { dirname, join } from "path";
6
6
  import { existsSync } from "fs";
7
7
  import { mkdir, readFile } from "fs/promises";
@@ -1,6 +1,6 @@
1
1
  import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
2
- import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
3
2
  import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
3
+ import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
4
4
  import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET } from "../agent/context/workspace.js";
5
5
  import { isPathUnderWorkspace, resolveWorkspaceSafePath } from "./workspace-editor-path.js";
6
6
  import { seedAgentProfileMarkdownFiles } from "../agent/context/workspace-seed.js";
@@ -1,6 +1,6 @@
1
+ import { getTunnelService } from "../tunnel/tunnel-service.js";
1
2
  import { resolveReverseProxyPublicUrl } from "./public-url.js";
2
3
  import { getTailscaleExposureState } from "./tailscale-lifecycle.js";
3
- import { getTunnelService } from "../tunnel/tunnel-service.js";
4
4
  import crypto from "node:crypto";
5
5
  //#region src/gateway/device-routes.ts
6
6
  function secureUrl(value) {
@@ -1,7 +1,7 @@
1
1
  import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_agent_scope, resolveAgentProfileDir } from "../agent/agent-scope.js";
3
- import { extractProfileAgentId } from "../config/agent-profile.js";
4
3
  import { init_paths, resolveConfigPath, resolveSkillsDir } from "../config/paths.js";
4
+ import { extractProfileAgentId } from "../config/agent-profile.js";
5
5
  import { isBareProfileMarkdownFileName, resolveProfileMarkdownPathIfBareName } from "../agent/tools/tool-paths.js";
6
6
  import { isPathUnderWorkspace, resolveWorkspaceSafePath } from "./workspace-editor-path.js";
7
7
  import { basename, isAbsolute, resolve } from "node:path";
@@ -1,9 +1,9 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { shouldSilence, stripHeartbeatToken } from "../../heartbeat/tokens.js";
4
- import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
5
4
  import { isWithinActiveHours } from "../../heartbeat/active-hours.js";
6
5
  import { isHeartbeatContentEmpty } from "../../heartbeat/content-check.js";
6
+ import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
7
7
  import { createHeartbeatWake } from "../../heartbeat/wake.js";
8
8
  import { resolveHeartbeatMdPath } from "../workspace-heartbeat-path.js";
9
9
  import { readFile } from "fs/promises";
@@ -1,17 +1,17 @@
1
1
  import { ContextPlanningConfigSchema, KnowledgeMemoryConfigSchema, UserModelConfigSchema, init_config } from "../../../user-context/config.js";
2
2
  import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
3
3
  import { resolveModelsJsonPath } from "../../../config/paths.js";
4
- import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, getChannelSetupStatus, init_channel_catalog_service } from "../../../channels/catalog/channel-catalog-service.js";
5
4
  import { init_models_json, loadModelsJson } from "../../../config/models-json.js";
6
5
  import { CredentialResolver, init_credentials } from "../../../auth/credentials.js";
6
+ import { buildChannelCatalogForConfig, buildChannelCatalogFromSnapshot, getChannelSetupStatus, init_channel_catalog_service } from "../../../channels/catalog/channel-catalog-service.js";
7
7
  import { getProviderRegistry, init_plugin_registry } from "../../../providers/plugin-registry.js";
8
8
  import { getAllProviders, init_providers, isProviderConfigured } from "../../../providers/index.js";
9
9
  import { normalizeConfiguredMcpServers } from "../../../config/mcp-config-normalize.js";
10
10
  import { resolveShareConfig } from "../../../share/share-config.js";
11
+ import { maskTunnelSecretForWeb } from "../../../tunnel/env.js";
11
12
  import { resolveSessionConfigForWeb, resolveUpdateConfigForWeb } from "../../../config/web-patch.js";
12
13
  import { GENERIC_MASKED_SECRET, maskSecretLength } from "./mask-secret-length.js";
13
14
  import { safeToolsWebForGet } from "../../config-tools-web.js";
14
- import { maskTunnelSecretForWeb } from "../../../tunnel/env.js";
15
15
  import { buildSafeProvidersConfigForWeb } from "./safe-providers-config.js";
16
16
  import { maskRealtimeVoiceConfigForWeb, maskSttConfigForWeb, maskTtsConfigForWeb } from "./safe-voice-config.js";
17
17
  //#region src/gateway/hono/lib/config-payload.ts