@xopcai/xopc 0.0.364 → 0.0.367

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 (365) hide show
  1. package/dist/browser-ext/dist/sidepanel.js +16 -4
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/gateway/static/root/assets/{activity-store-GvR2gZ0T.js → activity-store-Cuf3JFFJ.js} +1 -1
  5. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-7Ct-ZlfL.js → agent-avatar-dicebear-DyATPNTe.js} +1 -1
  6. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-gT9_j4tr.js +1 -0
  7. package/dist/gateway/static/root/assets/agent-plugin-dialog-CLXCJ6JN.js +1 -0
  8. package/dist/gateway/static/root/assets/agents-BAUfOMsq.js +66 -0
  9. package/dist/gateway/static/root/assets/{agents-admin-api-BkXb7VEZ.js → agents-admin-api-D842OcNo.js} +1 -1
  10. package/dist/gateway/static/root/assets/app-link-4gpFbdsr.js +1 -0
  11. package/dist/gateway/static/root/assets/{app-management-settings-panel-CjfsIn9A.js → app-management-settings-panel-CoIFxQKH.js} +1 -1
  12. package/dist/gateway/static/root/assets/{appearance-settings-qqHZ15GU.js → appearance-settings-DQr0o6Lm.js} +1 -1
  13. package/dist/gateway/static/root/assets/{apps-page-Ba2VkQk6.js → apps-page-CltMV4Xp.js} +1 -1
  14. package/dist/gateway/static/root/assets/{archive-plugin-CKe3qAaL.js → archive-plugin-DT8Nio-r.js} +1 -1
  15. package/dist/gateway/static/root/assets/automation-display-DCkjVzA0.js +2 -0
  16. package/dist/gateway/static/root/assets/{automations-page-Bt8Q58ut.js → automations-page-BIfWS_3Y.js} +1 -1
  17. package/dist/gateway/static/root/assets/automations-workspace-BCGPjsdU.js +6 -0
  18. package/dist/gateway/static/root/assets/binary-plugins-7qs3qcW9.js +2 -0
  19. package/dist/gateway/static/root/assets/{block-editor-ClRFbHP7.js → block-editor-BFPUlxJ6.js} +28 -28
  20. package/dist/gateway/static/root/assets/{browser-automation-inputs-5B3qAdmb.js → browser-automation-inputs-BUAIKIX0.js} +1 -1
  21. package/dist/gateway/static/root/assets/{browser-automations-page-BjMub7JM.js → browser-automations-page-CSwu1U1F.js} +2 -2
  22. package/dist/gateway/static/root/assets/browser-settings-page-C1ReMNqX.js +3 -0
  23. package/dist/gateway/static/root/assets/capabilities-BzWFO_x_.js +1 -0
  24. package/dist/gateway/static/root/assets/{capabilities-BKu9BqPe.js → capabilities-K0Zb_lH0.js} +1 -1
  25. package/dist/gateway/static/root/assets/capabilities-page-BdTSqloI.js +2 -0
  26. package/dist/gateway/static/root/assets/{capabilities-settings-panel-gZ8auLwa.js → capabilities-settings-panel-BUblBMZC.js} +4 -4
  27. package/dist/gateway/static/root/assets/{capability-header-actions-L1NvoOUG.js → capability-header-actions-AMn_vTNv.js} +1 -1
  28. package/dist/gateway/static/root/assets/channels-CXCf5qO6.js +1 -0
  29. package/dist/gateway/static/root/assets/{chat-terminal-dock-DsCpKPBe.js → chat-terminal-dock-C7nAROhF.js} +2 -2
  30. package/dist/gateway/static/root/assets/chevron-left-DqFhpbvK.js +1 -0
  31. package/dist/gateway/static/root/assets/computer-settings-page-B5SuSZ3G.js +1 -0
  32. package/dist/gateway/static/root/assets/{connector-service-page-mtH9mEBf.js → connector-service-page-CTx1B8wx.js} +1 -1
  33. package/dist/gateway/static/root/assets/connectors-page-DfnK1crf.js +2 -0
  34. package/dist/gateway/static/root/assets/date-formatters-CUZAyDEg.js +1 -0
  35. package/dist/gateway/static/root/assets/date-picker-Cx_xIKvN.js +1 -0
  36. package/dist/gateway/static/root/assets/{dependency-picker-B_fPQBTM.js → dependency-picker-DYm96PDu.js} +1 -1
  37. package/dist/gateway/static/root/assets/{desktop-pet-CJrO9Vd_.js → desktop-pet-D90OzgeR.js} +1 -1
  38. package/dist/gateway/static/root/assets/{desktop-pet-settings-DYAfri9w.js → desktop-pet-settings-CmdCecjm.js} +1 -1
  39. package/dist/gateway/static/root/assets/{device-pairing-wizard-CqRys2R8.js → device-pairing-wizard-s2ogSa4l.js} +1 -1
  40. package/dist/gateway/static/root/assets/{directory-picker-path-field-D7_qSxNZ.js → directory-picker-path-field-DZpaoeNa.js} +1 -1
  41. package/dist/gateway/static/root/assets/{extension-debug-page-BGyJpRv4.js → extension-debug-page-Bv6QE8kC.js} +1 -1
  42. package/dist/gateway/static/root/assets/{extension-page-D1zBmd8F.js → extension-page-CEsq71Cm.js} +1 -1
  43. package/dist/gateway/static/root/assets/{extension-provider-F9JzOWZ3.js → extension-provider-CX-sK0Tw.js} +1 -1
  44. package/dist/gateway/static/root/assets/{extension-settings-page-CTR8AjCG.js → extension-settings-page-UyOHF39P.js} +1 -1
  45. package/dist/gateway/static/root/assets/{fallback-models-Chhv4Nfv.js → fallback-models-CKv_Wqg8.js} +1 -1
  46. package/dist/gateway/static/root/assets/{gateway-config-swr-CoRoOG1l.js → gateway-config-swr-Cjnkle5J.js} +1 -1
  47. package/dist/gateway/static/root/assets/{gateway-realtime-D0ygm6bc.js → gateway-realtime-DCCLdyQD.js} +1 -1
  48. package/dist/gateway/static/root/assets/gateway-realtime-store-C_Th8kGg.js +1 -0
  49. package/dist/gateway/static/root/assets/gateway-settings-CZ73IpbP.js +1 -0
  50. package/dist/gateway/static/root/assets/{gateway-startup-retry-FDS6S6qa.js → gateway-startup-retry-CXKmdVzN.js} +1 -1
  51. package/dist/gateway/static/root/assets/home-page-BQWq4kYi.js +2 -0
  52. package/dist/gateway/static/root/assets/{image-generation-api-BPd76jW5.js → image-generation-api-NLHzm4Nc.js} +1 -1
  53. package/dist/gateway/static/root/assets/{imports-page-9EnECtcl.js → imports-page-C7qvlBTQ.js} +1 -1
  54. package/dist/gateway/static/root/assets/index-BQgqzhQj.js +106 -0
  55. package/dist/gateway/static/root/assets/index-COB4QIJp.css +1 -0
  56. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-MC7mG2h2.js → keyboard-shortcuts-settings-pkgFWJb-.js} +1 -1
  57. package/dist/gateway/static/root/assets/local-app-workbench-page-dMDhZXAi.js +1 -0
  58. package/dist/gateway/static/root/assets/{local-apps-page-c3HncHZ3.js → local-apps-page-TpUAfOn2.js} +1 -1
  59. package/dist/gateway/static/root/assets/local-session-drafts-Cvv7I0fw.js +1 -0
  60. package/dist/gateway/static/root/assets/{locale-store-DId6-v2R.js → locale-store-C8TMD2gn.js} +1 -1
  61. package/dist/gateway/static/root/assets/logs-page-B-Y9oZLh.js +2 -0
  62. package/dist/gateway/static/root/assets/management-settings-B2lzsw6X.js +1 -0
  63. package/dist/gateway/static/root/assets/markdown-view-Dse7rkio.js +201 -0
  64. package/dist/gateway/static/root/assets/{media-plugins-XLewwq2q.js → media-plugins-BZrnzaBM.js} +1 -1
  65. package/dist/gateway/static/root/assets/messages-Dy26npMy.js +3 -0
  66. package/dist/gateway/static/root/assets/{models-hub-cache-B9SKjidc.js → models-hub-cache-B1C86nRp.js} +1 -1
  67. package/dist/gateway/static/root/assets/note-detail-panel-DL__qP6U.js +5 -0
  68. package/dist/gateway/static/root/assets/{notes-api-Byt65v3r.js → notes-api-DKiVeQKG.js} +1 -1
  69. package/dist/gateway/static/root/assets/notes-page-DTBbg9Hs.js +8 -0
  70. package/dist/gateway/static/root/assets/{oauth-api-BYsCbyGZ.js → oauth-api-BwpzpRwC.js} +1 -1
  71. package/dist/gateway/static/root/assets/open-route-MyZ2sB9C.js +1 -0
  72. package/dist/gateway/static/root/assets/{page-context-capture-button-RBp1QK0F.js → page-context-capture-button-Cxzd4QPB.js} +1 -1
  73. package/dist/gateway/static/root/assets/personal-page-CzaTnHeD.js +1 -0
  74. package/dist/gateway/static/root/assets/product-open-page-D4hoEWiu.js +1 -0
  75. package/dist/gateway/static/root/assets/product-preview-content-aR38El2E.js +1 -0
  76. package/dist/gateway/static/root/assets/project-detail-page-D20QH4YB.js +1 -0
  77. package/dist/gateway/static/root/assets/projects-page-Bf3BIcT6.js +1 -0
  78. package/dist/gateway/static/root/assets/{registry-api-7F2WNEZC.js → registry-api-AdnxowbH.js} +1 -1
  79. package/dist/gateway/static/root/assets/remote-access-hub-CKxqncqW.js +1 -0
  80. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-B0c120iI.js → runtime-tools-settings-panel-CBN3raz1.js} +1 -1
  81. package/dist/gateway/static/root/assets/scenes-page-Cv_5ozfX.js +2 -0
  82. package/dist/gateway/static/root/assets/{schema-form-DQpQc9tH.js → schema-form-CxrMGsT9.js} +1 -1
  83. package/dist/gateway/static/root/assets/secret-input-D93UrW4C.js +1 -0
  84. package/dist/gateway/static/root/assets/{send-session-input-D1oc6BC6.js → send-session-input-CgOzhDZ0.js} +1 -1
  85. package/dist/gateway/static/root/assets/{session-api-N3N37MrR.js → session-api-_HIN8or3.js} +1 -1
  86. package/dist/gateway/static/root/assets/session-manager-CzCto5zT.js +16 -0
  87. package/dist/gateway/static/root/assets/sessions-page-DZcu6NLJ.js +1 -0
  88. package/dist/gateway/static/root/assets/settings-advanced-gate-DazqeDQ7.js +1 -0
  89. package/dist/gateway/static/root/assets/{settings-page-GgBEp6O7.js → settings-page-D8Q3H3-o.js} +1 -1
  90. package/dist/gateway/static/root/assets/setup-status-panel-DvLMMiuS.js +1 -0
  91. package/dist/gateway/static/root/assets/{share-link-dialog-TBBGJPfT.js → share-link-dialog-Dg5os066.js} +1 -1
  92. package/dist/gateway/static/root/assets/{share-preview-page-DyRLPsPv.js → share-preview-page-DMvohAyr.js} +1 -1
  93. package/dist/gateway/static/root/assets/{shares-api-DU0fHP2G.js → shares-api-C96IO4qJ.js} +1 -1
  94. package/dist/gateway/static/root/assets/{shares-settings-DJ1ME-XM.js → shares-settings-CsDATuCw.js} +1 -1
  95. package/dist/gateway/static/root/assets/{skill-api-1Puv6wOz.js → skill-api-C10ML0CH.js} +1 -1
  96. package/dist/gateway/static/root/assets/{skill-reload-api-ClyFqHk7.js → skill-reload-api-DNbJzSfB.js} +1 -1
  97. package/dist/gateway/static/root/assets/skills-page-DObMKvA6.js +2 -0
  98. package/dist/gateway/static/root/assets/{system-settings-panel--yV67a8L.js → system-settings-panel-Bn3khdzb.js} +1 -1
  99. package/dist/gateway/static/root/assets/task-detail-page-BR2L1L8l.js +2 -0
  100. package/dist/gateway/static/root/assets/task-expandable-content-DL2Q2gre.js +1 -0
  101. package/dist/gateway/static/root/assets/{tasks-CH6KoBeY.js → tasks-DwKXgZ-I.js} +1 -1
  102. package/dist/gateway/static/root/assets/{theme-store-OhcbFEUR.js → theme-store-DQ6KJa4l.js} +1 -1
  103. package/dist/gateway/static/root/assets/tracing-settings-page-Ed8_GYUT.js +1 -0
  104. package/dist/gateway/static/root/assets/{tunnel-api-COLdiP_E.js → tunnel-api-D3X8jDwo.js} +1 -1
  105. package/dist/gateway/static/root/assets/{usage-page-CtM5IfrL.js → usage-page-BqzRyyb9.js} +1 -1
  106. package/dist/gateway/static/root/assets/{use-autosave-veoM0dHn.js → use-autosave-CRFefpzO.js} +1 -1
  107. package/dist/gateway/static/root/assets/use-composer-attachments-OLrvSjn5.js +2 -0
  108. package/dist/gateway/static/root/assets/{use-file-preview-expanded-Bope6MW6.js → use-file-preview-expanded-CJvzfQvw.js} +2 -2
  109. package/dist/gateway/static/root/assets/user-model-page-CG6wqIKP.js +2 -0
  110. package/dist/gateway/static/root/assets/{voice-api-key-field-CwD6a3KQ.js → voice-api-key-field-R9zNWYR_.js} +1 -1
  111. package/dist/gateway/static/root/assets/{voice-config-api-Daexehmc.js → voice-config-api-DLudE9Rc.js} +1 -1
  112. package/dist/gateway/static/root/assets/{work-discovery-overlay-C9u7tuEc.js → work-discovery-overlay-DVmQrolV.js} +1 -1
  113. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BMOBbf33.js → workflow-run-setup-panel-DEkmuD3T.js} +2 -2
  114. package/dist/gateway/static/root/assets/workflows-page-pqCB3sh4.js +6 -0
  115. package/dist/gateway/static/root/assets/workspace-api-CdVUhyPo.js +2 -0
  116. package/dist/gateway/static/root/index.html +33 -31
  117. package/dist/package.js +1 -1
  118. package/dist/packages/gateway-contract/src/automations.js +1 -0
  119. package/dist/packages/gateway-contract/src/home.js +14 -0
  120. package/dist/packages/gateway-contract/src/index.js +2 -0
  121. package/dist/packages/gateway-contract/src/notifications.js +2 -1
  122. package/dist/packages/gateway-contract/src/personal-proactivity.js +139 -0
  123. package/dist/packages/gateway-contract/src/session-input-command.js +1 -0
  124. package/dist/packages/image-providers/src/catalog.js +373 -0
  125. package/dist/packages/image-providers/src/execute.js +372 -0
  126. package/dist/packages/image-providers/src/http.js +94 -0
  127. package/dist/packages/image-providers/src/index.js +5 -0
  128. package/dist/packages/image-providers/src/types.d.ts +95 -0
  129. package/dist/packages/image-providers/src/validation.js +52 -0
  130. package/dist/src/agent/agent-manager.d.ts +1 -0
  131. package/dist/src/agent/agent-manager.js +35 -3
  132. package/dist/src/agent/background-review/run-background-review.js +1 -1
  133. package/dist/src/agent/commands/command-registry.js +1 -1
  134. package/dist/src/agent/context/execution-context.js +1 -1
  135. package/dist/src/agent/context/project-context.js +4 -4
  136. package/dist/src/agent/embedded/run-for-session.js +1 -1
  137. package/dist/src/agent/external-tools/endpoint-provider.js +2 -2
  138. package/dist/src/agent/failover-error.d.ts +1 -1
  139. package/dist/src/agent/failover-error.js +7 -0
  140. package/dist/src/agent/image/generation/native-provider.d.ts +2 -0
  141. package/dist/src/agent/image/generation/native-provider.js +118 -0
  142. package/dist/src/agent/image/generation/openai-images-provider.d.ts +1 -1
  143. package/dist/src/agent/image/generation/openai-images-provider.js +48 -32
  144. package/dist/src/agent/image/generation/provider-registry.js +4 -13
  145. package/dist/src/agent/image/generation/providers/xopc-cloud.js +5 -34
  146. package/dist/src/agent/image/generation/runtime-types.d.ts +2 -4
  147. package/dist/src/agent/image/generation/runtime.js +28 -23
  148. package/dist/src/agent/image/generation/types.d.ts +3 -50
  149. package/dist/src/agent/image/generation/validation.d.ts +6 -0
  150. package/dist/src/agent/image/generation/validation.js +16 -0
  151. package/dist/src/agent/inbound/attachment-pipeline.js +1 -1
  152. package/dist/src/agent/prompt/voice-presentation.d.ts +1 -1
  153. package/dist/src/agent/prompt/voice-presentation.js +1 -1
  154. package/dist/src/agent/service/direct-turn-helpers.js +17 -1
  155. package/dist/src/agent/service.js +3 -3
  156. package/dist/src/agent/skills/index.js +1 -1
  157. package/dist/src/agent/skills/managed-store.js +1 -1
  158. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  159. package/dist/src/agent/tools/delegation-parent-policy.js +2 -0
  160. package/dist/src/agent/tools/delegation-policy.js +2 -0
  161. package/dist/src/agent/tools/factory.d.ts +2 -0
  162. package/dist/src/agent/tools/factory.js +31 -4
  163. package/dist/src/agent/tools/image-generate-tool.js +5 -19
  164. package/dist/src/agent/tools/index.d.ts +2 -2
  165. package/dist/src/agent/tools/index.js +3 -3
  166. package/dist/src/agent/tools/knowledge-memory-tool.d.ts +2 -0
  167. package/dist/src/agent/tools/knowledge-memory-tool.js +60 -1
  168. package/dist/src/agent/tools/personal-attention-tool.d.ts +21 -0
  169. package/dist/src/agent/tools/personal-attention-tool.js +191 -0
  170. package/dist/src/agent/tools/personal-task-tool.d.ts +12 -8
  171. package/dist/src/agent/tools/personal-task-tool.js +35 -41
  172. package/dist/src/agent/tools/user-context-tool.d.ts +2 -0
  173. package/dist/src/agent/tools/user-context-tool.js +61 -2
  174. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  175. package/dist/src/agent-catalog/capabilities.js +2 -2
  176. package/dist/src/agent-catalog/migrations/legacy-config-cutover.js +1 -1
  177. package/dist/src/agent-catalog/repository.d.ts +1 -0
  178. package/dist/src/agent-catalog/repository.js +4 -1
  179. package/dist/src/automations/capabilities/drafts.js +1 -1
  180. package/dist/src/automations/capabilities/write.d.ts +2 -0
  181. package/dist/src/automations/domain/types.d.ts +1 -1
  182. package/dist/src/automations/domain/validation.d.ts +4 -0
  183. package/dist/src/automations/domain/validation.js +1 -0
  184. package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -1
  185. package/dist/src/bootstrap/application-state.js +1 -1
  186. package/dist/src/capabilities/runtime/dispatcher.js +1 -1
  187. package/dist/src/capabilities/runtime/product.js +1 -1
  188. package/dist/src/chat-commands/personal-command-policy.d.ts +2 -0
  189. package/dist/src/chat-commands/personal-command-policy.js +9 -0
  190. package/dist/src/chat-commands/registry.js +6 -0
  191. package/dist/src/cli/commands/agents.js +1 -1
  192. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  193. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  194. package/dist/src/cli/commands/models.js +4 -9
  195. package/dist/src/cli/commands/onboard/model.js +2 -2
  196. package/dist/src/cli/utils/init-workspace-core.js +1 -1
  197. package/dist/src/config/agent-profile.js +1 -1
  198. package/dist/src/config/models-json.d.ts +170 -0
  199. package/dist/src/config/models-json.js +23 -8
  200. package/dist/src/extensions/agent-plugins/validation.js +1 -1
  201. package/dist/src/files/file-service.d.ts +6 -0
  202. package/dist/src/files/file-service.js +38 -1
  203. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  204. package/dist/src/gateway/agents-admin.js +2 -2
  205. package/dist/src/gateway/custom-image-providers.d.ts +34 -0
  206. package/dist/src/gateway/file-path-classifier.js +12 -3
  207. package/dist/src/gateway/hono/routes/agents.js +1 -1
  208. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  209. package/dist/src/gateway/hono/routes/files.js +13 -2
  210. package/dist/src/gateway/hono/routes/notes.js +2 -2
  211. package/dist/src/gateway/hono/routes/observability.js +8 -0
  212. package/dist/src/gateway/hono/routes/personal-agent.js +41 -0
  213. package/dist/src/gateway/hono/routes/projects.js +3 -3
  214. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +2 -0
  215. package/dist/src/gateway/hono/routes/session-input-handler.js +9 -1
  216. package/dist/src/gateway/hono/routes/sessions.js +1 -1
  217. package/dist/src/gateway/hono/routes/tasks.js +1 -1
  218. package/dist/src/gateway/hono/routes/voice.js +1 -1
  219. package/dist/src/gateway/image-generation-setup.js +1 -1
  220. package/dist/src/gateway/service/agent-runner.d.ts +1 -0
  221. package/dist/src/gateway/service/agent-runner.js +12 -1
  222. package/dist/src/gateway/service/run-gateway-agent.d.ts +1 -0
  223. package/dist/src/gateway/service/run-gateway-agent.js +15 -0
  224. package/dist/src/gateway/service/session-command-service.js +5 -3
  225. package/dist/src/gateway/service/session-input-coordinator.d.ts +12 -0
  226. package/dist/src/gateway/service/session-input-coordinator.js +63 -5
  227. package/dist/src/gateway/service/sessions-api.js +1 -1
  228. package/dist/src/gateway/service.d.ts +3 -0
  229. package/dist/src/gateway/service.js +54 -9
  230. package/dist/src/gateway/session-context-summary.js +1 -1
  231. package/dist/src/gateway/session-reset-service.js +1 -1
  232. package/dist/src/gateway/xopc-cloud-capability-setup.js +1 -1
  233. package/dist/src/home-intelligence/host.js +2 -2
  234. package/dist/src/local-apps/service.js +2 -2
  235. package/dist/src/notifications/planner.js +32 -0
  236. package/dist/src/notifications/service.d.ts +2 -0
  237. package/dist/src/personal-agent/capability-service.js +3 -2
  238. package/dist/src/personal-agent/communication.d.ts +3 -2
  239. package/dist/src/personal-agent/communication.js +4 -3
  240. package/dist/src/personal-agent/conversation-state.d.ts +5 -0
  241. package/dist/src/personal-agent/conversation-state.js +17 -0
  242. package/dist/src/personal-agent/notifications.d.ts +4 -0
  243. package/dist/src/personal-agent/notifications.js +40 -0
  244. package/dist/src/personal-agent/persona.d.ts +6 -0
  245. package/dist/src/personal-agent/persona.js +16 -0
  246. package/dist/src/personal-agent/policy.d.ts +3 -1
  247. package/dist/src/personal-agent/policy.js +28 -6
  248. package/dist/src/personal-agent/proactivity/automation.d.ts +3 -0
  249. package/dist/src/personal-agent/proactivity/automation.js +41 -0
  250. package/dist/src/personal-agent/proactivity/follow-up-request.d.ts +5 -0
  251. package/dist/src/personal-agent/proactivity/follow-up-request.js +44 -0
  252. package/dist/src/personal-agent/proactivity/repository.d.ts +128 -0
  253. package/dist/src/personal-agent/proactivity/repository.js +403 -0
  254. package/dist/src/personal-agent/proactivity/routes.d.ts +3 -0
  255. package/dist/src/personal-agent/proactivity/routes.js +182 -0
  256. package/dist/src/personal-agent/proactivity/service.d.ts +32 -0
  257. package/dist/src/personal-agent/proactivity/service.js +496 -0
  258. package/dist/src/personal-agent/prompt-context.d.ts +10 -0
  259. package/dist/src/personal-agent/prompt-context.js +119 -0
  260. package/dist/src/personal-agent/prompts.d.ts +7 -0
  261. package/dist/src/personal-agent/prompts.js +135 -0
  262. package/dist/src/personal-agent/reply-composer.d.ts +1 -1
  263. package/dist/src/personal-agent/reply-composer.js +41 -13
  264. package/dist/src/personal-agent/repository.d.ts +1 -1
  265. package/dist/src/personal-agent/repository.js +1 -1
  266. package/dist/src/personal-agent/request-delivery.js +1 -1
  267. package/dist/src/personal-agent/request-service.js +2 -2
  268. package/dist/src/personal-agent/service.d.ts +1 -2
  269. package/dist/src/personal-agent/service.js +5 -93
  270. package/dist/src/personal-agent/specialist-capabilities.d.ts +9 -0
  271. package/dist/src/personal-agent/specialist-capabilities.js +37 -0
  272. package/dist/src/personal-agent/unread.d.ts +10 -0
  273. package/dist/src/personal-agent/unread.js +43 -0
  274. package/dist/src/providers/env-keys.js +6 -0
  275. package/dist/src/providers/model-catalog-persistence.js +3 -22
  276. package/dist/src/providers/model-catalog-store.js +1 -8
  277. package/dist/src/providers/model-catalog-types.d.ts +1 -9
  278. package/dist/src/providers/xopc-cloud-model-source.js +4 -25
  279. package/dist/src/session/client-history.d.ts +2 -0
  280. package/dist/src/session/client-history.js +26 -0
  281. package/dist/src/session/init-session-turn.js +10 -0
  282. package/dist/src/session/session-context-for-llm.js +28 -0
  283. package/dist/src/session/store.js +1 -1
  284. package/dist/src/storage/sqlite/migrations/235_personal_conversation_priority.sql +3 -0
  285. package/dist/src/storage/sqlite/migrations/236_personal_proactivity.sql +53 -0
  286. package/dist/src/storage/sqlite/migrations/237_personal_strategy_versions.sql +18 -0
  287. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  288. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  289. package/dist/src/storage/sqlite/schema.js +1 -1
  290. package/dist/src/storage/sqlite/session-input-repository.d.ts +2 -0
  291. package/dist/src/storage/sqlite/session-input-repository.js +18 -5
  292. package/dist/src/tasks/capabilities/read.js +2 -2
  293. package/dist/src/tasks/execution-context.js +1 -1
  294. package/dist/src/tasks/home-query-service.js +27 -1
  295. package/dist/src/tasks/task-main-update-decision-service.js +1 -1
  296. package/dist/src/tasks/task-result-delivery-service.js +1 -1
  297. package/dist/src/tui/backends/embedded-backend.js +1 -1
  298. package/dist/src/voice/platform-catalog.d.ts +1 -9
  299. package/dist/src/voice/realtime/agentEngine.js +32 -7
  300. package/dist/src/voice/realtime/engine.d.ts +1 -0
  301. package/dist/src/voice/realtime/omniEngine.d.ts +1 -0
  302. package/dist/src/voice/realtime/omniEngine.js +10 -0
  303. package/dist/src/voice/realtime/persona-context.js +1 -1
  304. package/dist/src/voice/realtime/runtime.d.ts +1 -0
  305. package/dist/src/voice/realtime/runtime.js +5 -0
  306. package/dist/src/voice/realtime/runtime.types.d.ts +2 -0
  307. package/dist/src/work-discovery/service.js +1 -1
  308. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  309. package/package.json +4 -3
  310. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-wYj-iyqv.js +0 -1
  311. package/dist/gateway/static/root/assets/agent-plugin-dialog-C9HYMhnJ.js +0 -1
  312. package/dist/gateway/static/root/assets/agents-hPkFQ81z.js +0 -66
  313. package/dist/gateway/static/root/assets/app-link-DRL0YnPs.js +0 -1
  314. package/dist/gateway/static/root/assets/automations-workspace-Ch0ViAJW.js +0 -7
  315. package/dist/gateway/static/root/assets/binary-plugins-J51oS7-D.js +0 -2
  316. package/dist/gateway/static/root/assets/browser-settings-page-CYrPA-Fp.js +0 -3
  317. package/dist/gateway/static/root/assets/capabilities-CT_ZW9fT.js +0 -1
  318. package/dist/gateway/static/root/assets/capabilities-page-dW6FXtOy.js +0 -2
  319. package/dist/gateway/static/root/assets/channels-Dx5T2G73.js +0 -1
  320. package/dist/gateway/static/root/assets/computer-settings-page-6FWwxYLe.js +0 -1
  321. package/dist/gateway/static/root/assets/connectors-page-DgDLaws0.js +0 -2
  322. package/dist/gateway/static/root/assets/date-picker-BDcwEaIx.js +0 -1
  323. package/dist/gateway/static/root/assets/gateway-realtime-store-DBvCRclh.js +0 -1
  324. package/dist/gateway/static/root/assets/gateway-settings-BVfz4Tla.js +0 -1
  325. package/dist/gateway/static/root/assets/home-page-BF_9C9yW.js +0 -1
  326. package/dist/gateway/static/root/assets/index-BpXej9jJ.js +0 -106
  327. package/dist/gateway/static/root/assets/index-CbJNcWAn.css +0 -1
  328. package/dist/gateway/static/root/assets/local-app-workbench-page-CytNu0-_.js +0 -1
  329. package/dist/gateway/static/root/assets/local-session-drafts-gbemPamv.js +0 -1
  330. package/dist/gateway/static/root/assets/logs-page-D4aXtitd.js +0 -2
  331. package/dist/gateway/static/root/assets/management-settings-CRzWi_iJ.js +0 -1
  332. package/dist/gateway/static/root/assets/markdown-view-DQZ51j9e.js +0 -201
  333. package/dist/gateway/static/root/assets/messages-BHvpZNe9.js +0 -3
  334. package/dist/gateway/static/root/assets/note-detail-panel-BgbByI-4.js +0 -5
  335. package/dist/gateway/static/root/assets/notes-page-R2BX5XCE.js +0 -8
  336. package/dist/gateway/static/root/assets/personal-page-F0jTBWva.js +0 -1
  337. package/dist/gateway/static/root/assets/product-open-page-BtDK68qb.js +0 -1
  338. package/dist/gateway/static/root/assets/project-detail-page-DmQEm0yH.js +0 -1
  339. package/dist/gateway/static/root/assets/projects-page-CrLQvkHX.js +0 -1
  340. package/dist/gateway/static/root/assets/remote-access-hub-C25_hQAd.js +0 -1
  341. package/dist/gateway/static/root/assets/scenes-page-DM64yMnx.js +0 -2
  342. package/dist/gateway/static/root/assets/secret-input-DPl3VYM8.js +0 -1
  343. package/dist/gateway/static/root/assets/session-manager-CMGUwtbN.js +0 -16
  344. package/dist/gateway/static/root/assets/sessions-page-DvDO8LtA.js +0 -1
  345. package/dist/gateway/static/root/assets/settings-advanced-gate-BNhgbmcX.js +0 -1
  346. package/dist/gateway/static/root/assets/setup-status-panel-10bMi6yL.js +0 -1
  347. package/dist/gateway/static/root/assets/skills-page-D52pEr5x.js +0 -2
  348. package/dist/gateway/static/root/assets/task-detail-page-D-tcS2bS.js +0 -2
  349. package/dist/gateway/static/root/assets/tracing-settings-page-DoBJ0TYY.js +0 -1
  350. package/dist/gateway/static/root/assets/use-composer-attachments-DB0bBGzZ.js +0 -2
  351. package/dist/gateway/static/root/assets/user-model-page-CSh61kZ5.js +0 -2
  352. package/dist/gateway/static/root/assets/workflows-page-BrD9vXqO.js +0 -6
  353. package/dist/gateway/static/root/assets/workspace-api-Cs4sjV2A.js +0 -2
  354. package/dist/src/agent/image/generation/normalization.d.ts +0 -38
  355. package/dist/src/agent/image/generation/normalization.js +0 -181
  356. package/dist/src/agent/image/generation/providers/dashscope.d.ts +0 -35
  357. package/dist/src/agent/image/generation/providers/dashscope.js +0 -257
  358. package/dist/src/agent/image/generation/providers/fal.d.ts +0 -15
  359. package/dist/src/agent/image/generation/providers/fal.js +0 -323
  360. package/dist/src/agent/image/generation/providers/google.d.ts +0 -16
  361. package/dist/src/agent/image/generation/providers/google.js +0 -244
  362. package/dist/src/agent/image/generation/providers/minimax.d.ts +0 -23
  363. package/dist/src/agent/image/generation/providers/minimax.js +0 -215
  364. package/dist/src/agent/image/generation/providers/openai.d.ts +0 -5
  365. package/dist/src/agent/image/generation/providers/openai.js +0 -134
@@ -8,7 +8,6 @@ import { getSessionMetadata } from "../storage/sqlite/session-read-repository.js
8
8
  import { init_sqlite } from "../storage/sqlite/index.js";
9
9
  import { expandWorkspacePathString, init_workspace_path } from "../config/workspace-path.js";
10
10
  import { init_agent_scope, listAgentEntries, resolveAgentProfileDir } from "./agent-scope.js";
11
- import { extractTextContent } from "./context/workspace.js";
12
11
  import { init_paths, resolveBundledSkillsDir } from "../config/paths.js";
13
12
  import { CredentialResolver, init_credentials } from "../auth/credentials.js";
14
13
  import { traceTools } from "../observability/runtime.js";
@@ -19,6 +18,10 @@ import { init_sync_provider_auth, resolveProviderApiKeySync } from "../auth/sync
19
18
  import { getApiKeySync, getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
20
19
  import { createExtensionAwareStreamFn } from "../providers/extension-stream-bridge.js";
21
20
  import { continuesAfterTool, trackAiUsageStream } from "../usage/recorder.js";
21
+ import { extractTextContent } from "./context/workspace.js";
22
+ import { resolveUserContextSessionAccess } from "../user-context/access-policy.js";
23
+ import { isPersonalConversation } from "../personal-agent/repository.js";
24
+ import { PersonalPromptContext } from "../personal-agent/prompt-context.js";
22
25
  import { buildExecutionScopeContextForPrompt } from "./context/execution-scope.js";
23
26
  import { clearBootstrapSnapshot } from "./bootstrap/bootstrap-cache.js";
24
27
  import { resolveBootstrapContextSync } from "./bootstrap/bootstrap-files.js";
@@ -35,7 +38,6 @@ import { resolveWorkspaceSkillsDir, resolveWorkspaceSkillsLockPath } from "./ski
35
38
  import { replaceAgentSystemPrompt } from "./prompt/agent-system-prompt.js";
36
39
  import { evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner } from "./embedded/session-runner.js";
37
40
  import { createAgentTurnPolicy } from "./orchestration/agent-turn-policy.js";
38
- import { resolveUserContextSessionAccess } from "../user-context/access-policy.js";
39
41
  import { createAgentCapabilitySessionState, resolveAgentCapabilityCatalog } from "./capabilities/registry.js";
40
42
  import "./capabilities/index.js";
41
43
  import { sortToolsForPromptCache } from "./tools/cache-stability.js";
@@ -258,6 +260,7 @@ var AgentManager = class {
258
260
  getPrimaryModel: () => this.resolveModelStringToModel(this.pickDefaultModelRef()),
259
261
  getMemoryManager: () => this.getCurrentWorkspaceRuntime().memoryManager,
260
262
  getSkillManager: () => this.getCurrentWorkspaceRuntime().skillManager,
263
+ getAgentSkillAvailability: (agentId) => this.getAgentSkillAvailability(agentId),
261
264
  getSessionStore: this.config.getSessionStore,
262
265
  gatewayClarify: this.config.gatewayClarify,
263
266
  getAutomationService: this.config.getAutomationService,
@@ -393,7 +396,7 @@ var AgentManager = class {
393
396
  prepareSkillTurn(conversationId, text) {
394
397
  this.getOrCreateAgent(conversationId);
395
398
  const inst = this.agents.get(conversationId);
396
- if (!text.includes("/skill:")) return {
399
+ if (isPersonalConversation(conversationId) || !text.includes("/skill:")) return {
397
400
  text,
398
401
  activatedCapabilityNames: this.activeCapabilityNames(inst)
399
402
  };
@@ -969,7 +972,9 @@ var AgentManager = class {
969
972
  composeDynamicProjectContext(...sections) {
970
973
  return sections.map((section) => section?.trim()).filter((section) => Boolean(section)).join("\n\n") || void 0;
971
974
  }
975
+ personalPromptContext = new PersonalPromptContext();
972
976
  buildExecutionScopeContext(conversationId) {
977
+ if (isXopcDatabaseOpen() && isPersonalConversation(conversationId)) return this.personalPromptContext.build(this.config.config, conversationId);
973
978
  const access = resolveUserContextSessionAccess(this.config.config, conversationId);
974
979
  return buildExecutionScopeContextForPrompt(conversationId, {
975
980
  includeKnowledge: access.knowledge,
@@ -1133,6 +1138,33 @@ var AgentManager = class {
1133
1138
  }
1134
1139
  resolveToolPolicy(profile, toolName, args) {
1135
1140
  const gatewayPolicy = profile.config.tools[toolName];
1141
+ if (toolName === "user_context_read" || toolName === "knowledge_read") {
1142
+ const command = args?.command;
1143
+ if (command === "search" || command === "get") {
1144
+ const legacyId = `${toolName.slice(0, -5)}_${command}`;
1145
+ const legacyPolicy = profile.config.tools[legacyId];
1146
+ const policies = [gatewayPolicy && {
1147
+ id: toolName,
1148
+ ...gatewayPolicy
1149
+ }, legacyPolicy && {
1150
+ id: legacyId,
1151
+ ...legacyPolicy
1152
+ }].filter((policy) => Boolean(policy));
1153
+ const rank = {
1154
+ allow: 0,
1155
+ ask: 1,
1156
+ deny: 2
1157
+ };
1158
+ policies.sort((a, b) => rank[b.mode] - rank[a.mode]);
1159
+ const selected = policies[0];
1160
+ if (!selected) return void 0;
1161
+ const limits = policies.flatMap((policy) => policy.maxCallsPerTurn ? [policy.maxCallsPerTurn] : []);
1162
+ return {
1163
+ ...selected,
1164
+ ...limits.length ? { maxCallsPerTurn: Math.min(...limits) } : {}
1165
+ };
1166
+ }
1167
+ }
1136
1168
  if (gatewayPolicy && gatewayPolicy.mode !== "allow") return {
1137
1169
  id: toolName,
1138
1170
  ...gatewayPolicy
@@ -4,12 +4,12 @@ import { finishContextExtractionRun } from "../../storage/sqlite/context-extract
4
4
  import { getSessionMetadata } from "../../storage/sqlite/session-read-repository.js";
5
5
  import { loadCompactionSourceSnapshot } from "../../storage/sqlite/transcript-repository.js";
6
6
  import { init_sqlite } from "../../storage/sqlite/index.js";
7
- import { extractTextContent } from "../context/workspace.js";
8
7
  import { extractProfileAgentId } from "../../config/agent-profile.js";
9
8
  import { init_sync_provider_auth, resolveProviderApiKeySync } from "../../auth/sync-provider-auth.js";
10
9
  import { getApiKeySync, init_providers, resolveModel } from "../../providers/index.js";
11
10
  import { createExtensionAwareStreamFn } from "../../providers/extension-stream-bridge.js";
12
11
  import { trackAiUsageStream } from "../../usage/recorder.js";
12
+ import { extractTextContent } from "../context/workspace.js";
13
13
  import { getAssertionSlot, listUserAssertions } from "../../user-model/repository.js";
14
14
  import { readAgentMessageContent } from "../memory/agent-message-access.js";
15
15
  import { isAssistantTurnAborted, isAssistantTurnFailed } from "../orchestration/llm-turn-retry.js";
@@ -3,8 +3,8 @@ import { redactSensitiveOutput } from "../../utils/logger/redact.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
4
  import { init_global_singleton, resolveGlobalSingleton } from "../../utils/global-singleton.js";
5
5
  import { init_paths } from "../../config/paths.js";
6
- import { spawnProcess } from "../../process/run-process.js";
7
6
  import { DurableState } from "../../storage/sqlite/durable-state.js";
7
+ import { spawnProcess } from "../../process/run-process.js";
8
8
  import { isolatedCommand, removeCommandContainer } from "./command-isolation.js";
9
9
  import { readWorkspaceRevision } from "../coding/workspace-revision.js";
10
10
  import { join } from "node:path";
@@ -2,10 +2,10 @@ import { getSqliteDatabase, init_transaction } from "../../storage/sqlite/transa
2
2
  import { init_collaboration_rule_repository, listCollaborationRules } from "../../storage/sqlite/collaboration-rule-repository.js";
3
3
  import { searchKnowledgeItems } from "../../knowledge-memory/repository.js";
4
4
  import "../../knowledge-memory/index.js";
5
- import { retrievalLexicalSimilarity } from "../../retrieval/textFeatures.js";
6
5
  import { listUserAssertions } from "../../user-model/repository.js";
7
6
  import { calculateExecutionValue } from "../../user-model/importance.js";
8
7
  import { canUseAssertion } from "../../user-model/usage-policy.js";
8
+ import { retrievalLexicalSimilarity } from "../../retrieval/textFeatures.js";
9
9
  import { getExecutionContextFeedbackScores } from "./audit.js";
10
10
  import { buildUserContextBlock } from "../memory/context-fence.js";
11
11
  import { randomUUID } from "node:crypto";
@@ -1,11 +1,11 @@
1
1
  import { TaskRepository, init_task_repository } from "../../tasks/task-repository.js";
2
+ import { knowledgeItemAllowed, listKnowledgeItems, searchKnowledgeItems } from "../../knowledge-memory/repository.js";
3
+ import "../../knowledge-memory/index.js";
4
+ import { ProjectStore } from "../../projects/project-store.js";
5
+ import { getProjectForSession, getProjectWorkspacePathForSession } from "../../projects/workspace.js";
2
6
  import { sanitizeForPromptLiteral } from "../prompt/sanitize-for-prompt.js";
3
7
  import { TaskReadModelProjector } from "../../tasks/task-read-model-projector.js";
4
8
  import { LocalAppStore } from "../../local-apps/store.js";
5
- import { ProjectStore } from "../../projects/project-store.js";
6
- import { getProjectForSession, getProjectWorkspacePathForSession } from "../../projects/workspace.js";
7
- import { knowledgeItemAllowed, listKnowledgeItems, searchKnowledgeItems } from "../../knowledge-memory/repository.js";
8
- import "../../knowledge-memory/index.js";
9
9
  //#region src/agent/context/project-context.ts
10
10
  init_task_repository();
11
11
  const MAX_TEXT = 1200;
@@ -6,9 +6,9 @@ import { setTraceIdentity, startObservation, traceOperation, traceRun } from "..
6
6
  import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
7
7
  import { init_providers, resolveModel } from "../../providers/index.js";
8
8
  import { appendDynamicPromptSection } from "../prompt/cache-boundary.js";
9
+ import { isPersonalConversation } from "../../personal-agent/repository.js";
9
10
  import { runWithEmbeddedExecutionSession } from "./execution-context.js";
10
11
  import { resolveAgentTurnTimeoutMs } from "../orchestration/run-agent-turn-with-timeout.js";
11
- import { isPersonalConversation } from "../../personal-agent/repository.js";
12
12
  import { resolvePromptCachePolicy } from "../../providers/prompt-cache-plan.js";
13
13
  import { evaluateContextBudget } from "../memory/context-budget.js";
14
14
  import { assessContext, recoverContext as recoverContext$1 } from "../memory/context-recovery.js";
@@ -1,7 +1,7 @@
1
- import { executeExternalOperation } from "../../capabilities/runtime/external-operations.js";
2
- import { canonicalCapabilityJson } from "../../capabilities/runtime/dispatcher.js";
3
1
  import { COMPUTER_CONTROL_TOOL, init_src } from "../../../packages/computer-control-contract/src/index.js";
4
2
  import { BROWSER_CONTROL_ENDPOINT_TOOL_NAME } from "../../../packages/browser-control-contract/src/index.js";
3
+ import { executeExternalOperation } from "../../capabilities/runtime/external-operations.js";
4
+ import { canonicalCapabilityJson } from "../../capabilities/runtime/dispatcher.js";
5
5
  import { externalToolRef, parseExternalToolRef } from "./refs.js";
6
6
  import { createHash } from "node:crypto";
7
7
  //#region src/agent/external-tools/endpoint-provider.ts
@@ -19,7 +19,7 @@ export type FailoverReason = 'timeout' | 'aborted' | 'auth' | 'rate_limit' | 'ba
19
19
  export interface FallbackAttempt {
20
20
  /** Provider id, e.g. "openai". */
21
21
  provider: string;
22
- /** Model id, e.g. "gpt-image-2". */
22
+ /** Model id, e.g. "gpt-image-2.5-flare". */
23
23
  model: string;
24
24
  /** Short, human-readable failure summary. */
25
25
  error: string;
@@ -1,6 +1,8 @@
1
1
  import { isTimeoutAbortError } from "../media-shared/http/deadline.js";
2
2
  import { ProviderHttpError } from "../media-shared/http/provider-http-errors.js";
3
3
  import "../media-shared/http/index.js";
4
+ import { ImageProviderError } from "../../packages/image-providers/src/validation.js";
5
+ import "../../packages/image-providers/src/index.js";
4
6
  //#region src/agent/failover-error.ts
5
7
  /**
6
8
  * FailoverError — uniform terminal error after all candidate provider/model
@@ -80,6 +82,11 @@ function reasonFromHttpStatus(status) {
80
82
  * {@link FallbackAttempt}-friendly shape.
81
83
  */
82
84
  function classifyAttemptError(e) {
85
+ if (e instanceof ImageProviderError) return {
86
+ reason: reasonFromHttpStatus(e.status),
87
+ status: e.status,
88
+ message: e.message
89
+ };
83
90
  if (e instanceof ProviderHttpError) return {
84
91
  reason: reasonFromHttpStatus(e.status),
85
92
  status: e.status,
@@ -0,0 +1,2 @@
1
+ import type { ImageGenerationProvider } from './types.js';
2
+ export declare function buildNativeImageProvider(providerId: string): ImageGenerationProvider;
@@ -0,0 +1,118 @@
1
+ import { privateNetworkPolicyToSsrfGuardOptions } from "../../../media-shared/http/private-network.js";
2
+ import { resolveProviderHttpRequestConfig } from "../../../media-shared/http/resolve-provider-http-request-config.js";
3
+ import { fetchWithTimeoutGuarded } from "../../../media-shared/http/provider-http.js";
4
+ import "../../../media-shared/http/index.js";
5
+ import { getImageProviderSpec } from "../../../../packages/image-providers/src/catalog.js";
6
+ import { executeImageProvider } from "../../../../packages/image-providers/src/execute.js";
7
+ import "../../../../packages/image-providers/src/index.js";
8
+ import { resolveApiKeyForProvider } from "../../../providers/auth-runtime/resolve-api-key.js";
9
+ import { isProviderApiKeyConfigured } from "../../../providers/auth-runtime/is-configured.js";
10
+ import "../../../providers/auth-runtime/index.js";
11
+ //#region src/agent/image/generation/native-provider.ts
12
+ function buildNativeImageProvider(providerId) {
13
+ const spec = getImageProviderSpec(providerId);
14
+ const modelCapabilities = Object.fromEntries(spec.models.map((model) => [model.id, model.capabilities]));
15
+ return {
16
+ id: spec.id,
17
+ label: spec.name,
18
+ documentationUrl: spec.documentationUrl,
19
+ apiKeyUrl: spec.apiKeyUrl,
20
+ defaultModel: spec.models[0].id,
21
+ models: spec.models.map((model) => model.id),
22
+ capabilities: spec.models[0].capabilities,
23
+ modelCapabilities,
24
+ configFields: [...spec.regions ? [{
25
+ key: "region",
26
+ label: "Region",
27
+ type: "select",
28
+ required: true,
29
+ options: [{
30
+ value: "cn",
31
+ label: "China"
32
+ }, {
33
+ value: "intl",
34
+ label: "International"
35
+ }]
36
+ }] : [], {
37
+ key: "baseUrl",
38
+ label: "Base URL",
39
+ type: "url",
40
+ placeholder: spec.baseUrl
41
+ }],
42
+ isConfigured: (ctx) => isProviderApiKeyConfigured({
43
+ providerId,
44
+ cfg: ctx.cfg,
45
+ agentId: ctx.agentId
46
+ }) && (!spec.regions || Boolean(ctx.cfg?.providers?.[providerId]?.region)),
47
+ async generateImage(req) {
48
+ const apiKey = resolveApiKeyForProvider({
49
+ providerId,
50
+ cfg: req.cfg,
51
+ agentId: req.agentId,
52
+ store: req.authStore
53
+ });
54
+ if (!apiKey) throw new Error(`${spec.name} API key missing`);
55
+ const settings = req.cfg?.providers?.[providerId];
56
+ if (settings?.azure) throw new Error("Configure Azure images as an explicit custom image provider");
57
+ const baseUrl = settings?.baseUrl ?? (spec.regions ? spec.regions[settings?.region] : spec.baseUrl);
58
+ if (!baseUrl) throw new Error(`${spec.name} requires region or baseUrl`);
59
+ const http = resolveProviderHttpRequestConfig({
60
+ providerId,
61
+ cfg: req.cfg,
62
+ fallbackTimeoutMs: spec.timeoutMs
63
+ });
64
+ const timeoutMs = req.timeoutMs ?? http.timeoutMs ?? spec.timeoutMs;
65
+ const signal = AbortSignal.any([AbortSignal.timeout(timeoutMs), ...req.signal ? [req.signal] : []]);
66
+ const result = await executeImageProvider({
67
+ providerId,
68
+ baseUrl,
69
+ apiKey,
70
+ signal,
71
+ fetchImpl: ((url, init) => {
72
+ const headers = new Headers(new URL(String(url)).origin === new URL(baseUrl).origin ? http.headers : void 0);
73
+ new Headers(init?.headers).forEach((value, key) => headers.set(key, value));
74
+ return fetchWithTimeoutGuarded(String(url), {
75
+ label: spec.name,
76
+ timeoutMs,
77
+ signal,
78
+ init: {
79
+ ...init,
80
+ headers,
81
+ redirect: "error"
82
+ },
83
+ ...privateNetworkPolicyToSsrfGuardOptions()
84
+ });
85
+ }),
86
+ request: {
87
+ model: req.model,
88
+ prompt: req.prompt,
89
+ count: req.count,
90
+ size: req.size,
91
+ aspectRatio: req.aspectRatio,
92
+ resolution: req.resolution,
93
+ quality: req.quality,
94
+ outputFormat: req.outputFormat,
95
+ background: req.background ?? req.providerOptions?.openai?.background,
96
+ openai: req.providerOptions?.openai,
97
+ inputImages: req.inputImages?.map((image, index) => ({
98
+ blob: new Blob([new Uint8Array(image.buffer)], { type: image.mimeType }),
99
+ fileName: image.fileName ?? `input-${index}.png`
100
+ }))
101
+ }
102
+ });
103
+ return {
104
+ model: req.model,
105
+ images: result.images.map((image) => ({
106
+ buffer: Buffer.from(image.bytes),
107
+ mimeType: image.mimeType
108
+ })),
109
+ metadata: {
110
+ requestId: result.requestId,
111
+ usage: result.usage
112
+ }
113
+ };
114
+ }
115
+ };
116
+ }
117
+ //#endregion
118
+ export { buildNativeImageProvider };
@@ -48,7 +48,7 @@ export interface OpenAiImagesProviderOptions {
48
48
  resolveEndpoint: (req: ImageGenerationRequest) => OpenAiImagesEndpointResolution;
49
49
  /** Default per-call timeout. Combined with provider-level config in provider-http. */
50
50
  defaultTimeoutMs?: number;
51
- /** Default count clamp. Provider may also enforce via `capabilities.generate.maxCount`. */
51
+ /** Default image count. Provider may also enforce via `capabilities.generate.maxCount`. */
52
52
  defaultCount?: number;
53
53
  defaultSize?: string;
54
54
  }
@@ -1,23 +1,24 @@
1
1
  import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
- import { imageAssetFromBase64, imageFileExtensionForMimeType } from "./image-assets.js";
3
+ import { imageFileExtensionForMimeType } from "./image-assets.js";
4
4
  import { pickTimeoutMsOrFallback } from "../../../media-shared/http/deadline.js";
5
5
  import { privateNetworkPolicyToSsrfGuardOptions } from "../../../media-shared/http/private-network.js";
6
6
  import { resolveProviderHttpRequestConfig } from "../../../media-shared/http/resolve-provider-http-request-config.js";
7
7
  import { postJsonRequest, postMultipartRequest, readJsonResponseLimited } from "../../../media-shared/http/provider-http.js";
8
8
  import "../../../media-shared/http/index.js";
9
+ import { ImageProviderError, validateImageRequest } from "../../../../packages/image-providers/src/validation.js";
10
+ import { decodeBase64, imageFromBytes } from "../../../../packages/image-providers/src/http.js";
11
+ import "../../../../packages/image-providers/src/index.js";
9
12
  //#region src/agent/image/generation/openai-images-provider.ts
13
+ /** Strict implementation of the OpenAI Images REST protocol. */
10
14
  init_logger();
11
15
  const log = createLogger("ImageGen:OpenAIImages");
12
- const DEFAULT_OUTPUT_MIME = "image/png";
13
16
  const DEFAULT_TIMEOUT_MS = 12e4;
14
17
  const MAX_RESPONSE_BYTES = 64 * 1024 * 1024;
15
- const MAX_IMAGE_BYTES = 32 * 1024 * 1024;
16
18
  const MAX_TOTAL_IMAGE_BYTES = 64 * 1024 * 1024;
17
19
  function createOpenAiImagesProvider(options) {
18
- const defaultMaxCount = options.capabilities.generate?.maxCount ?? 4;
19
20
  const defaultCount = options.defaultCount ?? 1;
20
- const defaultSize = options.defaultSize ?? "1024x1024";
21
+ const defaultSize = options.defaultSize ?? options.capabilities.geometry?.sizes?.[0];
21
22
  return {
22
23
  id: options.id,
23
24
  label: options.label,
@@ -44,8 +45,20 @@ function createOpenAiImagesProvider(options) {
44
45
  });
45
46
  const ssrfGuardOptions = privateNetworkPolicyToSsrfGuardOptions(endpoint.privateNetworkPolicy);
46
47
  const isEdit = (req.inputImages?.length ?? 0) > 0;
47
- const count = clampCount(req.count, defaultCount, defaultMaxCount);
48
- const size = req.size?.trim() || defaultSize;
48
+ const count = req.count ?? defaultCount;
49
+ const size = req.size?.trim() || (req.aspectRatio || req.resolution || !options.capabilities.generate?.supportsSize ? void 0 : defaultSize);
50
+ if (!options.models.includes(req.model)) throw new ImageProviderError(`Unsupported image model: ${req.model}`, 400);
51
+ validateImageRequest({
52
+ ...req,
53
+ count,
54
+ size,
55
+ background: req.background ?? req.providerOptions?.openai?.background,
56
+ openai: req.providerOptions?.openai,
57
+ inputImages: req.inputImages?.map((image, index) => ({
58
+ blob: new Blob([new Uint8Array(image.buffer)], { type: image.mimeType }),
59
+ fileName: image.fileName ?? `input-${index}`
60
+ }))
61
+ }, options.capabilities);
49
62
  const url = isEdit ? joinPath(endpoint.baseUrl, endpoint.editsPath ?? "/images/edits") : joinPath(endpoint.baseUrl, endpoint.generationsPath ?? "/images/generations");
50
63
  log.debug({
51
64
  providerId: options.id,
@@ -72,7 +85,11 @@ function createOpenAiImagesProvider(options) {
72
85
  size,
73
86
  httpDefaults,
74
87
  ssrfGuardOptions
75
- }), req);
88
+ }), {
89
+ ...req,
90
+ count
91
+ });
92
+ if (mapped.length > count) throw new ImageProviderError("Provider returned too many images", 502);
76
93
  if (mapped.length === 0) throw new Error(`${options.id} returned no images.`);
77
94
  return {
78
95
  images: mapped,
@@ -86,10 +103,13 @@ async function postGenerateRequest(params) {
86
103
  model: params.req.model,
87
104
  prompt: params.req.prompt,
88
105
  n: params.count,
89
- size: params.size,
90
- response_format: "b64_json"
106
+ ...params.size ? { size: params.size } : {}
91
107
  };
92
108
  applyOpenAiOptions(body, params.req);
109
+ if (params.req.aspectRatio || params.req.resolution) body.xopc = { image: {
110
+ aspectRatio: params.req.aspectRatio,
111
+ resolution: params.req.resolution
112
+ } };
93
113
  const timeoutMs = pickTimeoutMsOrFallback(params.req.timeoutMs, params.httpDefaults.timeoutMs, DEFAULT_TIMEOUT_MS);
94
114
  return await readJsonResponseLimited(await postJsonRequest(params.url, {
95
115
  label: params.providerId,
@@ -106,9 +126,15 @@ async function postEditRequest(params) {
106
126
  model: params.req.model,
107
127
  prompt: params.req.prompt,
108
128
  n: String(params.count),
109
- size: params.size,
110
- response_format: "b64_json"
129
+ ...params.size ? { size: params.size } : {}
111
130
  };
131
+ const options = {};
132
+ applyOpenAiOptions(options, params.req);
133
+ for (const [key, value] of Object.entries(options)) fields[key] = String(value);
134
+ if (params.req.aspectRatio || params.req.resolution) fields.xopc = JSON.stringify({ image: {
135
+ aspectRatio: params.req.aspectRatio,
136
+ resolution: params.req.resolution
137
+ } });
112
138
  const form = new FormData();
113
139
  for (const [k, v] of Object.entries(fields)) if (typeof v === "string") form.append(k, v);
114
140
  for (let idx = 0; idx < inputImages.length; idx++) {
@@ -117,7 +143,7 @@ async function postEditRequest(params) {
117
143
  const u8 = img.buffer instanceof Uint8Array ? img.buffer : new Uint8Array(img.buffer);
118
144
  const copy = new Uint8Array(u8.byteLength);
119
145
  copy.set(u8);
120
- form.append(field, new Blob([copy], { type: img.mimeType || DEFAULT_OUTPUT_MIME }), pickEditFileName(img, idx));
146
+ form.append(field, new Blob([copy], { type: img.mimeType }), pickEditFileName(img, idx));
121
147
  }
122
148
  const headers = new Headers(params.headers);
123
149
  headers.delete("content-type");
@@ -135,26 +161,20 @@ function mapOpenAiImagesResponse(raw, req) {
135
161
  if (!raw || typeof raw !== "object") return [];
136
162
  const data = raw.data;
137
163
  if (!Array.isArray(data)) return [];
138
- const ext = imageFileExtensionForMimeType(req.outputFormat ? `image/${req.outputFormat}` : DEFAULT_OUTPUT_MIME);
164
+ if (data.length > (req.count ?? 1)) throw new ImageProviderError("Provider returned too many images", 502);
139
165
  const out = [];
140
166
  let totalBytes = 0;
141
- data.forEach((entry, index) => {
142
- const b64 = entry?.b64_json;
143
- if (typeof b64 !== "string" || b64.length === 0) return;
144
- const estimatedBytes = Math.ceil(b64.replace(/\s+/g, "").length * 3 / 4);
145
- if (estimatedBytes > MAX_IMAGE_BYTES) throw new Error(`OpenAI Images response image exceeds ${MAX_IMAGE_BYTES} bytes.`);
146
- totalBytes += estimatedBytes;
147
- if (totalBytes > MAX_TOTAL_IMAGE_BYTES) throw new Error(`OpenAI Images response images exceed ${MAX_TOTAL_IMAGE_BYTES} bytes total.`);
148
- const asset = imageAssetFromBase64({
149
- base64: b64,
150
- mimeType: req.outputFormat ? `image/${req.outputFormat}` : void 0,
151
- fileName: `image-${index + 1}.${ext}`
152
- });
167
+ for (const [index, entry] of data.entries()) {
168
+ const image = imageFromBytes(decodeBase64(entry?.b64_json));
169
+ totalBytes += image.bytes.byteLength;
170
+ if (totalBytes > MAX_TOTAL_IMAGE_BYTES) throw new ImageProviderError("Generated images exceed total byte limit", 502);
153
171
  out.push({
154
- ...asset,
172
+ buffer: Buffer.from(image.bytes),
173
+ mimeType: image.mimeType,
174
+ fileName: `image-${index + 1}.${imageFileExtensionForMimeType(image.mimeType)}`,
155
175
  ...typeof entry.revised_prompt === "string" ? { revisedPrompt: entry.revised_prompt } : {}
156
176
  });
157
- });
177
+ }
158
178
  return out;
159
179
  }
160
180
  function applyAuthorizationHeader(params) {
@@ -191,10 +211,6 @@ function pickEditFileName(img, idx) {
191
211
  const ext = imageFileExtensionForMimeType(img.mimeType);
192
212
  return `image-${idx + 1}.${ext}`;
193
213
  }
194
- function clampCount(requested, fallback, max) {
195
- if (typeof requested !== "number" || !Number.isFinite(requested) || requested <= 0) return fallback;
196
- return Math.min(max, Math.max(1, Math.floor(requested)));
197
- }
198
214
  function joinPath(baseUrl, subPath) {
199
215
  return `${baseUrl.replace(/\/+$/, "")}${subPath.startsWith("/") ? subPath : `/${subPath}`}`;
200
216
  }
@@ -1,12 +1,10 @@
1
1
  import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
3
  import { init_models_json, loadModelsJson } from "../../../config/models-json.js";
4
+ import { listImageProviderSpecs } from "../../../../packages/image-providers/src/catalog.js";
5
+ import "../../../../packages/image-providers/src/index.js";
4
6
  import { buildCustomOpenAiImagesProvider } from "./custom-openai-images-provider.js";
5
- import { buildDashScopeImageGenerationProvider } from "./providers/dashscope.js";
6
- import { buildFalImageGenerationProvider } from "./providers/fal.js";
7
- import { buildGoogleImageGenerationProvider } from "./providers/google.js";
8
- import { buildMinimaxImageGenerationProvider } from "./providers/minimax.js";
9
- import { buildOpenAIImageGenerationProvider } from "./providers/openai.js";
7
+ import { buildNativeImageProvider } from "./native-provider.js";
10
8
  import { buildXopcCloudImageGenerationProvider } from "./providers/xopc-cloud.js";
11
9
  //#region src/agent/image/generation/provider-registry.ts
12
10
  init_models_json();
@@ -14,14 +12,7 @@ init_logger();
14
12
  const log = createLogger("ImageGenerationRegistry");
15
13
  function buildBuiltInProviders() {
16
14
  const cloud = buildXopcCloudImageGenerationProvider();
17
- return [
18
- ...cloud ? [cloud] : [],
19
- buildOpenAIImageGenerationProvider(),
20
- buildDashScopeImageGenerationProvider(),
21
- buildMinimaxImageGenerationProvider(),
22
- buildGoogleImageGenerationProvider(),
23
- buildFalImageGenerationProvider()
24
- ];
15
+ return [...cloud ? [cloud] : [], ...listImageProviderSpecs().map((spec) => buildNativeImageProvider(spec.id))];
25
16
  }
26
17
  let providers = buildBuiltInProviders();
27
18
  let providersById = new Map(providers.map((provider) => [provider.id, provider]));
@@ -9,9 +9,9 @@ init_provider_auth_service();
9
9
  init_xopc_cloud_config();
10
10
  function buildXopcCloudImageGenerationProvider() {
11
11
  const source = getModelCatalogStore().getSource("xopc-cloud");
12
- const models = source?.models.filter((model) => model.availability === "available" && model.kind === "image" && model.operations.includes("images.generate")).sort((left, right) => compareCatalogModels(left, right, source.recommended?.["image-generation"])) ?? [];
12
+ const models = source?.models.filter((model) => model.availability === "available" && model.kind === "image" && model.operations.includes("images.generate") && Boolean(model.imageGeneration)).sort((left, right) => compareCatalogModels(left, right, source.recommended?.["image-generation"])) ?? [];
13
13
  if (models.length === 0) return void 0;
14
- const modelCapabilities = Object.fromEntries(models.map((model) => [model.id, toProviderCapabilities(model)]));
14
+ const modelCapabilities = Object.fromEntries(models.map((model) => [model.id, model.imageGeneration]));
15
15
  const defaultModel = models[0].id;
16
16
  const baseUrl = source?.baseUrl ?? resolveXopcModelRouterUrl();
17
17
  const executors = new Map(models.map((model) => [model.id, createOpenAiImagesProvider({
@@ -19,11 +19,12 @@ function buildXopcCloudImageGenerationProvider() {
19
19
  label: "XOPC Model Service",
20
20
  defaultModel: model.id,
21
21
  models: [model.id],
22
+ defaultTimeoutMs: 6e5,
22
23
  capabilities: modelCapabilities[model.id],
23
24
  isConfigured: () => true,
24
25
  resolveApiKey: (request) => getProviderAuthService().resolveApiKey("xopc-cloud", request.signal),
25
26
  resolveEndpoint: () => ({ baseUrl }),
26
- ...model.imageGeneration?.sizes[0] ? { defaultSize: model.imageGeneration.sizes[0] } : {}
27
+ ...model.imageGeneration?.geometry?.sizes?.[0] ? { defaultSize: model.imageGeneration.geometry.sizes[0] } : {}
27
28
  })]));
28
29
  return {
29
30
  id: "xopc-cloud",
@@ -37,37 +38,7 @@ function buildXopcCloudImageGenerationProvider() {
37
38
  async generateImage(request) {
38
39
  const executor = executors.get(request.model);
39
40
  if (!executor) throw new Error(`Image model is not available from XOPC Model Service: ${request.model}`);
40
- const geometry = modelCapabilities[request.model]?.geometry;
41
- const size = request.size ?? (request.aspectRatio && geometry?.aspectRatios?.includes(request.aspectRatio) ? request.aspectRatio : void 0) ?? (request.resolution && geometry?.resolutions?.includes(request.resolution) ? request.resolution : void 0);
42
- return executor.generateImage({
43
- ...request,
44
- ...size ? { size } : {}
45
- });
46
- }
47
- };
48
- }
49
- function toProviderCapabilities(model) {
50
- const image = model.imageGeneration;
51
- return {
52
- generate: {
53
- maxCount: image?.maxCount ?? 1,
54
- supportsSize: Boolean(image?.sizes.length),
55
- supportsAspectRatio: Boolean(image?.aspectRatios?.length)
56
- },
57
- edit: {
58
- enabled: model.operations.includes("images.edit"),
59
- maxInputImages: image?.maxInputImages ?? 0,
60
- supportsSize: Boolean(image?.sizes.length),
61
- supportsAspectRatio: Boolean(image?.aspectRatios?.length)
62
- },
63
- geometry: {
64
- sizes: image?.sizes ?? [],
65
- aspectRatios: image?.aspectRatios ?? []
66
- },
67
- output: {
68
- qualities: image?.qualities ?? [],
69
- formats: image?.formats ?? [],
70
- backgrounds: image?.backgrounds ?? []
41
+ return executor.generateImage(request);
71
42
  }
72
43
  };
73
44
  }
@@ -10,9 +10,9 @@ import type { Config } from '../../../config/schema.js';
10
10
  import type { ToolModelConfig } from '../tool-model-config.js';
11
11
  import type { AuthProfileStore } from '../../../providers/auth-runtime/index.js';
12
12
  import type { FallbackAttempt } from '../../failover-error.js';
13
- import type { GeneratedImageAsset, ImageGenerationBackground, ImageGenerationIgnoredOverride, ImageGenerationNormalization, ImageGenerationOutputFormat, ImageGenerationProvider, ImageGenerationProviderOptions, ImageGenerationQuality, ImageGenerationResolution, ImageGenerationSourceImage } from './types.js';
13
+ import type { GeneratedImageAsset, ImageGenerationBackground, ImageGenerationOutputFormat, ImageGenerationProvider, ImageGenerationProviderOptions, ImageGenerationQuality, ImageGenerationResolution, ImageGenerationSourceImage } from './types.js';
14
14
  export interface GenerateImageParams {
15
- /** Active xopc config. Optional in Step 2 to keep tool-level callers compatible. */
15
+ /** Active xopc config. */
16
16
  cfg?: Config;
17
17
  prompt: string;
18
18
  agentId?: string;
@@ -41,8 +41,6 @@ export interface GenerateImageRuntimeResult {
41
41
  provider: string;
42
42
  model: string;
43
43
  attempts: FallbackAttempt[];
44
- normalization?: ImageGenerationNormalization;
45
- ignoredOverrides: ImageGenerationIgnoredOverride[];
46
44
  metadata?: Record<string, unknown>;
47
45
  }
48
46
  /**