@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
@@ -1,58 +1,30 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { AgentConfigEntrySchema, CapabilityPresetSchema, DEFAULT_CAPABILITY_PRESET_ID, init_schema as init_schema$1 } from "../agent-manifest/schema.js";
3
- import { init_preset_chain, linearizePresetIds } from "../agent-manifest/preset-chain.js";
2
+ import { AgentModelsOverrideSchema, AgentsConfigSchema as AgentsConfigSchema$1, DEFAULT_AGENT_MODEL_REF, ImageGenerationRouteSchema, ModelRouteSchema } from "../agent-config/schema.js";
3
+ import { init_agent_config } from "../agent-config/index.js";
4
4
  import { checkCacheDir, init_cache_dir_policy } from "../browser/cache-dir-policy.js";
5
5
  import { UserContextConfigSchema, init_config } from "../user-context/config.js";
6
- import { DEFAULT_AGENT_MODELS, init_default_model } from "./default-model.js";
6
+ import { init_default_model } from "./default-model.js";
7
7
  import { init_public_url, validatePublicUrl } from "./public-url.js";
8
8
  import { TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema, init_config_schema } from "../../extensions/telegram/src/config-schema.js";
9
9
  import { WeixinAccountConfigSchema, WeixinConfigSchema, init_config_schema as init_config_schema$1 } from "../../extensions/weixin/src/config-schema.js";
10
10
  import { z } from "zod";
11
11
  //#region src/config/schema.ts
12
12
  function getAgentDefaultModelRef(config) {
13
- const list = Array.isArray(config.agents?.list) ? config.agents.list : [];
14
- const defaultId = config.agents?.default?.trim() || list.find((entry) => entry.default === true)?.id?.trim() || list[0]?.id;
15
- const agent = list.find((entry) => entry.enabled !== false && entry.id === defaultId) ?? list[0];
16
- if (!agent) return void 0;
17
- let modelRef;
18
- const applyModels = (models) => {
19
- const roles = models?.roles ?? {};
20
- const defaultRole = models?.defaultRole ?? Object.keys(roles)[0];
21
- const next = (defaultRole ? roles[defaultRole] : void 0)?.model.trim();
22
- if (next) modelRef = next;
23
- };
24
- const rootPresetIds = [...config.agents.capabilityPresets[config.agents.defaultPreset] ? [config.agents.defaultPreset] : [], ...(agent.extends ?? []).filter((id) => id !== config.agents.defaultPreset)];
25
- for (const presetId of linearizePresetIds(rootPresetIds, config.agents.capabilityPresets)) applyModels(config.agents.capabilityPresets[presetId]?.models);
26
- applyModels(agent.models);
27
- return modelRef;
13
+ return config.agents.list.find((entry) => entry.enabled !== false && entry.id === config.agents.default)?.models?.chat?.primary ?? config.agents.defaults.models.chat.primary;
28
14
  }
29
15
  function getAgentDefaultModelsConfig(config, requestedAgentId) {
30
- const list = Array.isArray(config.agents?.list) ? config.agents.list : [];
31
- const defaultId = requestedAgentId?.trim() || config.agents?.default?.trim() || list.find((entry) => entry.default === true)?.id?.trim() || list[0]?.id;
32
- const agent = list.find((entry) => entry.enabled !== false && entry.id === defaultId) ?? list[0];
33
- if (!agent) return void 0;
34
- let modelConfig;
35
- const applyModels = (models) => {
36
- if (!models) return;
37
- modelConfig = {
38
- ...modelConfig,
39
- ...models,
40
- roles: {
41
- ...modelConfig?.roles ?? {},
42
- ...models.roles ?? {}
43
- }
44
- };
45
- };
46
- const rootPresetIds = [...config.agents.capabilityPresets[config.agents.defaultPreset] ? [config.agents.defaultPreset] : [], ...(agent.extends ?? []).filter((id) => id !== config.agents.defaultPreset)];
47
- for (const presetId of linearizePresetIds(rootPresetIds, config.agents.capabilityPresets)) applyModels(config.agents.capabilityPresets[presetId]?.models);
48
- applyModels(agent.models);
49
- return modelConfig;
16
+ const id = requestedAgentId?.trim() || config.agents.default;
17
+ return config.agents.list.find((entry) => entry.enabled !== false && entry.id === id)?.models;
50
18
  }
51
19
  function getAgentDefaultImageModelConfig(config) {
52
- return getAgentDefaultModelsConfig(config)?.imageModel;
20
+ const models = getAgentDefaultModelsConfig(config);
21
+ if (models && Object.hasOwn(models, "imageUnderstanding")) return models.imageUnderstanding ?? void 0;
22
+ return config.agents.defaults.models.imageUnderstanding;
53
23
  }
54
24
  function getAgentDefaultImageGenerationModelConfig(config, agentId) {
55
- return getAgentDefaultModelsConfig(config, agentId)?.imageGenerationModel;
25
+ const models = getAgentDefaultModelsConfig(config, agentId);
26
+ if (models && Object.hasOwn(models, "imageGeneration")) return models.imageGeneration ?? void 0;
27
+ return config.agents.defaults.models.imageGeneration;
56
28
  }
57
29
  /** `provider/model` or null when invalid. */
58
30
  function parseModelRef(ref) {
@@ -64,88 +36,39 @@ function parseModelRef(ref) {
64
36
  model: trimmed.slice(idx + 1).trim()
65
37
  };
66
38
  }
67
- var AgentModelRefSchema, AgentImageGenerationModelSchema, AgentTypedModelRoleSchema, AgentTypedModelRolesSchema, AgentModelsSchema, AgentsConfigSchema, BrowserCloudConfigSchema, BrowserExtensionConfigSchema, BrowserCloakConfigSchema, BrowserConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, SessionResetModeSchema, SessionResetConfigSchema, SessionResetByTypeSchema, SessionScopeSchema, SessionConfigSchema, ChannelsConfigSchema, SearchProviderEntrySchema, WebSearchConfigSchema, WebsiteBlocklistSchema, WebToolsConfigSchema, ToolsConfigSchema, RuntimePreferenceSchema, RuntimeProvisionSchema, LanguageRuntimeSchema, DEFAULT_RUNTIME_TOOLS_CONFIG, RuntimeToolsConfigSchema, GatewayAuthRateLimitSchema, GatewaySecuritySchema, GatewayTrustedProxySchema, GatewayAuthSchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayRemoteSchema, GatewayTlsSchema, GatewayModeSchema, HeartbeatConfigSchema, GatewayChannelConnectDeferModeSchema, TunnelConsentSchema, TunnelConfigSchema, WorkspaceImportConfigSchema, WorkspaceConfigSchema, GatewayBindModeSchema, GatewayWebchatConfigSchema, GatewayConfigSchema, ModelsDevConfigSchema, ModelCatalogConfigSchema, SttProviderConfigCatchallSchema, STTProviderConfigSchema, STTFallbackConfigSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, STTConfigSchema, TtsProviderConfigCatchallSchema, TTSProviderConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSEdgeConfigSchema, TTSSummarizationConfigSchema, TTSConfigSchema, VoiceRefinementConfigSchema, VoiceConfigSchema, MessagesConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProviderAuthConfigSchema, ProvidersConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, UpdateAutoConfigSchema, UpdateConfigSchema, CommandsConfigSchema, TuiConfigSchema, McpHttpUrlSchema, ConnectorSecretReferenceSchema, McpConfigScalarSchema, McpOAuthConfigSchema, McpServerSchema, McpConfigSchema, ConnectorsConfigSchema, ExperimentalConfigSchema, ConfigSchema;
39
+ var AgentModelRefSchema, AgentImageGenerationModelSchema, AgentModelsSchema, AgentsConfigSchema, BrowserCloudConfigSchema, BrowserExtensionConfigSchema, BrowserCloakConfigSchema, BrowserConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, SessionDmScopeSchema, SessionStorageConfigSchema, SessionResetModeSchema, SessionResetConfigSchema, SessionResetByTypeSchema, SessionScopeSchema, SessionConfigSchema, ChannelsConfigSchema, SearchProviderEntrySchema, WebSearchConfigSchema, WebsiteBlocklistSchema, WebToolsConfigSchema, ToolsConfigSchema, RuntimePreferenceSchema, RuntimeProvisionSchema, LanguageRuntimeSchema, DEFAULT_RUNTIME_TOOLS_CONFIG, RuntimeToolsConfigSchema, GatewayAuthRateLimitSchema, GatewaySecuritySchema, GatewayTrustedProxySchema, GatewayAuthSchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayRemoteSchema, GatewayTlsSchema, GatewayModeSchema, HeartbeatConfigSchema, GatewayChannelConnectDeferModeSchema, TunnelConsentSchema, TunnelConfigSchema, WorkspaceImportConfigSchema, WorkspaceConfigSchema, GatewayBindModeSchema, GatewayWebchatConfigSchema, GatewayConfigSchema, ModelsDevConfigSchema, ModelCatalogConfigSchema, SttProviderConfigCatchallSchema, STTProviderConfigSchema, STTFallbackConfigSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, STTConfigSchema, TtsProviderConfigCatchallSchema, TTSProviderConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSEdgeConfigSchema, TTSSummarizationConfigSchema, TTSConfigSchema, VoiceRefinementConfigSchema, VoiceConfigSchema, MessagesConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProviderAuthConfigSchema, ProvidersConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, UpdateAutoConfigSchema, UpdateConfigSchema, CommandsConfigSchema, TuiConfigSchema, McpHttpUrlSchema, ConnectorSecretReferenceSchema, McpConfigScalarSchema, McpOAuthConfigSchema, McpServerSchema, McpConfigSchema, ConnectorsConfigSchema, ExperimentalConfigSchema, ConfigSchema;
68
40
  var init_schema = __esmMin((() => {
69
- init_schema$1();
70
- init_preset_chain();
41
+ init_agent_config();
71
42
  init_cache_dir_policy();
72
43
  init_config();
73
44
  init_default_model();
74
45
  init_public_url();
75
46
  init_config_schema();
76
47
  init_config_schema$1();
77
- AgentModelRefSchema = z.object({
78
- primary: z.string().min(1),
79
- fallbacks: z.array(z.string()).optional()
80
- }).strict();
81
- AgentImageGenerationModelSchema = z.object({
82
- primary: z.string().min(1),
83
- fallbacks: z.array(z.string()).optional(),
84
- /** Hard cap for the whole generation attempt (ms). */
85
- timeoutMs: z.number().int().positive().optional(),
86
- /**
87
- * When all `primary + fallbacks` candidates fail, sweep every other
88
- * configured provider before giving up.
89
- */
90
- autoProviderFallback: z.boolean().optional()
91
- }).strict();
92
- AgentTypedModelRoleSchema = z.object({
93
- description: z.string().max(500).optional(),
94
- model: z.string().min(1),
95
- fallbacks: z.array(z.string().min(1)).optional()
96
- }).strict().superRefine((entry, ctx) => {
97
- const validateRef = (ref) => {
98
- const trimmed = ref.trim();
99
- const idx = trimmed.indexOf("/");
100
- return idx > 0 && idx < trimmed.length - 1;
101
- };
102
- if (!validateRef(entry.model)) ctx.addIssue({
103
- code: "custom",
104
- message: `model must be provider/model format (got '${entry.model}')`,
105
- path: ["model"]
106
- });
107
- for (const [index, fallback] of (entry.fallbacks ?? []).entries()) if (!validateRef(fallback)) ctx.addIssue({
108
- code: "custom",
109
- message: `fallback must be provider/model format (got '${fallback}')`,
110
- path: ["fallbacks", index]
111
- });
112
- });
113
- AgentTypedModelRolesSchema = z.record(z.string().regex(/^[a-z][a-z0-9_-]{0,63}$/), AgentTypedModelRoleSchema).optional();
114
- AgentModelsSchema = z.object({
115
- defaultRole: z.string().regex(/^[a-z][a-z0-9_-]{0,63}$/).optional(),
116
- roles: AgentTypedModelRolesSchema,
117
- imageModel: AgentModelRefSchema.optional(),
118
- imageGenerationModel: AgentImageGenerationModelSchema.optional()
119
- }).strict().optional();
120
- AgentsConfigSchema = z.object({
121
- /** Default agent id when not specified (routing / session creation). */
122
- default: z.string().optional(),
123
- /** Protected global defaults preset applied before each agent's own presets. */
124
- defaultPreset: z.string().default(DEFAULT_CAPABILITY_PRESET_ID),
125
- capabilityPresets: z.record(z.string(), CapabilityPresetSchema).default({}),
126
- list: z.array(AgentConfigEntrySchema).default([])
127
- }).strict().default({
48
+ AgentModelRefSchema = ModelRouteSchema;
49
+ AgentImageGenerationModelSchema = ImageGenerationRouteSchema;
50
+ AgentModelsSchema = AgentModelsOverrideSchema;
51
+ AgentsConfigSchema = AgentsConfigSchema$1.default({
128
52
  default: "main",
129
- defaultPreset: DEFAULT_CAPABILITY_PRESET_ID,
130
- capabilityPresets: { [DEFAULT_CAPABILITY_PRESET_ID]: {
131
- id: DEFAULT_CAPABILITY_PRESET_ID,
132
- name: "Global defaults",
133
- description: "Default capabilities inherited by every agent.",
134
- version: 1,
135
- models: DEFAULT_AGENT_MODELS
136
- } },
53
+ defaults: {
54
+ models: {
55
+ chat: {
56
+ primary: DEFAULT_AGENT_MODEL_REF,
57
+ fallbacks: []
58
+ },
59
+ intents: {}
60
+ },
61
+ skills: {
62
+ mode: "all-enabled",
63
+ exclude: []
64
+ },
65
+ tools: {},
66
+ workflows: {},
67
+ runtime: {}
68
+ },
137
69
  list: [{
138
70
  id: "main",
139
- enabled: true,
140
- identity: {
141
- name: "Smart Assistant",
142
- description: "General-purpose personal assistant.",
143
- role: "General assistant",
144
- language: "en",
145
- tone: "direct"
146
- },
147
- responsibilities: { primary: ["Help the user complete tasks"] },
148
- workspace: { root: "~/.xopc/workspace/main" }
71
+ enabled: true
149
72
  }]
150
73
  });
151
74
  BrowserCloudConfigSchema = z.object({
@@ -1080,26 +1003,25 @@ workDiscoveryOnboarding: z.boolean().default(true) }).strict().default({ workDis
1080
1003
  },
1081
1004
  agents: {
1082
1005
  default: "main",
1083
- defaultPreset: DEFAULT_CAPABILITY_PRESET_ID,
1084
- capabilityPresets: { [DEFAULT_CAPABILITY_PRESET_ID]: {
1085
- id: DEFAULT_CAPABILITY_PRESET_ID,
1086
- name: "Global defaults",
1087
- description: "Default capabilities inherited by every agent.",
1088
- version: 1,
1089
- models: DEFAULT_AGENT_MODELS
1090
- } },
1006
+ defaults: {
1007
+ models: {
1008
+ chat: {
1009
+ primary: DEFAULT_AGENT_MODEL_REF,
1010
+ fallbacks: []
1011
+ },
1012
+ intents: {}
1013
+ },
1014
+ skills: {
1015
+ mode: "all-enabled",
1016
+ exclude: []
1017
+ },
1018
+ tools: {},
1019
+ workflows: {},
1020
+ runtime: {}
1021
+ },
1091
1022
  list: [{
1092
1023
  id: "main",
1093
- enabled: true,
1094
- identity: {
1095
- name: "Smart Assistant",
1096
- description: "General-purpose personal assistant.",
1097
- role: "General assistant",
1098
- language: "en",
1099
- tone: "direct"
1100
- },
1101
- responsibilities: { primary: ["Help the user complete tasks"] },
1102
- workspace: { root: "~/.xopc/workspace/main" }
1024
+ enabled: true
1103
1025
  }]
1104
1026
  },
1105
1027
  bindings: [],
@@ -1173,4 +1095,4 @@ workDiscoveryOnboarding: z.boolean().default(true) }).strict().default({ workDis
1173
1095
  }));
1174
1096
  //#endregion
1175
1097
  init_schema();
1176
- export { 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, McpOAuthConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelCatalogConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, RuntimeToolsConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TuiConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, VoiceConfigSchema, VoiceRefinementConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WeixinAccountConfigSchema, WeixinConfigSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultImageGenerationModelConfig, getAgentDefaultImageModelConfig, getAgentDefaultModelRef, init_schema, parseModelRef };
1098
+ export { AgentImageGenerationModelSchema, AgentModelRefSchema, AgentModelsSchema, AgentsConfigSchema, BindingMatchSchema, BindingRuleSchema, BindingsConfigSchema, BrowserConfigSchema, ChannelsConfigSchema, CommandsConfigSchema, ConfigSchema, ConnectorsConfigSchema, ExperimentalConfigSchema, ExtensionSecurityConfigSchema, ExtensionSlotsConfigSchema, ExtensionsConfigSchema, GatewayAuthRateLimitSchema, GatewayAuthSchema, GatewayBindModeSchema, GatewayChannelConnectDeferModeSchema, GatewayConfigSchema, GatewayModeSchema, GatewayRemoteSchema, GatewaySecuritySchema, GatewayTailscaleConsentSchema, GatewayTailscaleSchema, GatewayTlsSchema, GatewayTrustedProxySchema, GatewayWebchatConfigSchema, HeartbeatConfigSchema, McpConfigSchema, McpOAuthConfigSchema, McpServerSchema, MediaUnderstandingCapabilitiesSchema, MediaUnderstandingModelSchema, MessagesConfigSchema, ModelCatalogConfigSchema, ModelsDevConfigSchema, ProviderAuthConfigSchema, ProviderAzureConfigSchema, ProviderRequestOverridesSchema, ProvidersConfigSchema, RuntimeToolsConfigSchema, STTConfigSchema, STTFallbackConfigSchema, STTProviderConfigSchema, SearchProviderEntrySchema, SessionConfigSchema, SessionDmScopeSchema, SessionResetByTypeSchema, SessionResetConfigSchema, SessionResetModeSchema, SessionScopeSchema, SessionStorageConfigSchema, TTSConfigSchema, TTSEdgeConfigSchema, TTSFallbackConfigSchema, TTSModelOverridesConfigSchema, TTSProviderConfigSchema, TTSSummarizationConfigSchema, TelegramAccountConfigSchema, TelegramConfigSchema, TelegramGroupConfigSchema, TelegramTopicConfigSchema, ToolsConfigSchema, ToolsMediaAudioConfigSchema, ToolsMediaConfigSchema, TuiConfigSchema, TunnelConfigSchema, TunnelConsentSchema, UpdateAutoConfigSchema, UpdateConfigSchema, VoiceConfigSchema, VoiceRefinementConfigSchema, WebSearchConfigSchema, WebToolsConfigSchema, WebsiteBlocklistSchema, WeixinAccountConfigSchema, WeixinConfigSchema, WorkspaceConfigSchema, WorkspaceImportConfigSchema, getAgentDefaultImageGenerationModelConfig, getAgentDefaultImageModelConfig, getAgentDefaultModelRef, init_schema, parseModelRef };
@@ -0,0 +1,22 @@
1
+ import type { EndpointConnectionSnapshot } from './registry.js';
2
+ import { EndpointRegistry } from './registry.js';
3
+ export interface EndpointSessionBinding {
4
+ sessionKey: string;
5
+ endpointId: string;
6
+ boundAt: number;
7
+ }
8
+ export interface EndpointSessionBindingStore {
9
+ get(sessionKey: string): EndpointSessionBinding | undefined;
10
+ set(binding: EndpointSessionBinding): EndpointSessionBinding;
11
+ delete(sessionKey: string): boolean;
12
+ }
13
+ export declare class EndpointBindingService {
14
+ private readonly registry;
15
+ private readonly store;
16
+ constructor(registry: EndpointRegistry, store?: EndpointSessionBindingStore);
17
+ bind(sessionKey: string, endpointId: string, now?: number): EndpointSessionBinding;
18
+ get(sessionKey: string): EndpointSessionBinding | undefined;
19
+ resolve(sessionKey: string): EndpointConnectionSnapshot | undefined;
20
+ unbind(sessionKey: string): boolean;
21
+ private normalizeSessionKey;
22
+ }
@@ -0,0 +1,45 @@
1
+ //#region src/endpoint-tools/binding-service.ts
2
+ function memoryStore() {
3
+ const bindings = /* @__PURE__ */ new Map();
4
+ return {
5
+ get: (sessionKey) => bindings.get(sessionKey),
6
+ set: (binding) => {
7
+ bindings.set(binding.sessionKey, binding);
8
+ return binding;
9
+ },
10
+ delete: (sessionKey) => bindings.delete(sessionKey)
11
+ };
12
+ }
13
+ var EndpointBindingService = class {
14
+ constructor(registry, store = memoryStore()) {
15
+ this.registry = registry;
16
+ this.store = store;
17
+ }
18
+ bind(sessionKey, endpointId, now = Date.now()) {
19
+ const normalizedSessionKey = this.normalizeSessionKey(sessionKey);
20
+ if (!this.registry.get(endpointId)) throw new Error("Endpoint is offline");
21
+ const binding = {
22
+ sessionKey: normalizedSessionKey,
23
+ endpointId,
24
+ boundAt: now
25
+ };
26
+ return this.store.set(binding);
27
+ }
28
+ get(sessionKey) {
29
+ return this.store.get(this.normalizeSessionKey(sessionKey));
30
+ }
31
+ resolve(sessionKey) {
32
+ const binding = this.get(sessionKey);
33
+ return binding ? this.registry.get(binding.endpointId) : void 0;
34
+ }
35
+ unbind(sessionKey) {
36
+ return this.store.delete(this.normalizeSessionKey(sessionKey));
37
+ }
38
+ normalizeSessionKey(sessionKey) {
39
+ const normalized = sessionKey.trim();
40
+ if (!normalized || normalized.length > 500) throw new TypeError("Invalid session key");
41
+ return normalized;
42
+ }
43
+ };
44
+ //#endregion
45
+ export { EndpointBindingService };
@@ -1,4 +1,5 @@
1
1
  export { EndpointToolRuntime } from './runtime.js';
2
+ export { EndpointBindingService, type EndpointSessionBinding, type EndpointSessionBindingStore, } from './binding-service.js';
2
3
  export { EndpointInvocationService, EndpointToolExecutionError, type EndpointInvocationAuditSink, type EndpointInvocationResult, } from './invocation-service.js';
3
4
  export { EndpointToolPolicy, EndpointToolPolicyError } from './policy.js';
4
5
  export { EndpointRegistry, endpointToolRevision, type EndpointConnectionSnapshot, type RegisteredEndpointTool, } from './registry.js';
@@ -1,6 +1,7 @@
1
+ import { EndpointBindingService } from "./binding-service.js";
1
2
  import { EndpointToolPolicy, EndpointToolPolicyError } from "./policy.js";
2
3
  import { EndpointInvocationService, EndpointToolExecutionError } from "./invocation-service.js";
3
4
  import { EndpointRegistry, endpointToolRevision } from "./registry.js";
4
5
  import { ENDPOINT_UPLOAD_MAX_BYTES, EndpointUploadError, EndpointUploadService } from "./upload-service.js";
5
6
  import { EndpointToolRuntime } from "./runtime.js";
6
- export { ENDPOINT_UPLOAD_MAX_BYTES, EndpointInvocationService, EndpointRegistry, EndpointToolExecutionError, EndpointToolPolicy, EndpointToolPolicyError, EndpointToolRuntime, EndpointUploadError, EndpointUploadService, endpointToolRevision };
7
+ export { ENDPOINT_UPLOAD_MAX_BYTES, EndpointBindingService, EndpointInvocationService, EndpointRegistry, EndpointToolExecutionError, EndpointToolPolicy, EndpointToolPolicyError, EndpointToolRuntime, EndpointUploadError, EndpointUploadService, endpointToolRevision };
@@ -43,6 +43,7 @@ export declare class EndpointInvocationService {
43
43
  private readonly options;
44
44
  private readonly pending;
45
45
  private readonly policy;
46
+ private readonly ajv;
46
47
  constructor(registry: EndpointRegistry, options?: EndpointInvocationServiceOptions);
47
48
  invoke(params: {
48
49
  endpointId: string;
@@ -1,6 +1,7 @@
1
1
  import { ENDPOINT_INVOCATION_RECEIPT_TIMEOUT_MS, canonicalJson } from "../../packages/endpoint-tools-protocol/src/index.js";
2
2
  import { EndpointToolPolicy, EndpointToolPolicyError } from "./policy.js";
3
3
  import crypto from "node:crypto";
4
+ import Ajv2020 from "ajv/dist/2020.js";
4
5
  //#region src/endpoint-tools/invocation-service.ts
5
6
  var EndpointToolExecutionError = class extends Error {
6
7
  constructor(code, message) {
@@ -12,6 +13,10 @@ var EndpointToolExecutionError = class extends Error {
12
13
  var EndpointInvocationService = class {
13
14
  pending = /* @__PURE__ */ new Map();
14
15
  policy;
16
+ ajv = new Ajv2020({
17
+ allErrors: true,
18
+ strict: true
19
+ });
15
20
  constructor(registry, options = {}) {
16
21
  this.registry = registry;
17
22
  this.options = options;
@@ -58,6 +63,7 @@ var EndpointInvocationService = class {
58
63
  id: invocationId,
59
64
  endpointId: params.endpointId,
60
65
  toolName: params.toolName,
66
+ descriptor: tool.descriptor,
61
67
  state: "sent",
62
68
  receiptTimer: setTimeout(() => {
63
69
  this.fail(invocationId, this.error("TOOL_TIMEOUT", "Endpoint did not receive the invocation"));
@@ -111,6 +117,8 @@ var EndpointInvocationService = class {
111
117
  case "tool.result":
112
118
  if (pending.state !== "running") return;
113
119
  try {
120
+ const validate = this.ajv.compile(pending.descriptor.outputSchema);
121
+ if (!validate(message.payload.content)) throw new Error(`Endpoint result does not match its contract: ${this.ajv.errorsText(validate.errors)}`);
114
122
  this.options.uploads?.validateAndClose(invocationId, message.payload.content);
115
123
  } catch (error) {
116
124
  this.fail(invocationId, this.error("PROTOCOL_ERROR", error instanceof Error ? error.message : String(error)));
@@ -1,10 +1,13 @@
1
- import type { EndpointAvailability, EndpointKind, EndpointToolDescriptor } from '@xopcai/endpoint-tools-protocol';
1
+ import { type EndpointAvailability, type EndpointKind, type EndpointToolDescriptor } from '@xopcai/endpoint-tools-protocol';
2
2
  export interface EndpointToolPolicyDecision {
3
3
  confirmationRequired: boolean;
4
4
  }
5
5
  export declare class EndpointToolPolicyError extends Error {
6
6
  }
7
7
  export declare class EndpointToolPolicy {
8
+ private readonly ajv;
8
9
  validateDescriptor(kind: EndpointKind, descriptor: EndpointToolDescriptor): void;
9
10
  evaluate(descriptor: EndpointToolDescriptor, availability: EndpointAvailability): EndpointToolPolicyDecision;
11
+ private validatePolicyFields;
12
+ private assertFields;
10
13
  }
@@ -1,17 +1,80 @@
1
+ import { ENDPOINT_CONTACT_LIST_OUTPUT_SCHEMA, ENDPOINT_CONTACT_OUTPUT_SCHEMA, ENDPOINT_FILE_OUTPUT_SCHEMA, ENDPOINT_TEXT_OUTPUT_SCHEMA, canonicalJson } from "../../packages/endpoint-tools-protocol/src/index.js";
2
+ import Ajv2020 from "ajv/dist/2020.js";
1
3
  //#region src/endpoint-tools/policy.ts
2
4
  var EndpointToolPolicyError = class extends Error {};
5
+ function contract(policyId, outputSchema, resultKinds, permissions) {
6
+ return {
7
+ policyId,
8
+ outputSchema,
9
+ resultKinds,
10
+ permissions
11
+ };
12
+ }
13
+ const POLICY_BY_TOOL = {
14
+ "web.file.pick": contract("personal.foreground-read", ENDPOINT_FILE_OUTPUT_SCHEMA, ["file"], ["file-read"]),
15
+ "web.file.download": contract("user.foreground-write", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["file-download"]),
16
+ "web.page.get_selection": contract("public.foreground-read", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], []),
17
+ "web.clipboard.write": contract("user.foreground-write", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["clipboard-write"]),
18
+ "web.page.navigate": contract("user.foreground-write", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["navigation"]),
19
+ "desktop.file.pick": contract("personal.foreground-read", ENDPOINT_FILE_OUTPUT_SCHEMA, ["file"], ["file-read"]),
20
+ "desktop.file.save": contract("user.foreground-write", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["file-write"]),
21
+ "desktop.notification.show": contract("user.foreground-write", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["notifications"]),
22
+ "desktop.clipboard.read": contract("personal.foreground-read", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["clipboard-read"]),
23
+ "desktop.clipboard.write": contract("user.foreground-write", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["clipboard-write"]),
24
+ "desktop.app.open_external": contract("user.foreground-write", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["open-external-url"]),
25
+ "mobile.contacts.pick": contract("personal.foreground-read", ENDPOINT_CONTACT_OUTPUT_SCHEMA, ["json"], ["contacts-read-selected"]),
26
+ "mobile.contacts.search": contract("personal.foreground-read", ENDPOINT_CONTACT_LIST_OUTPUT_SCHEMA, ["json"], ["contacts-read"]),
27
+ "mobile.contacts.get": contract("personal.foreground-read", ENDPOINT_CONTACT_OUTPUT_SCHEMA, ["json"], ["contacts-read"]),
28
+ "mobile.file.pick": contract("personal.foreground-read", ENDPOINT_FILE_OUTPUT_SCHEMA, ["file"], ["file-read"]),
29
+ "mobile.file.share": contract("user.foreground-write", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["file-share"]),
30
+ "mobile.notification.show": contract("user.foreground-write", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["notifications"]),
31
+ "mobile.device.get_info": contract("public.background-read", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], []),
32
+ "mobile.clipboard.write": contract("user.foreground-write", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["clipboard-write"]),
33
+ "mobile.app.open_url": contract("user.foreground-write", ENDPOINT_TEXT_OUTPUT_SCHEMA, ["text"], ["open-external-url"])
34
+ };
3
35
  var EndpointToolPolicy = class {
36
+ ajv = new Ajv2020({
37
+ allErrors: true,
38
+ strict: true
39
+ });
4
40
  validateDescriptor(kind, descriptor) {
5
41
  if (!descriptor.name.startsWith(`${kind}.`)) throw new EndpointToolPolicyError(`Tool ${descriptor.name} does not belong to ${kind}`);
6
- if (descriptor.effect !== "read") {
7
- if (descriptor.confirmation !== "always") throw new EndpointToolPolicyError(`Mutating tool ${descriptor.name} must always require confirmation`);
8
- if (!descriptor.requiresForeground) throw new EndpointToolPolicyError(`Mutating tool ${descriptor.name} must require foreground`);
9
- if (descriptor.requiredPermissions.length === 0) throw new EndpointToolPolicyError(`Mutating tool ${descriptor.name} must declare a permission`);
42
+ const contract = POLICY_BY_TOOL[descriptor.name];
43
+ if (!contract) throw new EndpointToolPolicyError(`Tool ${descriptor.name} has no trusted server policy`);
44
+ if (descriptor.policyId !== contract.policyId) throw new EndpointToolPolicyError(`Tool ${descriptor.name} does not match its trusted server policy`);
45
+ if (canonicalJson(descriptor.outputSchema) !== canonicalJson(contract.outputSchema) || canonicalJson(descriptor.resultKinds) !== canonicalJson(contract.resultKinds) || canonicalJson([...descriptor.requiredPermissions].sort()) !== canonicalJson([...contract.permissions].sort())) throw new EndpointToolPolicyError(`Tool ${descriptor.name} does not match its trusted server contract`);
46
+ this.validatePolicyFields(descriptor);
47
+ try {
48
+ this.ajv.compile(descriptor.outputSchema);
49
+ } catch (error) {
50
+ throw new EndpointToolPolicyError(`Tool ${descriptor.name} has an invalid output schema: ${error instanceof Error ? error.message : String(error)}`);
10
51
  }
11
52
  }
12
53
  evaluate(descriptor, availability) {
13
54
  if (descriptor.requiresForeground && availability !== "foreground") throw new EndpointToolPolicyError("Endpoint is not in the foreground");
14
- return { confirmationRequired: descriptor.confirmation === "always" || descriptor.effect !== "read" };
55
+ return { confirmationRequired: descriptor.confirmation === "always" };
56
+ }
57
+ validatePolicyFields(descriptor) {
58
+ switch (descriptor.policyId) {
59
+ case "public.background-read":
60
+ this.assertFields(descriptor, "read", "never", false, "public");
61
+ return;
62
+ case "public.foreground-read":
63
+ this.assertFields(descriptor, "read", "never", true, "public");
64
+ return;
65
+ case "personal.foreground-read":
66
+ this.assertFields(descriptor, "read", "always", true, "personal");
67
+ if (descriptor.requiredPermissions.length === 0) throw new EndpointToolPolicyError(`Personal tool ${descriptor.name} must declare a permission`);
68
+ return;
69
+ case "user.foreground-write":
70
+ if (descriptor.effect === "read") throw new EndpointToolPolicyError(`Mutating tool ${descriptor.name} cannot declare a read effect`);
71
+ if (descriptor.confirmation !== "always" || !descriptor.requiresForeground || descriptor.sensitivity !== "personal" || descriptor.requiredPermissions.length === 0) throw new EndpointToolPolicyError(`Mutating tool ${descriptor.name} violates its trusted policy`);
72
+ return;
73
+ default: throw new EndpointToolPolicyError(`Unknown endpoint policy: ${descriptor.policyId}`);
74
+ }
75
+ }
76
+ assertFields(descriptor, effect, confirmation, requiresForeground, sensitivity) {
77
+ if (descriptor.effect !== effect || descriptor.confirmation !== confirmation || descriptor.requiresForeground !== requiresForeground || descriptor.sensitivity !== sensitivity) throw new EndpointToolPolicyError(`Tool ${descriptor.name} violates its trusted policy`);
15
78
  }
16
79
  };
17
80
  //#endregion
@@ -93,7 +93,7 @@ var EndpointRegistry = class {
93
93
  const connection = this.connectionByEndpointId.get(endpointId);
94
94
  if (!connection || connection.transport.readyState !== 1) throw new Error(`Endpoint is offline: ${endpointId}`);
95
95
  const message = {
96
- protocolVersion: 1,
96
+ protocolVersion: 2,
97
97
  messageId: crypto.randomUUID(),
98
98
  type,
99
99
  sentAt: Date.now(),
@@ -1,5 +1,6 @@
1
1
  import { type ClientEndpointMessage, type EndpointHelloPayload } from '@xopcai/endpoint-tools-protocol';
2
2
  import { type EndpointAuthenticatorDeps } from './auth.js';
3
+ import { EndpointBindingService } from './binding-service.js';
3
4
  import { EndpointInvocationService, type EndpointInvocationAuditSink } from './invocation-service.js';
4
5
  import { EndpointRegistry, type EndpointRegistration, type EndpointTransport } from './registry.js';
5
6
  import { EndpointUploadService } from './upload-service.js';
@@ -7,6 +8,7 @@ export declare class EndpointToolRuntime {
7
8
  readonly registry: EndpointRegistry;
8
9
  readonly invocations: EndpointInvocationService;
9
10
  readonly uploads: EndpointUploadService;
11
+ readonly bindings: EndpointBindingService;
10
12
  private readonly authenticator;
11
13
  private closed;
12
14
  constructor(options?: {
@@ -1,11 +1,13 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { createLogger } from "../utils/logger/index.js";
3
3
  import { init_logger } from "../utils/logger.js";
4
+ import { deleteEndpointSessionBinding, getEndpointSessionBinding, setEndpointSessionBinding } from "../storage/sqlite/endpoint-session-binding-repository.js";
4
5
  import { bindEndpointPrincipal, getEndpointPrincipal, touchEndpointPrincipal } from "../storage/sqlite/endpoint-principal-repository.js";
5
6
  import { finishEndpointToolInvocationAudit, startEndpointToolInvocationAudit } from "../storage/sqlite/endpoint-tool-invocation-repository.js";
6
7
  import "../storage/sqlite/index.js";
7
8
  import { init_paths } from "../config/paths.js";
8
9
  import { EndpointAuthenticator } from "./auth.js";
10
+ import { EndpointBindingService } from "./binding-service.js";
9
11
  import { EndpointToolPolicy } from "./policy.js";
10
12
  import { EndpointInvocationService } from "./invocation-service.js";
11
13
  import { EndpointRegistry } from "./registry.js";
@@ -20,11 +22,17 @@ var EndpointToolRuntime = class {
20
22
  registry;
21
23
  invocations;
22
24
  uploads;
25
+ bindings;
23
26
  authenticator;
24
27
  closed = false;
25
28
  constructor(options = {}) {
26
29
  const policy = new EndpointToolPolicy();
27
30
  this.registry = new EndpointRegistry(policy);
31
+ this.bindings = new EndpointBindingService(this.registry, {
32
+ get: getEndpointSessionBinding,
33
+ set: setEndpointSessionBinding,
34
+ delete: deleteEndpointSessionBinding
35
+ });
28
36
  this.authenticator = new EndpointAuthenticator(options.auth ?? {
29
37
  getPrincipal: getEndpointPrincipal,
30
38
  bindEndpoint: bindEndpointPrincipal,
@@ -96,17 +96,13 @@ function defaultModelId(config) {
96
96
  if (!Array.isArray(list)) return void 0;
97
97
  const defaultId = typeof agents.default === "string" ? agents.default : void 0;
98
98
  const entry = list.find((candidate) => isRecord(candidate) && candidate.id === defaultId) ?? list.find((candidate) => isRecord(candidate) && candidate.enabled !== false);
99
- if (!isRecord(entry)) return void 0;
100
- const models = entry.models;
101
- if (!isRecord(models)) return void 0;
102
- const defaultRole = typeof models.defaultRole === "string" ? models.defaultRole : void 0;
103
- const roles = models.roles;
104
- if (!defaultRole || !isRecord(roles)) return void 0;
105
- const role = roles[defaultRole];
106
- if (isRecord(role)) {
107
- const model = role.model;
108
- if (typeof model === "string" && model.trim().length > 0) return model;
109
- }
99
+ const overrideModels = isRecord(entry) && isRecord(entry.models) ? entry.models : void 0;
100
+ const overrideChat = overrideModels && isRecord(overrideModels.chat) ? overrideModels.chat : void 0;
101
+ if (typeof overrideChat?.primary === "string" && overrideChat.primary.trim()) return overrideChat.primary;
102
+ const defaults = isRecord(agents.defaults) ? agents.defaults : void 0;
103
+ const models = defaults && isRecord(defaults.models) ? defaults.models : void 0;
104
+ const chat = models && isRecord(models.chat) ? models.chat : void 0;
105
+ return typeof chat?.primary === "string" && chat.primary.trim() ? chat.primary : void 0;
110
106
  }
111
107
  /**
112
108
  * Merge partial activation context over values inferred from loaded app config.
@@ -26,6 +26,7 @@ const TEXT_EXTENSIONS = new Set([
26
26
  "svg",
27
27
  "ts",
28
28
  "tsx",
29
+ "tsv",
29
30
  "txt",
30
31
  "xml",
31
32
  "yaml",
@@ -50,10 +51,18 @@ const MIME_TYPES = {
50
51
  ts: "text/typescript",
51
52
  tsx: "text/typescript",
52
53
  csv: "text/csv",
54
+ tsv: "text/tab-separated-values",
53
55
  xml: "application/xml",
54
56
  yaml: "application/yaml",
55
57
  yml: "application/yaml",
56
58
  pdf: "application/pdf",
59
+ doc: "application/msword",
60
+ docx: "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
61
+ xls: "application/vnd.ms-excel",
62
+ xlsx: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
63
+ ppt: "application/vnd.ms-powerpoint",
64
+ pptx: "application/vnd.openxmlformats-officedocument.presentationml.presentation",
65
+ zip: "application/zip",
57
66
  mp3: "audio/mpeg",
58
67
  wav: "audio/wav",
59
68
  ogg: "audio/ogg",
@@ -106,13 +115,13 @@ async function resolveFilePath(root, path, mustExist = true) {
106
115
  const canonicalRoot = await realpath(root).catch(() => {
107
116
  throw new FileServiceError(404, "File space is unavailable");
108
117
  });
109
- const candidate = resolve(canonicalRoot, normalizeRelativePath(path));
110
- if (!isWithin(canonicalRoot, candidate)) throw new FileServiceError(400, "Invalid file path");
118
+ const candidate = isAbsolute(path) ? resolve(path) : resolve(canonicalRoot, normalizeRelativePath(path));
111
119
  if (!mustExist) {
112
- if (!isWithin(canonicalRoot, await realpath(dirname(candidate)).catch(() => {
120
+ const parent = await realpath(dirname(candidate)).catch(() => {
113
121
  throw new FileServiceError(404, "Parent directory not found");
114
- }))) throw new FileServiceError(400, "Invalid file path");
115
- return candidate;
122
+ });
123
+ if (!isWithin(canonicalRoot, parent)) throw new FileServiceError(400, "Invalid file path");
124
+ return resolve(parent, basename(candidate));
116
125
  }
117
126
  const canonicalTarget = await realpath(candidate).catch(() => {
118
127
  throw new FileServiceError(404, "File not found");