@xopcai/xopc 0.0.208 → 0.0.211

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 (316) 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-D0mYZqhc.js → activity-store-BzjFoSr0.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-MWLQWL_i.js → agent-avatar-dicebear-DTfjhfVE.js} +1 -1
  5. package/dist/gateway/static/root/assets/agents-CjhgfuVJ.js +68 -0
  6. package/dist/gateway/static/root/assets/{api-DZA1yVzM.js → api-D269PnU9.js} +1 -1
  7. package/dist/gateway/static/root/assets/{app-management-settings-panel-B2X6quAF.js → app-management-settings-panel-BFpfQDWc.js} +1 -1
  8. package/dist/gateway/static/root/assets/{appearance-settings-BZW-c38q.js → appearance-settings-DLxFdqhY.js} +1 -1
  9. package/dist/gateway/static/root/assets/apps-page-CjmlGB5V.js +1 -0
  10. package/dist/gateway/static/root/assets/{archive-plugin-CK-gsjsJ.js → archive-plugin-DPlH4dnc.js} +1 -1
  11. package/dist/gateway/static/root/assets/{attachment-load-EJGP4rCw.js → attachment-load-xqfLLd0I.js} +1 -1
  12. package/dist/gateway/static/root/assets/automations-page-4m6Ey6wG.js +6 -0
  13. package/dist/gateway/static/root/assets/{binary-plugins-Tbss_4P-.js → binary-plugins-C0tuoPXk.js} +1 -1
  14. package/dist/gateway/static/root/assets/{block-editor-C-dOWigw.js → block-editor-Deyphj1o.js} +6 -6
  15. package/dist/gateway/static/root/assets/browser-settings-page-CAGCYx8U.js +8 -0
  16. package/dist/gateway/static/root/assets/{browser-workflow-inputs-DW06Zo1N.js → browser-workflow-inputs-CYEbXyRF.js} +1 -1
  17. package/dist/gateway/static/root/assets/{browser-workflows-page-B6RnRGwm.js → browser-workflows-page-Bf0tPbGi.js} +2 -2
  18. package/dist/gateway/static/root/assets/capabilities-settings-panel-CKfLsxTI.js +7 -0
  19. package/dist/gateway/static/root/assets/{capability-presets-api-Cc3BtQar.js → capability-presets-api-DPkFA_-R.js} +1 -1
  20. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CpipKNqX.js +3 -0
  21. package/dist/gateway/static/root/assets/{channel-recipient-api-BvZO5FaO.js → channel-recipient-api-DqKaAcnZ.js} +1 -1
  22. package/dist/gateway/static/root/assets/channels-settings-Bvq-O4pt.js +1 -0
  23. package/dist/gateway/static/root/assets/channels-status-swr-CrMld2l7.js +1 -0
  24. package/dist/gateway/static/root/assets/chat-terminal-dock-CTDRZa7e.js +36 -0
  25. package/dist/gateway/static/root/assets/{connectors-api-CUl6_EQJ.js → connectors-api-Buu8fif8.js} +1 -1
  26. package/dist/gateway/static/root/assets/connectors-page-CSQRzaVn.js +2 -0
  27. package/dist/gateway/static/root/assets/{cron-expression-BD9MgoE_.js → cron-expression-DTLR82NB.js} +1 -1
  28. package/dist/gateway/static/root/assets/{date-picker-ChqNmoxw.js → date-picker-DyNogHQH.js} +1 -1
  29. package/dist/gateway/static/root/assets/{dependency-picker-CDUmFs6H.js → dependency-picker-BpnCuo7B.js} +1 -1
  30. package/dist/gateway/static/root/assets/{desktop-pet-D61gqxaD.js → desktop-pet-CDKI4gVB.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-settings-QvuJvIX_.js → desktop-pet-settings-DjT5C2a3.js} +1 -1
  32. package/dist/gateway/static/root/assets/{directory-picker-path-field-DvXMvDNY.js → directory-picker-path-field-DlJY90TM.js} +1 -1
  33. package/dist/gateway/static/root/assets/{extension-debug-page-DMdVTAQ3.js → extension-debug-page-DWf2z7q5.js} +1 -1
  34. package/dist/gateway/static/root/assets/{extension-page-BNzxZtaK.js → extension-page-Dorx0kf9.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-settings-page-DoEfyizU.js → extension-settings-page-B1wU9ZOB.js} +1 -1
  36. package/dist/gateway/static/root/assets/{gateway-config-api-o7AKvthC.js → gateway-config-api-B1lG4dNr.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-swr-BQbkUP5X.js → gateway-config-swr-BIxuwPQi.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-settings-TO5YYZ9a.js → gateway-settings-DqIOqJjM.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-startup-retry-DIgdpHgk.js → gateway-startup-retry-BpZgd4U-.js} +1 -1
  40. package/dist/gateway/static/root/assets/heartbeat-settings-DG4Kmgkc.js +1 -0
  41. package/dist/gateway/static/root/assets/home-page-BhqItS_s.js +1 -0
  42. package/dist/gateway/static/root/assets/image-generation-api-PkhYohDa.js +1 -0
  43. package/dist/gateway/static/root/assets/index-DLhvsU9B.css +2 -0
  44. package/dist/gateway/static/root/assets/index-_cuTcWjB.js +107 -0
  45. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-4xaM3jjU.js → keyboard-shortcuts-settings-6OQT3gQF.js} +1 -1
  46. package/dist/gateway/static/root/assets/local-app-workbench-page-DWjTmzxw.js +2 -0
  47. package/dist/gateway/static/root/assets/{local-apps-page-C1xDicdr.js → local-apps-page-DfruRAmE.js} +1 -1
  48. package/dist/gateway/static/root/assets/{locale-store-pByvK12G.js → locale-store-C5MK9WcP.js} +1 -1
  49. package/dist/gateway/static/root/assets/logs-page-BA5efZ8B.js +2 -0
  50. package/dist/gateway/static/root/assets/{management-settings-D1XdHm7v.js → management-settings-L1VYkywO.js} +1 -1
  51. package/dist/gateway/static/root/assets/{markdown-split-B_Ijq1Fr.js → markdown-split-oqgHbqt-.js} +1 -1
  52. package/dist/gateway/static/root/assets/markdown-view-DD_PgVue.css +1 -0
  53. package/dist/gateway/static/root/assets/{markdown-view-CyJlGUxB.js → markdown-view-V4rcPPH0.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-CXXNRROJ.js → media-plugins-Bb6gSX2o.js} +1 -1
  55. package/dist/gateway/static/root/assets/messages-ctG2e-ix.js +3 -0
  56. package/dist/gateway/static/root/assets/{notes-page-rkePB4CB.js → notes-page-B1rOXjpT.js} +1 -1
  57. package/dist/gateway/static/root/assets/notes-workbench-CkHXVmKP.js +4 -0
  58. package/dist/gateway/static/root/assets/{page-tabs-gw-RMQCV.js → page-tabs-CBuCKeyy.js} +1 -1
  59. package/dist/gateway/static/root/assets/{preview-open-alternatives-B8aMScJ2.js → preview-open-alternatives-BQ0tLfPO.js} +1 -1
  60. package/dist/gateway/static/root/assets/{product-open-page-CjcpkWAz.js → product-open-page-DPeFn7Hu.js} +1 -1
  61. package/dist/gateway/static/root/assets/project-detail-page-DCqet9-L.js +1 -0
  62. package/dist/gateway/static/root/assets/projects-page-D0t_AjzG.js +1 -0
  63. package/dist/gateway/static/root/assets/remote-access-hub-BUWPoBvw.js +1 -0
  64. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Ch5qq86o.js → runtime-tools-settings-panel-BCfQNzjG.js} +2 -2
  65. package/dist/gateway/static/root/assets/{schema-form-DHYWYUFt.js → schema-form-Bo7YbHYN.js} +1 -1
  66. package/dist/gateway/static/root/assets/sessions-page-vLhrrM3m.js +1 -0
  67. package/dist/gateway/static/root/assets/settings-advanced-gate-OP1y0Y8M.js +1 -0
  68. package/dist/gateway/static/root/assets/{settings-form-section-DlzZx0-i.js → settings-form-section-B9dnKr3M.js} +1 -1
  69. package/dist/gateway/static/root/assets/{settings-loading-skeleton-BVLhreQi.js → settings-loading-skeleton-CYDV2JtY.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-page-BJU-kUnN.js → settings-page-DbrIYfS9.js} +1 -1
  71. package/dist/gateway/static/root/assets/setup-status-panel-Cxc-Ejl5.js +1 -0
  72. package/dist/gateway/static/root/assets/{share-preview-page-hvIuZXMe.js → share-preview-page-olgr7LLN.js} +1 -1
  73. package/dist/gateway/static/root/assets/shares-settings-ZOqC6-aA.js +1 -0
  74. package/dist/gateway/static/root/assets/skill-reload-api-DwvC3Iuf.js +1 -0
  75. package/dist/gateway/static/root/assets/{skills-page-Dlvuh7D-.js → skills-page-PE16CNw5.js} +1 -1
  76. package/dist/gateway/static/root/assets/{skills-page.utils-B6ddOpnf.js → skills-page.utils-nXmBcBxt.js} +1 -1
  77. package/dist/gateway/static/root/assets/{system-settings-panel-BdbCAyoA.js → system-settings-panel-C3qPwAdY.js} +1 -1
  78. package/dist/gateway/static/root/assets/task-detail-page-DCRB-5q-.js +1 -0
  79. package/dist/gateway/static/root/assets/{theme-store-BtdGacMI.js → theme-store-KR5Otp5w.js} +1 -1
  80. package/dist/gateway/static/root/assets/{typed-models-lib-CL6qHYJA.js → typed-models-lib-lMZodtDF.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-autosave-DysNnqCS.js → use-autosave-CKpatP3S.js} +1 -1
  82. package/dist/gateway/static/root/assets/user-context-page-CoiedRuA.js +1 -0
  83. package/dist/gateway/static/root/assets/{voice-api-key-field-UEsO9Jr-.js → voice-api-key-field-CDcv0Wbh.js} +1 -1
  84. package/dist/gateway/static/root/assets/{work-discovery-overlay-B9disASf.js → work-discovery-overlay-CGdT22un.js} +1 -1
  85. package/dist/gateway/static/root/assets/work-discovery-page-BwaU1RqI.js +1 -0
  86. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-A0zTQHFQ.js → workflow-run-setup-panel-BAHYNlQt.js} +2 -2
  87. package/dist/gateway/static/root/assets/workflows-page-DHYmh9G7.js +5 -0
  88. package/dist/gateway/static/root/index.html +10 -10
  89. package/dist/package.js +1 -1
  90. package/dist/src/agent/agent-manager.js +1 -1
  91. package/dist/src/agent/background-review/coordinator.d.ts +1 -1
  92. package/dist/src/agent/background-review/coordinator.js +4 -5
  93. package/dist/src/agent/background-review/run-background-review.js +0 -1
  94. package/dist/src/agent/background-review/settings.d.ts +1 -2
  95. package/dist/src/agent/background-review/settings.js +3 -4
  96. package/dist/src/agent/external-tools/composio-provider.js +8 -4
  97. package/dist/src/agent/image/generation/providers/xopc-cloud.js +2 -1
  98. package/dist/src/agent/image/tool-model-config.js +15 -9
  99. package/dist/src/agent/memory/builtin-provider.js +1 -2
  100. package/dist/src/agent/memory/manager.js +2 -0
  101. package/dist/src/agent/memory/sensitivity.js +1 -1
  102. package/dist/src/agent/memory/understanding/service.js +43 -19
  103. package/dist/src/agent/memory/user-context-coordinator.js +1 -1
  104. package/dist/src/agent/tools/image-generate-tool.js +23 -7
  105. package/dist/src/automations/domain/validation.d.ts +7 -7
  106. package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -2
  107. package/dist/src/capabilities/readiness/from-config.d.ts +10 -0
  108. package/dist/src/capabilities/readiness/from-config.js +128 -0
  109. package/dist/src/capabilities/readiness/index.d.ts +3 -0
  110. package/dist/src/capabilities/readiness/index.js +3 -0
  111. package/dist/src/capabilities/readiness/planner.d.ts +3 -0
  112. package/dist/src/capabilities/readiness/planner.js +56 -0
  113. package/dist/src/capabilities/readiness/types.d.ts +35 -0
  114. package/dist/src/capabilities/readiness/types.js +1 -0
  115. package/dist/src/cli/commands/agent.js +9 -0
  116. package/dist/src/cli/commands/auth.js +4 -3
  117. package/dist/src/cli/commands/connectors.js +1 -1
  118. package/dist/src/cli/commands/models.js +2 -1
  119. package/dist/src/cli/commands/onboard/model.d.ts +3 -21
  120. package/dist/src/cli/commands/onboard/model.js +10 -86
  121. package/dist/src/cli/utils/oauth-login.d.ts +2 -0
  122. package/dist/src/cli/utils/oauth-login.js +9 -1
  123. package/dist/src/config/agent-profile.js +1 -1
  124. package/dist/src/config/index.js +2 -2
  125. package/dist/src/config/paths-state.d.ts +2 -0
  126. package/dist/src/config/paths-state.js +5 -1
  127. package/dist/src/config/paths.d.ts +1 -1
  128. package/dist/src/config/paths.js +2 -2
  129. package/dist/src/config/schema.js +1 -1
  130. package/dist/src/connectors/auth-provider-registry.d.ts +2 -1
  131. package/dist/src/connectors/auth-provider-registry.js +5 -2
  132. package/dist/src/connectors/composio-sessions.d.ts +39 -0
  133. package/dist/src/connectors/composio-sessions.js +66 -7
  134. package/dist/src/connectors/composio.d.ts +4 -1
  135. package/dist/src/connectors/composio.js +34 -7
  136. package/dist/src/connectors/connected-source-cursor.d.ts +9 -0
  137. package/dist/src/connectors/connected-source-cursor.js +30 -0
  138. package/dist/src/connectors/connected-source-ingestion.js +67 -46
  139. package/dist/src/connectors/connected-source-normalizers.d.ts +1 -0
  140. package/dist/src/connectors/connected-source-normalizers.js +33 -2
  141. package/dist/src/connectors/connected-source-sanitization.d.ts +1 -0
  142. package/dist/src/connectors/connected-source-sanitization.js +21 -0
  143. package/dist/src/connectors/connector-identity.js +10 -2
  144. package/dist/src/connectors/content-enrichment.d.ts +29 -0
  145. package/dist/src/connectors/content-enrichment.js +273 -0
  146. package/dist/src/connectors/health.js +1 -1
  147. package/dist/src/connectors/learning-coordinator.js +1 -2
  148. package/dist/src/connectors/learning-recipes.js +28 -33
  149. package/dist/src/connectors/runtime-adapter-registry.js +14 -1
  150. package/dist/src/discussions/live-worker.d.ts +1 -0
  151. package/dist/src/discussions/live-worker.js +7 -1
  152. package/dist/src/discussions/repository.js +11 -1
  153. package/dist/src/discussions/sealer.d.ts +1 -1
  154. package/dist/src/discussions/sealer.js +16 -7
  155. package/dist/src/discussions/transcript.js +27 -1
  156. package/dist/src/discussions/types.d.ts +4 -0
  157. package/dist/src/gateway/agents-admin.js +1 -1
  158. package/dist/src/gateway/hono/app.js +8 -3
  159. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  160. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +8 -1
  161. package/dist/src/gateway/hono/oauth-async.d.ts +11 -5
  162. package/dist/src/gateway/hono/oauth-async.js +29 -16
  163. package/dist/src/gateway/hono/oauth.d.ts +1 -3
  164. package/dist/src/gateway/hono/oauth.js +22 -22
  165. package/dist/src/gateway/hono/routes/agent-stream.js +4 -1
  166. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  167. package/dist/src/gateway/hono/routes/connectors.js +16 -3
  168. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  169. package/dist/src/gateway/hono/routes/discussions.js +2 -1
  170. package/dist/src/gateway/hono/routes/lazy-bundles.js +2 -1
  171. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  172. package/dist/src/gateway/hono/routes/models.js +59 -5
  173. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +60 -0
  174. package/dist/src/gateway/hono/routes/session-input-handler.js +75 -1
  175. package/dist/src/gateway/hono/routes/understanding-sources.js +29 -0
  176. package/dist/src/gateway/hono/routes/voice.d.ts +1 -2
  177. package/dist/src/gateway/hono/routes/voice.js +16 -35
  178. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  179. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  180. package/dist/src/gateway/service/agent-runner.d.ts +9 -1
  181. package/dist/src/gateway/service/agent-runner.js +9 -0
  182. package/dist/src/gateway/service/session-input-coordinator.d.ts +12 -0
  183. package/dist/src/gateway/service/session-input-coordinator.js +63 -6
  184. package/dist/src/gateway/service.d.ts +8 -0
  185. package/dist/src/gateway/service.js +18 -0
  186. package/dist/src/knowledge/connected-understanding-pipeline.d.ts +1 -1
  187. package/dist/src/knowledge/connected-understanding-pipeline.js +74 -25
  188. package/dist/src/knowledge/ingestion-service.js +33 -15
  189. package/dist/src/knowledge/types.d.ts +2 -0
  190. package/dist/src/media-understanding/audio-transcription-runner.d.ts +2 -0
  191. package/dist/src/media-understanding/audio-transcription-runner.js +3 -1
  192. package/dist/src/media-understanding/runner.js +3 -1
  193. package/dist/src/media-understanding/types.d.ts +2 -0
  194. package/dist/src/providers/model-catalog-persistence.d.ts +9 -0
  195. package/dist/src/providers/model-catalog-persistence.js +172 -0
  196. package/dist/src/providers/model-catalog-ranking.d.ts +2 -0
  197. package/dist/src/providers/model-catalog-ranking.js +17 -0
  198. package/dist/src/providers/model-catalog-store.d.ts +13 -3
  199. package/dist/src/providers/model-catalog-store.js +24 -5
  200. package/dist/src/providers/model-catalog-sync-service.d.ts +3 -3
  201. package/dist/src/providers/model-catalog-sync-service.js +12 -7
  202. package/dist/src/providers/provider-auth-service.d.ts +1 -0
  203. package/dist/src/providers/provider-auth-service.js +3 -0
  204. package/dist/src/providers/provider-disconnect.d.ts +11 -0
  205. package/dist/src/providers/provider-disconnect.js +33 -0
  206. package/dist/src/providers/xopc-cloud-catalog-coordinator.d.ts +56 -0
  207. package/dist/src/providers/xopc-cloud-catalog-coordinator.js +182 -0
  208. package/dist/src/providers/xopc-cloud-model-source.d.ts +6 -10
  209. package/dist/src/providers/xopc-cloud-model-source.js +49 -27
  210. package/dist/src/retrieval/audit.d.ts +1 -0
  211. package/dist/src/retrieval/audit.js +8 -0
  212. package/dist/src/retrieval/candidateFusion.d.ts +5 -0
  213. package/dist/src/retrieval/candidateFusion.js +20 -0
  214. package/dist/src/retrieval/queryProfile.d.ts +16 -0
  215. package/dist/src/retrieval/queryProfile.js +66 -0
  216. package/dist/src/retrieval/textFeatures.d.ts +5 -0
  217. package/dist/src/retrieval/textFeatures.js +71 -0
  218. package/dist/src/session/client-history.d.ts +1 -0
  219. package/dist/src/session/client-history.js +4 -0
  220. package/dist/src/session/index.js +1 -1
  221. package/dist/src/session/store.js +1 -1
  222. package/dist/src/storage/sqlite/fts.d.ts +0 -4
  223. package/dist/src/storage/sqlite/fts.js +2 -49
  224. package/dist/src/storage/sqlite/index.d.ts +3 -2
  225. package/dist/src/storage/sqlite/index.js +6 -5
  226. package/dist/src/storage/sqlite/knowledge-repository.d.ts +1 -0
  227. package/dist/src/storage/sqlite/knowledge-repository.js +4 -0
  228. package/dist/src/storage/sqlite/memory-records-repository.js +60 -38
  229. package/dist/src/storage/sqlite/row-mappers.js +2 -2
  230. package/dist/src/storage/sqlite/session-repository.js +2 -2
  231. package/dist/src/storage/sqlite/session-turn-replace-repository.d.ts +34 -0
  232. package/dist/src/storage/sqlite/session-turn-replace-repository.js +110 -0
  233. package/dist/src/storage/sqlite/transcript-repository.js +1 -1
  234. package/dist/src/storage/sqlite/user-context-quality-repository.d.ts +15 -0
  235. package/dist/src/storage/sqlite/user-context-quality-repository.js +46 -2
  236. package/dist/src/storage/sqlite/user-context-repository.d.ts +4 -0
  237. package/dist/src/storage/sqlite/user-context-repository.js +29 -3
  238. package/dist/src/tasks/home-query-service.d.ts +3 -1
  239. package/dist/src/tasks/home-query-service.js +73 -70
  240. package/dist/src/tui/backends/embedded-backend.js +12 -4
  241. package/dist/src/tui/tui-oauth-login.js +5 -0
  242. package/dist/src/tui/tui-startup-resources.js +1 -1
  243. package/dist/src/user-context/planner.d.ts +1 -0
  244. package/dist/src/user-context/planner.js +16 -29
  245. package/dist/src/user-context/retriever.d.ts +15 -0
  246. package/dist/src/user-context/retriever.js +65 -0
  247. package/dist/src/user-context/scope.d.ts +7 -0
  248. package/dist/src/user-context/scope.js +9 -0
  249. package/dist/src/user-context/sources/activity-clustering.js +30 -117
  250. package/dist/src/user-context/sources/index.d.ts +1 -0
  251. package/dist/src/user-context/sources/index.js +2 -1
  252. package/dist/src/user-context/sources/signal-clustering.d.ts +18 -0
  253. package/dist/src/user-context/sources/signal-clustering.js +131 -0
  254. package/dist/src/voice/audio/normalize.d.ts +17 -0
  255. package/dist/src/voice/audio/normalize.js +155 -0
  256. package/dist/src/voice/language-profile.d.ts +1 -4
  257. package/dist/src/voice/language-profile.js +2 -25
  258. package/dist/src/voice/local/runtime-client.d.ts +2 -0
  259. package/dist/src/voice/local/runtime-client.js +20 -1
  260. package/dist/src/voice/local/runtime-worker.js +7 -13
  261. package/dist/src/voice/local/wav.js +1 -1
  262. package/dist/src/voice/stt/availability.d.ts +1 -4
  263. package/dist/src/voice/stt/availability.js +3 -15
  264. package/dist/src/voice/stt/config.js +1 -0
  265. package/dist/src/voice/stt/factory.js +23 -0
  266. package/dist/src/voice/stt/index.d.ts +1 -0
  267. package/dist/src/voice/stt/index.js +2 -2
  268. package/dist/src/voice/stt/list-providers.js +1 -1
  269. package/dist/src/voice/stt/providers/local-transcription.js +7 -3
  270. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +3 -1
  271. package/dist/src/voice/stt/transcribe-core.d.ts +5 -1
  272. package/dist/src/voice/stt/transcribe-core.js +13 -5
  273. package/dist/src/voice/stt/types.d.ts +2 -0
  274. package/dist/src/voice/tts/factory.d.ts +1 -1
  275. package/dist/src/voice/tts/factory.js +23 -1
  276. package/dist/src/voice/tts/merge-config.js +5 -3
  277. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +3 -1
  278. package/dist/src/voice/tts/types.d.ts +2 -0
  279. package/dist/src/voice/tts/types.js +4 -2
  280. package/dist/src/work-discovery/evaluation.d.ts +23 -0
  281. package/dist/src/work-discovery/evaluation.js +18 -1
  282. package/dist/src/work-discovery/index.js +2 -2
  283. package/package.json +4 -3
  284. package/dist/gateway/static/root/assets/agents-Bl8FQZxW.js +0 -68
  285. package/dist/gateway/static/root/assets/apps-page-CRUgTO10.js +0 -1
  286. package/dist/gateway/static/root/assets/automations-page-DrSwolhG.js +0 -6
  287. package/dist/gateway/static/root/assets/browser-settings-page-NlvDyMwD.js +0 -8
  288. package/dist/gateway/static/root/assets/capabilities-settings-panel-BWXUznw5.js +0 -7
  289. package/dist/gateway/static/root/assets/capability-presets-settings-panel-D0loEbzq.js +0 -3
  290. package/dist/gateway/static/root/assets/channels-settings-CcivCw8U.js +0 -1
  291. package/dist/gateway/static/root/assets/channels-status-swr-DkHAD2Zn.js +0 -1
  292. package/dist/gateway/static/root/assets/chat-terminal-dock-DVedGAeX.js +0 -36
  293. package/dist/gateway/static/root/assets/connectors-page-DlBSlfkv.js +0 -2
  294. package/dist/gateway/static/root/assets/heartbeat-settings-UZAn1aAQ.js +0 -1
  295. package/dist/gateway/static/root/assets/home-page-CRJDpy5E.js +0 -3
  296. package/dist/gateway/static/root/assets/index-BSjP0Wsx.css +0 -2
  297. package/dist/gateway/static/root/assets/index-C2ZYFBGL.js +0 -85
  298. package/dist/gateway/static/root/assets/local-app-workbench-page-D9bguWRo.js +0 -2
  299. package/dist/gateway/static/root/assets/logs-page-Gr-nE4nW.js +0 -2
  300. package/dist/gateway/static/root/assets/markdown-view-B12xeflb.css +0 -1
  301. package/dist/gateway/static/root/assets/messages-yG5P43Q9.js +0 -3
  302. package/dist/gateway/static/root/assets/notes-workbench-CpbD4XG2.js +0 -4
  303. package/dist/gateway/static/root/assets/project-detail-page-GvSYDbjR.js +0 -1
  304. package/dist/gateway/static/root/assets/projects-page-DPRxKGbs.js +0 -1
  305. package/dist/gateway/static/root/assets/remote-access-hub-WIzeu-gB.js +0 -1
  306. package/dist/gateway/static/root/assets/sessions-page-2XEJM0YE.js +0 -1
  307. package/dist/gateway/static/root/assets/settings-advanced-gate-g1GThZ0O.js +0 -1
  308. package/dist/gateway/static/root/assets/setup-status-panel-C6qj2L-q.js +0 -1
  309. package/dist/gateway/static/root/assets/shares-settings-BBpE1bep.js +0 -1
  310. package/dist/gateway/static/root/assets/skill-reload-api-DXORBJNk.js +0 -1
  311. package/dist/gateway/static/root/assets/task-detail-page-DC0hc8hp.js +0 -1
  312. package/dist/gateway/static/root/assets/user-context-page-Bwg4KV8B.js +0 -1
  313. package/dist/gateway/static/root/assets/work-discovery-page-CmPfOfHl.js +0 -1
  314. package/dist/gateway/static/root/assets/workflows-page-DhQNh7W6.js +0 -5
  315. package/dist/src/voice/local/runtime-dispatcher.d.ts +0 -9
  316. package/dist/src/voice/local/runtime-dispatcher.js +0 -20
@@ -60,3 +60,63 @@ export declare function submitSessionInput(c: Context, deps: AuthenticatedRouteD
60
60
  };
61
61
  };
62
62
  }, 202, "json">)>;
63
+ export declare function replaceLatestSessionTurn(c: Context, deps: AuthenticatedRouteDeps, sessionKey: string, targetTurnId: string): Promise<(Response & import("hono").TypedResponse<{
64
+ ok: false;
65
+ error: {
66
+ code: string;
67
+ message: string;
68
+ };
69
+ }, 400, "json">) | (Response & import("hono").TypedResponse<{
70
+ ok: false;
71
+ error: {
72
+ code: string;
73
+ message: string;
74
+ };
75
+ }, 401, "json">) | (Response & import("hono").TypedResponse<{
76
+ ok: false;
77
+ error: {
78
+ code: "TARGET_NOT_FOUND" | "NOT_LATEST" | "SESSION_BUSY" | "BAD_REQUEST";
79
+ message: string;
80
+ };
81
+ }, 400 | 404 | 409, "json">) | (Response & import("hono").TypedResponse<{
82
+ ok: true;
83
+ payload: {
84
+ sessionKey: string;
85
+ ok: true;
86
+ effectiveDelivery: "next";
87
+ state: {
88
+ sessionKey: string;
89
+ revision: number;
90
+ activeRunId?: string;
91
+ activeInputId?: string;
92
+ inputs: {
93
+ id: string;
94
+ sessionKey: string;
95
+ clientMessageId: string;
96
+ requestedDelivery: import("../../../storage/sqlite/session-input-repository.js").SessionInputDelivery;
97
+ effectiveDelivery: import("../../../storage/sqlite/session-input-repository.js").SessionInputDelivery;
98
+ status: import("../../../storage/sqlite/session-input-repository.js").SessionInputStatus;
99
+ content: string;
100
+ attachments?: import("hono/dist/types/utils/types.js").JSONValue[];
101
+ thinking?: string;
102
+ origin: {
103
+ type: "endpoint";
104
+ endpointId: string;
105
+ } | {
106
+ type: "channel";
107
+ channel: string;
108
+ } | {
109
+ type: "system";
110
+ source: "cli" | "workflow" | "automation" | "heartbeat" | "internal";
111
+ };
112
+ position: number;
113
+ targetRunId?: string;
114
+ runId?: string;
115
+ version: number;
116
+ error?: string;
117
+ createdAtMs: number;
118
+ updatedAtMs: number;
119
+ }[];
120
+ };
121
+ };
122
+ }, 202, "json">)>;
@@ -78,5 +78,79 @@ async function submitSessionInput(c, deps, sessionKey) {
78
78
  }
79
79
  }, 202);
80
80
  }
81
+ async function replaceLatestSessionTurn(c, deps, sessionKey, targetTurnId) {
82
+ const body = await c.req.json().catch(() => null);
83
+ if (!body || !sessionKey || !targetTurnId) return c.json({
84
+ ok: false,
85
+ error: {
86
+ code: "BAD_REQUEST",
87
+ message: "Invalid request"
88
+ }
89
+ }, 400);
90
+ const attachments = Array.isArray(body.attachments) ? body.attachments : void 0;
91
+ const content = typeof body.content === "string" ? body.content : "";
92
+ const contentError = validateWebchatContent(content);
93
+ if (contentError) return c.json({
94
+ ok: false,
95
+ error: {
96
+ code: "BAD_REQUEST",
97
+ message: contentError
98
+ }
99
+ }, 400);
100
+ const attachmentError = validateWebchatAttachments(attachments);
101
+ if (attachmentError) return c.json({
102
+ ok: false,
103
+ error: {
104
+ code: "BAD_REQUEST",
105
+ message: attachmentError
106
+ }
107
+ }, 400);
108
+ const origin = endpointTurnClaimSchema.safeParse(body.origin);
109
+ if (!origin.success) return c.json({
110
+ ok: false,
111
+ error: {
112
+ code: "BAD_REQUEST",
113
+ message: "Invalid endpoint origin"
114
+ }
115
+ }, 400);
116
+ if (!deps.service.endpointTools.registry.verifyTurnClaim(origin.data.endpointId, origin.data.token)) return c.json({
117
+ ok: false,
118
+ error: {
119
+ code: "INVALID_ENDPOINT",
120
+ message: "Endpoint connection is not active"
121
+ }
122
+ }, 401);
123
+ const result = await deps.service.replaceLatestSessionTurn({
124
+ sessionKey,
125
+ targetTurnId,
126
+ clientMessageId: typeof body.clientMessageId === "string" ? body.clientMessageId : "",
127
+ delivery: "next",
128
+ content,
129
+ attachments,
130
+ thinking: typeof body.thinking === "string" ? body.thinking : void 0,
131
+ origin: {
132
+ type: "endpoint",
133
+ endpointId: origin.data.endpointId
134
+ }
135
+ });
136
+ if (result.ok === false) {
137
+ const status = result.code === "TARGET_NOT_FOUND" ? 404 : result.code === "BAD_REQUEST" ? 400 : 409;
138
+ const message = result.code === "NOT_LATEST" ? "Only the latest user turn can be replaced" : result.code === "SESSION_BUSY" ? "Session has pending input" : result.code === "TARGET_NOT_FOUND" ? "User turn was not found" : "Replacement input was not accepted";
139
+ return c.json({
140
+ ok: false,
141
+ error: {
142
+ code: result.code,
143
+ message
144
+ }
145
+ }, status);
146
+ }
147
+ return c.json({
148
+ ok: true,
149
+ payload: {
150
+ ...result,
151
+ sessionKey
152
+ }
153
+ }, 202);
154
+ }
81
155
  //#endregion
82
- export { submitSessionInput };
156
+ export { replaceLatestSessionTurn, submitSessionInput };
@@ -1,10 +1,13 @@
1
1
  import { deleteUnderstanding, listUnderstandingEvidence, listUnderstandings } from "../../../storage/sqlite/user-context-repository.js";
2
2
  import { getConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
3
3
  import "../../../storage/sqlite/index.js";
4
+ import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
4
5
  import { deleteUserFocus, getUnderstandingSourceGrant, listUnderstandingSourceGrants, listUserFocuses, revokeUnderstandingSourceGrant, setUserFocusStatus } from "../../../user-context/sources/repository.js";
6
+ import { listConnectedContentCandidates, readConnectedContent } from "../../../connectors/content-enrichment.js";
5
7
  import { getWorkDiscoveryService } from "./work-discovery.js";
6
8
  import { listUnderstandingSourceDefinitions } from "../../../user-context/sources/catalog.js";
7
9
  //#region src/gateway/hono/routes/understanding-sources.ts
10
+ init_agent_scope();
8
11
  function stringField(body, field) {
9
12
  if (!body || typeof body !== "object") return "";
10
13
  const value = body[field];
@@ -39,6 +42,32 @@ function registerUnderstandingSourceRoutes(authenticated, deps) {
39
42
  ok: true,
40
43
  grants: listUnderstandingSourceGrants({ includeRevoked: c.req.query("includeRevoked") === "true" })
41
44
  }));
45
+ authenticated.get("/api/understanding/sources/content-candidates", (c) => {
46
+ const agentId = resolveDefaultAgentId(deps.service.currentConfig);
47
+ return c.json({
48
+ ok: true,
49
+ candidates: listConnectedContentCandidates({ agentId })
50
+ });
51
+ });
52
+ authenticated.post("/api/understanding/sources/content-reads", limited, async (c) => {
53
+ const body = await c.req.json().catch(() => null);
54
+ const sourceItemIds = body && typeof body === "object" && Array.isArray(body.sourceItemIds) ? body.sourceItemIds.filter((value) => typeof value === "string") : [];
55
+ try {
56
+ const agentId = resolveDefaultAgentId(deps.service.currentConfig);
57
+ return c.json({
58
+ ok: true,
59
+ result: await readConnectedContent({
60
+ sourceItemIds,
61
+ agentId
62
+ })
63
+ });
64
+ } catch (error) {
65
+ return c.json({
66
+ ok: false,
67
+ error: error instanceof Error ? error.message : String(error)
68
+ }, 400);
69
+ }
70
+ });
42
71
  authenticated.delete("/api/understanding/sources/grants/:grantId", limited, (c) => {
43
72
  const current = getUnderstandingSourceGrant(c.req.param("grantId"));
44
73
  const accountId = typeof current?.config.accountId === "string" ? current.config.accountId : void 0;
@@ -1,6 +1,5 @@
1
1
  /**
2
- * Voice routes — POST /api/voice/transcriptions (multipart) and legacy
3
- * POST /api/voice/transcribe (JSON/base64).
2
+ * Voice routes — POST /api/voice/transcriptions (multipart).
4
3
  *
5
4
  * The endpoints share one execution path that:
6
5
  * 1. Runs the configured STT provider and fallback chain
@@ -6,7 +6,7 @@ import { speak } from "../../../voice/tts/speak-core.js";
6
6
  import { mergeTtsConfigFromAppConfig } from "../../../voice/tts/merge-config.js";
7
7
  import { getLocalVoiceRuntimeClient } from "../../../voice/local/runtime-client.js";
8
8
  import { resolveSttProviderConfigSlice } from "../../../voice/stt/config-slice.js";
9
- import { transcribe } from "../../../voice/stt/transcribe-core.js";
9
+ import { STTTranscriptionError, transcribe } from "../../../voice/stt/transcribe-core.js";
10
10
  import { isSTTAvailable } from "../../../voice/stt/availability.js";
11
11
  import { mergeSttConfigFromAppConfig } from "../../../voice/stt/config.js";
12
12
  import "../../../voice/stt/index.js";
@@ -497,6 +497,7 @@ function registerVoiceRoutes(authenticated, deps) {
497
497
  ...detectedLanguage ? { language: detectedLanguage } : {},
498
498
  provider: result.provider,
499
499
  attempts: result.attempts,
500
+ ...result.duration !== void 0 ? { durationSeconds: result.duration } : {},
500
501
  latencyMs: Date.now() - startedAt
501
502
  }
502
503
  });
@@ -507,9 +508,22 @@ function registerVoiceRoutes(authenticated, deps) {
507
508
  mimeType: input.mimeType,
508
509
  fileName: input.fileName
509
510
  }, `Voice transcription failed: ${msg}`);
511
+ if (error instanceof STTTranscriptionError) {
512
+ const status = error.reasonCode === "unsupported_format" ? 415 : error.reasonCode === "timeout" ? 504 : 502;
513
+ return c.json({
514
+ ok: false,
515
+ error: {
516
+ code: error.reasonCode,
517
+ message: `Transcription failed: ${msg}`
518
+ }
519
+ }, status);
520
+ }
510
521
  return c.json({
511
522
  ok: false,
512
- error: { message: `Transcription failed: ${msg}` }
523
+ error: {
524
+ code: "provider_error",
525
+ message: `Transcription failed: ${msg}`
526
+ }
513
527
  }, 502);
514
528
  }
515
529
  };
@@ -544,39 +558,6 @@ function registerVoiceRoutes(authenticated, deps) {
544
558
  ...language ? { language } : {}
545
559
  });
546
560
  });
547
- /** Legacy JSON/base64 endpoint retained for mobile and external clients. */
548
- authenticated.post("/api/voice/transcribe", strictRateLimitMiddleware, async (c) => {
549
- let body = {};
550
- try {
551
- body = await c.req.json();
552
- } catch {
553
- return c.json({
554
- ok: false,
555
- error: { message: "Invalid JSON body" }
556
- }, 400);
557
- }
558
- if (typeof body.audio !== "string" || !body.audio.trim()) return c.json({
559
- ok: false,
560
- error: { message: "Missing required field: audio (base64)" }
561
- }, 400);
562
- if (typeof body.mimeType !== "string" || !body.mimeType.trim()) return c.json({
563
- ok: false,
564
- error: { message: "Missing required field: mimeType" }
565
- }, 400);
566
- const encoded = body.audio.replace(/\s/g, "");
567
- if (encoded.length % 4 === 1 || !/^[A-Za-z0-9+/]*={0,2}$/.test(encoded)) return c.json({
568
- ok: false,
569
- error: { message: "Invalid base64 audio data" }
570
- }, 400);
571
- const language = typeof body.language === "string" && body.language.trim() ? body.language.trim() : void 0;
572
- const fileName = typeof body.fileName === "string" && body.fileName.trim() ? body.fileName.trim() : `audio-${Date.now()}`;
573
- return runTranscription(c, {
574
- audioBuffer: Buffer.from(encoded, "base64"),
575
- mimeType: body.mimeType.trim(),
576
- fileName,
577
- ...language ? { language } : {}
578
- });
579
- });
580
561
  }
581
562
  //#endregion
582
563
  export { registerVoiceRoutes };
@@ -36,6 +36,7 @@ declare class BucketRegistry {
36
36
  private authFailureSignature?;
37
37
  private strictApiLimiter?;
38
38
  private chatApiLimiter?;
39
+ private mediaApiLimiter?;
39
40
  private taskApiLimiter?;
40
41
  private xopcCloudPollLimiter?;
41
42
  private channelApiLimiter?;
@@ -53,6 +54,8 @@ declare class BucketRegistry {
53
54
  strictApi(): RateLimiter;
54
55
  /** Interactive chat actions — 180 req / 60 s per client IP. */
55
56
  chatApi(): RateLimiter;
57
+ /** Durable media chunk uploads — 300 req / 60 s per client IP. */
58
+ mediaApi(): RateLimiter;
56
59
  /** Interactive task and board mutations — 300 req / 60 s per client IP. */
57
60
  taskApi(): RateLimiter;
58
61
  /** XOPC Cloud authorization polling — 60 req / 60 s per client IP. */
@@ -48,6 +48,7 @@ var BucketRegistry = class {
48
48
  authFailureSignature;
49
49
  strictApiLimiter;
50
50
  chatApiLimiter;
51
+ mediaApiLimiter;
51
52
  taskApiLimiter;
52
53
  xopcCloudPollLimiter;
53
54
  channelApiLimiter;
@@ -90,6 +91,14 @@ var BucketRegistry = class {
90
91
  });
91
92
  return this.chatApiLimiter;
92
93
  }
94
+ /** Durable media chunk uploads — 300 req / 60 s per client IP. */
95
+ mediaApi() {
96
+ if (!this.mediaApiLimiter) this.mediaApiLimiter = new RateLimiter({
97
+ maxRequests: 300,
98
+ windowMs: 6e4
99
+ });
100
+ return this.mediaApiLimiter;
101
+ }
93
102
  /** Interactive task and board mutations — 300 req / 60 s per client IP. */
94
103
  taskApi() {
95
104
  if (!this.taskApiLimiter) this.taskApiLimiter = new RateLimiter({
@@ -151,6 +160,7 @@ var BucketRegistry = class {
151
160
  this.authFailureLimiter?.destroy();
152
161
  this.strictApiLimiter?.destroy();
153
162
  this.chatApiLimiter?.destroy();
163
+ this.mediaApiLimiter?.destroy();
154
164
  this.taskApiLimiter?.destroy();
155
165
  this.xopcCloudPollLimiter?.destroy();
156
166
  this.channelApiLimiter?.destroy();
@@ -161,6 +171,7 @@ var BucketRegistry = class {
161
171
  this.authFailureLimiter = void 0;
162
172
  this.strictApiLimiter = void 0;
163
173
  this.chatApiLimiter = void 0;
174
+ this.mediaApiLimiter = void 0;
164
175
  this.taskApiLimiter = void 0;
165
176
  this.xopcCloudPollLimiter = void 0;
166
177
  this.channelApiLimiter = void 0;
@@ -175,6 +186,7 @@ var BucketRegistry = class {
175
186
  this.authFailureLimiter?.resetForTests();
176
187
  this.strictApiLimiter?.resetForTests();
177
188
  this.chatApiLimiter?.resetForTests();
189
+ this.mediaApiLimiter?.resetForTests();
178
190
  this.taskApiLimiter?.resetForTests();
179
191
  this.xopcCloudPollLimiter?.resetForTests();
180
192
  this.channelApiLimiter?.resetForTests();
@@ -27,7 +27,7 @@ import type { SessionIndex } from '../../session/index.js';
27
27
  import type { ClarifyStreamEvent } from '../clarify-bridge.js';
28
28
  import { ClarifyBridge, type ClarifyBridgeRequest } from '../clarify-bridge.js';
29
29
  import type { UserTurnAttachment, UserTurnInput } from '../user-turn-input.js';
30
- import { SessionInputCoordinator, type SubmitSessionInput } from './session-input-coordinator.js';
30
+ import { SessionInputCoordinator, type ReplaceLatestTurnInput, type SubmitSessionInput } from './session-input-coordinator.js';
31
31
  export interface GatewayAgentRunnerOptions {
32
32
  bus: MessageBus;
33
33
  sessionIndex: SessionIndex;
@@ -79,6 +79,14 @@ export declare class GatewayAgentRunner {
79
79
  ok: false;
80
80
  code: "BAD_REQUEST" | "QUEUE_FULL";
81
81
  }>;
82
+ replaceLatestSessionTurn(input: ReplaceLatestTurnInput): Promise<{
83
+ ok: true;
84
+ effectiveDelivery: "next";
85
+ state: import("../../storage/sqlite/session-input-repository.js").SessionInputState;
86
+ } | {
87
+ ok: false;
88
+ code: "BAD_REQUEST" | "TARGET_NOT_FOUND" | "NOT_LATEST" | "SESSION_BUSY";
89
+ }>;
82
90
  getSessionInputState(sessionKey: string): import("../../storage/sqlite/session-input-repository.js").SessionInputState;
83
91
  updateSessionInput(sessionKey: string, id: string, body: {
84
92
  version: number;
@@ -115,6 +115,15 @@ var GatewayAgentRunner = class {
115
115
  submitSessionInput(input) {
116
116
  return this.inputs.submit(input);
117
117
  }
118
+ replaceLatestSessionTurn(input) {
119
+ return this.inputs.replaceLatestTurn(input, async () => {
120
+ const activeRunId = this.activeWebchatRunBySession.get(input.sessionKey) ?? this.inputs.snapshot(input.sessionKey).activeRunId;
121
+ if (activeRunId) await this.abortAgentRun(activeRunId);
122
+ const { evictEmbeddedSessionRunner } = await import("../../agent/embedded/session-runner.js");
123
+ evictEmbeddedSessionRunner(input.sessionKey, "gateway_user_turn_replaced");
124
+ this.opts.getAgentService().evictSessionAgent(input.sessionKey);
125
+ });
126
+ }
118
127
  getSessionInputState(sessionKey) {
119
128
  return this.inputs.snapshot(sessionKey);
120
129
  }
@@ -10,6 +10,9 @@ export type SubmitSessionInput = {
10
10
  thinking?: string;
11
11
  origin: TurnOrigin;
12
12
  };
13
+ export type ReplaceLatestTurnInput = SubmitSessionInput & {
14
+ targetTurnId: string;
15
+ };
13
16
  export declare class SessionInputCoordinator {
14
17
  private readonly deps;
15
18
  private readonly draining;
@@ -33,6 +36,7 @@ export declare class SessionInputCoordinator {
33
36
  });
34
37
  snapshot(sessionKey: string): SessionInputState;
35
38
  private publish;
39
+ private runSubmissionExclusive;
36
40
  submit(input: SubmitSessionInput): Promise<{
37
41
  ok: true;
38
42
  effectiveDelivery: SessionInputDelivery;
@@ -41,6 +45,14 @@ export declare class SessionInputCoordinator {
41
45
  ok: false;
42
46
  code: 'BAD_REQUEST' | 'QUEUE_FULL';
43
47
  }>;
48
+ replaceLatestTurn(input: ReplaceLatestTurnInput, beforeReplace: () => Promise<void>): Promise<{
49
+ ok: true;
50
+ effectiveDelivery: 'next';
51
+ state: SessionInputState;
52
+ } | {
53
+ ok: false;
54
+ code: 'BAD_REQUEST' | 'TARGET_NOT_FOUND' | 'NOT_LATEST' | 'SESSION_BUSY';
55
+ }>;
44
56
  private submitLocked;
45
57
  drain(sessionKey: string): Promise<void>;
46
58
  update(sessionKey: string, id: string, body: {
@@ -1,7 +1,9 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputState, insertSessionInput, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus } from "../../storage/sqlite/session-input-repository.js";
4
+ import { replaceLatestSessionTurnAndQueueInput, validateLatestSessionTurnTarget } from "../../storage/sqlite/session-turn-replace-repository.js";
4
5
  import "../../storage/sqlite/index.js";
6
+ import { deleteMediaUrisNoLongerReferenced } from "../../media/session-references.js";
5
7
  import crypto from "node:crypto";
6
8
  //#region src/gateway/service/session-input-coordinator.ts
7
9
  init_logger();
@@ -21,8 +23,7 @@ var SessionInputCoordinator = class {
21
23
  this.deps.emit("session.input-state", state);
22
24
  return state;
23
25
  }
24
- async submit(input) {
25
- const sessionKey = input.sessionKey.trim();
26
+ async runSubmissionExclusive(sessionKey, operation) {
26
27
  const previous = this.submissionTails.get(sessionKey) ?? Promise.resolve();
27
28
  let release = () => {};
28
29
  const current = new Promise((resolve) => {
@@ -32,15 +33,71 @@ var SessionInputCoordinator = class {
32
33
  this.submissionTails.set(sessionKey, tail);
33
34
  await previous;
34
35
  try {
35
- return await this.submitLocked({
36
- ...input,
37
- sessionKey
38
- });
36
+ return await operation();
39
37
  } finally {
40
38
  release();
41
39
  if (this.submissionTails.get(sessionKey) === tail) this.submissionTails.delete(sessionKey);
42
40
  }
43
41
  }
42
+ async submit(input) {
43
+ const sessionKey = input.sessionKey.trim();
44
+ return this.runSubmissionExclusive(sessionKey, () => this.submitLocked({
45
+ ...input,
46
+ sessionKey
47
+ }));
48
+ }
49
+ async replaceLatestTurn(input, beforeReplace) {
50
+ const sessionKey = input.sessionKey.trim();
51
+ return this.runSubmissionExclusive(sessionKey, async () => {
52
+ const clientMessageId = input.clientMessageId.trim();
53
+ const content = input.content.trim();
54
+ const targetTurnId = input.targetTurnId.trim();
55
+ if (!sessionKey || !clientMessageId || !targetTurnId || !content && !input.attachments?.length) return {
56
+ ok: false,
57
+ code: "BAD_REQUEST"
58
+ };
59
+ if (!await this.deps.sessionExists(sessionKey)) return {
60
+ ok: false,
61
+ code: "BAD_REQUEST"
62
+ };
63
+ if (findSessionInput(sessionKey, clientMessageId)) return {
64
+ ok: true,
65
+ effectiveDelivery: "next",
66
+ state: this.snapshot(sessionKey)
67
+ };
68
+ const target = validateLatestSessionTurnTarget(sessionKey, targetTurnId);
69
+ if (target.ok === false) return target;
70
+ await beforeReplace();
71
+ const attachments = await this.deps.prepareAttachments(sessionKey, input.attachments);
72
+ const result = replaceLatestSessionTurnAndQueueInput({
73
+ sessionKey,
74
+ targetTurnId,
75
+ clientMessageId,
76
+ content,
77
+ attachments,
78
+ thinking: input.thinking,
79
+ origin: input.origin
80
+ });
81
+ if (result.ok === false) return result;
82
+ if (!result.idempotent) {
83
+ const replacement = {
84
+ role: "user",
85
+ content,
86
+ media: attachments
87
+ };
88
+ await deleteMediaUrisNoLongerReferenced({
89
+ removed: result.removedMessages,
90
+ remaining: [...result.remainingMessages, replacement]
91
+ });
92
+ }
93
+ this.drain(sessionKey);
94
+ return {
95
+ ok: true,
96
+ effectiveDelivery: "next",
97
+ state: this.publish(sessionKey)
98
+ };
99
+ });
100
+ }
44
101
  async submitLocked(input) {
45
102
  const sessionKey = input.sessionKey;
46
103
  const clientMessageId = input.clientMessageId.trim();
@@ -140,6 +140,14 @@ export declare class GatewayService {
140
140
  ok: false;
141
141
  code: "BAD_REQUEST" | "QUEUE_FULL";
142
142
  }>;
143
+ replaceLatestSessionTurn(...args: Parameters<GatewayAgentRunner['replaceLatestSessionTurn']>): Promise<{
144
+ ok: true;
145
+ effectiveDelivery: "next";
146
+ state: import("../storage/sqlite/session-input-repository.js").SessionInputState;
147
+ } | {
148
+ ok: false;
149
+ code: "BAD_REQUEST" | "TARGET_NOT_FOUND" | "NOT_LATEST" | "SESSION_BUSY";
150
+ }>;
143
151
  getSessionInputState(...args: Parameters<GatewayAgentRunner['getSessionInputState']>): import("../storage/sqlite/session-input-repository.js").SessionInputState;
144
152
  updateSessionInput(...args: Parameters<GatewayAgentRunner['updateSessionInput']>): Promise<{
145
153
  ok: boolean;
@@ -88,6 +88,7 @@ import { getExposureManager } from "../remote-access/exposure-manager.js";
88
88
  import { assertGatewayAuthNotKnownWeak } from "./security/known-weak-secrets.js";
89
89
  import { assertGatewayRuntimeConfig } from "./runtime-config.js";
90
90
  import { auditGatewayConfig } from "./security/audit.js";
91
+ import { getXopcCloudCatalogCoordinator } from "../providers/xopc-cloud-catalog-coordinator.js";
91
92
  import { ModelCatalogSyncService } from "../providers/model-catalog-sync-service.js";
92
93
  import { runBootstrapMigrationsSync } from "../migrations/runner.js";
93
94
  import { MobileNotificationService } from "../mobile/notification-service.js";
@@ -641,6 +642,9 @@ var GatewayService = class {
641
642
  submitSessionInput(...args) {
642
643
  return this.agentRunner.submitSessionInput(...args);
643
644
  }
645
+ replaceLatestSessionTurn(...args) {
646
+ return this.agentRunner.replaceLatestSessionTurn(...args);
647
+ }
644
648
  getSessionInputState(...args) {
645
649
  return this.agentRunner.getSessionInputState(...args);
646
650
  }
@@ -791,6 +795,20 @@ var GatewayService = class {
791
795
  this.startupTrace = createGatewayStartupTrace();
792
796
  this.readiness.markStarting(this.startTime);
793
797
  const trace = this.startupTrace;
798
+ const catalogCoordinator = getXopcCloudCatalogCoordinator();
799
+ const catalog = await trace.measure("model-catalog.hydrate", () => catalogCoordinator.hydrate());
800
+ if (getAgentDefaultModelRef(this.config)?.startsWith("xopc-cloud/") && catalog.source === "none") {
801
+ const readiness = await trace.measure("model-catalog.initial-refresh", () => catalogCoordinator.ensure({
802
+ reason: "startup",
803
+ network: "if-empty",
804
+ timeoutMs: 1e4
805
+ }));
806
+ if (readiness.error) log.warn({
807
+ provider: "xopc-cloud",
808
+ phase: "catalog_refresh",
809
+ errorMessage: readiness.error.message
810
+ }, `Initial XOPC Cloud catalog refresh failed: ${readiness.error.message}`);
811
+ }
794
812
  registerClarifyBridge(this.agentRunner.getClarifyBridge());
795
813
  this.ensureAgentService();
796
814
  this.agentRunner.recoverSessionInputs();
@@ -13,5 +13,5 @@ export declare function renderConnectedObservation(observation: ClaimObservation
13
13
  export declare class ConnectedUnderstandingPipeline {
14
14
  private readonly memoryManager;
15
15
  constructor(memoryManager: MemoryManager);
16
- process(sourceInstanceId: string, connectorId: string, agentId: string): Promise<UnderstandingReviewResult>;
16
+ process(agentId: string): Promise<UnderstandingReviewResult>;
17
17
  }