@xopcai/xopc 0.0.302 → 0.0.306

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 (364) hide show
  1. package/README.md +4 -4
  2. package/README.zh-CN.md +4 -4
  3. package/dist/browser-ext/dist/assets/{auth-B_9ZuGDx.js → auth-C3yV1y_l.js} +67 -22
  4. package/dist/browser-ext/dist/background.js +4 -4
  5. package/dist/browser-ext/dist/sidepanel.html +1 -1
  6. package/dist/browser-ext/dist/sidepanel.js +3 -3
  7. package/dist/browser-ext/manifest.json +1 -1
  8. package/dist/extensions/feishu/xopc.extension.json +0 -3
  9. package/dist/extensions/telegram/xopc.extension.json +1 -4
  10. package/dist/extensions/weixin/xopc.extension.json +0 -3
  11. package/dist/gateway/static/root/assets/{activity-store-DCi5rh4e.js → activity-store-DLtim-_I.js} +1 -1
  12. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-C0zP6W2B.js → agent-avatar-dicebear-iQXtiilH.js} +1 -1
  13. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CxOv4ivK.js +1 -0
  14. package/dist/gateway/static/root/assets/agents-DzKx7z3k.js +1 -0
  15. package/dist/gateway/static/root/assets/{api-CAV9PN9i.js → api-DfSU0-lD.js} +1 -1
  16. package/dist/gateway/static/root/assets/api-gpHh07OL.js +1 -0
  17. package/dist/gateway/static/root/assets/app-management-settings-panel-BpYFKz7B.js +1 -0
  18. package/dist/gateway/static/root/assets/{appearance-settings-ZFjV_opr.js → appearance-settings-BQfR5vrq.js} +1 -1
  19. package/dist/gateway/static/root/assets/apps-page-BceB7JHZ.js +1 -0
  20. package/dist/gateway/static/root/assets/{archive-plugin-MaKWrpgC.js → archive-plugin-BxOvZ-ZX.js} +1 -1
  21. package/dist/gateway/static/root/assets/{attachment-load-IfqbP2BN.js → attachment-load-B0FzTMAJ.js} +1 -1
  22. package/dist/gateway/static/root/assets/{automations-page-CeI2NGSO.js → automations-page-BpXuPaPg.js} +1 -1
  23. package/dist/gateway/static/root/assets/automations-workspace-Cn_p8zY_.js +6 -0
  24. package/dist/gateway/static/root/assets/{binary-plugins-jvQ6FaBZ.js → binary-plugins-BP7wfpqy.js} +1 -1
  25. package/dist/gateway/static/root/assets/{block-editor-D4ZIVQbk.css → block-editor-BdOTO0Yo.css} +1 -1
  26. package/dist/gateway/static/root/assets/{block-editor-B7U3qlB3.js → block-editor-oMLvdnOQ.js} +3 -3
  27. package/dist/gateway/static/root/assets/{browser-automation-inputs-BGT0xoTv.js → browser-automation-inputs-DTxSZ00u.js} +1 -1
  28. package/dist/gateway/static/root/assets/{browser-automations-page-DvLAwoiQ.js → browser-automations-page-IbJnwEY4.js} +2 -2
  29. package/dist/gateway/static/root/assets/browser-settings-page-CCUO3G23.js +3 -0
  30. package/dist/gateway/static/root/assets/button-CS04eWY9.js +1 -0
  31. package/dist/gateway/static/root/assets/capabilities-settings-panel-BjMb5H2_.js +8 -0
  32. package/dist/gateway/static/root/assets/channels-settings-P22-_i13.js +1 -0
  33. package/dist/gateway/static/root/assets/{channels-status-swr-C_icwbWj.js → channels-status-swr-D2AmAoty.js} +1 -1
  34. package/dist/gateway/static/root/assets/{chat-terminal-dock-BtL71IOs.js → chat-terminal-dock-B-yI3Mi1.js} +2 -2
  35. package/dist/gateway/static/root/assets/{computer-settings-page-Bu6ZJtmS.js → computer-settings-page-CWx_jnng.js} +1 -1
  36. package/dist/gateway/static/root/assets/connectors-page-BLgPORmH.js +2 -0
  37. package/dist/gateway/static/root/assets/cron-expression-DMRRL4Zg.js +2 -0
  38. package/dist/gateway/static/root/assets/date-picker-BSwL0e6E.js +1 -0
  39. package/dist/gateway/static/root/assets/{dependency-picker-BNugauiZ.js → dependency-picker-BQTspLzC.js} +1 -1
  40. package/dist/gateway/static/root/assets/{desktop-pet-DTy_3-OY.js → desktop-pet-C3lFxDF6.js} +1 -1
  41. package/dist/gateway/static/root/assets/desktop-pet-settings-Y8pjpXFE.js +1 -0
  42. package/dist/gateway/static/root/assets/device-pairing-wizard-DM4_GMzo.js +1 -0
  43. package/dist/gateway/static/root/assets/{extension-debug-page-C3F7RiGW.js → extension-debug-page-CVGiGVcR.js} +1 -1
  44. package/dist/gateway/static/root/assets/{extension-page-C0jhcCT_.js → extension-page-g3JtCP_y.js} +1 -1
  45. package/dist/gateway/static/root/assets/{extension-settings-page-CNvJQkrr.js → extension-settings-page-CjpoKV1f.js} +1 -1
  46. package/dist/gateway/static/root/assets/{gateway-config-swr-D5AM8cyQ.js → gateway-config-swr-BSvXXpKM.js} +1 -1
  47. package/dist/gateway/static/root/assets/gateway-realtime-BDCpS7U1.js +1 -0
  48. package/dist/gateway/static/root/assets/gateway-realtime-store-BGmP1obI.js +1 -0
  49. package/dist/gateway/static/root/assets/gateway-settings-CYG9WCZn.js +1 -0
  50. package/dist/gateway/static/root/assets/{gateway-startup-retry-CSJWdnFs.js → gateway-startup-retry-Caf8g3sC.js} +1 -1
  51. package/dist/gateway/static/root/assets/{heartbeat-settings-Cd1VJsHe.js → heartbeat-settings-Cl834-SS.js} +1 -1
  52. package/dist/gateway/static/root/assets/home-page-CB_XVtIM.js +1 -0
  53. package/dist/gateway/static/root/assets/{image-generation-api-BNh604hw.js → image-generation-api-BwEWBUVC.js} +1 -1
  54. package/dist/gateway/static/root/assets/imports-page-CoMlgSIA.js +1 -0
  55. package/dist/gateway/static/root/assets/index-CI37dTAn.css +1 -0
  56. package/dist/gateway/static/root/assets/index-Do9MltC4.js +79 -0
  57. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-CNq5D4pe.js +1 -0
  58. package/dist/gateway/static/root/assets/local-app-workbench-page-BxQlEje6.js +2 -0
  59. package/dist/gateway/static/root/assets/{local-apps-page-DyrFxW3G.js → local-apps-page-DQnRA598.js} +1 -1
  60. package/dist/gateway/static/root/assets/{locale-store-DLK05Y1a.js → locale-store-D16nmbaN.js} +1 -1
  61. package/dist/gateway/static/root/assets/logs-page-CT5GrcMs.js +2 -0
  62. package/dist/gateway/static/root/assets/management-settings-DKcO5fQ-.js +1 -0
  63. package/dist/gateway/static/root/assets/{markdown-view-B8maDRWh.js → markdown-view-DCp4BlZP.js} +2 -2
  64. package/dist/gateway/static/root/assets/{media-plugins-5DakFba_.js → media-plugins-Cy64sn_C.js} +1 -1
  65. package/dist/gateway/static/root/assets/messages-C-9oo69N.js +3 -0
  66. package/dist/gateway/static/root/assets/note-detail-panel-5dc3LKTL.js +5 -0
  67. package/dist/gateway/static/root/assets/notes-page-AbwxgXuG.js +8 -0
  68. package/dist/gateway/static/root/assets/{page-tabs-DzJpglJJ.js → page-tabs-CgEoHSVT.js} +1 -1
  69. package/dist/gateway/static/root/assets/{popover-select-DldSX8GX.js → popover-select-9i-ZtHXL.js} +1 -1
  70. package/dist/gateway/static/root/assets/{preview-open-alternatives-Dj6LJsuQ.js → preview-open-alternatives-Ck2uKTbf.js} +1 -1
  71. package/dist/gateway/static/root/assets/{proactive-page-CwudBdrQ.js → proactive-page-Dr1mCJhZ.js} +1 -1
  72. package/dist/gateway/static/root/assets/{product-open-page-CujZXOea.js → product-open-page-DbZvJ5GE.js} +1 -1
  73. package/dist/gateway/static/root/assets/project-detail-page-DnE1zI1c.js +1 -0
  74. package/dist/gateway/static/root/assets/projects-page-BD0nLYxk.js +1 -0
  75. package/dist/gateway/static/root/assets/{registry-api-BMFL4vis.js → registry-api-DcQdwpPu.js} +1 -1
  76. package/dist/gateway/static/root/assets/remote-access-hub-TYuE6A3S.js +1 -0
  77. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DV554qyN.js → runtime-tools-settings-panel-CPwdgWKo.js} +2 -2
  78. package/dist/gateway/static/root/assets/{schema-form-Bh2Er67B.js → schema-form-8psK4cFO.js} +1 -1
  79. package/dist/gateway/static/root/assets/sessions-page-BcWDQQFX.js +1 -0
  80. package/dist/gateway/static/root/assets/settings-advanced-gate-DzGQX6Hq.js +1 -0
  81. package/dist/gateway/static/root/assets/{settings-form-section-BsdM7P1d.js → settings-form-section-D_Gsz5rl.js} +1 -1
  82. package/dist/gateway/static/root/assets/{settings-page-3yEAqoME.js → settings-page-C_Tj_mkZ.js} +1 -1
  83. package/dist/gateway/static/root/assets/setup-status-panel-CE2X89qN.js +1 -0
  84. package/dist/gateway/static/root/assets/share-preview-page-B_M_oPsT.js +2 -0
  85. package/dist/gateway/static/root/assets/shares-settings-BL4H9Iym.js +1 -0
  86. package/dist/gateway/static/root/assets/skill-reload-api-WMKIgUOp.js +1 -0
  87. package/dist/gateway/static/root/assets/skills-page-DYgwzl5B.js +2 -0
  88. package/dist/gateway/static/root/assets/{skills-page.utils-dHBD7YqU.js → skills-page.utils-Cuh6s2HM.js} +1 -1
  89. package/dist/gateway/static/root/assets/{system-settings-panel-lItR5Kah.js → system-settings-panel-aassGyNb.js} +1 -1
  90. package/dist/gateway/static/root/assets/task-detail-page-BjeRslap.js +1 -0
  91. package/dist/gateway/static/root/assets/theme-store-RUBQBsFP.js +1 -0
  92. package/dist/gateway/static/root/assets/tunnel-api-DJYcPWIV.js +1 -0
  93. package/dist/gateway/static/root/assets/{use-autosave-DO50_g_S.js → use-autosave-QGYG7oMZ.js} +1 -1
  94. package/dist/gateway/static/root/assets/user-model-page-PrRsd4go.js +2 -0
  95. package/dist/gateway/static/root/assets/{voice-api-key-field-k7tWLXzM.js → voice-api-key-field-D1s0gIRW.js} +1 -1
  96. package/dist/gateway/static/root/assets/{voice-config-api-bZqN8-UF.js → voice-config-api-D2goEn5e.js} +1 -1
  97. package/dist/gateway/static/root/assets/{work-discovery-overlay-BHI6gO_u.js → work-discovery-overlay-DkFW9aJ6.js} +1 -1
  98. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BYToUPUY.js +3 -0
  99. package/dist/gateway/static/root/assets/workflows-page-Z8iZe9YP.js +6 -0
  100. package/dist/gateway/static/root/index.html +14 -12
  101. package/dist/package.js +1 -1
  102. package/dist/packages/gateway-contract/src/device-pairing.js +100 -7
  103. package/dist/packages/gateway-contract/src/gateway-scopes.js +53 -0
  104. package/dist/packages/gateway-contract/src/index.js +2 -0
  105. package/dist/packages/realtime-client/src/index.js +14 -2
  106. package/dist/packages/realtime-protocol/src/index.js +18 -14
  107. package/dist/src/agent/agent-instance-gateway.d.ts +2 -0
  108. package/dist/src/agent/agent-manager.d.ts +2 -0
  109. package/dist/src/agent/agent-manager.js +40 -12
  110. package/dist/src/agent/agent-scope.d.ts +4 -1
  111. package/dist/src/agent/agent-scope.js +19 -3
  112. package/dist/src/agent/commands/command-isolation.js +11 -9
  113. package/dist/src/agent/commands/command-registry.js +18 -33
  114. package/dist/src/agent/context/audit.js +12 -2
  115. package/dist/src/agent/context/coordinator.d.ts +13 -3
  116. package/dist/src/agent/context/coordinator.js +27 -11
  117. package/dist/src/agent/context/execution-context.js +42 -22
  118. package/dist/src/agent/context/execution-context.types.d.ts +4 -2
  119. package/dist/src/agent/context/execution-scope.d.ts +2 -2
  120. package/dist/src/agent/context/execution-scope.js +1 -1
  121. package/dist/src/agent/context/project-context.d.ts +2 -2
  122. package/dist/src/agent/context/project-context.js +3 -3
  123. package/dist/src/agent/embedded/run-for-session.d.ts +1 -0
  124. package/dist/src/agent/embedded/run-for-session.js +7 -1
  125. package/dist/src/agent/inbound/attachment-pipeline.d.ts +2 -0
  126. package/dist/src/agent/inbound/attachment-pipeline.js +3 -3
  127. package/dist/src/agent/inbound/inbound-loop.js +1 -0
  128. package/dist/src/agent/inbound/turn-dispatcher.js +3 -3
  129. package/dist/src/agent/mcp/mcp-stdio-transport.js +5 -2
  130. package/dist/src/agent/memory/compaction-promotion.js +7 -2
  131. package/dist/src/agent/memory/create-memory-manager.js +1 -0
  132. package/dist/src/agent/memory/manager.d.ts +6 -0
  133. package/dist/src/agent/memory/manager.js +74 -39
  134. package/dist/src/agent/memory/runtime.d.ts +3 -3
  135. package/dist/src/agent/memory/runtime.js +11 -4
  136. package/dist/src/agent/orchestration/agent-orchestrator.js +4 -1
  137. package/dist/src/agent/prompt/cache-boundary.d.ts +2 -0
  138. package/dist/src/agent/prompt/cache-boundary.js +10 -1
  139. package/dist/src/agent/service/build-direct-message-content.d.ts +1 -0
  140. package/dist/src/agent/service/build-direct-message-content.js +2 -1
  141. package/dist/src/agent/service/direct-turn-helpers.js +3 -2
  142. package/dist/src/agent/service/process-direct-streaming.d.ts +3 -1
  143. package/dist/src/agent/service/process-direct-streaming.js +3 -2
  144. package/dist/src/agent/service/webchat-tts.d.ts +0 -4
  145. package/dist/src/agent/service/webchat-tts.js +20 -19
  146. package/dist/src/agent/tools/factory.js +3 -3
  147. package/dist/src/agent/tools/knowledge-memory-tool.d.ts +2 -2
  148. package/dist/src/agent/tools/knowledge-memory-tool.js +7 -7
  149. package/dist/src/browser/native-messaging-host.js +2 -2
  150. package/dist/src/channels/attachments/voice-stt-webchat.d.ts +3 -0
  151. package/dist/src/channels/attachments/voice-stt-webchat.js +22 -9
  152. package/dist/src/cli/commands/agent.js +2 -0
  153. package/dist/src/cli/commands/config.js +8 -9
  154. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  155. package/dist/src/cli/commands/extension-marketplace.js +69 -44
  156. package/dist/src/cli/commands/extension-pack.js +0 -2
  157. package/dist/src/cli/commands/extension.js +4 -25
  158. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  159. package/dist/src/cli/commands/onboard/gateway.js +2 -1
  160. package/dist/src/cli/commands/update.js +1 -1
  161. package/dist/src/cli/utils/init-workspace-core.js +5 -2
  162. package/dist/src/config/index.js +2 -2
  163. package/dist/src/config/loader.d.ts +1 -0
  164. package/dist/src/config/loader.js +14 -1
  165. package/dist/src/config/schema.d.ts +10 -3
  166. package/dist/src/config/schema.js +10 -2
  167. package/dist/src/execution-environments/local-worktree-manager.js +17 -15
  168. package/dist/src/execution-environments/store.js +4 -2
  169. package/dist/src/execution-environments/types.d.ts +3 -0
  170. package/dist/src/execution-environments/types.js +2 -1
  171. package/dist/src/execution-environments/worktree-safety.d.ts +8 -0
  172. package/dist/src/execution-environments/worktree-safety.js +43 -0
  173. package/dist/src/extensions/activation-planner.d.ts +1 -1
  174. package/dist/src/extensions/activation-planner.js +1 -1
  175. package/dist/src/extensions/api-version.d.ts +4 -0
  176. package/dist/src/extensions/api-version.js +15 -0
  177. package/dist/src/extensions/api.d.ts +3 -9
  178. package/dist/src/extensions/api.js +26 -32
  179. package/dist/src/extensions/config-validation.d.ts +8 -0
  180. package/dist/src/extensions/config-validation.js +25 -0
  181. package/dist/src/extensions/extension-registry-impl.d.ts +20 -9
  182. package/dist/src/extensions/extension-registry-impl.js +79 -11
  183. package/dist/src/extensions/hooks.d.ts +1 -1
  184. package/dist/src/extensions/index.d.ts +2 -1
  185. package/dist/src/extensions/install-transaction.d.ts +2 -0
  186. package/dist/src/extensions/install-transaction.js +32 -21
  187. package/dist/src/extensions/install.js +18 -1
  188. package/dist/src/extensions/loader.d.ts +5 -5
  189. package/dist/src/extensions/loader.js +109 -47
  190. package/dist/src/extensions/lockfile.d.ts +3 -5
  191. package/dist/src/extensions/lockfile.js +41 -14
  192. package/dist/src/extensions/normalize-manifest.js +6 -60
  193. package/dist/src/extensions/sdk/index.d.ts +3 -2
  194. package/dist/src/extensions/sdk/index.js +2 -2
  195. package/dist/src/extensions/sdk/testing.js +0 -4
  196. package/dist/src/extensions/security.js +5 -7
  197. package/dist/src/extensions/types/core.d.ts +0 -5
  198. package/dist/src/extensions/types/index.d.ts +1 -1
  199. package/dist/src/extensions/types/manifest.d.ts +1 -25
  200. package/dist/src/extensions/types/providers.d.ts +1 -1
  201. package/dist/src/extensions/types/registration.d.ts +0 -12
  202. package/dist/src/extensions/update.js +71 -30
  203. package/dist/src/gateway/heartbeat/service.js +2 -2
  204. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
  205. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +47 -10
  206. package/dist/src/gateway/hono/routes/devices.js +10 -7
  207. package/dist/src/gateway/hono/routes/endpoint-compatibility.js +6 -0
  208. package/dist/src/gateway/hono/routes/extension-gateway.js +0 -33
  209. package/dist/src/gateway/hono/routes/imports.js +1 -1
  210. package/dist/src/gateway/hono/routes/lazy-bundles.js +0 -1
  211. package/dist/src/gateway/hono/routes/local-apps.js +1 -1
  212. package/dist/src/gateway/hono/routes/realtime.js +30 -8
  213. package/dist/src/gateway/hono/routes/update.js +2 -2
  214. package/dist/src/gateway/hono/routes/user-model.js +25 -6
  215. package/dist/src/gateway/index.js +5 -2
  216. package/dist/src/gateway/lock.d.ts +2 -0
  217. package/dist/src/gateway/lock.js +31 -14
  218. package/dist/src/gateway/run-loop.js +3 -2
  219. package/dist/src/gateway/security/gateway-scopes.d.ts +2 -5
  220. package/dist/src/gateway/security/gateway-scopes.js +3 -45
  221. package/dist/src/gateway/security/index.js +2 -1
  222. package/dist/src/gateway/service/config-coordinator.js +1 -1
  223. package/dist/src/gateway/service.js +11 -7
  224. package/dist/src/heartbeat/index.js +1 -1
  225. package/dist/src/imports/importService.d.ts +1 -1
  226. package/dist/src/imports/inventory.js +16 -2
  227. package/dist/src/imports/productImport.js +5 -5
  228. package/dist/src/imports/types.d.ts +3 -3
  229. package/dist/src/infra/exec.d.ts +2 -2
  230. package/dist/src/infra/exec.js +32 -27
  231. package/dist/src/infra/gateway-processes.js +1 -1
  232. package/dist/src/infra/run-command.js +15 -50
  233. package/dist/src/infra/update-restart.js +1 -1
  234. package/dist/src/infra/update-runner.js +2 -2
  235. package/dist/src/infra/update-startup.js +1 -1
  236. package/dist/src/knowledge/connected-knowledge-pipeline.js +13 -3
  237. package/dist/src/knowledge-memory/domain.d.ts +17 -1
  238. package/dist/src/knowledge-memory/index.js +2 -2
  239. package/dist/src/knowledge-memory/repository.d.ts +26 -4
  240. package/dist/src/knowledge-memory/repository.js +171 -36
  241. package/dist/src/mcp/channel-bridge.js +7 -3
  242. package/dist/src/media-understanding/registry.js +6 -1
  243. package/dist/src/migrations/knowledge-memory-read-policy-config.d.ts +2 -0
  244. package/dist/src/migrations/knowledge-memory-read-policy-config.js +48 -0
  245. package/dist/src/migrations/runner.js +2 -1
  246. package/dist/src/process/bounded-output.d.ts +10 -0
  247. package/dist/src/process/bounded-output.js +41 -0
  248. package/dist/src/process/kill-tree.d.ts +6 -17
  249. package/dist/src/process/kill-tree.js +43 -75
  250. package/dist/src/process/process-spec.d.ts +39 -0
  251. package/dist/src/process/process-spec.js +13 -0
  252. package/dist/src/process/run-process.d.ts +4 -0
  253. package/dist/src/process/run-process.js +97 -0
  254. package/dist/src/providers/plugin-registry.d.ts +1 -1
  255. package/dist/src/providers/plugin-registry.js +6 -0
  256. package/dist/src/realtime/runtime.js +3 -1
  257. package/dist/src/session/store.js +1 -1
  258. package/dist/src/storage/sqlite/device-pairing-approval.js +1 -1
  259. package/dist/src/storage/sqlite/index.d.ts +1 -1
  260. package/dist/src/storage/sqlite/index.js +2 -2
  261. package/dist/src/storage/sqlite/migrations/180_execution_environment_ownership.sql +7 -0
  262. package/dist/src/storage/sqlite/migrations/181_knowledge_item_status_events.sql +12 -0
  263. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  264. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  265. package/dist/src/storage/sqlite/schema.js +1 -1
  266. package/dist/src/storage/sqlite/schema.sql +13 -0
  267. package/dist/src/storage/sqlite/transcript-repository.d.ts +4 -0
  268. package/dist/src/storage/sqlite/transcript-repository.js +36 -1
  269. package/dist/src/tui/backends/embedded-backend.d.ts +24 -8
  270. package/dist/src/tui/backends/embedded-backend.js +114 -10
  271. package/dist/src/tui/backends/gateway-realtime-backend.d.ts +18 -0
  272. package/dist/src/tui/backends/gateway-realtime-backend.js +32 -5
  273. package/dist/src/tui/components/assistant-message.d.ts +4 -1
  274. package/dist/src/tui/components/assistant-message.js +10 -2
  275. package/dist/src/tui/components/cell-render-mode.d.ts +4 -0
  276. package/dist/src/tui/components/cell-render-mode.js +1 -0
  277. package/dist/src/tui/components/chat-log.d.ts +17 -4
  278. package/dist/src/tui/components/chat-log.js +68 -50
  279. package/dist/src/tui/components/custom-editor.d.ts +2 -2
  280. package/dist/src/tui/components/custom-editor.js +5 -1
  281. package/dist/src/tui/components/pending-input-preview.d.ts +9 -0
  282. package/dist/src/tui/components/pending-input-preview.js +33 -0
  283. package/dist/src/tui/components/semantic-cell.d.ts +17 -0
  284. package/dist/src/tui/components/semantic-cell.js +29 -0
  285. package/dist/src/tui/components/tool-execution.d.ts +5 -1
  286. package/dist/src/tui/components/tool-execution.js +33 -10
  287. package/dist/src/tui/components/transcript-overlay.d.ts +29 -0
  288. package/dist/src/tui/components/transcript-overlay.js +114 -0
  289. package/dist/src/tui/components/tui-bottom-bar.js +3 -1
  290. package/dist/src/tui/components/user-message.d.ts +5 -1
  291. package/dist/src/tui/components/user-message.js +12 -1
  292. package/dist/src/tui/extension-host/load-extensions.d.ts +1 -1
  293. package/dist/src/tui/extension-host/runtime-context.js +2 -1
  294. package/dist/src/tui/extension-host/runtime.d.ts +1 -1
  295. package/dist/src/tui/format-tui-hotkeys.js +8 -1
  296. package/dist/src/tui/tui-agent-events.js +31 -0
  297. package/dist/src/tui/tui-backend.d.ts +23 -11
  298. package/dist/src/tui/tui-backend.js +1 -9
  299. package/dist/src/tui/tui-chat-input-state.d.ts +25 -0
  300. package/dist/src/tui/tui-chat-input-state.js +36 -0
  301. package/dist/src/tui/tui-command-formatters.js +2 -1
  302. package/dist/src/tui/tui-commands.js +1 -1
  303. package/dist/src/tui/tui-types.d.ts +2 -1
  304. package/dist/src/tui/tui-types.js +2 -1
  305. package/dist/src/tui/tui.js +122 -30
  306. package/dist/src/tui/xopc-tui-keybindings.d.ts +23 -3
  307. package/dist/src/tui/xopc-tui-keybindings.js +22 -2
  308. package/dist/src/user-context/access-policy.d.ts +2 -2
  309. package/dist/src/user-context/access-policy.js +10 -2
  310. package/dist/src/user-context/config.d.ts +23 -6
  311. package/dist/src/user-context/config.js +54 -7
  312. package/dist/src/voice/platform-streams.js +11 -1
  313. package/dist/src/voice/realtime/omniEngine.js +13 -1
  314. package/dist/src/voice/realtime/runtime.js +2 -1
  315. package/dist/src/voice/tts/audio.js +1 -1
  316. package/dist/src/voice/tts/speech-registry.js +6 -1
  317. package/package.json +9 -7
  318. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-D0ITeUFb.js +0 -1
  319. package/dist/gateway/static/root/assets/agents-DcfWhk2S.js +0 -1
  320. package/dist/gateway/static/root/assets/api-fPapljyb.js +0 -1
  321. package/dist/gateway/static/root/assets/app-management-settings-panel-U3yDRzKF.js +0 -1
  322. package/dist/gateway/static/root/assets/apps-page-FgMHY1Pr.js +0 -1
  323. package/dist/gateway/static/root/assets/automations-workspace-DxaiBwrD.js +0 -6
  324. package/dist/gateway/static/root/assets/browser-settings-page-CHrfg3BX.js +0 -3
  325. package/dist/gateway/static/root/assets/button-CGlRPNzi.js +0 -1
  326. package/dist/gateway/static/root/assets/capabilities-settings-panel-DpYDPk_o.js +0 -8
  327. package/dist/gateway/static/root/assets/channels-settings-DMq-NBUQ.js +0 -1
  328. package/dist/gateway/static/root/assets/connectors-page-LsEiI9L5.js +0 -2
  329. package/dist/gateway/static/root/assets/cron-expression-B25FHn4w.js +0 -2
  330. package/dist/gateway/static/root/assets/date-picker-CzVHO7z9.js +0 -1
  331. package/dist/gateway/static/root/assets/desktop-pet-settings-CXfnejTb.js +0 -1
  332. package/dist/gateway/static/root/assets/device-pairing-wizard-CxKwfncn.js +0 -1
  333. package/dist/gateway/static/root/assets/gateway-settings-CQTcIvlZ.js +0 -1
  334. package/dist/gateway/static/root/assets/home-page-B_uyfCGq.js +0 -1
  335. package/dist/gateway/static/root/assets/imports-page-DXNfRmk9.js +0 -1
  336. package/dist/gateway/static/root/assets/index-BAqVpc1H.css +0 -1
  337. package/dist/gateway/static/root/assets/index-hlU8MUEz.js +0 -79
  338. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-CgW5_XVP.js +0 -1
  339. package/dist/gateway/static/root/assets/local-app-workbench-page-C4h3qDRL.js +0 -2
  340. package/dist/gateway/static/root/assets/logs-page-Goy_QHfL.js +0 -2
  341. package/dist/gateway/static/root/assets/management-settings-DgQyGEpR.js +0 -1
  342. package/dist/gateway/static/root/assets/messages-C9h8SImu.js +0 -3
  343. package/dist/gateway/static/root/assets/note-detail-panel-lcZby9NY.js +0 -5
  344. package/dist/gateway/static/root/assets/notes-page-CDGPPI-W.js +0 -8
  345. package/dist/gateway/static/root/assets/project-detail-page-CyAf_sK-.js +0 -1
  346. package/dist/gateway/static/root/assets/projects-page-BW5m_HhZ.js +0 -1
  347. package/dist/gateway/static/root/assets/remote-access-hub-B4JgwB0s.js +0 -1
  348. package/dist/gateway/static/root/assets/sessions-page-D5SmvlQ1.js +0 -1
  349. package/dist/gateway/static/root/assets/settings-advanced-gate-DDALROy_.js +0 -1
  350. package/dist/gateway/static/root/assets/setup-status-panel-BOHNZ-S3.js +0 -1
  351. package/dist/gateway/static/root/assets/share-preview-page-wV056nz2.js +0 -2
  352. package/dist/gateway/static/root/assets/shares-settings-io4NzfJL.js +0 -1
  353. package/dist/gateway/static/root/assets/skill-reload-api-CERFaxLj.js +0 -1
  354. package/dist/gateway/static/root/assets/skills-page-CtwUqvsE.js +0 -2
  355. package/dist/gateway/static/root/assets/task-detail-page-CCKc67a-.js +0 -1
  356. package/dist/gateway/static/root/assets/theme-store-KfFEGMlp.js +0 -1
  357. package/dist/gateway/static/root/assets/tunnel-api-DPyLgmWw.js +0 -1
  358. package/dist/gateway/static/root/assets/user-model-page-CcnGgH1n.js +0 -2
  359. package/dist/gateway/static/root/assets/workflow-run-setup-panel-jEMtNIG8.js +0 -3
  360. package/dist/gateway/static/root/assets/workflows-page-CX4bcAD-.js +0 -6
  361. package/dist/src/extensions/when-context.d.ts +0 -6
  362. package/dist/src/extensions/when-context.js +0 -26
  363. package/dist/src/extensions/when-expression.d.ts +0 -11
  364. package/dist/src/extensions/when-expression.js +0 -213
@@ -11,7 +11,10 @@ var MemoryManager = class {
11
11
  loadProviders;
12
12
  writePolicy;
13
13
  pluginProvidersLoaded = false;
14
+ pluginProvidersPromise;
15
+ sessionInitializations = /* @__PURE__ */ new Map();
14
16
  memoryRuntime;
17
+ searchTimeoutMs;
15
18
  sessionContexts = /* @__PURE__ */ new Map();
16
19
  constructor(options = {}) {
17
20
  this.routing = {
@@ -21,6 +24,7 @@ var MemoryManager = class {
21
24
  };
22
25
  this.loadProviders = options.loadProviders;
23
26
  this.memoryRuntime = options.memoryRuntime;
27
+ this.searchTimeoutMs = options.searchTimeoutMs ?? 2e3;
24
28
  this.writePolicy = {
25
29
  allowExternalWrites: options.writePolicy?.allowExternalWrites ?? false,
26
30
  allowedProviderIds: options.writePolicy?.allowedProviderIds,
@@ -142,21 +146,29 @@ var MemoryManager = class {
142
146
  return provider.handleToolCall(toolName, args);
143
147
  }
144
148
  async search(request) {
145
- const providers = this.providersForSearch();
146
- const results = [];
147
- for (const p of providers) {
148
- if (!p.capabilities.search || !p.search) continue;
149
+ return this.searchProviders(this.providersForSearch(), request);
150
+ }
151
+ async searchExternal(request) {
152
+ return this.searchProviders(this.providersForSearch().filter((provider) => !provider.capabilities.local), request);
153
+ }
154
+ async searchProviders(providers, request) {
155
+ const searchProvider = async (p) => {
156
+ if (!p.capabilities.search || !p.search) return [];
149
157
  const started = Date.now();
150
158
  try {
151
- const providerResults = await p.search(request);
159
+ let timeout;
160
+ const providerResults = await Promise.race([p.search(request), new Promise((_resolve, reject) => {
161
+ timeout = setTimeout(() => reject(/* @__PURE__ */ new Error(`Memory search timed out after ${this.searchTimeoutMs}ms`)), this.searchTimeoutMs);
162
+ })]).finally(() => {
163
+ if (timeout) clearTimeout(timeout);
164
+ });
152
165
  this.trace("search", p.id, request, {
153
166
  resultCount: providerResults.length,
154
167
  selectedRecordIds: providerResults.map((result) => result.record.id),
155
168
  durationMs: Date.now() - started,
156
169
  conversationId: request.scope?.conversationId
157
170
  });
158
- results.push(...providerResults);
159
- if (providerResults.length > 0 && this.routing.searchStrategy !== "fanout") break;
171
+ return providerResults;
160
172
  } catch (err) {
161
173
  this.trace("search", p.id, request, {
162
174
  error: err instanceof Error ? err.message : String(err),
@@ -167,7 +179,16 @@ var MemoryManager = class {
167
179
  err,
168
180
  id: p.id
169
181
  }, "memory search failed");
182
+ return [];
170
183
  }
184
+ };
185
+ const searchable = providers.filter((provider) => provider.capabilities.search && provider.search);
186
+ const results = [];
187
+ if (this.routing.searchStrategy === "fanout") results.push(...(await Promise.all(searchable.map(searchProvider))).flat());
188
+ else for (const provider of searchable) {
189
+ const providerResults = await searchProvider(provider);
190
+ results.push(...providerResults);
191
+ if (providerResults.length > 0) break;
171
192
  }
172
193
  const seen = /* @__PURE__ */ new Set();
173
194
  return results.sort((a, b) => b.score - a.score).filter((result) => this.canReadRecord(result.record, request.scope)).filter((result) => !request.trustedOnly || (result.record.provenance?.originClass === "owner" || result.record.provenance?.originClass === "agent") && result.record.provenance?.derivedFromRecalledContext === false).filter((result) => {
@@ -245,12 +266,14 @@ var MemoryManager = class {
245
266
  return this.writeWithStrategy("delete", request);
246
267
  }
247
268
  canReadRecord(record, scope) {
248
- if (record.providerId !== "local") return true;
249
- if (this.memoryRuntime && !this.memoryRuntime.canRead(memorySourceForRecord(record))) return false;
269
+ if (this.memoryRuntime) {
270
+ const { scope, source } = memoryAccessForRecord(record);
271
+ if (!this.memoryRuntime.canRead(scope, source)) return false;
272
+ }
250
273
  if (record.scope.userId && scope?.userId && record.scope.userId !== scope.userId) return false;
251
- if (record.scope.conversationId && record.scope.conversationId !== scope?.conversationId) return false;
252
- if (record.scope.projectId && record.scope.projectId !== scope?.projectId) return false;
253
- if (record.scope.workspaceId && record.scope.workspaceId !== scope?.workspaceId) return false;
274
+ if (record.scope.conversationId && scope?.conversationId && record.scope.conversationId !== scope.conversationId) return false;
275
+ if (record.scope.projectId && scope?.projectId && record.scope.projectId !== scope.projectId) return false;
276
+ if (record.scope.workspaceId && scope?.workspaceId && record.scope.workspaceId !== scope.workspaceId) return false;
254
277
  return true;
255
278
  }
256
279
  recordSignal(signal) {
@@ -286,36 +309,48 @@ var MemoryManager = class {
286
309
  }
287
310
  async initializeAll(sessionId, options) {
288
311
  if (options) this.sessionContexts.set(sessionId, { ...options });
289
- await this.loadPluginProvidersOnce();
290
- for (const p of this.providers) try {
291
- await p.initialize(sessionId, options);
292
- } catch (err) {
293
- log.warn({
294
- err,
295
- id: p.id
296
- }, "initialize failed");
297
- }
312
+ const existing = this.sessionInitializations.get(sessionId);
313
+ if (existing) return existing;
314
+ const initialization = (async () => {
315
+ await this.loadPluginProvidersOnce();
316
+ for (const p of this.providers) try {
317
+ await p.initialize(sessionId, options);
318
+ } catch (err) {
319
+ log.warn({
320
+ err,
321
+ id: p.id,
322
+ sessionId
323
+ }, "Memory provider initialization failed");
324
+ }
325
+ })();
326
+ this.sessionInitializations.set(sessionId, initialization);
327
+ return initialization;
298
328
  }
299
329
  async loadPluginProvidersOnce() {
300
330
  if (this.pluginProvidersLoaded || !this.loadProviders) return;
301
- this.pluginProvidersLoaded = true;
302
- try {
303
- const providers = await this.loadProviders();
304
- const existingIds = new Set(this.providers.map((p) => p.id));
305
- for (const provider of providers) {
306
- if (existingIds.has(provider.id)) {
307
- log.warn({ id: provider.id }, "Skipped duplicate memory provider");
308
- continue;
331
+ if (!this.pluginProvidersPromise) this.pluginProvidersPromise = (async () => {
332
+ try {
333
+ const providers = await this.loadProviders();
334
+ const existingIds = new Set(this.providers.map((p) => p.id));
335
+ for (const provider of providers) {
336
+ if (existingIds.has(provider.id)) {
337
+ log.warn({ id: provider.id }, "Skipped duplicate memory provider");
338
+ continue;
339
+ }
340
+ this.addProvider(provider);
341
+ existingIds.add(provider.id);
309
342
  }
310
- this.addProvider(provider);
311
- existingIds.add(provider.id);
343
+ } catch (err) {
344
+ log.warn({ err }, "Memory provider plugin loading failed");
345
+ } finally {
346
+ this.pluginProvidersLoaded = true;
312
347
  }
313
- } catch (err) {
314
- log.warn({ err }, "Memory provider plugin loading failed");
315
- }
348
+ })();
349
+ await this.pluginProvidersPromise;
316
350
  }
317
351
  async shutdownAll() {
318
352
  this.sessionContexts.clear();
353
+ this.sessionInitializations.clear();
319
354
  for (const p of [...this.providers].reverse()) try {
320
355
  await p.shutdown();
321
356
  } catch (err) {
@@ -425,11 +460,11 @@ var MemoryManager = class {
425
460
  }, "External memory provider operation");
426
461
  }
427
462
  };
428
- function memorySourceForRecord(record) {
429
- if (record.source.provider !== "builtin") return "connector";
430
- if (record.scope.conversationId) return "session";
431
- if (record.scope.projectId) return "project";
432
- return "workspace";
463
+ function memoryAccessForRecord(record) {
464
+ return {
465
+ scope: record.scope.conversationId ? "session" : record.scope.projectId ? "project" : record.scope.workspaceId ? "workspace" : "global",
466
+ source: record.source.provider === "builtin" ? "memory" : "connector"
467
+ };
433
468
  }
434
469
  function writeTargetForRecord(_request) {
435
470
  return "knowledge";
@@ -1,5 +1,5 @@
1
1
  import type { UserContextConfig } from '../../user-context/config.js';
2
- export type MemorySource = 'session' | 'workspace' | 'project' | 'connector';
2
+ import type { KnowledgeContentSource, KnowledgeReadPolicy, KnowledgeVisibilityScope } from '../../knowledge-memory/domain.js';
3
3
  export type MemoryWriteTarget = 'knowledge';
4
4
  export type MemoryWriteDecision = 'allow' | 'confirm' | 'deny';
5
5
  export interface MemoryCandidate {
@@ -14,8 +14,8 @@ export interface MemoryWriteCheckResult {
14
14
  reason: string;
15
15
  }
16
16
  export interface MemoryRuntime {
17
- readableSources: MemorySource[];
18
- canRead: (source: MemorySource) => boolean;
17
+ readPolicy: KnowledgeReadPolicy;
18
+ canRead: (scope: KnowledgeVisibilityScope, source: KnowledgeContentSource) => boolean;
19
19
  checkWrite: (candidate: MemoryCandidate) => MemoryWriteCheckResult;
20
20
  }
21
21
  export declare function buildMemoryRuntime(userContext: UserContextConfig): MemoryRuntime;
@@ -5,11 +5,18 @@ function normalizeConfidence(value) {
5
5
  }
6
6
  function buildMemoryRuntime(userContext) {
7
7
  const memory = userContext.knowledgeMemory;
8
- const readableSources = !userContext.enabled || !memory.enabled ? [] : [...memory.sources];
9
- const sourceSet = new Set(readableSources);
8
+ const readPolicy = !userContext.enabled || !memory.enabled ? {
9
+ scopes: [],
10
+ contentSources: []
11
+ } : {
12
+ scopes: memory.readScopes,
13
+ contentSources: memory.contentSources
14
+ };
15
+ const scopes = new Set(readPolicy.scopes);
16
+ const contentSources = new Set(readPolicy.contentSources);
10
17
  return {
11
- readableSources,
12
- canRead: (source) => sourceSet.has(source),
18
+ readPolicy,
19
+ canRead: (scope, source) => scopes.has(scope) && contentSources.has(source),
13
20
  checkWrite: (candidate) => {
14
21
  if (!userContext.enabled || !memory.enabled) return {
15
22
  decision: "deny",
@@ -71,6 +71,7 @@ var AgentOrchestrator = class {
71
71
  await this.sessionHydrator.model(conversationId);
72
72
  const channelSystemPrompt = typeof context.metadata?.channelSystemPrompt === "string" ? context.metadata.channelSystemPrompt.trim() : "";
73
73
  if (channelSystemPrompt) {
74
+ await this.agentManager.ensureMemoryReadyForSession?.(conversationId);
74
75
  this.agentManager.getOrCreateAgent(conversationId);
75
76
  this.agentManager.applyTurnChannelSystemPrompt(conversationId, channelSystemPrompt);
76
77
  }
@@ -90,7 +91,8 @@ var AgentOrchestrator = class {
90
91
  setPendingTranscriptUserMessage(conversationId, userMessage);
91
92
  const userPlainForMemory = extractAgentUserPlainText(userMessage);
92
93
  const turnId = randomUUID();
93
- const userMessageForModel = (await this.agentManager.prepareUserTurnContext(userMessage, conversationId, turnId)).modelMessage;
94
+ const userContext = await this.agentManager.prepareUserTurnContext(userMessage, conversationId, turnId);
95
+ const userMessageForModel = userMessage;
94
96
  const llmTurn = await hydrateUserTurnForLlm({
95
97
  message: userMessage,
96
98
  modelRef
@@ -101,6 +103,7 @@ var AgentOrchestrator = class {
101
103
  conversationId,
102
104
  runId: turnId,
103
105
  userMessage: userMessageForModel,
106
+ dynamicSystemContext: userContext.dynamicSystemContext,
104
107
  llmImages: llmTurn.images,
105
108
  sessionStore: this.sessionStore,
106
109
  agentManager: this.agentManager,
@@ -24,3 +24,5 @@ export declare function splitPromptCacheBoundary(text: string): {
24
24
  export declare function normalizePromptSection(text: string): string;
25
25
  /** Add stable content immediately before the cache boundary. */
26
26
  export declare function appendStablePromptSection(systemPrompt: string, section: string): string;
27
+ /** Add per-turn context after the cache boundary so the stable prefix remains reusable. */
28
+ export declare function appendDynamicPromptSection(systemPrompt: string, section: string): string;
@@ -40,5 +40,14 @@ function appendStablePromptSection(systemPrompt, section) {
40
40
  const stablePrefix = [split.stablePrefix, normalizedSection].filter(Boolean).join("\n\n");
41
41
  return split.dynamicSuffix ? `${stablePrefix}${PROMPT_CACHE_BOUNDARY}${split.dynamicSuffix}` : `${stablePrefix}${PROMPT_CACHE_BOUNDARY}`;
42
42
  }
43
+ /** Add per-turn context after the cache boundary so the stable prefix remains reusable. */
44
+ function appendDynamicPromptSection(systemPrompt, section) {
45
+ const normalizedSection = normalizePromptSection(section);
46
+ if (!normalizedSection) return systemPrompt;
47
+ const split = splitPromptCacheBoundary(systemPrompt);
48
+ if (!split) return `${normalizePromptSection(systemPrompt)}${PROMPT_CACHE_BOUNDARY}${normalizedSection}`;
49
+ const dynamicSuffix = [split.dynamicSuffix, normalizedSection].filter(Boolean).join("\n\n");
50
+ return `${split.stablePrefix}${PROMPT_CACHE_BOUNDARY}${dynamicSuffix}`;
51
+ }
43
52
  //#endregion
44
- export { PROMPT_CACHE_BOUNDARY, appendStablePromptSection, normalizePromptSection, splitPromptCacheBoundary, stripPromptCacheBoundary };
53
+ export { PROMPT_CACHE_BOUNDARY, appendDynamicPromptSection, appendStablePromptSection, normalizePromptSection, splitPromptCacheBoundary, stripPromptCacheBoundary };
@@ -11,4 +11,5 @@ export declare function buildDirectUserMessageContent(opts: {
11
11
  config: Config;
12
12
  agentManager: AgentInstanceGateway;
13
13
  modelManager: ModelManager;
14
+ suppressMediaPromptUris?: ReadonlySet<string>;
14
15
  }): Promise<import("../inbound/attachment-pipeline.js").TranscriptUserMessage>;
@@ -13,7 +13,8 @@ async function buildDirectUserMessageContent(opts) {
13
13
  conversationId: sk,
14
14
  modelRef: modelRef || getDefaultModelSync(opts.config),
15
15
  config: opts.config,
16
- agentManager: opts.agentManager
16
+ agentManager: opts.agentManager,
17
+ suppressMediaPromptUris: opts.suppressMediaPromptUris
17
18
  });
18
19
  }
19
20
  //#endregion
@@ -3,7 +3,6 @@ import { getConnectionResumeInput, init_connection_wait_repository } from "../..
3
3
  import { resolveImageHandlingStrategy } from "../image/vision-detection.js";
4
4
  import { hydrateUserTurnForLlm } from "../inbound/attachment-pipeline.js";
5
5
  import { buildTaskExecutionDirective } from "../../tasks/task-context-assembler.js";
6
- import { prependAgentContext } from "../context/prepend.js";
7
6
  import { extractAgentUserPlainText } from "../memory/user-message-text.js";
8
7
  import { shouldSkipResetOverlapCommand } from "../../session/reset-triggers.js";
9
8
  import { parseSlashCommand } from "../../chat-commands/command-parse.js";
@@ -11,6 +10,7 @@ import { commandRegistry } from "../../chat-commands/registry.js";
11
10
  import "../../chat-commands/index.js";
12
11
  import { runEmbeddedTurnForSession } from "../embedded/run-for-session.js";
13
12
  import { injectSourceContextsIntoUserMessage } from "../source-context/injector.js";
13
+ import { prependAgentContext } from "../context/prepend.js";
14
14
  import crypto from "node:crypto";
15
15
  //#region src/agent/service/direct-turn-helpers.ts
16
16
  /**
@@ -101,7 +101,7 @@ async function runDirectAgentTurn(deps, input) {
101
101
  const userPlain = extractAgentUserPlainText(input.userMessage);
102
102
  const userContext = await deps.agentManager.prepareUserTurnContext(input.userMessage, input.conversationId, turnId);
103
103
  const sourceContexts = input.sourceContexts ?? [];
104
- const userMessageForModel = prependAgentContext(injectSourceContextsIntoUserMessage(userContext.modelMessage, sourceContexts), buildTaskExecutionDirective(input.conversationId));
104
+ const userMessageForModel = prependAgentContext(injectSourceContextsIntoUserMessage(input.userMessage, sourceContexts), buildTaskExecutionDirective(input.conversationId));
105
105
  const modelRef = deps.modelManager.getModelForSession(input.conversationId);
106
106
  const llmTurn = await hydrateUserTurnForLlm({
107
107
  message: input.userMessage,
@@ -114,6 +114,7 @@ async function runDirectAgentTurn(deps, input) {
114
114
  conversationId: input.conversationId,
115
115
  runId: turnId,
116
116
  userMessage: userMessageForModel,
117
+ dynamicSystemContext: userContext.dynamicSystemContext,
117
118
  llmImages,
118
119
  presentation: input.presentation,
119
120
  sessionStore: deps.sessionStore,
@@ -36,7 +36,9 @@ export interface ProcessDirectStreamingDeps {
36
36
  sessionConfigStore: SessionConfigStore;
37
37
  commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;
38
38
  prepareInboundAttachments: (conversationId: string, attachments?: DirectStreamInboundAttachment[]) => Promise<MediaRef[] | undefined>;
39
- buildTranscriptUserMessage: (content: string, prepared: MediaRef[] | undefined, conversationId: string) => Promise<TranscriptUserMessage>;
39
+ buildTranscriptUserMessage: (content: string, prepared: MediaRef[] | undefined, conversationId: string, options?: {
40
+ suppressMediaPromptUris?: ReadonlySet<string>;
41
+ }) => Promise<TranscriptUserMessage>;
40
42
  recordTaskReviewStreamHint?: (conversationId: string, task: {
41
43
  skipTaskReview: boolean;
42
44
  }) => void;
@@ -11,7 +11,7 @@ import { initSessionTurn } from "../../session/init-session-turn.js";
11
11
  import "../../session/index.js";
12
12
  import { mergeSttConfigFromAppConfig } from "../../voice/stt/config.js";
13
13
  import "../../voice/stt/index.js";
14
- import { isVoiceLikeAttachment, mergeVoiceTranscriptsIntoUserText } from "../../channels/attachments/voice-stt-webchat.js";
14
+ import { isVoiceLikeAttachment, mergeVoiceTranscriptsIntoUserText, requestsOriginalVoiceInspection } from "../../channels/attachments/voice-stt-webchat.js";
15
15
  import { applyReasoningVisibility } from "../streaming/reasoning-visibility.js";
16
16
  import { isSessionSourceBinding, summarizeSourceContext } from "../source-context/types.js";
17
17
  import { injectSourceContextsIntoUserMessage } from "../source-context/injector.js";
@@ -207,6 +207,7 @@ async function* runProcessDirectStreaming(deps, input) {
207
207
  const voiceMerge = await mergeVoiceTranscriptsIntoUserText(prepared, turnBody, sttCfg);
208
208
  mergedUserText = voiceMerge.text;
209
209
  inboundVoice = voiceMerge.inboundVoice;
210
+ const suppressMediaPromptUris = requestsOriginalVoiceInspection(mergedUserText) ? void 0 : new Set(voiceMerge.transcribedMediaUris ?? []);
210
211
  if (inboundVoice) {
211
212
  const transcriptParts = [voiceMerge.voiceTranscripts.filter(Boolean).join("\n"), turnBody.trim()].filter(Boolean);
212
213
  const voiceMedia = (prepared ?? []).filter(isVoiceLikeAttachment).map((att) => ({
@@ -275,7 +276,7 @@ async function* runProcessDirectStreaming(deps, input) {
275
276
  }
276
277
  const skillTurn = deps.agentManager.prepareSkillTurn(conversationId, mergedUserText);
277
278
  const textForAgent = skillTurn.text;
278
- const userMessage = await deps.buildTranscriptUserMessage(textForAgent, prepared, conversationId);
279
+ const userMessage = await deps.buildTranscriptUserMessage(textForAgent, prepared, conversationId, { suppressMediaPromptUris });
279
280
  const sourceContexts = [...input.sourceContexts ?? []];
280
281
  if (deps.sourceContextResolver) {
281
282
  const metadata = await deps.sessionStore.getMetadata(conversationId).catch(() => null);
@@ -1,6 +1,4 @@
1
1
  import type { Config } from '../../config/schema.js';
2
- import type { MediaRef } from '../../media/types.js';
3
- import type { SessionStore } from '../../session/index.js';
4
2
  export type WebchatTtsResult = {
5
3
  type: 'tts_audio';
6
4
  uri: string;
@@ -9,7 +7,6 @@ export type WebchatTtsResult = {
9
7
  };
10
8
  export type WebchatTtsDeps = {
11
9
  config: Config | undefined;
12
- sessionStore: SessionStore;
13
10
  getLastAssistantPlainText: (conversationId: string) => string;
14
11
  log: {
15
12
  warn: (obj: Record<string, unknown>, msg: string) => void;
@@ -21,4 +18,3 @@ export declare function isSuccessfulWebchatTtsToolEvent(event: unknown): boolean
21
18
  * Generate TTS for webchat when config allows; persist under `{stateDir}/media/tts/`.
22
19
  */
23
20
  export declare function maybeEmitWebchatTts(deps: WebchatTtsDeps, conversationId: string, hadInboundVoice: boolean): Promise<WebchatTtsResult | null>;
24
- export declare function appendMediaToLastAssistant(sessionStore: SessionStore, conversationId: string, ref: MediaRef): Promise<void>;
@@ -1,3 +1,5 @@
1
+ import { appendMediaToAssistantTranscriptEntry, findLatestAssistantTranscriptEntryId } from "../../storage/sqlite/transcript-repository.js";
2
+ import "../../storage/sqlite/index.js";
1
3
  import { isTTSAvailable } from "../../voice/tts/factory.js";
2
4
  import { speak } from "../../voice/tts/speak-core.js";
3
5
  import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
@@ -5,6 +7,7 @@ import { getChannelOutputFormat, shouldUseTTS } from "../../voice/tts/service.js
5
7
  import { compressAudio } from "../../voice/tts/audio.js";
6
8
  import { persistOutboundTtsAudio } from "../../channels/attachments/outbound-tts-persist.js";
7
9
  import "../../voice/tts/index.js";
10
+ import { deleteMediaUris } from "../../media/session-references.js";
8
11
  //#region src/agent/service/webchat-tts.ts
9
12
  /** True when the explicit TTS tool already produced durable Webchat audio. */
10
13
  function isSuccessfulWebchatTtsToolEvent(event) {
@@ -28,6 +31,12 @@ async function maybeEmitWebchatTts(deps, conversationId, hadInboundVoice) {
28
31
  if (!shouldUseTTS(ttsConfig, hadInboundVoice).useTTS) return null;
29
32
  const text = deps.getLastAssistantPlainText(conversationId).trim();
30
33
  if (!text) return null;
34
+ const assistantEntryId = findLatestAssistantTranscriptEntryId(conversationId);
35
+ if (!assistantEntryId) {
36
+ deps.log.warn({ conversationId }, "Webchat TTS skipped because the assistant transcript is unavailable");
37
+ return null;
38
+ }
39
+ let persisted;
31
40
  try {
32
41
  const webOut = getChannelOutputFormat("webchat");
33
42
  const fmt = webOut.format;
@@ -37,8 +46,15 @@ async function maybeEmitWebchatTts(deps, conversationId, hadInboundVoice) {
37
46
  });
38
47
  const { buffer, format } = await compressAudio(Buffer.from(ttsResult.audio), ttsResult.format, webOut.format === "mp3" ? "mp3" : "opus");
39
48
  const normalizedMime = format === "opus" || format === "ogg" ? "audio/ogg" : format === "mp3" || format === "mpeg" ? "audio/mpeg" : format === "wav" ? "audio/wav" : `audio/${format}`;
40
- const persisted = await persistOutboundTtsAudio(buffer, format);
41
- await appendMediaToLastAssistant(deps.sessionStore, conversationId, persisted);
49
+ persisted = await persistOutboundTtsAudio(buffer, format);
50
+ if (!appendMediaToAssistantTranscriptEntry(conversationId, assistantEntryId, persisted)) {
51
+ await deleteMediaUris([persisted.uri]);
52
+ deps.log.warn({
53
+ conversationId,
54
+ assistantEntryId
55
+ }, "Webchat TTS discarded because its assistant transcript changed");
56
+ return null;
57
+ }
42
58
  return {
43
59
  type: "tts_audio",
44
60
  uri: persisted.uri,
@@ -46,6 +62,7 @@ async function maybeEmitWebchatTts(deps, conversationId, hadInboundVoice) {
46
62
  name: persisted.name
47
63
  };
48
64
  } catch (err) {
65
+ if (persisted) await deleteMediaUris([persisted.uri]);
49
66
  deps.log.warn({
50
67
  err,
51
68
  conversationId
@@ -53,21 +70,5 @@ async function maybeEmitWebchatTts(deps, conversationId, hadInboundVoice) {
53
70
  return null;
54
71
  }
55
72
  }
56
- async function appendMediaToLastAssistant(sessionStore, conversationId, ref) {
57
- const loaded = await sessionStore.load(conversationId);
58
- for (let i = loaded.length - 1; i >= 0; i--) {
59
- const m = loaded[i];
60
- if (m.role === "assistant") {
61
- const prev = m.media ?? [];
62
- if (prev.some((x) => x.uri === ref.uri)) return;
63
- loaded[i] = {
64
- ...m,
65
- media: [...prev, ref]
66
- };
67
- await sessionStore.saveMessages(conversationId, loaded);
68
- return;
69
- }
70
- }
71
- }
72
73
  //#endregion
73
- export { appendMediaToLastAssistant, isSuccessfulWebchatTtsToolEvent, maybeEmitWebchatTts };
74
+ export { isSuccessfulWebchatTtsToolEvent, maybeEmitWebchatTts };
@@ -389,7 +389,7 @@ var AgentToolsFactory = class AgentToolsFactory {
389
389
  canRead: () => currentAccess().knowledge,
390
390
  canWrite: () => currentAccess().knowledge,
391
391
  getWritePolicy: knowledgeWritePolicy,
392
- getSources: () => currentAccess().knowledgeSources
392
+ getReadPolicy: () => currentAccess().knowledgePolicy
393
393
  }),
394
394
  createKnowledgeGetTool({
395
395
  agentId: resolvedAgentId,
@@ -399,7 +399,7 @@ var AgentToolsFactory = class AgentToolsFactory {
399
399
  canRead: () => currentAccess().knowledge,
400
400
  canWrite: () => currentAccess().knowledge,
401
401
  getWritePolicy: knowledgeWritePolicy,
402
- getSources: () => currentAccess().knowledgeSources
402
+ getReadPolicy: () => currentAccess().knowledgePolicy
403
403
  }),
404
404
  createKnowledgeWriteTool({
405
405
  agentId: resolvedAgentId,
@@ -409,7 +409,7 @@ var AgentToolsFactory = class AgentToolsFactory {
409
409
  canRead: () => currentAccess().knowledge,
410
410
  canWrite: () => currentAccess().knowledge,
411
411
  getWritePolicy: knowledgeWritePolicy,
412
- getSources: () => currentAccess().knowledgeSources
412
+ getReadPolicy: () => currentAccess().knowledgePolicy
413
413
  }),
414
414
  ...this.deps.getSessionStore ? [createSessionRecallTool({
415
415
  getSessionStore: this.deps.getSessionStore,
@@ -1,5 +1,5 @@
1
1
  import type { AgentTool } from '@earendil-works/pi-agent-core';
2
- import { type KnowledgeSource } from '../../knowledge-memory/index.js';
2
+ import { type KnowledgeReadPolicy } from '../../knowledge-memory/index.js';
3
3
  export interface KnowledgeToolOptions {
4
4
  agentId: string;
5
5
  workspaceId: string;
@@ -8,7 +8,7 @@ export interface KnowledgeToolOptions {
8
8
  canRead: () => boolean;
9
9
  canWrite: () => boolean;
10
10
  getWritePolicy: () => 'deny' | 'confirm' | 'allow';
11
- getSources: () => readonly KnowledgeSource[];
11
+ getReadPolicy: () => KnowledgeReadPolicy;
12
12
  }
13
13
  export declare function createKnowledgeSearchTool(options: KnowledgeToolOptions): AgentTool;
14
14
  export declare function createKnowledgeGetTool(options: KnowledgeToolOptions): AgentTool;
@@ -1,4 +1,4 @@
1
- import { getKnowledgeItem, knowledgeSourceAllowed, searchKnowledgeItems, writeKnowledgeItem } from "../../knowledge-memory/repository.js";
1
+ import { getKnowledgeItem, knowledgeItemAllowed, searchKnowledgeItems, writeKnowledgeItem } from "../../knowledge-memory/repository.js";
2
2
  import "../../knowledge-memory/index.js";
3
3
  import { Type } from "@sinclair/typebox";
4
4
  //#region src/agent/tools/knowledge-memory-tool.ts
@@ -60,7 +60,7 @@ function createKnowledgeSearchTool(options) {
60
60
  const results = searchKnowledgeItems({
61
61
  query: input.query,
62
62
  context: visibility(options),
63
- sources: options.getSources(),
63
+ policy: options.getReadPolicy(),
64
64
  limit: input.maxResults ?? 12
65
65
  });
66
66
  return {
@@ -92,7 +92,7 @@ function createKnowledgeGetTool(options) {
92
92
  };
93
93
  const id = raw.id;
94
94
  const item = getKnowledgeItem(id);
95
- return item && visibleItem(options, item) && knowledgeSourceAllowed(item, options.getSources()) ? {
95
+ return item && visibleItem(options, item) && knowledgeItemAllowed(item, options.getReadPolicy()) ? {
96
96
  content: [{
97
97
  type: "text",
98
98
  text: JSON.stringify(item, null, 2)
@@ -131,14 +131,14 @@ function createKnowledgeWriteTool(options) {
131
131
  details: { error: "knowledge_write_denied" }
132
132
  };
133
133
  const input = raw;
134
- if (!options.getSources().includes(input.scope)) return {
134
+ if (!options.getReadPolicy().scopes.includes(input.scope) || !options.getReadPolicy().contentSources.includes("memory")) return {
135
135
  content: [{
136
136
  type: "text",
137
- text: `Knowledge source is disabled: ${input.scope}`
137
+ text: `Knowledge memory writes are disabled for scope: ${input.scope}`
138
138
  }],
139
139
  details: {
140
- error: "knowledge_source_disabled",
141
- source: input.scope
140
+ error: "knowledge_scope_disabled",
141
+ scope: input.scope
142
142
  }
143
143
  };
144
144
  const sessionId = options.getSessionId();
@@ -1,5 +1,5 @@
1
1
  import { closeXopcDatabase, init_connection, openXopcDatabase } from "../storage/sqlite/connection.js";
2
- import { devicePairingInvitationPayloadSchema, formatBrowserPairingInvitation } from "../../packages/gateway-contract/src/device-pairing.js";
2
+ import { browserPairingInvitationPayloadSchema, formatBrowserPairingInvitation } from "../../packages/gateway-contract/src/device-pairing.js";
3
3
  import { init_src } from "../../packages/gateway-contract/src/index.js";
4
4
  import { getGatewayIdentityPublicKeyRaw, getOrCreateGatewayIdentity } from "../storage/sqlite/gateway-identity-repository.js";
5
5
  import { createDevicePairingSetup } from "../storage/sqlite/device-pairing-repository.js";
@@ -53,7 +53,7 @@ function createBrowserNativeBootstrap(configPath, request) {
53
53
  return {
54
54
  ok: true,
55
55
  gatewayUrl,
56
- invitation: formatBrowserPairingInvitation(Buffer.from(JSON.stringify(devicePairingInvitationPayloadSchema.parse({
56
+ invitation: formatBrowserPairingInvitation(Buffer.from(JSON.stringify(browserPairingInvitationPayloadSchema.parse({
57
57
  version: 3,
58
58
  pairingToken: setup.token,
59
59
  gatewayId: identity.id,
@@ -4,10 +4,13 @@
4
4
  import type { STTConfig } from '../../voice/stt/types.js';
5
5
  import { type InboundAttachmentInput, type MediaRef } from './inbound-persist.js';
6
6
  export declare function isVoiceLikeAttachment(att: InboundAttachmentInput | MediaRef): boolean;
7
+ /** True when the user explicitly asks the agent to inspect the original recording. */
8
+ export declare function requestsOriginalVoiceInspection(text: string): boolean;
7
9
  export declare function mergeVoiceTranscriptsIntoUserText(prepared: (InboundAttachmentInput | MediaRef)[] | undefined, userText: string, sttConfig: STTConfig, opts?: {
8
10
  skipVoiceTranscription?: boolean;
9
11
  }): Promise<{
10
12
  text: string;
11
13
  inboundVoice: boolean;
12
14
  voiceTranscripts: string[];
15
+ transcribedMediaUris: string[];
13
16
  }>;