@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
@@ -1,9 +1,39 @@
1
1
  import { getSqliteDatabase } from "./transaction.js";
2
2
  import { USER_CONTEXT_PRINCIPAL_ID } from "../../user-context/domain.js";
3
3
  //#region src/storage/sqlite/user-context-quality-repository.ts
4
+ function summarizeUnderstandingFeedback(understandingIds) {
5
+ const ids = [...new Set(understandingIds.filter(Boolean))].slice(0, 1e3);
6
+ if (!ids.length) return [];
7
+ const rows = getSqliteDatabase().prepare(`
8
+ SELECT object_id, rating, COUNT(*) AS count
9
+ FROM context_feedback
10
+ WHERE object_type = 'understanding' AND object_id IN (${ids.map(() => "?").join(", ")})
11
+ GROUP BY object_id, rating
12
+ `).all(...ids);
13
+ const summaries = /* @__PURE__ */ new Map();
14
+ for (const row of rows) {
15
+ const current = summaries.get(row.object_id) ?? {
16
+ understandingId: row.object_id,
17
+ helpful: 0,
18
+ irrelevant: 0,
19
+ total: 0
20
+ };
21
+ if (row.rating === "helpful") current.helpful += row.count;
22
+ if (row.rating === "irrelevant") current.irrelevant += row.count;
23
+ current.total += row.count;
24
+ summaries.set(row.object_id, current);
25
+ }
26
+ return [...summaries.values()];
27
+ }
4
28
  function rate(numerator, denominator) {
5
29
  return denominator > 0 ? Math.round(numerator / denominator * 1e4) / 1e4 : null;
6
30
  }
31
+ function median(values) {
32
+ if (!values.length) return null;
33
+ const sorted = values.toSorted((left, right) => left - right);
34
+ const middle = Math.floor(sorted.length / 2);
35
+ return sorted.length % 2 ? sorted[middle] : Math.round((sorted[middle - 1] + sorted[middle]) / 2);
36
+ }
7
37
  function summarizeUserUnderstandingQuality(options = {}) {
8
38
  const nowMs = options.nowMs ?? Date.now();
9
39
  const windowDays = Math.max(1, Math.min(365, Math.floor(options.windowDays ?? 30)));
@@ -59,6 +89,12 @@ function summarizeUserUnderstandingQuality(options = {}) {
59
89
  helpfulRate: null
60
90
  };
61
91
  recall.helpfulRate = rate(recall.helpful, recall.total);
92
+ const sourceRows = db.prepare(`SELECT last_collected_at
93
+ FROM understanding_source_grants WHERE status = 'active'`).all();
94
+ const bootstrapRows = db.prepare(`SELECT status, started_at, finished_at
95
+ FROM connector_learning_jobs WHERE mode = 'bootstrap' AND created_at >= ?`).all(sinceMs);
96
+ const completedBootstraps = bootstrapRows.filter((row) => row.status === "completed");
97
+ const bootstrapDurations = completedBootstraps.flatMap((row) => row.started_at !== null && row.finished_at !== null && row.finished_at >= row.started_at ? [row.finished_at - row.started_at] : []);
62
98
  return {
63
99
  windowDays,
64
100
  since: new Date(sinceMs).toISOString(),
@@ -67,8 +103,16 @@ function summarizeUserUnderstandingQuality(options = {}) {
67
103
  total: recentDecisions.length,
68
104
  acceptanceRate: rate(accepted, recentDecisions.length)
69
105
  },
70
- recall
106
+ recall,
107
+ quickUnderstanding: {
108
+ sourcesAuthorized: sourceRows.length,
109
+ sourcesCollected: sourceRows.filter((row) => row.last_collected_at !== null).length,
110
+ sourceCoverage: rate(sourceRows.filter((row) => row.last_collected_at !== null).length, sourceRows.length),
111
+ bootstrapJobs: bootstrapRows.length,
112
+ successfulBootstrapRate: rate(completedBootstraps.length, bootstrapRows.length),
113
+ medianBootstrapDurationMs: median(bootstrapDurations)
114
+ }
71
115
  };
72
116
  }
73
117
  //#endregion
74
- export { summarizeUserUnderstandingQuality };
118
+ export { summarizeUnderstandingFeedback, summarizeUserUnderstandingQuality };
@@ -10,6 +10,10 @@ export type CreateUnderstandingInput = Omit<UserUnderstanding, 'id' | 'versionId
10
10
  export declare function createUnderstanding(input: CreateUnderstandingInput, principalId?: string): UserUnderstanding;
11
11
  export declare function getUnderstanding(id: string): UserUnderstanding | undefined;
12
12
  export declare function listUnderstandings(statuses?: UnderstandingStatus[], principalId?: string): UserUnderstanding[];
13
+ export declare function searchActiveUnderstandings(query: string, limit?: number): Array<{
14
+ understanding: UserUnderstanding;
15
+ score: number;
16
+ }>;
13
17
  export declare function reviseUnderstanding(id: string, statement: string, options: {
14
18
  payload?: Record<string, unknown>;
15
19
  canonicalKey?: string;
@@ -1,5 +1,7 @@
1
1
  import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
2
  import { USER_CONTEXT_PRINCIPAL_ID } from "../../user-context/domain.js";
3
+ import { retrievalQueryAuditValue } from "../../retrieval/audit.js";
4
+ import { buildFts5SearchQuery, fts5RankToScore } from "./fts.js";
3
5
  import { randomUUID } from "node:crypto";
4
6
  //#region src/storage/sqlite/user-context-repository.ts
5
7
  const UNDERSTANDING_SELECT = `
@@ -132,6 +134,29 @@ function listUnderstandings(statuses, principalId = USER_CONTEXT_PRINCIPAL_ID) {
132
134
  const placeholders = statuses.map(() => "?").join(", ");
133
135
  return db.prepare(`${UNDERSTANDING_SELECT} WHERE u.principal_id = ? AND u.status IN (${placeholders}) ORDER BY u.updated_at DESC`).all(principalId, ...statuses).map(understandingFromRow);
134
136
  }
137
+ function searchActiveUnderstandings(query, limit = 50) {
138
+ const ftsQuery = buildFts5SearchQuery(query);
139
+ if (!ftsQuery) return [];
140
+ const boundedLimit = Math.max(1, Math.min(200, Math.floor(limit)));
141
+ const rows = getSqliteDatabase().prepare(`
142
+ SELECT u.*, v.statement, v.payload_json, bm25(user_understanding_fts) AS search_rank
143
+ FROM user_understanding_fts
144
+ JOIN user_understandings u
145
+ ON u.understanding_id = user_understanding_fts.understanding_id
146
+ JOIN user_understanding_versions v
147
+ ON v.version_id = u.current_version_id
148
+ WHERE user_understanding_fts MATCH ? AND u.principal_id = ? AND u.status = 'active'
149
+ ORDER BY search_rank
150
+ LIMIT ?
151
+ `).all(ftsQuery, USER_CONTEXT_PRINCIPAL_ID, boundedLimit);
152
+ if (!rows.length) return [];
153
+ const bestRank = Math.min(...rows.map((row) => row.search_rank));
154
+ const worstRank = Math.max(...rows.map((row) => row.search_rank));
155
+ return rows.map((row) => ({
156
+ understanding: understandingFromRow(row),
157
+ score: fts5RankToScore(row.search_rank, bestRank, worstRank)
158
+ }));
159
+ }
135
160
  function reviseUnderstanding(id, statement, options) {
136
161
  const current = getUnderstanding(id);
137
162
  if (!current) throw new Error(`User understanding not found: ${id}`);
@@ -282,16 +307,17 @@ function listUnderstandingEvidence(understandingId, relation) {
282
307
  }));
283
308
  }
284
309
  function recordContextRun(input) {
310
+ const auditedQuery = retrievalQueryAuditValue(input.query);
285
311
  const existing = getSqliteDatabase().prepare("SELECT context_run_id FROM context_runs WHERE turn_id = ?").get(input.turnId);
286
312
  const runId = existing?.context_run_id ?? randomUUID();
287
313
  runSqliteWriteTransaction((db) => {
288
314
  if (existing) {
289
315
  db.prepare(`UPDATE context_runs SET principal_id = ?, session_key = ?, query = ?, budget = ?, duration_ms = ?
290
- WHERE context_run_id = ?`).run(input.principalId ?? "local-owner", input.sessionKey, input.query, input.budget, input.durationMs, runId);
316
+ WHERE context_run_id = ?`).run(input.principalId ?? "local-owner", input.sessionKey, auditedQuery, input.budget, input.durationMs, runId);
291
317
  db.prepare("DELETE FROM context_run_items WHERE context_run_id = ?").run(runId);
292
318
  } else db.prepare(`INSERT INTO context_runs (
293
319
  context_run_id, principal_id, turn_id, session_key, query, budget, duration_ms, created_at
294
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(runId, input.principalId ?? "local-owner", input.turnId, input.sessionKey, input.query, input.budget, input.durationMs, Date.now());
320
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`).run(runId, input.principalId ?? "local-owner", input.turnId, input.sessionKey, auditedQuery, input.budget, input.durationMs, Date.now());
295
321
  const insert = db.prepare(`INSERT INTO context_run_items (
296
322
  context_run_id, object_type, object_id, version_id, decision, reason, content_snapshot,
297
323
  source_label, rank, score, injected_chars
@@ -380,4 +406,4 @@ function decideContextConsent(id, decision) {
380
406
  return Number(result.changes) > 0;
381
407
  }
382
408
  //#endregion
383
- export { consumeContextConsent, createCollaborationRule, createContextEvidence, createUnderstanding, decideContextConsent, deleteCollaborationRule, deleteUnderstanding, ensureContextConsent, getCollaborationRule, getTurnPersonalization, getUnderstanding, getUserProfile, hasContextConsent, isUnderstandingSuppressed, linkUnderstandingEvidence, listCollaborationRules, listUnderstandingEvidence, listUnderstandings, recordContextFeedback, recordContextRun, rejectUnderstanding, reviseCollaborationRule, reviseUnderstanding, setCollaborationRuleStatus, setUnderstandingStatus, updateUserProfile };
409
+ export { consumeContextConsent, createCollaborationRule, createContextEvidence, createUnderstanding, decideContextConsent, deleteCollaborationRule, deleteUnderstanding, ensureContextConsent, getCollaborationRule, getTurnPersonalization, getUnderstanding, getUserProfile, hasContextConsent, isUnderstandingSuppressed, linkUnderstandingEvidence, listCollaborationRules, listUnderstandingEvidence, listUnderstandings, recordContextFeedback, recordContextRun, rejectUnderstanding, reviseCollaborationRule, reviseUnderstanding, searchActiveUnderstandings, setCollaborationRuleStatus, setUnderstandingStatus, updateUserProfile };
@@ -14,6 +14,7 @@ type HomeAttention = HomeResponse['attention'][number];
14
14
  type HomeBriefingWin = HomeResponse['briefing']['wins'][number];
15
15
  type HomeAutomation = HomeResponse['upcomingAutomations'][number];
16
16
  type HomeFocusItem = HomeResponse['focusItems'][number];
17
+ type HomeRecentTask = HomeResponse['recentTasks'][number];
17
18
  type HomeWorkflowRun = {
18
19
  id: string;
19
20
  definitionId: string;
@@ -151,7 +152,8 @@ export declare function buildHomeFocusItems(input: {
151
152
  activeWorkflowRuns: HomeWorkflowRun[];
152
153
  runningTasks: HomeResponse['tasks']['running'];
153
154
  wins: HomeBriefingWin[];
154
- nextScheduled?: HomeAutomation;
155
+ scheduled: HomeAutomation[];
156
+ recentTasks: HomeRecentTask[];
155
157
  inboxCount: number;
156
158
  nowMs: number;
157
159
  }): HomeFocusItem[];
@@ -124,6 +124,10 @@ function homeActionCopy(locale) {
124
124
  viewProgress: "查看进度",
125
125
  viewResult: "查看结果",
126
126
  viewSchedule: "查看计划",
127
+ remaining: "项待继续",
128
+ taskCompleted: "任务已完成",
129
+ workflowCompleted: "工作流已完成",
130
+ automationCompleted: "自动化已完成",
127
131
  runningTask: "任务正在推进",
128
132
  runningWorkflow: "工作流正在推进",
129
133
  scheduled: "下一项定时工作",
@@ -142,6 +146,10 @@ function homeActionCopy(locale) {
142
146
  viewProgress: "View progress",
143
147
  viewResult: "View result",
144
148
  viewSchedule: "View schedule",
149
+ remaining: "remaining",
150
+ taskCompleted: "Task completed",
151
+ workflowCompleted: "Workflow completed",
152
+ automationCompleted: "Automation completed",
145
153
  runningTask: "Task in progress",
146
154
  runningWorkflow: "Workflow in progress",
147
155
  scheduled: "Next scheduled work",
@@ -153,23 +161,26 @@ function homeActionCopy(locale) {
153
161
  askAi: "Ask an agent"
154
162
  };
155
163
  }
164
+ function formatScheduleDistance(value, nowMs, locale) {
165
+ const distanceMs = Math.max(0, Date.parse(value) - nowMs);
166
+ const formatter = new Intl.RelativeTimeFormat(locale, { numeric: "always" });
167
+ const minutes = Math.max(1, Math.ceil(distanceMs / 6e4));
168
+ if (minutes < 60) return formatter.format(minutes, "minute");
169
+ const hours = Math.ceil(distanceMs / 36e5);
170
+ if (hours < 48) return formatter.format(hours, "hour");
171
+ return formatter.format(Math.ceil(distanceMs / 864e5), "day");
172
+ }
156
173
  function buildHomeFocusItems(input) {
157
174
  const copy = homeActionCopy(input.locale);
158
175
  const decisions = input.decisions.map((decision) => {
159
176
  const openAction = decision.kind === "agent_judgment" && decision.judgment ? {
160
- type: "open",
177
+ type: "review_judgment",
161
178
  label: copy.review,
162
- target: "inbox_judgment",
163
- targetId: decision.judgment.inboxItemId
164
- } : decision.kind === "task" ? {
165
- type: "open",
166
- label: copy.review,
167
- target: "task",
168
- targetId: decision.id.replace(/^task:/, "")
179
+ itemId: decision.judgment.inboxItemId
169
180
  } : {
170
181
  type: "open",
171
182
  label: copy.review,
172
- target: "work"
183
+ href: decision.href
173
184
  };
174
185
  const connectorActions = decision.response?.kind === "connector_approval" ? {
175
186
  primaryAction: {
@@ -196,7 +207,6 @@ function buildHomeFocusItems(input) {
196
207
  summary: decision.detail || copy.review,
197
208
  statusLabel: copy.review,
198
209
  updatedAt: decision.updatedAt,
199
- pinnable: false,
200
210
  openAction,
201
211
  ...connectorActions
202
212
  };
@@ -208,22 +218,10 @@ function buildHomeFocusItems(input) {
208
218
  title: item.title,
209
219
  summary: item.detail,
210
220
  updatedAt: item.updatedAt,
211
- pinnable: false,
212
- openAction: item.kind === "workflow_run" ? item.sessionKey ? {
213
- type: "open",
214
- label: copy.review,
215
- target: "session",
216
- sessionKey: item.sessionKey
217
- } : {
218
- type: "open",
219
- label: copy.review,
220
- target: "workflow_run",
221
- targetId: item.runId
222
- } : {
221
+ openAction: {
223
222
  type: "open",
224
223
  label: copy.review,
225
- target: "automation",
226
- targetId: item.runId
224
+ href: item.href
227
225
  },
228
226
  primaryAction: {
229
227
  type: "retry_run",
@@ -239,16 +237,10 @@ function buildHomeFocusItems(input) {
239
237
  }]
240
238
  }));
241
239
  const workflows = input.activeWorkflowRuns.map((run) => {
242
- const openAction = run.sessionKey ? {
243
- type: "open",
244
- label: copy.viewProgress,
245
- target: "session",
246
- sessionKey: run.sessionKey
247
- } : {
240
+ const openAction = {
248
241
  type: "open",
249
242
  label: copy.viewProgress,
250
- target: "workflow_run",
251
- targetId: run.id
243
+ href: run.sessionKey ? `/chat/${encodeURIComponent(run.sessionKey)}` : `/workflows?runId=${encodeURIComponent(run.id)}`
252
244
  };
253
245
  return {
254
246
  id: `workflow:${run.id}`,
@@ -258,7 +250,6 @@ function buildHomeFocusItems(input) {
258
250
  summary: copy.runningWorkflow,
259
251
  statusLabel: run.metrics.agentCount > 0 ? `${run.metrics.doneAgentCount}/${run.metrics.agentCount}` : void 0,
260
252
  updatedAt: run.startedAtMs ?? run.createdAtMs,
261
- pinnable: true,
262
253
  openAction,
263
254
  primaryAction: openAction,
264
255
  secondaryActions: []
@@ -268,8 +259,7 @@ function buildHomeFocusItems(input) {
268
259
  const openAction = {
269
260
  type: "open",
270
261
  label: copy.viewProgress,
271
- target: "task",
272
- targetId: task.id
262
+ href: `/tasks/${encodeURIComponent(task.id)}`
273
263
  };
274
264
  return {
275
265
  id: `task:${task.id}`,
@@ -278,73 +268,82 @@ function buildHomeFocusItems(input) {
278
268
  title: task.title,
279
269
  summary: copy.runningTask,
280
270
  updatedAt: task.updatedAt,
281
- pinnable: true,
282
271
  openAction,
283
272
  primaryAction: openAction,
284
273
  secondaryActions: []
285
274
  };
286
275
  });
287
276
  const results = input.wins.map((win) => {
288
- const openAction = win.kind === "workflow_run" ? {
289
- type: "open",
290
- label: copy.viewResult,
291
- target: "workflow_run",
292
- targetId: win.id.replace(/^workflow:/, "")
293
- } : win.kind === "automation_run" ? {
294
- type: "open",
295
- label: copy.viewResult,
296
- target: "automation",
297
- targetId: win.id.replace(/^automation:/, "")
298
- } : {
277
+ const openAction = {
299
278
  type: "open",
300
279
  label: copy.viewResult,
301
- target: "task",
302
- targetId: win.id.replace(/^task:/, "")
280
+ href: win.href
303
281
  };
304
282
  return {
305
283
  id: win.id,
306
284
  kind: "result",
307
285
  priority: 40,
308
286
  title: win.title,
309
- summary: copy.viewResult,
287
+ summary: win.kind === "workflow_run" ? copy.workflowCompleted : win.kind === "automation_run" ? copy.automationCompleted : copy.taskCompleted,
310
288
  updatedAt: win.completedAt,
311
- pinnable: true,
312
289
  openAction,
313
290
  primaryAction: openAction,
314
291
  secondaryActions: []
315
292
  };
316
293
  });
317
- const scheduled = input.nextScheduled ? [{
318
- id: `automation:${input.nextScheduled.id}:scheduled`,
294
+ const taskResults = input.recentTasks.map(({ taskId, taskTitle, receipt }) => {
295
+ const openAction = {
296
+ type: "open",
297
+ label: copy.viewResult,
298
+ href: `/tasks/${encodeURIComponent(taskId)}`
299
+ };
300
+ return {
301
+ id: `task-result:${taskId}:${receipt.runId}`,
302
+ kind: "result",
303
+ priority: 40,
304
+ title: taskTitle,
305
+ summary: receipt.summary,
306
+ statusLabel: receipt.remainingWork.length > 0 ? `${receipt.remainingWork.length} ${copy.remaining}` : void 0,
307
+ updatedAt: receipt.finalizedAt,
308
+ openAction,
309
+ primaryAction: openAction,
310
+ secondaryActions: []
311
+ };
312
+ });
313
+ const scheduled = input.scheduled.map((automation) => ({
314
+ id: `automation:${automation.id}:scheduled`,
319
315
  kind: "scheduled",
320
316
  priority: 30,
321
- title: input.nextScheduled.name || input.nextScheduled.id,
317
+ title: automation.name || automation.id,
322
318
  summary: copy.scheduled,
323
- statusLabel: new Date(input.nextScheduled.nextRunAt).toLocaleString(input.locale),
324
- updatedAt: Date.parse(input.nextScheduled.nextRunAt),
325
- pinnable: true,
319
+ statusLabel: formatScheduleDistance(automation.nextRunAt, input.nowMs, input.locale),
320
+ updatedAt: Date.parse(automation.nextRunAt),
326
321
  openAction: {
327
322
  type: "open",
328
323
  label: copy.viewSchedule,
329
- target: "automation",
330
- targetId: input.nextScheduled.id
324
+ href: `/automations?automation=${encodeURIComponent(automation.id)}`
331
325
  },
332
326
  primaryAction: {
333
327
  type: "open",
334
328
  label: copy.viewSchedule,
335
- target: "automation",
336
- targetId: input.nextScheduled.id
329
+ href: `/automations?automation=${encodeURIComponent(automation.id)}`
337
330
  },
338
331
  secondaryActions: []
339
- }] : [];
332
+ }));
340
333
  const items = [
341
334
  ...decisions,
342
335
  ...failures,
343
336
  ...workflows,
344
337
  ...tasks,
345
338
  ...results,
339
+ ...taskResults,
346
340
  ...scheduled
347
- ].sort((left, right) => right.priority - left.priority || right.updatedAt - left.updatedAt);
341
+ ].sort((left, right) => {
342
+ const priorityDelta = right.priority - left.priority;
343
+ if (priorityDelta !== 0) return priorityDelta;
344
+ if (left.kind === "scheduled" && right.kind === "scheduled") return left.updatedAt - right.updatedAt;
345
+ return right.updatedAt - left.updatedAt;
346
+ });
348
347
  if (items.length > 0) return items;
349
348
  if (input.inboxCount > 0) return [{
350
349
  id: "suggestion:organize-inbox",
@@ -353,16 +352,15 @@ function buildHomeFocusItems(input) {
353
352
  title: `${copy.organizeInbox} · ${input.inboxCount}`,
354
353
  summary: copy.organizeInboxSummary,
355
354
  updatedAt: input.nowMs,
356
- pinnable: false,
357
355
  openAction: {
358
356
  type: "open",
359
357
  label: copy.openInbox,
360
- target: "inbox"
358
+ href: "/notes?status=inbox"
361
359
  },
362
360
  primaryAction: {
363
361
  type: "open",
364
362
  label: copy.openInbox,
365
- target: "inbox"
363
+ href: "/notes?status=inbox"
366
364
  },
367
365
  secondaryActions: []
368
366
  }];
@@ -373,7 +371,6 @@ function buildHomeFocusItems(input) {
373
371
  title: copy.startSomething,
374
372
  summary: copy.startSomethingSummary,
375
373
  updatedAt: input.nowMs,
376
- pinnable: false,
377
374
  primaryAction: {
378
375
  type: "ask_ai",
379
376
  label: copy.askAi
@@ -525,7 +522,7 @@ var HomeQueryService = class {
525
522
  id: `automation:${run.id}`,
526
523
  kind: "automation_run",
527
524
  title: run.automationName || run.automationId,
528
- href: "/automations",
525
+ href: `/automations?automation=${encodeURIComponent(run.automationId)}&run=${encodeURIComponent(run.id)}`,
529
526
  completedAt: run.endedAtMs ?? run.createdAtMs
530
527
  }))].sort((left, right) => right.completedAt - left.completedAt);
531
528
  const runningTasks = tasks.filter((task) => {
@@ -542,6 +539,11 @@ var HomeQueryService = class {
542
539
  nextScheduled: upcomingAutomations[0],
543
540
  nowMs
544
541
  });
542
+ const recentTasks = tasks.flatMap((task) => this.#runs.listReceipts(task.id, 3).map((receipt) => ({
543
+ taskId: task.id,
544
+ taskTitle: task.title,
545
+ receipt
546
+ }))).sort((a, b) => b.receipt.finalizedAt - a.receipt.finalizedAt).slice(0, 8);
545
547
  return {
546
548
  focusItems: buildHomeFocusItems({
547
549
  locale,
@@ -550,7 +552,8 @@ var HomeQueryService = class {
550
552
  activeWorkflowRuns,
551
553
  runningTasks,
552
554
  wins,
553
- nextScheduled: upcomingAutomations[0],
555
+ scheduled: upcomingAutomations.slice(0, 3),
556
+ recentTasks: recentTasks.slice(0, 3),
554
557
  inboxCount: inbox.total,
555
558
  nowMs
556
559
  }),
@@ -590,7 +593,7 @@ var HomeQueryService = class {
590
593
  },
591
594
  upcomingAutomations,
592
595
  tasks: { running: runningTasks },
593
- recentTasks: tasks.flatMap((task) => this.#runs.listReceipts(task.id, 3)).sort((a, b) => b.finalizedAt - a.finalizedAt).slice(0, 8),
596
+ recentTasks,
594
597
  recentAutomationRuns: automationRuns.slice(0, 5).map(toHomeAutomationRun)
595
598
  };
596
599
  }
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { openXopcDatabase } from "../../storage/sqlite/connection.js";
4
- import { appendComposerInputHistory, listComposerInputHistory } from "../../storage/sqlite/composer-input-history-repository.js";
5
4
  import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../../routing/agent-session-key.js";
5
+ import { appendComposerInputHistory, listComposerInputHistory } from "../../storage/sqlite/composer-input-history-repository.js";
6
6
  import { getSessionMetadata } from "../../storage/sqlite/session-repository.js";
7
7
  import "../../storage/sqlite/index.js";
8
8
  import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
@@ -30,6 +30,7 @@ import { buildWorkflowChildTools } from "../../agent/workflow/workflow-child-too
30
30
  import { WorkflowRunService } from "../../workflows/service/workflow-run-service.js";
31
31
  import { WorkflowSessionBridge } from "../../workflows/service/workflow-session-bridge.js";
32
32
  import { ChatStreamMapper } from "../../gateway/chat-stream/mapper.js";
33
+ import { getXopcCloudCatalogCoordinator } from "../../providers/xopc-cloud-catalog-coordinator.js";
33
34
  import { fuzzySearchWorkspaceFiles } from "../../gateway/workspace-file-search.js";
34
35
  import { sessionMetadataToTuiItem } from "../tui-session-format.js";
35
36
  import { buildTuiTranscriptTree, transcriptTreeEntryIdToRowNumber } from "../tui-transcript-tree.js";
@@ -148,9 +149,16 @@ var EmbeddedBackend = class {
148
149
  }
149
150
  async refreshXopcCloudModels() {
150
151
  try {
151
- const { XopcCloudModelSource } = await import("../../providers/xopc-cloud-model-source.js");
152
- const result = await new XopcCloudModelSource().refresh();
153
- if (result.status === "updated") log.info({ modelCount: result.modelCount }, `XOPC Cloud model catalog refreshed: ${result.modelCount} models`);
152
+ const readiness = await getXopcCloudCatalogCoordinator().ensure({
153
+ reason: "agent-run",
154
+ network: "if-empty",
155
+ timeoutMs: 1e4
156
+ });
157
+ if (!readiness.error) return;
158
+ log.warn({
159
+ errorMessage: readiness.error.message,
160
+ phase: "model_catalog_refresh"
161
+ }, `XOPC Cloud model catalog refresh failed: ${readiness.error.message}`);
154
162
  } catch (err) {
155
163
  const errorMessage = err instanceof Error ? err.message : String(err);
156
164
  log.warn({
@@ -2,6 +2,7 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { CredentialResolver, init_credentials } from "../auth/credentials.js";
4
4
  import { getProviderDisplayName, init_providers } from "../providers/index.js";
5
+ import { getXopcCloudCatalogCoordinator } from "../providers/xopc-cloud-catalog-coordinator.js";
5
6
  import { selectListTheme, theme } from "./theme.js";
6
7
  import { formatKeyIds } from "./format-tui-hotkeys.js";
7
8
  import { getOAuthProvider, getSupportedOAuthProviders } from "../cli/utils/oauth-providers.js";
@@ -170,6 +171,10 @@ async function runTuiOAuthLogin(provider, deps) {
170
171
  activeCleanups
171
172
  }));
172
173
  await new CredentialResolver().saveOAuthCredentials(selectedProvider, credentials);
174
+ if (selectedProvider === "xopc-cloud") {
175
+ const catalog = await getXopcCloudCatalogCoordinator().refresh("oauth");
176
+ if (catalog.error) deps.chatLog.addSystem(`Authorization succeeded, but model catalog sync failed: ${catalog.error.message}`);
177
+ }
173
178
  deps.chatLog.addSystem(`OAuth login completed for ${selectedProvider}.`);
174
179
  } finally {
175
180
  for (const cleanup of [...activeCleanups]) cleanup();
@@ -5,9 +5,9 @@ import { resolveBootstrapFilesSync } from "../agent/bootstrap/bootstrap-files.js
5
5
  import { createSkillConfigManager, isSkillEnabled } from "../agent/skills/config.js";
6
6
  import { loadSkills } from "../agent/skills/index.js";
7
7
  import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
8
- import { listConnectorInstances } from "../connectors/instances.js";
9
8
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
10
9
  import "../config/index.js";
10
+ import { listConnectorInstances } from "../connectors/instances.js";
11
11
  import { basename } from "node:path";
12
12
  //#region src/tui/tui-startup-resources.ts
13
13
  init_paths();
@@ -2,6 +2,7 @@ import type { AgentMessage } from '@earendil-works/pi-agent-core';
2
2
  import type { UserContextPlan } from '../agent/memory/context/types.js';
3
3
  export declare function prependAgentContext(message: AgentMessage, block: string): AgentMessage;
4
4
  export declare class UserContextPlanner {
5
+ private readonly retriever;
5
6
  plan(params: {
6
7
  sessionKey: string;
7
8
  workspaceId: string;
@@ -1,8 +1,10 @@
1
- import { consumeContextConsent, ensureContextConsent, getUserProfile, listCollaborationRules, listUnderstandings, recordContextRun } from "../storage/sqlite/user-context-repository.js";
1
+ import { consumeContextConsent, ensureContextConsent, getUserProfile, listCollaborationRules, recordContextRun } from "../storage/sqlite/user-context-repository.js";
2
2
  import "../storage/sqlite/index.js";
3
3
  import { readAgentMessageContent } from "../agent/memory/agent-message-access.js";
4
4
  import { buildUserContextBlock } from "../agent/memory/context-fence.js";
5
5
  import { listUserFocuses } from "./sources/repository.js";
6
+ import { matchesUserContextScope } from "./scope.js";
7
+ import { UserUnderstandingRetriever } from "./retriever.js";
6
8
  import { randomUUID } from "node:crypto";
7
9
  //#region src/user-context/planner.ts
8
10
  const DEFAULT_MAX_CONTEXT_CHARS = 6e3;
@@ -33,28 +35,6 @@ function prependAgentContext(message, block) {
33
35
  }
34
36
  return message;
35
37
  }
36
- function scopeMatches(scope, input) {
37
- if (scope.type === "global") return true;
38
- if (scope.type === "session") return scope.id === input.sessionKey;
39
- if (scope.type === "workspace") return scope.id === input.workspaceId;
40
- return Boolean(input.projectId && scope.id === input.projectId);
41
- }
42
- function terms(value) {
43
- const normalized = value.toLocaleLowerCase().replace(/[^\p{L}\p{N}]+/gu, " ").trim();
44
- const words = normalized.split(/\s+/).filter((word) => word.length > 1);
45
- const cjk = [...normalized.replace(/[^\p{Script=Han}]/gu, "")];
46
- for (let index = 0; index < cjk.length - 1; index += 1) words.push(`${cjk[index]}${cjk[index + 1]}`);
47
- return new Set(words);
48
- }
49
- function relevance(query, item) {
50
- const queryTerms = terms(query);
51
- const itemTerms = terms(item.statement);
52
- const shared = [...queryTerms].filter((term) => itemTerms.has(term)).length;
53
- const lexical = queryTerms.size ? shared / queryTerms.size : 0;
54
- const baseline = item.kind === "boundary" && item.explicitness === "explicit" ? .8 : item.kind === "preference" && item.explicitness === "explicit" ? .35 : 0;
55
- const explicitness = item.explicitness === "explicit" ? .1 : item.explicitness === "observed" ? .05 : 0;
56
- return Math.min(1, Math.max(baseline, lexical * .75 + item.confidence * .15 + explicitness));
57
- }
58
38
  function sectionFor(item) {
59
39
  if (item.kind === "boundary") return "safety";
60
40
  if ([
@@ -77,18 +57,19 @@ function sourceLabel(item) {
77
57
  function rejectionReason(item, input, now) {
78
58
  if (item.status === "needs_review" || item.status === "stale" || item.status === "candidate") return "needs_review";
79
59
  if (item.status === "archived" || item.status === "rejected") return "disabled";
80
- if (!scopeMatches(item.scope, input)) return "scope_mismatch";
60
+ if (!matchesUserContextScope(item.scope, input)) return "scope_mismatch";
81
61
  if (item.validFrom && item.validFrom > now) return "not_yet_valid";
82
62
  if (item.validTo && item.validTo < now || item.expiresAt && item.expiresAt < now) return "expired";
83
63
  if (item.sensitivity === "secret" || item.sensitivity === "regulated") return "sensitive";
84
64
  if (item.conflictGroupId) return "conflict";
85
65
  }
86
66
  function ruleMatches(rule, input) {
87
- if (rule.status !== "active" || !scopeMatches(rule.scope, input)) return false;
67
+ if (rule.status !== "active" || !matchesUserContextScope(rule.scope, input)) return false;
88
68
  const channel = typeof rule.conditions.channel === "string" ? rule.conditions.channel : void 0;
89
69
  return !channel || channel === input.channel;
90
70
  }
91
71
  var UserContextPlanner = class {
72
+ retriever = new UserUnderstandingRetriever();
92
73
  plan(params) {
93
74
  const traceId = randomUUID();
94
75
  const query = params.query.trim();
@@ -176,10 +157,16 @@ var UserContextPlanner = class {
176
157
  injectedChars: rule.statement.length
177
158
  });
178
159
  }
179
- const ranked = listUnderstandings(["active"]).filter((item) => !excluded.has(item.id)).map((item) => ({
180
- item,
181
- score: relevance(query, item)
182
- })).sort((left, right) => right.score - left.score).slice(0, Math.max(maxResults * 5, 50));
160
+ const ranked = this.retriever.retrieve({
161
+ query,
162
+ sessionKey: params.sessionKey,
163
+ workspaceId: params.workspaceId,
164
+ ...params.projectId ? { projectId: params.projectId } : {},
165
+ maxCandidates: Math.max(maxResults * 5, 50)
166
+ }).filter((result) => !excluded.has(result.understanding.id)).map((result) => ({
167
+ item: result.understanding,
168
+ score: result.score
169
+ }));
183
170
  for (const { item, score } of ranked) {
184
171
  if (items.length >= maxResults) {
185
172
  rejected.push({
@@ -0,0 +1,15 @@
1
+ import type { UserUnderstanding } from './domain.js';
2
+ export interface UnderstandingRetrievalResult {
3
+ understanding: UserUnderstanding;
4
+ score: number;
5
+ reasons: string[];
6
+ }
7
+ export declare class UserUnderstandingRetriever {
8
+ retrieve(params: {
9
+ query: string;
10
+ sessionKey: string;
11
+ workspaceId: string;
12
+ projectId?: string;
13
+ maxCandidates: number;
14
+ }): UnderstandingRetrievalResult[];
15
+ }