@xopcai/xopc 0.0.247 → 0.0.249

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 (509) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/src/update-offset-store.js +17 -54
  3. package/dist/extensions/telegram/xopc.extension.json +1 -1
  4. package/dist/extensions/weixin/src/auth/accounts.js +3 -5
  5. package/dist/extensions/weixin/src/monitor/monitor.js +3 -5
  6. package/dist/extensions/weixin/src/storage/sync-buf.d.ts +3 -6
  7. package/dist/extensions/weixin/src/storage/sync-buf.js +9 -22
  8. package/dist/gateway/static/root/assets/{activity-store-BlxqErph.js → activity-store-B759R_qf.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DmaFeojS.js → agent-avatar-dicebear-BUu7EnwM.js} +1 -1
  10. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-C1rXNUAG.js +1 -0
  11. package/dist/gateway/static/root/assets/agents-DK9HjHO0.js +1 -0
  12. package/dist/gateway/static/root/assets/{api-BbXzyQMj.js → api-Cg0v7Lpn.js} +1 -1
  13. package/dist/gateway/static/root/assets/app-management-settings-panel-C9DkCW_d.js +1 -0
  14. package/dist/gateway/static/root/assets/appearance-settings-CFggS95Y.js +1 -0
  15. package/dist/gateway/static/root/assets/apps-page-jOvT-fzU.js +1 -0
  16. package/dist/gateway/static/root/assets/{archive-plugin-DD2SweEH.js → archive-plugin-BQrilVVv.js} +1 -1
  17. package/dist/gateway/static/root/assets/{attachment-load-BG82bNBQ.js → attachment-load-BG0BliqV.js} +1 -1
  18. package/dist/gateway/static/root/assets/{automations-page-CqBZ89He.js → automations-page-Bo4RiTkh.js} +1 -1
  19. package/dist/gateway/static/root/assets/automations-workspace-BKjKTlW8.js +6 -0
  20. package/dist/gateway/static/root/assets/{binary-plugins-B6LKm5Zv.js → binary-plugins-BCnyNU0C.js} +1 -1
  21. package/dist/gateway/static/root/assets/{block-editor-BJKvGVXd.js → block-editor-Db8DlVvg.js} +50 -50
  22. package/dist/gateway/static/root/assets/browser-settings-page-Dzq18pO1.js +8 -0
  23. package/dist/gateway/static/root/assets/{browser-workflow-inputs-BAAc151l.js → browser-workflow-inputs-C71vfl0b.js} +1 -1
  24. package/dist/gateway/static/root/assets/{browser-workflows-page-DoE4Uuns.js → browser-workflows-page-vvmSYKsO.js} +2 -2
  25. package/dist/gateway/static/root/assets/capabilities-settings-panel-DW4SBQf4.js +7 -0
  26. package/dist/gateway/static/root/assets/channels-settings-57OGuewD.js +1 -0
  27. package/dist/gateway/static/root/assets/{channels-status-swr-CCBCtLDg.js → channels-status-swr-CKyV3jY5.js} +1 -1
  28. package/dist/gateway/static/root/assets/{chat-terminal-dock-BsRWnz7M.js → chat-terminal-dock-B1Xd6OFB.js} +2 -2
  29. package/dist/gateway/static/root/assets/connectors-page-CT_I3kbR.js +2 -0
  30. package/dist/gateway/static/root/assets/{cron-expression-DdCgsH2c.js → cron-expression-D-F9vjtE.js} +1 -1
  31. package/dist/gateway/static/root/assets/{date-picker-dt37Lt8e.js → date-picker-B2OoYvic.js} +1 -1
  32. package/dist/gateway/static/root/assets/dependency-picker-BiGx9Sbj.js +1 -0
  33. package/dist/gateway/static/root/assets/{desktop-pet-Nw_Pgkk3.js → desktop-pet-BNMRqipe.js} +1 -1
  34. package/dist/gateway/static/root/assets/desktop-pet-settings-DeYbIV7A.js +1 -0
  35. package/dist/gateway/static/root/assets/{extension-debug-page-BHSst0WN.js → extension-debug-page-COyn05ub.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-page-DXbL4cQZ.js → extension-page-oH43chS2.js} +1 -1
  37. package/dist/gateway/static/root/assets/extension-settings-page-BMO59994.js +1 -0
  38. package/dist/gateway/static/root/assets/gateway-config-api-cimpViGk.js +1 -0
  39. package/dist/gateway/static/root/assets/{gateway-config-swr-826dipyU.js → gateway-config-swr-BGdHwT4e.js} +1 -1
  40. package/dist/gateway/static/root/assets/gateway-settings-BHJtnSic.js +1 -0
  41. package/dist/gateway/static/root/assets/{gateway-startup-retry-DyvcAIMm.js → gateway-startup-retry-CuaM3b4c.js} +1 -1
  42. package/dist/gateway/static/root/assets/heartbeat-settings-DNhrZHqx.js +1 -0
  43. package/dist/gateway/static/root/assets/home-page-BiHwiBnQ.js +1 -0
  44. package/dist/gateway/static/root/assets/{image-generation-api-D7cyfks6.js → image-generation-api-D7duj7Uj.js} +1 -1
  45. package/dist/gateway/static/root/assets/index-DGeGmj4k.css +2 -0
  46. package/dist/gateway/static/root/assets/index-aBs0EfQB.js +72 -0
  47. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-EY4cu-6W.js → keyboard-shortcuts-settings-D8Zw_lYd.js} +1 -1
  48. package/dist/gateway/static/root/assets/local-app-workbench-page-eBFVWmtH.js +2 -0
  49. package/dist/gateway/static/root/assets/{local-apps-page-Dh7OxX0S.js → local-apps-page-CvPDPRwb.js} +1 -1
  50. package/dist/gateway/static/root/assets/{locale-store-CBoCuIMx.js → locale-store-zEL8bkwx.js} +1 -1
  51. package/dist/gateway/static/root/assets/logs-page-ClvcWlL6.js +2 -0
  52. package/dist/gateway/static/root/assets/{management-settings-ZjiL3A-S.js → management-settings-D8moh99U.js} +1 -1
  53. package/dist/gateway/static/root/assets/{markdown-split-B4BxkTpU.js → markdown-split-D7V3j0vE.js} +1 -1
  54. package/dist/gateway/static/root/assets/{markdown-view-BXsHghJd.js → markdown-view-DGRN-8wP.js} +1 -1
  55. package/dist/gateway/static/root/assets/{media-plugins-D15XBiEo.js → media-plugins-BLaE5b1Y.js} +1 -1
  56. package/dist/gateway/static/root/assets/messages-W5P19VTF.js +11 -0
  57. package/dist/gateway/static/root/assets/mobile-pairing-wizard-DiVDuCxl.js +1 -0
  58. package/dist/gateway/static/root/assets/note-detail-panel-CEEvR-fV.js +5 -0
  59. package/dist/gateway/static/root/assets/notes-page-BLqgXNCx.js +8 -0
  60. package/dist/gateway/static/root/assets/page-tabs-BFMGjA60.js +1 -0
  61. package/dist/gateway/static/root/assets/preview-open-alternatives-DNEWZN7H.js +1 -0
  62. package/dist/gateway/static/root/assets/{product-open-page-CAJeUXeU.js → product-open-page-Co5u7asH.js} +1 -1
  63. package/dist/gateway/static/root/assets/project-detail-page-CIiFJ5tk.js +1 -0
  64. package/dist/gateway/static/root/assets/projects-page-B3UF-Pfm.js +1 -0
  65. package/dist/gateway/static/root/assets/{registry-api-BhGKnvLP.js → registry-api-Cg92zSod.js} +1 -1
  66. package/dist/gateway/static/root/assets/remote-access-hub-BUtpkJPG.js +1 -0
  67. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-BhKcyEId.js → runtime-tools-settings-panel-C0ByNmlV.js} +2 -2
  68. package/dist/gateway/static/root/assets/{schema-form-L0s7RWCi.js → schema-form-Dq_VQpuY.js} +1 -1
  69. package/dist/gateway/static/root/assets/sessions-page-UgJmG-V4.js +1 -0
  70. package/dist/gateway/static/root/assets/settings-advanced-gate-DDCzpdkl.js +1 -0
  71. package/dist/gateway/static/root/assets/settings-form-section-CZu6FX4k.js +1 -0
  72. package/dist/gateway/static/root/assets/{settings-page-CTKoztlF.js → settings-page-S8ekeUZd.js} +1 -1
  73. package/dist/gateway/static/root/assets/setup-status-panel-BdVmwXMv.js +1 -0
  74. package/dist/gateway/static/root/assets/{share-preview-page-CiiLLz5A.js → share-preview-page-D2fEidbn.js} +1 -1
  75. package/dist/gateway/static/root/assets/shares-settings-BdsqnCYj.js +1 -0
  76. package/dist/gateway/static/root/assets/skill-reload-api-ghzAQKna.js +1 -0
  77. package/dist/gateway/static/root/assets/skills-page-AYiPlgZE.js +2 -0
  78. package/dist/gateway/static/root/assets/{skills-page.utils-CwRekJSJ.js → skills-page.utils-DGzl-ib-.js} +1 -1
  79. package/dist/gateway/static/root/assets/system-settings-panel-5Xd5mIiR.js +1 -0
  80. package/dist/gateway/static/root/assets/task-detail-page-BQAUaCDD.js +1 -0
  81. package/dist/gateway/static/root/assets/{theme-store-hybK3oC9.js → theme-store-ZVClZKQ0.js} +1 -1
  82. package/dist/gateway/static/root/assets/tunnel-api-CdZN1Jin.js +1 -0
  83. package/dist/gateway/static/root/assets/{use-autosave-DX5YZ3Nn.js → use-autosave-czRI0NBc.js} +1 -1
  84. package/dist/gateway/static/root/assets/user-model-page-W3GTm6nA.js +2 -0
  85. package/dist/gateway/static/root/assets/{voice-api-key-field-ocnZbAyi.js → voice-api-key-field-8YEvA3cU.js} +1 -1
  86. package/dist/gateway/static/root/assets/{voice-config-api-CBbiF1T3.js → voice-config-api-CopF64lY.js} +1 -1
  87. package/dist/gateway/static/root/assets/work-discovery-overlay-keLtqYYJ.js +1 -0
  88. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DaErGvxO.js → workflow-run-setup-panel-Dy5WgYMO.js} +2 -2
  89. package/dist/gateway/static/root/assets/workflows-page-BbAV3h7n.js +5 -0
  90. package/dist/gateway/static/root/index.html +10 -26
  91. package/dist/package.js +1 -1
  92. package/dist/src/agent/agent-instance-gateway.d.ts +2 -2
  93. package/dist/src/agent/agent-manager.d.ts +4 -4
  94. package/dist/src/agent/agent-manager.js +31 -15
  95. package/dist/src/agent/background-review/coordinator.d.ts +2 -4
  96. package/dist/src/agent/background-review/coordinator.js +5 -30
  97. package/dist/src/agent/background-review/prompts.d.ts +4 -2
  98. package/dist/src/agent/background-review/prompts.js +24 -19
  99. package/dist/src/agent/background-review/run-background-review.d.ts +6 -7
  100. package/dist/src/agent/background-review/run-background-review.js +47 -41
  101. package/dist/src/agent/background-review/settings.d.ts +0 -1
  102. package/dist/src/agent/background-review/settings.js +6 -7
  103. package/dist/src/agent/commands/command-registry.d.ts +1 -0
  104. package/dist/src/agent/commands/command-registry.js +12 -22
  105. package/dist/src/agent/context/audit.d.ts +36 -0
  106. package/dist/src/agent/context/audit.js +97 -0
  107. package/dist/src/agent/context/coordinator.d.ts +26 -0
  108. package/dist/src/agent/context/coordinator.js +72 -0
  109. package/dist/src/agent/context/execution-context.d.ts +54 -0
  110. package/dist/src/agent/context/execution-context.js +147 -0
  111. package/dist/src/agent/context/execution-scope.js +1 -1
  112. package/dist/src/agent/context/prepend.d.ts +2 -0
  113. package/dist/src/agent/context/prepend.js +28 -0
  114. package/dist/src/agent/context/project-context.d.ts +3 -3
  115. package/dist/src/agent/context/project-context.js +26 -23
  116. package/dist/src/agent/embedded/index.js +1 -1
  117. package/dist/src/agent/embedded/run-for-session.js +1 -0
  118. package/dist/src/agent/embedded/run-turn.js +22 -2
  119. package/dist/src/agent/embedded/types.d.ts +1 -25
  120. package/dist/src/agent/external-tools/composio-provider.js +87 -92
  121. package/dist/src/agent/external-tools/gateway-tools.d.ts +4 -1
  122. package/dist/src/agent/external-tools/gateway-tools.js +153 -41
  123. package/dist/src/agent/external-tools/index.js +1 -1
  124. package/dist/src/agent/external-tools/search-error.d.ts +12 -0
  125. package/dist/src/agent/external-tools/search-error.js +29 -0
  126. package/dist/src/agent/external-tools/service.d.ts +4 -0
  127. package/dist/src/agent/external-tools/service.js +22 -2
  128. package/dist/src/agent/ipc/inbox.d.ts +8 -31
  129. package/dist/src/agent/ipc/inbox.js +64 -133
  130. package/dist/src/agent/memory/compaction-policy.js +1 -1
  131. package/dist/src/agent/memory/compaction-promotion.js +45 -77
  132. package/dist/src/agent/memory/create-memory-manager.js +1 -3
  133. package/dist/src/agent/memory/index.d.ts +0 -5
  134. package/dist/src/agent/memory/index.js +2 -5
  135. package/dist/src/agent/memory/manager.d.ts +0 -16
  136. package/dist/src/agent/memory/manager.js +11 -40
  137. package/dist/src/agent/memory/memory-config.js +1 -1
  138. package/dist/src/agent/memory/runtime.d.ts +2 -2
  139. package/dist/src/agent/memory/runtime.js +9 -19
  140. package/dist/src/agent/memory/types.d.ts +1 -1
  141. package/dist/src/agent/orchestration/agent-orchestrator.js +13 -21
  142. package/dist/src/agent/prompt/sections/memory-skills.js +25 -36
  143. package/dist/src/agent/prompt/sections/tooling.js +10 -4
  144. package/dist/src/agent/prompt/service-prompt-builder.js +4 -3
  145. package/dist/src/agent/service/direct-turn-helpers.js +6 -23
  146. package/dist/src/agent/service/process-direct-one-shot.js +15 -10
  147. package/dist/src/agent/service/process-direct-streaming.js +5 -3
  148. package/dist/src/agent/service.js +4 -3
  149. package/dist/src/agent/tasks/task-judge-service.js +1 -1
  150. package/dist/src/agent/tools/clarify-tool.d.ts +1 -0
  151. package/dist/src/agent/tools/delegate-tool.js +5 -2
  152. package/dist/src/agent/tools/factory.js +36 -19
  153. package/dist/src/agent/tools/index.d.ts +3 -2
  154. package/dist/src/agent/tools/index.js +4 -3
  155. package/dist/src/agent/tools/knowledge-memory-tool.d.ts +9 -0
  156. package/dist/src/agent/tools/knowledge-memory-tool.js +129 -0
  157. package/dist/src/agent/tools/{dreaming-tool.d.ts → memory-maintenance-tool.d.ts} +2 -2
  158. package/dist/src/agent/tools/memory-maintenance-tool.js +31 -0
  159. package/dist/src/agent/tools/user-context-tool.d.ts +8 -0
  160. package/dist/src/agent/tools/user-context-tool.js +81 -0
  161. package/dist/src/agent/tools/xopc-use-tool.js +2 -2
  162. package/dist/src/agent/workflow/catalog.d.ts +1 -8
  163. package/dist/src/agent/workflow/catalog.js +44 -102
  164. package/dist/src/agent/workflow/index.d.ts +1 -1
  165. package/dist/src/agent/workflow/index.js +2 -2
  166. package/dist/src/automations/domain/types.d.ts +1 -0
  167. package/dist/src/automations/service/action-executor.js +2 -2
  168. package/dist/src/automations/service/automation-service.js +2 -2
  169. package/dist/src/channels/manager.d.ts +1 -1
  170. package/dist/src/channels/manager.js +2 -2
  171. package/dist/src/channels/outbound/persist-store.d.ts +2 -8
  172. package/dist/src/channels/outbound/persist-store.js +11 -38
  173. package/dist/src/channels/outbound-sender.d.ts +1 -1
  174. package/dist/src/channels/outbound-sender.js +2 -2
  175. package/dist/src/chat-commands/builtins/understanding.js +24 -6
  176. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  177. package/dist/src/config/schema.d.ts +68 -75
  178. package/dist/src/config/schema.js +31 -20
  179. package/dist/src/config/web-patch.d.ts +1 -1
  180. package/dist/src/connectors/composio-managed-client.js +6 -2
  181. package/dist/src/connectors/composio-triggers.d.ts +2 -2
  182. package/dist/src/connectors/composio-triggers.js +8 -15
  183. package/dist/src/connectors/connected-source-understanding.d.ts +1 -3
  184. package/dist/src/connectors/connected-source-understanding.js +86 -99
  185. package/dist/src/connectors/connection-candidates.d.ts +11 -0
  186. package/dist/src/connectors/connection-candidates.js +58 -0
  187. package/dist/src/connectors/connection-capabilities.d.ts +4 -0
  188. package/dist/src/connectors/connection-capabilities.js +37 -0
  189. package/dist/src/connectors/connection-recovery-service.d.ts +42 -0
  190. package/dist/src/connectors/connection-recovery-service.js +396 -0
  191. package/dist/src/connectors/learning-coordinator.d.ts +0 -2
  192. package/dist/src/connectors/learning-coordinator.js +6 -7
  193. package/dist/src/connectors/principal.d.ts +5 -0
  194. package/dist/src/connectors/principal.js +18 -0
  195. package/dist/src/gateway/agent-builtin-tools.d.ts +28 -10
  196. package/dist/src/gateway/agent-builtin-tools.js +30 -9
  197. package/dist/src/gateway/automation-agent-session.js +3 -0
  198. package/dist/src/gateway/chat-stream/mapper.js +1 -28
  199. package/dist/src/gateway/chat-stream/protocol.d.ts +2 -24
  200. package/dist/src/gateway/clarify-bridge.d.ts +4 -0
  201. package/dist/src/gateway/clarify-bridge.js +9 -4
  202. package/dist/src/gateway/heartbeat/service.js +1 -1
  203. package/dist/src/gateway/hono/lib/config-payload.d.ts +52 -30
  204. package/dist/src/gateway/hono/lib/config-payload.js +4 -4
  205. package/dist/src/gateway/hono/lib/extension-store.js +8 -25
  206. package/dist/src/gateway/hono/middleware/auth.js +1 -2
  207. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +1 -1
  208. package/dist/src/gateway/hono/routes/config-patch/misc.js +72 -28
  209. package/dist/src/gateway/hono/routes/connection-waits.d.ts +3 -0
  210. package/dist/src/gateway/hono/routes/connection-waits.js +58 -0
  211. package/dist/src/gateway/hono/routes/connectors.js +4 -12
  212. package/dist/src/gateway/hono/routes/context-sources.d.ts +4 -0
  213. package/dist/src/gateway/hono/routes/context-sources.js +159 -0
  214. package/dist/src/gateway/hono/routes/index.js +4 -2
  215. package/dist/src/gateway/hono/routes/lazy-bundles.js +9 -4
  216. package/dist/src/gateway/hono/routes/notes.js +22 -7
  217. package/dist/src/gateway/hono/routes/projects.js +37 -45
  218. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +15 -1
  219. package/dist/src/gateway/hono/routes/side-chats.js +13 -2
  220. package/dist/src/gateway/hono/routes/tasks.js +2 -2
  221. package/dist/src/gateway/hono/routes/user-model.d.ts +3 -0
  222. package/dist/src/gateway/hono/routes/user-model.js +480 -0
  223. package/dist/src/gateway/hono/routes/workflows.js +2 -2
  224. package/dist/src/gateway/memory-maintenance-automation-reconciler.d.ts +11 -0
  225. package/dist/src/gateway/memory-maintenance-automation-reconciler.js +72 -0
  226. package/dist/src/gateway/service/agent-runner.d.ts +9 -1
  227. package/dist/src/gateway/service/agent-runner.js +25 -1
  228. package/dist/src/gateway/service/config-coordinator.d.ts +2 -2
  229. package/dist/src/gateway/service/config-coordinator.js +4 -4
  230. package/dist/src/gateway/service/run-gateway-agent.d.ts +1 -0
  231. package/dist/src/gateway/service/run-gateway-agent.js +18 -14
  232. package/dist/src/gateway/service/session-input-coordinator.d.ts +3 -0
  233. package/dist/src/gateway/service/session-input-coordinator.js +12 -2
  234. package/dist/src/gateway/service.d.ts +3 -1
  235. package/dist/src/gateway/service.js +49 -19
  236. package/dist/src/gateway/side-chat/manager.d.ts +16 -3
  237. package/dist/src/gateway/side-chat/manager.js +117 -28
  238. package/dist/src/gateway/side-chat/run-service.d.ts +2 -0
  239. package/dist/src/gateway/side-chat/run-service.js +28 -5
  240. package/dist/src/gateway/side-chat/types.d.ts +9 -1
  241. package/dist/src/heartbeat/index.js +1 -1
  242. package/dist/src/knowledge/connected-knowledge-pipeline.d.ts +0 -2
  243. package/dist/src/knowledge/connected-knowledge-pipeline.js +46 -217
  244. package/dist/src/knowledge-memory/domain.d.ts +35 -0
  245. package/dist/src/knowledge-memory/index.d.ts +2 -0
  246. package/dist/src/knowledge-memory/index.js +2 -0
  247. package/dist/src/knowledge-memory/repository.d.ts +45 -0
  248. package/dist/src/knowledge-memory/repository.js +154 -0
  249. package/dist/src/memory-maintenance/index.d.ts +2 -0
  250. package/dist/src/memory-maintenance/index.js +3 -0
  251. package/dist/src/memory-maintenance/schedule.d.ts +13 -0
  252. package/dist/src/memory-maintenance/schedule.js +51 -0
  253. package/dist/src/memory-maintenance/service.d.ts +28 -0
  254. package/dist/src/memory-maintenance/service.js +216 -0
  255. package/dist/src/notes/index.d.ts +1 -1
  256. package/dist/src/notes/index.js +2 -2
  257. package/dist/src/notes/paths.d.ts +0 -3
  258. package/dist/src/notes/paths.js +1 -10
  259. package/dist/src/notes/service.d.ts +1 -1
  260. package/dist/src/notes/service.js +7 -4
  261. package/dist/src/notes/store.d.ts +0 -2
  262. package/dist/src/notes/store.js +33 -80
  263. package/dist/src/notes/types.d.ts +16 -0
  264. package/dist/src/proactive/execution/context.d.ts +2 -2
  265. package/dist/src/proactive/execution/context.js +16 -11
  266. package/dist/src/proactive/index.d.ts +1 -1
  267. package/dist/src/proactive/index.js +2 -2
  268. package/dist/src/projects/index.d.ts +1 -1
  269. package/dist/src/projects/index.js +2 -2
  270. package/dist/src/projects/knowledge-bind.d.ts +1 -0
  271. package/dist/src/projects/knowledge-bind.js +15 -0
  272. package/dist/src/projects/project-loop.d.ts +3 -3
  273. package/dist/src/projects/project-loop.js +4 -4
  274. package/dist/src/projects/project-store.js +2 -1
  275. package/dist/src/realtime/runtime.js +1 -0
  276. package/dist/src/runtime-tools/manager.js +1 -1
  277. package/dist/src/share/hosted-session-share.d.ts +1 -4
  278. package/dist/src/share/hosted-session-share.js +14 -47
  279. package/dist/src/share/share-auto.d.ts +1 -1
  280. package/dist/src/share/share-auto.js +2 -2
  281. package/dist/src/share/share-store.d.ts +2 -7
  282. package/dist/src/share/share-store.js +153 -195
  283. package/dist/src/share/share-types.d.ts +0 -4
  284. package/dist/src/share/site-share-store.d.ts +3 -8
  285. package/dist/src/share/site-share-store.js +94 -153
  286. package/dist/src/share/site-share-types.d.ts +0 -4
  287. package/dist/src/storage/sqlite/collaboration-rule-repository.d.ts +17 -0
  288. package/dist/src/storage/sqlite/collaboration-rule-repository.js +54 -0
  289. package/dist/src/storage/sqlite/connection-wait-repository.d.ts +30 -0
  290. package/dist/src/storage/sqlite/connection-wait-repository.js +338 -0
  291. package/dist/src/storage/sqlite/connection.d.ts +1 -2
  292. package/dist/src/storage/sqlite/connection.js +50 -47
  293. package/dist/src/storage/sqlite/connector-account-repository.js +1 -1
  294. package/dist/src/storage/sqlite/context-evidence-repository.d.ts +24 -0
  295. package/dist/src/storage/sqlite/context-evidence-repository.js +52 -0
  296. package/dist/src/storage/sqlite/durable-queue.d.ts +16 -0
  297. package/dist/src/storage/sqlite/durable-queue.js +52 -0
  298. package/dist/src/storage/sqlite/durable-state.d.ts +16 -0
  299. package/dist/src/storage/sqlite/durable-state.js +43 -0
  300. package/dist/src/storage/sqlite/index.d.ts +3 -5
  301. package/dist/src/storage/sqlite/index.js +4 -6
  302. package/dist/src/storage/sqlite/knowledge-repository.d.ts +0 -19
  303. package/dist/src/storage/sqlite/knowledge-repository.js +1 -90
  304. package/dist/src/storage/sqlite/migrations/146_understanding_focus_exclusions.sql +9 -0
  305. package/dist/src/storage/sqlite/migrations/147_durable_application_state.sql +39 -0
  306. package/dist/src/storage/sqlite/migrations/148_user_model_foundation.sql +554 -0
  307. package/dist/src/storage/sqlite/migrations/149_separate_source_index_from_memory.sql +18 -0
  308. package/dist/src/storage/sqlite/migrations/150_session_connection_waits.sql +47 -0
  309. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  310. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  311. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  312. package/dist/src/storage/sqlite/notes-repository.d.ts +2 -1
  313. package/dist/src/storage/sqlite/notes-repository.js +37 -3
  314. package/dist/src/storage/sqlite/schema.js +1 -1
  315. package/dist/src/storage/sqlite/session-input-repository.d.ts +14 -2
  316. package/dist/src/storage/sqlite/session-input-repository.js +16 -13
  317. package/dist/src/storage/sqlite/session-repository.js +4 -1
  318. package/dist/src/storage/sqlite/transcript-repository.js +1 -1
  319. package/dist/src/tasks/index.js +2 -2
  320. package/dist/src/tasks/project-operating-view-service.js +1 -1
  321. package/dist/src/tasks/task-application-service.js +6 -1
  322. package/dist/src/tasks/task-context-assembler.js +1 -1
  323. package/dist/src/tasks/task-context-repository.d.ts +0 -1
  324. package/dist/src/tasks/task-context-repository.js +1 -1
  325. package/dist/src/tasks/task-deletion-service.js +1 -1
  326. package/dist/src/tasks/task-handoff-service.js +1 -1
  327. package/dist/src/tasks/task-read-model-projector.js +1 -1
  328. package/dist/src/tasks/task-run-coordinator.js +1 -1
  329. package/dist/src/tasks/task-run-dispatcher.js +1 -1
  330. package/dist/src/tasks/task-run-repository.js +1 -0
  331. package/dist/src/tasks/task-signal-service.js +1 -1
  332. package/dist/src/tui/tool-summary.js +2 -1
  333. package/dist/src/tui/tui-scoped-models.js +9 -6
  334. package/dist/src/user-context/changes.d.ts +1 -1
  335. package/dist/src/user-context/config.d.ts +135 -153
  336. package/dist/src/user-context/config.js +94 -99
  337. package/dist/src/user-context/relationship-continuity.d.ts +2 -2
  338. package/dist/src/user-context/relationship-continuity.js +34 -24
  339. package/dist/src/user-context/sources/activity-clustering.d.ts +9 -3
  340. package/dist/src/user-context/sources/index.js +2 -2
  341. package/dist/src/user-context/sources/repository.d.ts +1 -21
  342. package/dist/src/user-context/sources/repository.js +1 -183
  343. package/dist/src/user-context/sources/types.d.ts +0 -23
  344. package/dist/src/user-model/capture/executor.d.ts +40 -0
  345. package/dist/src/user-model/capture/executor.js +134 -0
  346. package/dist/src/user-model/capture/index.d.ts +2 -0
  347. package/dist/src/user-model/capture/index.js +3 -0
  348. package/dist/src/user-model/capture/semantic.d.ts +21 -0
  349. package/dist/src/user-model/capture/semantic.js +197 -0
  350. package/dist/src/user-model/domain.d.ts +93 -0
  351. package/dist/src/user-model/domain.js +33 -0
  352. package/dist/src/user-model/goals.d.ts +58 -0
  353. package/dist/src/user-model/goals.js +89 -0
  354. package/dist/src/user-model/importance.d.ts +11 -0
  355. package/dist/src/user-model/importance.js +17 -0
  356. package/dist/src/user-model/index.d.ts +5 -0
  357. package/dist/src/user-model/index.js +6 -0
  358. package/dist/src/user-model/repository.d.ts +23 -0
  359. package/dist/src/user-model/repository.js +268 -0
  360. package/dist/src/user-model/temporal.d.ts +10 -0
  361. package/dist/src/user-model/temporal.js +44 -0
  362. package/dist/src/voice/realtime/agentEngine.js +63 -18
  363. package/dist/src/voice/realtime/conversationTurn.d.ts +20 -0
  364. package/dist/src/voice/realtime/conversationTurn.js +83 -0
  365. package/dist/src/voice/realtime/memory-context.d.ts +7 -2
  366. package/dist/src/voice/realtime/memory-context.js +39 -51
  367. package/dist/src/voice/realtime/omniEngine.js +72 -18
  368. package/dist/src/work-discovery/service.d.ts +3 -14
  369. package/dist/src/work-discovery/service.js +138 -99
  370. package/dist/src/work-discovery/types.d.ts +3 -3
  371. package/dist/src/workflows/authoring/workflow-draft-store.d.ts +1 -5
  372. package/dist/src/workflows/authoring/workflow-draft-store.js +23 -43
  373. package/dist/src/workflows/index.js +2 -2
  374. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  375. package/dist/src/workflows/service/workflow-session-bridge.js +12 -20
  376. package/dist/src/workflows/store/event-store.d.ts +1 -2
  377. package/dist/src/workflows/store/event-store.js +19 -64
  378. package/dist/src/workflows/store/paths.d.ts +0 -2
  379. package/dist/src/workflows/store/paths.js +1 -7
  380. package/dist/src/workflows/store/run-store.d.ts +0 -1
  381. package/dist/src/workflows/store/run-store.js +1 -24
  382. package/package.json +3 -3
  383. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-eG49pM-z.js +0 -1
  384. package/dist/gateway/static/root/assets/agents-CZwf1mgZ.js +0 -1
  385. package/dist/gateway/static/root/assets/app-management-settings-panel-BODskFTb.js +0 -1
  386. package/dist/gateway/static/root/assets/appearance-settings-DeaVvaYZ.js +0 -1
  387. package/dist/gateway/static/root/assets/apps-page-BZG3BK7f.js +0 -1
  388. package/dist/gateway/static/root/assets/automations-workspace-CB7Yl2_B.js +0 -6
  389. package/dist/gateway/static/root/assets/browser-settings-page-Bu42Ljfw.js +0 -8
  390. package/dist/gateway/static/root/assets/capabilities-settings-panel-Cg7zCxEH.js +0 -7
  391. package/dist/gateway/static/root/assets/channels-settings-EDTZ8P3y.js +0 -1
  392. package/dist/gateway/static/root/assets/cloud-C4-yfnnk.js +0 -1
  393. package/dist/gateway/static/root/assets/connectors-page-kh7PEkSS.js +0 -2
  394. package/dist/gateway/static/root/assets/dependency-picker-oi7cdv2C.js +0 -1
  395. package/dist/gateway/static/root/assets/desktop-pet-settings-D9OO-exo.js +0 -1
  396. package/dist/gateway/static/root/assets/ellipsis-0k4rZLoy.js +0 -1
  397. package/dist/gateway/static/root/assets/extension-settings-page-FTD7nE8v.js +0 -1
  398. package/dist/gateway/static/root/assets/eye-CABVeTq0.js +0 -1
  399. package/dist/gateway/static/root/assets/eye-off-DEAzt3g1.js +0 -1
  400. package/dist/gateway/static/root/assets/folder-open-CyzJ19I9.js +0 -1
  401. package/dist/gateway/static/root/assets/form-field-width-DJw_jULe.js +0 -1
  402. package/dist/gateway/static/root/assets/gateway-config-api-c-8ENciH.js +0 -1
  403. package/dist/gateway/static/root/assets/gateway-settings-BxvyTRl0.js +0 -1
  404. package/dist/gateway/static/root/assets/heartbeat-settings-C1S2Ccui.js +0 -1
  405. package/dist/gateway/static/root/assets/home-page-Bqx-SMWV.js +0 -1
  406. package/dist/gateway/static/root/assets/index-Cif1_3Jx.js +0 -71
  407. package/dist/gateway/static/root/assets/index-Dbh5SXyV.css +0 -2
  408. package/dist/gateway/static/root/assets/interaction-BmQogeqz.js +0 -1
  409. package/dist/gateway/static/root/assets/is-masked-secret-DOkL5b_X.js +0 -1
  410. package/dist/gateway/static/root/assets/link-2-D_ZKYUW7.js +0 -1
  411. package/dist/gateway/static/root/assets/local-app-workbench-page-sDdw7Y3Q.js +0 -2
  412. package/dist/gateway/static/root/assets/logs-page-DUsxXdDp.js +0 -2
  413. package/dist/gateway/static/root/assets/message-square-plus-XP0tGdlV.js +0 -1
  414. package/dist/gateway/static/root/assets/messages-BbdwoxVo.js +0 -3
  415. package/dist/gateway/static/root/assets/minimize-2-DtOGrlpo.js +0 -1
  416. package/dist/gateway/static/root/assets/mobile-pairing-wizard-Dv87XewB.js +0 -1
  417. package/dist/gateway/static/root/assets/models-hub-cache-88f4fzYS.js +0 -1
  418. package/dist/gateway/static/root/assets/notes-page-DOe0lOcQ.js +0 -1
  419. package/dist/gateway/static/root/assets/notes-workbench-Cy0oYbWP.js +0 -4
  420. package/dist/gateway/static/root/assets/oauth-api-BjSUDIgq.js +0 -1
  421. package/dist/gateway/static/root/assets/oauth-authorization-window-Cdolr2wE.js +0 -1
  422. package/dist/gateway/static/root/assets/page-tabs-BaEQMYm_.js +0 -1
  423. package/dist/gateway/static/root/assets/pencil-DmIY3Oa-.js +0 -1
  424. package/dist/gateway/static/root/assets/preview-open-alternatives-CsNVTKC0.js +0 -1
  425. package/dist/gateway/static/root/assets/project-detail-page-fgD1xc4O.js +0 -1
  426. package/dist/gateway/static/root/assets/projects-page-CiTiEcOc.js +0 -1
  427. package/dist/gateway/static/root/assets/remote-access-hub-Dc0GrNSp.js +0 -1
  428. package/dist/gateway/static/root/assets/rotate-cw-LIg3Am9S.js +0 -1
  429. package/dist/gateway/static/root/assets/search-DA7gz22f.js +0 -1
  430. package/dist/gateway/static/root/assets/sessions-page-BPOW3yaM.js +0 -1
  431. package/dist/gateway/static/root/assets/settings-advanced-gate-Bz4s9BBY.js +0 -1
  432. package/dist/gateway/static/root/assets/settings-form-section-DjWzRk4z.js +0 -1
  433. package/dist/gateway/static/root/assets/setup-status-panel-rllj-j7k.js +0 -1
  434. package/dist/gateway/static/root/assets/shares-settings-DMj7onCX.js +0 -1
  435. package/dist/gateway/static/root/assets/skill-reload-api-DRB366nS.js +0 -1
  436. package/dist/gateway/static/root/assets/skills-page-cBT9jCof.js +0 -2
  437. package/dist/gateway/static/root/assets/system-settings-panel-Byrk4DQy.js +0 -1
  438. package/dist/gateway/static/root/assets/task-detail-page-CheX3zmK.js +0 -1
  439. package/dist/gateway/static/root/assets/tunnel-api-jKzujxFU.js +0 -1
  440. package/dist/gateway/static/root/assets/user-context-page-CWy3Pqtk.js +0 -1
  441. package/dist/gateway/static/root/assets/work-discovery-overlay-DE4_YpDn.js +0 -1
  442. package/dist/gateway/static/root/assets/workflows-page-y4O9-BTf.js +0 -5
  443. package/dist/src/agent/memory/builtin-provider.d.ts +0 -37
  444. package/dist/src/agent/memory/builtin-provider.js +0 -225
  445. package/dist/src/agent/memory/context/types.d.ts +0 -40
  446. package/dist/src/agent/memory/understanding/quality.d.ts +0 -8
  447. package/dist/src/agent/memory/understanding/quality.js +0 -18
  448. package/dist/src/agent/memory/understanding/service.d.ts +0 -19
  449. package/dist/src/agent/memory/understanding/service.js +0 -209
  450. package/dist/src/agent/memory/understanding/types.d.ts +0 -34
  451. package/dist/src/agent/memory/understanding/types.js +0 -1
  452. package/dist/src/agent/memory/user-context-coordinator.d.ts +0 -23
  453. package/dist/src/agent/memory/user-context-coordinator.js +0 -113
  454. package/dist/src/agent/tools/dreaming-tool.js +0 -37
  455. package/dist/src/agent/tools/memory-tool.d.ts +0 -9
  456. package/dist/src/agent/tools/memory-tool.js +0 -119
  457. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +0 -11
  458. package/dist/src/gateway/dreaming-automation-reconciler.js +0 -63
  459. package/dist/src/gateway/hono/routes/understanding-sources.d.ts +0 -21
  460. package/dist/src/gateway/hono/routes/understanding-sources.js +0 -387
  461. package/dist/src/gateway/hono/routes/you.d.ts +0 -3
  462. package/dist/src/gateway/hono/routes/you.js +0 -443
  463. package/dist/src/projects/memory-bind.d.ts +0 -1
  464. package/dist/src/projects/memory-bind.js +0 -14
  465. package/dist/src/storage/sqlite/context-consolidation-repository.d.ts +0 -37
  466. package/dist/src/storage/sqlite/context-consolidation-repository.js +0 -64
  467. package/dist/src/storage/sqlite/memory-records-repository.d.ts +0 -217
  468. package/dist/src/storage/sqlite/memory-records-repository.js +0 -715
  469. package/dist/src/storage/sqlite/remote-context-repository.d.ts +0 -3
  470. package/dist/src/storage/sqlite/remote-context-repository.js +0 -40
  471. package/dist/src/storage/sqlite/user-context-quality-repository.d.ts +0 -49
  472. package/dist/src/storage/sqlite/user-context-quality-repository.js +0 -118
  473. package/dist/src/storage/sqlite/user-context-repository.d.ts +0 -85
  474. package/dist/src/storage/sqlite/user-context-repository.js +0 -535
  475. package/dist/src/user-context/automatic-context.d.ts +0 -17
  476. package/dist/src/user-context/automatic-context.js +0 -85
  477. package/dist/src/user-context/consolidation.d.ts +0 -27
  478. package/dist/src/user-context/consolidation.js +0 -187
  479. package/dist/src/user-context/context-objects.d.ts +0 -17
  480. package/dist/src/user-context/context-objects.js +0 -99
  481. package/dist/src/user-context/evaluation/harness.d.ts +0 -13
  482. package/dist/src/user-context/evaluation/harness.js +0 -31
  483. package/dist/src/user-context/extraction/executor.d.ts +0 -22
  484. package/dist/src/user-context/extraction/executor.js +0 -142
  485. package/dist/src/user-context/extraction/repair.d.ts +0 -19
  486. package/dist/src/user-context/extraction/repair.js +0 -71
  487. package/dist/src/user-context/extraction/semantic.d.ts +0 -18
  488. package/dist/src/user-context/extraction/semantic.js +0 -148
  489. package/dist/src/user-context/focus-lifecycle.d.ts +0 -2
  490. package/dist/src/user-context/focus-lifecycle.js +0 -26
  491. package/dist/src/user-context/manual-understanding.d.ts +0 -12
  492. package/dist/src/user-context/manual-understanding.js +0 -37
  493. package/dist/src/user-context/planner.d.ts +0 -17
  494. package/dist/src/user-context/planner.js +0 -465
  495. package/dist/src/user-context/relationships/indexer.d.ts +0 -13
  496. package/dist/src/user-context/relationships/indexer.js +0 -185
  497. package/dist/src/user-context/relationships/service.d.ts +0 -22
  498. package/dist/src/user-context/relationships/service.js +0 -50
  499. package/dist/src/user-context/retriever.d.ts +0 -15
  500. package/dist/src/user-context/retriever.js +0 -124
  501. package/dist/src/user-context/scope.d.ts +0 -7
  502. package/dist/src/user-context/scope.js +0 -9
  503. package/dist/src/user-context/selection-policy.d.ts +0 -20
  504. package/dist/src/user-context/selection-policy.js +0 -33
  505. package/dist/src/user-context/understanding.d.ts +0 -15
  506. package/dist/src/user-context/understanding.js +0 -24
  507. package/dist/src/user-context/understandingQuality.d.ts +0 -5
  508. package/dist/src/user-context/understandingQuality.js +0 -48
  509. /package/dist/src/{agent/memory/context/types.js → knowledge-memory/domain.js} +0 -0
@@ -0,0 +1,268 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
+ import { USER_MODEL_PRINCIPAL_ID, validateCandidate, validateScope } from "./domain.js";
3
+ import { defaultReviewAt, requiresBoundedValidity } from "./temporal.js";
4
+ import { randomUUID } from "node:crypto";
5
+ //#region src/user-model/repository.ts
6
+ function slotFromRow(row) {
7
+ return {
8
+ id: row.slot_id,
9
+ principalId: row.principal_id,
10
+ subject: {
11
+ type: row.subject_type,
12
+ id: row.subject_id
13
+ },
14
+ predicate: row.predicate,
15
+ cardinality: row.cardinality,
16
+ scope: {
17
+ type: row.scope_type,
18
+ ...row.scope_id ? { id: row.scope_id } : {}
19
+ },
20
+ createdAt: row.created_at
21
+ };
22
+ }
23
+ function assertionFromRow(row) {
24
+ return {
25
+ id: row.assertion_id,
26
+ slotId: row.slot_id,
27
+ kind: row.kind,
28
+ value: JSON.parse(row.value_json),
29
+ normalizedValue: row.normalized_value,
30
+ statement: row.statement,
31
+ authority: row.authority,
32
+ status: row.status,
33
+ confidence: row.confidence,
34
+ ...row.declared_importance === null ? {} : { declaredImportance: row.declared_importance },
35
+ inferredImportance: row.inferred_importance,
36
+ consequence: row.consequence,
37
+ actionability: row.actionability,
38
+ volatility: row.volatility,
39
+ sensitivity: row.sensitivity,
40
+ disclosurePolicy: row.disclosure_policy,
41
+ applicability: JSON.parse(row.applicability_json),
42
+ ...row.valid_from === null ? {} : { validFrom: row.valid_from },
43
+ ...row.valid_to === null ? {} : { validTo: row.valid_to },
44
+ observedAt: row.observed_at,
45
+ recordedAt: row.recorded_at,
46
+ ...row.review_at === null ? {} : { reviewAt: row.review_at },
47
+ ...row.supersedes_assertion_id === null ? {} : { supersedesAssertionId: row.supersedes_assertion_id },
48
+ createdBy: row.created_by,
49
+ createdAt: row.created_at
50
+ };
51
+ }
52
+ function findOrCreateSlot(db, candidate, now) {
53
+ const principalId = candidate.principalId ?? "local-owner";
54
+ const scopeId = candidate.scope.id?.trim() ?? null;
55
+ const existing = db.prepare(`SELECT * FROM user_assertion_slots
56
+ WHERE principal_id = ? AND subject_type = ? AND subject_id = ? AND predicate = ?
57
+ AND scope_type = ? AND COALESCE(scope_id, '') = COALESCE(?, '')`).get(principalId, candidate.subject.type, candidate.subject.id.trim(), candidate.predicate.trim(), candidate.scope.type, scopeId);
58
+ if (existing) {
59
+ if (existing.cardinality !== candidate.cardinality) throw new Error(`Assertion slot cardinality mismatch for ${candidate.predicate}.`);
60
+ return slotFromRow(existing);
61
+ }
62
+ const id = randomUUID();
63
+ db.prepare(`INSERT INTO user_assertion_slots (
64
+ slot_id, principal_id, subject_type, subject_id, predicate, cardinality,
65
+ scope_type, scope_id, created_at
66
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, principalId, candidate.subject.type, candidate.subject.id.trim(), candidate.predicate.trim(), candidate.cardinality, candidate.scope.type, scopeId, now);
67
+ return slotFromRow(db.prepare("SELECT * FROM user_assertion_slots WHERE slot_id = ?").get(id));
68
+ }
69
+ function intervalsOverlap(left, candidate) {
70
+ const leftStart = left.validFrom ?? Number.NEGATIVE_INFINITY;
71
+ const leftEnd = left.validTo ?? Number.POSITIVE_INFINITY;
72
+ const rightStart = candidate.validFrom ?? Number.NEGATIVE_INFINITY;
73
+ return leftStart <= (candidate.validTo ?? Number.POSITIVE_INFINITY) && rightStart <= leftEnd;
74
+ }
75
+ function listReconcilableAssertions(db, slotId) {
76
+ return db.prepare(`SELECT * FROM user_assertions WHERE slot_id = ?
77
+ AND status NOT IN ('rejected', 'archived') ORDER BY recorded_at DESC`).all(slotId).map(assertionFromRow);
78
+ }
79
+ function sortByAuthorityAndRecorded(assertions) {
80
+ return assertions.sort((left, right) => authorityRank(right.authority) - authorityRank(left.authority) || right.recordedAt - left.recordedAt);
81
+ }
82
+ function initialStatus(candidate) {
83
+ if (requiresBoundedValidity(candidate.kind, candidate.volatility) && candidate.validTo === void 0) return "needs_review";
84
+ return candidate.authority === "user_explicit" ? "active" : "candidate";
85
+ }
86
+ function insertAssertion(db, slotId, candidate, status, now, supersedesAssertionId) {
87
+ const id = randomUUID();
88
+ const reviewAt = candidate.reviewAt ?? defaultReviewAt(candidate.volatility, candidate.observedAt) ?? null;
89
+ db.prepare(`INSERT INTO user_assertions (
90
+ assertion_id, slot_id, kind, value_json, normalized_value, statement, authority, status,
91
+ confidence, declared_importance, inferred_importance, consequence, actionability,
92
+ volatility, sensitivity, disclosure_policy, applicability_json, valid_from, valid_to,
93
+ observed_at, recorded_at, review_at, supersedes_assertion_id, created_by, created_at
94
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, slotId, candidate.kind, JSON.stringify(candidate.value), candidate.normalizedValue.trim(), candidate.statement.trim(), candidate.authority, status, candidate.confidence, candidate.declaredImportance ?? null, candidate.inferredImportance, candidate.consequence, candidate.actionability, candidate.volatility, candidate.sensitivity, candidate.disclosurePolicy, JSON.stringify(candidate.applicability ?? {}), candidate.validFrom ?? null, candidate.validTo ?? null, candidate.observedAt, now, reviewAt, supersedesAssertionId ?? null, candidate.createdBy, now);
95
+ db.prepare(`INSERT INTO user_assertions_fts(statement, assertion_id, slot_id) VALUES (?, ?, ?)`).run(candidate.statement.trim(), id, slotId);
96
+ recordStatusEvent(db, id, null, status, candidate.createdBy === "connector" ? "runtime" : candidate.createdBy, "Assertion admitted.", now);
97
+ if (candidate.evidenceId) db.prepare(`INSERT INTO user_assertion_evidence (
98
+ assertion_id, evidence_id, relation, confidence, created_at
99
+ ) VALUES (?, ?, 'supports', ?, ?)
100
+ ON CONFLICT(assertion_id, evidence_id, relation) DO UPDATE SET confidence = excluded.confidence`).run(id, candidate.evidenceId, candidate.evidenceConfidence ?? candidate.confidence, now);
101
+ return assertionFromRow(db.prepare("SELECT * FROM user_assertions WHERE assertion_id = ?").get(id));
102
+ }
103
+ function recordStatusEvent(db, assertionId, fromStatus, toStatus, actor, reason, now) {
104
+ db.prepare(`INSERT INTO user_assertion_status_events (
105
+ event_id, assertion_id, from_status, to_status, actor_type, reason, created_at
106
+ ) VALUES (?, ?, ?, ?, ?, ?, ?)`).run(randomUUID(), assertionId, fromStatus, toStatus, actor, reason, now);
107
+ }
108
+ function attachEvidence(db, assertionId, candidate, now) {
109
+ if (!candidate.evidenceId) return;
110
+ db.prepare(`INSERT INTO user_assertion_evidence (
111
+ assertion_id, evidence_id, relation, confidence, created_at
112
+ ) VALUES (?, ?, 'supports', ?, ?)
113
+ ON CONFLICT(assertion_id, evidence_id, relation) DO UPDATE SET confidence = excluded.confidence`).run(assertionId, candidate.evidenceId, candidate.evidenceConfidence ?? candidate.confidence, now);
114
+ }
115
+ function closeValidity(db, assertion, boundary, now) {
116
+ if (assertion.validFrom !== void 0 && boundary <= assertion.validFrom) {
117
+ updateStatus(db, assertion, "archived", "Superseded before its validity began.", now);
118
+ return;
119
+ }
120
+ const end = boundary - 1;
121
+ db.prepare(`UPDATE user_assertions SET valid_to = ?
122
+ WHERE assertion_id = ? AND (valid_to IS NULL OR valid_to >= ?)`).run(end, assertion.id, boundary);
123
+ }
124
+ function updateStatus(db, assertion, status, reason, now) {
125
+ if (assertion.status === status) return;
126
+ db.prepare("UPDATE user_assertions SET status = ? WHERE assertion_id = ?").run(status, assertion.id);
127
+ recordStatusEvent(db, assertion.id, assertion.status, status, "runtime", reason, now);
128
+ }
129
+ function authorityRank(authority) {
130
+ return {
131
+ external_untrusted: 0,
132
+ system_inferred: 1,
133
+ user_observed: 2,
134
+ user_explicit: 3
135
+ }[authority];
136
+ }
137
+ function reconcileAssertion(candidate, now = Date.now()) {
138
+ validateCandidate(candidate);
139
+ return runSqliteWriteTransaction((db) => {
140
+ const slot = findOrCreateSlot(db, candidate, now);
141
+ const existing = listReconcilableAssertions(db, slot.id);
142
+ if (candidate.correctionOfAssertionId) {
143
+ if (candidate.authority !== "user_explicit") throw new Error("Only an explicit user assertion can correct an existing assertion.");
144
+ const target = existing.find((item) => item.id === candidate.correctionOfAssertionId);
145
+ if (!target) throw new Error("Correction target does not belong to the resolved assertion slot.");
146
+ if (target.normalizedValue === candidate.normalizedValue.trim()) {
147
+ attachEvidence(db, target.id, candidate, now);
148
+ return {
149
+ action: "deduplicated",
150
+ assertion: target
151
+ };
152
+ }
153
+ const assertion = insertAssertion(db, slot.id, candidate, "active", now, target.id);
154
+ closeValidity(db, target, candidate.validFrom ?? candidate.observedAt, now);
155
+ return {
156
+ action: "superseded",
157
+ assertion,
158
+ previousAssertion: getUserAssertion(target.id)
159
+ };
160
+ }
161
+ const overlapping = sortByAuthorityAndRecorded(existing.filter((item) => intervalsOverlap(item, candidate)));
162
+ const duplicate = overlapping.find((item) => item.normalizedValue === candidate.normalizedValue.trim());
163
+ if (duplicate) {
164
+ attachEvidence(db, duplicate.id, candidate, now);
165
+ return {
166
+ action: "deduplicated",
167
+ assertion: duplicate
168
+ };
169
+ }
170
+ const status = initialStatus(candidate);
171
+ if (slot.cardinality === "multiple" || !overlapping.length) return {
172
+ action: "created",
173
+ assertion: insertAssertion(db, slot.id, candidate, status, now)
174
+ };
175
+ const current = overlapping[0];
176
+ if (candidate.authority === "user_explicit" && authorityRank(candidate.authority) > authorityRank(current.authority)) {
177
+ const assertion = insertAssertion(db, slot.id, candidate, status, now, current.id);
178
+ closeValidity(db, current, candidate.validFrom ?? candidate.observedAt, now);
179
+ return {
180
+ action: "superseded",
181
+ assertion,
182
+ previousAssertion: getUserAssertion(current.id)
183
+ };
184
+ }
185
+ const assertion = insertAssertion(db, slot.id, candidate, candidate.authority === "user_explicit" ? "needs_review" : "conflicted", now);
186
+ if (current.authority !== "user_explicit" && candidate.authority !== "user_explicit") updateStatus(db, current, "conflicted", "Overlapping assertion has a different value.", now);
187
+ return {
188
+ action: "conflicted",
189
+ assertion,
190
+ previousAssertion: getUserAssertion(current.id)
191
+ };
192
+ });
193
+ }
194
+ function getUserAssertion(id) {
195
+ const row = getSqliteDatabase().prepare("SELECT * FROM user_assertions WHERE assertion_id = ?").get(id);
196
+ return row ? assertionFromRow(row) : void 0;
197
+ }
198
+ function getAssertionSlot(id) {
199
+ const row = getSqliteDatabase().prepare("SELECT * FROM user_assertion_slots WHERE slot_id = ?").get(id);
200
+ return row ? slotFromRow(row) : void 0;
201
+ }
202
+ function listSlotAssertions(slotId) {
203
+ return getSqliteDatabase().prepare(`SELECT * FROM user_assertions
204
+ WHERE slot_id = ? ORDER BY recorded_at DESC`).all(slotId).map(assertionFromRow);
205
+ }
206
+ function listUserAssertions(input = {}) {
207
+ const principalId = input.principalId ?? "local-owner";
208
+ const statuses = input.statuses ?? [
209
+ "active",
210
+ "candidate",
211
+ "needs_review",
212
+ "conflicted"
213
+ ];
214
+ if (!statuses.length) return [];
215
+ const placeholders = statuses.map(() => "?").join(", ");
216
+ const limit = Math.max(1, Math.min(2e3, input.limit ?? 200));
217
+ return getSqliteDatabase().prepare(`SELECT a.* FROM user_assertions a
218
+ JOIN user_assertion_slots s ON s.slot_id = a.slot_id
219
+ WHERE s.principal_id = ? AND a.status IN (${placeholders})
220
+ ORDER BY a.recorded_at DESC LIMIT ?`).all(principalId, ...statuses, limit).map(assertionFromRow);
221
+ }
222
+ function getActiveAssertionByPredicate(predicate) {
223
+ const row = getSqliteDatabase().prepare(`SELECT a.* FROM user_assertions a
224
+ JOIN user_assertion_slots s ON s.slot_id = a.slot_id
225
+ WHERE s.principal_id = ? AND s.predicate = ? AND a.status = 'active'
226
+ AND (a.valid_from IS NULL OR a.valid_from <= ?)
227
+ AND (a.valid_to IS NULL OR a.valid_to >= ?)
228
+ ORDER BY CASE a.authority WHEN 'user_explicit' THEN 0 WHEN 'user_observed' THEN 1
229
+ WHEN 'system_inferred' THEN 2 ELSE 3 END, a.recorded_at DESC LIMIT 1`).get(USER_MODEL_PRINCIPAL_ID, predicate, Date.now(), Date.now());
230
+ return row ? assertionFromRow(row) : void 0;
231
+ }
232
+ function getActiveAssertionForSlot(input) {
233
+ validateScope(input.scope);
234
+ const row = getSqliteDatabase().prepare(`SELECT a.* FROM user_assertions a
235
+ JOIN user_assertion_slots s ON s.slot_id = a.slot_id
236
+ WHERE s.principal_id = ? AND s.subject_type = ? AND s.subject_id = ?
237
+ AND s.predicate = ? AND s.scope_type = ?
238
+ AND COALESCE(s.scope_id, '') = COALESCE(?, '') AND a.status = 'active'
239
+ AND (a.valid_from IS NULL OR a.valid_from <= ?)
240
+ AND (a.valid_to IS NULL OR a.valid_to >= ?)
241
+ ORDER BY CASE a.authority WHEN 'user_explicit' THEN 0 WHEN 'user_observed' THEN 1
242
+ WHEN 'system_inferred' THEN 2 ELSE 3 END, a.recorded_at DESC LIMIT 1`).get(USER_MODEL_PRINCIPAL_ID, input.subject.type, input.subject.id.trim(), input.predicate.trim(), input.scope.type, input.scope.id?.trim() ?? null, Date.now(), Date.now());
243
+ return row ? assertionFromRow(row) : void 0;
244
+ }
245
+ function getUserTimezone() {
246
+ const value = getActiveAssertionByPredicate("preference.timezone")?.value;
247
+ return typeof value === "string" && value.trim() ? value.trim() : void 0;
248
+ }
249
+ function linkAssertionEvidence(assertionId, evidenceId, relation, confidence, now = Date.now()) {
250
+ if (!Number.isFinite(confidence) || confidence < 0 || confidence > 1) throw new Error("Evidence confidence must be between 0 and 1.");
251
+ getSqliteDatabase().prepare(`INSERT INTO user_assertion_evidence (
252
+ assertion_id, evidence_id, relation, confidence, created_at
253
+ ) VALUES (?, ?, ?, ?, ?)
254
+ ON CONFLICT(assertion_id, evidence_id, relation) DO UPDATE SET confidence = excluded.confidence`).run(assertionId, evidenceId, relation, confidence, now);
255
+ }
256
+ function setAssertionStatus(assertionId, status, input) {
257
+ const current = getUserAssertion(assertionId);
258
+ if (!current) throw new Error(`User assertion not found: ${assertionId}`);
259
+ if (current.status === status) return current;
260
+ const now = input.now ?? Date.now();
261
+ runSqliteWriteTransaction((db) => {
262
+ db.prepare("UPDATE user_assertions SET status = ? WHERE assertion_id = ?").run(status, assertionId);
263
+ recordStatusEvent(db, assertionId, current.status, status, input.actor, input.reason, now);
264
+ });
265
+ return getUserAssertion(assertionId);
266
+ }
267
+ //#endregion
268
+ export { getActiveAssertionByPredicate, getActiveAssertionForSlot, getAssertionSlot, getUserAssertion, getUserTimezone, linkAssertionEvidence, listSlotAssertions, listUserAssertions, reconcileAssertion, setAssertionStatus };
@@ -0,0 +1,10 @@
1
+ import type { AssertionKind, AssertionVolatility, UserAssertion } from './domain.js';
2
+ export declare function defaultReviewAt(volatility: AssertionVolatility, observedAt: number): number | undefined;
3
+ export declare function requiresBoundedValidity(kind: AssertionKind, volatility: AssertionVolatility): boolean;
4
+ export declare function isAssertionValidAt(assertion: UserAssertion, asOf: number): boolean;
5
+ export interface CurrentAssertionResolution {
6
+ assertion?: UserAssertion;
7
+ conflict: boolean;
8
+ contenders: UserAssertion[];
9
+ }
10
+ export declare function resolveCurrentAssertion(assertions: UserAssertion[], asOf?: number): CurrentAssertionResolution;
@@ -0,0 +1,44 @@
1
+ //#region src/user-model/temporal.ts
2
+ const REVIEW_INTERVAL_MS = {
3
+ stable: void 0,
4
+ slow: 4320 * 60 * 60 * 1e3,
5
+ dynamic: 720 * 60 * 60 * 1e3,
6
+ event: 10080 * 60 * 1e3
7
+ };
8
+ function defaultReviewAt(volatility, observedAt) {
9
+ const interval = REVIEW_INTERVAL_MS[volatility];
10
+ return interval === void 0 ? void 0 : observedAt + interval;
11
+ }
12
+ function requiresBoundedValidity(kind, volatility) {
13
+ return kind === "current_state" || volatility === "event";
14
+ }
15
+ function isAssertionValidAt(assertion, asOf) {
16
+ return assertion.status === "active" && (assertion.validFrom === void 0 || assertion.validFrom <= asOf) && (assertion.validTo === void 0 || assertion.validTo >= asOf);
17
+ }
18
+ const AUTHORITY_RANK = {
19
+ external_untrusted: 0,
20
+ system_inferred: 1,
21
+ user_observed: 2,
22
+ user_explicit: 3
23
+ };
24
+ function resolveCurrentAssertion(assertions, asOf = Date.now()) {
25
+ const contenders = assertions.filter((item) => isAssertionValidAt(item, asOf));
26
+ if (!contenders.length) return {
27
+ conflict: false,
28
+ contenders: []
29
+ };
30
+ contenders.sort((left, right) => AUTHORITY_RANK[right.authority] - AUTHORITY_RANK[left.authority] || right.recordedAt - left.recordedAt);
31
+ const best = contenders[0];
32
+ if (contenders.filter((item) => AUTHORITY_RANK[item.authority] === AUTHORITY_RANK[best.authority] && item.normalizedValue !== best.normalizedValue).length) return {
33
+ assertion: void 0,
34
+ conflict: true,
35
+ contenders
36
+ };
37
+ return {
38
+ assertion: best,
39
+ conflict: false,
40
+ contenders
41
+ };
42
+ }
43
+ //#endregion
44
+ export { defaultReviewAt, isAssertionValidAt, requiresBoundedValidity, resolveCurrentAssertion };
@@ -2,6 +2,7 @@ import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { speakStream } from "../tts/speak-core.js";
4
4
  import { AudioPlaybackWindow } from "./audio-playback-window.js";
5
+ import { ConversationTurn } from "./conversationTurn.js";
5
6
  import { SpeakableSegmenter } from "./speakable-segmenter.js";
6
7
  import crypto from "node:crypto";
7
8
  //#region src/voice/realtime/agentEngine.ts
@@ -29,6 +30,32 @@ function createAgentVoiceEngine(options) {
29
30
  let finalCount = 0;
30
31
  let committing = false;
31
32
  const finalizedUtterances = /* @__PURE__ */ new Set();
33
+ let pendingTurn;
34
+ const turn = new ConversationTurn(claim.silenceDurationMs, (text) => {
35
+ if (closed || muted) return;
36
+ if (queuedTurns >= 8) {
37
+ send("session.error", {
38
+ code: "INPUT_BACKPRESSURE",
39
+ message: "Too many queued voice turns",
40
+ recoverable: false
41
+ });
42
+ options.onClose("input_backpressure", true);
43
+ return;
44
+ }
45
+ queuedTurns += 1;
46
+ const generation = inputGeneration;
47
+ const pending = {
48
+ text,
49
+ cancelled: false
50
+ };
51
+ pendingTurn = pending;
52
+ conversationTail = conversationTail.then(() => {
53
+ if (pendingTurn === pending) pendingTurn = void 0;
54
+ if (generation === inputGeneration && !pending.cancelled) return runConversationTurn(text);
55
+ }).finally(() => {
56
+ if (generation === inputGeneration) queuedTurns -= 1;
57
+ });
58
+ });
32
59
  function cancelActiveResponse(reason) {
33
60
  const response = activeResponse;
34
61
  if (!response) return false;
@@ -238,10 +265,23 @@ function createAgentVoiceEngine(options) {
238
265
  }
239
266
  });
240
267
  }
268
+ function bufferFinal(utteranceId, text) {
269
+ try {
270
+ turn.final(utteranceId, text);
271
+ } catch {
272
+ send("session.error", {
273
+ code: "INPUT_BACKPRESSURE",
274
+ message: "Voice turn input limit reached",
275
+ recoverable: false
276
+ });
277
+ options.onClose("input_backpressure", true);
278
+ }
279
+ }
241
280
  function onSttEvent(event) {
242
281
  if (closed) return;
243
282
  if (event.type === "ready" || event.type === "usage") return;
244
283
  if (event.type === "error") {
284
+ turn.reset();
245
285
  log.warn({
246
286
  err: event.error,
247
287
  sessionId: claim.sessionId,
@@ -257,10 +297,21 @@ function createAgentVoiceEngine(options) {
257
297
  }
258
298
  if (muted || finalizedUtterances.has(event.utteranceId)) return;
259
299
  if (event.type === "speech_started") {
300
+ if (claim.request.purpose === "conversation") {
301
+ if (pendingTurn) {
302
+ pendingTurn.cancelled = true;
303
+ turn.restore(pendingTurn.text);
304
+ pendingTurn = void 0;
305
+ }
306
+ turn.start(event.utteranceId);
307
+ }
260
308
  if (claim.request.purpose === "conversation" && claim.config.voice?.realtime?.bargeIn && !activeResponse?.awaitingClarification) cancelActiveResponse("barge_in");
261
309
  send("input.speech_started", { utteranceId: event.utteranceId });
262
310
  }
263
- if (event.type === "speech_stopped") send("input.speech_stopped", { utteranceId: event.utteranceId });
311
+ if (event.type === "speech_stopped") {
312
+ if (claim.request.purpose === "conversation") turn.stop(event.utteranceId);
313
+ send("input.speech_stopped", { utteranceId: event.utteranceId });
314
+ }
264
315
  if (event.type === "transcript_delta") send("input.transcript.delta", {
265
316
  utteranceId: event.utteranceId,
266
317
  revision: event.revision,
@@ -268,7 +319,10 @@ function createAgentVoiceEngine(options) {
268
319
  });
269
320
  if (event.type === "transcript_final") {
270
321
  const text = event.text.trim();
271
- if (!text) return;
322
+ if (!text) {
323
+ if (claim.request.purpose === "conversation") bufferFinal(event.utteranceId, "");
324
+ return;
325
+ }
272
326
  if (finalizedUtterances.size >= 1e4) {
273
327
  options.onClose("utterance_limit", true);
274
328
  return;
@@ -282,28 +336,18 @@ function createAgentVoiceEngine(options) {
282
336
  ...event.language === "zh" || event.language === "en" ? { language: event.language } : {}
283
337
  });
284
338
  if (claim.request.purpose === "conversation") {
285
- if (activeResponse?.awaitingClarification) return;
286
- if (claim.config.voice?.realtime?.bargeIn) cancelActiveResponse("barge_in");
287
- if (queuedTurns >= 8) {
288
- send("session.error", {
289
- code: "INPUT_BACKPRESSURE",
290
- message: "Too many queued voice turns",
291
- recoverable: false
292
- });
293
- options.onClose("input_backpressure", true);
339
+ if (activeResponse?.awaitingClarification) {
340
+ turn.reset();
294
341
  return;
295
342
  }
296
- queuedTurns += 1;
297
- const generation = inputGeneration;
298
- conversationTail = conversationTail.then(() => {
299
- if (generation === inputGeneration) return runConversationTurn(text);
300
- }).finally(() => {
301
- if (generation === inputGeneration) queuedTurns -= 1;
302
- });
343
+ if (claim.config.voice?.realtime?.bargeIn) cancelActiveResponse("barge_in");
344
+ bufferFinal(event.utteranceId, text);
303
345
  }
304
346
  }
305
347
  }
306
348
  function discardInput() {
349
+ turn.reset();
350
+ pendingTurn = void 0;
307
351
  inputGeneration += 1;
308
352
  queuedTurns = 0;
309
353
  bufferedAudio = [];
@@ -387,6 +431,7 @@ function createAgentVoiceEngine(options) {
387
431
  close() {
388
432
  if (closing) return closing;
389
433
  closed = true;
434
+ turn.reset();
390
435
  cancelActiveResponse("session_closed");
391
436
  sttAbort.abort("session_closed");
392
437
  sttSession?.abort("session_closed");
@@ -0,0 +1,20 @@
1
+ /** Conservative continuation hints, not a semantic model or punctuation-based endpoint detector. */
2
+ export declare function needsContinuation(text: string): boolean;
3
+ /** Joins provider utterances until both transcription and the continuation window have settled. */
4
+ export declare class ConversationTurn {
5
+ private readonly silenceDurationMs;
6
+ private readonly onTurn;
7
+ private readonly parts;
8
+ private timer;
9
+ private stoppedAt;
10
+ constructor(silenceDurationMs: number, onTurn: (text: string) => void);
11
+ start(id: string): void;
12
+ stop(id: string): void;
13
+ final(id: string, text: string): void;
14
+ reset(): void;
15
+ /** Restore a settled turn if generation was still queued when the user resumed. */
16
+ restore(text: string): void;
17
+ private text;
18
+ private clearTimer;
19
+ private schedule;
20
+ }
@@ -0,0 +1,83 @@
1
+ //#region src/voice/realtime/conversationTurn.ts
2
+ const MIN_TURN_SILENCE_MS = 1200;
3
+ const FINAL_SETTLE_MS = 350;
4
+ const INCOMPLETE_HOLD_MS = 1800;
5
+ /** Conservative continuation hints, not a semantic model or punctuation-based endpoint detector. */
6
+ function needsContinuation(text) {
7
+ const tail = text.trim().replace(/[\s,。!?、;:,.!?;:]+$/u, "");
8
+ return /(?:…|\.\.\.)[\s,。!?,.!?]*$/u.test(text) || /(?:因为|但是|然后|而且|如果|所以|比如|或者|还有|我想|我要|我觉得|帮我|帮我查一下|帮我查查|请帮我|就是说|那个|这个|呃|嗯)$/u.test(tail) || /\b(?:because|but|and|or|if|so|then|um|uh|i want to|i would like to|can you|could you|let me)\s*$/iu.test(tail);
9
+ }
10
+ /** Joins provider utterances until both transcription and the continuation window have settled. */
11
+ var ConversationTurn = class {
12
+ parts = /* @__PURE__ */ new Map();
13
+ timer;
14
+ stoppedAt = 0;
15
+ constructor(silenceDurationMs, onTurn) {
16
+ this.silenceDurationMs = silenceDurationMs;
17
+ this.onTurn = onTurn;
18
+ }
19
+ start(id) {
20
+ if (this.parts.has(id)) return;
21
+ this.clearTimer();
22
+ this.parts.set(id, { stopped: false });
23
+ }
24
+ stop(id) {
25
+ const part = this.parts.get(id);
26
+ if (part?.stopped) return;
27
+ this.parts.set(id, {
28
+ ...part,
29
+ stopped: true
30
+ });
31
+ this.stoppedAt = Date.now();
32
+ this.schedule();
33
+ }
34
+ final(id, text) {
35
+ const part = this.parts.get(id);
36
+ if (part?.text !== void 0) return;
37
+ if (!part?.stopped) this.stoppedAt = Date.now();
38
+ this.parts.set(id, {
39
+ text: text.trim(),
40
+ stopped: true
41
+ });
42
+ if (this.parts.size > 256 || this.text().length > 32e3) {
43
+ this.reset();
44
+ throw new Error("Voice turn input limit reached");
45
+ }
46
+ this.schedule();
47
+ }
48
+ reset() {
49
+ this.clearTimer();
50
+ this.parts.clear();
51
+ }
52
+ /** Restore a settled turn if generation was still queued when the user resumed. */
53
+ restore(text) {
54
+ this.parts.set("queued-turn", {
55
+ text,
56
+ stopped: true
57
+ });
58
+ this.clearTimer();
59
+ }
60
+ text() {
61
+ return [...this.parts.values()].map((part) => part.text ?? "").filter(Boolean).join(" ");
62
+ }
63
+ clearTimer() {
64
+ clearTimeout(this.timer);
65
+ this.timer = void 0;
66
+ }
67
+ schedule() {
68
+ this.clearTimer();
69
+ if ([...this.parts.values()].some((part) => !part.stopped || part.text === void 0)) return;
70
+ const text = this.text();
71
+ if (!text) {
72
+ this.reset();
73
+ return;
74
+ }
75
+ const holdMs = Math.max(FINAL_SETTLE_MS, MIN_TURN_SILENCE_MS - this.silenceDurationMs, needsContinuation(text) ? INCOMPLETE_HOLD_MS : 0);
76
+ this.timer = setTimeout(() => {
77
+ this.reset();
78
+ this.onTurn(text);
79
+ }, Math.max(FINAL_SETTLE_MS, this.stoppedAt + holdMs - Date.now()));
80
+ }
81
+ };
82
+ //#endregion
83
+ export { ConversationTurn, needsContinuation };
@@ -1,7 +1,12 @@
1
1
  import type { AgentMessage } from '@earendil-works/pi-agent-core';
2
2
  import type { Config } from '../../config/schema.js';
3
- import { type AutomaticContextSelection } from '../../user-context/automatic-context.js';
4
- export interface VoiceMemorySnapshot extends AutomaticContextSelection {
3
+ export interface VoiceMemorySnapshot {
4
+ block: string;
5
+ references: Array<{
6
+ kind: 'assertion' | 'knowledge';
7
+ id: string;
8
+ updatedAt: number;
9
+ }>;
5
10
  isCurrent: () => boolean;
6
11
  subscribe: (invalidate: () => void) => () => void;
7
12
  }