@xopcai/xopc 0.0.221 → 0.0.223

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 (232) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-NItGQmvR.js → activity-store--GBciH10.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B8SBTGg3.js → agent-avatar-dicebear-C93T3FLD.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-Ba4XF0Im.js +68 -0
  6. package/dist/gateway/static/root/assets/{api-53ZXsuyr.js → api-HoIz_ija.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-BtmPXaqu.js → app-management-settings-panel-Bhl8Xluk.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-t7HoJyNN.js → appearance-settings-CywEN-kG.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-BZY09nuJ.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-D8o8CP9Y.js → archive-plugin-CteCVsBP.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-CsLXzas8.js → attachment-load-CbNE_EPd.js} +1 -1
  12. package/dist/gateway/static/root/assets/{automations-page-D-zgoAKz.js → automations-page-Bcqk6tOx.js} +1 -1
  13. package/dist/gateway/static/root/assets/automations-workspace-DtI6vsMf.js +6 -0
  14. package/dist/gateway/static/root/assets/{binary-plugins-B-MjP_22.js → binary-plugins-M_i3WS5M.js} +1 -1
  15. package/dist/gateway/static/root/assets/block-editor-eg9LEH2o.js +184 -0
  16. package/dist/gateway/static/root/assets/browser-settings-page-kKwbvzjj.js +8 -0
  17. package/dist/gateway/static/root/assets/{browser-workflow-inputs-Bi6RSSpD.js → browser-workflow-inputs-1UZ0vnIy.js} +1 -1
  18. package/dist/gateway/static/root/assets/{browser-workflows-page-EEFHUm1i.js → browser-workflows-page-D8ATQqZ5.js} +2 -2
  19. package/dist/gateway/static/root/assets/capabilities-settings-panel-CZRcis8B.js +7 -0
  20. package/dist/gateway/static/root/assets/{capability-presets-api-pC2fno7r.js → capability-presets-api-yNqTIuyd.js} +1 -1
  21. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CgdRkwnk.js +3 -0
  22. package/dist/gateway/static/root/assets/{channel-recipient-api-B5Szgu_z.js → channel-recipient-api-krezGsKc.js} +1 -1
  23. package/dist/gateway/static/root/assets/channels-settings-DETCY0Ku.js +1 -0
  24. package/dist/gateway/static/root/assets/channels-status-swr-DMxB7slL.js +1 -0
  25. package/dist/gateway/static/root/assets/{chat-terminal-dock-DT-OFl4r.js → chat-terminal-dock-DQ5bB4Su.js} +2 -2
  26. package/dist/gateway/static/root/assets/connectors-page-D9D92u28.js +2 -0
  27. package/dist/gateway/static/root/assets/{cron-expression-MZ_AJqrm.js → cron-expression-CEwPkdhh.js} +1 -1
  28. package/dist/gateway/static/root/assets/{date-picker-Bv9hZLuD.js → date-picker-DDAxTir8.js} +1 -1
  29. package/dist/gateway/static/root/assets/{dependency-picker-D-6oO_Vk.js → dependency-picker-CYVoSZwI.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-CiI5caKj.js → desktop-pet-CrNKfW_c.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-settings-DhkSOy4K.js → desktop-pet-settings-C06PaB46.js} +1 -1
  32. package/dist/gateway/static/root/assets/{directory-picker-path-field-C4s4Pz8I.js → directory-picker-path-field--D7laeLF.js} +1 -1
  33. package/dist/gateway/static/root/assets/dist-DaxPZj9e.js +1 -0
  34. package/dist/gateway/static/root/assets/{dist-DY4Af0fY.js → dist-J_ySZvz0.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-debug-page-DE7J1-6W.js → extension-debug-page-Dn4Px9KQ.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-page-DSnACD7E.js → extension-page-DzLf3fMQ.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-settings-page-Dk7k2Pok.js → extension-settings-page-DIchwtvB.js} +1 -1
  38. package/dist/gateway/static/root/assets/floating-ui.dom-B7uQOZZW.js +1 -0
  39. package/dist/gateway/static/root/assets/{gateway-config-api-IOA1OlHx.js → gateway-config-api-SmTGLhqK.js} +1 -1
  40. package/dist/gateway/static/root/assets/{gateway-config-swr-BzTbnu4O.js → gateway-config-swr-yUxMMVjK.js} +1 -1
  41. package/dist/gateway/static/root/assets/{gateway-settings-FX7QsgSQ.js → gateway-settings-yCDkOYzA.js} +1 -1
  42. package/dist/gateway/static/root/assets/{gateway-startup-retry-B2zpkNvi.js → gateway-startup-retry-9mrsL84j.js} +1 -1
  43. package/dist/gateway/static/root/assets/heartbeat-settings-CquIULHX.js +1 -0
  44. package/dist/gateway/static/root/assets/home-page-COSGBh4c.js +1 -0
  45. package/dist/gateway/static/root/assets/{image-generation-api-BXRjz-iY.js → image-generation-api-CgFAGDi8.js} +1 -1
  46. package/dist/gateway/static/root/assets/index-5XkDWH_Q.css +2 -0
  47. package/dist/gateway/static/root/assets/index-wnDPGRTi.js +74 -0
  48. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BjYiM4xq.js → keyboard-shortcuts-settings-DI2To7yl.js} +1 -1
  49. package/dist/gateway/static/root/assets/local-app-workbench-page-CAF5SZXv.js +2 -0
  50. package/dist/gateway/static/root/assets/{local-apps-page-7DHvwSgA.js → local-apps-page-CSEJsQ1F.js} +1 -1
  51. package/dist/gateway/static/root/assets/{locale-store-iKjqemWG.js → locale-store-CPylQjH9.js} +1 -1
  52. package/dist/gateway/static/root/assets/logs-page-D1KFPHL1.js +2 -0
  53. package/dist/gateway/static/root/assets/{management-settings-BSxppo9Z.js → management-settings-CgyaIyuk.js} +1 -1
  54. package/dist/gateway/static/root/assets/{markdown-split-D4oDjZtl.js → markdown-split-paG9qap9.js} +1 -1
  55. package/dist/gateway/static/root/assets/markdown-view-CUsob4Pz.js +69 -0
  56. package/dist/gateway/static/root/assets/{media-plugins-BPNTGROA.js → media-plugins-0Q-c_QIy.js} +1 -1
  57. package/dist/gateway/static/root/assets/messages-B82nsi9k.js +3 -0
  58. package/dist/gateway/static/root/assets/notes-api-CfKZYrBC.js +1 -0
  59. package/dist/gateway/static/root/assets/{notes-page-DU5tKPTq.js → notes-page-Bvb-ycX_.js} +1 -1
  60. package/dist/gateway/static/root/assets/notes-workbench-DelxGBof.js +4 -0
  61. package/dist/gateway/static/root/assets/oauth-authorization-window-Cdolr2wE.js +1 -0
  62. package/dist/gateway/static/root/assets/{popover-select-BzdnTy3h.js → popover-select-CccGri5Y.js} +1 -1
  63. package/dist/gateway/static/root/assets/{product-open-page-CPoQvD6P.js → product-open-page-DrvBwAns.js} +1 -1
  64. package/dist/gateway/static/root/assets/project-detail-page-C2EnYXEQ.js +1 -0
  65. package/dist/gateway/static/root/assets/projects-page-BiMPU6Oa.js +1 -0
  66. package/dist/gateway/static/root/assets/{registry-api-Cx3JxXSL.js → registry-api-B_5D8epF.js} +1 -1
  67. package/dist/gateway/static/root/assets/remote-access-hub-CpbNivVs.js +1 -0
  68. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-xqnWcvIv.js → runtime-tools-settings-panel-DKjdN4Lr.js} +1 -1
  69. package/dist/gateway/static/root/assets/{schema-form-CuIDPYu6.js → schema-form-DskqaNqC.js} +1 -1
  70. package/dist/gateway/static/root/assets/sessions-page-BxKtzsKI.js +1 -0
  71. package/dist/gateway/static/root/assets/settings-advanced-gate-BfBKMMUx.js +1 -0
  72. package/dist/gateway/static/root/assets/{settings-form-section-DkAv9ncE.js → settings-form-section-CZlMvHA9.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BJUQiEKb.js → settings-loading-skeleton-DS6lcAg9.js} +1 -1
  74. package/dist/gateway/static/root/assets/{settings-page-KHRbLwmw.js → settings-page-oE5J9tsV.js} +1 -1
  75. package/dist/gateway/static/root/assets/{setup-status-panel-C8jd20Db.js → setup-status-panel-C7oFCIqD.js} +1 -1
  76. package/dist/gateway/static/root/assets/share-preview-page-CPFAj8NE.js +2 -0
  77. package/dist/gateway/static/root/assets/shares-settings-B46DWZK4.js +1 -0
  78. package/dist/gateway/static/root/assets/skill-reload-api-CyKolUZ-.js +1 -0
  79. package/dist/gateway/static/root/assets/{skills-page-CKhR9J81.js → skills-page-Bh4gFi8e.js} +1 -1
  80. package/dist/gateway/static/root/assets/{skills-page.utils-AYX-e5sD.js → skills-page.utils-BQaUWP9z.js} +1 -1
  81. package/dist/gateway/static/root/assets/{system-settings-panel-IIF-K9ML.js → system-settings-panel-COAZoh_O.js} +1 -1
  82. package/dist/gateway/static/root/assets/task-detail-page-CXkhprf-.js +1 -0
  83. package/dist/gateway/static/root/assets/{theme-store-BOD2D0dJ.js → theme-store-BN-32Fz5.js} +1 -1
  84. package/dist/gateway/static/root/assets/{use-autosave-DcktF1j1.js → use-autosave-BAkToU15.js} +1 -1
  85. package/dist/gateway/static/root/assets/user-context-page-Br5wgARM.js +1 -0
  86. package/dist/gateway/static/root/assets/{voice-api-key-field-BMkNTHHE.js → voice-api-key-field-CC4z9-ux.js} +1 -1
  87. package/dist/gateway/static/root/assets/{work-discovery-overlay-DVoiXekA.js → work-discovery-overlay-dLVUYSSE.js} +1 -1
  88. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-Cw4LQjuM.js → workflow-run-setup-panel-BYU5-0KF.js} +2 -2
  89. package/dist/gateway/static/root/assets/workflows-page-CJ24a1HM.js +5 -0
  90. package/dist/gateway/static/root/index.html +15 -14
  91. package/dist/package.js +1 -1
  92. package/dist/src/agent/agent-instance-gateway.d.ts +3 -0
  93. package/dist/src/agent/agent-manager.d.ts +3 -0
  94. package/dist/src/agent/agent-manager.js +34 -28
  95. package/dist/src/agent/embedded/index.d.ts +1 -1
  96. package/dist/src/agent/embedded/index.js +2 -2
  97. package/dist/src/agent/embedded/model-runtime.js +1 -1
  98. package/dist/src/agent/embedded/run-for-session.js +102 -63
  99. package/dist/src/agent/embedded/run-turn.js +56 -28
  100. package/dist/src/agent/embedded/runs.d.ts +16 -29
  101. package/dist/src/agent/embedded/runs.js +44 -65
  102. package/dist/src/agent/embedded/types.d.ts +4 -0
  103. package/dist/src/agent/image/tool-model-config.js +1 -1
  104. package/dist/src/agent/ipc/inbox.js +1 -1
  105. package/dist/src/agent/memory/create-memory-manager.js +1 -1
  106. package/dist/src/agent/orchestration/agent-run-supervisor.d.ts +28 -0
  107. package/dist/src/agent/orchestration/agent-run-supervisor.js +49 -0
  108. package/dist/src/agent/orchestration/agent-turn-policy.d.ts +18 -0
  109. package/dist/src/agent/orchestration/agent-turn-policy.js +36 -0
  110. package/dist/src/agent/orchestration/llm-turn-retry.d.ts +5 -0
  111. package/dist/src/agent/orchestration/llm-turn-retry.js +34 -4
  112. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +10 -1
  113. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +25 -4
  114. package/dist/src/agent/service/async-queue.d.ts +16 -3
  115. package/dist/src/agent/service/async-queue.js +29 -11
  116. package/dist/src/agent/service/process-direct-streaming.js +27 -4
  117. package/dist/src/agent/service.js +3 -2
  118. package/dist/src/agent/session/session-inspector.js +1 -1
  119. package/dist/src/agent/skills/hub-lock.js +1 -1
  120. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  121. package/dist/src/agent/tools/exec-command.d.ts +2 -0
  122. package/dist/src/agent/tools/exec-command.js +70 -7
  123. package/dist/src/agent-runtime/index.js +1 -1
  124. package/dist/src/agent-runtime/runtime-profile.js +1 -1
  125. package/dist/src/ai-assist/text-assist.js +1 -1
  126. package/dist/src/auth/credentials.js +2 -2
  127. package/dist/src/auth/oauth/index.js +3 -3
  128. package/dist/src/auth/oauth/registry.d.ts +2 -0
  129. package/dist/src/auth/oauth/registry.js +20 -12
  130. package/dist/src/auth/oauth/xopc-cloud.d.ts +1 -0
  131. package/dist/src/auth/oauth/xopc-cloud.js +32 -16
  132. package/dist/src/auth/profiles/store.js +1 -1
  133. package/dist/src/auth/sync-provider-auth.js +2 -2
  134. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  135. package/dist/src/channels/attachments/voice-stt-webchat.js +20 -3
  136. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  137. package/dist/src/cli/commands/models.js +1 -1
  138. package/dist/src/cli/commands/tunnel.js +4 -5
  139. package/dist/src/config/index.js +4 -4
  140. package/dist/src/config/loader.js +1 -1
  141. package/dist/src/config/models-json.js +1 -1
  142. package/dist/src/config/schema.d.ts +18 -0
  143. package/dist/src/config/schema.js +19 -1
  144. package/dist/src/connectors/learning-coordinator.js +3 -19
  145. package/dist/src/extensions/lockfile.js +1 -1
  146. package/dist/src/gateway/agents-admin.js +1 -1
  147. package/dist/src/gateway/file-path-classifier.js +1 -1
  148. package/dist/src/gateway/hono/app.js +2 -1
  149. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  150. package/dist/src/gateway/hono/oauth-async.d.ts +1 -0
  151. package/dist/src/gateway/hono/oauth-async.js +11 -4
  152. package/dist/src/gateway/hono/routes/config.js +10 -0
  153. package/dist/src/gateway/hono/routes/host-fs.js +40 -1
  154. package/dist/src/gateway/hono/routes/media.js +33 -1
  155. package/dist/src/gateway/hono/routes/models.js +1 -1
  156. package/dist/src/gateway/hono/routes/notes.js +162 -7
  157. package/dist/src/gateway/hono/routes/shares.js +141 -6
  158. package/dist/src/gateway/hono/routes/tunnel.js +47 -10
  159. package/dist/src/gateway/hono/routes/voice.d.ts +2 -6
  160. package/dist/src/gateway/hono/routes/voice.js +28 -5
  161. package/dist/src/gateway/service/config-coordinator.js +1 -1
  162. package/dist/src/gateway/service.js +3 -3
  163. package/dist/src/notes/service.d.ts +6 -2
  164. package/dist/src/notes/service.js +36 -4
  165. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  166. package/dist/src/providers/index.js +3 -3
  167. package/dist/src/providers/model-registry.js +1 -1
  168. package/dist/src/providers/register-runtime-providers.js +1 -1
  169. package/dist/src/share/note-share-service.d.ts +67 -0
  170. package/dist/src/share/note-share-service.js +283 -0
  171. package/dist/src/share/share-config.js +32 -3
  172. package/dist/src/share/share-landing.d.ts +5 -1
  173. package/dist/src/share/share-landing.js +28 -1
  174. package/dist/src/share/share-store.d.ts +34 -5
  175. package/dist/src/share/share-store.js +125 -19
  176. package/dist/src/share/share-thumbnail.js +4 -2
  177. package/dist/src/share/share-types.d.ts +52 -14
  178. package/dist/src/share/share-types.js +9 -0
  179. package/dist/src/share/share-zip.d.ts +2 -2
  180. package/dist/src/tui/tui-startup-resources.js +1 -1
  181. package/dist/src/tui/tui.js +1 -1
  182. package/dist/src/tunnel/env.d.ts +12 -6
  183. package/dist/src/tunnel/env.js +34 -26
  184. package/dist/src/tunnel/gateway-lifecycle.js +2 -13
  185. package/dist/src/tunnel/index.d.ts +1 -1
  186. package/dist/src/tunnel/index.js +2 -2
  187. package/dist/src/tunnel/tunnel-audit.d.ts +1 -1
  188. package/dist/src/tunnel/tunnel-config.d.ts +1 -1
  189. package/dist/src/tunnel/tunnel-config.js +9 -4
  190. package/dist/src/tunnel/tunnel-service.d.ts +1 -1
  191. package/dist/src/tunnel/tunnel-service.js +3 -0
  192. package/dist/src/tunnel/well-known.d.ts +1 -1
  193. package/dist/src/tunnel/well-known.js +1 -1
  194. package/dist/src/tunnel/xopc-cloud-registration.d.ts +9 -0
  195. package/dist/src/tunnel/xopc-cloud-registration.js +42 -0
  196. package/dist/src/voice/audio/normalize.d.ts +7 -0
  197. package/dist/src/voice/audio/normalize.js +30 -4
  198. package/dist/src/voice/local/runtime-worker.js +26 -6
  199. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  200. package/package.json +8 -14
  201. package/dist/gateway/static/root/assets/agents-Brs2-m6t.js +0 -68
  202. package/dist/gateway/static/root/assets/apps-page-DJ_Dsb1j.js +0 -1
  203. package/dist/gateway/static/root/assets/automations-workspace-DehLRXfd.js +0 -6
  204. package/dist/gateway/static/root/assets/block-editor-i4CfDqLG.js +0 -184
  205. package/dist/gateway/static/root/assets/browser-settings-page-C3QIO4Ti.js +0 -8
  206. package/dist/gateway/static/root/assets/capabilities-settings-panel-BHhUp7FW.js +0 -7
  207. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DoClNVLz.js +0 -3
  208. package/dist/gateway/static/root/assets/channels-settings-Je-9a5ZC.js +0 -1
  209. package/dist/gateway/static/root/assets/channels-status-swr-ByRbxC6z.js +0 -1
  210. package/dist/gateway/static/root/assets/connectors-page-D8z9Trw4.js +0 -2
  211. package/dist/gateway/static/root/assets/dist-C230izr8.js +0 -1
  212. package/dist/gateway/static/root/assets/heartbeat-settings-D5CGVyci.js +0 -1
  213. package/dist/gateway/static/root/assets/home-page-DzfZFZx5.js +0 -1
  214. package/dist/gateway/static/root/assets/index-Dcj5KJRg.css +0 -2
  215. package/dist/gateway/static/root/assets/index-EvA8c7fo.js +0 -74
  216. package/dist/gateway/static/root/assets/local-app-workbench-page-hPyTaVYU.js +0 -2
  217. package/dist/gateway/static/root/assets/logs-page-DW0xMKWP.js +0 -2
  218. package/dist/gateway/static/root/assets/markdown-view-DYkxMtJA.js +0 -69
  219. package/dist/gateway/static/root/assets/messages-kx5W39dO.js +0 -3
  220. package/dist/gateway/static/root/assets/notes-api-DJizatxh.js +0 -1
  221. package/dist/gateway/static/root/assets/notes-workbench-D669d98r.js +0 -4
  222. package/dist/gateway/static/root/assets/project-detail-page-CpsQ9PTA.js +0 -1
  223. package/dist/gateway/static/root/assets/projects-page-CitO1LMc.js +0 -1
  224. package/dist/gateway/static/root/assets/remote-access-hub-C9-bL4V6.js +0 -1
  225. package/dist/gateway/static/root/assets/sessions-page-CPSARi4y.js +0 -1
  226. package/dist/gateway/static/root/assets/settings-advanced-gate-BxT80Fmr.js +0 -1
  227. package/dist/gateway/static/root/assets/share-preview-page-WCVtJ3sX.js +0 -2
  228. package/dist/gateway/static/root/assets/shares-settings-DrQ_cOXh.js +0 -1
  229. package/dist/gateway/static/root/assets/skill-reload-api-C_4cG30x.js +0 -1
  230. package/dist/gateway/static/root/assets/task-detail-page-CYjsecEr.js +0 -1
  231. package/dist/gateway/static/root/assets/user-context-page-Cy1D2hkt.js +0 -1
  232. package/dist/gateway/static/root/assets/workflows-page-DKKH1_Yt.js +0 -5
@@ -38,7 +38,7 @@ function configureTunnel(ctx) {
38
38
  const brokerUrl = resolveTunnelBrokerUrl(config.tunnel?.brokerUrl);
39
39
  getTunnelService().configure({
40
40
  brokerUrl,
41
- registrationSecret: resolveTunnelRegistrationSecret(process.env, brokerUrl, config.tunnel?.registrationSecret),
41
+ registrationSecret: resolveTunnelRegistrationSecret(brokerUrl, config.tunnel?.registrationSecret),
42
42
  autoStart: config.tunnel?.autoStart ?? false,
43
43
  gatewayHost: host,
44
44
  frpSubdomainHost: resolveFrpSubdomainHost(resolveTunnelBrokerUrl(config.tunnel?.brokerUrl))
@@ -131,13 +131,12 @@ function createTunnelCommand(ctx) {
131
131
  });
132
132
  console.log("Tunnel security consent recorded.");
133
133
  });
134
- cmd.command("secret").description("Manage tunnel broker registration secret in config").command("set").description("Save tunnel.registrationSecret to xopc.json (env XOPC_TUNNEL_REGISTRATION_SECRET overrides at runtime)").argument("[secret]", "Registration secret (prompts securely when omitted in a TTY)").option("--stdin", "Read secret from stdin (single line, trimmed)").action(async (secretArg, opts) => {
134
+ cmd.command("secret").description("Manage tunnel broker registration secret in config").command("set").description("Save tunnel.registrationSecret to xopc.json").argument("[secret]", "Registration secret (prompts securely when omitted in a TTY)").option("--stdin", "Read secret from stdin (single line, trimmed)").action(async (secretArg, opts) => {
135
135
  try {
136
136
  await saveTunnelRegistrationSecret(ctx, await readTunnelRegistrationSecretFromCli({
137
137
  secretArg,
138
138
  stdin: opts.stdin
139
139
  }));
140
- if (process.env.XOPC_TUNNEL_REGISTRATION_SECRET?.trim()) console.log("Note: XOPC_TUNNEL_REGISTRATION_SECRET is set in the environment and overrides the saved config at runtime.");
141
140
  console.log(`Saved tunnel registration secret to ${ctx.configPath}.`);
142
141
  } catch (err) {
143
142
  const em = err instanceof Error ? err.message : String(err);
@@ -227,7 +226,7 @@ function createTunnelCommand(ctx) {
227
226
  console.log(`# Self-hosted FRP broker sketch for ${domain}`);
228
227
  console.log("# 1. Run frps with vhost HTTP/HTTPS and a registration token");
229
228
  console.log(`# 2. Point tunnel.brokerUrl to https://${domain}/api`);
230
- console.log(`# 3. Set XOPC_TUNNEL_REGISTRATION_SECRET in the gateway environment`);
229
+ console.log("# 3. Save the broker registration key as tunnel.registrationSecret");
231
230
  console.log("");
232
231
  console.log(JSON.stringify({
233
232
  frps: {
@@ -237,7 +236,7 @@ function createTunnelCommand(ctx) {
237
236
  },
238
237
  broker: {
239
238
  apiUrl: `https://${domain}/api`,
240
- registrationSecretEnv: "XOPC_TUNNEL_REGISTRATION_SECRET"
239
+ registrationSecretConfig: "tunnel.registrationSecret"
241
240
  }
242
241
  }, null, 2));
243
242
  }));
@@ -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, AgentTypedModelRoleSchema, 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, 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 { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
5
+ import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.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, resolveEffectiveAgentManifestForAgent, resolveEffectiveAgentManifestForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
9
10
  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, resolveModelsJsonPath, resolveNodeBinDir, resolveNodeBinPath, resolveNodeToolsDir, resolveNpmBinPath, resolveOAuthPath, resolvePidPath, resolveSkillPath, resolveSkillsCachePath, resolveSkillsDir, resolveSkillsLockPath, resolveSocketPath, resolveStatusPath, resolveToolsDir, resolveWorkspaceExtensionsDir, resolveWorkspaceFile, resolveWorkspaceStateDir, resolveWorkspaceStatePath, resolveXopcBinPath } from "./paths.js";
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
11
  import { init_loader, loadConfig, saveConfig } from "./loader.js";
12
- import { applyConfigOverrides, getConfigOverrides, resetConfigOverrides, setConfigOverride, unsetConfigOverride } from "./runtime-overrides.js";
13
- import { extractProfileAgentId, resolveEffectiveAgentManifestForAgent, resolveEffectiveAgentManifestForSession, resolveEffectiveAgentProfile, resolveEffectiveAgentProfileForSession } from "./agent-profile.js";
12
+ import { clearConfigValueCache, getAllowedCommands, getCacheStats, init_resolve_config_value, resolveConfigValue, resolveHeaders, testApiKeyResolution } from "./resolve-config-value.js";
13
+ 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";
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,8 +2,8 @@ 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_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
6
5
  import { init_paths, resolveConfigPath } from "./paths.js";
6
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
7
7
  import { assertChannelPluginConfigs, init_validate_channel_configs } from "./validate-channel-configs.js";
8
8
  import { dirname } from "path";
9
9
  import { existsSync, mkdirSync, promises, readFileSync } from "fs";
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
3
2
  import { init_paths, resolveModelsJsonPath } from "./paths.js";
3
+ import { init_write_file_atomic, writeTextAtomicSync } from "../infra/write-file-atomic.js";
4
4
  import { existsSync, readFileSync } from "fs";
5
5
  import { z } from "zod";
6
6
  //#region src/config/models-json.ts
@@ -991,6 +991,15 @@ export declare const GatewayConfigSchema: z.ZodDefault<z.ZodObject<{
991
991
  listingCacheMs: z.ZodDefault<z.ZodNumber>;
992
992
  zipConcurrency: z.ZodDefault<z.ZodNumber>;
993
993
  }, z.core.$strip>>;
994
+ note: z.ZodDefault<z.ZodObject<{
995
+ enabled: z.ZodDefault<z.ZodBoolean>;
996
+ maxMarkdownBytes: z.ZodDefault<z.ZodNumber>;
997
+ maxAttachmentCount: z.ZodDefault<z.ZodNumber>;
998
+ maxAttachmentSize: z.ZodDefault<z.ZodNumber>;
999
+ maxTotalSize: z.ZodDefault<z.ZodNumber>;
1000
+ assetTicketTtlMs: z.ZodDefault<z.ZodNumber>;
1001
+ revokeOnSourceDelete: z.ZodDefault<z.ZodBoolean>;
1002
+ }, z.core.$strip>>;
994
1003
  }, z.core.$strip>>;
995
1004
  siteShare: z.ZodOptional<z.ZodObject<{
996
1005
  enabled: z.ZodDefault<z.ZodBoolean>;
@@ -2067,6 +2076,15 @@ export declare const ConfigSchema: z.ZodDefault<z.ZodObject<{
2067
2076
  listingCacheMs: z.ZodDefault<z.ZodNumber>;
2068
2077
  zipConcurrency: z.ZodDefault<z.ZodNumber>;
2069
2078
  }, z.core.$strip>>;
2079
+ note: z.ZodDefault<z.ZodObject<{
2080
+ enabled: z.ZodDefault<z.ZodBoolean>;
2081
+ maxMarkdownBytes: z.ZodDefault<z.ZodNumber>;
2082
+ maxAttachmentCount: z.ZodDefault<z.ZodNumber>;
2083
+ maxAttachmentSize: z.ZodDefault<z.ZodNumber>;
2084
+ maxTotalSize: z.ZodDefault<z.ZodNumber>;
2085
+ assetTicketTtlMs: z.ZodDefault<z.ZodNumber>;
2086
+ revokeOnSourceDelete: z.ZodDefault<z.ZodBoolean>;
2087
+ }, z.core.$strip>>;
2070
2088
  }, z.core.$strip>>;
2071
2089
  siteShare: z.ZodOptional<z.ZodObject<{
2072
2090
  enabled: z.ZodDefault<z.ZodBoolean>;
@@ -490,7 +490,7 @@ strict: z.boolean().optional() }).optional();
490
490
  TunnelConfigSchema = z.object({
491
491
  enabled: z.boolean().default(false),
492
492
  brokerUrl: z.string().url().default("https://frp.xopc.ai/api"),
493
- /** Broker register API secret (env `XOPC_TUNNEL_REGISTRATION_SECRET` overrides when set). */
493
+ /** Broker register API secret. */
494
494
  registrationSecret: z.string().min(1).optional(),
495
495
  autoStart: z.boolean().default(false),
496
496
  subdomain: z.string().optional(),
@@ -620,6 +620,24 @@ activityDetailDefault: z.enum([
620
620
  maxDepth: 20,
621
621
  listingCacheMs: 6e4,
622
622
  zipConcurrency: 1
623
+ }),
624
+ /** Note snapshot-sharing controls. */
625
+ note: z.object({
626
+ enabled: z.boolean().default(true),
627
+ maxMarkdownBytes: z.number().int().min(1024).max(10485760).default(2097152),
628
+ maxAttachmentCount: z.number().int().min(0).max(500).default(50),
629
+ maxAttachmentSize: z.number().int().min(1024).max(1073741824).default(104857600),
630
+ maxTotalSize: z.number().int().min(1024).max(2147483648).default(262144e3),
631
+ assetTicketTtlMs: z.number().int().min(6e4).max(36e5).default(6e5),
632
+ revokeOnSourceDelete: z.boolean().default(true)
633
+ }).default({
634
+ enabled: true,
635
+ maxMarkdownBytes: 2097152,
636
+ maxAttachmentCount: 50,
637
+ maxAttachmentSize: 104857600,
638
+ maxTotalSize: 262144e3,
639
+ assetTicketTtlMs: 6e5,
640
+ revokeOnSourceDelete: true
623
641
  })
624
642
  }).optional(),
625
643
  /** Site-share configuration (static directory or reverse-proxy a local dev server). */
@@ -10,7 +10,7 @@ import { connectorIdentityKey, normalizeConnectorIdentity } from "./connector-id
10
10
  import { ComposioSessionsAdapter } from "./composio-sessions.js";
11
11
  import { buildConnectorLearningArguments, getConnectorLearningPlan } from "./learning-recipes.js";
12
12
  import { getConnectorDefinition } from "./catalog.js";
13
- import { createUnderstandingSourceRun, getUnderstandingSourceGrant, listUnderstandingSourceRuns, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant, upsertUserFocus } from "../user-context/sources/repository.js";
13
+ import { createUnderstandingSourceRun, getUnderstandingSourceGrant, listUnderstandingSourceRuns, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
14
14
  import { claimRegisteredExtraction } from "../user-context/extraction/registry.js";
15
15
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
16
16
  import { ConnectedKnowledgePipeline } from "../knowledge/connected-knowledge-pipeline.js";
@@ -227,20 +227,10 @@ function startConnectorLearningCoordinator(options) {
227
227
  };
228
228
  if (structuralExtraction.shouldExecute) try {
229
229
  understanding = await new ConnectedUnderstandingPipeline(options.getMemoryManager()).process(job.agentId, structuralExtraction.run.id);
230
- const structuralFocuses = understanding.createdRecords.filter((item) => item.kind === "project_context").map((record) => upsertUserFocus({
231
- canonicalKey: `connector-focus:${job.accountId}:${record.id}`,
232
- title: record.content.slice(0, 120),
233
- summary: record.content,
234
- horizon: "ongoing",
235
- status: "candidate",
236
- confidence: .72,
237
- evidenceRefs: [`connector-account:${job.accountId}`],
238
- sourceRunId: sourceRun.id
239
- }));
240
230
  finishContextExtractionRun({
241
231
  runId: structuralExtraction.run.id,
242
232
  status: "completed",
243
- outputs: [...(understanding.writeOutputs ?? []).map((output) => ({
233
+ outputs: (understanding.writeOutputs ?? []).map((output) => ({
244
234
  candidateKey: output.candidateKey,
245
235
  ...output.objectId ? {
246
236
  objectType: "understanding",
@@ -248,13 +238,7 @@ function startConnectorLearningCoordinator(options) {
248
238
  } : {},
249
239
  ...output.versionId ? { versionId: output.versionId } : {},
250
240
  outcome: output.outcome
251
- })), ...structuralFocuses.map((focus) => ({
252
- candidateKey: focus.canonicalKey,
253
- objectType: "focus",
254
- objectId: focus.id,
255
- versionId: focus.versionId,
256
- outcome: "created"
257
- }))]
241
+ }))
258
242
  });
259
243
  } catch (error) {
260
244
  finishContextExtractionRun({
@@ -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_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
4
3
  import { init_paths, resolveExtensionsDir, resolveExtensionsLockPath } from "../config/paths.js";
4
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
5
5
  import { dirname, join } from "path";
6
6
  import { existsSync } from "fs";
7
7
  import { mkdir, readFile } from "fs/promises";
@@ -1,7 +1,7 @@
1
1
  import { resolveCapabilityPresetLayer, resolveEffectiveAgentManifest } from "../agent-manifest/resolver.js";
2
2
  import { init_agent_scope, listAgentEntries, normalizeAgentId, resolveAgentDir, resolveAgentProfileDir, resolveAgentWorkspaceDir, resolveDefaultAgentId, resolveUserPath, validateAgentIdForNewAgent } from "../agent/agent-scope.js";
3
- import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
4
3
  import { resolveEffectiveAgentProfile } from "../config/agent-profile.js";
4
+ import { WORKSPACE_FILES, init_paths } from "../config/paths.js";
5
5
  import { AGENT_PROFILE_MARKDOWN_SYSTEM_FILES, REQUIRED_AGENT_PROFILE_MARKDOWN_FILE_SET } from "../agent/context/workspace.js";
6
6
  import { isPathUnderWorkspace, resolveWorkspaceSafePath } from "./workspace-editor-path.js";
7
7
  import { seedAgentProfileMarkdownFiles } from "../agent/context/workspace-seed.js";
@@ -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 { init_paths, resolveConfigPath, resolveSkillsDir } from "../config/paths.js";
4
3
  import { extractProfileAgentId } from "../config/agent-profile.js";
4
+ import { init_paths, resolveConfigPath, resolveSkillsDir } from "../config/paths.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";
@@ -147,6 +147,7 @@ function createHonoApp(config) {
147
147
  const DEFAULT_API_BODY_MAX = 1 * 1024 * 1024;
148
148
  const SKILL_UPLOAD_BODY_MAX = 10 * 1024 * 1024;
149
149
  const NOTE_MEDIA_BODY_MAX = 25 * 1024 * 1024;
150
+ const MEDIA_UPLOAD_BODY_MAX = 33 * 1024 * 1024;
150
151
  const VOICE_TRANSCRIBE_BODY_MAX = 26 * 1024 * 1024;
151
152
  const SESSION_INPUT_BODY_MAX = maxSessionInputRequestBodyBytes();
152
153
  const isNoteMediaUploadRequest = (path, method, contentType) => {
@@ -175,7 +176,7 @@ function createHonoApp(config) {
175
176
  }));
176
177
  app.use("/api/*", async (c, next) => {
177
178
  const contentType = c.req.header("content-type");
178
- const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "POST" && /^\/api\/tasks\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isProjectFileUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
179
+ const maxSize = c.req.method === "POST" && c.req.path === "/api/tasks" || c.req.method === "POST" && /^\/api\/sessions\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "POST" && /^\/api\/tasks\/[^/]+\/inputs$/.test(c.req.path) || c.req.method === "PATCH" && /^\/api\/sessions\/[^/]+\/inputs\/[^/]+$/.test(c.req.path) ? SESSION_INPUT_BODY_MAX : c.req.path === "/api/skills/upload" ? SKILL_UPLOAD_BODY_MAX : c.req.path === "/api/voice/transcriptions" ? VOICE_TRANSCRIBE_BODY_MAX : c.req.path === "/api/media" && c.req.method === "POST" ? MEDIA_UPLOAD_BODY_MAX : isNoteMediaUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : isProjectFileUploadRequest(c.req.path, c.req.method, contentType) ? NOTE_MEDIA_BODY_MAX : discussionUploadBodyMax(c.req.path, c.req.method, contentType) ?? DEFAULT_API_BODY_MAX;
179
180
  const maxSizeMb = Math.ceil(maxSize / (1024 * 1024));
180
181
  return bodyLimit({
181
182
  maxSize,
@@ -1,9 +1,9 @@
1
1
  import { ContextCompactionPolicySchema, UserContextDreamingSchema, UserContextPrivacySchema, 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";
4
5
  import { init_models_json, loadModelsJson } from "../../../config/models-json.js";
5
6
  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";
@@ -23,6 +23,7 @@ export interface OAuthCompletionReadiness {
23
23
  export declare function buildOAuthCompletionReadiness(config: Config, catalog: CatalogReadiness): OAuthCompletionReadiness;
24
24
  export declare function refreshModelCatalogAfterOAuth(provider: string, service: Pick<GatewayService, 'getModelCatalogSync'>): Promise<CatalogReadiness | undefined>;
25
25
  export declare function normalizeDesktopOAuthReturnPath(value: unknown): string | undefined;
26
+ export declare function buildDesktopOAuthReturnUrl(provider: string, sessionId: string, returnPath: unknown): string | undefined;
26
27
  export declare function resolveOAuthLoginMethodPreference(params: {
27
28
  requestedMethod?: unknown;
28
29
  supportedMethods?: readonly string[];
@@ -82,11 +82,17 @@ function normalizeDesktopOAuthReturnPath(value) {
82
82
  if (path.length === 0 || path.length > 2048 || !path.startsWith("/") || path.startsWith("//") || path.includes("\\") || /[\u0000-\u001f\u007f]/.test(path)) return;
83
83
  return path;
84
84
  }
85
- function desktopOAuthReturnUrl(sessionId, returnPath) {
85
+ const DESKTOP_OAUTH_CALLBACK_PATHS = {
86
+ "xopc-cloud": "model-connected",
87
+ "xopc-tunnel": "tunnel-connected"
88
+ };
89
+ function buildDesktopOAuthReturnUrl(provider, sessionId, returnPath) {
90
+ const callbackPath = DESKTOP_OAUTH_CALLBACK_PATHS[provider];
91
+ if (!callbackPath) return void 0;
86
92
  const params = new URLSearchParams({ request_id: sessionId });
87
93
  const normalizedReturnPath = normalizeDesktopOAuthReturnPath(returnPath);
88
94
  if (normalizedReturnPath) params.set("return_path", normalizedReturnPath);
89
- return `xopc://cloud/model-connected?${params.toString()}`;
95
+ return `xopc://cloud/${callbackPath}?${params.toString()}`;
90
96
  }
91
97
  function cancelOAuthSession(session, message = "OAuth flow cancelled") {
92
98
  if (session.abortController) session.abortController.abort();
@@ -142,10 +148,11 @@ function createOAuthAsyncHandler(service) {
142
148
  const oauthProvider = OAUTH_PROVIDERS[provider];
143
149
  if (!oauthProvider) return c.json({ error: `Unknown OAuth provider: ${provider}` }, 400);
144
150
  const sessionId = generateSessionId();
151
+ const returnToAppUrl = body.client === "desktop" ? buildDesktopOAuthReturnUrl(provider, sessionId, body.returnPath) : void 0;
145
152
  const session = {
146
153
  id: sessionId,
147
154
  provider,
148
- ...body.client === "desktop" && provider === "xopc-cloud" ? { returnToAppUrl: desktopOAuthReturnUrl(sessionId, body.returnPath) } : {},
155
+ ...returnToAppUrl ? { returnToAppUrl } : {},
149
156
  preferredLoginMethod: preferredOAuthLoginMethod({
150
157
  provider,
151
158
  requestedMethod: body.loginMethod,
@@ -378,4 +385,4 @@ async function runOAuthFlow(session, oauthProvider, service) {
378
385
  }
379
386
  }
380
387
  //#endregion
381
- export { buildOAuthCompletionReadiness, createOAuthAsyncHandler, normalizeDesktopOAuthReturnPath, refreshModelCatalogAfterOAuth, resolveOAuthLoginMethodPreference };
388
+ export { buildDesktopOAuthReturnUrl, buildOAuthCompletionReadiness, createOAuthAsyncHandler, normalizeDesktopOAuthReturnPath, refreshModelCatalogAfterOAuth, resolveOAuthLoginMethodPreference };
@@ -1,4 +1,5 @@
1
1
  import { enumerateLanGatewayCandidates } from "../../host.js";
2
+ import { getTunnelService } from "../../../tunnel/tunnel-service.js";
2
3
  import { prepareLocalVoiceModelAfterProviderSwitch } from "../../../voice/local/provider-switch.js";
3
4
  import { buildSafeWebConfigPayload } from "../lib/config-payload.js";
4
5
  import { applyAgentsPatch } from "./config-patch/agents.js";
@@ -70,6 +71,15 @@ function registerConfigRoutes(authenticated, deps) {
70
71
  ok: false,
71
72
  error: finalGwCheck.error
72
73
  }, finalGwCheck.status);
74
+ if (body?.tunnel && typeof body.tunnel === "object" && !Array.isArray(body.tunnel) && body.tunnel.registrationSecret === null) try {
75
+ await getTunnelService().stop();
76
+ } catch (err) {
77
+ const message = err instanceof Error ? err.message : String(err);
78
+ return c.json({
79
+ ok: false,
80
+ error: `Failed to stop tunnel before clearing key: ${message}`
81
+ }, 500);
82
+ }
73
83
  const result = await service.saveConfig(config);
74
84
  if (!result.saved) return c.json({
75
85
  ok: false,
@@ -1,7 +1,7 @@
1
1
  import { createGatewayRouteLogger } from "../lib/route-logger.js";
2
2
  import * as os$1 from "node:os";
3
3
  import * as path$1 from "node:path";
4
- import { readdir, realpath, stat } from "node:fs/promises";
4
+ import { mkdir, readdir, realpath, stat } from "node:fs/promises";
5
5
  //#region src/gateway/hono/routes/host-fs.ts
6
6
  const log = createGatewayRouteLogger("HostFs");
7
7
  function jsonError(status, message) {
@@ -172,6 +172,45 @@ function registerHostFsRoutes(authenticated, _deps) {
172
172
  return jsonError(500, msg || "Failed to read directory");
173
173
  }
174
174
  });
175
+ /** Create one directory below an existing absolute directory on the gateway host. */
176
+ authenticated.post("/api/host/fs/directory", async (c) => {
177
+ const body = await c.req.json().catch(() => null);
178
+ const parentPath = body && typeof body === "object" && typeof body.parentPath === "string" ? body.parentPath.trim() : "";
179
+ const name = body && typeof body === "object" && typeof body.name === "string" ? body.name.trim() : "";
180
+ if (!parentPath || !path$1.isAbsolute(parentPath)) return jsonError(400, "An absolute parent path is required");
181
+ if (!name || name === "." || name === ".." || name.includes("/") || name.includes("\\") || name.includes("\0") || name.length > 255) return jsonError(400, "Invalid folder name");
182
+ let resolvedParent;
183
+ try {
184
+ resolvedParent = await realpath(path$1.normalize(parentPath));
185
+ if (!(await stat(resolvedParent)).isDirectory()) return jsonError(400, "Parent path is not a directory");
186
+ } catch (err) {
187
+ log.warn({
188
+ err,
189
+ path: parentPath
190
+ }, "Host fs create parent lookup failed");
191
+ return jsonError(404, "Parent path not found");
192
+ }
193
+ const directoryPath = path$1.join(resolvedParent, name);
194
+ try {
195
+ await mkdir(directoryPath);
196
+ const createdPath = await realpath(directoryPath);
197
+ log.info({ path: createdPath }, "Host fs directory created");
198
+ return c.json({
199
+ ok: true,
200
+ payload: { absolutePath: createdPath }
201
+ }, 201);
202
+ } catch (err) {
203
+ const code = err?.code;
204
+ if (code === "EEXIST") return jsonError(409, "A file or folder with this name already exists");
205
+ log.warn({
206
+ err,
207
+ path: directoryPath
208
+ }, "Host fs directory create failed");
209
+ if (code === "EACCES" || code === "EPERM" || code === "EROFS") return jsonError(403, "Permission denied");
210
+ if (code === "ENOENT") return jsonError(404, "Parent path not found");
211
+ return jsonError(500, "Failed to create folder");
212
+ }
213
+ });
175
214
  }
176
215
  //#endregion
177
216
  export { registerHostFsRoutes };
@@ -1,15 +1,47 @@
1
1
  import { TaskRepository } from "../../../tasks/task-repository.js";
2
2
  import { parseMediaUri } from "../../../media/uri.js";
3
- import { mimeTypeFromMediaPath } from "../../../media/store.js";
3
+ import { mimeTypeFromMediaPath, saveMediaBuffer } from "../../../media/store.js";
4
4
  import { readMediaReference } from "../../../media/media-reference.js";
5
5
  import { TaskContextRepository } from "../../../tasks/task-context-repository.js";
6
6
  import { pendingTranscriptReferencesMediaUri } from "../../../agent/inbound/attachment-pipeline.js";
7
+ import { MAX_WEBCHAT_ATTACHMENT_FILE_BYTES } from "../../chat-limits.js";
7
8
  import { messagesReferenceMediaUri } from "../../../media/session-references.js";
8
9
  import { createGatewayRouteLogger } from "../lib/route-logger.js";
9
10
  //#region src/gateway/hono/routes/media.ts
10
11
  const log = createGatewayRouteLogger("Media");
11
12
  function registerMediaRoutes(authenticated, deps) {
12
13
  const tasks = new TaskRepository();
14
+ authenticated.post("/api/media", deps.strictRateLimitMiddleware, async (c) => {
15
+ const file = (await c.req.formData().catch(() => null))?.get("file");
16
+ if (!(file instanceof Blob)) return c.json({
17
+ ok: false,
18
+ error: { message: "Missing required file field: file" }
19
+ }, 400);
20
+ if (file.size === 0) return c.json({
21
+ ok: false,
22
+ error: { message: "Uploaded file is empty" }
23
+ }, 400);
24
+ if (file.size > 33554432) return c.json({
25
+ ok: false,
26
+ error: { message: "Uploaded file exceeds 32 MB limit" }
27
+ }, 413);
28
+ const name = "name" in file && typeof file.name === "string" && file.name.trim() ? file.name.trim() : `upload-${Date.now()}`;
29
+ const saved = await saveMediaBuffer(Buffer.from(await file.arrayBuffer()), {
30
+ bucket: "inbound",
31
+ contentType: file.type || "application/octet-stream",
32
+ maxBytes: MAX_WEBCHAT_ATTACHMENT_FILE_BYTES,
33
+ originalFilename: name
34
+ });
35
+ return c.json({
36
+ ok: true,
37
+ payload: {
38
+ uri: saved.uri,
39
+ mimeType: saved.contentType,
40
+ name,
41
+ size: saved.size
42
+ }
43
+ }, 201);
44
+ });
13
45
  authenticated.get("/api/media/read", async (c) => {
14
46
  const uriRaw = c.req.query("uri");
15
47
  if (!uriRaw || typeof uriRaw !== "string") return c.json({
@@ -1,5 +1,5 @@
1
- import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
2
1
  import { resolveModelsJsonPath } from "../../../config/paths.js";
2
+ import { init_resolve_config_value, testApiKeyResolution } from "../../../config/resolve-config-value.js";
3
3
  import { init_models_json, loadModelsJson, saveModelsJson, validateModelsConfig } from "../../../config/models-json.js";
4
4
  import { getModelCatalogStore, init_model_catalog_store } from "../../../providers/model-catalog-store.js";
5
5
  import { getModelRegistry } from "../../../providers/model-registry.js";