@xopcai/xopc 0.0.231 → 0.0.233

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 (400) hide show
  1. package/README.md +1 -0
  2. package/README.zh-CN.md +1 -0
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/schema/config-schema.d.ts +3 -3
  5. package/dist/extensions/telegram/src/config-schema.d.ts +4 -4
  6. package/dist/extensions/telegram/xopc.extension.json +1 -1
  7. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  8. package/dist/gateway/static/root/assets/{activity-store-M0nAY5XB.js → activity-store-DQ5L3PTi.js} +1 -1
  9. package/dist/gateway/static/root/assets/agent-avatar-dicebear-Bps8fvBp.js +1 -0
  10. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-JrK80PvP.js +1 -0
  11. package/dist/gateway/static/root/assets/agents-CJYEnz94.js +1 -0
  12. package/dist/gateway/static/root/assets/api-DE6tZKG0.js +1 -0
  13. package/dist/gateway/static/root/assets/{app-management-settings-panel-DP7YVRPn.js → app-management-settings-panel-BryzDVod.js} +1 -1
  14. package/dist/gateway/static/root/assets/{appearance-settings-CVQ5n7y6.js → appearance-settings-BoweLBDm.js} +1 -1
  15. package/dist/gateway/static/root/assets/apps-page-Bt8_sWtU.js +1 -0
  16. package/dist/gateway/static/root/assets/{archive-plugin-7_DXaMTP.js → archive-plugin-DyujzZNu.js} +1 -1
  17. package/dist/gateway/static/root/assets/{attachment-load-mmr_mHRr.js → attachment-load-DmXGUWve.js} +1 -1
  18. package/dist/gateway/static/root/assets/attachment-preview-renderer-BDTD8YUe.js +12 -0
  19. package/dist/gateway/static/root/assets/{automations-page-DfY-T6Ga.js → automations-page-DrTVSK7o.js} +1 -1
  20. package/dist/gateway/static/root/assets/automations-workspace-86UTesz3.js +6 -0
  21. package/dist/gateway/static/root/assets/{binary-plugins-CO9QMEh2.js → binary-plugins-mFyeC74W.js} +2 -2
  22. package/dist/gateway/static/root/assets/{block-editor-CE14CVOy.js → block-editor-D5yMFrgH.js} +4 -4
  23. package/dist/gateway/static/root/assets/browser-settings-page-DfMU7yXv.js +8 -0
  24. package/dist/gateway/static/root/assets/browser-workflow-inputs-B6rLBtua.js +1 -0
  25. package/dist/gateway/static/root/assets/{browser-workflows-page-1wgXyoSO.js → browser-workflows-page-C74sg50f.js} +2 -2
  26. package/dist/gateway/static/root/assets/capabilities-settings-panel-lsHRuBlX.js +7 -0
  27. package/dist/gateway/static/root/assets/channels-settings-CxR_clkO.js +1 -0
  28. package/dist/gateway/static/root/assets/{channel-recipient-api-C5ABr73b.js → channels-status-swr-DowVNjNw.js} +1 -1
  29. package/dist/gateway/static/root/assets/{chat-terminal-dock-CdRW6Euc.js → chat-terminal-dock-BO6_BgjE.js} +2 -2
  30. package/dist/gateway/static/root/assets/{code-editor-dFzqyDXS.js → code-editor-D4_k-6QN.js} +1 -1
  31. package/dist/gateway/static/root/assets/connectors-page-CpNLyKB4.js +2 -0
  32. package/dist/gateway/static/root/assets/cron-expression-CYMXfk4M.js +2 -0
  33. package/dist/gateway/static/root/assets/date-picker-DIM_OkQP.js +1 -0
  34. package/dist/gateway/static/root/assets/dependency-picker-Cp8I6rsL.js +1 -0
  35. package/dist/gateway/static/root/assets/{desktop-pet-settings-MmOR4A3u.js → desktop-pet-settings-NjPiz3M_.js} +1 -1
  36. package/dist/gateway/static/root/assets/{desktop-pet-CMO-J3cG.js → desktop-pet-wzSzZ6S8.js} +1 -1
  37. package/dist/gateway/static/root/assets/dist-DqPZM2MH2.js +1 -0
  38. package/dist/gateway/static/root/assets/{extension-debug-page-DdH0dG2_.js → extension-debug-page-CoMl13ET.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-page-Clg-KktN.js → extension-page-CXc1Lc8x.js} +1 -1
  40. package/dist/gateway/static/root/assets/extension-settings-page-CfEWpgjl.js +1 -0
  41. package/dist/gateway/static/root/assets/{gateway-config-api-DEHnF4Wm.js → gateway-config-api-yH4KAEkK.js} +1 -1
  42. package/dist/gateway/static/root/assets/gateway-config-swr-YyZJKvFf.js +1 -0
  43. package/dist/gateway/static/root/assets/{gateway-settings-DKkEXXj9.js → gateway-settings-BmjJIiKh.js} +1 -1
  44. package/dist/gateway/static/root/assets/{gateway-startup-retry-B_zrtccP.js → gateway-startup-retry-Dnrl91pU.js} +1 -1
  45. package/dist/gateway/static/root/assets/heartbeat-settings-DGq9q4b6.js +1 -0
  46. package/dist/gateway/static/root/assets/home-page-Dj4B1wb3.js +1 -0
  47. package/dist/gateway/static/root/assets/html-workspace-editor-C3DKAkMc.js +1 -0
  48. package/dist/gateway/static/root/assets/{image-generation-api-YKP2me5Z.js → image-generation-api-BNzAAw4Y.js} +1 -1
  49. package/dist/gateway/static/root/assets/index-BGf-TiZj.js +70 -0
  50. package/dist/gateway/static/root/assets/index-BTUuTnc9.css +2 -0
  51. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BvpEeHnm.js → keyboard-shortcuts-settings-CfNV1ysF.js} +1 -1
  52. package/dist/gateway/static/root/assets/local-app-workbench-page-IJg75WaN.js +2 -0
  53. package/dist/gateway/static/root/assets/{local-apps-page-Bzvn99eH.js → local-apps-page-MPd4Fl_l.js} +1 -1
  54. package/dist/gateway/static/root/assets/locale-store-D_dq_0LV.js +1 -0
  55. package/dist/gateway/static/root/assets/logs-page-NsfoazgK.js +2 -0
  56. package/dist/gateway/static/root/assets/management-settings-DeIjN4e0.js +1 -0
  57. package/dist/gateway/static/root/assets/markdown-editor-nDLmA_LF.js +2 -0
  58. package/dist/gateway/static/root/assets/markdown-split-BUAVv6Gu.js +1 -0
  59. package/dist/gateway/static/root/assets/markdown-view-CPkBOY3h.js +201 -0
  60. package/dist/gateway/static/root/assets/{media-plugins-D8I7OGnT.js → media-plugins-DFsVnOY-.js} +1 -1
  61. package/dist/gateway/static/root/assets/messages-D4qOHT4D.js +3 -0
  62. package/dist/gateway/static/root/assets/mobile-device-api-D9JevyCE.js +1 -0
  63. package/dist/gateway/static/root/assets/models-hub-cache-C5y2gzMU.js +1 -0
  64. package/dist/gateway/static/root/assets/{notes-api-EpgG-OQc.js → notes-api-BWSfTP1w.js} +1 -1
  65. package/dist/gateway/static/root/assets/{notes-page-CCvjGMhN.js → notes-page-CV8UJj7g.js} +1 -1
  66. package/dist/gateway/static/root/assets/notes-workbench-DrjMVgEI.js +4 -0
  67. package/dist/gateway/static/root/assets/{oauth-api-BwNLwbI8.js → oauth-api-DnanEBsf.js} +1 -1
  68. package/dist/gateway/static/root/assets/popover-select-3E24E65N.js +1 -0
  69. package/dist/gateway/static/root/assets/{product-open-page-MmMswmOU.js → product-open-page-zNg1KOy2.js} +1 -1
  70. package/dist/gateway/static/root/assets/project-detail-page-tfcGYL-O.js +1 -0
  71. package/dist/gateway/static/root/assets/projects-page-BkjnXLdJ.js +1 -0
  72. package/dist/gateway/static/root/assets/{registry-api-BFZrVYfy.js → registry-api-BeVzfRvs.js} +1 -1
  73. package/dist/gateway/static/root/assets/remote-access-hub-BXn-3n2d.js +1 -0
  74. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Dx6o7sLu.js → runtime-tools-settings-panel-BxoioSvT.js} +2 -2
  75. package/dist/gateway/static/root/assets/{schema-form-Cdd9c4vt.js → schema-form-vzbmscrE.js} +1 -1
  76. package/dist/gateway/static/root/assets/sessions-page-MLNjrOkw.js +1 -0
  77. package/dist/gateway/static/root/assets/settings-advanced-gate-ByNLBY2q.js +1 -0
  78. package/dist/gateway/static/root/assets/{settings-form-section-D0YxMnhm.js → settings-form-section-x9k7MWD3.js} +1 -1
  79. package/dist/gateway/static/root/assets/settings-loading-skeleton-BLFOD9h9.js +1 -0
  80. package/dist/gateway/static/root/assets/settings-page-CwgTooar.js +1 -0
  81. package/dist/gateway/static/root/assets/settings-shell-layer-context-DCp6ykjQ.js +1 -0
  82. package/dist/gateway/static/root/assets/setup-status-panel-bnueBZg8.js +1 -0
  83. package/dist/gateway/static/root/assets/{share-preview-page-DiqBn-oE.js → share-preview-page-COTrPAd-.js} +1 -1
  84. package/dist/gateway/static/root/assets/shares-settings-D-v_psqL.js +1 -0
  85. package/dist/gateway/static/root/assets/skill-reload-api-DJICr4wh.js +1 -0
  86. package/dist/gateway/static/root/assets/{skills-page-CZwhWiRl.js → skills-page-D9wM6_Jn.js} +1 -1
  87. package/dist/gateway/static/root/assets/{skills-page.utils-kBGr8opZ.js → skills-page.utils-PtlQLM5a.js} +1 -1
  88. package/dist/gateway/static/root/assets/{system-settings-panel-CPBs6lWi.js → system-settings-panel-BR74mNEK.js} +1 -1
  89. package/dist/gateway/static/root/assets/task-detail-page-B-rmeE8t.js +1 -0
  90. package/dist/gateway/static/root/assets/{theme-store-Qgvo0Ga7.js → theme-store-Bud54q9e.js} +1 -1
  91. package/dist/gateway/static/root/assets/{use-autosave-C4YcEiP9.js → use-autosave-DH47MH7s.js} +1 -1
  92. package/dist/gateway/static/root/assets/user-context-page-B6eyxxOT.js +1 -0
  93. package/dist/gateway/static/root/assets/{vendor-codemirror-DRr7hFaD.js → vendor-codemirror--gTq3YAI.js} +16 -16
  94. package/dist/gateway/static/root/assets/voice-api-key-field-B59GaqRa.js +1 -0
  95. package/dist/gateway/static/root/assets/voice-config-api-C0ahrZ0e.js +1 -0
  96. package/dist/gateway/static/root/assets/{work-discovery-overlay-CKIdPEen.js → work-discovery-overlay-DTn4RCcx.js} +1 -1
  97. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BK44Vm5W.js → workflow-run-setup-panel-yDFoEX06.js} +2 -2
  98. package/dist/gateway/static/root/assets/workflows-page-BOwSbfWm.js +5 -0
  99. package/dist/gateway/static/root/index.html +16 -16
  100. package/dist/package.js +1 -1
  101. package/dist/packages/endpoint-tools-protocol/src/index.js +162 -2
  102. package/dist/packages/gateway-contract/src/product-delivery.js +6 -2
  103. package/dist/packages/gateway-contract/src/turn-outcome.js +77 -1
  104. package/dist/src/agent/agent-manager.d.ts +1 -2
  105. package/dist/src/agent/agent-manager.js +29 -44
  106. package/dist/src/agent/background-review/run-background-review.js +10 -15
  107. package/dist/src/agent/capabilities/definitions.d.ts +1 -1
  108. package/dist/src/agent/capabilities/definitions.js +2 -1
  109. package/dist/src/agent/embedded/run-for-session.js +1 -1
  110. package/dist/src/agent/external-tools/endpoint-provider.js +5 -1
  111. package/dist/src/agent/external-tools/mcp-provider.js +3 -13
  112. package/dist/src/agent/image/generation/runtime.js +1 -1
  113. package/dist/src/agent/image/tool-model-config.js +13 -14
  114. package/dist/src/agent/mcp/bundle-mcp-policy.d.ts +0 -9
  115. package/dist/src/agent/mcp/bundle-mcp-policy.js +1 -13
  116. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  117. package/dist/src/agent/mcp/index.js +2 -2
  118. package/dist/src/agent/media-generation/runtime-shared.d.ts +1 -1
  119. package/dist/src/agent/media-generation/runtime-shared.js +1 -1
  120. package/dist/src/agent/memory/create-memory-manager.js +1 -1
  121. package/dist/src/agent/memory/manager.d.ts +1 -1
  122. package/dist/src/{agent-runtime/memory-runtime.d.ts → agent/memory/runtime.d.ts} +1 -1
  123. package/dist/src/{agent-runtime/memory-runtime.js → agent/memory/runtime.js} +2 -3
  124. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -3
  125. package/dist/src/agent/orchestration/agent-orchestrator.js +1 -3
  126. package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -2
  127. package/dist/src/agent/prompt/sections/tooling.js +5 -0
  128. package/dist/src/agent/service.js +0 -1
  129. package/dist/src/agent/starter-agents.js +1 -8
  130. package/dist/src/agent/tools/create-share-tool.js +2 -1
  131. package/dist/src/agent/tools/exec-command.js +2 -1
  132. package/dist/src/agent/tools/executor.d.ts +1 -1
  133. package/dist/src/agent/tools/factory.js +2 -0
  134. package/dist/src/agent/tools/index.d.ts +1 -0
  135. package/dist/src/agent/tools/index.js +2 -1
  136. package/dist/src/agent/tools/publish-artifacts.d.ts +2 -0
  137. package/dist/src/agent/tools/publish-artifacts.js +82 -0
  138. package/dist/src/agent/tools/send-media.js +2 -1
  139. package/dist/src/agent/tools/workflow-tool.js +1 -5
  140. package/dist/src/agent-config/index.d.ts +2 -0
  141. package/dist/src/agent-config/index.js +11 -0
  142. package/dist/src/agent-config/resolver.d.ts +11 -0
  143. package/dist/src/agent-config/resolver.js +113 -0
  144. package/dist/src/agent-config/schema.d.ts +491 -0
  145. package/dist/src/agent-config/schema.js +172 -0
  146. package/dist/src/chat-commands/builtins/config.js +2 -2
  147. package/dist/src/chat-commands/builtins/review.js +1 -1
  148. package/dist/src/chat-commands/config-paths.js +1 -1
  149. package/dist/src/cli/command-catalog.js +4 -0
  150. package/dist/src/cli/command-loaders.js +1 -0
  151. package/dist/src/cli/command-manifest.js +4 -0
  152. package/dist/src/cli/commands/agents.js +2 -1
  153. package/dist/src/cli/commands/auth.js +1 -1
  154. package/dist/src/cli/commands/config.js +1 -1
  155. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  156. package/dist/src/cli/commands/doctor/checks/provider-auth.js +12 -4
  157. package/dist/src/cli/commands/image.js +3 -4
  158. package/dist/src/cli/commands/models.js +9 -3
  159. package/dist/src/cli/commands/onboard/model.js +13 -12
  160. package/dist/src/cli/commands/onboard.js +1 -1
  161. package/dist/src/cli/commands/providers.js +1 -1
  162. package/dist/src/cli/commands/support.d.ts +1 -0
  163. package/dist/src/cli/commands/support.js +51 -0
  164. package/dist/src/cli/commands/tunnel.js +3 -18
  165. package/dist/src/cli/utils/init-workspace-core.d.ts +1 -1
  166. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  167. package/dist/src/commands/agents.config.d.ts +1 -3
  168. package/dist/src/commands/agents.config.js +9 -26
  169. package/dist/src/config/agent-model-intents.d.ts +10 -0
  170. package/dist/src/config/agent-model-intents.js +39 -0
  171. package/dist/src/config/agent-profile.d.ts +7 -9
  172. package/dist/src/config/agent-profile.js +30 -28
  173. package/dist/src/config/default-model.d.ts +1 -11
  174. package/dist/src/config/default-model.js +3 -11
  175. package/dist/src/config/index.js +3 -3
  176. package/dist/src/config/integration.d.ts +1 -1
  177. package/dist/src/config/reload.js +1 -1
  178. package/dist/src/config/rules.js +3 -3
  179. package/dist/src/config/schema.d.ts +187 -452
  180. package/dist/src/config/schema.js +53 -131
  181. package/dist/src/endpoint-tools/binding-service.d.ts +22 -0
  182. package/dist/src/endpoint-tools/binding-service.js +45 -0
  183. package/dist/src/endpoint-tools/index.d.ts +1 -0
  184. package/dist/src/endpoint-tools/index.js +2 -1
  185. package/dist/src/endpoint-tools/invocation-service.d.ts +1 -0
  186. package/dist/src/endpoint-tools/invocation-service.js +8 -0
  187. package/dist/src/endpoint-tools/policy.d.ts +4 -1
  188. package/dist/src/endpoint-tools/policy.js +68 -5
  189. package/dist/src/endpoint-tools/registry.js +1 -1
  190. package/dist/src/endpoint-tools/runtime.d.ts +2 -0
  191. package/dist/src/endpoint-tools/runtime.js +8 -0
  192. package/dist/src/extensions/activation-context.js +7 -11
  193. package/dist/src/files/file-service.js +14 -5
  194. package/dist/src/gateway/agent-builtin-tools.d.ts +250 -6
  195. package/dist/src/gateway/agent-builtin-tools.js +284 -46
  196. package/dist/src/gateway/agents-admin.d.ts +20 -62
  197. package/dist/src/gateway/agents-admin.js +36 -228
  198. package/dist/src/gateway/chat-stream/turn-outcome-collector.js +41 -6
  199. package/dist/src/gateway/device-routes.d.ts +3 -0
  200. package/dist/src/gateway/device-routes.js +47 -0
  201. package/dist/src/gateway/global-defaults-admin.d.ts +6 -20
  202. package/dist/src/gateway/global-defaults-admin.js +20 -120
  203. package/dist/src/gateway/heartbeat/service.js +1 -1
  204. package/dist/src/gateway/hono/app.js +4 -2
  205. package/dist/src/gateway/hono/lib/config-payload.d.ts +54 -137
  206. package/dist/src/gateway/hono/lib/config-payload.js +2 -4
  207. package/dist/src/gateway/hono/middleware/auth.js +36 -3
  208. package/dist/src/gateway/hono/middleware/scopes.d.ts +2 -12
  209. package/dist/src/gateway/hono/middleware/scopes.js +9 -18
  210. package/dist/src/gateway/hono/routes/agents.js +64 -100
  211. package/dist/src/gateway/hono/routes/connectors.js +1 -1
  212. package/dist/src/gateway/hono/routes/device-push.d.ts +2 -0
  213. package/dist/src/gateway/hono/routes/{mobile.js → device-push.js} +40 -18
  214. package/dist/src/gateway/hono/routes/devices.d.ts +4 -0
  215. package/dist/src/gateway/hono/routes/devices.js +214 -0
  216. package/dist/src/gateway/hono/routes/endpoint-tools.js +68 -1
  217. package/dist/src/gateway/hono/routes/files.js +12 -1
  218. package/dist/src/gateway/hono/routes/global-defaults.js +5 -9
  219. package/dist/src/gateway/hono/routes/index.js +4 -2
  220. package/dist/src/gateway/hono/routes/lazy-bundles.js +12 -20
  221. package/dist/src/gateway/hono/routes/media.js +46 -2
  222. package/dist/src/gateway/hono/routes/models.js +2 -2
  223. package/dist/src/gateway/hono/routes/realtime.js +8 -1
  224. package/dist/src/gateway/hono/routes/status.js +9 -16
  225. package/dist/src/gateway/hono/routes/support.d.ts +3 -0
  226. package/dist/src/gateway/hono/routes/support.js +28 -0
  227. package/dist/src/gateway/hono/routes/tunnel.d.ts +0 -2
  228. package/dist/src/gateway/hono/routes/tunnel.js +10 -199
  229. package/dist/src/gateway/hono/routes/you.js +24 -0
  230. package/dist/src/gateway/image-generation-setup.d.ts +2 -2
  231. package/dist/src/gateway/image-generation-setup.js +8 -7
  232. package/dist/src/gateway/public-url.d.ts +1 -1
  233. package/dist/src/gateway/security/gateway-principal.d.ts +11 -0
  234. package/dist/src/gateway/security/gateway-principal.js +12 -0
  235. package/dist/src/gateway/security/gateway-scopes.d.ts +7 -0
  236. package/dist/src/gateway/security/gateway-scopes.js +66 -0
  237. package/dist/src/gateway/security/index.d.ts +2 -1
  238. package/dist/src/gateway/security/index.js +3 -2
  239. package/dist/src/gateway/service.js +7 -7
  240. package/dist/src/gateway/xopc-cloud-capability-setup.js +19 -21
  241. package/dist/src/heartbeat/index.js +1 -1
  242. package/dist/src/media/store.js +9 -0
  243. package/dist/src/migrations/index.d.ts +0 -1
  244. package/dist/src/migrations/index.js +1 -2
  245. package/dist/src/migrations/runner.js +1 -2
  246. package/dist/src/notifications/device-store.d.ts +1 -1
  247. package/dist/src/notifications/device-store.js +11 -11
  248. package/dist/src/notifications/store.js +3 -3
  249. package/dist/src/providers/index.js +1 -1
  250. package/dist/src/providers/model-reference-auditor.js +14 -9
  251. package/dist/src/realtime/runtime.d.ts +2 -0
  252. package/dist/src/realtime/runtime.js +27 -3
  253. package/dist/src/realtime/tickets.d.ts +6 -1
  254. package/dist/src/realtime/tickets.js +2 -1
  255. package/dist/src/remote-access/exposure-manager.js +3 -3
  256. package/dist/src/share/share-url.js +2 -2
  257. package/dist/src/storage/sqlite/device-access-repository.d.ts +54 -0
  258. package/dist/src/storage/sqlite/device-access-repository.js +194 -0
  259. package/dist/src/storage/sqlite/device-pairing-repository.d.ts +22 -0
  260. package/dist/src/storage/sqlite/device-pairing-repository.js +86 -0
  261. package/dist/src/storage/sqlite/endpoint-session-binding-repository.d.ts +8 -0
  262. package/dist/src/storage/sqlite/endpoint-session-binding-repository.js +32 -0
  263. package/dist/src/storage/sqlite/gateway-identity-repository.d.ts +10 -0
  264. package/dist/src/storage/sqlite/gateway-identity-repository.js +50 -0
  265. package/dist/src/storage/sqlite/index.d.ts +4 -0
  266. package/dist/src/storage/sqlite/index.js +5 -1
  267. package/dist/src/storage/sqlite/migrations/138_device_access.sql +96 -0
  268. package/dist/src/storage/sqlite/migrations/139_turn_outcome_artifact_backfill.sql +231 -0
  269. package/dist/src/storage/sqlite/migrations/140_endpoint_session_bindings.sql +8 -0
  270. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  271. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  272. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  273. package/dist/src/storage/sqlite/schema.js +1 -1
  274. package/dist/src/support/build-support-investigation-prompt.d.ts +2 -0
  275. package/dist/src/support/build-support-investigation-prompt.js +29 -0
  276. package/dist/src/support/collect-support-report.d.ts +16 -0
  277. package/dist/src/support/collect-support-report.js +216 -0
  278. package/dist/src/support/redact-support-report.d.ts +16 -0
  279. package/dist/src/support/redact-support-report.js +89 -0
  280. package/dist/src/support/types.d.ts +76 -0
  281. package/dist/src/support/types.js +18 -0
  282. package/dist/src/tunnel/consent.d.ts +1 -1
  283. package/dist/src/tunnel/consent.js +1 -1
  284. package/dist/src/tunnel/gateway-lifecycle.js +1 -1
  285. package/dist/src/tunnel/index.d.ts +1 -4
  286. package/dist/src/tunnel/index.js +3 -5
  287. package/dist/src/tunnel/tunnel-audit.d.ts +1 -1
  288. package/dist/src/tunnel/tunnel-config.js +1 -1
  289. package/dist/src/tunnel/tunnel-service.d.ts +2 -3
  290. package/dist/src/tunnel/tunnel-service.js +1 -20
  291. package/dist/src/tunnel/tunnel-types.d.ts +0 -6
  292. package/dist/src/user-context/user-avatar.d.ts +17 -0
  293. package/dist/src/user-context/user-avatar.js +116 -0
  294. package/dist/src/workflows/draft/workflow-draft-service.js +2 -2
  295. package/dist/src/workflows/service/workflow-run-service.js +3 -3
  296. package/package.json +4 -4
  297. package/dist/gateway/static/root/assets/agent-avatar-dicebear-CBqUnlvL.js +0 -1
  298. package/dist/gateway/static/root/assets/agents-7YO6znTT.js +0 -68
  299. package/dist/gateway/static/root/assets/api-BywYxpaS.js +0 -1
  300. package/dist/gateway/static/root/assets/apps-page-DSCia0DT.js +0 -1
  301. package/dist/gateway/static/root/assets/attachment-preview-renderer-Cmo-5BP5.js +0 -11
  302. package/dist/gateway/static/root/assets/automations-workspace-BpvD54D6.js +0 -6
  303. package/dist/gateway/static/root/assets/browser-settings-page-CeESA4Oj.js +0 -8
  304. package/dist/gateway/static/root/assets/browser-workflow-inputs-8NC2qDRF.js +0 -1
  305. package/dist/gateway/static/root/assets/capabilities-settings-panel-B_OXTojB.js +0 -7
  306. package/dist/gateway/static/root/assets/capability-presets-api-o0y9WgAI.js +0 -1
  307. package/dist/gateway/static/root/assets/capability-presets-settings-panel-D5nZecxV.js +0 -3
  308. package/dist/gateway/static/root/assets/channels-settings-BzmnWx6X.js +0 -1
  309. package/dist/gateway/static/root/assets/channels-status-swr-38FsOnR0.js +0 -1
  310. package/dist/gateway/static/root/assets/connectors-page-DX6OkwFQ.js +0 -2
  311. package/dist/gateway/static/root/assets/cron-expression-DYSMZsms.js +0 -2
  312. package/dist/gateway/static/root/assets/date-picker-DGCfX4tK.js +0 -1
  313. package/dist/gateway/static/root/assets/dependency-picker-DHDa4ht1.js +0 -1
  314. package/dist/gateway/static/root/assets/directory-picker-path-field-B9qoxDcn.js +0 -1
  315. package/dist/gateway/static/root/assets/dist-J_ySZvz0.js +0 -1
  316. package/dist/gateway/static/root/assets/extension-settings-page-eP3fJ2M6.js +0 -1
  317. package/dist/gateway/static/root/assets/file-code-corner-byQA1VfD.js +0 -1
  318. package/dist/gateway/static/root/assets/gateway-config-swr-BWGjnmDl.js +0 -1
  319. package/dist/gateway/static/root/assets/heartbeat-settings-DlBPNubY.js +0 -1
  320. package/dist/gateway/static/root/assets/home-page-BnOrLRfs.js +0 -1
  321. package/dist/gateway/static/root/assets/html-workspace-editor-bXK5tq64.js +0 -1
  322. package/dist/gateway/static/root/assets/index-0xQO5B_Q.js +0 -70
  323. package/dist/gateway/static/root/assets/index-CCyIdGuQ.css +0 -2
  324. package/dist/gateway/static/root/assets/local-app-workbench-page-Ch1rdUo8.js +0 -2
  325. package/dist/gateway/static/root/assets/locale-store-CXhjfe4q.js +0 -1
  326. package/dist/gateway/static/root/assets/logs-page-zxx2ExlY.js +0 -2
  327. package/dist/gateway/static/root/assets/management-settings-BQaeyOYm.js +0 -1
  328. package/dist/gateway/static/root/assets/markdown-editor-TWGaF7Xa.js +0 -2
  329. package/dist/gateway/static/root/assets/markdown-split-D9tmIiEm.js +0 -1
  330. package/dist/gateway/static/root/assets/markdown-view-RxNHwlNo.js +0 -201
  331. package/dist/gateway/static/root/assets/messages-BMdD0LWk.js +0 -3
  332. package/dist/gateway/static/root/assets/models-hub-cache-0RjEwafI.js +0 -1
  333. package/dist/gateway/static/root/assets/notes-workbench-9cgh77VH.js +0 -4
  334. package/dist/gateway/static/root/assets/popover-select-CccGri5Y.js +0 -1
  335. package/dist/gateway/static/root/assets/project-detail-page-hf6pmH4p.js +0 -1
  336. package/dist/gateway/static/root/assets/projects-page-By2U-Wdh.js +0 -1
  337. package/dist/gateway/static/root/assets/remote-access-hub-CUcpp7CQ.js +0 -1
  338. package/dist/gateway/static/root/assets/sessions-page-ByI82xS1.js +0 -1
  339. package/dist/gateway/static/root/assets/settings-advanced-gate-BCoI5IJ8.js +0 -1
  340. package/dist/gateway/static/root/assets/settings-loading-skeleton-y53gEKsF.js +0 -1
  341. package/dist/gateway/static/root/assets/settings-page-BoE_tToG.js +0 -1
  342. package/dist/gateway/static/root/assets/setup-status-panel-BQmyb5KC.js +0 -1
  343. package/dist/gateway/static/root/assets/shares-settings-Bf3VpZ-R.js +0 -1
  344. package/dist/gateway/static/root/assets/skill-reload-api-CXHlbuGS.js +0 -1
  345. package/dist/gateway/static/root/assets/task-detail-page-Bo0KSZ2v.js +0 -1
  346. package/dist/gateway/static/root/assets/typed-models-lib-q5-Vfqd8.js +0 -1
  347. package/dist/gateway/static/root/assets/user-context-page-Cnj7gMX2.js +0 -1
  348. package/dist/gateway/static/root/assets/voice-api-key-field-BML8zCwZ.js +0 -1
  349. package/dist/gateway/static/root/assets/workflows-page-CB98MTwG.js +0 -5
  350. package/dist/src/agent-manifest/index.d.ts +0 -5
  351. package/dist/src/agent-manifest/index.js +0 -10
  352. package/dist/src/agent-manifest/preset-chain.d.ts +0 -10
  353. package/dist/src/agent-manifest/preset-chain.js +0 -30
  354. package/dist/src/agent-manifest/prompt.d.ts +0 -2
  355. package/dist/src/agent-manifest/prompt.js +0 -49
  356. package/dist/src/agent-manifest/resolver.d.ts +0 -32
  357. package/dist/src/agent-manifest/resolver.js +0 -114
  358. package/dist/src/agent-manifest/schema.d.ts +0 -695
  359. package/dist/src/agent-manifest/schema.js +0 -226
  360. package/dist/src/agent-manifest/validator.d.ts +0 -25
  361. package/dist/src/agent-manifest/validator.js +0 -74
  362. package/dist/src/agent-runtime/boundary-guard.d.ts +0 -12
  363. package/dist/src/agent-runtime/boundary-guard.js +0 -21
  364. package/dist/src/agent-runtime/index.d.ts +0 -7
  365. package/dist/src/agent-runtime/index.js +0 -8
  366. package/dist/src/agent-runtime/model-router.d.ts +0 -11
  367. package/dist/src/agent-runtime/model-router.js +0 -14
  368. package/dist/src/agent-runtime/run-trace.d.ts +0 -27
  369. package/dist/src/agent-runtime/run-trace.js +0 -51
  370. package/dist/src/agent-runtime/runtime-profile.d.ts +0 -26
  371. package/dist/src/agent-runtime/runtime-profile.js +0 -42
  372. package/dist/src/agent-runtime/tool-registry.d.ts +0 -28
  373. package/dist/src/agent-runtime/tool-registry.js +0 -50
  374. package/dist/src/agent-runtime/workflow-runtime.d.ts +0 -31
  375. package/dist/src/agent-runtime/workflow-runtime.js +0 -32
  376. package/dist/src/config/agent-typed-models.d.ts +0 -13
  377. package/dist/src/config/agent-typed-models.js +0 -48
  378. package/dist/src/gateway/capability-presets-admin.d.ts +0 -88
  379. package/dist/src/gateway/capability-presets-admin.js +0 -303
  380. package/dist/src/gateway/hono/lib/agent-model.d.ts +0 -35
  381. package/dist/src/gateway/hono/lib/agent-model.js +0 -97
  382. package/dist/src/gateway/hono/routes/capability-presets.d.ts +0 -3
  383. package/dist/src/gateway/hono/routes/capability-presets.js +0 -187
  384. package/dist/src/gateway/hono/routes/mobile.d.ts +0 -3
  385. package/dist/src/gateway/security/operator-scopes.d.ts +0 -37
  386. package/dist/src/gateway/security/operator-scopes.js +0 -147
  387. package/dist/src/migrations/config/default-capability-preset.d.ts +0 -10
  388. package/dist/src/migrations/config/default-capability-preset.js +0 -133
  389. package/dist/src/tunnel/enable-lan-pairing.d.ts +0 -8
  390. package/dist/src/tunnel/enable-lan-pairing.js +0 -41
  391. package/dist/src/tunnel/pair-context.d.ts +0 -36
  392. package/dist/src/tunnel/pair-context.js +0 -77
  393. package/dist/src/tunnel/pair-url.d.ts +0 -43
  394. package/dist/src/tunnel/pair-url.js +0 -117
  395. package/dist/src/tunnel/pairing-rate-limit.d.ts +0 -12
  396. package/dist/src/tunnel/pairing-rate-limit.js +0 -28
  397. package/dist/src/tunnel/pairing.d.ts +0 -21
  398. package/dist/src/tunnel/pairing.js +0 -103
  399. package/dist/src/tunnel/tunnel-qr.d.ts +0 -9
  400. package/dist/src/tunnel/tunnel-qr.js +0 -29
@@ -0,0 +1,16 @@
1
+ export declare class SupportRedactor {
2
+ private replacementCount;
3
+ private readonly pathAliases;
4
+ private readonly identifierAliases;
5
+ constructor(paths?: {
6
+ homeDir?: string;
7
+ stateDir?: string;
8
+ workspaceDir?: string;
9
+ });
10
+ get replacements(): number;
11
+ addIdentifier(raw: string | undefined, namespace: string): void;
12
+ text(raw: string | undefined, maxLength?: number): string | undefined;
13
+ identifier(raw: string | undefined, namespace: string): string | undefined;
14
+ private identifierValue;
15
+ private replace;
16
+ }
@@ -0,0 +1,89 @@
1
+ import { createHash } from "node:crypto";
2
+ //#region src/support/redact-support-report.ts
3
+ const SECRET_PATTERNS = [
4
+ /(\b[A-Z0-9_]*(?:KEY|TOKEN|SECRET|PASSWORD|PASSWD|AUTHORIZATION)\b["']?\s*[=:]\s*)(["']?)[^\s,"'}]+\2/gi,
5
+ /(Authorization\s*[:=]\s*Bearer\s+)[A-Za-z0-9._\-+=]+/gi,
6
+ /\b(?:sk-[A-Za-z0-9_-]{8,}|ghp_[A-Za-z0-9]{20,}|github_pat_[A-Za-z0-9_]{20,}|xox[baprs]-[A-Za-z0-9-]+|\d+:[A-Za-z0-9_-]{35,})\b/gi,
7
+ /(-----BEGIN\s+\w+\s+PRIVATE KEY-----)[\s\S]*?(-----END\s+\w+\s+PRIVATE KEY-----)/g
8
+ ];
9
+ function escapeRegExp(value) {
10
+ return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
11
+ }
12
+ function normalizedRoots(roots) {
13
+ return [...new Set(roots.map((root) => root.trim()).filter(Boolean))].sort((left, right) => right.length - left.length);
14
+ }
15
+ var SupportRedactor = class {
16
+ replacementCount = 0;
17
+ pathAliases;
18
+ identifierAliases = [];
19
+ constructor(paths = {}) {
20
+ const aliases = [
21
+ {
22
+ value: paths.workspaceDir,
23
+ alias: "<WORKSPACE>"
24
+ },
25
+ {
26
+ value: paths.stateDir,
27
+ alias: "<STATE_DIR>"
28
+ },
29
+ {
30
+ value: paths.homeDir,
31
+ alias: "<HOME>"
32
+ }
33
+ ].filter((item) => Boolean(item.value?.trim()));
34
+ this.pathAliases = normalizedRoots(aliases.map((item) => item.value)).map((root) => ({
35
+ pattern: new RegExp(escapeRegExp(root), "g"),
36
+ alias: aliases.find((item) => item.value === root)?.alias ?? "<PATH>"
37
+ }));
38
+ }
39
+ get replacements() {
40
+ return this.replacementCount;
41
+ }
42
+ addIdentifier(raw, namespace) {
43
+ if (!raw) return;
44
+ const source = escapeRegExp(raw);
45
+ if (this.identifierAliases.some((item) => item.pattern.source === source)) return;
46
+ this.identifierAliases.push({
47
+ pattern: new RegExp(source, "g"),
48
+ alias: this.identifierValue(raw, namespace)
49
+ });
50
+ }
51
+ text(raw, maxLength = 8e3) {
52
+ if (!raw) return void 0;
53
+ let value = raw.slice(0, maxLength);
54
+ for (const { pattern, alias } of this.pathAliases) value = this.replace(value, pattern, alias);
55
+ for (const { pattern, alias } of this.identifierAliases) value = this.replace(value, pattern, alias);
56
+ value = this.replace(value, /\/(?:Users|home)\/[^/\s]+/g, "<HOME>");
57
+ value = this.replace(value, /[A-Za-z]:\\Users\\[^\\\s]+/g, "<HOME>");
58
+ value = this.replace(value, /https?:\/\/[^\s<>{}"']+/g, (match) => {
59
+ const rawUrl = String(match);
60
+ try {
61
+ const url = new URL(rawUrl);
62
+ return `${url.origin}${url.pathname}`;
63
+ } catch {
64
+ return rawUrl;
65
+ }
66
+ });
67
+ for (const pattern of SECRET_PATTERNS) value = this.replace(value, pattern, (...args) => {
68
+ if (String(args[0]).includes("PRIVATE KEY-----")) return `${typeof args[1] === "string" ? args[1] : "-----BEGIN PRIVATE KEY-----"}\n[REDACTED]\n${typeof args[2] === "string" ? args[2] : "-----END PRIVATE KEY-----"}`;
69
+ return `${typeof args[1] === "string" && args[1] ? args[1] : ""}[REDACTED]`;
70
+ });
71
+ return value;
72
+ }
73
+ identifier(raw, namespace) {
74
+ if (!raw) return void 0;
75
+ this.replacementCount += 1;
76
+ return this.identifierValue(raw, namespace);
77
+ }
78
+ identifierValue(raw, namespace) {
79
+ return `${namespace}_${createHash("sha256").update(`${namespace}:${raw}`).digest("hex").slice(0, 12)}`;
80
+ }
81
+ replace(value, pattern, replacement) {
82
+ return value.replace(pattern, (...args) => {
83
+ this.replacementCount += 1;
84
+ return typeof replacement === "string" ? replacement : replacement(...args);
85
+ });
86
+ }
87
+ };
88
+ //#endregion
89
+ export { SupportRedactor };
@@ -0,0 +1,76 @@
1
+ import { z } from 'zod';
2
+ export declare const SupportReportInputSchema: z.ZodObject<{
3
+ problem: z.ZodString;
4
+ expected: z.ZodOptional<z.ZodString>;
5
+ reproduction: z.ZodOptional<z.ZodString>;
6
+ occurredAt: z.ZodOptional<z.ZodString>;
7
+ sessionKey: z.ZodOptional<z.ZodString>;
8
+ requestId: z.ZodOptional<z.ZodString>;
9
+ clientContext: z.ZodOptional<z.ZodObject<{
10
+ currentPage: z.ZodOptional<z.ZodString>;
11
+ rendererError: z.ZodOptional<z.ZodString>;
12
+ surface: z.ZodOptional<z.ZodEnum<{
13
+ electron: "electron";
14
+ web: "web";
15
+ }>>;
16
+ userAgent: z.ZodOptional<z.ZodString>;
17
+ }, z.core.$strict>>;
18
+ }, z.core.$strict>;
19
+ export type SupportReportInput = z.infer<typeof SupportReportInputSchema>;
20
+ export type SupportDoctorCheck = {
21
+ id: string;
22
+ label: string;
23
+ status: 'pass' | 'warn' | 'fail' | 'skip';
24
+ message: string;
25
+ hints: string[];
26
+ };
27
+ export type SupportLogEntry = {
28
+ timestamp: string;
29
+ level: string;
30
+ message: string;
31
+ module?: string;
32
+ phase?: string;
33
+ requestId?: string;
34
+ sessionId?: string;
35
+ error?: {
36
+ name?: string;
37
+ message?: string;
38
+ stack?: string;
39
+ };
40
+ };
41
+ export type SupportRuntimeSnapshot = {
42
+ gatewayStatus?: string;
43
+ gatewayVersion?: string;
44
+ gatewayUptimeMs?: number;
45
+ channels?: Record<string, string>;
46
+ };
47
+ export type SupportReport = {
48
+ schemaVersion: 1;
49
+ title: string;
50
+ capturedAt: string;
51
+ occurredAt: string;
52
+ problem: string;
53
+ expected?: string;
54
+ reproduction?: string;
55
+ environment: {
56
+ xopcVersion: string;
57
+ nodeVersion: string;
58
+ platform: NodeJS.Platform;
59
+ arch: string;
60
+ surface?: 'web' | 'electron';
61
+ currentPage?: string;
62
+ userAgent?: string;
63
+ };
64
+ runtime?: SupportRuntimeSnapshot;
65
+ rendererError?: string;
66
+ doctor: SupportDoctorCheck[];
67
+ logs: SupportLogEntry[];
68
+ logWindow: {
69
+ from: string;
70
+ to: string;
71
+ };
72
+ redaction: {
73
+ replacements: number;
74
+ };
75
+ markdown: string;
76
+ };
@@ -0,0 +1,18 @@
1
+ import { z } from "zod";
2
+ //#region src/support/types.ts
3
+ const SupportReportInputSchema = z.object({
4
+ problem: z.string().trim().min(1).max(1e4),
5
+ expected: z.string().trim().max(5e3).optional(),
6
+ reproduction: z.string().trim().max(1e4).optional(),
7
+ occurredAt: z.string().datetime().optional(),
8
+ sessionKey: z.string().trim().max(1e3).optional(),
9
+ requestId: z.string().trim().max(1e3).optional(),
10
+ clientContext: z.object({
11
+ currentPage: z.string().trim().max(2e3).optional(),
12
+ rendererError: z.string().trim().max(2e4).optional(),
13
+ surface: z.enum(["web", "electron"]).optional(),
14
+ userAgent: z.string().trim().max(2e3).optional()
15
+ }).strict().optional()
16
+ }).strict();
17
+ //#endregion
18
+ export { SupportReportInputSchema };
@@ -28,4 +28,4 @@ export declare function assertTunnelMayStart(config: Config): void;
28
28
  export declare function assertTunnelAutoStartAllowed(config: Config): void;
29
29
  export declare function buildTunnelConsentRecord(): NonNullable<Config['tunnel']>['consent'];
30
30
  /** Short risk summary for CLI (keep in sync with web i18n). */
31
- export declare const TUNNEL_RISK_SUMMARY_LINES: readonly ["Starting remote access exposes your gateway on the public internet via frp.xopc.ai.", "Anyone with the public URL or pairing QR may use your gateway Bearer token.", "Traffic is proxied through third-party infrastructure; use a strong token and stop the tunnel when not needed."];
31
+ export declare const TUNNEL_RISK_SUMMARY_LINES: readonly ["Starting remote access exposes your gateway on the public internet via frp.xopc.ai.", "A public URL exposes the gateway authentication surface to the internet.", "Traffic is proxied through third-party infrastructure; use a strong token and stop the tunnel when not needed."];
@@ -57,7 +57,7 @@ function buildTunnelConsentRecord() {
57
57
  /** Short risk summary for CLI (keep in sync with web i18n). */
58
58
  const TUNNEL_RISK_SUMMARY_LINES = [
59
59
  "Starting remote access exposes your gateway on the public internet via frp.xopc.ai.",
60
- "Anyone with the public URL or pairing QR may use your gateway Bearer token.",
60
+ "A public URL exposes the gateway authentication surface to the internet.",
61
61
  "Traffic is proxied through third-party infrastructure; use a strong token and stop the tunnel when not needed."
62
62
  ];
63
63
  //#endregion
@@ -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 { resolveGatewayEffectiveHost } from "../config/gateway-bind.js";
4
- import { hasValidTunnelConsent } from "./consent.js";
5
4
  import { resolveOptionalTunnelRegistrationSecret, resolveTunnelBrokerUrl } from "./env.js";
6
5
  import { getTunnelService } from "./tunnel-service.js";
6
+ import { hasValidTunnelConsent } from "./consent.js";
7
7
  import { resolveFrpSubdomainHost } from "./frp-subdomain-host.js";
8
8
  import { fetchTunnelWellKnown } from "./well-known.js";
9
9
  //#region src/tunnel/gateway-lifecycle.ts
@@ -14,8 +14,5 @@ export { consumeTunnelMutationLimit, resetTunnelMutationLimitsForTests } from '.
14
14
  export { getTunnelService, hashGatewayToken, TunnelService } from './tunnel-service.js';
15
15
  export type { TunnelServiceConfig } from './tunnel-service.js';
16
16
  export { resolveFrpSubdomainHost } from './frp-subdomain-host.js';
17
- export { createPairingSecret, consumePairingSecret, resetPairingSessionsForTests } from './pairing.js';
18
- export type { PairingSecretResult } from './pairing.js';
19
- export { buildMobileConnectQrPayload, resolveLanGatewayUrl } from './tunnel-qr.js';
20
17
  export { loadTunnelState, saveTunnelState, resolveTunnelStatePath } from './tunnel-state.js';
21
- export type { PersistedTunnelState, TunnelQrPayload, TunnelStatus, TunnelRegistration } from './tunnel-types.js';
18
+ export type { PersistedTunnelState, TunnelStatus, TunnelRegistration } from './tunnel-types.js';
@@ -1,15 +1,13 @@
1
1
  import { loadTunnelState, resolveTunnelStatePath, saveTunnelState } from "./tunnel-state.js";
2
- import { buildMobileConnectQrPayload, resolveLanGatewayUrl } from "./tunnel-qr.js";
3
- import { CURRENT_TUNNEL_CONSENT_VERSION, TUNNEL_CONSENT_REQUIRED_CODE, TUNNEL_RISK_SUMMARY_LINES, TunnelConsentError, assertTunnelMayStart, getTunnelConsentState, hasValidTunnelConsent } from "./consent.js";
4
- import { TUNNEL_REGISTRATION_SECRET_REQUIRED_CODE, TunnelRegistrationSecretError, getTunnelRegistrationSecretMeta, isLocalDevelopmentTunnelBroker, isMaskedTunnelSecretPatchValue, resolveOptionalTunnelRegistrationSecret, resolveTunnelBrokerUrl, resolveTunnelRegistrationSecret, tunnelRegistrationSecretRequiredMessage } from "./env.js";
5
2
  import { TunnelBrokerClient, resolveBrokerApiBase } from "./broker-client.js";
6
3
  import { FRPC_VERSION, clearFrpcPathForProcess, ensureFrpcBinary, publishFrpcPathForProcess } from "./frpc-binary.js";
7
- import { consumePairingSecret, createPairingSecret, resetPairingSessionsForTests } from "./pairing.js";
4
+ import { TUNNEL_REGISTRATION_SECRET_REQUIRED_CODE, TunnelRegistrationSecretError, getTunnelRegistrationSecretMeta, isLocalDevelopmentTunnelBroker, isMaskedTunnelSecretPatchValue, resolveOptionalTunnelRegistrationSecret, resolveTunnelBrokerUrl, resolveTunnelRegistrationSecret, tunnelRegistrationSecretRequiredMessage } from "./env.js";
8
5
  import { logTunnelAudit } from "./tunnel-audit.js";
9
6
  import { TunnelService, getTunnelService, hashGatewayToken } from "./tunnel-service.js";
7
+ import { CURRENT_TUNNEL_CONSENT_VERSION, TUNNEL_CONSENT_REQUIRED_CODE, TUNNEL_RISK_SUMMARY_LINES, TunnelConsentError, assertTunnelMayStart, getTunnelConsentState, hasValidTunnelConsent } from "./consent.js";
10
8
  import { resolveFrpSubdomainHost } from "./frp-subdomain-host.js";
11
9
  import { clearTunnelWellKnownCache, fetchTunnelWellKnown } from "./well-known.js";
12
10
  import { configureTunnelFromGatewayConfig, maybeAutoStartTunnelFromConfig, wireTunnelEventsToGateway } from "./gateway-lifecycle.js";
13
11
  import { applyTunnelConsentToConfig, mergeTunnelConfigPatch, sanitizeTunnelConfig, setTunnelEnabledInConfig } from "./tunnel-config.js";
14
12
  import { consumeTunnelMutationLimit, resetTunnelMutationLimitsForTests } from "./tunnel-rate-limit.js";
15
- export { CURRENT_TUNNEL_CONSENT_VERSION, FRPC_VERSION, TUNNEL_CONSENT_REQUIRED_CODE, TUNNEL_REGISTRATION_SECRET_REQUIRED_CODE, TUNNEL_RISK_SUMMARY_LINES, TunnelBrokerClient, TunnelConsentError, TunnelRegistrationSecretError, TunnelService, applyTunnelConsentToConfig, assertTunnelMayStart, buildMobileConnectQrPayload, clearFrpcPathForProcess, clearTunnelWellKnownCache, configureTunnelFromGatewayConfig, consumePairingSecret, consumeTunnelMutationLimit, createPairingSecret, ensureFrpcBinary, fetchTunnelWellKnown, getTunnelConsentState, getTunnelRegistrationSecretMeta, getTunnelService, hasValidTunnelConsent, hashGatewayToken, isLocalDevelopmentTunnelBroker, isMaskedTunnelSecretPatchValue, loadTunnelState, logTunnelAudit, maybeAutoStartTunnelFromConfig, mergeTunnelConfigPatch, publishFrpcPathForProcess, resetPairingSessionsForTests, resetTunnelMutationLimitsForTests, resolveBrokerApiBase, resolveFrpSubdomainHost, resolveLanGatewayUrl, resolveOptionalTunnelRegistrationSecret, resolveTunnelBrokerUrl, resolveTunnelRegistrationSecret, resolveTunnelStatePath, sanitizeTunnelConfig, saveTunnelState, setTunnelEnabledInConfig, tunnelRegistrationSecretRequiredMessage, wireTunnelEventsToGateway };
13
+ export { CURRENT_TUNNEL_CONSENT_VERSION, FRPC_VERSION, TUNNEL_CONSENT_REQUIRED_CODE, TUNNEL_REGISTRATION_SECRET_REQUIRED_CODE, TUNNEL_RISK_SUMMARY_LINES, TunnelBrokerClient, TunnelConsentError, TunnelRegistrationSecretError, TunnelService, applyTunnelConsentToConfig, assertTunnelMayStart, clearFrpcPathForProcess, clearTunnelWellKnownCache, configureTunnelFromGatewayConfig, consumeTunnelMutationLimit, ensureFrpcBinary, fetchTunnelWellKnown, getTunnelConsentState, getTunnelRegistrationSecretMeta, getTunnelService, hasValidTunnelConsent, hashGatewayToken, isLocalDevelopmentTunnelBroker, isMaskedTunnelSecretPatchValue, loadTunnelState, logTunnelAudit, maybeAutoStartTunnelFromConfig, mergeTunnelConfigPatch, publishFrpcPathForProcess, resetTunnelMutationLimitsForTests, resolveBrokerApiBase, resolveFrpSubdomainHost, resolveOptionalTunnelRegistrationSecret, resolveTunnelBrokerUrl, resolveTunnelRegistrationSecret, resolveTunnelStatePath, sanitizeTunnelConfig, saveTunnelState, setTunnelEnabledInConfig, tunnelRegistrationSecretRequiredMessage, wireTunnelEventsToGateway };
@@ -1,2 +1,2 @@
1
- export type TunnelAuditEvent = 'tunnel.consent' | 'tunnel.start' | 'tunnel.stop' | 'tunnel.release' | 'tunnel.start_denied' | 'tunnel.pair' | 'tunnel.exchange_token' | 'tunnel.registration_authorized' | 'tunnel.enable_lan_pairing';
1
+ export type TunnelAuditEvent = 'tunnel.consent' | 'tunnel.start' | 'tunnel.stop' | 'tunnel.release' | 'tunnel.start_denied' | 'tunnel.registration_authorized';
2
2
  export declare function logTunnelAudit(event: TunnelAuditEvent, fields: Record<string, unknown>, message: string): void;
@@ -1,6 +1,6 @@
1
1
  import { TunnelConfigSchema, TunnelConsentSchema, init_schema } from "../config/schema.js";
2
- import { assertTunnelAutoStartAllowed, buildTunnelConsentRecord, hasValidTunnelConsent } from "./consent.js";
3
2
  import { getTunnelRegistrationSecretMeta, isMaskedTunnelSecretPatchValue } from "./env.js";
3
+ import { assertTunnelAutoStartAllowed, buildTunnelConsentRecord, hasValidTunnelConsent } from "./consent.js";
4
4
  import { z } from "zod";
5
5
  //#region src/tunnel/tunnel-config.ts
6
6
  init_schema();
@@ -1,5 +1,5 @@
1
1
  import { EventEmitter } from 'node:events';
2
- import type { TunnelQrPayload, TunnelStatus } from './tunnel-types.js';
2
+ import type { TunnelStatus } from './tunnel-types.js';
3
3
  export type TunnelServiceConfig = {
4
4
  brokerUrl: string;
5
5
  registrationSecret?: string;
@@ -27,8 +27,7 @@ export declare class TunnelService extends EventEmitter {
27
27
  getStatus(): TunnelStatus;
28
28
  private setStartPhase;
29
29
  private clearStartProgress;
30
- buildQr(gatewayPort: number, gatewayHost: string): Promise<TunnelQrPayload>;
31
- start(gatewayPort: number, gatewayToken: string): Promise<TunnelQrPayload>;
30
+ start(gatewayPort: number, gatewayToken: string): Promise<void>;
32
31
  stop(opts?: {
33
32
  release?: boolean;
34
33
  }): Promise<{
@@ -2,13 +2,11 @@ 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
4
  import { clearTunnelState, loadTunnelState, saveTunnelState, updateTunnelState } from "./tunnel-state.js";
5
- import { buildMobileConnectQrPayload, resolveLanGatewayUrl } from "./tunnel-qr.js";
6
- import { TunnelRegistrationSecretError } from "./env.js";
7
5
  import { TunnelBrokerClient, resolveBrokerApiBase } from "./broker-client.js";
8
6
  import { clearFrpcPathForProcess, ensureFrpcBinary, publishFrpcPathForProcess } from "./frpc-binary.js";
9
7
  import { writeFrpcConfig } from "./frpc-config.js";
10
8
  import { spawnFrpcProcess } from "./frpc-process.js";
11
- import { createPairingSecret } from "./pairing.js";
9
+ import { TunnelRegistrationSecretError } from "./env.js";
12
10
  import { canResumePersistedTunnel, persistedFromRegistration, registrationFromPersisted } from "./tunnel-persist.js";
13
11
  import { logTunnelAudit } from "./tunnel-audit.js";
14
12
  import { createHash } from "node:crypto";
@@ -81,21 +79,6 @@ var TunnelService = class extends EventEmitter {
81
79
  this.startProgress = null;
82
80
  this.emit("tunnel:progress");
83
81
  }
84
- async buildQr(gatewayPort, gatewayHost) {
85
- const publicUrl = loadTunnelState()?.publicUrl ?? null;
86
- if (!publicUrl) return {
87
- qrPayload: "",
88
- publicUrl: null,
89
- lanUrl: null
90
- };
91
- const { secret, expiresAt } = createPairingSecret();
92
- return buildMobileConnectQrPayload({
93
- publicUrl,
94
- lanUrl: resolveLanGatewayUrl(gatewayHost, gatewayPort),
95
- pairingSecret: secret,
96
- expiresAt: expiresAt.toISOString()
97
- });
98
- }
99
82
  async start(gatewayPort, gatewayToken) {
100
83
  const cfg = this.serviceConfig;
101
84
  if (!cfg) throw new Error("Tunnel service not configured");
@@ -159,14 +142,12 @@ var TunnelService = class extends EventEmitter {
159
142
  this.connectedSince = (/* @__PURE__ */ new Date()).toISOString();
160
143
  this.reconnectAttempt = 0;
161
144
  this.emit("tunnel:connected");
162
- const qr = await this.buildQr(gatewayPort, cfg.gatewayHost);
163
145
  logTunnelAudit("tunnel.start", {
164
146
  subdomain: registration.subdomain,
165
147
  publicUrl: registration.publicUrl,
166
148
  tunnelId: registration.tunnelId,
167
149
  gatewayTokenHash: hashGatewayToken(gatewayToken).slice(0, 12)
168
150
  }, "Remote access tunnel started");
169
- return qr;
170
151
  }
171
152
  async stop(opts) {
172
153
  const release = opts?.release === true;
@@ -58,9 +58,3 @@ export type TunnelStatus = {
58
58
  };
59
59
  };
60
60
  };
61
- export type TunnelQrPayload = {
62
- qrPayload: string;
63
- publicUrl: string | null;
64
- lanUrl: string | null;
65
- expiresAt?: string;
66
- };
@@ -0,0 +1,17 @@
1
+ export declare const USER_AVATAR_MAX_BYTES: number;
2
+ type UserAvatarMime = 'image/png' | 'image/jpeg' | 'image/webp';
3
+ export type UserAvatarResult<T> = {
4
+ ok: true;
5
+ data: T;
6
+ } | {
7
+ ok: false;
8
+ error: string;
9
+ status: 400 | 404;
10
+ };
11
+ export declare function readUserAvatar(): Promise<UserAvatarResult<{
12
+ buffer: Buffer;
13
+ contentType: UserAvatarMime;
14
+ }>>;
15
+ export declare function writeUserAvatar(base64: string, mimeType: string): Promise<UserAvatarResult<{}>>;
16
+ export declare function deleteUserAvatar(): Promise<UserAvatarResult<{}>>;
17
+ export {};
@@ -0,0 +1,116 @@
1
+ import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
2
+ import { join } from "node:path";
3
+ import { mkdir, readFile, stat, unlink, writeFile } from "node:fs/promises";
4
+ //#region src/user-context/user-avatar.ts
5
+ init_paths_state();
6
+ const USER_AVATAR_MAX_BYTES = 2 * 1024 * 1024;
7
+ const USER_AVATAR_DIR = "profile";
8
+ const USER_AVATAR_BASENAME = "user-avatar";
9
+ const USER_AVATAR_EXTENSIONS = [
10
+ ".png",
11
+ ".jpg",
12
+ ".webp"
13
+ ];
14
+ function avatarRoot() {
15
+ return join(resolveStateDir(), USER_AVATAR_DIR);
16
+ }
17
+ function avatarFilenames() {
18
+ return USER_AVATAR_EXTENSIONS.map((extension) => `${USER_AVATAR_BASENAME}${extension}`);
19
+ }
20
+ function mimeToExtension(mimeType) {
21
+ const normalized = mimeType.toLowerCase().trim();
22
+ if (normalized === "image/png") return ".png";
23
+ if (normalized === "image/jpeg" || normalized === "image/jpg") return ".jpg";
24
+ if (normalized === "image/webp") return ".webp";
25
+ return null;
26
+ }
27
+ function extensionToMime(extension) {
28
+ if (extension === ".png") return "image/png";
29
+ if (extension === ".webp") return "image/webp";
30
+ return "image/jpeg";
31
+ }
32
+ function detectImageMime(buffer) {
33
+ if (buffer.length >= 8 && buffer[0] === 137 && buffer[1] === 80 && buffer[2] === 78 && buffer[3] === 71) return "image/png";
34
+ if (buffer.length >= 3 && buffer[0] === 255 && buffer[1] === 216 && buffer[2] === 255) return "image/jpeg";
35
+ if (buffer.length >= 12 && buffer[0] === 82 && buffer[1] === 73 && buffer[2] === 70 && buffer[3] === 70 && buffer[8] === 87 && buffer[9] === 69 && buffer[10] === 66 && buffer[11] === 80) return "image/webp";
36
+ return null;
37
+ }
38
+ async function readUserAvatar() {
39
+ const root = avatarRoot();
40
+ for (const filename of avatarFilenames()) {
41
+ const path = join(root, filename);
42
+ try {
43
+ const metadata = await stat(path);
44
+ if (!metadata.isFile() || metadata.size <= 0 || metadata.size > 2097152) continue;
45
+ const buffer = await readFile(path);
46
+ const contentType = detectImageMime(buffer);
47
+ if (!contentType) continue;
48
+ return {
49
+ ok: true,
50
+ data: {
51
+ buffer,
52
+ contentType
53
+ }
54
+ };
55
+ } catch {}
56
+ }
57
+ return {
58
+ ok: false,
59
+ error: "avatar not found",
60
+ status: 404
61
+ };
62
+ }
63
+ async function writeUserAvatar(base64, mimeType) {
64
+ const extension = mimeToExtension(mimeType);
65
+ if (!extension) return {
66
+ ok: false,
67
+ error: "unsupported mimeType (use image/png, image/jpeg, or image/webp)",
68
+ status: 400
69
+ };
70
+ if (!base64 || !/^[A-Za-z0-9+/]*={0,2}$/.test(base64)) return {
71
+ ok: false,
72
+ error: "invalid base64",
73
+ status: 400
74
+ };
75
+ const buffer = Buffer.from(base64, "base64");
76
+ if (buffer.length === 0 || buffer.length > 2097152) return {
77
+ ok: false,
78
+ error: `avatar must be non-empty and at most ${USER_AVATAR_MAX_BYTES} bytes`,
79
+ status: 400
80
+ };
81
+ const detectedMime = detectImageMime(buffer);
82
+ if (!detectedMime || detectedMime !== extensionToMime(extension)) return {
83
+ ok: false,
84
+ error: "file content does not match declared image type",
85
+ status: 400
86
+ };
87
+ const root = avatarRoot();
88
+ await mkdir(root, {
89
+ recursive: true,
90
+ mode: 448
91
+ });
92
+ const targetFilename = `${USER_AVATAR_BASENAME}${extension}`;
93
+ for (const filename of avatarFilenames()) {
94
+ if (filename === targetFilename) continue;
95
+ try {
96
+ await unlink(join(root, filename));
97
+ } catch {}
98
+ }
99
+ await writeFile(join(root, targetFilename), buffer, { mode: 384 });
100
+ return {
101
+ ok: true,
102
+ data: {}
103
+ };
104
+ }
105
+ async function deleteUserAvatar() {
106
+ const root = avatarRoot();
107
+ for (const filename of avatarFilenames()) try {
108
+ await unlink(join(root, filename));
109
+ } catch {}
110
+ return {
111
+ ok: true,
112
+ data: {}
113
+ };
114
+ }
115
+ //#endregion
116
+ export { USER_AVATAR_MAX_BYTES, deleteUserAvatar, readUserAvatar, writeUserAvatar };
@@ -3,7 +3,7 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
4
4
  import { getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
5
5
  import { completeWithResolvedCredentials } from "../../providers/model-call.js";
6
- import { resolveModelRef } from "../../config/agent-typed-models.js";
6
+ import { resolveModelSelector } from "../../config/agent-model-intents.js";
7
7
  import { buildWorkflowDraftPrompt, buildWorkflowDraftRepairPrompt } from "./workflow-draft-prompt.js";
8
8
  import { buildWorkflowDraftResponse, parseGeneratedWorkflowDraft } from "./workflow-draft-validator.js";
9
9
  //#region src/workflows/draft/workflow-draft-service.ts
@@ -83,7 +83,7 @@ var WorkflowDraftService = class {
83
83
  };
84
84
  function resolveDraftModelRef(config, agentId) {
85
85
  try {
86
- return resolveModelRef(config, agentId, "large");
86
+ return resolveModelSelector(config, agentId, "reasoning");
87
87
  } catch {
88
88
  return getAgentDefaultModelRef(config) ?? getDefaultModelSync(config);
89
89
  }
@@ -6,9 +6,9 @@ import { TaskConversationRepository } from "../../tasks/task-conversation-reposi
6
6
  import { TaskRunRepository } from "../../tasks/task-run-repository.js";
7
7
  import { getProjectWorkspacePathForSession } from "../../projects/workspace.js";
8
8
  import { publishAutomationProductEvent } from "../../automations/product-events.js";
9
- import { resolveModelRef } from "../../config/agent-typed-models.js";
10
9
  import { TaskContextRepository } from "../../tasks/task-context-repository.js";
11
10
  import { TaskApplicationService } from "../../tasks/task-application-service.js";
11
+ import { resolveModelSelector } from "../../config/agent-model-intents.js";
12
12
  import { DelegateSubagentRunner } from "../../agent/workflow/subagent-runner.js";
13
13
  import { preflightWorkflowConnectors } from "../../connectors/workflow-preflight.js";
14
14
  import { CatalogWorkflowDefinitionRegistry } from "../registry/catalog-workflow-definition-registry.js";
@@ -90,7 +90,7 @@ var WorkflowRunService = class {
90
90
  }
91
91
  async startWorkflowRun(params) {
92
92
  const config = this.options.service.currentConfig;
93
- const workflowPolicy = config.agents?.list ? resolveEffectiveAgentProfileForSession(config, params.parentSessionKey ?? `agent:${params.agentId}`).manifest.workflows : void 0;
93
+ const workflowPolicy = config.agents?.list ? resolveEffectiveAgentProfileForSession(config, params.parentSessionKey ?? `agent:${params.agentId}`).config.workflows : void 0;
94
94
  if (workflowPolicy?.allowed && !workflowPolicy.allowed.includes(params.definitionId)) return {
95
95
  ok: false,
96
96
  code: "policy_denied",
@@ -568,7 +568,7 @@ var WorkflowRunService = class {
568
568
  runner,
569
569
  hooks: [{ afterRun: ({ runId, status }) => new WorkflowWritebackService().apply(params.runStore, runId, status) }],
570
570
  resolveModelId: (modelId) => {
571
- return resolveModel(resolveModelRef(gatewayService.currentConfig, profileAgentId, modelId));
571
+ return resolveModel(resolveModelSelector(gatewayService.currentConfig, profileAgentId, modelId));
572
572
  },
573
573
  parentSessionKey: params.sessionKey,
574
574
  subagentSessionKeyFactory: ({ runId, agentId }) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.231",
3
+ "version": "0.0.233",
4
4
  "description": "Local-first personal AI assistant with reviewable user understanding, durable tasks, workflows, automations, and local or cloud models.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -163,10 +163,10 @@
163
163
  "vitepress": "^1.6.4",
164
164
  "vitest": "4.1.5",
165
165
  "vue": "^3.5.35",
166
- "@xopcai/endpoint-tools-protocol": "0.0.0",
167
166
  "@xopcai/gateway-contract": "0.0.0",
168
- "@xopcai/realtime-client": "0.0.0",
169
- "@xopcai/realtime-protocol": "0.0.0"
167
+ "@xopcai/realtime-protocol": "0.0.0",
168
+ "@xopcai/endpoint-tools-protocol": "0.0.0",
169
+ "@xopcai/realtime-client": "0.0.0"
170
170
  },
171
171
  "scripts": {
172
172
  "assets:brand": "node scripts/generate-brand-assets.mjs",