@xopcai/xopc 0.0.191 → 0.0.193

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 (348) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-DstnJCS5.js → activity-store-BwmdJ5pv.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DvEkT222.js → agent-avatar-dicebear-DmNq0t2n.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-BOo1rVn9.js +68 -0
  6. package/dist/gateway/static/root/assets/{api-BTL9kayv.js → api-BM1hNzjw.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-COpP_pKN.js → app-management-settings-panel-B3xStqSX.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-DTVNUEDq.js → appearance-settings-DglyenDq.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-DC9qPFTx.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-IpX6VA0o.js → archive-plugin-DvtcrBss.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-CKVFNUi1.js → attachment-load-CALdq4xM.js} +1 -1
  12. package/dist/gateway/static/root/assets/automations-page-BIGGKb0T.js +6 -0
  13. package/dist/gateway/static/root/assets/{binary-plugins-BrfvfOS4.js → binary-plugins-GaVuvrDI.js} +1 -1
  14. package/dist/gateway/static/root/assets/{block-editor-D9sEfg32.js → block-editor-C2KrMYa_.js} +4 -4
  15. package/dist/gateway/static/root/assets/browser-settings-page-CPW_E-xj.js +8 -0
  16. package/dist/gateway/static/root/assets/{browser-workflow-inputs-BixZ5lCR.js → browser-workflow-inputs-FfEEjhIS.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflows-page-YEFuodJI.js → browser-workflows-page-DFP9_UQk.js} +2 -2
  18. package/dist/gateway/static/root/assets/capabilities-settings-panel-CsD8aGHU.js +7 -0
  19. package/dist/gateway/static/root/assets/capability-presets-api-BoOzFotX.js +1 -0
  20. package/dist/gateway/static/root/assets/capability-presets-settings-panel-NCeyWH6Z.js +3 -0
  21. package/dist/gateway/static/root/assets/{channel-recipient-api-BThDGiO3.js → channel-recipient-api-_8IiTxRB.js} +1 -1
  22. package/dist/gateway/static/root/assets/channels-settings-CknzwxNC.js +1 -0
  23. package/dist/gateway/static/root/assets/channels-status-swr-DPaJSYX_.js +1 -0
  24. package/dist/gateway/static/root/assets/{code-editor-D4_k-6QN.js → code-editor-dFzqyDXS.js} +1 -1
  25. package/dist/gateway/static/root/assets/{connectors-api-BMMqC0_9.js → connectors-api-vaSrhPF8.js} +1 -1
  26. package/dist/gateway/static/root/assets/connectors-page-DEGE7xp_.js +2 -0
  27. package/dist/gateway/static/root/assets/{cron-expression-Bm8koRoD.js → cron-expression-BjFuXlGY.js} +1 -1
  28. package/dist/gateway/static/root/assets/dependency-picker-DOdkHdPv.js +1 -0
  29. package/dist/gateway/static/root/assets/{desktop-pet-CMG3mcaJ.js → desktop-pet-Dz-Yf8Uu.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-settings-D8aaPb0x.js → desktop-pet-settings-C8EHFEtd.js} +1 -1
  31. package/dist/gateway/static/root/assets/{directory-picker-path-field-C95yW03b.js → directory-picker-path-field-DKbfmZlZ.js} +1 -1
  32. package/dist/gateway/static/root/assets/{extension-debug-page-DsG7Z9lV.js → extension-debug-page-Dq0xsr_e.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-page-CUAXEbAt.js → extension-page-IgSLUyWP.js} +1 -1
  34. package/dist/gateway/static/root/assets/extension-settings-page-VC-8Pjn2.js +1 -0
  35. package/dist/gateway/static/root/assets/{gateway-config-api-DL70Nakc.js → gateway-config-api-CH2R7yqo.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-settings-BgDxQ08c.js → gateway-settings-DLQJWaBQ.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-startup-retry-EO9mKvzE.js → gateway-startup-retry--2njcDpC.js} +1 -1
  38. package/dist/gateway/static/root/assets/{heartbeat-settings-BX7q55uZ.js → heartbeat-settings-43loWoGb.js} +1 -1
  39. package/dist/gateway/static/root/assets/home-page-DqvpI6LC.js +3 -0
  40. package/dist/gateway/static/root/assets/html-workspace-editor-bXK5tq64.js +1 -0
  41. package/dist/gateway/static/root/assets/{image-generation-api-Bu7PyVSh.js → image-generation-api-Cki7jfEV.js} +1 -1
  42. package/dist/gateway/static/root/assets/index-BpkdvHH0.js +150 -0
  43. package/dist/gateway/static/root/assets/index-CFVjH-EK.css +1 -0
  44. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-Dt6wS5zW.js → keyboard-shortcuts-settings-DJDZes_8.js} +1 -1
  45. package/dist/gateway/static/root/assets/local-app-workbench-page-CvNQM6qm.js +2 -0
  46. package/dist/gateway/static/root/assets/{local-apps-page-DcD3-N00.js → local-apps-page-C2ajOn1D.js} +1 -1
  47. package/dist/gateway/static/root/assets/{locale-store-deR2zRaE.js → locale-store-Bjvw7jtg.js} +1 -1
  48. package/dist/gateway/static/root/assets/logs-page-BLm5yWqQ.js +2 -0
  49. package/dist/gateway/static/root/assets/{management-settings-B6EVkJQy.js → management-settings--_eXnFVr.js} +1 -1
  50. package/dist/gateway/static/root/assets/{markdown-editor-BvUebh3C.js → markdown-editor-TWGaF7Xa.js} +2 -2
  51. package/dist/gateway/static/root/assets/{markdown-split-CHUjCnBh.js → markdown-split-iL2oi-x2.js} +1 -1
  52. package/dist/gateway/static/root/assets/{media-plugins-DRrtI2O0.js → media-plugins-BIbkLVpQ.js} +1 -1
  53. package/dist/gateway/static/root/assets/messages-DQ5X6cXp.js +3 -0
  54. package/dist/gateway/static/root/assets/{notes-page-fermYvpI.js → notes-page-xFxaZ6gT.js} +1 -1
  55. package/dist/gateway/static/root/assets/notes-workbench-PAftxL3V.js +4 -0
  56. package/dist/gateway/static/root/assets/{page-tabs-BO262zuu.js → page-tabs-CROi9zm1.js} +1 -1
  57. package/dist/gateway/static/root/assets/{preview-open-alternatives-yZYTy-2e.js → preview-open-alternatives-BwYcPjOM.js} +1 -1
  58. package/dist/gateway/static/root/assets/{product-open-page-Dgy8XWhR.js → product-open-page-BezeuVFd.js} +1 -1
  59. package/dist/gateway/static/root/assets/project-detail-page-CCdfZcw-.js +1 -0
  60. package/dist/gateway/static/root/assets/projects-page-DOG9zm5e.js +1 -0
  61. package/dist/gateway/static/root/assets/remote-access-hub-DQBFgveI.js +1 -0
  62. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-Bs6tpSyX.js +5 -0
  63. package/dist/gateway/static/root/assets/{schema-form-DdE4gtw_.js → schema-form-CWoSjz9s.js} +1 -1
  64. package/dist/gateway/static/root/assets/sessions-page-Db6L6M2H.js +1 -0
  65. package/dist/gateway/static/root/assets/settings-advanced-gate-CcO2bd6q.js +1 -0
  66. package/dist/gateway/static/root/assets/{settings-form-section-CiYU8AvV.js → settings-form-section-BJaMEHsX.js} +1 -1
  67. package/dist/gateway/static/root/assets/{settings-loading-skeleton-Bv03cWib.js → settings-loading-skeleton-sn4k17x7.js} +1 -1
  68. package/dist/gateway/static/root/assets/settings-page-D2hfeFPX.js +1 -0
  69. package/dist/gateway/static/root/assets/{settings-page-layout-t_Ox1slk.js → settings-page-layout-CLtUsWsu.js} +1 -1
  70. package/dist/gateway/static/root/assets/setup-status-panel-UmQC_uZ1.js +1 -0
  71. package/dist/gateway/static/root/assets/{share-preview-page-DF8gW6bo.js → share-preview-page-BJ58AluH.js} +1 -1
  72. package/dist/gateway/static/root/assets/shares-settings-BZKn6Fdc.js +1 -0
  73. package/dist/gateway/static/root/assets/skill-reload-api-Cx3i24w_.js +1 -0
  74. package/dist/gateway/static/root/assets/skills-page-DjUllGtk.js +2 -0
  75. package/dist/gateway/static/root/assets/skills-page.utils-CZYIuE26.js +1 -0
  76. package/dist/gateway/static/root/assets/style-TIDOdKy0.js +7 -0
  77. package/dist/gateway/static/root/assets/system-settings-panel-DUrgdQMk.js +1 -0
  78. package/dist/gateway/static/root/assets/task-detail-page-BGG2cFe9.js +1 -0
  79. package/dist/gateway/static/root/assets/{theme-store-DnBOcGXi.js → theme-store-DtxpMC5S.js} +1 -1
  80. package/dist/gateway/static/root/assets/{typed-models-lib-4XBsLEuv.js → typed-models-lib-CRNMvvFX.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-autosave-BN2QgFGn.js → use-autosave-Dle3-zdQ.js} +1 -1
  82. package/dist/gateway/static/root/assets/user-context-page-BLLmw5S1.js +1 -0
  83. package/dist/gateway/static/root/assets/{vendor-codemirror--gTq3YAI.js → vendor-codemirror-DRr7hFaD.js} +16 -16
  84. package/dist/gateway/static/root/assets/voice-api-key-field-BrWH0dCl.js +1 -0
  85. package/dist/gateway/static/root/assets/{work-discovery-overlay-nmEAafFl.js → work-discovery-overlay-BZ1l9CFM.js} +1 -1
  86. package/dist/gateway/static/root/assets/work-discovery-page-BnPF2vx7.js +1 -0
  87. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BnNWBDwz.js → workflow-run-setup-panel-BK6e9yzK.js} +2 -2
  88. package/dist/gateway/static/root/assets/workflows-page-Bp5JxQJa.js +5 -0
  89. package/dist/gateway/static/root/index.html +7 -7
  90. package/dist/gateway/static/root/notification-sw.js +15 -0
  91. package/dist/package.js +1 -1
  92. package/dist/src/agent/agent-manager.d.ts +2 -0
  93. package/dist/src/agent/agent-manager.js +76 -0
  94. package/dist/src/agent/background-review/prompts.d.ts +1 -1
  95. package/dist/src/agent/background-review/prompts.js +1 -1
  96. package/dist/src/agent/background-review/run-background-review.js +3 -12
  97. package/dist/src/agent/embedded/run-for-session.js +3 -0
  98. package/dist/src/agent/embedded/run-turn.js +4 -1
  99. package/dist/src/agent/embedded/session-runner.js +3 -4
  100. package/dist/src/agent/embedded/types.d.ts +10 -1
  101. package/dist/src/agent/embedded/xopc-stream-bridge.js +3 -2
  102. package/dist/src/agent/external-tools/mcp-provider.d.ts +1 -0
  103. package/dist/src/agent/external-tools/mcp-provider.js +21 -6
  104. package/dist/src/agent/image/generation/provider-registry.js +1 -0
  105. package/dist/src/agent/image/generation/providers/dashscope.js +20 -0
  106. package/dist/src/agent/image/generation/providers/fal.d.ts +1 -1
  107. package/dist/src/agent/image/generation/providers/fal.js +12 -6
  108. package/dist/src/agent/image/generation/providers/google.js +8 -0
  109. package/dist/src/agent/image/generation/providers/minimax.js +20 -0
  110. package/dist/src/agent/image/generation/providers/openai.js +36 -26
  111. package/dist/src/agent/image/generation/types.d.ts +13 -0
  112. package/dist/src/agent/mcp/bundle-mcp-gateway.d.ts +1 -0
  113. package/dist/src/agent/mcp/bundle-mcp-gateway.js +2 -1
  114. package/dist/src/agent/mcp/bundle-mcp-policy.d.ts +5 -1
  115. package/dist/src/agent/mcp/bundle-mcp-policy.js +11 -3
  116. package/dist/src/agent/mcp/bundle-mcp-runtime.js +3 -2
  117. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +2 -1
  118. package/dist/src/agent/mcp/index.js +2 -2
  119. package/dist/src/agent/mcp/mcp-stdio-transport.js +1 -1
  120. package/dist/src/agent/mcp/mcp-transport.d.ts +2 -1
  121. package/dist/src/agent/mcp/mcp-transport.js +22 -4
  122. package/dist/src/agent/memory/compaction.js +19 -17
  123. package/dist/src/agent/memory/context-budget.js +2 -3
  124. package/dist/src/agent/memory/understanding/service.d.ts +1 -0
  125. package/dist/src/agent/memory/understanding/service.js +49 -20
  126. package/dist/src/agent/memory/understanding/types.d.ts +1 -0
  127. package/dist/src/agent/memory/user-context-coordinator.js +6 -0
  128. package/dist/src/agent/orchestration/agent-orchestrator.js +15 -1
  129. package/dist/src/agent/service/direct-turn-helpers.js +14 -5
  130. package/dist/src/agent/skills/index.d.ts +1 -1
  131. package/dist/src/agent/skills/index.js +2 -2
  132. package/dist/src/agent/skills/installer.d.ts +3 -10
  133. package/dist/src/agent/skills/installer.js +99 -156
  134. package/dist/src/agent/skills/marketplace/adapter.types.d.ts +3 -1
  135. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +30 -6
  136. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +21 -4
  137. package/dist/src/agent/skills/marketplace/adapters/store/adapter.js +7 -4
  138. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.d.ts +3 -0
  139. package/dist/src/agent/skills/marketplace/adapters/store/store-api-client.js +7 -1
  140. package/dist/src/agent/skills/marketplace/search.d.ts +2 -2
  141. package/dist/src/agent/skills/marketplace/search.js +52 -21
  142. package/dist/src/agent/skills/skills-marketplace.d.ts +1 -1
  143. package/dist/src/agent/skills/skills-marketplace.js +2 -2
  144. package/dist/src/agent/skills/types.d.ts +0 -8
  145. package/dist/src/agent/tools/exec-command.d.ts +1 -0
  146. package/dist/src/agent/tools/exec-command.js +2 -1
  147. package/dist/src/agent/tools/factory.d.ts +1 -0
  148. package/dist/src/agent/tools/factory.js +17 -2
  149. package/dist/src/agent/tools/managed-job-tool.d.ts +1 -1
  150. package/dist/src/agent/tools/managed-job-tool.js +3 -2
  151. package/dist/src/agent/tools/skill-install-tool.d.ts +2 -2
  152. package/dist/src/agent/tools/skill-install-tool.js +8 -4
  153. package/dist/src/agent/tools/skills-marketplace-search-tool.js +3 -2
  154. package/dist/src/agent/tools/workflow-tool.d.ts +1 -0
  155. package/dist/src/agent/tools/workflow-tool.js +14 -4
  156. package/dist/src/agent-manifest/schema.d.ts +20 -0
  157. package/dist/src/agent-manifest/schema.js +6 -1
  158. package/dist/src/auth/oauth/xopc-cloud.js +163 -7
  159. package/dist/src/browser/providers/cloakbrowser.js +1 -1
  160. package/dist/src/cli/command-loaders.js +1 -0
  161. package/dist/src/cli/command-manifest.js +4 -0
  162. package/dist/src/cli/commands/doctor/checks/node-version.js +3 -3
  163. package/dist/src/cli/commands/doctor/checks/tool-runtimes.d.ts +2 -0
  164. package/dist/src/cli/commands/doctor/checks/tool-runtimes.js +36 -0
  165. package/dist/src/cli/commands/doctor/flow.js +2 -0
  166. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  167. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  168. package/dist/src/cli/commands/models.js +0 -1
  169. package/dist/src/cli/commands/onboard/model.d.ts +16 -1
  170. package/dist/src/cli/commands/onboard/model.js +65 -4
  171. package/dist/src/cli/commands/onboard.js +13 -1
  172. package/dist/src/cli/commands/runtime.d.ts +1 -0
  173. package/dist/src/cli/commands/runtime.js +77 -0
  174. package/dist/src/cli/commands/setup.js +15 -1
  175. package/dist/src/cli/commands/skills.js +7 -4
  176. package/dist/src/cli/commands/update.js +1 -1
  177. package/dist/src/config/index.js +2 -2
  178. package/dist/src/config/schema.d.ts +125 -0
  179. package/dist/src/config/schema.js +77 -2
  180. package/dist/src/config/voice.d.ts +6 -0
  181. package/dist/src/config/voice.js +17 -0
  182. package/dist/src/extensions/install.js +1 -1
  183. package/dist/src/extensions/types/providers.d.ts +4 -0
  184. package/dist/src/gateway/capability-presets-admin.d.ts +9 -0
  185. package/dist/src/gateway/capability-presets-admin.js +24 -6
  186. package/dist/src/gateway/chat-stream/mapper.js +8 -4
  187. package/dist/src/gateway/chat-stream/protocol.d.ts +10 -1
  188. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -0
  189. package/dist/src/gateway/hono/routes/commands-skills.js +2 -1
  190. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  191. package/dist/src/gateway/hono/routes/local-apps.js +1 -1
  192. package/dist/src/gateway/hono/routes/models.js +2 -3
  193. package/dist/src/gateway/hono/routes/runtime-tools.d.ts +3 -0
  194. package/dist/src/gateway/hono/routes/runtime-tools.js +142 -0
  195. package/dist/src/gateway/hono/routes/understanding-sources.js +2 -1
  196. package/dist/src/gateway/hono/routes/update.js +2 -2
  197. package/dist/src/gateway/hono/routes/voice.js +43 -2
  198. package/dist/src/gateway/hono/routes/you.js +22 -25
  199. package/dist/src/gateway/image-generation-setup.d.ts +2 -3
  200. package/dist/src/gateway/image-generation-setup.js +39 -8
  201. package/dist/src/gateway/index.js +1 -1
  202. package/dist/src/gateway/run-loop.js +1 -1
  203. package/dist/src/gateway/service/marketplace-service.d.ts +1 -1
  204. package/dist/src/gateway/service/marketplace-service.js +2 -2
  205. package/dist/src/gateway/service/run-gateway-agent.js +21 -8
  206. package/dist/src/gateway/service.js +5 -5
  207. package/dist/src/infra/gateway-processes.js +1 -1
  208. package/dist/src/infra/update-global.js +1 -1
  209. package/dist/src/infra/update-restart.js +1 -1
  210. package/dist/src/infra/update-runner.js +2 -2
  211. package/dist/src/infra/update-startup.js +1 -1
  212. package/dist/src/providers/extension-stream-bridge.js +8 -7
  213. package/dist/src/providers/model-catalog-store.d.ts +24 -4
  214. package/dist/src/providers/model-catalog-store.js +11 -0
  215. package/dist/src/providers/model-registry.js +1 -1
  216. package/dist/src/providers/prompt-cache-payload.d.ts +13 -0
  217. package/dist/src/providers/prompt-cache-payload.js +110 -0
  218. package/dist/src/providers/register-runtime-providers.js +1 -1
  219. package/dist/src/providers/xopc-cloud-model-source.js +52 -6
  220. package/dist/src/runtime-tools/archive.d.ts +8 -0
  221. package/dist/src/runtime-tools/archive.js +99 -0
  222. package/dist/src/runtime-tools/bootstrap.d.ts +16 -0
  223. package/dist/src/runtime-tools/bootstrap.js +33 -0
  224. package/dist/src/runtime-tools/catalog.d.ts +19 -0
  225. package/dist/src/runtime-tools/catalog.js +59 -0
  226. package/dist/src/runtime-tools/command.d.ts +15 -0
  227. package/dist/src/runtime-tools/command.js +59 -0
  228. package/dist/src/runtime-tools/download-source.d.ts +24 -0
  229. package/dist/src/runtime-tools/download-source.js +125 -0
  230. package/dist/src/runtime-tools/downloader.d.ts +21 -0
  231. package/dist/src/runtime-tools/downloader.js +137 -0
  232. package/dist/src/runtime-tools/environment.d.ts +20 -0
  233. package/dist/src/runtime-tools/environment.js +113 -0
  234. package/dist/src/runtime-tools/errors.d.ts +10 -0
  235. package/dist/src/runtime-tools/errors.js +14 -0
  236. package/dist/src/runtime-tools/index.d.ts +7 -0
  237. package/dist/src/runtime-tools/index.js +7 -0
  238. package/dist/src/runtime-tools/install-lock.d.ts +1 -0
  239. package/dist/src/runtime-tools/install-lock.js +50 -0
  240. package/dist/src/runtime-tools/manager.d.ts +20 -0
  241. package/dist/src/runtime-tools/manager.js +641 -0
  242. package/dist/src/runtime-tools/manifest-store.d.ts +3 -0
  243. package/dist/src/runtime-tools/manifest-store.js +26 -0
  244. package/dist/src/runtime-tools/network.d.ts +9 -0
  245. package/dist/src/runtime-tools/network.js +41 -0
  246. package/dist/src/runtime-tools/offline-bundle.d.ts +16 -0
  247. package/dist/src/runtime-tools/offline-bundle.js +41 -0
  248. package/dist/src/runtime-tools/paths.d.ts +7 -0
  249. package/dist/src/runtime-tools/paths.js +22 -0
  250. package/dist/src/runtime-tools/probe.d.ts +7 -0
  251. package/dist/src/runtime-tools/probe.js +71 -0
  252. package/dist/src/runtime-tools/prune.d.ts +10 -0
  253. package/dist/src/runtime-tools/prune.js +93 -0
  254. package/dist/src/runtime-tools/types.d.ts +70 -0
  255. package/dist/src/runtime-tools/types.js +1 -0
  256. package/dist/src/share/share-zip.js +1 -1
  257. package/dist/src/storage/sqlite/migrations/113_memory_evidence_single_source.sql +42 -20
  258. package/dist/src/tasks/home-query-service.js +1 -5
  259. package/dist/src/tasks/index.js +2 -2
  260. package/dist/src/tasks/project-operating-view-service.d.ts +2 -1
  261. package/dist/src/tasks/project-operating-view-service.js +6 -4
  262. package/dist/src/tasks/task-dependency-service.d.ts +2 -1
  263. package/dist/src/tasks/task-dependency-service.js +15 -0
  264. package/dist/src/tui/backends/gateway-realtime-backend.js +1 -1
  265. package/dist/src/tunnel/frpc-binary.js +1 -1
  266. package/dist/src/user-context/domain.d.ts +2 -1
  267. package/dist/src/user-context/domain.js +12 -1
  268. package/dist/src/user-context/manual-understanding.js +8 -10
  269. package/dist/src/user-context/planner.js +1 -6
  270. package/dist/src/user-context/sources/activity-clustering.d.ts +5 -0
  271. package/dist/src/user-context/sources/activity-clustering.js +130 -0
  272. package/dist/src/user-context/sources/catalog.js +26 -0
  273. package/dist/src/user-context/sources/local-source-contract.d.ts +3 -0
  274. package/dist/src/user-context/sources/local-source-contract.js +15 -0
  275. package/dist/src/user-context/sources/repository.js +7 -1
  276. package/dist/src/user-context/sources/types.d.ts +7 -1
  277. package/dist/src/user-context/understanding.d.ts +15 -0
  278. package/dist/src/user-context/understanding.js +24 -0
  279. package/dist/src/voice/local/model-files.js +1 -1
  280. package/dist/src/voice/metadata/builtin.js +99 -32
  281. package/dist/src/voice/metadata/types.d.ts +3 -0
  282. package/dist/src/voice/stt/availability.js +4 -1
  283. package/dist/src/voice/stt/config-slice.d.ts +0 -2
  284. package/dist/src/voice/stt/config-slice.js +1 -6
  285. package/dist/src/voice/stt/factory.js +2 -2
  286. package/dist/src/voice/stt/index.d.ts +2 -3
  287. package/dist/src/voice/stt/list-providers.js +1 -1
  288. package/dist/src/voice/stt/providers/alibaba-transcription.d.ts +0 -19
  289. package/dist/src/voice/stt/providers/alibaba-transcription.js +59 -132
  290. package/dist/src/voice/stt/providers/index.d.ts +1 -0
  291. package/dist/src/voice/stt/providers/index.js +2 -1
  292. package/dist/src/voice/stt/providers/openai-transcription.d.ts +2 -2
  293. package/dist/src/voice/stt/providers/openai-transcription.js +4 -4
  294. package/dist/src/voice/stt/providers/xopc-cloud-transcription.d.ts +2 -0
  295. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +49 -0
  296. package/dist/src/voice/stt/types.js +2 -2
  297. package/dist/src/voice/tts/providers/index.d.ts +1 -0
  298. package/dist/src/voice/tts/providers/index.js +2 -1
  299. package/dist/src/voice/tts/providers/xopc-cloud-speech.d.ts +2 -0
  300. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +113 -0
  301. package/dist/src/voice/tts/types.d.ts +1 -1
  302. package/dist/src/work-discovery/analyzer.js +9 -4
  303. package/dist/src/work-discovery/candidate-discovery.d.ts +1 -0
  304. package/dist/src/work-discovery/candidate-discovery.js +3 -3
  305. package/dist/src/work-discovery/index.js +2 -2
  306. package/dist/src/work-discovery/service.d.ts +2 -1
  307. package/dist/src/work-discovery/service.js +126 -37
  308. package/dist/src/work-discovery/types.d.ts +1 -0
  309. package/dist/src/workflows/service/workflow-run-service.js +8 -0
  310. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -1
  311. package/package.json +2 -2
  312. package/dist/gateway/static/root/assets/agents-CXyivfqY.js +0 -68
  313. package/dist/gateway/static/root/assets/apps-page-DsE67BSO.js +0 -1
  314. package/dist/gateway/static/root/assets/automations-page-D0TVev47.js +0 -6
  315. package/dist/gateway/static/root/assets/browser-settings-page-DpZzq8j2.js +0 -8
  316. package/dist/gateway/static/root/assets/capabilities-settings-panel-B9Cmcuff.js +0 -7
  317. package/dist/gateway/static/root/assets/capability-presets-api-BB8t4Ja7.js +0 -1
  318. package/dist/gateway/static/root/assets/capability-presets-settings-panel-C_EpuQtk.js +0 -1
  319. package/dist/gateway/static/root/assets/channels-settings-CvzD5qSv.js +0 -1
  320. package/dist/gateway/static/root/assets/channels-status-swr-Cz7SAAkm.js +0 -1
  321. package/dist/gateway/static/root/assets/connectors-page-BKrm7tJ9.js +0 -2
  322. package/dist/gateway/static/root/assets/extension-settings-page-CsR7QOJo.js +0 -1
  323. package/dist/gateway/static/root/assets/home-page-C08Nen5T.js +0 -3
  324. package/dist/gateway/static/root/assets/html-workspace-editor-C3DKAkMc.js +0 -1
  325. package/dist/gateway/static/root/assets/index-B-_CEvIX.js +0 -150
  326. package/dist/gateway/static/root/assets/index-D6e3tPL-.css +0 -1
  327. package/dist/gateway/static/root/assets/local-app-workbench-page-BQVC0tWq.js +0 -2
  328. package/dist/gateway/static/root/assets/logs-page-D6yvW-E4.js +0 -2
  329. package/dist/gateway/static/root/assets/messages-B4XqB8I6.js +0 -3
  330. package/dist/gateway/static/root/assets/notes-workbench-BVCwabjq.js +0 -4
  331. package/dist/gateway/static/root/assets/project-detail-page-CS4Ujor7.js +0 -1
  332. package/dist/gateway/static/root/assets/projects-page-DMtPC8c4.js +0 -1
  333. package/dist/gateway/static/root/assets/remote-access-hub-BpfHZT88.js +0 -1
  334. package/dist/gateway/static/root/assets/sessions-page-BZkyrJBM.js +0 -1
  335. package/dist/gateway/static/root/assets/settings-advanced-gate-DQlK0A4l.js +0 -1
  336. package/dist/gateway/static/root/assets/settings-page-C-LdINFj.js +0 -1
  337. package/dist/gateway/static/root/assets/setup-status-panel-HRG_lK4_.js +0 -1
  338. package/dist/gateway/static/root/assets/shares-settings-v_iLhxxa.js +0 -1
  339. package/dist/gateway/static/root/assets/skill-reload-api-S-bjtsXX.js +0 -1
  340. package/dist/gateway/static/root/assets/skills-page-BiNBfaX5.js +0 -2
  341. package/dist/gateway/static/root/assets/skills-page.utils-DlnGtvAH.js +0 -1
  342. package/dist/gateway/static/root/assets/system-settings-panel-Bv7GXFc6.js +0 -1
  343. package/dist/gateway/static/root/assets/task-detail-page-BhQcOpnx.js +0 -1
  344. package/dist/gateway/static/root/assets/user-context-page-PtcY7BoJ.js +0 -1
  345. package/dist/gateway/static/root/assets/voice-api-key-field-DnhJtC5l.js +0 -1
  346. package/dist/gateway/static/root/assets/work-discovery-page-C5Kwe_bc.js +0 -1
  347. package/dist/gateway/static/root/assets/workflows-page-Z_qzaohv.js +0 -11
  348. /package/dist/gateway/static/root/assets/{workflows-page-DLioOiRN.css → style-DLioOiRN.css} +0 -0
@@ -1,20 +1,12 @@
1
1
  import { listContextConsolidationRuns } from "../../../storage/sqlite/context-consolidation-repository.js";
2
+ import { UNDERSTANDING_KINDS } from "../../../user-context/domain.js";
3
+ import { summarizeUserUnderstandingQuality } from "../../../storage/sqlite/user-context-quality-repository.js";
2
4
  import { createCollaborationRule, createUnderstanding, decideContextConsent, deleteCollaborationRule, deleteUnderstanding, getCollaborationRule, getTurnPersonalization, getUnderstanding, getUserProfile, listCollaborationRules, listUnderstandingEvidence, listUnderstandings, recordContextFeedback, rejectUnderstanding, reviseCollaborationRule, reviseUnderstanding, setCollaborationRuleStatus, setUnderstandingStatus, updateUserProfile } from "../../../storage/sqlite/user-context-repository.js";
3
5
  import "../../../storage/sqlite/index.js";
6
+ import { canonicalUnderstandingKey, findDuplicateUnderstanding } from "../../../user-context/understanding.js";
4
7
  import { userInfo } from "node:os";
5
- import { createHash } from "node:crypto";
6
8
  //#region src/gateway/hono/routes/you.ts
7
- const UNDERSTANDING_KINDS = new Set([
8
- "preference",
9
- "boundary",
10
- "relationship",
11
- "routine",
12
- "current_state",
13
- "long_term_goal",
14
- "project_context",
15
- "task_lesson",
16
- "derived_insight"
17
- ]);
9
+ const UNDERSTANDING_KIND_SET = new Set(UNDERSTANDING_KINDS);
18
10
  const UNDERSTANDING_STATUSES = new Set([
19
11
  "candidate",
20
12
  "active",
@@ -68,13 +60,6 @@ function scopeFrom(value) {
68
60
  id
69
61
  } : void 0;
70
62
  }
71
- function canonicalKey(kind, statement) {
72
- const normalized = statement.toLocaleLowerCase().replace(/[^\p{L}\p{N}]+/gu, " ").trim();
73
- return `${kind}:${createHash("sha256").update(normalized).digest("hex").slice(0, 20)}`;
74
- }
75
- function sameScope(left, right) {
76
- return left.type === right.type && left.id === right.id;
77
- }
78
63
  function validTimezone(value) {
79
64
  if (!value) return true;
80
65
  try {
@@ -103,7 +88,8 @@ function registerYouRoutes(authenticated, deps) {
103
88
  profile: getUserProfile(),
104
89
  understandings: listUnderstandings(),
105
90
  rules: listCollaborationRules(),
106
- consolidation: { lastRun: listContextConsolidationRuns(1)[0] ?? null }
91
+ consolidation: { lastRun: listContextConsolidationRuns(1)[0] ?? null },
92
+ quality: summarizeUserUnderstandingQuality()
107
93
  }));
108
94
  authenticated.get("/api/you/profile", (c) => {
109
95
  const profile = getUserProfile();
@@ -143,10 +129,15 @@ function registerYouRoutes(authenticated, deps) {
143
129
  const statement = nonEmptyString(body?.statement);
144
130
  const kind = body?.kind;
145
131
  const scope = scopeFrom(body?.scope ?? { type: "global" });
146
- if (!statement || !UNDERSTANDING_KINDS.has(kind) || !scope) return c.json({ error: "Valid statement, kind, and scope are required" }, 400);
132
+ if (!statement || !UNDERSTANDING_KIND_SET.has(kind) || !scope) return c.json({ error: "Valid statement, kind, and scope are required" }, 400);
147
133
  const typedKind = kind;
148
- const key = canonicalKey(typedKind, statement);
149
- if (listUnderstandings().some((item) => item.canonicalKey === key && sameScope(item.scope, scope) && item.status !== "archived" && item.status !== "rejected")) return c.json({ error: "This understanding already exists" }, 409);
134
+ const key = canonicalUnderstandingKey(typedKind, statement);
135
+ if (findDuplicateUnderstanding(listUnderstandings(), {
136
+ kind: typedKind,
137
+ statement,
138
+ canonicalKey: key,
139
+ scope
140
+ })) return c.json({ error: "This understanding already exists" }, 409);
150
141
  const understanding = createUnderstanding({
151
142
  kind: typedKind,
152
143
  canonicalKey: key,
@@ -177,8 +168,14 @@ function registerYouRoutes(authenticated, deps) {
177
168
  if (body.statement !== void 0) {
178
169
  const statement = nonEmptyString(body.statement);
179
170
  if (!statement) return c.json({ error: "statement must be 1-2000 characters" }, 400);
180
- const key = canonicalKey(understanding.kind, statement);
181
- if (listUnderstandings().some((item) => item.id !== id && item.canonicalKey === key && sameScope(item.scope, understanding.scope) && item.status !== "archived" && item.status !== "rejected")) return c.json({ error: "This understanding already exists" }, 409);
171
+ const key = canonicalUnderstandingKey(understanding.kind, statement);
172
+ if (findDuplicateUnderstanding(listUnderstandings(), {
173
+ kind: understanding.kind,
174
+ statement,
175
+ canonicalKey: key,
176
+ scope: understanding.scope,
177
+ excludeId: id
178
+ })) return c.json({ error: "This understanding already exists" }, 409);
182
179
  understanding = reviseUnderstanding(id, statement, {
183
180
  canonicalKey: key,
184
181
  explicitness: "explicit",
@@ -3,12 +3,11 @@ import { type Config } from '../config/schema.js';
3
3
  export type ImageGenerationSetupInput = {
4
4
  providerId: string;
5
5
  modelId?: string;
6
- region?: 'cn' | 'intl';
7
- baseUrl?: string;
6
+ providerConfig?: Record<string, unknown>;
8
7
  };
9
8
  export type ImageGenerationCatalogItem = ReturnType<typeof listImageGenerationProvidersSummary>[number] & {
10
9
  configured: boolean;
11
- requiresRegion: boolean;
10
+ config: Record<string, string>;
12
11
  };
13
12
  export declare function getImageGenerationCatalog(config: Config): ImageGenerationCatalogItem[];
14
13
  export declare function getAgentImageGenerationConfig(config: Config, agentIdRaw: string): {
@@ -13,10 +13,44 @@ function getImageGenerationCatalog(config) {
13
13
  return {
14
14
  ...summary,
15
15
  configured: provider.isConfigured({ cfg: config }),
16
- requiresRegion: summary.id === "dashscope" || summary.id === "minimax"
16
+ config: Object.fromEntries(summary.configFields.flatMap((field) => {
17
+ const value = config.providers?.[summary.id]?.[field.key];
18
+ return typeof value === "string" ? [[field.key, value]] : [];
19
+ }))
17
20
  };
18
21
  });
19
22
  }
23
+ function parseProviderConfig(provider, input) {
24
+ const source = input ?? {};
25
+ const allowedKeys = new Set(provider.configFields?.map((field) => field.key) ?? []);
26
+ const unknownKey = Object.keys(source).find((key) => !allowedKeys.has(key));
27
+ if (unknownKey) return {
28
+ ok: false,
29
+ error: `Unknown ${provider.id} config field: ${unknownKey}`
30
+ };
31
+ const value = {};
32
+ for (const field of provider.configFields ?? []) {
33
+ const raw = source[field.key];
34
+ const resolved = typeof raw === "string" ? raw.trim() : "";
35
+ if (!resolved) {
36
+ if (field.required) return {
37
+ ok: false,
38
+ error: `${provider.id} requires ${field.key}`
39
+ };
40
+ continue;
41
+ }
42
+ if (field.type === "select" && !field.options?.some((option) => option.value === resolved)) return {
43
+ ok: false,
44
+ error: `Invalid ${provider.id} ${field.key}: ${resolved}`
45
+ };
46
+ if (field.key === "region") value.region = resolved;
47
+ else value.baseUrl = resolved;
48
+ }
49
+ return {
50
+ ok: true,
51
+ value
52
+ };
53
+ }
20
54
  function getAgentImageGenerationConfig(config, agentIdRaw) {
21
55
  const agentId = normalizeAgentId(agentIdRaw);
22
56
  if (!config.agents.list.some((entry) => entry.enabled !== false && normalizeAgentId(entry.id) === agentId)) throw new Error(`Agent not found: ${agentId}`);
@@ -42,9 +76,10 @@ function prepareImageGenerationSetup(config, agentIdRaw, input) {
42
76
  ok: false,
43
77
  error: `Unknown ${providerId} image model: ${modelId}`
44
78
  };
45
- if ((providerId === "dashscope" || providerId === "minimax") && input.region !== "cn" && input.region !== "intl") return {
79
+ const parsedProviderConfig = parseProviderConfig(provider, input.providerConfig);
80
+ if (parsedProviderConfig.ok === false) return {
46
81
  ok: false,
47
- error: `${providerId} requires region "cn" or "intl"`
82
+ error: parsedProviderConfig.error
48
83
  };
49
84
  const next = structuredClone(config);
50
85
  const index = next.agents.list.findIndex((entry) => entry.enabled !== false && normalizeAgentId(entry.id) === agentId);
@@ -52,15 +87,11 @@ function prepareImageGenerationSetup(config, agentIdRaw, input) {
52
87
  ok: false,
53
88
  error: `Agent not found: ${agentId}`
54
89
  };
55
- const connection = {
56
- ...input.region ? { region: input.region } : {},
57
- ...input.baseUrl?.trim() ? { baseUrl: input.baseUrl.trim() } : {}
58
- };
59
90
  next.providers = {
60
91
  ...next.providers ?? {},
61
92
  [providerId]: {
62
93
  ...next.providers?.[providerId] ?? {},
63
- ...connection
94
+ ...parsedProviderConfig.value
64
95
  }
65
96
  };
66
97
  const entry = next.agents.list[index];
@@ -3,7 +3,6 @@ import { defaultGatewayBindMode, isContainerEnvironment, resolveGatewayBindHost,
3
3
  import { buckets } from "./rate-limit/buckets.js";
4
4
  import { isGatewayStrictSecurityEnabled } from "./rate-limit/env-flags.js";
5
5
  import "./rate-limit/index.js";
6
- import { checkPortAvailable, forceFreePortAndWait, listPortListeners, parseLsofOutput } from "./ports.js";
7
6
  import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
8
7
  import { resolveGatewayListenHost, resolveGatewayListenPlan } from "./listen.js";
9
8
  import { assertGatewayRuntimeConfig } from "./runtime-config.js";
@@ -13,6 +12,7 @@ import { createHonoApp } from "./hono/app.js";
13
12
  import { GatewayServer } from "./server.js";
14
13
  import { GatewayLockError, acquireGatewayLock } from "./lock.js";
15
14
  import { runGatewayLoop } from "./run-loop.js";
15
+ import { checkPortAvailable, forceFreePortAndWait, listPortListeners, parseLsofOutput } from "./ports.js";
16
16
  import { apiError, apiOk } from "./protocol.js";
17
17
  import "./hono/index.js";
18
18
  import { assertSecureGatewayHttpUrl, assertSecureWebSocketUrl, isInsecurePrivateWsAllowed, isSecureWebSocketUrl } from "./ws-security.js";
@@ -1,10 +1,10 @@
1
1
  import { loadConfig } from "../config/loader.js";
2
2
  import "../config/index.js";
3
3
  import { isRestartEnabled } from "../config/commands.flags.js";
4
- import { consumeGatewayRestartIntentSync, consumeGatewaySigusr1RestartAuthorization, isGatewaySigusr1RestartExternallyAllowed, resetGatewayRestartStateForInProcessRestart, scheduleGatewaySigusr1Restart, setGatewaySigusr1RestartPolicy } from "../infra/restart.js";
5
4
  import { runBootstrapMigrationsSync } from "../migrations/runner.js";
6
5
  import { restartGatewayProcessWithFreshPid } from "./respawn.js";
7
6
  import { acquireGatewayLock } from "./lock.js";
7
+ import { consumeGatewayRestartIntentSync, consumeGatewaySigusr1RestartAuthorization, isGatewaySigusr1RestartExternallyAllowed, resetGatewayRestartStateForInProcessRestart, scheduleGatewaySigusr1Restart, setGatewaySigusr1RestartPolicy } from "../infra/restart.js";
8
8
  //#region src/gateway/run-loop.ts
9
9
  /**
10
10
  * Gateway Run Loop - Core run loop for gateway process management
@@ -83,7 +83,7 @@ export declare class GatewayMarketplaceService {
83
83
  reloadSkills(): void;
84
84
  patchSkillEnabled(skillName: string, enabled: boolean): void;
85
85
  fetchSkillsCatalog(params: SkillsStoreListParams, provider?: string): Promise<UnifiedMarketplaceListResponse>;
86
- fetchSkillsCategories(provider?: string): Promise<{
86
+ fetchSkillsCategories(provider?: string, locale?: string): Promise<{
87
87
  items: MarketplaceCategoryOption[];
88
88
  }>;
89
89
  fetchSkillsPackageDetail(packageName: string, provider?: string): Promise<UnifiedMarketplacePackageDetail>;
@@ -112,9 +112,9 @@ var GatewayMarketplaceService = class {
112
112
  const { listMarketplacePackages } = await import("../../agent/skills/skills-marketplace.js");
113
113
  return listMarketplacePackages(this.opts.getConfig(), params, provider);
114
114
  }
115
- async fetchSkillsCategories(provider) {
115
+ async fetchSkillsCategories(provider, locale) {
116
116
  const { listMarketplaceCategories } = await import("../../agent/skills/skills-marketplace.js");
117
- return listMarketplaceCategories(this.opts.getConfig(), provider);
117
+ return listMarketplaceCategories(this.opts.getConfig(), provider, locale);
118
118
  }
119
119
  async fetchSkillsPackageDetail(packageName, provider) {
120
120
  const { getMarketplacePackageDetail } = await import("../../agent/skills/skills-marketplace.js");
@@ -33,6 +33,7 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
33
33
  let taskRun;
34
34
  let taskRunStatus = "failed";
35
35
  let taskRunSummary = "Agent run ended unexpectedly";
36
+ let terminalStatus = "error";
36
37
  let webchatSessionKey;
37
38
  let webchatSessionId;
38
39
  let webchatMetadata;
@@ -107,8 +108,8 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
107
108
  yield event;
108
109
  }
109
110
  };
110
- yield* emitAndYield(mapper.start());
111
111
  try {
112
+ yield* emitAndYield(mapper.start());
112
113
  if (channel === "webchat" && webchatSessionKey) {
113
114
  const sessionKey = webchatSessionKey;
114
115
  updateAsyncLogContext({
@@ -139,16 +140,10 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
139
140
  const endStatus = mergedSignal.aborted ? "cancelled" : "success";
140
141
  const endSummary = mergedSignal.aborted ? "Interrupted" : "Message processed successfully";
141
142
  taskRunStatus = mergedSignal.aborted ? "cancelled" : "succeeded";
143
+ terminalStatus = endStatus;
142
144
  taskRunSummary = endSummary;
143
145
  yield* emitAndYield(mapper.end(endStatus, endSummary));
144
146
  completeRealtimeTopic(`run:${runId}`);
145
- try {
146
- const metaAfter = await sessionIndex.getSessionMetadata(sessionKey);
147
- if (metaAfter?.name) emit("session.updated", {
148
- key: sessionKey,
149
- name: metaAfter.name
150
- });
151
- } catch {}
152
147
  return {
153
148
  status: mergedSignal.aborted ? "aborted" : "ok",
154
149
  summary: mergedSignal.aborted ? "Interrupted" : "Message processed successfully"
@@ -165,6 +160,7 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
165
160
  }, `Agent processing failed: ${em}`);
166
161
  streamError = em;
167
162
  taskRunStatus = "failed";
163
+ terminalStatus = "error";
168
164
  taskRunSummary = em;
169
165
  const errorContent = formatAgentRunErrorForClient(streamError);
170
166
  yield* emitAndYield(mapper.error(errorContent));
@@ -278,6 +274,23 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
278
274
  runId
279
275
  }, `Task run finalization failed: ${errorMessage}`);
280
276
  }
277
+ if (webchatSessionKey) {
278
+ const metaAfter = await sessionIndex.getSessionMetadata(webchatSessionKey).catch(() => void 0);
279
+ if (metaAfter?.name) emit("session.updated", {
280
+ key: webchatSessionKey,
281
+ name: metaAfter.name
282
+ });
283
+ emit("agent.run.ended", {
284
+ schemaVersion: 1,
285
+ runId,
286
+ sessionKey: webchatSessionKey,
287
+ status: terminalStatus,
288
+ completedAtMs: Date.now(),
289
+ route: `/chat/${encodeURIComponent(webchatSessionKey)}`,
290
+ source: "webchat",
291
+ ...metaAfter?.name?.trim() ? { sessionTitle: metaAfter.name.trim().slice(0, 100) } : {}
292
+ });
293
+ }
281
294
  }
282
295
  }
283
296
  //#endregion
@@ -66,11 +66,6 @@ import { DiscussionSealer } from "../discussions/sealer.js";
66
66
  import "../discussions/index.js";
67
67
  import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
68
68
  import "../endpoint-tools/index.js";
69
- import { scheduleGatewayUpdateCheck } from "../infra/update-startup.js";
70
- import { LocalAppService } from "../local-apps/service.js";
71
- import "../local-apps/index.js";
72
- import { runBootstrapMigrationsSync } from "../migrations/runner.js";
73
- import { MobileNotificationService } from "../mobile/notification-service.js";
74
69
  import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
75
70
  import { reconcileDreamingAutomations } from "./dreaming-automation-reconciler.js";
76
71
  import { NotesStore } from "../notes/store.js";
@@ -88,6 +83,10 @@ import { assertGatewayAuthNotKnownWeak } from "./security/known-weak-secrets.js"
88
83
  import { assertGatewayRuntimeConfig } from "./runtime-config.js";
89
84
  import { auditGatewayConfig } from "./security/audit.js";
90
85
  import { ModelCatalogSyncService } from "../providers/model-catalog-sync-service.js";
86
+ import { runBootstrapMigrationsSync } from "../migrations/runner.js";
87
+ import { MobileNotificationService } from "../mobile/notification-service.js";
88
+ import { LocalAppService } from "../local-apps/service.js";
89
+ import "../local-apps/index.js";
91
90
  import { createRuntimeBrowserRecipeService } from "../browser/recipes/runtime-service.js";
92
91
  import "../browser/recipes/index.js";
93
92
  import { mapProductEventToProactive } from "../proactive/events/product-event-bridge.js";
@@ -99,6 +98,7 @@ import { ProactiveTemporalWorker } from "../proactive/temporal/worker.js";
99
98
  import { ProactiveInboxService } from "../proactive/inbox/service.js";
100
99
  import { ProactiveInboxWorker } from "../proactive/inbox/worker.js";
101
100
  import "../proactive/index.js";
101
+ import { scheduleGatewayUpdateCheck } from "../infra/update-startup.js";
102
102
  import { resolveChannelConnectDeferSet } from "./resolve-channel-connect-defer.js";
103
103
  import { restartGatewayProcessWithFreshPid } from "./respawn.js";
104
104
  import { GatewaySessionsApi } from "./service/sessions-api.js";
@@ -1,5 +1,5 @@
1
- import { isGatewayArgv, parseProcCmdline } from "./gateway-process-argv.js";
2
1
  import { listPortListeners } from "../gateway/ports.js";
2
+ import { isGatewayArgv, parseProcCmdline } from "./gateway-process-argv.js";
3
3
  import fs from "node:fs";
4
4
  import { spawnSync } from "node:child_process";
5
5
  //#region src/infra/gateway-processes.ts
@@ -1,6 +1,6 @@
1
+ import { applyPathPrepend } from "./path-prepend.js";
1
2
  import { resolveExecPathBinPrepend } from "./path-env.js";
2
3
  import { readPackageVersion } from "./package-json.js";
3
- import { applyPathPrepend } from "./path-prepend.js";
4
4
  import { createDefaultCommandRunner } from "./run-command.js";
5
5
  import path from "node:path";
6
6
  import fs from "node:fs";
@@ -4,8 +4,8 @@ import { init_paths, resolveConfigPath } from "../config/paths.js";
4
4
  import { init_loader, loadConfig } from "../config/loader.js";
5
5
  import { isRestartEnabled } from "../config/commands.flags.js";
6
6
  import { resolveGatewayService } from "../daemon/service.js";
7
- import { findVerifiedGatewayListenerPidsOnPortSync, signalVerifiedGatewayPidSync } from "./gateway-processes.js";
8
7
  import { authorizeGatewaySigusr1Restart, writeGatewayRestartIntentSync } from "./restart.js";
8
+ import { findVerifiedGatewayListenerPidsOnPortSync, signalVerifiedGatewayPidSync } from "./gateway-processes.js";
9
9
  import { refreshGatewayServiceAfterUpdate } from "./update-service-refresh.js";
10
10
  //#region src/infra/update-restart.ts
11
11
  init_loader();
@@ -1,11 +1,11 @@
1
1
  import { runPostUpdateExtensionSync } from "../extensions/update.js";
2
+ import "./update-channels.js";
3
+ import { compareSemver, resolveNpmChannelTag } from "./update-check.js";
2
4
  import { readPackageName, readPackageVersion } from "./package-json.js";
3
5
  import { createDefaultCommandRunner, runCommandWithTimeout } from "./run-command.js";
4
6
  import { XOPC_PACKAGE_NAME, cleanupGlobalRenameDirs, createGlobalInstallEnv, detectGlobalInstallManagerForRoot, resolveGlobalInstallSpec, resolveGlobalInstallTarget } from "./update-global.js";
5
7
  import { runGlobalPackageUpdateSteps } from "./package-update-steps.js";
6
8
  import { resolveStableNodePath } from "./stable-node-path.js";
7
- import "./update-channels.js";
8
- import { compareSemver, resolveNpmChannelTag } from "./update-check.js";
9
9
  import { trimLogTail } from "./update-log.js";
10
10
  import { maybeRestartGatewayAfterUpdate } from "./update-restart.js";
11
11
  import path from "node:path";
@@ -3,9 +3,9 @@ import { init_paths_state, resolveUpdateCheckStatePath } from "../config/paths-s
3
3
  import { createLogger } from "../utils/logger/index.js";
4
4
  import { init_logger } from "../utils/logger.js";
5
5
  import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
6
+ import { acquireUpdateLock } from "./update-lock.js";
6
7
  import { normalizeUpdateChannel } from "./update-channels.js";
7
8
  import { compareSemver, detectInstallKind, resolveNpmChannelTag, resolvePackageRoot } from "./update-check.js";
8
- import { acquireUpdateLock } from "./update-lock.js";
9
9
  import { createHash, randomUUID } from "node:crypto";
10
10
  import { readFile } from "node:fs/promises";
11
11
  //#region src/infra/update-startup.ts
@@ -3,6 +3,7 @@ import { init_logger } from "../utils/logger.js";
3
3
  import "./constants.js";
4
4
  import { getProviderRegistry, init_plugin_registry } from "./plugin-registry.js";
5
5
  import { init_providers } from "./index.js";
6
+ import { stripPromptCacheBoundary } from "../agent/prompt/cache-boundary.js";
6
7
  import { createAssistantMessageEventStream, streamSimple } from "@earendil-works/pi-ai/compat";
7
8
  //#region src/providers/extension-stream-bridge.ts
8
9
  init_plugin_registry();
@@ -80,7 +81,7 @@ function createExtensionAwareStreamFn() {
80
81
  const stream = createAssistantMessageEventStream();
81
82
  const params = {
82
83
  model: model.id,
83
- systemPrompt: context.systemPrompt,
84
+ systemPrompt: context.systemPrompt ? stripPromptCacheBoundary(context.systemPrompt) : void 0,
84
85
  messages: context.messages,
85
86
  tools: context.tools,
86
87
  temperature: options?.temperature,
@@ -200,15 +201,15 @@ function createExtensionAwareStreamFn() {
200
201
  partial.usage = {
201
202
  input: chunk.usage.input,
202
203
  output: chunk.usage.output,
203
- cacheRead: 0,
204
- cacheWrite: 0,
205
- totalTokens: chunk.usage.total ?? chunk.usage.input + chunk.usage.output,
204
+ cacheRead: chunk.usage.cacheRead ?? 0,
205
+ cacheWrite: chunk.usage.cacheWrite ?? 0,
206
+ totalTokens: chunk.usage.total ?? chunk.usage.input + chunk.usage.output + (chunk.usage.cacheRead ?? 0) + (chunk.usage.cacheWrite ?? 0),
206
207
  cost: {
207
208
  input: inputCost,
208
209
  output: outputCost,
209
- cacheRead: 0,
210
- cacheWrite: 0,
211
- total: inputCost + outputCost
210
+ cacheRead: (chunk.usage.cacheRead ?? 0) / 1e6 * (model.cost?.cacheRead ?? 0),
211
+ cacheWrite: (chunk.usage.cacheWrite ?? 0) / 1e6 * (model.cost?.cacheWrite ?? 0),
212
+ total: inputCost + outputCost + (chunk.usage.cacheRead ?? 0) / 1e6 * (model.cost?.cacheRead ?? 0) + (chunk.usage.cacheWrite ?? 0) / 1e6 * (model.cost?.cacheWrite ?? 0)
212
213
  }
213
214
  };
214
215
  }
@@ -2,10 +2,10 @@ export interface CatalogModel {
2
2
  id: string;
3
3
  name: string;
4
4
  availability: 'available' | 'unavailable';
5
- kind: 'language' | 'image';
6
- input: Array<'text' | 'image'>;
7
- output: Array<'text' | 'image'>;
8
- operations: Array<'chat.completions' | 'responses' | 'images.generate' | 'images.edit'>;
5
+ kind: 'language' | 'image' | 'stt' | 'tts';
6
+ input: Array<'text' | 'image' | 'audio'>;
7
+ output: Array<'text' | 'image' | 'audio'>;
8
+ operations: Array<'chat.completions' | 'responses' | 'images.generate' | 'images.edit' | 'audio.transcription' | 'audio.speech'>;
9
9
  reasoning: boolean;
10
10
  contextWindow: number;
11
11
  maxOutputTokens: number | null;
@@ -18,6 +18,26 @@ export interface CatalogModel {
18
18
  backgrounds: Array<'transparent' | 'opaque' | 'auto'>;
19
19
  maxInputImages: number;
20
20
  };
21
+ stt?: {
22
+ inputFormats: string[];
23
+ maxBytes: number;
24
+ maxDurationSeconds: number;
25
+ languages: string[];
26
+ languageHint: boolean;
27
+ prompt: boolean;
28
+ timestamps: Array<'segment' | 'word'>;
29
+ diarization: boolean;
30
+ };
31
+ tts?: {
32
+ maxCharacters: number;
33
+ languages: string[];
34
+ outputFormats: Array<'mp3' | 'opus' | 'aac' | 'flac' | 'wav' | 'pcm'>;
35
+ streaming: boolean;
36
+ speed: boolean;
37
+ pitch: boolean;
38
+ instructions: boolean;
39
+ defaultVoice?: string;
40
+ };
21
41
  }
22
42
  export interface CatalogSource {
23
43
  providerId: string;
@@ -65,6 +65,17 @@ var init_model_catalog_store = __esmMin((() => {
65
65
  qualities: [...model.imageGeneration.qualities],
66
66
  formats: [...model.imageGeneration.formats],
67
67
  backgrounds: [...model.imageGeneration.backgrounds]
68
+ } } : {},
69
+ ...model.stt ? { stt: {
70
+ ...model.stt,
71
+ inputFormats: [...model.stt.inputFormats],
72
+ languages: [...model.stt.languages],
73
+ timestamps: [...model.stt.timestamps]
74
+ } } : {},
75
+ ...model.tts ? { tts: {
76
+ ...model.tts,
77
+ languages: [...model.tts.languages],
78
+ outputFormats: [...model.tts.outputFormats]
68
79
  } } : {}
69
80
  }))
70
81
  };
@@ -243,7 +243,7 @@ var init_model_registry = __esmMin((() => {
243
243
  provider: source.providerId,
244
244
  baseUrl: source.baseUrl,
245
245
  reasoning: model.reasoning,
246
- input: model.input,
246
+ input: model.input.filter((value) => value === "text" || value === "image"),
247
247
  cost: {
248
248
  input: 0,
249
249
  output: 0,
@@ -0,0 +1,13 @@
1
+ import type { Api, Model, SimpleStreamOptions } from '@earendil-works/pi-ai';
2
+ export declare function transformPromptCachePayload(model: Model<Api>, payload: unknown): unknown;
3
+ export declare function buildPromptCacheKey(model: Model<Api>, context: {
4
+ systemPrompt?: string;
5
+ tools?: unknown[];
6
+ }): string;
7
+ export declare function preparePromptCacheContext<T extends {
8
+ systemPrompt?: string;
9
+ }>(model: Model<Api>, context: T): T;
10
+ export declare function withPromptCachePayloadTransform(model: Model<Api>, context: {
11
+ systemPrompt?: string;
12
+ tools?: unknown[];
13
+ }, options: SimpleStreamOptions | undefined): SimpleStreamOptions | undefined;
@@ -0,0 +1,110 @@
1
+ import { splitPromptCacheBoundary, stripPromptCacheBoundary } from "../agent/prompt/cache-boundary.js";
2
+ import { createHash } from "node:crypto";
3
+ //#region src/providers/prompt-cache-payload.ts
4
+ function asRecord(value) {
5
+ return value !== null && typeof value === "object" && !Array.isArray(value) ? value : void 0;
6
+ }
7
+ function supportsPromptCacheKey(model) {
8
+ if (model.api === "openai-codex-responses" || model.api === "azure-openai-responses") return true;
9
+ if (model.api !== "openai-completions" && model.api !== "openai-responses") return false;
10
+ return model.provider === "openai" || model.baseUrl?.includes("api.openai.com") === true;
11
+ }
12
+ function splitAnthropicSystem(payload) {
13
+ const record = asRecord(payload);
14
+ if (!record || !Array.isArray(record.system)) return payload;
15
+ let changed = false;
16
+ const system = record.system.flatMap((value) => {
17
+ const block = asRecord(value);
18
+ if (!block || typeof block.text !== "string") return [value];
19
+ const split = splitPromptCacheBoundary(block.text);
20
+ if (!split) return [value];
21
+ changed = true;
22
+ const { text: _text, ...rest } = block;
23
+ return [{
24
+ ...rest,
25
+ type: block.type ?? "text",
26
+ text: split.stablePrefix
27
+ }, ...split.dynamicSuffix ? [{
28
+ type: block.type ?? "text",
29
+ text: split.dynamicSuffix
30
+ }] : []];
31
+ });
32
+ return changed ? {
33
+ ...record,
34
+ system
35
+ } : payload;
36
+ }
37
+ function splitBedrockSystem(payload) {
38
+ const record = asRecord(payload);
39
+ if (!record || !Array.isArray(record.system)) return payload;
40
+ let changed = false;
41
+ const system = [];
42
+ for (let index = 0; index < record.system.length; index += 1) {
43
+ const value = record.system[index];
44
+ const block = asRecord(value);
45
+ const split = block && typeof block.text === "string" ? splitPromptCacheBoundary(block.text) : void 0;
46
+ if (!split) {
47
+ system.push(value);
48
+ continue;
49
+ }
50
+ changed = true;
51
+ system.push({
52
+ ...block,
53
+ text: split.stablePrefix
54
+ });
55
+ const next = asRecord(record.system[index + 1]);
56
+ if (next?.cachePoint) {
57
+ system.push(next);
58
+ index += 1;
59
+ }
60
+ if (split.dynamicSuffix) system.push({ text: split.dynamicSuffix });
61
+ }
62
+ return changed ? {
63
+ ...record,
64
+ system
65
+ } : payload;
66
+ }
67
+ function transformPromptCachePayload(model, payload) {
68
+ if (model.api === "anthropic-messages") return splitAnthropicSystem(payload);
69
+ if (model.api === "bedrock-converse-stream") return splitBedrockSystem(payload);
70
+ return payload;
71
+ }
72
+ function canonicalJson(value) {
73
+ if (Array.isArray(value)) return `[${value.map(canonicalJson).join(",")}]`;
74
+ const record = asRecord(value);
75
+ if (record) return `{${Object.keys(record).sort().map((key) => `${JSON.stringify(key)}:${canonicalJson(record[key])}`).join(",")}}`;
76
+ return JSON.stringify(value) ?? "null";
77
+ }
78
+ function buildPromptCacheKey(model, context) {
79
+ const stablePrompt = context.systemPrompt ? splitPromptCacheBoundary(context.systemPrompt)?.stablePrefix ?? stripPromptCacheBoundary(context.systemPrompt) : "";
80
+ return `xopc-${createHash("sha256").update(`${model.provider}\0${model.id}\0${stablePrompt}\0${canonicalJson(context.tools ?? [])}`).digest("base64url")}`;
81
+ }
82
+ function preparePromptCacheContext(model, context) {
83
+ if (model.api === "anthropic-messages" || model.api === "bedrock-converse-stream") return context;
84
+ if (!context.systemPrompt) return context;
85
+ return {
86
+ ...context,
87
+ systemPrompt: stripPromptCacheBoundary(context.systemPrompt)
88
+ };
89
+ }
90
+ function withPromptCachePayloadTransform(model, context, options) {
91
+ const explicitBoundary = model.api === "anthropic-messages" || model.api === "bedrock-converse-stream";
92
+ const openAiCacheKey = supportsPromptCacheKey(model) && options?.cacheRetention !== "none";
93
+ if (!explicitBoundary && !openAiCacheKey) return options;
94
+ const upstream = options?.onPayload;
95
+ const promptCacheKey = openAiCacheKey ? buildPromptCacheKey(model, context) : void 0;
96
+ return {
97
+ ...options,
98
+ onPayload: async (payload, payloadModel) => {
99
+ const upstreamPayload = await upstream?.(payload, payloadModel);
100
+ const transformed = transformPromptCachePayload(model, upstreamPayload === void 0 ? payload : upstreamPayload);
101
+ const record = asRecord(transformed);
102
+ return record && promptCacheKey ? {
103
+ ...record,
104
+ prompt_cache_key: promptCacheKey
105
+ } : transformed;
106
+ }
107
+ };
108
+ }
109
+ //#endregion
110
+ export { buildPromptCacheKey, preparePromptCacheContext, transformPromptCachePayload, withPromptCachePayloadTransform };
@@ -20,7 +20,7 @@ function registerRuntimeProvider(modelRuntime, source) {
20
20
  id: model.id,
21
21
  name: model.name,
22
22
  reasoning: model.reasoning,
23
- input: model.input,
23
+ input: model.input.filter((value) => value === "text" || value === "image"),
24
24
  cost: {
25
25
  input: 0,
26
26
  output: 0,