@xopcai/xopc 0.0.145 → 0.0.147

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 (380) hide show
  1. package/README.md +2 -2
  2. package/dist/browser-ext/manifest.json +1 -1
  3. package/dist/extensions/demo-memory/src/index.js +6 -4
  4. package/dist/extensions/demo-memory/src/index.js.map +1 -1
  5. package/dist/extensions/telegram/xopc.extension.json +1 -1
  6. package/dist/gateway/static/root/assets/Combination-14nmIgxH.js +41 -0
  7. package/dist/gateway/static/root/assets/activity-store-DXeSSlw1.js +1 -0
  8. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BEUxdhZx.js → agent-avatar-dicebear-CFdJKSjY.js} +1 -1
  9. package/dist/gateway/static/root/assets/agents-DKjbRpbA.js +2 -0
  10. package/dist/gateway/static/root/assets/api-Bs69B5zA.js +1 -0
  11. package/dist/gateway/static/root/assets/{app-management-settings-panel-CRHSZJWi.js → app-management-settings-panel-ag1ViXT_.js} +1 -1
  12. package/dist/gateway/static/root/assets/{appearance-settings-BunADYJb.js → appearance-settings-C6iMpwOM.js} +1 -1
  13. package/dist/gateway/static/root/assets/apps-page-CpX3lBFF.js +1 -0
  14. package/dist/gateway/static/root/assets/{archive-plugin-B6vTkH2A.js → archive-plugin-Dwi3mIBy.js} +1 -1
  15. package/dist/gateway/static/root/assets/{attachment-load-BjZXzaNv.js → attachment-load-BaCDoq40.js} +1 -1
  16. package/dist/gateway/static/root/assets/{automation-suggestion-card-ZDA-Stg1.js → automation-suggestion-card-CwqtFgnw.js} +1 -1
  17. package/dist/gateway/static/root/assets/automations-page-DlupOxFQ.js +6 -0
  18. package/dist/gateway/static/root/assets/{binary-plugins-DYZfLvPz.js → binary-plugins-DoAYhsxa.js} +1 -1
  19. package/dist/gateway/static/root/assets/{block-editor-C3MUlYC9.js → block-editor-Bw72pO7S.js} +31 -31
  20. package/dist/gateway/static/root/assets/browser-settings-page-BwLoUBcZ.js +8 -0
  21. package/dist/gateway/static/root/assets/capability-presets-api-vdbAR65Q.js +1 -0
  22. package/dist/gateway/static/root/assets/capability-presets-settings-panel-BAsKbJgm.js +2 -0
  23. package/dist/gateway/static/root/assets/{channel-recipient-api-fTlTnWB4.js → channel-recipient-api-rTG26jpV.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-CxFWy0cE.js +1 -0
  25. package/dist/gateway/static/root/assets/channels-status-swr-OKlqTtKJ.js +1 -0
  26. package/dist/gateway/static/root/assets/{connector-logo-BVFNT2zW.js → connector-logo-DIMP4NWY.js} +1 -1
  27. package/dist/gateway/static/root/assets/connectors-page-BjQQwX62.js +2 -0
  28. package/dist/gateway/static/root/assets/{desktop-pet-_jUmoXd3.js → desktop-pet-kQq2e0BN.js} +1 -1
  29. package/dist/gateway/static/root/assets/{desktop-pet-settings-DwGOy4AQ.js → desktop-pet-settings-B6vtozMY.js} +1 -1
  30. package/dist/gateway/static/root/assets/{directory-picker-path-field-akvF0F-u.js → directory-picker-path-field-Dn5-e3v4.js} +1 -1
  31. package/dist/gateway/static/root/assets/dist-C230izr8.js +1 -0
  32. package/dist/gateway/static/root/assets/dist-CxGUk8J-.js +1 -0
  33. package/dist/gateway/static/root/assets/dreaming-settings-BzwIujPG.js +3 -0
  34. package/dist/gateway/static/root/assets/extension-debug-page-D_e_hsEy.js +1 -0
  35. package/dist/gateway/static/root/assets/{extension-page-CwWktRNz.js → extension-page-D15CWHBd.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-settings-page-CuggWOIl.js → extension-settings-page-D4P0n1om.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-api-B7sxIbza.js → gateway-config-api-B4qZctjG.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-settings-DIv0eKMf.js → gateway-settings-BvndV7TP.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-startup-retry-DtoLihQE.js → gateway-startup-retry-BpgMunEb.js} +1 -1
  40. package/dist/gateway/static/root/assets/{goal-create-dialog-C4Kw0mfS.js → goal-create-dialog-DrVHKXHq.js} +1 -1
  41. package/dist/gateway/static/root/assets/goal-detail-page-PHlCwv68.js +4 -0
  42. package/dist/gateway/static/root/assets/{goals-config-api-B0jm5JaA.js → goals-config-api-B6YJB_ct.js} +1 -1
  43. package/dist/gateway/static/root/assets/goals-page-Hg9uyO6e.js +2 -0
  44. package/dist/gateway/static/root/assets/{goals-settings-N5_iL7es.js → goals-settings-BROWCIcL.js} +1 -1
  45. package/dist/gateway/static/root/assets/{heartbeat-settings-XzH3lbRR.js → heartbeat-settings-CoCwIOIg.js} +1 -1
  46. package/dist/gateway/static/root/assets/index-CxkNzw3e.js +259 -0
  47. package/dist/gateway/static/root/assets/index-DjCSOyaN.css +1 -0
  48. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-Bm_AIYQ7.js +1 -0
  49. package/dist/gateway/static/root/assets/local-app-workbench-page-BJWFcxwG.js +2 -0
  50. package/dist/gateway/static/root/assets/local-apps-page-BsiZMrEf.js +1 -0
  51. package/dist/gateway/static/root/assets/{locale-store-CiM-D9jA.js → locale-store-Bp8joZck.js} +1 -1
  52. package/dist/gateway/static/root/assets/logs-page-DOmK61ey.js +7 -0
  53. package/dist/gateway/static/root/assets/{markdown-split-5rJx5flj.js → markdown-split-Dy7QpaAz.js} +1 -1
  54. package/dist/gateway/static/root/assets/{media-plugins-DYXccwAd.js → media-plugins-3Lxliy9D.js} +1 -1
  55. package/dist/gateway/static/root/assets/messages-CQGpD-dC.js +5 -0
  56. package/dist/gateway/static/root/assets/models-hub-panel-DGCZom4o.js +2 -0
  57. package/dist/gateway/static/root/assets/{notes-page-BgLyndCO.js → notes-page-BJtT4vSf.js} +1 -1
  58. package/dist/gateway/static/root/assets/notes-workbench-B_bN7cOR.js +4 -0
  59. package/dist/gateway/static/root/assets/{page-tabs-6Al9_sGz.js → page-tabs-DKB6RDre.js} +1 -1
  60. package/dist/gateway/static/root/assets/{preview-open-alternatives-Cm3G72Hv.js → preview-open-alternatives-Br_YhYHp.js} +1 -1
  61. package/dist/gateway/static/root/assets/project-detail-page-Dq8JouJj.js +1 -0
  62. package/dist/gateway/static/root/assets/projects-page-DvfL7fSe.js +1 -0
  63. package/dist/gateway/static/root/assets/remote-access-hub-DqwMXSXP.js +1 -0
  64. package/dist/gateway/static/root/assets/{save-bar-controls-BYtfzu_F.js → save-bar-controls-BgIE9BBh.js} +1 -1
  65. package/dist/gateway/static/root/assets/{schedule-field-CvIRc6yK.js → schedule-field-BXDP-oMz.js} +1 -1
  66. package/dist/gateway/static/root/assets/{schema-form-CQuKx0n7.js → schema-form-Dhv-SmjG.js} +1 -1
  67. package/dist/gateway/static/root/assets/sessions-page-B_mOZkQk.js +1 -0
  68. package/dist/gateway/static/root/assets/settings-advanced-gate-BHGmH6YS.js +1 -0
  69. package/dist/gateway/static/root/assets/{settings-collapsible-section-CF3HHM-t.js → settings-collapsible-section-CUTExnlK.js} +1 -1
  70. package/dist/gateway/static/root/assets/{settings-form-section-CwWjoRN6.js → settings-form-section-CmnDhsf0.js} +1 -1
  71. package/dist/gateway/static/root/assets/{settings-loading-skeleton-aUFmJa13.js → settings-loading-skeleton-B79dq-XY.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-page-B2UUU9TF.js → settings-page-Db8uAv3X.js} +1 -1
  73. package/dist/gateway/static/root/assets/{settings-page-layout-DqpbTWqI.js → settings-page-layout-DaFwstQw.js} +1 -1
  74. package/dist/gateway/static/root/assets/setup-status-panel-BUSEj0KK.js +1 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-BOhlPsS1.js → share-preview-page-Bi00uXzV.js} +1 -1
  76. package/dist/gateway/static/root/assets/shares-settings-DzsTYfuX.js +1 -0
  77. package/dist/gateway/static/root/assets/skill-reload-api-DSsdU081.js +1 -0
  78. package/dist/gateway/static/root/assets/skills-page-DeB1tQZL.js +2 -0
  79. package/dist/gateway/static/root/assets/{system-settings-panel-CWxSvuwD.js → system-settings-panel-Cxaph7hW.js} +1 -1
  80. package/dist/gateway/static/root/assets/{theme-store-C9Dxcppm.js → theme-store-eCTN1RpG.js} +1 -1
  81. package/dist/gateway/static/root/assets/{typed-models-lib-qROAvqTw.js → typed-models-lib-CcZ_tyFY.js} +1 -1
  82. package/dist/gateway/static/root/assets/{use-channel-catalog-DE9cpn4G.js → use-channel-catalog-C4PWbNoi.js} +1 -1
  83. package/dist/gateway/static/root/assets/user-context-page-QTVMx_hG.js +1 -0
  84. package/dist/gateway/static/root/assets/{user-profile-fields-editor-CWxc0ghP.js → user-profile-fields-editor-CPOO9Jz5.js} +1 -1
  85. package/dist/gateway/static/root/assets/{user-profile-settings-panel-DW-Up6vt.js → user-profile-settings-panel-C8cgtSF7.js} +1 -1
  86. package/dist/gateway/static/root/assets/{utils-D53uRXVr.js → utils-CiZK2KwH.js} +1 -1
  87. package/dist/gateway/static/root/assets/voice-api-key-field-b-YZtvUu.js +1 -0
  88. package/dist/gateway/static/root/assets/work-discovery-page-4zVDOl2G.js +1 -0
  89. package/dist/gateway/static/root/assets/work-item-detail-page-CHe2tfkc.js +1 -0
  90. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-D_x9ELJp.js → workflow-run-setup-panel-8SLCYeXE.js} +2 -2
  91. package/dist/gateway/static/root/assets/workflows-page-DEOFqiWn.js +11 -0
  92. package/dist/gateway/static/root/index.html +10 -9
  93. package/dist/package.js +1 -1
  94. package/dist/src/activity/types.d.ts +1 -1
  95. package/dist/src/agent/agent-instance-gateway.d.ts +1 -1
  96. package/dist/src/agent/agent-manager.d.ts +1 -1
  97. package/dist/src/agent/agent-manager.js +5 -4
  98. package/dist/src/agent/agent-manager.js.map +1 -1
  99. package/dist/src/agent/background-review/coordinator.js +0 -1
  100. package/dist/src/agent/background-review/coordinator.js.map +1 -1
  101. package/dist/src/agent/background-review/settings.d.ts +1 -1
  102. package/dist/src/agent/background-review/settings.js +10 -17
  103. package/dist/src/agent/background-review/settings.js.map +1 -1
  104. package/dist/src/agent/bootstrap/filter-bootstrap-files.d.ts +1 -1
  105. package/dist/src/agent/bootstrap/filter-bootstrap-files.js +1 -1
  106. package/dist/src/agent/bootstrap/filter-bootstrap-files.js.map +1 -1
  107. package/dist/src/agent/bootstrap/load-bootstrap-files.js +2 -3
  108. package/dist/src/agent/bootstrap/load-bootstrap-files.js.map +1 -1
  109. package/dist/src/agent/code-intelligence/binary.js +1 -1
  110. package/dist/src/agent/context/project-context.d.ts +14 -0
  111. package/dist/src/agent/context/project-context.js +23 -1
  112. package/dist/src/agent/context/project-context.js.map +1 -1
  113. package/dist/src/agent/context/workspace-templates/AGENTS.md +1 -1
  114. package/dist/src/agent/context/workspace.d.ts +1 -2
  115. package/dist/src/agent/context/workspace.js +2 -4
  116. package/dist/src/agent/context/workspace.js.map +1 -1
  117. package/dist/src/agent/embedded/run-for-session.js +1 -2
  118. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  119. package/dist/src/agent/embedded/run-turn.js +6 -1
  120. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  121. package/dist/src/agent/embedded/types.d.ts +17 -0
  122. package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -2
  123. package/dist/src/agent/memory/builtin-memory-store.js +2 -2
  124. package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
  125. package/dist/src/agent/memory/builtin-provider.d.ts +1 -3
  126. package/dist/src/agent/memory/builtin-provider.js +21 -48
  127. package/dist/src/agent/memory/builtin-provider.js.map +1 -1
  128. package/dist/src/agent/memory/context/planner.js +48 -9
  129. package/dist/src/agent/memory/context/planner.js.map +1 -1
  130. package/dist/src/agent/memory/context/types.d.ts +7 -1
  131. package/dist/src/agent/memory/context-fence.js +1 -1
  132. package/dist/src/agent/memory/context-fence.js.map +1 -1
  133. package/dist/src/agent/memory/create-memory-manager.js +2 -9
  134. package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
  135. package/dist/src/agent/memory/dreaming/config.js +5 -10
  136. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  137. package/dist/src/agent/memory/dreaming/promotion-lifecycle.js +2 -2
  138. package/dist/src/agent/memory/dreaming/promotion-lifecycle.js.map +1 -1
  139. package/dist/src/agent/memory/dreaming/scope.d.ts +2 -3
  140. package/dist/src/agent/memory/dreaming/scope.js +8 -8
  141. package/dist/src/agent/memory/dreaming/scope.js.map +1 -1
  142. package/dist/src/agent/memory/manager.d.ts +1 -5
  143. package/dist/src/agent/memory/manager.js +2 -23
  144. package/dist/src/agent/memory/manager.js.map +1 -1
  145. package/dist/src/agent/memory/memory-config.d.ts +3 -3
  146. package/dist/src/agent/memory/memory-config.js +9 -14
  147. package/dist/src/agent/memory/memory-config.js.map +1 -1
  148. package/dist/src/agent/memory/types.d.ts +9 -5
  149. package/dist/src/agent/memory/understanding/service.js +21 -8
  150. package/dist/src/agent/memory/understanding/service.js.map +1 -1
  151. package/dist/src/agent/memory/understanding/types.d.ts +5 -0
  152. package/dist/src/agent/memory/user-context-coordinator.d.ts +1 -1
  153. package/dist/src/agent/memory/user-context-coordinator.js +6 -2
  154. package/dist/src/agent/memory/user-context-coordinator.js.map +1 -1
  155. package/dist/src/agent/orchestration/agent-orchestrator.js +2 -2
  156. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  157. package/dist/src/agent/prompt/memory/index.d.ts +1 -2
  158. package/dist/src/agent/prompt/memory/index.js +6 -7
  159. package/dist/src/agent/prompt/memory/index.js.map +1 -1
  160. package/dist/src/agent/prompt/sections/tooling.js +1 -1
  161. package/dist/src/agent/prompt/sections/tooling.js.map +1 -1
  162. package/dist/src/agent/service/direct-turn-helpers.js +13 -2
  163. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  164. package/dist/src/agent/tools/curated-memory-tool.js +4 -4
  165. package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
  166. package/dist/src/agent/tools/factory.d.ts +1 -1
  167. package/dist/src/agent/tools/factory.js +2 -2
  168. package/dist/src/agent/tools/factory.js.map +1 -1
  169. package/dist/src/agent/tools/memory-tool.js +1 -1
  170. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  171. package/dist/src/agent/workflow/workflow-child-tools.js +2 -3
  172. package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
  173. package/dist/src/agent/workspace-runtime/registry.d.ts +5 -5
  174. package/dist/src/agent/workspace-runtime/registry.js +6 -11
  175. package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
  176. package/dist/src/agent-manifest/index.js +2 -2
  177. package/dist/src/agent-manifest/prompt.js +1 -7
  178. package/dist/src/agent-manifest/prompt.js.map +1 -1
  179. package/dist/src/agent-manifest/schema.d.ts +0 -598
  180. package/dist/src/agent-manifest/schema.js +2 -143
  181. package/dist/src/agent-manifest/schema.js.map +1 -1
  182. package/dist/src/agent-manifest/validator.js +0 -12
  183. package/dist/src/agent-manifest/validator.js.map +1 -1
  184. package/dist/src/agent-runtime/index.js +1 -1
  185. package/dist/src/agent-runtime/memory-runtime.d.ts +2 -2
  186. package/dist/src/agent-runtime/memory-runtime.js +8 -7
  187. package/dist/src/agent-runtime/memory-runtime.js.map +1 -1
  188. package/dist/src/agent-runtime/runtime-profile.d.ts +2 -0
  189. package/dist/src/agent-runtime/runtime-profile.js +2 -2
  190. package/dist/src/agent-runtime/runtime-profile.js.map +1 -1
  191. package/dist/src/chat-commands/agent-edit.js +1 -2
  192. package/dist/src/chat-commands/agent-edit.js.map +1 -1
  193. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  194. package/dist/src/cli/commands/init.js +0 -22
  195. package/dist/src/cli/commands/init.js.map +1 -1
  196. package/dist/src/cli/templates.d.ts +1 -1
  197. package/dist/src/cli/templates.js +1 -16
  198. package/dist/src/cli/templates.js.map +1 -1
  199. package/dist/src/commands/agents.config.js +0 -10
  200. package/dist/src/commands/agents.config.js.map +1 -1
  201. package/dist/src/config/agent-profile.js +1 -1
  202. package/dist/src/config/index.js +2 -2
  203. package/dist/src/config/paths.d.ts +0 -1
  204. package/dist/src/config/paths.js +1 -2
  205. package/dist/src/config/paths.js.map +1 -1
  206. package/dist/src/config/schema.d.ts +118 -532
  207. package/dist/src/config/schema.js +32 -26
  208. package/dist/src/config/schema.js.map +1 -1
  209. package/dist/src/extensions/loader.js +2 -1
  210. package/dist/src/extensions/loader.js.map +1 -1
  211. package/dist/src/gateway/agents-admin.d.ts +0 -2
  212. package/dist/src/gateway/agents-admin.js +1 -7
  213. package/dist/src/gateway/agents-admin.js.map +1 -1
  214. package/dist/src/gateway/capability-presets-admin.d.ts +0 -2
  215. package/dist/src/gateway/capability-presets-admin.js.map +1 -1
  216. package/dist/src/gateway/chat-stream/mapper.js +26 -0
  217. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  218. package/dist/src/gateway/chat-stream/protocol.d.ts +16 -1
  219. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +0 -1
  220. package/dist/src/gateway/dreaming-automation-reconciler.js +41 -63
  221. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
  222. package/dist/src/gateway/heartbeat/service.js +1 -1
  223. package/dist/src/gateway/hono/app.js +3 -1
  224. package/dist/src/gateway/hono/app.js.map +1 -1
  225. package/dist/src/gateway/hono/lib/config-payload.d.ts +0 -130
  226. package/dist/src/gateway/hono/lib/config-payload.js +0 -1
  227. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  228. package/dist/src/gateway/hono/routes/agents.js +6 -12
  229. package/dist/src/gateway/hono/routes/agents.js.map +1 -1
  230. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +6 -0
  231. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  232. package/dist/src/gateway/hono/routes/capability-presets.js +2 -2
  233. package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -1
  234. package/dist/src/gateway/hono/routes/dreaming.js +9 -20
  235. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  236. package/dist/src/gateway/hono/routes/index.js +4 -0
  237. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  238. package/dist/src/gateway/hono/routes/local-apps.d.ts +5 -0
  239. package/dist/src/gateway/hono/routes/local-apps.js +99 -0
  240. package/dist/src/gateway/hono/routes/local-apps.js.map +1 -0
  241. package/dist/src/gateway/hono/routes/memory.js +48 -65
  242. package/dist/src/gateway/hono/routes/memory.js.map +1 -1
  243. package/dist/src/gateway/hono/routes/projects.js +2 -2
  244. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  245. package/dist/src/gateway/hono/routes/work-discovery.d.ts +3 -0
  246. package/dist/src/gateway/hono/routes/work-discovery.js +150 -0
  247. package/dist/src/gateway/hono/routes/work-discovery.js.map +1 -0
  248. package/dist/src/gateway/hono/routes/you.d.ts +3 -0
  249. package/dist/src/gateway/hono/routes/you.js +358 -91
  250. package/dist/src/gateway/hono/routes/you.js.map +1 -1
  251. package/dist/src/gateway/service.d.ts +3 -0
  252. package/dist/src/gateway/service.js +12 -0
  253. package/dist/src/gateway/service.js.map +1 -1
  254. package/dist/src/heartbeat/index.js +1 -1
  255. package/dist/src/knowledge/connected-knowledge-pipeline.js +9 -5
  256. package/dist/src/knowledge/connected-knowledge-pipeline.js.map +1 -1
  257. package/dist/src/local-apps/acceptance.d.ts +30 -0
  258. package/dist/src/local-apps/acceptance.js +93 -0
  259. package/dist/src/local-apps/acceptance.js.map +1 -0
  260. package/dist/src/local-apps/index.d.ts +5 -0
  261. package/dist/src/local-apps/index.js +4 -0
  262. package/dist/src/local-apps/preview-runtime-bridge.d.ts +4 -0
  263. package/dist/src/local-apps/preview-runtime-bridge.js +171 -0
  264. package/dist/src/local-apps/preview-runtime-bridge.js.map +1 -0
  265. package/dist/src/local-apps/runtime-entry.d.ts +8 -0
  266. package/dist/src/local-apps/runtime-entry.js +25 -0
  267. package/dist/src/local-apps/runtime-entry.js.map +1 -0
  268. package/dist/src/local-apps/scaffold.d.ts +8 -0
  269. package/dist/src/local-apps/scaffold.js +122 -0
  270. package/dist/src/local-apps/scaffold.js.map +1 -0
  271. package/dist/src/local-apps/service.d.ts +37 -0
  272. package/dist/src/local-apps/service.js +553 -0
  273. package/dist/src/local-apps/service.js.map +1 -0
  274. package/dist/src/local-apps/store.d.ts +44 -0
  275. package/dist/src/local-apps/store.js +195 -0
  276. package/dist/src/local-apps/store.js.map +1 -0
  277. package/dist/src/local-apps/types.d.ts +105 -0
  278. package/dist/src/local-apps/types.js +1 -0
  279. package/dist/src/storage/sqlite/index.d.ts +3 -2
  280. package/dist/src/storage/sqlite/index.js +4 -3
  281. package/dist/src/storage/sqlite/memory-index-repository.d.ts +2 -3
  282. package/dist/src/storage/sqlite/memory-index-repository.js +16 -20
  283. package/dist/src/storage/sqlite/memory-index-repository.js.map +1 -1
  284. package/dist/src/storage/sqlite/memory-records-repository.d.ts +18 -10
  285. package/dist/src/storage/sqlite/memory-records-repository.js +79 -34
  286. package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -1
  287. package/dist/src/storage/sqlite/memory-reference-consent-repository.d.ts +27 -0
  288. package/dist/src/storage/sqlite/memory-reference-consent-repository.js +109 -0
  289. package/dist/src/storage/sqlite/memory-reference-consent-repository.js.map +1 -0
  290. package/dist/src/storage/sqlite/migrations/038_user_owned_memory.sql +68 -0
  291. package/dist/src/storage/sqlite/migrations/039_memory_reference_consents.sql +19 -0
  292. package/dist/src/storage/sqlite/migrations/040_local_apps.sql +32 -0
  293. package/dist/src/storage/sqlite/migrations/041_local_app_release_lifecycle.sql +17 -0
  294. package/dist/src/storage/sqlite/migrations/042_work_discovery.sql +41 -0
  295. package/dist/src/storage/sqlite/migrations/043_local_app_acceptance_runs.sql +16 -0
  296. package/dist/src/storage/sqlite/migrations/044_repair_work_discovery_foreign_keys.sql +75 -0
  297. package/dist/src/storage/sqlite/migrations/045_extension_ui_grants.sql +13 -0
  298. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  299. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  300. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  301. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  302. package/dist/src/storage/sqlite/schema.js +1 -1
  303. package/dist/src/storage/sqlite/schema.sql +20 -0
  304. package/dist/src/user-context/config.d.ts +227 -0
  305. package/dist/src/user-context/config.js +158 -0
  306. package/dist/src/user-context/config.js.map +1 -0
  307. package/dist/src/user-context/import.d.ts +1 -1
  308. package/dist/src/user-context/import.js +6 -1
  309. package/dist/src/user-context/import.js.map +1 -1
  310. package/dist/src/user-context/owner.d.ts +5 -0
  311. package/dist/src/user-context/owner.js +9 -0
  312. package/dist/src/user-context/owner.js.map +1 -0
  313. package/dist/src/user-context/projection.d.ts +11 -9
  314. package/dist/src/user-context/projection.js +74 -47
  315. package/dist/src/user-context/projection.js.map +1 -1
  316. package/dist/src/user-context/runtime.d.ts +13 -0
  317. package/dist/src/user-context/runtime.js +36 -0
  318. package/dist/src/user-context/runtime.js.map +1 -0
  319. package/dist/src/work-discovery/analyzer.d.ts +11 -0
  320. package/dist/src/work-discovery/analyzer.js +171 -0
  321. package/dist/src/work-discovery/analyzer.js.map +1 -0
  322. package/dist/src/work-discovery/index.d.ts +5 -0
  323. package/dist/src/work-discovery/index.js +5 -0
  324. package/dist/src/work-discovery/probe.d.ts +12 -0
  325. package/dist/src/work-discovery/probe.js +335 -0
  326. package/dist/src/work-discovery/probe.js.map +1 -0
  327. package/dist/src/work-discovery/repository.d.ts +11 -0
  328. package/dist/src/work-discovery/repository.js +100 -0
  329. package/dist/src/work-discovery/repository.js.map +1 -0
  330. package/dist/src/work-discovery/service.d.ts +30 -0
  331. package/dist/src/work-discovery/service.js +387 -0
  332. package/dist/src/work-discovery/service.js.map +1 -0
  333. package/dist/src/work-discovery/types.d.ts +114 -0
  334. package/dist/src/work-discovery/types.js +1 -0
  335. package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
  336. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  337. package/package.json +5 -3
  338. package/skills/engineering/build-xopc-local-app/SKILL.md +45 -0
  339. package/skills/engineering/build-xopc-local-app/references/app-contract.md +33 -0
  340. package/skills/engineering/build-xopc-local-app/scripts/validate-local-app.mjs +72 -0
  341. package/dist/gateway/static/root/assets/Combination-DolwnuKi.js +0 -41
  342. package/dist/gateway/static/root/assets/activity-center-store-3l9ahUqb.js +0 -1
  343. package/dist/gateway/static/root/assets/agents-1bpT0xRO.js +0 -2
  344. package/dist/gateway/static/root/assets/apps-page-Cc4JgVUQ.js +0 -1
  345. package/dist/gateway/static/root/assets/automations-page-mb0fdVpq.js +0 -6
  346. package/dist/gateway/static/root/assets/browser-settings-page-Bb0xhaMN.js +0 -8
  347. package/dist/gateway/static/root/assets/capability-presets-api-BV76yN9a.js +0 -1
  348. package/dist/gateway/static/root/assets/capability-presets-settings-panel-CUcGKZqC.js +0 -2
  349. package/dist/gateway/static/root/assets/channels-settings-BlSDMGdy.js +0 -1
  350. package/dist/gateway/static/root/assets/channels-status-swr-CJauF1CW.js +0 -1
  351. package/dist/gateway/static/root/assets/connectors-page-CMgAFGvb.js +0 -2
  352. package/dist/gateway/static/root/assets/dist-C99RGfAH.js +0 -1
  353. package/dist/gateway/static/root/assets/dreaming-settings-BLetQiYY.js +0 -3
  354. package/dist/gateway/static/root/assets/extension-debug-page-Cof2ncxE.js +0 -1
  355. package/dist/gateway/static/root/assets/goal-detail-page-BMmzYpZL.js +0 -4
  356. package/dist/gateway/static/root/assets/goals-page-CGeT77PC.js +0 -2
  357. package/dist/gateway/static/root/assets/index-CSLF84-Q.css +0 -1
  358. package/dist/gateway/static/root/assets/index-I-ZCenVw.js +0 -259
  359. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-x_v0nrIi.js +0 -1
  360. package/dist/gateway/static/root/assets/logs-page-BSh1t8cD.js +0 -7
  361. package/dist/gateway/static/root/assets/messages-Cb1VMeqP.js +0 -5
  362. package/dist/gateway/static/root/assets/models-hub-panel-BNpTenAI.js +0 -2
  363. package/dist/gateway/static/root/assets/notes-workbench-teklkhcE.js +0 -4
  364. package/dist/gateway/static/root/assets/project-detail-page-CCB_dKoh.js +0 -1
  365. package/dist/gateway/static/root/assets/projects-page-VOAFAHYj.js +0 -1
  366. package/dist/gateway/static/root/assets/remote-access-hub-USYu64Ru.js +0 -1
  367. package/dist/gateway/static/root/assets/sessions-page-oGC8O5h_.js +0 -1
  368. package/dist/gateway/static/root/assets/settings-advanced-gate-D4rP66R1.js +0 -1
  369. package/dist/gateway/static/root/assets/setup-status-panel-Ck9keROI.js +0 -1
  370. package/dist/gateway/static/root/assets/shares-settings-BYLsCuqj.js +0 -1
  371. package/dist/gateway/static/root/assets/skill-reload-api-BNHUyVML.js +0 -1
  372. package/dist/gateway/static/root/assets/skills-page-CpXbQH4n.js +0 -2
  373. package/dist/gateway/static/root/assets/user-context-page-DbNEK4Yp.js +0 -1
  374. package/dist/gateway/static/root/assets/voice-api-key-field-Cs7MOrg0.js +0 -1
  375. package/dist/gateway/static/root/assets/work-item-detail-page-D1ziG1Pp.js +0 -1
  376. package/dist/gateway/static/root/assets/workflows-page-DHGV_n6i.js +0 -11
  377. package/dist/src/agent/context/workspace-templates/MEMORY.md +0 -33
  378. package/dist/src/agent/memory/access-policy.d.ts +0 -12
  379. package/dist/src/agent/memory/access-policy.js +0 -44
  380. package/dist/src/agent/memory/access-policy.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"agent-orchestrator.js","names":[],"sources":["../../../../src/agent/orchestration/agent-orchestrator.ts"],"sourcesContent":["/**\n * Agent Orchestrator - Coordinates Agent execution flow\n *\n * Manages the complete agent execution pipeline from message processing\n * to response generation.\n */\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveEffectiveAgentProfileForSession } from '../../config/agent-profile.js';\nimport type { InboundMessage } from '../../infra/bus/index.js';\nimport type { SessionConfigStore, SessionStore } from '../../session/index.js';\nimport type { SessionHydrator } from '../session/index.js';\nimport { resolveEffectiveThinkingLevel } from '../../session/thinking-resolve.js';\nimport type { ThinkLevel } from '../transcript/thinking-types.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { SessionContext } from '../session/session-context.js';\nimport type { AgentEventHandler } from './agent-event-handler.js';\nimport type { FeedbackCoordinator } from '../feedback/feedback-coordinator.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { extractAgentUserPlainText } from '../memory/user-message-text.js';\nimport { abortEmbeddedRun } from '../embedded/runs.js';\nimport { runEmbeddedTurnForSession } from '../embedded/run-for-session.js';\nimport type { EmbeddedStreamEvent } from '../embedded/types.js';\nimport { persistInboundAttachments } from '../../channels/attachments/inbound-persist.js';\nimport {\n buildTranscriptUserMessage,\n clearPendingTranscriptUserMessage,\n hydrateUserTurnForLlm,\n setPendingTranscriptUserMessage,\n} from '../inbound/attachment-pipeline.js';\nimport {\n DREAMING_SWEEP_TOKEN,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_REM_SWEEP_TOKEN,\n} from '../memory/dreaming/constants.js';\nimport { runDreamingDeepPromotion } from '../memory/dreaming/deep-promotion.js';\nimport { appendDreamingEvent, type DreamingEvent } from '../memory/dreaming/events.js';\nimport { runLightSweep } from '../memory/dreaming/light-sweep.js';\nimport { runRemPatterns } from '../memory/dreaming/rem-patterns.js';\nimport { resolveDreamingAgentScope } from '../memory/dreaming/scope.js';\n\nconst log = createLogger('AgentOrchestrator');\n\nexport interface AgentOrchestratorConfig {\n agentManager: AgentManager;\n sessionStore: SessionStore;\n modelManager: ModelManager;\n eventHandler: AgentEventHandler;\n feedbackCoordinator: FeedbackCoordinator;\n sessionConfigStore: SessionConfigStore;\n /** Per-session hydration (workspace override + model override) before the agent runs. */\n sessionHydrator: SessionHydrator;\n getThinkingDefault: () => ThinkLevel | undefined;\n /** Per-session default from merged `agents.list` / defaults (optional). */\n getThinkingDefaultForSession?: (sessionKey: string) => ThinkLevel | undefined;\n /** Default workspace root when no per-session resolver is set. */\n workspaceRoot: string;\n /** Per-agent workspace root for attachments (optional; defaults to `workspaceRoot`). */\n getWorkspaceRootForSession?: (sessionKey: string) => string;\n /** Agent home (`…/agents/<id>/`) for inbound/TTS files — keeps internal state out of the markdown workspace. */\n getAgentInternalStorageRootForSession?: (sessionKey: string) => string;\n /** Fire-and-forget after full session persist (e.g. LLM session title); not called from mid-turn snapshots. */\n enqueueAutoTitle?: (sessionKey: string) => void;\n /** For per-turn timeout. */\n getConfig?: () => Config | undefined;\n /** Channel streaming: token/tool events from pi embedded session. */\n onEmbeddedStreamEvent?: (sessionKey: string, event: EmbeddedStreamEvent) => void;\n /** Called after a successful embedded turn with assistant plain text. */\n onEmbeddedTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n}\n\nexport class AgentOrchestrator {\n private agentManager: AgentManager;\n private sessionStore: SessionStore;\n private modelManager: ModelManager;\n private feedbackCoordinator: FeedbackCoordinator;\n private sessionConfigStore: SessionConfigStore;\n private sessionHydrator: SessionHydrator;\n private getThinkingDefault: () => ThinkLevel | undefined;\n private getThinkingDefaultForSession?: (sessionKey: string) => ThinkLevel | undefined;\n private enqueueAutoTitle?: (sessionKey: string) => void;\n private getConfig?: () => Config | undefined;\n private onEmbeddedStreamEvent?: (sessionKey: string, event: EmbeddedStreamEvent) => void;\n private onEmbeddedTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n\n constructor(config: AgentOrchestratorConfig) {\n this.agentManager = config.agentManager;\n this.sessionStore = config.sessionStore;\n this.modelManager = config.modelManager;\n this.feedbackCoordinator = config.feedbackCoordinator;\n this.sessionConfigStore = config.sessionConfigStore;\n this.sessionHydrator = config.sessionHydrator;\n this.getThinkingDefault = config.getThinkingDefault;\n this.getThinkingDefaultForSession = config.getThinkingDefaultForSession;\n this.enqueueAutoTitle = config.enqueueAutoTitle;\n this.getConfig = config.getConfig;\n this.onEmbeddedStreamEvent = config.onEmbeddedStreamEvent;\n this.onEmbeddedTurnComplete = config.onEmbeddedTurnComplete;\n }\n\n /**\n * Process a message through the agent orchestration pipeline\n */\n async process(msg: InboundMessage, context: SessionContext): Promise<void> {\n const { sessionKey } = context;\n\n log.debug({ sessionKey }, 'Processing message through agent orchestrator');\n\n await this.sessionHydrator.workspace(sessionKey);\n\n // Dreaming: short-circuit scheduled maintenance tokens into local runs.\n // This avoids spending LLM tokens for scheduled memory consolidation.\n if (\n typeof msg.content === 'string' &&\n (\n sessionKey.startsWith('cron:') ||\n sessionKey.includes(':cron:') ||\n sessionKey.includes(':automation:') ||\n context.channel === 'cron' ||\n context.channel === 'automation'\n )\n ) {\n const content = msg.content;\n const isDreamingSweep =\n content.includes(DREAMING_SWEEP_TOKEN) ||\n content.includes(DREAMING_LIGHT_SWEEP_TOKEN) ||\n content.includes(DREAMING_REM_SWEEP_TOKEN);\n\n if (isDreamingSweep) {\n const cfg = this.getConfig?.();\n if (!cfg) {\n log.warn({ sessionKey }, 'Dreaming sweep skipped: config unavailable');\n return;\n }\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const scope = resolveDreamingAgentScope(cfg, profile.agentId);\n const resolved = scope.config;\n const t0 = Date.now();\n\n if (content.includes(DREAMING_LIGHT_SWEEP_TOKEN)) {\n const result = await runLightSweep({\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: resolved.phases.light,\n });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'light',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n scannedEntries: result.scannedEntries, newSignals: result.newSignals, deduped: result.deduped,\n };\n await appendDreamingEvent(scope.memoriesDir, event);\n } else if (content.includes(DREAMING_REM_SWEEP_TOKEN)) {\n const result = await runRemPatterns({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: resolved.phases.rem,\n sensitiveWritePolicy: scope.memory.privacy?.sensitiveWritePolicy,\n promotionWritePolicy: resolved.promotionWritePolicy.decision,\n });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'rem',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n patternsDiscovered: result.patternsDiscovered, entriesAnalyzed: result.entriesAnalyzed,\n };\n await appendDreamingEvent(scope.memoriesDir, event);\n } else {\n const result = await runDreamingDeepPromotion({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: resolved.phases.deep,\n sensitiveWritePolicy: scope.memory.privacy?.sensitiveWritePolicy,\n memoryManager: this.agentManager.getMemoryManagerForSession(sessionKey),\n });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'deep',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n candidates: result.candidates, applied: result.applied,\n };\n await appendDreamingEvent(scope.memoriesDir, event);\n }\n return;\n }\n }\n\n try {\n await this.sessionHydrator.model(sessionKey);\n\n const channelSystemPrompt =\n typeof context.metadata?.channelSystemPrompt === 'string'\n ? context.metadata.channelSystemPrompt.trim()\n : '';\n if (channelSystemPrompt) {\n this.agentManager.getOrCreateAgent(sessionKey);\n this.agentManager.applyTurnChannelSystemPrompt(sessionKey, channelSystemPrompt);\n }\n\n const thinkingDefault =\n this.getThinkingDefaultForSession?.(sessionKey) ?? this.getThinkingDefault();\n const thinkingLevel = await resolveEffectiveThinkingLevel(\n this.sessionConfigStore,\n sessionKey,\n null,\n thinkingDefault,\n );\n this.agentManager.setThinkingLevel(sessionKey, thinkingLevel);\n\n const persistedAttachments = await persistInboundAttachments(msg.attachments);\n const modelRef = this.modelManager.getModelForSession(sessionKey);\n const userMessage = await buildTranscriptUserMessage({\n text: msg.content,\n prepared: persistedAttachments,\n sessionKey,\n modelRef,\n config: this.getConfig?.(),\n agentManager: this.agentManager,\n });\n setPendingTranscriptUserMessage(sessionKey, userMessage);\n\n const userPlainForMemory = extractAgentUserPlainText(userMessage);\n const userContext = await this.agentManager.prepareUserTurnContext(\n userMessage,\n sessionKey,\n );\n const userMessageForModel = userContext.modelMessage;\n\n const llmTurn = await hydrateUserTurnForLlm({\n message: userMessage,\n modelRef,\n });\n\n this.feedbackCoordinator.startTask();\n\n const turnResult = await (async () => {\n try {\n return await runEmbeddedTurnForSession({\n sessionKey,\n userMessage: userMessageForModel,\n llmImages: llmTurn.images,\n sessionStore: this.sessionStore,\n agentManager: this.agentManager,\n modelManager: this.modelManager,\n thinkingOverride: thinkingLevel,\n getConfig: this.getConfig,\n beforeTurn: () => this.agentManager.beginBackgroundReviewUserTurn(sessionKey),\n onEvent: (event) => this.onEmbeddedStreamEvent?.(sessionKey, event),\n });\n } finally {\n clearPendingTranscriptUserMessage(sessionKey, userMessage);\n }\n })();\n\n await this.agentManager.afterAgentTurn(sessionKey, userPlainForMemory);\n this.agentManager.scheduleBackgroundReviewAfterUserTurn(sessionKey);\n\n if (turnResult.ok) {\n this.onEmbeddedTurnComplete?.(sessionKey, turnResult.lastAssistantText);\n this.enqueueAutoTitle?.(sessionKey);\n } else if (turnResult.errorMessage) {\n log.warn({ sessionKey, errorMessage: turnResult.errorMessage }, 'Embedded inbound turn failed');\n }\n\n this.feedbackCoordinator.endTask();\n\n } catch (error) {\n log.error({ err: error, sessionKey }, 'Error in agent orchestration');\n this.feedbackCoordinator.endTask();\n throw error;\n }\n }\n\n /**\n * Get the current agent model ID\n */\n getCurrentModel(): string {\n return this.modelManager.getCurrentModel();\n }\n\n /**\n * Check if agent is currently processing for a session\n */\n isProcessing(sessionKey: string): boolean {\n const agent = this.agentManager.getAgent(sessionKey);\n if (!agent) {\n return false;\n }\n return agent.state.messages.length > 0;\n }\n\n /**\n * Abort current agent execution for a session\n */\n abort(sessionKey: string): void {\n void abortEmbeddedRun(sessionKey);\n const agent = this.agentManager.getAgent(sessionKey);\n agent?.abort();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"agent-orchestrator.js","names":[],"sources":["../../../../src/agent/orchestration/agent-orchestrator.ts"],"sourcesContent":["/**\n * Agent Orchestrator - Coordinates Agent execution flow\n *\n * Manages the complete agent execution pipeline from message processing\n * to response generation.\n */\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveEffectiveAgentProfileForSession } from '../../config/agent-profile.js';\nimport type { InboundMessage } from '../../infra/bus/index.js';\nimport type { SessionConfigStore, SessionStore } from '../../session/index.js';\nimport type { SessionHydrator } from '../session/index.js';\nimport { resolveEffectiveThinkingLevel } from '../../session/thinking-resolve.js';\nimport type { ThinkLevel } from '../transcript/thinking-types.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { SessionContext } from '../session/session-context.js';\nimport type { AgentEventHandler } from './agent-event-handler.js';\nimport type { FeedbackCoordinator } from '../feedback/feedback-coordinator.js';\nimport type { AgentManager } from '../agent-manager.js';\nimport { createLogger } from '../../utils/logger.js';\nimport { extractAgentUserPlainText } from '../memory/user-message-text.js';\nimport { abortEmbeddedRun } from '../embedded/runs.js';\nimport { runEmbeddedTurnForSession } from '../embedded/run-for-session.js';\nimport type { EmbeddedStreamEvent } from '../embedded/types.js';\nimport { persistInboundAttachments } from '../../channels/attachments/inbound-persist.js';\nimport {\n buildTranscriptUserMessage,\n clearPendingTranscriptUserMessage,\n hydrateUserTurnForLlm,\n setPendingTranscriptUserMessage,\n} from '../inbound/attachment-pipeline.js';\nimport {\n DREAMING_SWEEP_TOKEN,\n DREAMING_LIGHT_SWEEP_TOKEN,\n DREAMING_REM_SWEEP_TOKEN,\n} from '../memory/dreaming/constants.js';\nimport { runDreamingDeepPromotion } from '../memory/dreaming/deep-promotion.js';\nimport { appendDreamingEvent, type DreamingEvent } from '../memory/dreaming/events.js';\nimport { runLightSweep } from '../memory/dreaming/light-sweep.js';\nimport { runRemPatterns } from '../memory/dreaming/rem-patterns.js';\nimport { resolveDreamingAgentScope } from '../memory/dreaming/scope.js';\n\nconst log = createLogger('AgentOrchestrator');\n\nexport interface AgentOrchestratorConfig {\n agentManager: AgentManager;\n sessionStore: SessionStore;\n modelManager: ModelManager;\n eventHandler: AgentEventHandler;\n feedbackCoordinator: FeedbackCoordinator;\n sessionConfigStore: SessionConfigStore;\n /** Per-session hydration (workspace override + model override) before the agent runs. */\n sessionHydrator: SessionHydrator;\n getThinkingDefault: () => ThinkLevel | undefined;\n /** Per-session default from merged `agents.list` / defaults (optional). */\n getThinkingDefaultForSession?: (sessionKey: string) => ThinkLevel | undefined;\n /** Default workspace root when no per-session resolver is set. */\n workspaceRoot: string;\n /** Per-agent workspace root for attachments (optional; defaults to `workspaceRoot`). */\n getWorkspaceRootForSession?: (sessionKey: string) => string;\n /** Agent home (`…/agents/<id>/`) for inbound/TTS files — keeps internal state out of the markdown workspace. */\n getAgentInternalStorageRootForSession?: (sessionKey: string) => string;\n /** Fire-and-forget after full session persist (e.g. LLM session title); not called from mid-turn snapshots. */\n enqueueAutoTitle?: (sessionKey: string) => void;\n /** For per-turn timeout. */\n getConfig?: () => Config | undefined;\n /** Channel streaming: token/tool events from pi embedded session. */\n onEmbeddedStreamEvent?: (sessionKey: string, event: EmbeddedStreamEvent) => void;\n /** Called after a successful embedded turn with assistant plain text. */\n onEmbeddedTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n}\n\nexport class AgentOrchestrator {\n private agentManager: AgentManager;\n private sessionStore: SessionStore;\n private modelManager: ModelManager;\n private feedbackCoordinator: FeedbackCoordinator;\n private sessionConfigStore: SessionConfigStore;\n private sessionHydrator: SessionHydrator;\n private getThinkingDefault: () => ThinkLevel | undefined;\n private getThinkingDefaultForSession?: (sessionKey: string) => ThinkLevel | undefined;\n private enqueueAutoTitle?: (sessionKey: string) => void;\n private getConfig?: () => Config | undefined;\n private onEmbeddedStreamEvent?: (sessionKey: string, event: EmbeddedStreamEvent) => void;\n private onEmbeddedTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n\n constructor(config: AgentOrchestratorConfig) {\n this.agentManager = config.agentManager;\n this.sessionStore = config.sessionStore;\n this.modelManager = config.modelManager;\n this.feedbackCoordinator = config.feedbackCoordinator;\n this.sessionConfigStore = config.sessionConfigStore;\n this.sessionHydrator = config.sessionHydrator;\n this.getThinkingDefault = config.getThinkingDefault;\n this.getThinkingDefaultForSession = config.getThinkingDefaultForSession;\n this.enqueueAutoTitle = config.enqueueAutoTitle;\n this.getConfig = config.getConfig;\n this.onEmbeddedStreamEvent = config.onEmbeddedStreamEvent;\n this.onEmbeddedTurnComplete = config.onEmbeddedTurnComplete;\n }\n\n /**\n * Process a message through the agent orchestration pipeline\n */\n async process(msg: InboundMessage, context: SessionContext): Promise<void> {\n const { sessionKey } = context;\n\n log.debug({ sessionKey }, 'Processing message through agent orchestrator');\n\n await this.sessionHydrator.workspace(sessionKey);\n\n // Dreaming: short-circuit scheduled maintenance tokens into local runs.\n // This avoids spending LLM tokens for scheduled memory consolidation.\n if (\n typeof msg.content === 'string' &&\n (\n sessionKey.startsWith('cron:') ||\n sessionKey.includes(':cron:') ||\n sessionKey.includes(':automation:') ||\n context.channel === 'cron' ||\n context.channel === 'automation'\n )\n ) {\n const content = msg.content;\n const isDreamingSweep =\n content.includes(DREAMING_SWEEP_TOKEN) ||\n content.includes(DREAMING_LIGHT_SWEEP_TOKEN) ||\n content.includes(DREAMING_REM_SWEEP_TOKEN);\n\n if (isDreamingSweep) {\n const cfg = this.getConfig?.();\n if (!cfg) {\n log.warn({ sessionKey }, 'Dreaming sweep skipped: config unavailable');\n return;\n }\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const scope = resolveDreamingAgentScope(cfg, profile.agentId);\n const resolved = scope.config;\n const t0 = Date.now();\n\n if (content.includes(DREAMING_LIGHT_SWEEP_TOKEN)) {\n const result = await runLightSweep({\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: resolved.phases.light,\n });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'light',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n scannedEntries: result.scannedEntries, newSignals: result.newSignals, deduped: result.deduped,\n };\n await appendDreamingEvent(scope.memoriesDir, event);\n } else if (content.includes(DREAMING_REM_SWEEP_TOKEN)) {\n const result = await runRemPatterns({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: resolved.phases.rem,\n sensitiveWritePolicy: cfg.userContext.privacy.sensitiveWritePolicy,\n promotionWritePolicy: resolved.promotionWritePolicy.decision,\n });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'rem',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n patternsDiscovered: result.patternsDiscovered, entriesAnalyzed: result.entriesAnalyzed,\n };\n await appendDreamingEvent(scope.memoriesDir, event);\n } else {\n const result = await runDreamingDeepPromotion({\n agentId: scope.agentId,\n workspaceDir: scope.workspaceDir,\n dreamingRoot: scope.memoriesDir,\n config: resolved.phases.deep,\n sensitiveWritePolicy: cfg.userContext.privacy.sensitiveWritePolicy,\n memoryManager: this.agentManager.getMemoryManagerForSession(sessionKey),\n });\n const event: DreamingEvent = {\n timestamp: new Date().toISOString(), phase: 'deep',\n ok: result.ok, reason: result.reason, durationMs: Date.now() - t0,\n candidates: result.candidates, applied: result.applied,\n };\n await appendDreamingEvent(scope.memoriesDir, event);\n }\n return;\n }\n }\n\n try {\n await this.sessionHydrator.model(sessionKey);\n\n const channelSystemPrompt =\n typeof context.metadata?.channelSystemPrompt === 'string'\n ? context.metadata.channelSystemPrompt.trim()\n : '';\n if (channelSystemPrompt) {\n this.agentManager.getOrCreateAgent(sessionKey);\n this.agentManager.applyTurnChannelSystemPrompt(sessionKey, channelSystemPrompt);\n }\n\n const thinkingDefault =\n this.getThinkingDefaultForSession?.(sessionKey) ?? this.getThinkingDefault();\n const thinkingLevel = await resolveEffectiveThinkingLevel(\n this.sessionConfigStore,\n sessionKey,\n null,\n thinkingDefault,\n );\n this.agentManager.setThinkingLevel(sessionKey, thinkingLevel);\n\n const persistedAttachments = await persistInboundAttachments(msg.attachments);\n const modelRef = this.modelManager.getModelForSession(sessionKey);\n const userMessage = await buildTranscriptUserMessage({\n text: msg.content,\n prepared: persistedAttachments,\n sessionKey,\n modelRef,\n config: this.getConfig?.(),\n agentManager: this.agentManager,\n });\n setPendingTranscriptUserMessage(sessionKey, userMessage);\n\n const userPlainForMemory = extractAgentUserPlainText(userMessage);\n const userContext = await this.agentManager.prepareUserTurnContext(\n userMessage,\n sessionKey,\n );\n const userMessageForModel = userContext.modelMessage;\n\n const llmTurn = await hydrateUserTurnForLlm({\n message: userMessage,\n modelRef,\n });\n\n this.feedbackCoordinator.startTask();\n\n const turnResult = await (async () => {\n try {\n return await runEmbeddedTurnForSession({\n sessionKey,\n userMessage: userMessageForModel,\n llmImages: llmTurn.images,\n sessionStore: this.sessionStore,\n agentManager: this.agentManager,\n modelManager: this.modelManager,\n thinkingOverride: thinkingLevel,\n getConfig: this.getConfig,\n beforeTurn: () => this.agentManager.beginBackgroundReviewUserTurn(sessionKey),\n onEvent: (event) => this.onEmbeddedStreamEvent?.(sessionKey, event),\n });\n } finally {\n clearPendingTranscriptUserMessage(sessionKey, userMessage);\n }\n })();\n\n await this.agentManager.afterAgentTurn(sessionKey, userPlainForMemory);\n this.agentManager.scheduleBackgroundReviewAfterUserTurn(sessionKey);\n\n if (turnResult.ok) {\n this.onEmbeddedTurnComplete?.(sessionKey, turnResult.lastAssistantText);\n this.enqueueAutoTitle?.(sessionKey);\n } else if (turnResult.errorMessage) {\n log.warn({ sessionKey, errorMessage: turnResult.errorMessage }, 'Embedded inbound turn failed');\n }\n\n this.feedbackCoordinator.endTask();\n\n } catch (error) {\n log.error({ err: error, sessionKey }, 'Error in agent orchestration');\n this.feedbackCoordinator.endTask();\n throw error;\n }\n }\n\n /**\n * Get the current agent model ID\n */\n getCurrentModel(): string {\n return this.modelManager.getCurrentModel();\n }\n\n /**\n * Check if agent is currently processing for a session\n */\n isProcessing(sessionKey: string): boolean {\n const agent = this.agentManager.getAgent(sessionKey);\n if (!agent) {\n return false;\n }\n return agent.state.messages.length > 0;\n }\n\n /**\n * Abort current agent execution for a session\n */\n abort(sessionKey: string): void {\n void abortEmbeddedRun(sessionKey);\n const agent = this.agentManager.getAgent(sessionKey);\n agent?.abort();\n }\n}\n"],"mappings":"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"}
@@ -7,11 +7,10 @@ interface MemoryMatch {
7
7
  export interface MemorySearchOptions {
8
8
  maxResults?: number;
9
9
  minScore?: number;
10
- /** Absolute path to agent-scoped curated memories dir (MEMORY.md). */
10
+ /** Absolute path to the shared curated memories dir (MEMORY.md). */
11
11
  memoriesDir?: string;
12
12
  /** Absolute path to global user memory (`~/.xopc/user/MEMORY.md`). */
13
13
  userMemoryPath?: string;
14
- agentId?: string;
15
14
  }
16
15
  export declare function memorySearch(baseDir: string, query: string, options?: MemorySearchOptions): Promise<MemoryMatch[]>;
17
16
  export declare function memoryGet(baseDir: string, path: string, from?: number, lines?: number, memoriesDir?: string, userMemoryPath?: string): {
@@ -1,7 +1,8 @@
1
1
  import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
3
  import { requireXopcDatabase } from "../../../storage/sqlite/connection.js";
4
- import { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex } from "../../../storage/sqlite/memory-index-repository.js";
4
+ import { searchMemoryIndex, syncMemoryIndex } from "../../../storage/sqlite/memory-index-repository.js";
5
+ import { LOCAL_USER_ID } from "../../../user-context/owner.js";
5
6
  import "../../../storage/sqlite/index.js";
6
7
  import { join, relative } from "path";
7
8
  import { existsSync, readFileSync } from "fs";
@@ -38,18 +39,17 @@ function fallbackMemorySearch(baseDir, query, options) {
38
39
  return matches.slice(0, options.maxResults);
39
40
  }
40
41
  async function memorySearch(baseDir, query, options = {}) {
41
- const { maxResults = 5, minScore = .3, memoriesDir, userMemoryPath, agentId } = options;
42
- const resolvedAgentId = agentId ?? resolveAgentIdFromMemoriesDir(memoriesDir);
42
+ const { maxResults = 5, minScore = .3, memoriesDir, userMemoryPath } = options;
43
43
  try {
44
44
  ensureMemoryDatabase();
45
45
  syncMemoryIndex({
46
- agentId: resolvedAgentId,
46
+ userId: LOCAL_USER_ID,
47
47
  workspaceDir: baseDir,
48
48
  memoriesDir,
49
49
  userMemoryPath
50
50
  });
51
51
  return searchMemoryIndex({
52
- agentId: resolvedAgentId,
52
+ userId: LOCAL_USER_ID,
53
53
  query,
54
54
  maxResults,
55
55
  minScore
@@ -63,8 +63,7 @@ async function memorySearch(baseDir, query, options = {}) {
63
63
  const em = err instanceof Error ? err.message : String(err);
64
64
  log.warn({
65
65
  err,
66
- errorMessage: em,
67
- agentId: resolvedAgentId
66
+ errorMessage: em
68
67
  }, `Memory FTS search failed: ${em}`);
69
68
  return fallbackMemorySearch(baseDir, query, {
70
69
  maxResults,
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../../../../src/agent/prompt/memory/index.ts"],"sourcesContent":["// Memory Search - FTS-backed recall with markdown file reads for snippets\nimport { readFileSync, existsSync } from 'fs';\nimport { join, relative } from 'path';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport {\n requireXopcDatabase,\n resolveAgentIdFromMemoriesDir,\n searchMemoryIndex,\n syncMemoryIndex,\n} from '../../../storage/sqlite/index.js';\n\nconst log = createLogger('MemorySearch');\n\n// =============================================================================\n// Types (Internal)\n// =============================================================================\n\ninterface MemoryMatch {\n file: string;\n lines: string;\n score: number;\n lineNumbers: number[];\n}\n\nexport interface MemorySearchOptions {\n maxResults?: number;\n minScore?: number;\n /** Absolute path to agent-scoped curated memories dir (MEMORY.md). */\n memoriesDir?: string;\n /** Absolute path to global user memory (`~/.xopc/user/MEMORY.md`). */\n userMemoryPath?: string;\n agentId?: string;\n}\n\nconst AGENT_MEMORY_FILENAME = 'MEMORY.md';\nconst USER_MEMORY_DISPLAY_PATH = 'user/MEMORY.md';\n\nfunction ensureMemoryDatabase(): void {\n requireXopcDatabase();\n}\n\nfunction fallbackMemorySearch(\n baseDir: string,\n query: string,\n options: Required<Pick<MemorySearchOptions, 'maxResults' | 'minScore'>> &\n Pick<MemorySearchOptions, 'memoriesDir' | 'userMemoryPath'>,\n): MemoryMatch[] {\n const normalizedQuery = query.trim().toLowerCase();\n if (!normalizedQuery) return [];\n\n const memoriesDir = options.memoriesDir;\n const curatedPaths = [\n ...(memoriesDir ? [join(memoriesDir, AGENT_MEMORY_FILENAME)].filter((path) => existsSync(path)) : []),\n ...(options.userMemoryPath && existsSync(options.userMemoryPath) ? [options.userMemoryPath] : []),\n ];\n const candidatePaths = [...curatedPaths, join(baseDir, 'MEMORY.md')].filter((path) => existsSync(path));\n\n const matches: MemoryMatch[] = [];\n for (const path of candidatePaths) {\n const content = readFileSync(path, 'utf-8');\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.toLowerCase().includes(normalizedQuery)) continue;\n const score = 1;\n if (score < options.minScore) continue;\n const file =\n options.userMemoryPath && path === options.userMemoryPath\n ? USER_MEMORY_DISPLAY_PATH\n : memoriesDir && path.startsWith(memoriesDir)\n ? path.slice(memoriesDir.length).replace(/^[/\\\\]/, '')\n : relative(baseDir, path).replace(/\\\\/g, '/');\n matches.push({ file, lines: line, score, lineNumbers: [i + 1] });\n }\n }\n\n return matches.slice(0, options.maxResults);\n}\n\n// =============================================================================\n// Main Search Function (Exported)\n// =============================================================================\n\nexport async function memorySearch(\n baseDir: string,\n query: string,\n options: MemorySearchOptions = {},\n): Promise<MemoryMatch[]> {\n const { maxResults = 5, minScore = 0.3, memoriesDir, userMemoryPath, agentId } = options;\n const resolvedAgentId = agentId ?? resolveAgentIdFromMemoriesDir(memoriesDir);\n\n try {\n ensureMemoryDatabase();\n syncMemoryIndex({ agentId: resolvedAgentId, workspaceDir: baseDir, memoriesDir, userMemoryPath });\n const hits = searchMemoryIndex({\n agentId: resolvedAgentId,\n query,\n maxResults,\n minScore,\n });\n return hits.map((hit) => ({\n file: hit.path,\n lines: hit.lines,\n score: hit.score,\n lineNumbers: hit.lineNumbers,\n }));\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, errorMessage: em, agentId: resolvedAgentId }, `Memory FTS search failed: ${em}`);\n return fallbackMemorySearch(baseDir, query, { maxResults, minScore, memoriesDir, userMemoryPath });\n }\n}\n\n// =============================================================================\n// Memory Get (Read Snippet) (Exported)\n// =============================================================================\n\nexport function memoryGet(\n baseDir: string,\n path: string,\n from?: number,\n lines?: number,\n memoriesDir?: string,\n userMemoryPath?: string,\n): { content: string; lineNumbers: { start: number; end: number } } | null {\n let fullPath = path.startsWith('/') ? path : join(baseDir, path);\n\n if (!existsSync(fullPath)) {\n const normalized = path.replace(/\\\\/g, '/');\n if (normalized === USER_MEMORY_DISPLAY_PATH && userMemoryPath && existsSync(userMemoryPath)) {\n fullPath = userMemoryPath;\n } else if (memoriesDir) {\n const segments = normalized.split('/');\n const filename = segments.pop() ?? normalized;\n if (filename === AGENT_MEMORY_FILENAME) {\n const candidatePath = join(memoriesDir, AGENT_MEMORY_FILENAME);\n if (existsSync(candidatePath)) {\n fullPath = candidatePath;\n }\n }\n }\n }\n\n if (!existsSync(fullPath)) {\n return null;\n }\n\n const content = readFileSync(fullPath, 'utf-8');\n const allLines = content.split('\\n');\n\n const start = from || 1;\n const count = lines || 10;\n const end = Math.min(start + count - 1, allLines.length);\n\n const snippet = allLines.slice(start - 1, end).join('\\n');\n\n return {\n content: snippet,\n lineNumbers: { start, end },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../src/agent/prompt/memory/index.ts"],"sourcesContent":["// Memory Search - FTS-backed recall with markdown file reads for snippets\nimport { readFileSync, existsSync } from 'fs';\nimport { join, relative } from 'path';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport {\n requireXopcDatabase,\n searchMemoryIndex,\n syncMemoryIndex,\n} from '../../../storage/sqlite/index.js';\nimport { LOCAL_USER_ID } from '../../../user-context/owner.js';\n\nconst log = createLogger('MemorySearch');\n\n// =============================================================================\n// Types (Internal)\n// =============================================================================\n\ninterface MemoryMatch {\n file: string;\n lines: string;\n score: number;\n lineNumbers: number[];\n}\n\nexport interface MemorySearchOptions {\n maxResults?: number;\n minScore?: number;\n /** Absolute path to the shared curated memories dir (MEMORY.md). */\n memoriesDir?: string;\n /** Absolute path to global user memory (`~/.xopc/user/MEMORY.md`). */\n userMemoryPath?: string;\n}\n\nconst AGENT_MEMORY_FILENAME = 'MEMORY.md';\nconst USER_MEMORY_DISPLAY_PATH = 'user/MEMORY.md';\n\nfunction ensureMemoryDatabase(): void {\n requireXopcDatabase();\n}\n\nfunction fallbackMemorySearch(\n baseDir: string,\n query: string,\n options: Required<Pick<MemorySearchOptions, 'maxResults' | 'minScore'>> &\n Pick<MemorySearchOptions, 'memoriesDir' | 'userMemoryPath'>,\n): MemoryMatch[] {\n const normalizedQuery = query.trim().toLowerCase();\n if (!normalizedQuery) return [];\n\n const memoriesDir = options.memoriesDir;\n const curatedPaths = [\n ...(memoriesDir ? [join(memoriesDir, AGENT_MEMORY_FILENAME)].filter((path) => existsSync(path)) : []),\n ...(options.userMemoryPath && existsSync(options.userMemoryPath) ? [options.userMemoryPath] : []),\n ];\n const candidatePaths = [...curatedPaths, join(baseDir, 'MEMORY.md')].filter((path) => existsSync(path));\n\n const matches: MemoryMatch[] = [];\n for (const path of candidatePaths) {\n const content = readFileSync(path, 'utf-8');\n const lines = content.split('\\n');\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i];\n if (!line.toLowerCase().includes(normalizedQuery)) continue;\n const score = 1;\n if (score < options.minScore) continue;\n const file =\n options.userMemoryPath && path === options.userMemoryPath\n ? USER_MEMORY_DISPLAY_PATH\n : memoriesDir && path.startsWith(memoriesDir)\n ? path.slice(memoriesDir.length).replace(/^[/\\\\]/, '')\n : relative(baseDir, path).replace(/\\\\/g, '/');\n matches.push({ file, lines: line, score, lineNumbers: [i + 1] });\n }\n }\n\n return matches.slice(0, options.maxResults);\n}\n\n// =============================================================================\n// Main Search Function (Exported)\n// =============================================================================\n\nexport async function memorySearch(\n baseDir: string,\n query: string,\n options: MemorySearchOptions = {},\n): Promise<MemoryMatch[]> {\n const { maxResults = 5, minScore = 0.3, memoriesDir, userMemoryPath } = options;\n\n try {\n ensureMemoryDatabase();\n syncMemoryIndex({ userId: LOCAL_USER_ID, workspaceDir: baseDir, memoriesDir, userMemoryPath });\n const hits = searchMemoryIndex({\n userId: LOCAL_USER_ID,\n query,\n maxResults,\n minScore,\n });\n return hits.map((hit) => ({\n file: hit.path,\n lines: hit.lines,\n score: hit.score,\n lineNumbers: hit.lineNumbers,\n }));\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, errorMessage: em }, `Memory FTS search failed: ${em}`);\n return fallbackMemorySearch(baseDir, query, { maxResults, minScore, memoriesDir, userMemoryPath });\n }\n}\n\n// =============================================================================\n// Memory Get (Read Snippet) (Exported)\n// =============================================================================\n\nexport function memoryGet(\n baseDir: string,\n path: string,\n from?: number,\n lines?: number,\n memoriesDir?: string,\n userMemoryPath?: string,\n): { content: string; lineNumbers: { start: number; end: number } } | null {\n let fullPath = path.startsWith('/') ? path : join(baseDir, path);\n\n if (!existsSync(fullPath)) {\n const normalized = path.replace(/\\\\/g, '/');\n if (normalized === USER_MEMORY_DISPLAY_PATH && userMemoryPath && existsSync(userMemoryPath)) {\n fullPath = userMemoryPath;\n } else if (memoriesDir) {\n const segments = normalized.split('/');\n const filename = segments.pop() ?? normalized;\n if (filename === AGENT_MEMORY_FILENAME) {\n const candidatePath = join(memoriesDir, AGENT_MEMORY_FILENAME);\n if (existsSync(candidatePath)) {\n fullPath = candidatePath;\n }\n }\n }\n }\n\n if (!existsSync(fullPath)) {\n return null;\n }\n\n const content = readFileSync(fullPath, 'utf-8');\n const allLines = content.split('\\n');\n\n const start = from || 1;\n const count = lines || 10;\n const end = Math.min(start + count - 1, allLines.length);\n\n const snippet = allLines.slice(start - 1, end).join('\\n');\n\n return {\n content: snippet,\n lineNumbers: { start, end },\n };\n}\n"],"mappings":"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"}
@@ -62,7 +62,7 @@ const CORE_TOOL_SUMMARIES = {
62
62
  memory_search: "Semantic search over indexed memory sources",
63
63
  memory_get: "Read specific lines from memory sources returned by search",
64
64
  session_search: "Search other chat sessions or list recent sessions",
65
- curated_memory: "Read/write structured notes under agent home memories/",
65
+ curated_memory: "Read/write structured notes in the shared user memory store/",
66
66
  session_status: "Show session usage/time/model state",
67
67
  tool_manual: "Load built-in usage manuals for complex tools",
68
68
  delegate_task: "Spawn an isolated sub-agent for a delegated task",
@@ -1 +1 @@
1
- {"version":3,"file":"tooling.js","names":[],"sources":["../../../../../src/agent/prompt/sections/tooling.ts"],"sourcesContent":["const CORE_TOOL_ORDER = [\n 'code_search',\n 'code_read_symbol',\n 'code_trace',\n 'code_impact',\n 'code_architecture',\n 'read_file',\n 'write_file',\n 'apply_patch',\n 'grep',\n 'find',\n 'list_dir',\n 'exec_command',\n 'update_plan',\n 'web_search',\n 'web_fetch',\n 'web_extract',\n 'browser_use',\n 'send_message',\n 'send_media',\n 'memory_search',\n 'memory_get',\n 'session_search',\n 'curated_memory',\n 'session_status',\n 'tool_manual',\n 'delegate_task',\n 'workflow',\n 'automation',\n 'skills_list',\n 'skill_view',\n 'skill_manage',\n 'todo',\n 'clarify',\n 'text_to_speech',\n 'image',\n 'image_generate',\n 'create_share',\n 'execute_code',\n] as const;\n\nconst CORE_TOOL_SUMMARIES: Record<string, string> = {\n code_search: 'Find definitions, implementations, routes, types, and structurally important symbols',\n code_read_symbol: 'Read exact source for a graph symbol before editing',\n code_trace: 'Trace callers, callees, data flow, and cross-service paths',\n code_impact: 'Map git changes to affected symbols and blast radius',\n code_architecture: 'Map packages, boundaries, layers, entry points, hotspots, and clusters',\n read_file: 'Read targeted file contents before editing',\n write_file: 'Create new files or intentional complete rewrites; prefer apply_patch for code changes',\n apply_patch: 'Apply source edits with patches that begin exactly with *** Begin Patch and end exactly with *** End Patch',\n grep: 'Search file contents for literals, errors, config values, and docs',\n find: 'Find files by glob pattern',\n list_dir: 'List directory contents',\n exec_command: 'Run tests, type checks, builds, package scripts, and safe inspection commands',\n update_plan: 'Keep the current multi-step coding plan visible and accurate',\n web_search: 'Search the web',\n web_fetch: 'Fetch and extract readable content from a URL',\n web_extract: 'Extract structured content from a URL',\n browser_use: 'Control the configured browser',\n send_message: 'Send messages to the current channel',\n send_media: 'Send media attachments to the current channel',\n memory_search: 'Semantic search over indexed memory sources',\n memory_get: 'Read specific lines from memory sources returned by search',\n session_search: 'Search other chat sessions or list recent sessions',\n curated_memory: 'Read/write structured notes under agent home memories/',\n session_status: 'Show session usage/time/model state',\n tool_manual: 'Load built-in usage manuals for complex tools',\n delegate_task: 'Spawn an isolated sub-agent for a delegated task',\n workflow: 'Start a persisted multi-phase workflow run',\n automation: 'Manage product automations',\n skills_list: 'List available skills',\n skill_view: 'Load a skill SKILL.md or sub-documents',\n skill_manage: 'Create or update skills on disk',\n todo: 'Manage in-session todo items',\n clarify: 'Ask the user a blocking clarification question',\n text_to_speech: 'Send a standalone voice message',\n image: 'Analyze an image with the configured vision model',\n image_generate: 'Generate images with the configured image model',\n create_share: 'Create a shareable link for workspace files',\n execute_code: 'Run code in a sandbox with a restricted tool subset',\n};\n\nexport function buildToolingSection(params: {\n toolNames?: string[];\n toolSummaries?: Record<string, string>;\n}): string {\n const rawToolNames = (params.toolNames ?? []).map((tool) => tool.trim()).filter(Boolean);\n const canonicalByNormalized = new Map<string, string>();\n for (const name of rawToolNames) {\n const normalized = name.toLowerCase();\n if (!canonicalByNormalized.has(normalized)) {\n canonicalByNormalized.set(normalized, name);\n }\n }\n const resolveToolName = (normalized: string) =>\n canonicalByNormalized.get(normalized) ?? normalized;\n\n const normalizedTools = rawToolNames.map((tool) => tool.toLowerCase());\n const availableTools = new Set(normalizedTools);\n\n const externalToolSummaries = new Map<string, string>();\n for (const [key, value] of Object.entries(params.toolSummaries ?? {})) {\n const normalized = key.trim().toLowerCase();\n if (!normalized || !value?.trim()) {\n continue;\n }\n externalToolSummaries.set(normalized, value.trim());\n }\n\n const extraTools = Array.from(\n new Set(normalizedTools.filter((tool) => !CORE_TOOL_ORDER.includes(tool as (typeof CORE_TOOL_ORDER)[number]))),\n );\n const enabledTools = CORE_TOOL_ORDER.filter((tool) => availableTools.has(tool));\n const toolLines = enabledTools.map((tool) => {\n const summary = CORE_TOOL_SUMMARIES[tool] ?? externalToolSummaries.get(tool);\n const name = resolveToolName(tool);\n return summary ? `- ${name}: ${summary}` : `- ${name}`;\n });\n for (const tool of extraTools.toSorted()) {\n const summary = CORE_TOOL_SUMMARIES[tool] ?? externalToolSummaries.get(tool);\n const name = resolveToolName(tool);\n toolLines.push(summary ? `- ${name}: ${summary}` : `- ${name}`);\n }\n\n const execToolName = resolveToolName('exec_command');\n const planToolName = resolveToolName('update_plan');\n const readToolName = resolveToolName('read_file');\n const patchToolName = resolveToolName('apply_patch');\n const writeToolName = resolveToolName('write_file');\n const grepToolName = resolveToolName('grep');\n const findToolName = resolveToolName('find');\n const hasDelegate = availableTools.has('delegate_task');\n const hasWorkflow = availableTools.has('workflow');\n const hasToolManual = availableTools.has('tool_manual');\n const hasRead = availableTools.has('read_file');\n const hasPatch = availableTools.has('apply_patch');\n const hasWrite = availableTools.has('write_file');\n const hasGrep = availableTools.has('grep');\n const hasFind = availableTools.has('find');\n const hasExec = availableTools.has('exec_command');\n const hasPlan = availableTools.has('update_plan');\n\n const orchestrationLines: string[] = [];\n if (hasDelegate) {\n orchestrationLines.push(\n '- Sub-agent delegation → use `delegate_task(goal, context?, toolset?)` for focused parallel work; results return to you automatically.',\n );\n }\n if (hasWorkflow) {\n orchestrationLines.push(\n '- Multi-phase workflows → use `workflow` to start persisted runs with subagents when a script defines phases.',\n );\n }\n\n return [\n '## Tooling',\n 'Tool availability (filtered by policy):',\n 'Tool names are case-sensitive. Call tools exactly as listed.',\n toolLines.length > 0\n ? toolLines.join('\\n')\n : '- No tools are registered for this session.',\n `For long waits, avoid rapid poll loops: use \\`${execToolName}\\` with a sufficient timeout or poll in reasonable intervals.`,\n hasRead\n ? `Use \\`${readToolName}\\` for targeted file inspection before editing; do not rely on filenames alone.`\n : '',\n hasPatch\n ? `Use \\`${patchToolName}\\` for source changes; keep patches focused and inspect failures carefully.`\n : '',\n hasWrite\n ? `Use \\`${writeToolName}\\` only for new files or intentional complete rewrites.`\n : '',\n hasGrep || hasFind\n ? `Use ${[\n hasGrep ? `\\`${grepToolName}\\`` : '',\n hasFind ? `\\`${findToolName}\\`` : '',\n ].filter(Boolean).join(' and ')} for text/file discovery; use code graph or symbol tools when available for definitions and call relationships.`\n : '',\n hasExec\n ? `Use \\`${execToolName}\\` for verification and safe inspection, not routine file editing.`\n : '',\n hasPlan\n ? `Use \\`${planToolName}\\` for multi-step coding work: keep exactly one active step when work is in progress, and update it after meaningful progress or review.`\n : '',\n hasToolManual\n ? 'Some complex tools have built-in manuals. Use `tool_manual(tool)` before non-trivial use.'\n : '',\n hasDelegate\n ? 'If a task is complex or long-running, delegate it. Completion is push-based: the sub-agent result returns when done.'\n : '',\n ...orchestrationLines,\n 'Do not poll delegate/workflow status in a tight loop; check on-demand or wait for completion.',\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\nexport function hasSkillsTools(toolNames: string[]): boolean {\n const normalized = new Set(toolNames.map((t) => t.toLowerCase()));\n return normalized.has('skills_list') || normalized.has('skill_view');\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tooling.js","names":[],"sources":["../../../../../src/agent/prompt/sections/tooling.ts"],"sourcesContent":["const CORE_TOOL_ORDER = [\n 'code_search',\n 'code_read_symbol',\n 'code_trace',\n 'code_impact',\n 'code_architecture',\n 'read_file',\n 'write_file',\n 'apply_patch',\n 'grep',\n 'find',\n 'list_dir',\n 'exec_command',\n 'update_plan',\n 'web_search',\n 'web_fetch',\n 'web_extract',\n 'browser_use',\n 'send_message',\n 'send_media',\n 'memory_search',\n 'memory_get',\n 'session_search',\n 'curated_memory',\n 'session_status',\n 'tool_manual',\n 'delegate_task',\n 'workflow',\n 'automation',\n 'skills_list',\n 'skill_view',\n 'skill_manage',\n 'todo',\n 'clarify',\n 'text_to_speech',\n 'image',\n 'image_generate',\n 'create_share',\n 'execute_code',\n] as const;\n\nconst CORE_TOOL_SUMMARIES: Record<string, string> = {\n code_search: 'Find definitions, implementations, routes, types, and structurally important symbols',\n code_read_symbol: 'Read exact source for a graph symbol before editing',\n code_trace: 'Trace callers, callees, data flow, and cross-service paths',\n code_impact: 'Map git changes to affected symbols and blast radius',\n code_architecture: 'Map packages, boundaries, layers, entry points, hotspots, and clusters',\n read_file: 'Read targeted file contents before editing',\n write_file: 'Create new files or intentional complete rewrites; prefer apply_patch for code changes',\n apply_patch: 'Apply source edits with patches that begin exactly with *** Begin Patch and end exactly with *** End Patch',\n grep: 'Search file contents for literals, errors, config values, and docs',\n find: 'Find files by glob pattern',\n list_dir: 'List directory contents',\n exec_command: 'Run tests, type checks, builds, package scripts, and safe inspection commands',\n update_plan: 'Keep the current multi-step coding plan visible and accurate',\n web_search: 'Search the web',\n web_fetch: 'Fetch and extract readable content from a URL',\n web_extract: 'Extract structured content from a URL',\n browser_use: 'Control the configured browser',\n send_message: 'Send messages to the current channel',\n send_media: 'Send media attachments to the current channel',\n memory_search: 'Semantic search over indexed memory sources',\n memory_get: 'Read specific lines from memory sources returned by search',\n session_search: 'Search other chat sessions or list recent sessions',\n curated_memory: 'Read/write structured notes in the shared user memory store/',\n session_status: 'Show session usage/time/model state',\n tool_manual: 'Load built-in usage manuals for complex tools',\n delegate_task: 'Spawn an isolated sub-agent for a delegated task',\n workflow: 'Start a persisted multi-phase workflow run',\n automation: 'Manage product automations',\n skills_list: 'List available skills',\n skill_view: 'Load a skill SKILL.md or sub-documents',\n skill_manage: 'Create or update skills on disk',\n todo: 'Manage in-session todo items',\n clarify: 'Ask the user a blocking clarification question',\n text_to_speech: 'Send a standalone voice message',\n image: 'Analyze an image with the configured vision model',\n image_generate: 'Generate images with the configured image model',\n create_share: 'Create a shareable link for workspace files',\n execute_code: 'Run code in a sandbox with a restricted tool subset',\n};\n\nexport function buildToolingSection(params: {\n toolNames?: string[];\n toolSummaries?: Record<string, string>;\n}): string {\n const rawToolNames = (params.toolNames ?? []).map((tool) => tool.trim()).filter(Boolean);\n const canonicalByNormalized = new Map<string, string>();\n for (const name of rawToolNames) {\n const normalized = name.toLowerCase();\n if (!canonicalByNormalized.has(normalized)) {\n canonicalByNormalized.set(normalized, name);\n }\n }\n const resolveToolName = (normalized: string) =>\n canonicalByNormalized.get(normalized) ?? normalized;\n\n const normalizedTools = rawToolNames.map((tool) => tool.toLowerCase());\n const availableTools = new Set(normalizedTools);\n\n const externalToolSummaries = new Map<string, string>();\n for (const [key, value] of Object.entries(params.toolSummaries ?? {})) {\n const normalized = key.trim().toLowerCase();\n if (!normalized || !value?.trim()) {\n continue;\n }\n externalToolSummaries.set(normalized, value.trim());\n }\n\n const extraTools = Array.from(\n new Set(normalizedTools.filter((tool) => !CORE_TOOL_ORDER.includes(tool as (typeof CORE_TOOL_ORDER)[number]))),\n );\n const enabledTools = CORE_TOOL_ORDER.filter((tool) => availableTools.has(tool));\n const toolLines = enabledTools.map((tool) => {\n const summary = CORE_TOOL_SUMMARIES[tool] ?? externalToolSummaries.get(tool);\n const name = resolveToolName(tool);\n return summary ? `- ${name}: ${summary}` : `- ${name}`;\n });\n for (const tool of extraTools.toSorted()) {\n const summary = CORE_TOOL_SUMMARIES[tool] ?? externalToolSummaries.get(tool);\n const name = resolveToolName(tool);\n toolLines.push(summary ? `- ${name}: ${summary}` : `- ${name}`);\n }\n\n const execToolName = resolveToolName('exec_command');\n const planToolName = resolveToolName('update_plan');\n const readToolName = resolveToolName('read_file');\n const patchToolName = resolveToolName('apply_patch');\n const writeToolName = resolveToolName('write_file');\n const grepToolName = resolveToolName('grep');\n const findToolName = resolveToolName('find');\n const hasDelegate = availableTools.has('delegate_task');\n const hasWorkflow = availableTools.has('workflow');\n const hasToolManual = availableTools.has('tool_manual');\n const hasRead = availableTools.has('read_file');\n const hasPatch = availableTools.has('apply_patch');\n const hasWrite = availableTools.has('write_file');\n const hasGrep = availableTools.has('grep');\n const hasFind = availableTools.has('find');\n const hasExec = availableTools.has('exec_command');\n const hasPlan = availableTools.has('update_plan');\n\n const orchestrationLines: string[] = [];\n if (hasDelegate) {\n orchestrationLines.push(\n '- Sub-agent delegation → use `delegate_task(goal, context?, toolset?)` for focused parallel work; results return to you automatically.',\n );\n }\n if (hasWorkflow) {\n orchestrationLines.push(\n '- Multi-phase workflows → use `workflow` to start persisted runs with subagents when a script defines phases.',\n );\n }\n\n return [\n '## Tooling',\n 'Tool availability (filtered by policy):',\n 'Tool names are case-sensitive. Call tools exactly as listed.',\n toolLines.length > 0\n ? toolLines.join('\\n')\n : '- No tools are registered for this session.',\n `For long waits, avoid rapid poll loops: use \\`${execToolName}\\` with a sufficient timeout or poll in reasonable intervals.`,\n hasRead\n ? `Use \\`${readToolName}\\` for targeted file inspection before editing; do not rely on filenames alone.`\n : '',\n hasPatch\n ? `Use \\`${patchToolName}\\` for source changes; keep patches focused and inspect failures carefully.`\n : '',\n hasWrite\n ? `Use \\`${writeToolName}\\` only for new files or intentional complete rewrites.`\n : '',\n hasGrep || hasFind\n ? `Use ${[\n hasGrep ? `\\`${grepToolName}\\`` : '',\n hasFind ? `\\`${findToolName}\\`` : '',\n ].filter(Boolean).join(' and ')} for text/file discovery; use code graph or symbol tools when available for definitions and call relationships.`\n : '',\n hasExec\n ? `Use \\`${execToolName}\\` for verification and safe inspection, not routine file editing.`\n : '',\n hasPlan\n ? `Use \\`${planToolName}\\` for multi-step coding work: keep exactly one active step when work is in progress, and update it after meaningful progress or review.`\n : '',\n hasToolManual\n ? 'Some complex tools have built-in manuals. Use `tool_manual(tool)` before non-trivial use.'\n : '',\n hasDelegate\n ? 'If a task is complex or long-running, delegate it. Completion is push-based: the sub-agent result returns when done.'\n : '',\n ...orchestrationLines,\n 'Do not poll delegate/workflow status in a tight loop; check on-demand or wait for completion.',\n ]\n .filter(Boolean)\n .join('\\n');\n}\n\nexport function hasSkillsTools(toolNames: string[]): boolean {\n const normalized = new Set(toolNames.map((t) => t.toLowerCase()));\n return normalized.has('skills_list') || normalized.has('skill_view');\n}\n"],"mappings":"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"}
@@ -75,7 +75,13 @@ async function tryRunSlashCommand(deps, ctx, content, options) {
75
75
  */
76
76
  async function runDirectAgentTurn(deps, input) {
77
77
  const userPlain = extractAgentUserPlainText(input.userMessage);
78
- const userMessageForModel = (await deps.agentManager.prepareUserTurnContext(input.userMessage, input.sessionKey)).modelMessage;
78
+ const userContext = await deps.agentManager.prepareUserTurnContext(input.userMessage, input.sessionKey);
79
+ const userMessageForModel = userContext.modelMessage;
80
+ if (userContext.consentRequests.length > 0) input.onEvent?.({
81
+ type: "memory_consent_required",
82
+ runId: input.runId,
83
+ requests: userContext.consentRequests
84
+ });
79
85
  const modelRef = deps.modelManager.getModelForSession(input.sessionKey);
80
86
  const llmTurn = await hydrateUserTurnForLlm({
81
87
  message: input.userMessage,
@@ -96,7 +102,12 @@ async function runDirectAgentTurn(deps, input) {
96
102
  beforeTurn: () => deps.agentManager.beginBackgroundReviewUserTurn(input.sessionKey),
97
103
  onEvent: input.onEvent
98
104
  });
99
- await deps.agentManager.afterAgentTurn(input.sessionKey, userPlain);
105
+ const understandingReview = await deps.agentManager.afterAgentTurn(input.sessionKey, userPlain);
106
+ if (understandingReview?.createdRecords.length) input.onEvent?.({
107
+ type: "memory_captured",
108
+ runId: input.runId,
109
+ records: understandingReview.createdRecords
110
+ });
100
111
  deps.agentManager.scheduleBackgroundReviewAfterUserTurn(input.sessionKey);
101
112
  return result;
102
113
  }
@@ -1 +1 @@
1
- {"version":3,"file":"direct-turn-helpers.js","names":[],"sources":["../../../../src/agent/service/direct-turn-helpers.ts"],"sourcesContent":["/**\n * Shared building blocks for the two direct-turn entry points (streaming\n * webchat SSE and one-shot CLI). Both flows do the same hydrate → maybe-slash\n * → run-embedded-turn → after-turn dance; this module captures that core so\n * the entry points only manage their I/O specifics (event sink, voice STT,\n * TTS, transcript persistence).\n */\n\nimport crypto from 'node:crypto';\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { ImageContent } from '@earendil-works/pi-ai';\n\nimport { commandRegistry } from '../../chat-commands/index.js';\nimport { parseSlashCommand } from '../../chat-commands/command-parse.js';\nimport { shouldSkipResetOverlapCommand } from '../../session/reset-triggers.js';\nimport { hydrateUserTurnForLlm, type TranscriptUserMessage } from '../inbound/attachment-pipeline.js';\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { CommandStreamEvent } from '../../chat-commands/types.js';\nimport type { SessionStore } from '../../session/index.js';\nimport type { Config } from '../../config/schema.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { ModelManager } from '../models/index.js';\nimport { extractAgentUserPlainText } from '../memory/user-message-text.js';\nimport { runEmbeddedTurnForSession } from '../embedded/run-for-session.js';\nimport type { EmbeddedStreamEvent } from '../embedded/types.js';\nimport { resolveImageHandlingStrategy } from '../image/vision-detection.js';\n\nexport interface HydratePerTurnStateDeps {\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n}\n\n/** Workspace + model + thinking level — common prep before any direct turn. */\nexport async function hydratePerTurnState(\n deps: HydratePerTurnStateDeps,\n sessionKey: string,\n thinking?: string,\n): Promise<void> {\n await deps.hydrateSessionWorkspaceFromStore(sessionKey);\n await deps.hydrateSessionModelFromStore(sessionKey);\n await deps.applyResolvedThinkingLevel(sessionKey, thinking);\n}\n\nexport interface SlashCommandOutcome {\n /** True if the input parsed as a registered slash command (handled or not). */\n matched: boolean;\n /** Aggregated user-visible reply text (assistant view). */\n aggregatedText: string;\n /** The parsed command name when matched. */\n command?: string;\n /** Structured command result metadata for webchat and other rich clients. */\n metadata?: Record<string, unknown>;\n}\n\nexport interface TryRunSlashCommandDeps {\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n log: { warn: (obj: Record<string, unknown>, msg: string) => void };\n}\n\n/**\n * Detect a slash command and, if registered, execute it and aggregate the reply\n * text. Errors thrown inside the command surface as `aggregatedText` so callers\n * can persist the receipt or stream it as a token.\n */\nexport async function tryRunSlashCommand(\n deps: TryRunSlashCommandDeps,\n ctx: {\n sessionKey: string;\n channel: string;\n chatId: string;\n senderId?: string;\n isGroup?: boolean;\n inboundMetadata?: Record<string, unknown>;\n },\n content: string,\n options?: {\n skipResetCommands?: boolean;\n emitEvent?: (event: CommandStreamEvent) => void | Promise<void>;\n },\n): Promise<SlashCommandOutcome> {\n const parsed = parseSlashCommand(content);\n if (!parsed) {\n return { matched: false, aggregatedText: '' };\n }\n if (options?.skipResetCommands && shouldSkipResetOverlapCommand(parsed.command, true)) {\n return { matched: false, aggregatedText: '' };\n }\n if (!commandRegistry.has(parsed.command)) {\n return { matched: false, aggregatedText: '' };\n }\n try {\n const { aggregatedText, metadata } = await deps.commandHandler.executeCommandAndAggregateReply(\n parsed.command,\n parsed.args,\n {\n sessionKey: ctx.sessionKey,\n channel: ctx.channel,\n chatId: ctx.chatId,\n senderId: ctx.senderId ?? '',\n isGroup: ctx.isGroup ?? false,\n inboundMetadata: ctx.inboundMetadata ?? {},\n },\n { emitEvent: options?.emitEvent },\n );\n return { matched: true, aggregatedText: aggregatedText ?? '', command: parsed.command, metadata };\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n deps.log.warn(\n { err, sessionKey: ctx.sessionKey, command: parsed.command },\n `Slash command failed: ${em}`,\n );\n return { matched: true, aggregatedText: `Command error: ${em}`, command: parsed.command };\n }\n}\n\nexport interface RunDirectAgentTurnDeps {\n sessionStore: SessionStore;\n agentManager: AgentInstanceGateway;\n modelManager: ModelManager;\n config: Config | undefined;\n}\n\nexport interface RunDirectAgentTurnInput {\n sessionKey: string;\n runId?: string;\n userMessage: AgentMessage;\n abortSignal?: AbortSignal;\n sourceImages?: ImageContent[];\n onEvent?: (event: EmbeddedStreamEvent) => void;\n}\n\nexport interface RunDirectAgentTurnResult {\n ok: boolean;\n errorMessage?: string;\n lastAssistantText?: string;\n}\n\n/**\n * Convert a user message into an embedded turn, including the standard memory\n * prefetch + background-review nudge wiring used by every direct entry point.\n */\nexport async function runDirectAgentTurn(\n deps: RunDirectAgentTurnDeps,\n input: RunDirectAgentTurnInput,\n): Promise<RunDirectAgentTurnResult> {\n const userPlain = extractAgentUserPlainText(input.userMessage);\n const userContext = await deps.agentManager.prepareUserTurnContext(\n input.userMessage,\n input.sessionKey,\n );\n const userMessageForModel = userContext.modelMessage;\n\n const modelRef = deps.modelManager.getModelForSession(input.sessionKey);\n const llmTurn = await hydrateUserTurnForLlm({\n message: input.userMessage as TranscriptUserMessage,\n modelRef,\n });\n const sourceImages = resolveImageHandlingStrategy(modelRef) === 'native' ? (input.sourceImages ?? []) : [];\n const llmImages = [...llmTurn.images, ...sourceImages];\n\n const result = await runEmbeddedTurnForSession({\n sessionKey: input.sessionKey,\n runId: input.runId ?? crypto.randomUUID(),\n userMessage: userMessageForModel,\n llmImages,\n sessionStore: deps.sessionStore,\n agentManager: deps.agentManager,\n modelManager: deps.modelManager,\n getConfig: () => deps.config,\n abortSignal: input.abortSignal,\n beforeTurn: () => deps.agentManager.beginBackgroundReviewUserTurn(input.sessionKey),\n onEvent: input.onEvent,\n });\n\n await deps.agentManager.afterAgentTurn(input.sessionKey, userPlain);\n deps.agentManager.scheduleBackgroundReviewAfterUserTurn(input.sessionKey);\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmCA,eAAsB,oBACpB,MACA,YACA,UACe;AACf,OAAM,KAAK,iCAAiC,WAAW;AACvD,OAAM,KAAK,6BAA6B,WAAW;AACnD,OAAM,KAAK,2BAA2B,YAAY,SAAS;;;;;;;AAwB7D,eAAsB,mBACpB,MACA,KAQA,SACA,SAI8B;CAC9B,MAAM,SAAS,kBAAkB,QAAQ;AACzC,KAAI,CAAC,OACH,QAAO;EAAE,SAAS;EAAO,gBAAgB;EAAI;AAE/C,KAAI,SAAS,qBAAqB,8BAA8B,OAAO,SAAS,KAAK,CACnF,QAAO;EAAE,SAAS;EAAO,gBAAgB;EAAI;AAE/C,KAAI,CAAC,gBAAgB,IAAI,OAAO,QAAQ,CACtC,QAAO;EAAE,SAAS;EAAO,gBAAgB;EAAI;AAE/C,KAAI;EACF,MAAM,EAAE,gBAAgB,aAAa,MAAM,KAAK,eAAe,gCAC7D,OAAO,SACP,OAAO,MACP;GACE,YAAY,IAAI;GAChB,SAAS,IAAI;GACb,QAAQ,IAAI;GACZ,UAAU,IAAI,YAAY;GAC1B,SAAS,IAAI,WAAW;GACxB,iBAAiB,IAAI,mBAAmB,EAAE;GAC3C,EACD,EAAE,WAAW,SAAS,WAAW,CAClC;AACD,SAAO;GAAE,SAAS;GAAM,gBAAgB,kBAAkB;GAAI,SAAS,OAAO;GAAS;GAAU;UAC1F,KAAK;EACZ,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC3D,OAAK,IAAI,KACP;GAAE;GAAK,YAAY,IAAI;GAAY,SAAS,OAAO;GAAS,EAC5D,yBAAyB,KAC1B;AACD,SAAO;GAAE,SAAS;GAAM,gBAAgB,kBAAkB;GAAM,SAAS,OAAO;GAAS;;;;;;;AA8B7F,eAAsB,mBACpB,MACA,OACmC;CACnC,MAAM,YAAY,0BAA0B,MAAM,YAAY;CAK9D,MAAM,uBAAsB,MAJF,KAAK,aAAa,uBAC1C,MAAM,aACN,MAAM,WACP,EACuC;CAExC,MAAM,WAAW,KAAK,aAAa,mBAAmB,MAAM,WAAW;CACvE,MAAM,UAAU,MAAM,sBAAsB;EAC1C,SAAS,MAAM;EACf;EACD,CAAC;CACF,MAAM,eAAe,6BAA6B,SAAS,KAAK,WAAY,MAAM,gBAAgB,EAAE,GAAI,EAAE;CAC1G,MAAM,YAAY,CAAC,GAAG,QAAQ,QAAQ,GAAG,aAAa;CAEtD,MAAM,SAAS,MAAM,0BAA0B;EAC7C,YAAY,MAAM;EAClB,OAAO,MAAM,SAAS,OAAO,YAAY;EACzC,aAAa;EACb;EACA,cAAc,KAAK;EACnB,cAAc,KAAK;EACnB,cAAc,KAAK;EACnB,iBAAiB,KAAK;EACtB,aAAa,MAAM;EACnB,kBAAkB,KAAK,aAAa,8BAA8B,MAAM,WAAW;EACnF,SAAS,MAAM;EAChB,CAAC;AAEF,OAAM,KAAK,aAAa,eAAe,MAAM,YAAY,UAAU;AACnE,MAAK,aAAa,sCAAsC,MAAM,WAAW;AAEzE,QAAO"}
1
+ {"version":3,"file":"direct-turn-helpers.js","names":[],"sources":["../../../../src/agent/service/direct-turn-helpers.ts"],"sourcesContent":["/**\n * Shared building blocks for the two direct-turn entry points (streaming\n * webchat SSE and one-shot CLI). Both flows do the same hydrate → maybe-slash\n * → run-embedded-turn → after-turn dance; this module captures that core so\n * the entry points only manage their I/O specifics (event sink, voice STT,\n * TTS, transcript persistence).\n */\n\nimport crypto from 'node:crypto';\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { ImageContent } from '@earendil-works/pi-ai';\n\nimport { commandRegistry } from '../../chat-commands/index.js';\nimport { parseSlashCommand } from '../../chat-commands/command-parse.js';\nimport { shouldSkipResetOverlapCommand } from '../../session/reset-triggers.js';\nimport { hydrateUserTurnForLlm, type TranscriptUserMessage } from '../inbound/attachment-pipeline.js';\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { CommandStreamEvent } from '../../chat-commands/types.js';\nimport type { SessionStore } from '../../session/index.js';\nimport type { Config } from '../../config/schema.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { ModelManager } from '../models/index.js';\nimport { extractAgentUserPlainText } from '../memory/user-message-text.js';\nimport { runEmbeddedTurnForSession } from '../embedded/run-for-session.js';\nimport type { EmbeddedStreamEvent } from '../embedded/types.js';\nimport { resolveImageHandlingStrategy } from '../image/vision-detection.js';\n\nexport interface HydratePerTurnStateDeps {\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n}\n\n/** Workspace + model + thinking level — common prep before any direct turn. */\nexport async function hydratePerTurnState(\n deps: HydratePerTurnStateDeps,\n sessionKey: string,\n thinking?: string,\n): Promise<void> {\n await deps.hydrateSessionWorkspaceFromStore(sessionKey);\n await deps.hydrateSessionModelFromStore(sessionKey);\n await deps.applyResolvedThinkingLevel(sessionKey, thinking);\n}\n\nexport interface SlashCommandOutcome {\n /** True if the input parsed as a registered slash command (handled or not). */\n matched: boolean;\n /** Aggregated user-visible reply text (assistant view). */\n aggregatedText: string;\n /** The parsed command name when matched. */\n command?: string;\n /** Structured command result metadata for webchat and other rich clients. */\n metadata?: Record<string, unknown>;\n}\n\nexport interface TryRunSlashCommandDeps {\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n log: { warn: (obj: Record<string, unknown>, msg: string) => void };\n}\n\n/**\n * Detect a slash command and, if registered, execute it and aggregate the reply\n * text. Errors thrown inside the command surface as `aggregatedText` so callers\n * can persist the receipt or stream it as a token.\n */\nexport async function tryRunSlashCommand(\n deps: TryRunSlashCommandDeps,\n ctx: {\n sessionKey: string;\n channel: string;\n chatId: string;\n senderId?: string;\n isGroup?: boolean;\n inboundMetadata?: Record<string, unknown>;\n },\n content: string,\n options?: {\n skipResetCommands?: boolean;\n emitEvent?: (event: CommandStreamEvent) => void | Promise<void>;\n },\n): Promise<SlashCommandOutcome> {\n const parsed = parseSlashCommand(content);\n if (!parsed) {\n return { matched: false, aggregatedText: '' };\n }\n if (options?.skipResetCommands && shouldSkipResetOverlapCommand(parsed.command, true)) {\n return { matched: false, aggregatedText: '' };\n }\n if (!commandRegistry.has(parsed.command)) {\n return { matched: false, aggregatedText: '' };\n }\n try {\n const { aggregatedText, metadata } = await deps.commandHandler.executeCommandAndAggregateReply(\n parsed.command,\n parsed.args,\n {\n sessionKey: ctx.sessionKey,\n channel: ctx.channel,\n chatId: ctx.chatId,\n senderId: ctx.senderId ?? '',\n isGroup: ctx.isGroup ?? false,\n inboundMetadata: ctx.inboundMetadata ?? {},\n },\n { emitEvent: options?.emitEvent },\n );\n return { matched: true, aggregatedText: aggregatedText ?? '', command: parsed.command, metadata };\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n deps.log.warn(\n { err, sessionKey: ctx.sessionKey, command: parsed.command },\n `Slash command failed: ${em}`,\n );\n return { matched: true, aggregatedText: `Command error: ${em}`, command: parsed.command };\n }\n}\n\nexport interface RunDirectAgentTurnDeps {\n sessionStore: SessionStore;\n agentManager: AgentInstanceGateway;\n modelManager: ModelManager;\n config: Config | undefined;\n}\n\nexport interface RunDirectAgentTurnInput {\n sessionKey: string;\n runId?: string;\n userMessage: AgentMessage;\n abortSignal?: AbortSignal;\n sourceImages?: ImageContent[];\n onEvent?: (event: EmbeddedStreamEvent) => void;\n}\n\nexport interface RunDirectAgentTurnResult {\n ok: boolean;\n errorMessage?: string;\n lastAssistantText?: string;\n}\n\n/**\n * Convert a user message into an embedded turn, including the standard memory\n * prefetch + background-review nudge wiring used by every direct entry point.\n */\nexport async function runDirectAgentTurn(\n deps: RunDirectAgentTurnDeps,\n input: RunDirectAgentTurnInput,\n): Promise<RunDirectAgentTurnResult> {\n const userPlain = extractAgentUserPlainText(input.userMessage);\n const userContext = await deps.agentManager.prepareUserTurnContext(\n input.userMessage,\n input.sessionKey,\n );\n const userMessageForModel = userContext.modelMessage;\n if (userContext.consentRequests.length > 0) {\n input.onEvent?.({\n type: 'memory_consent_required',\n runId: input.runId,\n requests: userContext.consentRequests,\n });\n }\n\n const modelRef = deps.modelManager.getModelForSession(input.sessionKey);\n const llmTurn = await hydrateUserTurnForLlm({\n message: input.userMessage as TranscriptUserMessage,\n modelRef,\n });\n const sourceImages = resolveImageHandlingStrategy(modelRef) === 'native' ? (input.sourceImages ?? []) : [];\n const llmImages = [...llmTurn.images, ...sourceImages];\n\n const result = await runEmbeddedTurnForSession({\n sessionKey: input.sessionKey,\n runId: input.runId ?? crypto.randomUUID(),\n userMessage: userMessageForModel,\n llmImages,\n sessionStore: deps.sessionStore,\n agentManager: deps.agentManager,\n modelManager: deps.modelManager,\n getConfig: () => deps.config,\n abortSignal: input.abortSignal,\n beforeTurn: () => deps.agentManager.beginBackgroundReviewUserTurn(input.sessionKey),\n onEvent: input.onEvent,\n });\n\n const understandingReview = await deps.agentManager.afterAgentTurn(input.sessionKey, userPlain);\n if (understandingReview?.createdRecords.length) {\n input.onEvent?.({ type: 'memory_captured', runId: input.runId, records: understandingReview.createdRecords });\n }\n deps.agentManager.scheduleBackgroundReviewAfterUserTurn(input.sessionKey);\n\n return result;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AAmCA,eAAsB,oBACpB,MACA,YACA,UACe;AACf,OAAM,KAAK,iCAAiC,WAAW;AACvD,OAAM,KAAK,6BAA6B,WAAW;AACnD,OAAM,KAAK,2BAA2B,YAAY,SAAS;;;;;;;AAwB7D,eAAsB,mBACpB,MACA,KAQA,SACA,SAI8B;CAC9B,MAAM,SAAS,kBAAkB,QAAQ;AACzC,KAAI,CAAC,OACH,QAAO;EAAE,SAAS;EAAO,gBAAgB;EAAI;AAE/C,KAAI,SAAS,qBAAqB,8BAA8B,OAAO,SAAS,KAAK,CACnF,QAAO;EAAE,SAAS;EAAO,gBAAgB;EAAI;AAE/C,KAAI,CAAC,gBAAgB,IAAI,OAAO,QAAQ,CACtC,QAAO;EAAE,SAAS;EAAO,gBAAgB;EAAI;AAE/C,KAAI;EACF,MAAM,EAAE,gBAAgB,aAAa,MAAM,KAAK,eAAe,gCAC7D,OAAO,SACP,OAAO,MACP;GACE,YAAY,IAAI;GAChB,SAAS,IAAI;GACb,QAAQ,IAAI;GACZ,UAAU,IAAI,YAAY;GAC1B,SAAS,IAAI,WAAW;GACxB,iBAAiB,IAAI,mBAAmB,EAAE;GAC3C,EACD,EAAE,WAAW,SAAS,WAAW,CAClC;AACD,SAAO;GAAE,SAAS;GAAM,gBAAgB,kBAAkB;GAAI,SAAS,OAAO;GAAS;GAAU;UAC1F,KAAK;EACZ,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC3D,OAAK,IAAI,KACP;GAAE;GAAK,YAAY,IAAI;GAAY,SAAS,OAAO;GAAS,EAC5D,yBAAyB,KAC1B;AACD,SAAO;GAAE,SAAS;GAAM,gBAAgB,kBAAkB;GAAM,SAAS,OAAO;GAAS;;;;;;;AA8B7F,eAAsB,mBACpB,MACA,OACmC;CACnC,MAAM,YAAY,0BAA0B,MAAM,YAAY;CAC9D,MAAM,cAAc,MAAM,KAAK,aAAa,uBAC1C,MAAM,aACN,MAAM,WACP;CACD,MAAM,sBAAsB,YAAY;AACxC,KAAI,YAAY,gBAAgB,SAAS,EACvC,OAAM,UAAU;EACd,MAAM;EACN,OAAO,MAAM;EACb,UAAU,YAAY;EACvB,CAAC;CAGJ,MAAM,WAAW,KAAK,aAAa,mBAAmB,MAAM,WAAW;CACvE,MAAM,UAAU,MAAM,sBAAsB;EAC1C,SAAS,MAAM;EACf;EACD,CAAC;CACF,MAAM,eAAe,6BAA6B,SAAS,KAAK,WAAY,MAAM,gBAAgB,EAAE,GAAI,EAAE;CAC1G,MAAM,YAAY,CAAC,GAAG,QAAQ,QAAQ,GAAG,aAAa;CAEtD,MAAM,SAAS,MAAM,0BAA0B;EAC7C,YAAY,MAAM;EAClB,OAAO,MAAM,SAAS,OAAO,YAAY;EACzC,aAAa;EACb;EACA,cAAc,KAAK;EACnB,cAAc,KAAK;EACnB,cAAc,KAAK;EACnB,iBAAiB,KAAK;EACtB,aAAa,MAAM;EACnB,kBAAkB,KAAK,aAAa,8BAA8B,MAAM,WAAW;EACnF,SAAS,MAAM;EAChB,CAAC;CAEF,MAAM,sBAAsB,MAAM,KAAK,aAAa,eAAe,MAAM,YAAY,UAAU;AAC/F,KAAI,qBAAqB,eAAe,OACtC,OAAM,UAAU;EAAE,MAAM;EAAmB,OAAO,MAAM;EAAO,SAAS,oBAAoB;EAAgB,CAAC;AAE/G,MAAK,aAAa,sCAAsC,MAAM,WAAW;AAEzE,QAAO"}
@@ -11,7 +11,7 @@ const CuratedMemorySchema = Type.Object({
11
11
  target: Type.Union([Type.Literal("memory"), Type.Literal("user")]),
12
12
  kind: Type.Optional(Type.Union([
13
13
  Type.Literal("user_profile"),
14
- Type.Literal("agent_note"),
14
+ Type.Literal("curated_note"),
15
15
  Type.Literal("workspace_fact"),
16
16
  Type.Literal("daily_note"),
17
17
  Type.Literal("session_summary"),
@@ -38,7 +38,7 @@ function createCuratedMemoryTool(getMemoryManager) {
38
38
  return {
39
39
  name: "curated_memory",
40
40
  label: "Curated memory",
41
- description: "Read, edit, or propose bounded curated memory (MEMORY.md = agent notes, user/MEMORY.md = global user memory). Use propose when a memory should be reviewed by the user before it becomes active recall context. Entries are separated by a section-sign delimiter (see store format). System prompt shows a frozen snapshot from session start; this tool reads/writes live state on disk. Use add/replace/remove for structured updates; use read to inspect current entries.",
41
+ description: "Read, edit, or propose bounded memory in the shared user store (user/memories/MEMORY.md for curated notes and user/MEMORY.md for the user profile). Use propose when a memory should be reviewed by the user before it becomes active recall context. Entries are separated by a section-sign delimiter (see store format). System prompt shows a frozen snapshot from session start; this tool reads/writes live state on disk. Use add/replace/remove for structured updates; use read to inspect current entries.",
42
42
  parameters: CuratedMemorySchema,
43
43
  async execute(_toolCallId, params, _signal) {
44
44
  const memoryManager = getMemoryManager();
@@ -61,7 +61,7 @@ function createCuratedMemoryTool(getMemoryManager) {
61
61
  if (action === "add") {
62
62
  const content = params.content?.trim() ?? "";
63
63
  const result = await memoryManager.write({
64
- kind: target === "user" ? "user_profile" : "agent_note",
64
+ kind: target === "user" ? "user_profile" : "curated_note",
65
65
  target,
66
66
  content
67
67
  });
@@ -86,7 +86,7 @@ function createCuratedMemoryTool(getMemoryManager) {
86
86
  const content = p.content?.trim() ?? "";
87
87
  const sourceText = p.source_text?.trim();
88
88
  const result = await memoryManager.write({
89
- kind: p.kind ?? (target === "user" ? "user_profile" : "agent_note"),
89
+ kind: p.kind ?? (target === "user" ? "user_profile" : "curated_note"),
90
90
  target,
91
91
  content,
92
92
  status: "candidate",
@@ -1 +1 @@
1
- {"version":3,"file":"curated-memory-tool.js","names":[],"sources":["../../../../src/agent/tools/curated-memory-tool.ts"],"sourcesContent":["// Curated memory tool — agent home `memories/MEMORY.md` + global `user/MEMORY.md` (session snapshot + live edits)\nimport { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport type { MemoryManager } from '../memory/manager.js';\n\nconst CuratedMemorySchema = Type.Object({\n action: Type.Union([\n Type.Literal('add'),\n Type.Literal('propose'),\n Type.Literal('replace'),\n Type.Literal('remove'),\n Type.Literal('read'),\n ]),\n target: Type.Union([Type.Literal('memory'), Type.Literal('user')]),\n kind: Type.Optional(Type.Union([\n Type.Literal('user_profile'),\n Type.Literal('agent_note'),\n Type.Literal('workspace_fact'),\n Type.Literal('daily_note'),\n Type.Literal('session_summary'),\n Type.Literal('derived_insight'),\n Type.Literal('task_lesson'),\n Type.Literal('tool_preference'),\n Type.Literal('long_term_goal'),\n ])),\n sensitivity: Type.Optional(Type.Union([\n Type.Literal('normal'),\n Type.Literal('personal'),\n Type.Literal('secret'),\n Type.Literal('regulated'),\n ])),\n confidence: Type.Optional(Type.Number({ minimum: 0, maximum: 1 })),\n source_text: Type.Optional(Type.String({ description: 'Short evidence excerpt supporting a proposed memory.' })),\n content: Type.Optional(Type.String({ description: 'Required for add; new text for replace.' })),\n old_text: Type.Optional(\n Type.String({ description: 'Substring to match one entry for replace/remove.' }),\n ),\n});\n\ntype CuratedMemoryParams = {\n action: 'add' | 'propose' | 'replace' | 'remove' | 'read';\n target: 'memory' | 'user';\n kind?: 'user_profile' | 'agent_note' | 'workspace_fact' | 'daily_note' | 'session_summary' | 'derived_insight' | 'task_lesson' | 'tool_preference' | 'long_term_goal';\n sensitivity?: 'normal' | 'personal' | 'secret' | 'regulated';\n confidence?: number;\n source_text?: string;\n content?: string;\n old_text?: string;\n};\n\nexport function createCuratedMemoryTool(\n getMemoryManager: () => MemoryManager,\n): AgentTool {\n return {\n name: 'curated_memory',\n label: 'Curated memory',\n description:\n 'Read, edit, or propose bounded curated memory (MEMORY.md = agent notes, user/MEMORY.md = global user memory). Use propose when a memory should be reviewed by the user before it becomes active recall context. Entries are separated by a section-sign delimiter (see store format). System prompt shows a frozen snapshot from session start; this tool reads/writes live state on disk. Use add/replace/remove for structured updates; use read to inspect current entries.',\n parameters: CuratedMemorySchema,\n\n async execute(\n _toolCallId: string,\n params: any,\n _signal?: AbortSignal,\n ): Promise<AgentToolResult<{}>> {\n const memoryManager = getMemoryManager();\n const { action, target } = params as CuratedMemoryParams;\n\n try {\n if (action === 'read') {\n const records = await memoryManager.list({ target });\n const entries = records.map((record) => record.content);\n const text = JSON.stringify(\n { target, entries, count: entries.length },\n null,\n 2,\n );\n return {\n content: [{ type: 'text', text }],\n details: { entries },\n };\n }\n\n if (action === 'add') {\n const content = (params as CuratedMemoryParams).content?.trim() ?? '';\n const result = await memoryManager.write({\n kind: target === 'user' ? 'user_profile' : 'agent_note',\n target,\n content,\n });\n if (!result.success) {\n return {\n content: [{ type: 'text', text: result.error ?? 'Unknown error' }],\n details: { error: result.error },\n };\n }\n memoryManager.onMemoryWrite('add', target, content);\n return {\n content: [{ type: 'text', text: result.message ?? 'OK' }],\n details: { success: true },\n };\n }\n\n if (action === 'propose') {\n const p = params as CuratedMemoryParams;\n const content = p.content?.trim() ?? '';\n const sourceText = p.source_text?.trim();\n const result = await memoryManager.write({\n kind: p.kind ?? (target === 'user' ? 'user_profile' : 'agent_note'),\n target,\n content,\n status: 'candidate',\n sensitivity: p.sensitivity ?? (target === 'user' ? 'personal' : 'normal'),\n confidence: p.confidence,\n evidence: sourceText ? [{ sourceText }] : undefined,\n });\n if (!result.success) {\n return {\n content: [{ type: 'text', text: result.error ?? 'Unknown error' }],\n details: { error: result.error },\n };\n }\n return {\n content: [{ type: 'text', text: result.message ?? 'Memory candidate added to inbox' }],\n details: { success: true, recordId: result.record?.id, status: result.record?.status },\n };\n }\n\n if (action === 'replace') {\n const oldText = (params as CuratedMemoryParams).old_text?.trim() ?? '';\n const newContent = (params as CuratedMemoryParams).content?.trim() ?? '';\n const result = await memoryManager.update({ target, matchText: oldText, content: newContent });\n if (!result.success) {\n return {\n content: [{ type: 'text', text: result.error ?? 'Unknown error' }],\n details: { error: result.error },\n };\n }\n memoryManager.onMemoryWrite('replace', target, newContent);\n return {\n content: [{ type: 'text', text: result.message ?? 'OK' }],\n details: { success: true },\n };\n }\n\n const oldText = (params as CuratedMemoryParams).old_text?.trim() ?? '';\n const result = await memoryManager.delete({ target, matchText: oldText });\n if (!result.success) {\n return {\n content: [{ type: 'text', text: result.error ?? 'Unknown error' }],\n details: { error: result.error },\n };\n }\n memoryManager.onMemoryWrite('remove', target, oldText);\n return {\n content: [{ type: 'text', text: result.message ?? 'OK' }],\n details: { success: true },\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: 'text', text: `curated_memory error: ${message}` }],\n details: { error: message },\n };\n }\n },\n } as any;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"curated-memory-tool.js","names":[],"sources":["../../../../src/agent/tools/curated-memory-tool.ts"],"sourcesContent":["// Curated memory tool — shared user context files (session snapshot + live edits)\nimport { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport type { MemoryManager } from '../memory/manager.js';\n\nconst CuratedMemorySchema = Type.Object({\n action: Type.Union([\n Type.Literal('add'),\n Type.Literal('propose'),\n Type.Literal('replace'),\n Type.Literal('remove'),\n Type.Literal('read'),\n ]),\n target: Type.Union([Type.Literal('memory'), Type.Literal('user')]),\n kind: Type.Optional(Type.Union([\n Type.Literal('user_profile'),\n Type.Literal('curated_note'),\n Type.Literal('workspace_fact'),\n Type.Literal('daily_note'),\n Type.Literal('session_summary'),\n Type.Literal('derived_insight'),\n Type.Literal('task_lesson'),\n Type.Literal('tool_preference'),\n Type.Literal('long_term_goal'),\n ])),\n sensitivity: Type.Optional(Type.Union([\n Type.Literal('normal'),\n Type.Literal('personal'),\n Type.Literal('secret'),\n Type.Literal('regulated'),\n ])),\n confidence: Type.Optional(Type.Number({ minimum: 0, maximum: 1 })),\n source_text: Type.Optional(Type.String({ description: 'Short evidence excerpt supporting a proposed memory.' })),\n content: Type.Optional(Type.String({ description: 'Required for add; new text for replace.' })),\n old_text: Type.Optional(\n Type.String({ description: 'Substring to match one entry for replace/remove.' }),\n ),\n});\n\ntype CuratedMemoryParams = {\n action: 'add' | 'propose' | 'replace' | 'remove' | 'read';\n target: 'memory' | 'user';\n kind?: 'user_profile' | 'curated_note' | 'workspace_fact' | 'daily_note' | 'session_summary' | 'derived_insight' | 'task_lesson' | 'tool_preference' | 'long_term_goal';\n sensitivity?: 'normal' | 'personal' | 'secret' | 'regulated';\n confidence?: number;\n source_text?: string;\n content?: string;\n old_text?: string;\n};\n\nexport function createCuratedMemoryTool(\n getMemoryManager: () => MemoryManager,\n): AgentTool {\n return {\n name: 'curated_memory',\n label: 'Curated memory',\n description:\n 'Read, edit, or propose bounded memory in the shared user store (user/memories/MEMORY.md for curated notes and user/MEMORY.md for the user profile). Use propose when a memory should be reviewed by the user before it becomes active recall context. Entries are separated by a section-sign delimiter (see store format). System prompt shows a frozen snapshot from session start; this tool reads/writes live state on disk. Use add/replace/remove for structured updates; use read to inspect current entries.',\n parameters: CuratedMemorySchema,\n\n async execute(\n _toolCallId: string,\n params: any,\n _signal?: AbortSignal,\n ): Promise<AgentToolResult<{}>> {\n const memoryManager = getMemoryManager();\n const { action, target } = params as CuratedMemoryParams;\n\n try {\n if (action === 'read') {\n const records = await memoryManager.list({ target });\n const entries = records.map((record) => record.content);\n const text = JSON.stringify(\n { target, entries, count: entries.length },\n null,\n 2,\n );\n return {\n content: [{ type: 'text', text }],\n details: { entries },\n };\n }\n\n if (action === 'add') {\n const content = (params as CuratedMemoryParams).content?.trim() ?? '';\n const result = await memoryManager.write({\n kind: target === 'user' ? 'user_profile' : 'curated_note',\n target,\n content,\n });\n if (!result.success) {\n return {\n content: [{ type: 'text', text: result.error ?? 'Unknown error' }],\n details: { error: result.error },\n };\n }\n memoryManager.onMemoryWrite('add', target, content);\n return {\n content: [{ type: 'text', text: result.message ?? 'OK' }],\n details: { success: true },\n };\n }\n\n if (action === 'propose') {\n const p = params as CuratedMemoryParams;\n const content = p.content?.trim() ?? '';\n const sourceText = p.source_text?.trim();\n const result = await memoryManager.write({\n kind: p.kind ?? (target === 'user' ? 'user_profile' : 'curated_note'),\n target,\n content,\n status: 'candidate',\n sensitivity: p.sensitivity ?? (target === 'user' ? 'personal' : 'normal'),\n confidence: p.confidence,\n evidence: sourceText ? [{ sourceText }] : undefined,\n });\n if (!result.success) {\n return {\n content: [{ type: 'text', text: result.error ?? 'Unknown error' }],\n details: { error: result.error },\n };\n }\n return {\n content: [{ type: 'text', text: result.message ?? 'Memory candidate added to inbox' }],\n details: { success: true, recordId: result.record?.id, status: result.record?.status },\n };\n }\n\n if (action === 'replace') {\n const oldText = (params as CuratedMemoryParams).old_text?.trim() ?? '';\n const newContent = (params as CuratedMemoryParams).content?.trim() ?? '';\n const result = await memoryManager.update({ target, matchText: oldText, content: newContent });\n if (!result.success) {\n return {\n content: [{ type: 'text', text: result.error ?? 'Unknown error' }],\n details: { error: result.error },\n };\n }\n memoryManager.onMemoryWrite('replace', target, newContent);\n return {\n content: [{ type: 'text', text: result.message ?? 'OK' }],\n details: { success: true },\n };\n }\n\n const oldText = (params as CuratedMemoryParams).old_text?.trim() ?? '';\n const result = await memoryManager.delete({ target, matchText: oldText });\n if (!result.success) {\n return {\n content: [{ type: 'text', text: result.error ?? 'Unknown error' }],\n details: { error: result.error },\n };\n }\n memoryManager.onMemoryWrite('remove', target, oldText);\n return {\n content: [{ type: 'text', text: result.message ?? 'OK' }],\n details: { success: true },\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: 'text', text: `curated_memory error: ${message}` }],\n details: { error: message },\n };\n }\n },\n } as any;\n}\n"],"mappings":"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"}
@@ -79,7 +79,7 @@ export interface CreateCoreToolsOptions {
79
79
  /** Optional primary model for image tool heuristics. */
80
80
  getPrimaryModel?: () => Model<Api>;
81
81
  getMemoryManager?: () => MemoryManager;
82
- /** Agent-scoped memories directory used for dreaming state (`agents/<id>/memories`). */
82
+ /** Shared user memories directory used for dreaming state (`user/memories`). */
83
83
  dreamingRoot?: string;
84
84
  agentId?: string;
85
85
  /** When set, registers `skills_list` and `skill_view` bound to this workspace\'s skills. */
@@ -46,7 +46,7 @@ import "./index.js";
46
46
  import { shouldRegisterCuratedMemoryTool } from "../memory/memory-config.js";
47
47
  import { createBrowserUseTool } from "./browser/tool/browser-use-tool.js";
48
48
  import { createWorkflowCatalog } from "../workflow/catalog.js";
49
- import { resolveDreamingRootForAgent } from "../memory/dreaming/scope.js";
49
+ import { resolveDreamingRoot } from "../memory/dreaming/scope.js";
50
50
  import { wrapToolsWithProtection } from "./executor.js";
51
51
  import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
52
52
  import { createTextToSpeechTool } from "./tts-tool.js";
@@ -160,7 +160,7 @@ var AgentToolsFactory = class {
160
160
  const primary = getPrimary?.();
161
161
  const modelHasVision = primary?.input?.includes("image") ?? false;
162
162
  const cfg = this.deps.getConfig?.();
163
- const dreamingRoot = options?.dreamingRoot ?? (cfg ? resolveDreamingRootForAgent(cfg, options?.agentId) : workspace);
163
+ const dreamingRoot = options?.dreamingRoot ?? (cfg ? resolveDreamingRoot() : workspace);
164
164
  const browserEnabled = cfg?.browser?.enabled !== false;
165
165
  const recordGoalEvidence = createGoalEvidenceRecorder({ getSessionKey: () => this.deps.getCurrentContext()?.sessionKey });
166
166
  const imageTool = createImageTool({