@xopcai/xopc 0.0.161 → 0.0.163

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 (334) hide show
  1. package/README.md +4 -2
  2. package/README.zh-CN.md +4 -2
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/telegram/xopc.extension.json +1 -1
  5. package/dist/gateway/static/root/assets/{activity-store-o7GRljfD.js → activity-store-Xj95LzTv.js} +1 -1
  6. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-9R3szLMc.js → agent-avatar-dicebear-C-QeUFwU.js} +1 -1
  7. package/dist/gateway/static/root/assets/agents-DVKlWKJE.js +2 -0
  8. package/dist/gateway/static/root/assets/{api-jSTqFMq9.js → api-BTLmAm1_.js} +1 -1
  9. package/dist/gateway/static/root/assets/{app-management-settings-panel-D81cyE76.js → app-management-settings-panel-zc6Gf-S5.js} +1 -1
  10. package/dist/gateway/static/root/assets/{appearance-settings-Ct6bZQCV.js → appearance-settings-0fMLnOWn.js} +1 -1
  11. package/dist/gateway/static/root/assets/apps-page-BZXEJDIV.js +1 -0
  12. package/dist/gateway/static/root/assets/{archive-plugin-CfD7AZKn.js → archive-plugin-DOiR_E21.js} +1 -1
  13. package/dist/gateway/static/root/assets/{attachment-load-CP_Gaxt3.js → attachment-load-BxmYl1D1.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automation-suggestion-card-BGKM_NDZ.js → automation-suggestion-card-BhZOirad.js} +1 -1
  15. package/dist/gateway/static/root/assets/automations-page-B8CnkoXv.js +6 -0
  16. package/dist/gateway/static/root/assets/{binary-plugins-IPr2EVnS.js → binary-plugins-DTTKsvgk.js} +1 -1
  17. package/dist/gateway/static/root/assets/{block-editor-B6aHEGA6.js → block-editor-C7se7iqg.js} +46 -46
  18. package/dist/gateway/static/root/assets/browser-settings-page-BCPWKI9V.js +8 -0
  19. package/dist/gateway/static/root/assets/browser-workflow-inputs-kxmStCcv.js +1 -0
  20. package/dist/gateway/static/root/assets/browser-workflows-page-CwYf9OM_.js +3 -0
  21. package/dist/gateway/static/root/assets/capabilities-settings-panel-C7lr_mX2.js +2 -0
  22. package/dist/gateway/static/root/assets/{capability-presets-api-CCX9-LjU.js → capability-presets-api-BZKh2cWX.js} +1 -1
  23. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Ble9kHRu.js +2 -0
  24. package/dist/gateway/static/root/assets/{channel-recipient-api-MmLMLDWf.js → channel-recipient-api-r7tdbnJE.js} +1 -1
  25. package/dist/gateway/static/root/assets/channels-settings-CtQQQHrv.js +1 -0
  26. package/dist/gateway/static/root/assets/channels-status-swr-_VirfMKW.js +1 -0
  27. package/dist/gateway/static/root/assets/{connector-logo-BbjzIs87.js → connector-logo-BpnQYAxA.js} +1 -1
  28. package/dist/gateway/static/root/assets/connectors-page-BXWJSJeY.js +2 -0
  29. package/dist/gateway/static/root/assets/{desktop-pet-CYH5ZSXy.js → desktop-pet-B86W4a5c.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-settings-DQLqGLc0.js → desktop-pet-settings-uv8Grtgk.js} +1 -1
  31. package/dist/gateway/static/root/assets/{directory-picker-path-field-ClsiXhmz.js → directory-picker-path-field-C4TTvf7p.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dreaming-settings-CjMPPdzg.js → dreaming-settings-CzJAUPvM.js} +3 -3
  33. package/dist/gateway/static/root/assets/{extension-debug-page-57eizjhB.js → extension-debug-page-Ci2mOYUt.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-CsbSb3u1.js → extension-page-DeXdmhXQ.js} +1 -1
  35. package/dist/gateway/static/root/assets/extension-settings-page-C93vaOsU.js +1 -0
  36. package/dist/gateway/static/root/assets/{gateway-config-api-DIPJuzBZ.js → gateway-config-api-C31Hlblp.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-settings-CDLqAQY7.js → gateway-settings-D3zS6RZh.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-startup-retry-DrfSJtvT.js → gateway-startup-retry-CSRvCqxh.js} +1 -1
  39. package/dist/gateway/static/root/assets/goal-create-dialog-CWp2b7__.js +1 -0
  40. package/dist/gateway/static/root/assets/goal-detail-page-Dtm29FxD.js +4 -0
  41. package/dist/gateway/static/root/assets/{goals-config-api-lGC10UkU.js → goals-config-api-D4wYNRrf.js} +1 -1
  42. package/dist/gateway/static/root/assets/goals-page-jMzBJs6e.js +2 -0
  43. package/dist/gateway/static/root/assets/{goals-settings-BWq0pdrA.js → goals-settings-Bx2jVvhQ.js} +1 -1
  44. package/dist/gateway/static/root/assets/{heartbeat-settings-D4o8BJVv.js → heartbeat-settings-BEIF1eXy.js} +1 -1
  45. package/dist/gateway/static/root/assets/index-BXtJvaQl.css +1 -0
  46. package/dist/gateway/static/root/assets/index-HZdBKfk_.js +199 -0
  47. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-6T2QYehS.js → keyboard-shortcuts-settings-DOEDpvTM.js} +1 -1
  48. package/dist/gateway/static/root/assets/local-app-workbench-page-CseW9jD3.js +2 -0
  49. package/dist/gateway/static/root/assets/{local-apps-page-DCjg2K9f.js → local-apps-page-B0OpGpxv.js} +1 -1
  50. package/dist/gateway/static/root/assets/{locale-store-Dar-xqQr.js → locale-store-Ys6RP7Be.js} +1 -1
  51. package/dist/gateway/static/root/assets/logs-page-DVqPbth5.js +7 -0
  52. package/dist/gateway/static/root/assets/{markdown-split-rt1XO43g.js → markdown-split-CEZwysCH.js} +1 -1
  53. package/dist/gateway/static/root/assets/{media-plugins-Bwo8CJuh.js → media-plugins-CpGKE7B0.js} +1 -1
  54. package/dist/gateway/static/root/assets/messages-BzI9Wx30.js +5 -0
  55. package/dist/gateway/static/root/assets/{notes-page-Dp-pkX7d.js → notes-page-CdiuDZ5a.js} +1 -1
  56. package/dist/gateway/static/root/assets/notes-workbench-mrc3xtpn.js +4 -0
  57. package/dist/gateway/static/root/assets/{page-tabs-CzZ4iKOb.js → page-tabs-BkH5AVV2.js} +1 -1
  58. package/dist/gateway/static/root/assets/{preview-open-alternatives-3E_Qa-58.js → preview-open-alternatives-CQai8f9D.js} +1 -1
  59. package/dist/gateway/static/root/assets/{product-open-page-B2T48Sbt.js → product-open-page-B2kSdB2b.js} +1 -1
  60. package/dist/gateway/static/root/assets/project-detail-page-CfhPJLkH.js +1 -0
  61. package/dist/gateway/static/root/assets/projects-page-BfMoKjdm.js +1 -0
  62. package/dist/gateway/static/root/assets/remote-access-hub-CrDtcsZ9.js +1 -0
  63. package/dist/gateway/static/root/assets/save-bar-controls-NGYnO7n7.js +1 -0
  64. package/dist/gateway/static/root/assets/schedule-field-nLOphnv3.js +1 -0
  65. package/dist/gateway/static/root/assets/{schema-form-DC-iU5IG.js → schema-form-D0e90ndE.js} +1 -1
  66. package/dist/gateway/static/root/assets/sessions-page-D3DbF3dV.js +1 -0
  67. package/dist/gateway/static/root/assets/settings-advanced-gate-BZp0O2dH.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-form-section-CNqF6IwY.js → settings-form-section-X2Sl-EAk.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-loading-skeleton-DkvwitK_.js → settings-loading-skeleton-DOnUabm7.js} +1 -1
  70. package/dist/gateway/static/root/assets/settings-page-C4UUNi1n.js +1 -0
  71. package/dist/gateway/static/root/assets/{settings-page-layout-DWvNgISx.js → settings-page-layout-C1yYqbT6.js} +1 -1
  72. package/dist/gateway/static/root/assets/setup-status-panel-84iao4DZ.js +1 -0
  73. package/dist/gateway/static/root/assets/{share-preview-page-DGpSPW-n.js → share-preview-page-Cfy_pH7V.js} +1 -1
  74. package/dist/gateway/static/root/assets/shares-settings-DtcwQvRG.js +1 -0
  75. package/dist/gateway/static/root/assets/skill-reload-api-L7j5Gc8Z.js +1 -0
  76. package/dist/gateway/static/root/assets/skills-page-1Ps8PjsP.js +2 -0
  77. package/dist/gateway/static/root/assets/{system-settings-panel-8TxxSbUw.js → system-settings-panel-Da81RJ6G.js} +1 -1
  78. package/dist/gateway/static/root/assets/{theme-store-B5FzMWOx.js → theme-store-DflSp9o4.js} +1 -1
  79. package/dist/gateway/static/root/assets/time-picker-BIkOW-2L.js +1 -0
  80. package/dist/gateway/static/root/assets/{typed-models-lib-DEGtSA5h.js → typed-models-lib--HptwFcD.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-channel-catalog-BDU6FneG.js → use-channel-catalog-CMHY4ZfW.js} +1 -1
  82. package/dist/gateway/static/root/assets/user-context-page-BYAAs2iW.js +1 -0
  83. package/dist/gateway/static/root/assets/voice-api-key-field-nvIZerol.js +1 -0
  84. package/dist/gateway/static/root/assets/work-discovery-page-J35JkJ7_.js +1 -0
  85. package/dist/gateway/static/root/assets/work-item-detail-page-C4wYDYqV.js +1 -0
  86. package/dist/gateway/static/root/assets/work-page-DMvitV6c.js +1 -0
  87. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-Cwi8Pz7n.js → workflow-run-setup-panel-D96MHABy.js} +2 -2
  88. package/dist/gateway/static/root/assets/workflows-page-JMN0nMbM.js +11 -0
  89. package/dist/gateway/static/root/index.html +7 -7
  90. package/dist/package.js +1 -1
  91. package/dist/src/agent/agent-manager.d.ts +1 -0
  92. package/dist/src/agent/agent-manager.js +1 -0
  93. package/dist/src/agent/client-error-format.d.ts +1 -1
  94. package/dist/src/agent/client-error-format.js +9 -5
  95. package/dist/src/agent/embedded/run-for-session.js +38 -31
  96. package/dist/src/agent/embedded/session-runner.d.ts +1 -0
  97. package/dist/src/agent/embedded/session-runner.js +12 -4
  98. package/dist/src/agent/failover-error.d.ts +1 -1
  99. package/dist/src/agent/image/generation/openai-compatible-image-provider.d.ts +2 -6
  100. package/dist/src/agent/image/generation/openai-compatible-image-provider.js +1 -3
  101. package/dist/src/agent/image/generation/provider-registry.d.ts +5 -46
  102. package/dist/src/agent/image/generation/provider-registry.js +24 -73
  103. package/dist/{extensions/dashscope/src/image-generation-provider.d.ts → src/agent/image/generation/providers/dashscope.d.ts} +3 -6
  104. package/dist/{extensions/dashscope/src/image-generation-provider.js → src/agent/image/generation/providers/dashscope.js} +36 -59
  105. package/dist/{extensions/fal/src/image-generation-provider.d.ts → src/agent/image/generation/providers/fal.d.ts} +1 -1
  106. package/dist/{extensions/fal/src/image-generation-provider.js → src/agent/image/generation/providers/fal.js} +19 -29
  107. package/dist/{extensions/google/src/image-generation-provider.d.ts → src/agent/image/generation/providers/google.d.ts} +2 -2
  108. package/dist/{extensions/google/src/image-generation-provider.js → src/agent/image/generation/providers/google.js} +23 -30
  109. package/dist/{extensions/minimax/src/image-generation-provider.d.ts → src/agent/image/generation/providers/minimax.d.ts} +2 -5
  110. package/dist/{extensions/minimax/src/image-generation-provider.js → src/agent/image/generation/providers/minimax.js} +35 -51
  111. package/dist/{extensions/openai/src/image-generation-provider.d.ts → src/agent/image/generation/providers/openai.d.ts} +2 -2
  112. package/dist/{extensions/openai/src/image-generation-provider.js → src/agent/image/generation/providers/openai.js} +13 -38
  113. package/dist/src/agent/image/generation/runtime-types.d.ts +1 -0
  114. package/dist/src/agent/image/generation/runtime.d.ts +1 -3
  115. package/dist/src/agent/image/generation/runtime.js +6 -6
  116. package/dist/src/agent/image/generation/types.d.ts +23 -3
  117. package/dist/src/agent/image/index.d.ts +1 -1
  118. package/dist/src/agent/image/index.js +2 -2
  119. package/dist/src/agent/media-generation/runtime-shared.d.ts +2 -0
  120. package/dist/src/agent/media-generation/runtime-shared.js +1 -0
  121. package/dist/src/agent/outcomes/task-evaluation.d.ts +20 -0
  122. package/dist/src/agent/outcomes/task-evaluation.js +48 -0
  123. package/dist/src/agent/outcomes/task-verifier.d.ts +29 -0
  124. package/dist/src/agent/outcomes/task-verifier.js +71 -0
  125. package/dist/src/agent/prompt/memory/index.js +1 -1
  126. package/dist/src/agent/prompt/service-prompt-builder.js +32 -1
  127. package/dist/src/agent/service.js +1 -0
  128. package/dist/src/agent/service.types.d.ts +1 -0
  129. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +1 -7
  130. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +2 -73
  131. package/dist/src/agent/tools/browser/tool/schemas.d.ts +1 -13
  132. package/dist/src/agent/tools/browser/tool/schemas.js +1 -9
  133. package/dist/src/agent/tools/browser-recipe-tool.d.ts +12 -0
  134. package/dist/src/agent/tools/browser-recipe-tool.js +113 -0
  135. package/dist/src/agent/tools/factory.d.ts +2 -0
  136. package/dist/src/agent/tools/factory.js +6 -1
  137. package/dist/src/agent/tools/image-generate-tool.d.ts +2 -0
  138. package/dist/src/agent/tools/image-generate-tool.js +14 -7
  139. package/dist/src/agent/tools/index.d.ts +1 -0
  140. package/dist/src/agent/tools/index.js +2 -1
  141. package/dist/src/auth/sync-provider-auth.d.ts +3 -0
  142. package/dist/src/auth/sync-provider-auth.js +12 -1
  143. package/dist/src/automations/domain/types.d.ts +13 -0
  144. package/dist/src/automations/domain/validation.d.ts +44 -24
  145. package/dist/src/automations/domain/validation.js +27 -18
  146. package/dist/src/automations/draft/automation-draft-validator.d.ts +6 -1
  147. package/dist/src/automations/draft/automation-draft-validator.js +1 -0
  148. package/dist/src/automations/service/action-executor.d.ts +1 -0
  149. package/dist/src/automations/service/action-executor.js +22 -0
  150. package/dist/src/browser/index.d.ts +0 -1
  151. package/dist/src/browser/index.js +1 -2
  152. package/dist/src/browser/pipeline/runner.d.ts +9 -2
  153. package/dist/src/browser/pipeline/runner.js +151 -105
  154. package/dist/src/browser/pipeline/schema.d.ts +21 -15
  155. package/dist/src/browser/pipeline/schema.js +93 -99
  156. package/dist/src/browser/recipes/index.d.ts +3 -0
  157. package/dist/src/browser/recipes/index.js +3 -0
  158. package/dist/src/browser/recipes/repository.d.ts +13 -0
  159. package/dist/src/browser/recipes/repository.js +81 -0
  160. package/dist/src/browser/recipes/runtime-service.d.ts +6 -0
  161. package/dist/src/browser/recipes/runtime-service.js +30 -0
  162. package/dist/src/browser/recipes/service.d.ts +36 -0
  163. package/dist/src/browser/recipes/service.js +186 -0
  164. package/dist/src/browser/recipes/types.d.ts +36 -0
  165. package/dist/src/cli/commands/browser-cli-helpers.js +6 -12
  166. package/dist/src/cli/commands/browser.js +4 -3
  167. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  168. package/dist/src/cli/commands/models.js +2 -5
  169. package/dist/src/cli/commands/onboard/model.js +3 -2
  170. package/dist/src/cli/commands/setup-shared/types.d.ts +1 -1
  171. package/dist/src/config/agent-profile.js +1 -1
  172. package/dist/src/config/index.js +2 -2
  173. package/dist/src/config/models-json.d.ts +6 -0
  174. package/dist/src/config/models-json.js +2 -6
  175. package/dist/src/config/schema.d.ts +29 -18
  176. package/dist/src/config/schema.js +44 -33
  177. package/dist/src/gateway/agents-admin.js +1 -1
  178. package/dist/src/gateway/hono/app.js +12 -6
  179. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -1
  180. package/dist/src/gateway/hono/lib/safe-providers-config.d.ts +0 -3
  181. package/dist/src/gateway/hono/lib/safe-providers-config.js +1 -3
  182. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  183. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +8 -1
  184. package/dist/src/gateway/hono/routes/browser-workflows.d.ts +3 -0
  185. package/dist/src/gateway/hono/routes/browser-workflows.js +78 -0
  186. package/dist/src/gateway/hono/routes/config-patch/misc.js +2 -11
  187. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  188. package/dist/src/gateway/hono/routes/home.js +1 -0
  189. package/dist/src/gateway/hono/routes/index.js +4 -0
  190. package/dist/src/gateway/hono/routes/interaction-state.d.ts +3 -0
  191. package/dist/src/gateway/hono/routes/interaction-state.js +45 -0
  192. package/dist/src/gateway/hono/routes/lazy-bundles.js +17 -2
  193. package/dist/src/gateway/hono/routes/memory.js +33 -4
  194. package/dist/src/gateway/hono/routes/models.js +151 -129
  195. package/dist/src/gateway/hono/routes/task-outcomes.d.ts +3 -0
  196. package/dist/src/gateway/hono/routes/task-outcomes.js +109 -0
  197. package/dist/src/gateway/hono/routes/you.d.ts +10 -2
  198. package/dist/src/gateway/hono/routes/you.js +184 -28
  199. package/dist/src/gateway/image-generation-setup.d.ts +40 -0
  200. package/dist/src/gateway/image-generation-setup.js +130 -0
  201. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  202. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  203. package/dist/src/gateway/service/run-gateway-agent.js +84 -0
  204. package/dist/src/gateway/service.d.ts +6 -0
  205. package/dist/src/gateway/service.js +24 -0
  206. package/dist/src/media-shared/http/private-network.d.ts +1 -1
  207. package/dist/src/media-shared/http/private-network.js +1 -1
  208. package/dist/src/proactive/insight-repository.d.ts +2 -0
  209. package/dist/src/proactive/insight-repository.js +5 -2
  210. package/dist/src/proactive/run-processor.js +22 -1
  211. package/dist/src/proactive/types.d.ts +2 -0
  212. package/dist/src/proactive/value-score.d.ts +13 -0
  213. package/dist/src/proactive/value-score.js +30 -0
  214. package/dist/src/providers/auth-runtime/resolve-api-key.d.ts +2 -4
  215. package/dist/src/providers/auth-runtime/resolve-api-key.js +2 -4
  216. package/dist/src/providers/auth-runtime/resolve-auth.d.ts +3 -4
  217. package/dist/src/providers/auth-runtime/resolve-auth.js +18 -18
  218. package/dist/src/providers/domestic-presets.d.ts +22 -0
  219. package/dist/src/providers/domestic-presets.js +25 -0
  220. package/dist/src/providers/model-catalog-store.d.ts +71 -0
  221. package/dist/src/providers/model-catalog-store.js +102 -0
  222. package/dist/src/providers/model-catalog-sync-service.d.ts +41 -0
  223. package/dist/src/providers/model-catalog-sync-service.js +142 -0
  224. package/dist/src/providers/model-reference-auditor.d.ts +14 -0
  225. package/dist/src/providers/model-reference-auditor.js +71 -0
  226. package/dist/src/providers/model-registry.d.ts +4 -1
  227. package/dist/src/providers/model-registry.js +35 -2
  228. package/dist/src/providers/presentation.js +2 -0
  229. package/dist/src/providers/xopc-cloud-connection.d.ts +51 -0
  230. package/dist/src/providers/xopc-cloud-connection.js +196 -0
  231. package/dist/src/session/index.d.ts +1 -1
  232. package/dist/src/session/index.js +2 -2
  233. package/dist/src/session/session-title.d.ts +2 -0
  234. package/dist/src/session/session-title.js +24 -3
  235. package/dist/src/share/share-types.js +5 -5
  236. package/dist/src/share/site-share-types.d.ts +1 -1
  237. package/dist/src/share/site-share-types.js +5 -5
  238. package/dist/src/storage/sqlite/index.d.ts +3 -0
  239. package/dist/src/storage/sqlite/index.js +4 -1
  240. package/dist/src/storage/sqlite/interaction-state-repository.d.ts +17 -0
  241. package/dist/src/storage/sqlite/interaction-state-repository.js +60 -0
  242. package/dist/src/storage/sqlite/memory-records-repository.js +1 -1
  243. package/dist/src/storage/sqlite/migrations/053_browser_recipes.sql +45 -0
  244. package/dist/src/storage/sqlite/migrations/054_task_outcomes.sql +24 -0
  245. package/dist/src/storage/sqlite/migrations/055_relationship_settings.sql +14 -0
  246. package/dist/src/storage/sqlite/migrations/056_task_verification.sql +6 -0
  247. package/dist/src/storage/sqlite/migrations/057_interaction_states.sql +11 -0
  248. package/dist/src/storage/sqlite/migrations/058_proactive_value.sql +3 -0
  249. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  250. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  251. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  252. package/dist/src/storage/sqlite/relationship-settings-repository.d.ts +17 -0
  253. package/dist/src/storage/sqlite/relationship-settings-repository.js +64 -0
  254. package/dist/src/storage/sqlite/schema.js +1 -1
  255. package/dist/src/storage/sqlite/schema.sql +46 -0
  256. package/dist/src/storage/sqlite/task-outcome-repository.d.ts +90 -0
  257. package/dist/src/storage/sqlite/task-outcome-repository.js +138 -0
  258. package/dist/src/user-context/interaction-state.d.ts +13 -0
  259. package/dist/src/user-context/interaction-state.js +69 -0
  260. package/dist/src/user-context/memory-use-audit.d.ts +10 -0
  261. package/dist/src/user-context/memory-use-audit.js +25 -0
  262. package/dist/src/user-context/personal-playbook.d.ts +11 -0
  263. package/dist/src/user-context/personal-playbook.js +41 -0
  264. package/dist/src/user-context/projection.d.ts +4 -0
  265. package/dist/src/user-context/projection.js +5 -1
  266. package/dist/src/user-context/relationship-continuity.d.ts +14 -0
  267. package/dist/src/user-context/relationship-continuity.js +51 -0
  268. package/package.json +5 -7
  269. package/dist/extensions/dashscope/src/index.d.ts +0 -4
  270. package/dist/extensions/dashscope/src/index.js +0 -2
  271. package/dist/extensions/dashscope/xopc.extension.json +0 -15
  272. package/dist/extensions/fal/src/index.d.ts +0 -4
  273. package/dist/extensions/fal/src/index.js +0 -2
  274. package/dist/extensions/fal/xopc.extension.json +0 -14
  275. package/dist/extensions/google/src/index.d.ts +0 -4
  276. package/dist/extensions/google/src/index.js +0 -2
  277. package/dist/extensions/google/xopc.extension.json +0 -14
  278. package/dist/extensions/minimax/src/index.d.ts +0 -4
  279. package/dist/extensions/minimax/src/index.js +0 -2
  280. package/dist/extensions/minimax/xopc.extension.json +0 -15
  281. package/dist/extensions/openai/src/index.d.ts +0 -4
  282. package/dist/extensions/openai/src/index.js +0 -2
  283. package/dist/extensions/openai/xopc.extension.json +0 -14
  284. package/dist/gateway/static/root/assets/action-boundary-settings-panel-BIVBUiNT.js +0 -1
  285. package/dist/gateway/static/root/assets/agents-_qbUaYbs.js +0 -2
  286. package/dist/gateway/static/root/assets/apps-page-0sPqD0FK.js +0 -1
  287. package/dist/gateway/static/root/assets/automations-page-BxWBuBsE.js +0 -6
  288. package/dist/gateway/static/root/assets/browser-settings-page-C499b9AH.js +0 -8
  289. package/dist/gateway/static/root/assets/capability-presets-settings-panel-Dva9SiPK.js +0 -2
  290. package/dist/gateway/static/root/assets/channels-settings-DNAU7u9o.js +0 -1
  291. package/dist/gateway/static/root/assets/channels-status-swr-CIOH7tgn.js +0 -1
  292. package/dist/gateway/static/root/assets/connectors-page-TwiBp8vY.js +0 -2
  293. package/dist/gateway/static/root/assets/extension-settings-page-DKA9-lyP.js +0 -1
  294. package/dist/gateway/static/root/assets/goal-create-dialog-Q3B0E-0s.js +0 -1
  295. package/dist/gateway/static/root/assets/goal-detail-page-C5VAK04G.js +0 -4
  296. package/dist/gateway/static/root/assets/goals-page-BJb-5IYw.js +0 -2
  297. package/dist/gateway/static/root/assets/index-CkUHH170.css +0 -1
  298. package/dist/gateway/static/root/assets/index-vq_cJZJC.js +0 -199
  299. package/dist/gateway/static/root/assets/local-app-workbench-page-euH17Kvb.js +0 -2
  300. package/dist/gateway/static/root/assets/logs-page-CyYCBqym.js +0 -7
  301. package/dist/gateway/static/root/assets/messages-CxySDn9d.js +0 -5
  302. package/dist/gateway/static/root/assets/models-hub-panel-DObxxjc9.js +0 -2
  303. package/dist/gateway/static/root/assets/notes-workbench-CCb4RXcZ.js +0 -4
  304. package/dist/gateway/static/root/assets/project-detail-page-BvEcriRC.js +0 -1
  305. package/dist/gateway/static/root/assets/projects-page-B_e79MRJ.js +0 -1
  306. package/dist/gateway/static/root/assets/remote-access-hub-DGcqnYfR.js +0 -1
  307. package/dist/gateway/static/root/assets/save-bar-controls-CkeKasGm.js +0 -1
  308. package/dist/gateway/static/root/assets/schedule-field-TkqUL3wm.js +0 -1
  309. package/dist/gateway/static/root/assets/sessions-page-DQZhrDJ8.js +0 -1
  310. package/dist/gateway/static/root/assets/settings-advanced-gate-BkdeN99Y.js +0 -1
  311. package/dist/gateway/static/root/assets/settings-collapsible-section-Dpqth3oA.js +0 -1
  312. package/dist/gateway/static/root/assets/settings-page-qPG7I2zd.js +0 -1
  313. package/dist/gateway/static/root/assets/setup-status-panel-lwRAh9aw.js +0 -1
  314. package/dist/gateway/static/root/assets/shares-settings-BGj9IVUr.js +0 -1
  315. package/dist/gateway/static/root/assets/skill-reload-api-B2UBAs5U.js +0 -1
  316. package/dist/gateway/static/root/assets/skills-page-DdjzFZ8I.js +0 -2
  317. package/dist/gateway/static/root/assets/user-context-page-BTTZpAGV.js +0 -1
  318. package/dist/gateway/static/root/assets/voice-api-key-field-DuDQd-WU.js +0 -1
  319. package/dist/gateway/static/root/assets/work-discovery-page-BUVkVCsW.js +0 -1
  320. package/dist/gateway/static/root/assets/work-item-detail-page-DeEPPu4n.js +0 -1
  321. package/dist/gateway/static/root/assets/work-page-DQNUyTUq.js +0 -1
  322. package/dist/gateway/static/root/assets/workflows-page-BIy4wrzO.js +0 -11
  323. package/dist/src/agent/image/generation/bundled-registry.d.ts +0 -18
  324. package/dist/src/agent/image/generation/bundled-registry.js +0 -35
  325. package/dist/src/agent/image/generation/bundled.d.ts +0 -10
  326. package/dist/src/agent/image/generation/bundled.js +0 -15
  327. package/dist/src/agent/image/generation/image-provider-ui.d.ts +0 -20
  328. package/dist/src/browser/pipeline/source.d.ts +0 -9
  329. package/dist/src/browser/pipeline/source.js +0 -77
  330. package/dist/src/gateway/image-capabilities.d.ts +0 -28
  331. package/dist/src/gateway/image-capabilities.js +0 -78
  332. package/dist/src/generated/bundled-image-generation-providers.d.ts +0 -14
  333. package/dist/src/generated/bundled-image-generation-providers.js +0 -17
  334. /package/dist/src/{agent/image/generation/image-provider-ui.js → browser/recipes/types.js} +0 -0
@@ -1,4 +1,5 @@
1
1
  import { runSqliteWriteTransaction } from "../../../storage/sqlite/transaction.js";
2
+ import { getRelationshipSettings, updateRelationshipSettings } from "../../../storage/sqlite/relationship-settings-repository.js";
2
3
  import { deleteMemoryRecord, getMemoryRecord, listMemoryRecords, upsertMemoryRecord } from "../../../storage/sqlite/memory-records-repository.js";
3
4
  import { listKnowledgeSourceItems, listKnowledgeSyncRuns } from "../../../storage/sqlite/knowledge-repository.js";
4
5
  import { getConnectorConnection, listConnectorConnections } from "../../../storage/sqlite/connector-repository.js";
@@ -15,6 +16,7 @@ import "../../../goals/index.js";
15
16
  import { revokeComposioConnection } from "../../../connectors/composio.js";
16
17
  import { listConnectorCatalog } from "../../../connectors/catalog.js";
17
18
  import { nextMemoryReviewAt, resolveMemoryStability } from "../../../agent/memory/lifecycle.js";
19
+ import { PERSONAL_PLAYBOOK_DISABLED_TAG, PERSONAL_PLAYBOOK_ORDER_PREFIX, PERSONAL_PLAYBOOK_RULE_TAG, patchPersonalPlaybookContextTags, personalPlaybookContext } from "../../../user-context/personal-playbook.js";
18
20
  import { listConnectorInstances } from "../../../connectors/instances.js";
19
21
  import { uninstallConnector } from "../../../connectors/install.js";
20
22
  import { readUserProfileFile, writeUserProfileFile } from "../../agents-admin.js";
@@ -44,8 +46,13 @@ const PLAYBOOK_IDS = [
44
46
  "execution",
45
47
  "routines"
46
48
  ];
47
- const PLAYBOOK_DISABLED_TAG = "playbook:disabled";
48
- const PLAYBOOK_ORDER_PREFIX = "playbook:order:";
49
+ const PLAYBOOK_SUPPORT_NEEDS = new Set([
50
+ "listen",
51
+ "clarify",
52
+ "advise",
53
+ "act",
54
+ "unknown"
55
+ ]);
49
56
  const PROFILE_FIELD_LIMITS = {
50
57
  callName: 80,
51
58
  pronouns: 80,
@@ -154,34 +161,57 @@ function parseProfilePatch(body) {
154
161
  return Object.keys(patch).length > 0 ? { patch } : { error: "No profile fields provided" };
155
162
  }
156
163
  function playbookForRecord(record) {
164
+ if (!record.tags?.includes("playbook:rule")) return void 0;
157
165
  if (record.kind === "preference" || record.kind === "boundary" || record.kind === "tool_preference") return "communication";
158
166
  if (record.kind === "task_lesson" || record.kind === "derived_insight") return "execution";
159
167
  if (record.kind === "routine") return "routines";
160
168
  }
161
169
  function playbookRuleOrder(record) {
162
- const tag = record.tags?.find((value) => value.startsWith(PLAYBOOK_ORDER_PREFIX));
163
- const parsed = tag ? Number.parseInt(tag.slice(15), 10) : NaN;
170
+ const tag = record.tags?.find((value) => value.startsWith(PERSONAL_PLAYBOOK_ORDER_PREFIX));
171
+ const parsed = tag ? Number.parseInt(tag.slice(PERSONAL_PLAYBOOK_ORDER_PREFIX.length), 10) : NaN;
164
172
  return Number.isFinite(parsed) ? parsed : 1e3;
165
173
  }
166
174
  function patchPlaybookRuleTags(record, patch) {
167
- let tags = (record.tags ?? []).filter((tag) => !tag.startsWith(PLAYBOOK_ORDER_PREFIX));
168
- if (patch.enabled === true) tags = tags.filter((tag) => tag !== PLAYBOOK_DISABLED_TAG);
169
- if (patch.enabled === false) tags.push(PLAYBOOK_DISABLED_TAG);
170
- if (patch.order !== void 0) tags.push(`${PLAYBOOK_ORDER_PREFIX}${patch.order}`);
175
+ let tags = (record.tags ?? []).filter((tag) => !tag.startsWith(PERSONAL_PLAYBOOK_ORDER_PREFIX));
176
+ if (patch.enabled === true) tags = tags.filter((tag) => tag !== PERSONAL_PLAYBOOK_DISABLED_TAG);
177
+ if (patch.enabled === false) tags.push(PERSONAL_PLAYBOOK_DISABLED_TAG);
178
+ if (patch.order !== void 0) tags.push(`${PERSONAL_PLAYBOOK_ORDER_PREFIX}${patch.order}`);
171
179
  return [...new Set(tags)];
172
180
  }
181
+ function parsePlaybookContext(value) {
182
+ if (value === void 0) return { context: {} };
183
+ if (!value || typeof value !== "object" || Array.isArray(value)) return { error: "context must be an object" };
184
+ const input = value;
185
+ const context = {};
186
+ if ("channel" in input) {
187
+ if (input.channel !== null && (typeof input.channel !== "string" || !/^[a-z0-9_-]{1,40}$/i.test(input.channel))) return { error: "context.channel is invalid" };
188
+ context.channel = input.channel === null ? void 0 : String(input.channel);
189
+ }
190
+ if ("supportNeed" in input) {
191
+ if (input.supportNeed !== null && !PLAYBOOK_SUPPORT_NEEDS.has(String(input.supportNeed))) return { error: "context.supportNeed is invalid" };
192
+ context.supportNeed = input.supportNeed === null ? void 0 : input.supportNeed;
193
+ }
194
+ return { context };
195
+ }
173
196
  function buildPersonalPlaybooks(records) {
174
197
  return PLAYBOOK_IDS.map((id) => {
175
- const rules = records.filter((record) => playbookForRecord(record) === id).sort((left, right) => playbookRuleOrder(left) - playbookRuleOrder(right) || left.updatedAt.localeCompare(right.updatedAt));
198
+ const rules = records.filter((record) => record.status === "active" && playbookForRecord(record) === id).sort((left, right) => playbookRuleOrder(left) - playbookRuleOrder(right) || left.updatedAt.localeCompare(right.updatedAt));
176
199
  return {
177
200
  id,
178
- enabled: rules.some((record) => !record.tags?.includes(PLAYBOOK_DISABLED_TAG)),
201
+ enabled: rules.some((record) => !record.tags?.includes(PERSONAL_PLAYBOOK_DISABLED_TAG)),
179
202
  rules: rules.map((record) => ({
180
203
  id: record.id,
181
204
  statement: record.content,
182
205
  origin: record.explicitness,
183
- enabled: !record.tags?.includes(PLAYBOOK_DISABLED_TAG),
184
- order: playbookRuleOrder(record)
206
+ enabled: !record.tags?.includes(PERSONAL_PLAYBOOK_DISABLED_TAG),
207
+ order: playbookRuleOrder(record),
208
+ context: personalPlaybookContext(record),
209
+ versions: playbookVersionChain(records, record.id).map((version) => ({
210
+ id: version.id,
211
+ statement: version.content,
212
+ updatedAt: version.updatedAt,
213
+ current: version.id === record.id
214
+ }))
185
215
  })),
186
216
  updatedAt: rules.map((record) => record.updatedAt).sort().at(-1)
187
217
  };
@@ -195,7 +225,7 @@ function buildInsightSuggestions(records) {
195
225
  id: record.id,
196
226
  insight: record.content,
197
227
  kind: record.kind,
198
- action: record.kind === "routine" ? "make_repeatable" : "start_progress",
228
+ action: record.kind === "routine" ? "make_repeatable" : record.kind === "task_lesson" || record.kind === "derived_insight" ? "add_playbook" : "start_progress",
199
229
  evidenceCount: record.evidence?.length ?? 0,
200
230
  confidence: record.confidence,
201
231
  sourceName: record.source.provider ?? "local"
@@ -216,11 +246,11 @@ function editableRecord(recordId) {
216
246
  if (!record || !VISIBLE_STATUSES.has(record.status) || !isUserContextRecord(record)) return null;
217
247
  return record;
218
248
  }
219
- function preserveRecord(record, patch) {
220
- return upsertMemoryRecord({
221
- id: record.id,
249
+ function memoryRecordInput(record) {
250
+ return {
222
251
  providerId: record.source.provider ?? "local",
223
252
  kind: record.kind,
253
+ userId: record.scope.userId,
224
254
  sourceAgentId: record.provenance.sourceAgentId,
225
255
  workspaceId: record.scope.workspaceId,
226
256
  sessionKey: record.scope.sessionKey,
@@ -242,8 +272,41 @@ function preserveRecord(record, patch) {
242
272
  validFrom: record.validFrom,
243
273
  validTo: record.validTo,
244
274
  supersedesRecordId: record.supersedesRecordId,
245
- conflictGroupId: record.conflictGroupId,
246
- ...patch
275
+ conflictGroupId: record.conflictGroupId
276
+ };
277
+ }
278
+ function preserveRecord(record, patch) {
279
+ return upsertMemoryRecord({
280
+ ...memoryRecordInput(record),
281
+ ...patch,
282
+ id: record.id
283
+ });
284
+ }
285
+ function playbookVersionChain(records, recordId) {
286
+ const relatedIds = new Set([recordId]);
287
+ let previousSize = 0;
288
+ while (previousSize !== relatedIds.size) {
289
+ previousSize = relatedIds.size;
290
+ for (const record of records) {
291
+ if (!record.supersedesRecordId) continue;
292
+ if (relatedIds.has(record.id) || relatedIds.has(record.supersedesRecordId)) {
293
+ relatedIds.add(record.id);
294
+ relatedIds.add(record.supersedesRecordId);
295
+ }
296
+ }
297
+ }
298
+ return records.filter((record) => relatedIds.has(record.id) && playbookForRecord(record) !== void 0).sort((left, right) => Date.parse(right.updatedAt) - Date.parse(left.updatedAt));
299
+ }
300
+ function versionPlaybookRule(record, patch) {
301
+ return upsertMemoryRecord({
302
+ ...memoryRecordInput(record),
303
+ ...patch,
304
+ status: "active",
305
+ supersedesRecordId: record.id,
306
+ source: {
307
+ provider: "local",
308
+ path: "you://playbook/version"
309
+ }
247
310
  });
248
311
  }
249
312
  function registerYouRoutes(authenticated, deps) {
@@ -291,13 +354,14 @@ function registerYouRoutes(authenticated, deps) {
291
354
  }),
292
355
  conflictGroups: buildConflictGroups(allUserContextRecords),
293
356
  insights: buildInsightSuggestions(records),
294
- playbooks: buildPersonalPlaybooks(records.filter((record) => record.status === "active")),
357
+ playbooks: buildPersonalPlaybooks(allUserContextRecords),
295
358
  sources,
296
359
  sourceRecommendations: buildGoalSourceRecommendations(sourceDefinitions.filter((definition) => definition.capabilities.includes("context") || definition.capabilities.includes("memory_source")), new Set(sourceInstances.map((instance) => instance.connectorId)), activeGoals),
297
360
  controls: {
298
361
  mode: config.userContext.memory.mode,
299
362
  sensitiveWritePolicy: config.userContext.privacy.sensitiveWritePolicy
300
363
  },
364
+ relationship: getRelationshipSettings(),
301
365
  trust: {
302
366
  defaultActionLevel: trustPolicy.defaultActionLevel,
303
367
  levels: USER_TRUST_LEVELS,
@@ -305,6 +369,41 @@ function registerYouRoutes(authenticated, deps) {
305
369
  }
306
370
  });
307
371
  });
372
+ authenticated.patch("/api/you/relationship", deps.strictRateLimitMiddleware, async (c) => {
373
+ const body = await c.req.json().catch(() => null);
374
+ if (!body || typeof body !== "object" || Array.isArray(body)) return c.json({ error: "Invalid relationship settings" }, 400);
375
+ const input = body;
376
+ const patch = {};
377
+ if ("supportMode" in input) {
378
+ if (![
379
+ "efficient",
380
+ "coach",
381
+ "companion",
382
+ "auto"
383
+ ].includes(String(input.supportMode))) return c.json({ error: "Invalid supportMode" }, 400);
384
+ patch.supportMode = input.supportMode;
385
+ }
386
+ if ("proactiveEnabled" in input) {
387
+ if (typeof input.proactiveEnabled !== "boolean") return c.json({ error: "proactiveEnabled must be boolean" }, 400);
388
+ patch.proactiveEnabled = input.proactiveEnabled;
389
+ }
390
+ for (const field of ["quietStart", "quietEnd"]) {
391
+ if (!(field in input)) continue;
392
+ const value = input[field];
393
+ if (value !== null && (typeof value !== "string" || !/^([01]\d|2[0-3]):[0-5]\d$/.test(value))) return c.json({ error: `${field} must use HH:mm` }, 400);
394
+ patch[field] = value === null ? void 0 : String(value);
395
+ }
396
+ for (const field of ["allowedTopics", "blockedTopics"]) {
397
+ if (!(field in input)) continue;
398
+ if (!Array.isArray(input[field]) || input[field].length > 20 || input[field].some((value) => typeof value !== "string" || !value.trim() || value.length > 80)) return c.json({ error: `${field} must contain up to 20 short topics` }, 400);
399
+ patch[field] = [...new Set(input[field].map((value) => value.trim()))];
400
+ }
401
+ if (Object.keys(patch).length === 0) return c.json({ error: "No relationship settings provided" }, 400);
402
+ return c.json({
403
+ ok: true,
404
+ relationship: updateRelationshipSettings(patch)
405
+ });
406
+ });
308
407
  authenticated.get("/api/you/profile", async (c) => {
309
408
  return c.json(await readProfileBundle(deps.service.currentConfig));
310
409
  });
@@ -523,7 +622,7 @@ function registerYouRoutes(authenticated, deps) {
523
622
  limit: 500
524
623
  }).filter(isUserContextRecord).filter((record) => playbookForRecord(record) === id);
525
624
  runSqliteWriteTransaction(() => {
526
- for (const record of active) preserveRecord(record, { tags: patchPlaybookRuleTags(record, { enabled }) });
625
+ for (const record of active) versionPlaybookRule(record, { tags: patchPlaybookRuleTags(record, { enabled }) });
527
626
  });
528
627
  const current = active.map((record) => ({
529
628
  ...record,
@@ -540,6 +639,8 @@ function registerYouRoutes(authenticated, deps) {
540
639
  const body = await c.req.json().catch(() => ({}));
541
640
  const statement = typeof body.statement === "string" ? body.statement.trim() : "";
542
641
  if (!statement || statement.length > 5e3) return c.json({ error: "Rule statement is required" }, 400);
642
+ const parsedContext = parsePlaybookContext(body.context);
643
+ if ("error" in parsedContext) return c.json({ error: parsedContext.error }, 400);
543
644
  const record = upsertMemoryRecord({
544
645
  providerId: "local",
545
646
  kind: id === "communication" ? "preference" : id === "execution" ? "task_lesson" : "routine",
@@ -550,11 +651,11 @@ function registerYouRoutes(authenticated, deps) {
550
651
  path: "you://playbook"
551
652
  },
552
653
  confidence: 1,
553
- tags: [
654
+ tags: patchPersonalPlaybookContextTags([
554
655
  "user-understanding",
555
- "playbook:explicit",
556
- `${PLAYBOOK_ORDER_PREFIX}${Number.isInteger(body.order) ? body.order : 1e3}`
557
- ],
656
+ PERSONAL_PLAYBOOK_RULE_TAG,
657
+ `${PERSONAL_PLAYBOOK_ORDER_PREFIX}${Number.isInteger(body.order) ? body.order : 1e3}`
658
+ ], parsedContext.context),
558
659
  status: "active",
559
660
  sensitivity: "normal",
560
661
  explicitness: "explicit",
@@ -576,12 +677,14 @@ function registerYouRoutes(authenticated, deps) {
576
677
  if (!content || content.length > 5e3) return c.json({ error: "Rule statement is required" }, 400);
577
678
  if (body.enabled !== void 0 && typeof body.enabled !== "boolean") return c.json({ error: "enabled must be boolean" }, 400);
578
679
  if (body.order !== void 0 && (!Number.isInteger(body.order) || body.order < 0 || body.order > 1e4)) return c.json({ error: "order must be an integer between 0 and 10000" }, 400);
579
- const updated = preserveRecord(record, {
680
+ const parsedContext = parsePlaybookContext(body.context);
681
+ if ("error" in parsedContext) return c.json({ error: parsedContext.error }, 400);
682
+ const updated = versionPlaybookRule(record, {
580
683
  content,
581
- tags: patchPlaybookRuleTags(record, {
684
+ tags: patchPersonalPlaybookContextTags(patchPlaybookRuleTags(record, {
582
685
  enabled: body.enabled,
583
686
  order: body.order
584
- }),
687
+ }), parsedContext.context),
585
688
  explicitness: body.statement === void 0 ? record.explicitness : "explicit"
586
689
  });
587
690
  return c.json({
@@ -593,9 +696,32 @@ function registerYouRoutes(authenticated, deps) {
593
696
  const id = c.req.param("id");
594
697
  const record = editableRecord(c.req.param("recordId"));
595
698
  if (!PLAYBOOK_IDS.includes(id) || !record || playbookForRecord(record) !== id) return c.json({ error: "Playbook rule not found" }, 404);
596
- deleteMemoryRecord(record.id);
699
+ preserveRecord(record, {
700
+ status: "archived",
701
+ validTo: (/* @__PURE__ */ new Date()).toISOString()
702
+ });
597
703
  return c.json({ ok: true });
598
704
  });
705
+ authenticated.post("/api/you/playbooks/:id/rules/:recordId/rollback", deps.strictRateLimitMiddleware, async (c) => {
706
+ const id = c.req.param("id");
707
+ const current = editableRecord(c.req.param("recordId"));
708
+ if (!PLAYBOOK_IDS.includes(id) || !current || playbookForRecord(current) !== id) return c.json({ error: "Playbook rule not found" }, 404);
709
+ const body = await c.req.json().catch(() => ({}));
710
+ const versionId = typeof body.versionId === "string" ? body.versionId : "";
711
+ const all = listAllUserContextRecords(ALL_MEMORY_STATUSES);
712
+ const target = playbookVersionChain(all, current.id).find((record) => record.id === versionId);
713
+ if (!target || target.id === current.id) return c.json({ error: "Previous version not found" }, 404);
714
+ const rolledBack = versionPlaybookRule(current, {
715
+ content: target.content,
716
+ tags: target.tags,
717
+ evidence: target.evidence,
718
+ explicitness: "explicit"
719
+ });
720
+ return c.json({
721
+ ok: true,
722
+ rule: buildPersonalPlaybooks([...all, rolledBack]).find((playbook) => playbook.id === id)?.rules.find((rule) => rule.id === rolledBack.id)
723
+ });
724
+ });
599
725
  authenticated.patch("/api/you/insights/:id", deps.strictRateLimitMiddleware, async (c) => {
600
726
  const config = deps.service.currentConfig;
601
727
  const existing = editableRecord(c.req.param("id"));
@@ -622,6 +748,36 @@ function registerYouRoutes(authenticated, deps) {
622
748
  status: "drafting",
623
749
  href: buildRoutineAutomationDraftHref(existing)
624
750
  });
751
+ if (existing.kind === "task_lesson" || existing.kind === "derived_insight") {
752
+ upsertMemoryRecord({
753
+ providerId: "local",
754
+ kind: "task_lesson",
755
+ sourceAgentId: selectedAgentId(config),
756
+ content: existing.content,
757
+ source: {
758
+ provider: "local",
759
+ path: "you://insight-proposal"
760
+ },
761
+ confidence: 1,
762
+ tags: [
763
+ "user-understanding",
764
+ PERSONAL_PLAYBOOK_RULE_TAG,
765
+ `${PERSONAL_PLAYBOOK_ORDER_PREFIX}1000`
766
+ ],
767
+ status: "active",
768
+ sensitivity: existing.sensitivity,
769
+ explicitness: "explicit",
770
+ durability: "durable",
771
+ importance: existing.importance,
772
+ disclosurePolicy: existing.disclosurePolicy,
773
+ evidence: existing.evidence
774
+ });
775
+ preserveRecord(existing, { tags: [...new Set([...existing.tags ?? [], INSIGHT_ACCEPTED_TAG])] });
776
+ return c.json({
777
+ ok: true,
778
+ status: "saved"
779
+ });
780
+ }
625
781
  const title = existing.content.trim().split(/\r?\n/)[0].slice(0, 72);
626
782
  const uiLocale = body.uiLocale === "zh" ? "zh" : "en";
627
783
  const contractDraft = await draftGoalContract({
@@ -0,0 +1,40 @@
1
+ import { listImageGenerationProvidersSummary } from '../agent/image/generation/provider-registry.js';
2
+ import { type Config } from '../config/schema.js';
3
+ export type ImageGenerationSetupInput = {
4
+ providerId: string;
5
+ modelId?: string;
6
+ region?: 'cn' | 'intl';
7
+ baseUrl?: string;
8
+ };
9
+ export type ImageGenerationCatalogItem = ReturnType<typeof listImageGenerationProvidersSummary>[number] & {
10
+ configured: boolean;
11
+ requiresRegion: boolean;
12
+ };
13
+ export declare function getImageGenerationCatalog(config: Config): ImageGenerationCatalogItem[];
14
+ export declare function getAgentImageGenerationConfig(config: Config, agentIdRaw: string): {
15
+ agentId: string;
16
+ model: {
17
+ primary: string;
18
+ fallbacks?: string[];
19
+ timeoutMs?: number;
20
+ autoProviderFallback?: boolean;
21
+ };
22
+ };
23
+ export declare function prepareImageGenerationSetup(config: Config, agentIdRaw: string, input: ImageGenerationSetupInput): {
24
+ ok: true;
25
+ config: Config;
26
+ providerId: string;
27
+ modelId: string;
28
+ } | {
29
+ ok: false;
30
+ error: string;
31
+ };
32
+ export declare function verifyImageGenerationCredential(input: {
33
+ providerId: string;
34
+ apiKey: string;
35
+ baseUrl?: string;
36
+ }): Promise<{
37
+ verified: boolean;
38
+ supported: boolean;
39
+ message?: string;
40
+ }>;
@@ -0,0 +1,130 @@
1
+ import { ConfigSchema, init_schema } from "../config/schema.js";
2
+ import { init_agent_scope, normalizeAgentId } from "../agent/agent-scope.js";
3
+ import { resolveEffectiveAgentManifestForAgent } from "../config/agent-profile.js";
4
+ import { fetchWithTimeoutGuarded } from "../media-shared/http/provider-http.js";
5
+ import "../media-shared/http/index.js";
6
+ import { getImageGenerationProvider, listImageGenerationProvidersSummary } from "../agent/image/generation/provider-registry.js";
7
+ //#region src/gateway/image-generation-setup.ts
8
+ init_agent_scope();
9
+ init_schema();
10
+ function getImageGenerationCatalog(config) {
11
+ return listImageGenerationProvidersSummary().map((summary) => {
12
+ const provider = getImageGenerationProvider(summary.id);
13
+ return {
14
+ ...summary,
15
+ configured: provider.isConfigured({ cfg: config }),
16
+ requiresRegion: summary.id === "dashscope" || summary.id === "minimax"
17
+ };
18
+ });
19
+ }
20
+ function getAgentImageGenerationConfig(config, agentIdRaw) {
21
+ const agentId = normalizeAgentId(agentIdRaw);
22
+ if (!config.agents.list.some((entry) => entry.enabled !== false && normalizeAgentId(entry.id) === agentId)) throw new Error(`Agent not found: ${agentId}`);
23
+ return {
24
+ agentId,
25
+ model: resolveEffectiveAgentManifestForAgent(config, agentId).models.imageGenerationModel ?? null
26
+ };
27
+ }
28
+ function prepareImageGenerationSetup(config, agentIdRaw, input) {
29
+ const agentId = normalizeAgentId(agentIdRaw);
30
+ if (!config.agents.list.some((entry) => entry.enabled !== false && normalizeAgentId(entry.id) === agentId)) return {
31
+ ok: false,
32
+ error: `Agent not found: ${agentId}`
33
+ };
34
+ const providerId = input.providerId.trim();
35
+ const provider = getImageGenerationProvider(providerId);
36
+ if (!provider) return {
37
+ ok: false,
38
+ error: `Unknown image provider: ${providerId}`
39
+ };
40
+ const modelId = input.modelId?.trim() || provider.defaultModel;
41
+ if (!provider.models.includes(modelId)) return {
42
+ ok: false,
43
+ error: `Unknown ${providerId} image model: ${modelId}`
44
+ };
45
+ if ((providerId === "dashscope" || providerId === "minimax") && input.region !== "cn" && input.region !== "intl") return {
46
+ ok: false,
47
+ error: `${providerId} requires region "cn" or "intl"`
48
+ };
49
+ const next = structuredClone(config);
50
+ const index = next.agents.list.findIndex((entry) => entry.enabled !== false && normalizeAgentId(entry.id) === agentId);
51
+ if (index < 0) return {
52
+ ok: false,
53
+ error: `Agent not found: ${agentId}`
54
+ };
55
+ const connection = {
56
+ ...input.region ? { region: input.region } : {},
57
+ ...input.baseUrl?.trim() ? { baseUrl: input.baseUrl.trim() } : {}
58
+ };
59
+ next.providers = {
60
+ ...next.providers ?? {},
61
+ [providerId]: {
62
+ ...next.providers?.[providerId] ?? {},
63
+ ...connection
64
+ }
65
+ };
66
+ const entry = next.agents.list[index];
67
+ entry.models.imageGenerationModel = { primary: `${providerId}/${modelId}` };
68
+ const parsed = ConfigSchema.safeParse(next);
69
+ if (!parsed.success) return {
70
+ ok: false,
71
+ error: parsed.error.issues.map((issue) => issue.message).join("; ")
72
+ };
73
+ return {
74
+ ok: true,
75
+ config: next,
76
+ providerId,
77
+ modelId
78
+ };
79
+ }
80
+ async function verifyImageGenerationCredential(input) {
81
+ const apiKey = input.apiKey.trim();
82
+ if (!apiKey) return {
83
+ verified: false,
84
+ supported: true,
85
+ message: "API key is required"
86
+ };
87
+ if (!getImageGenerationProvider(input.providerId)) return {
88
+ verified: false,
89
+ supported: true,
90
+ message: `Unknown image provider: ${input.providerId}`
91
+ };
92
+ let url;
93
+ let headers = {};
94
+ if (input.providerId === "openai") {
95
+ url = `${input.baseUrl?.trim().replace(/\/+$/, "") || "https://api.openai.com/v1"}/models`;
96
+ headers = { Authorization: `Bearer ${apiKey}` };
97
+ } else if (input.providerId === "google") url = `${input.baseUrl?.trim().replace(/\/+$/, "") || "https://generativelanguage.googleapis.com"}/v1beta/models?pageSize=1&key=${encodeURIComponent(apiKey)}`;
98
+ else return {
99
+ verified: false,
100
+ supported: false
101
+ };
102
+ try {
103
+ const response = await fetchWithTimeoutGuarded(url, {
104
+ timeoutMs: 1e4,
105
+ label: `${input.providerId} credential verification`,
106
+ allowPrivateNetwork: false,
107
+ init: {
108
+ headers,
109
+ redirect: "error"
110
+ }
111
+ });
112
+ if (response.ok) return {
113
+ verified: true,
114
+ supported: true
115
+ };
116
+ return {
117
+ verified: false,
118
+ supported: true,
119
+ message: `Provider returned HTTP ${response.status}`
120
+ };
121
+ } catch (error) {
122
+ return {
123
+ verified: false,
124
+ supported: true,
125
+ message: error instanceof Error ? error.message : String(error)
126
+ };
127
+ }
128
+ }
129
+ //#endregion
130
+ export { getAgentImageGenerationConfig, getImageGenerationCatalog, prepareImageGenerationSetup, verifyImageGenerationCredential };
@@ -35,6 +35,7 @@ declare class BucketRegistry {
35
35
  private authFailureLimiter?;
36
36
  private authFailureSignature?;
37
37
  private strictApiLimiter?;
38
+ private xopcCloudPollLimiter?;
38
39
  private channelApiLimiter?;
39
40
  private tunnelMutateLimiter?;
40
41
  private pairingExchangeLimiter?;
@@ -48,6 +49,8 @@ declare class BucketRegistry {
48
49
  authFailure(cfg: ResolvedAuthRateLimitConfig): FailureLimiter;
49
50
  /** Sensitive admin / mutation endpoints — 15 req / 60 s per client IP. */
50
51
  strictApi(): RateLimiter;
52
+ /** XOPC Cloud authorization polling — 60 req / 60 s per client IP. */
53
+ xopcCloudPoll(): RateLimiter;
51
54
  /** Channel mutation/action endpoints — 20 req / 60 s per client IP. */
52
55
  channelApi(): RateLimiter;
53
56
  /** Tunnel mutation calls — 12 req / 5 min per gateway-token fingerprint. */
@@ -47,6 +47,7 @@ var BucketRegistry = class {
47
47
  authFailureLimiter;
48
48
  authFailureSignature;
49
49
  strictApiLimiter;
50
+ xopcCloudPollLimiter;
50
51
  channelApiLimiter;
51
52
  tunnelMutateLimiter;
52
53
  pairingExchangeLimiter;
@@ -79,6 +80,14 @@ var BucketRegistry = class {
79
80
  });
80
81
  return this.strictApiLimiter;
81
82
  }
83
+ /** XOPC Cloud authorization polling — 60 req / 60 s per client IP. */
84
+ xopcCloudPoll() {
85
+ if (!this.xopcCloudPollLimiter) this.xopcCloudPollLimiter = new RateLimiter({
86
+ maxRequests: 60,
87
+ windowMs: 6e4
88
+ });
89
+ return this.xopcCloudPollLimiter;
90
+ }
82
91
  /** Channel mutation/action endpoints — 20 req / 60 s per client IP. */
83
92
  channelApi() {
84
93
  if (!this.channelApiLimiter) this.channelApiLimiter = new RateLimiter({
@@ -123,6 +132,7 @@ var BucketRegistry = class {
123
132
  destroyAll() {
124
133
  this.authFailureLimiter?.destroy();
125
134
  this.strictApiLimiter?.destroy();
135
+ this.xopcCloudPollLimiter?.destroy();
126
136
  this.channelApiLimiter?.destroy();
127
137
  this.tunnelMutateLimiter?.destroy();
128
138
  this.pairingExchangeLimiter?.destroy();
@@ -130,6 +140,7 @@ var BucketRegistry = class {
130
140
  this.sharePublicLongLimiter?.destroy();
131
141
  this.authFailureLimiter = void 0;
132
142
  this.strictApiLimiter = void 0;
143
+ this.xopcCloudPollLimiter = void 0;
133
144
  this.channelApiLimiter = void 0;
134
145
  this.tunnelMutateLimiter = void 0;
135
146
  this.pairingExchangeLimiter = void 0;
@@ -141,6 +152,7 @@ var BucketRegistry = class {
141
152
  resetAllForTests() {
142
153
  this.authFailureLimiter?.resetForTests();
143
154
  this.strictApiLimiter?.resetForTests();
155
+ this.xopcCloudPollLimiter?.resetForTests();
144
156
  this.channelApiLimiter?.resetForTests();
145
157
  this.tunnelMutateLimiter?.resetForTests();
146
158
  this.pairingExchangeLimiter?.resetForTests();