@xopcai/xopc 0.0.113 → 0.0.115

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 (567) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  3. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  4. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  5. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  6. package/dist/extensions/telegram/src/plugin.js +1 -1
  7. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  8. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  9. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  10. package/dist/extensions/telegram/xopc.extension.json +1 -1
  11. package/dist/extensions/weixin/src/api/api.js +2 -2
  12. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  13. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  14. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  15. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  16. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  18. package/dist/extensions/weixin/src/plugin.js +1 -1
  19. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  20. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  21. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CBlklyNr.js → agent-avatar-dicebear-DVnBfANm.js} +1 -1
  22. package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +6 -0
  23. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +1 -0
  24. package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +71 -0
  25. package/dist/gateway/static/root/assets/{app-management-settings-panel-28E_WfMe.js → app-management-settings-panel-DzGbdr04.js} +1 -1
  26. package/dist/gateway/static/root/assets/{appearance-settings-Do1z0XgJ.js → appearance-settings-BQpPSTHD.js} +1 -1
  27. package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +1 -0
  28. package/dist/gateway/static/root/assets/{archive-plugin-BAFlsov_.js → archive-plugin-CXu-Csep.js} +1 -1
  29. package/dist/gateway/static/root/assets/{attachment-load-V3qGPC3x.js → attachment-load-BAjgOoGY.js} +1 -1
  30. package/dist/gateway/static/root/assets/{binary-plugins-DT8NvA6W.js → binary-plugins-BSBgB2hO.js} +1 -1
  31. package/dist/gateway/static/root/assets/{block-editor-CdLMEcHd.js → block-editor-BpXw9TTR.js} +3 -3
  32. package/dist/gateway/static/root/assets/channels-settings-BbPUpzWB.js +1 -0
  33. package/dist/gateway/static/root/assets/{config-api-Bf5mjpu7.js → config-api-NOoPiIYz.js} +1 -1
  34. package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +2 -0
  35. package/dist/gateway/static/root/assets/{cron-api--pAB_rps.js → cron-api-C9BOqAXd.js} +1 -1
  36. package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +3 -0
  37. package/dist/gateway/static/root/assets/{dreaming-settings-6UZE1FSK.js → dreaming-settings-DQ4DtiK1.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-debug-page-BGhE7msg.js → extension-debug-page-D9kgUHCc.js} +1 -1
  39. package/dist/gateway/static/root/assets/{extension-page-CvpI45WG.js → extension-page-CGyhXqzR.js} +1 -1
  40. package/dist/gateway/static/root/assets/{extension-settings-page-DAmR5FUe.js → extension-settings-page-DL8Xquqd.js} +1 -1
  41. package/dist/gateway/static/root/assets/{fetch-NZmjSXLl.js → fetch-D0VXA932.js} +1 -1
  42. package/dist/gateway/static/root/assets/{format-interval-label-qhth3BMV.js → format-interval-label-Be8SmgUw.js} +1 -1
  43. package/dist/gateway/static/root/assets/{gateway-config-api-CaXBt-9R.js → gateway-config-api-C-xjn__h.js} +1 -1
  44. package/dist/gateway/static/root/assets/{gateway-settings-DphpbLBc.js → gateway-settings-BMPwIjKI.js} +1 -1
  45. package/dist/gateway/static/root/assets/{gateway-startup-retry-Be1omjh3.js → gateway-startup-retry-DERUH61L.js} +1 -1
  46. package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +1 -0
  47. package/dist/gateway/static/root/assets/goals-config-api-BPmqWk90.js +1 -0
  48. package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +2 -0
  49. package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +1 -0
  50. package/dist/gateway/static/root/assets/{heartbeat-config-api-BzO6G4fD.js → heartbeat-config-api-Bfdzr8oV.js} +1 -1
  51. package/dist/gateway/static/root/assets/{heartbeat-settings-DCST9-du.js → heartbeat-settings-TbHgcjTn.js} +1 -1
  52. package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +122 -0
  53. package/dist/gateway/static/root/assets/index-fh5sXTj9.css +1 -0
  54. package/dist/gateway/static/root/assets/{interval-presets-DJmshV8n.js → interval-presets-utKbuCRY.js} +1 -1
  55. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-9AUUlQ5Q.js → keyboard-shortcuts-settings-CjqS6c6V.js} +1 -1
  56. package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +2 -0
  57. package/dist/gateway/static/root/assets/{markdown-split-CYYELqAr.js → markdown-split-DW8C47iB.js} +1 -1
  58. package/dist/gateway/static/root/assets/{media-plugins-BEcMR2M8.js → media-plugins-D6HwDhDT.js} +1 -1
  59. package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +3 -0
  60. package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +2 -0
  61. package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +2 -0
  62. package/dist/gateway/static/root/assets/{note-image-lightbox-DNAoPcmm.js → note-image-lightbox-pJM35Pz5.js} +1 -1
  63. package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +1 -0
  64. package/dist/gateway/static/root/assets/{preview-open-alternatives-BPLz0AIv.js → preview-open-alternatives-CVwHuyN6.js} +1 -1
  65. package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +1 -0
  66. package/dist/gateway/static/root/assets/{save-bar-controls-CrWwWRVK.js → save-bar-controls-Ba-UEk7x.js} +1 -1
  67. package/dist/gateway/static/root/assets/{schedule-field-CF2sadvN.js → schedule-field-CNN9595U.js} +1 -1
  68. package/dist/gateway/static/root/assets/{schema-form-Di5cKjYE.js → schema-form-DnNMmtD5.js} +1 -1
  69. package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +1 -0
  70. package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +1 -0
  71. package/dist/gateway/static/root/assets/{settings-collapsible-section-Chh282jW.js → settings-collapsible-section-CmOz80i5.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-form-section-Dq-83cQd.js → settings-form-section-BmK7JJOV.js} +1 -1
  73. package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +1 -0
  74. package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +1 -0
  75. package/dist/gateway/static/root/assets/{share-preview-page-0FXYnSUA.js → share-preview-page-Dp2qGrHC.js} +1 -1
  76. package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +1 -0
  77. package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +1 -0
  78. package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +2 -0
  79. package/dist/gateway/static/root/assets/{system-settings-panel-W1pTcojB.js → system-settings-panel-5jrIEr5b.js} +1 -1
  80. package/dist/gateway/static/root/assets/{use-agent-defaults-form-BVRvkK7m.js → use-agent-defaults-form-BuiXLIs5.js} +1 -1
  81. package/dist/gateway/static/root/assets/{use-channel-catalog-CgJibfMM.js → use-channel-catalog-CHlO8J9G.js} +1 -1
  82. package/dist/gateway/static/root/assets/{use-settings-tab-guard-Bw_qkRQE.js → use-settings-tab-guard-CW5JORnl.js} +1 -1
  83. package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +1 -0
  84. package/dist/gateway/static/root/assets/{voice-player-store-C7lziaAx.js → voice-player-store-DDDWYHvg.js} +1 -1
  85. package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +1 -0
  86. package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +18 -0
  87. package/dist/gateway/static/root/index.html +5 -5
  88. package/dist/gateway/static/root/logo.svg +4 -3
  89. package/dist/package.js +1 -1
  90. package/dist/src/agent/agent-manager.d.ts +8 -0
  91. package/dist/src/agent/agent-manager.js +63 -28
  92. package/dist/src/agent/agent-manager.js.map +1 -1
  93. package/dist/src/agent/agent-scope.js +1 -1
  94. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  95. package/dist/src/agent/bootstrap/project-agents-context.d.ts +2 -0
  96. package/dist/src/agent/bootstrap/project-agents-context.js +32 -0
  97. package/dist/src/agent/bootstrap/project-agents-context.js.map +1 -0
  98. package/dist/src/agent/context/workspace-seed.js +2 -2
  99. package/dist/src/agent/context/workspace-state.js +1 -1
  100. package/dist/src/agent/context/workspace.js +1 -1
  101. package/dist/src/agent/embedded/session-tool-result-guard.js +8 -1
  102. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  103. package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
  104. package/dist/src/agent/goals/checklist-judge.js +3 -2
  105. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  106. package/dist/src/agent/goals/evaluate-turn.d.ts +1 -1
  107. package/dist/src/agent/goals/evaluate-turn.js +1 -0
  108. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  109. package/dist/src/agent/goals/goal-locale.js +2 -2
  110. package/dist/src/agent/goals/persistent-goal-service.js +2 -4
  111. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  112. package/dist/src/agent/goals/post-turn.d.ts +6 -1
  113. package/dist/src/agent/goals/post-turn.js +15 -6
  114. package/dist/src/agent/goals/post-turn.js.map +1 -1
  115. package/dist/src/agent/image/load-image-media.js +2 -2
  116. package/dist/src/agent/inbound/inbound-loop.js +5 -1
  117. package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
  118. package/dist/src/agent/inbound/turn-dispatcher.d.ts +2 -2
  119. package/dist/src/agent/inbound/turn-dispatcher.js +2 -2
  120. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  121. package/dist/src/agent/ipc/inbox.js +3 -3
  122. package/dist/src/agent/ipc/socket.js +1 -1
  123. package/dist/src/agent/mcp/bundle-mcp-materialize.d.ts +27 -0
  124. package/dist/src/agent/mcp/bundle-mcp-materialize.js +50 -2
  125. package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
  126. package/dist/src/agent/mcp/bundle-mcp-runtime.js +79 -4
  127. package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
  128. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +19 -0
  129. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  130. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  131. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  132. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  133. package/dist/src/agent/memory/dreaming/events.js +1 -1
  134. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  135. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  136. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  137. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  138. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  139. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  140. package/dist/src/agent/memory/memory-flush.js +1 -1
  141. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  142. package/dist/src/agent/models/manager.js +1 -1
  143. package/dist/src/agent/prompt/memory/index.js +1 -1
  144. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  145. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  146. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  147. package/dist/src/agent/sandbox/path-policy.js +2 -2
  148. package/dist/src/agent/service/btw-query.js +11 -3
  149. package/dist/src/agent/service/btw-query.js.map +1 -1
  150. package/dist/src/agent/service/parse-outbound-session-key.js +13 -8
  151. package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -1
  152. package/dist/src/agent/service/process-direct-one-shot.d.ts +2 -2
  153. package/dist/src/agent/service/process-direct-one-shot.js +1 -1
  154. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  155. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  156. package/dist/src/agent/service/process-direct-streaming.js +1 -1
  157. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  158. package/dist/src/agent/service.d.ts +1 -1
  159. package/dist/src/agent/service.js +13 -9
  160. package/dist/src/agent/service.js.map +1 -1
  161. package/dist/src/agent/service.types.d.ts +5 -0
  162. package/dist/src/agent/session/session-inspector.js +1 -1
  163. package/dist/src/agent/skills/config.js +2 -2
  164. package/dist/src/agent/skills/filesystem-watcher.js +5 -4
  165. package/dist/src/agent/skills/filesystem-watcher.js.map +1 -1
  166. package/dist/src/agent/skills/hub-hash.js +2 -2
  167. package/dist/src/agent/skills/hub-lock.js +1 -1
  168. package/dist/src/agent/skills/hub-pull.js +2 -2
  169. package/dist/src/agent/skills/index.js +4 -3
  170. package/dist/src/agent/skills/index.js.map +1 -1
  171. package/dist/src/agent/skills/installer.js +2 -2
  172. package/dist/src/agent/skills/managed-store.js +1 -1
  173. package/dist/src/agent/skills/skill-manage-ops.js +3 -2
  174. package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
  175. package/dist/src/agent/skills/skill-manager.js +1 -1
  176. package/dist/src/agent/skills/skill-view-path.js +1 -1
  177. package/dist/src/agent/skills/test-framework.js +1 -1
  178. package/dist/src/agent/skills/types.d.ts +1 -1
  179. package/dist/src/agent/skills/watcher.js +2 -5
  180. package/dist/src/agent/skills/watcher.js.map +1 -1
  181. package/dist/src/agent/skills/workspace-skills-dir.d.ts +1 -0
  182. package/dist/src/agent/skills/workspace-skills-dir.js +11 -0
  183. package/dist/src/agent/skills/workspace-skills-dir.js.map +1 -0
  184. package/dist/src/agent/starter-agents.js +1 -1
  185. package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
  186. package/dist/src/agent/tool-manuals/browser.js +62 -3
  187. package/dist/src/agent/tool-manuals/browser.js.map +1 -1
  188. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +13 -4
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  191. package/dist/src/agent/tools/browser/tool/schemas.d.ts +0 -2
  192. package/dist/src/agent/tools/browser/tool/schemas.js +1 -2
  193. package/dist/src/agent/tools/browser/tool/schemas.js.map +1 -1
  194. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  195. package/dist/src/agent/tools/factory.js +1 -10
  196. package/dist/src/agent/tools/factory.js.map +1 -1
  197. package/dist/src/agent/tools/find.js +1 -1
  198. package/dist/src/agent/tools/grep.js +1 -1
  199. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  200. package/dist/src/agent/tools/skill-manage-tool.js +2 -2
  201. package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
  202. package/dist/src/agent/tools/workflow-tool.js +1 -1
  203. package/dist/src/agent/workflow/catalog.js +1 -1
  204. package/dist/src/agent/workflow/snapshot.d.ts +10 -0
  205. package/dist/src/agent/workflow/snapshot.js +136 -1
  206. package/dist/src/agent/workflow/snapshot.js.map +1 -1
  207. package/dist/src/agent/workflow/subagent-runner.js +18 -1
  208. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  209. package/dist/src/ai-assist/text-assist.js +1 -1
  210. package/dist/src/auth/credentials.js +2 -2
  211. package/dist/src/auth/profiles/store.js +2 -2
  212. package/dist/src/auth/sync-provider-auth.js +1 -1
  213. package/dist/src/browser/actions/extension-registry-bridge.js +91 -7
  214. package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
  215. package/dist/src/browser/actions/registry.js +383 -7
  216. package/dist/src/browser/actions/registry.js.map +1 -1
  217. package/dist/src/browser/actions/types.d.ts +11 -3
  218. package/dist/src/browser/cache-dir-policy.js +1 -1
  219. package/dist/src/browser/cdp-local-launcher.js +2 -2
  220. package/dist/src/browser/index.js +2 -2
  221. package/dist/src/browser/pipeline/output.d.ts +18 -16
  222. package/dist/src/browser/pipeline/output.js +28 -20
  223. package/dist/src/browser/pipeline/output.js.map +1 -1
  224. package/dist/src/browser/pipeline/runner.d.ts +7 -14
  225. package/dist/src/browser/pipeline/runner.js +349 -102
  226. package/dist/src/browser/pipeline/runner.js.map +1 -1
  227. package/dist/src/browser/pipeline/schema.d.ts +1 -0
  228. package/dist/src/browser/pipeline/schema.js +35 -58
  229. package/dist/src/browser/pipeline/schema.js.map +1 -1
  230. package/dist/src/browser/pipeline/source.d.ts +2 -0
  231. package/dist/src/browser/pipeline/source.js +10 -1
  232. package/dist/src/browser/pipeline/source.js.map +1 -1
  233. package/dist/src/browser/pipeline/template.d.ts +10 -2
  234. package/dist/src/browser/pipeline/template.js +50 -8
  235. package/dist/src/browser/pipeline/template.js.map +1 -1
  236. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  237. package/dist/src/browser/providers/cloakbrowser.js +5 -5
  238. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  239. package/dist/src/browser/stealth.js +1 -1
  240. package/dist/src/channels/catalog/channel-catalog-service.d.ts +2 -1
  241. package/dist/src/channels/catalog/channel-catalog-service.js +133 -16
  242. package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
  243. package/dist/src/channels/catalog/channel-catalog-types.d.ts +13 -0
  244. package/dist/src/channels/outbound/persist-store.js +1 -1
  245. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  246. package/dist/src/channels/pairing/pairing-store.js +2 -2
  247. package/dist/src/chat-commands/agent-edit.js +2 -2
  248. package/dist/src/chat-commands/builtins/config.js +5 -7
  249. package/dist/src/chat-commands/builtins/config.js.map +1 -1
  250. package/dist/src/chat-commands/context.d.ts +5 -0
  251. package/dist/src/chat-commands/context.js +18 -9
  252. package/dist/src/chat-commands/context.js.map +1 -1
  253. package/dist/src/chat-commands/index.d.ts +1 -1
  254. package/dist/src/chat-commands/index.js +2 -2
  255. package/dist/src/chat-commands/index.js.map +1 -1
  256. package/dist/src/chat-commands/processor.js +22 -21
  257. package/dist/src/chat-commands/processor.js.map +1 -1
  258. package/dist/src/chat-commands/session-key.d.ts +3 -15
  259. package/dist/src/chat-commands/session-key.js +3 -49
  260. package/dist/src/chat-commands/session-key.js.map +1 -1
  261. package/dist/src/chat-commands/types.d.ts +4 -0
  262. package/dist/src/cli/commands/browser-cli-helpers.js +11 -5
  263. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  264. package/dist/src/cli/commands/config.js +1 -1
  265. package/dist/src/cli/commands/doctor/checks/channel-config.js +14 -1
  266. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
  267. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  268. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  269. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  270. package/dist/src/cli/commands/doctor/checks/session-integrity.js +8 -8
  271. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
  272. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  273. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  274. package/dist/src/cli/commands/extension-create.js +1 -1
  275. package/dist/src/cli/commands/extension-dev.js +2 -2
  276. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  277. package/dist/src/cli/commands/extension-pack.js +2 -2
  278. package/dist/src/cli/commands/extension.js +3 -3
  279. package/dist/src/cli/commands/gateway/logs.js +1 -1
  280. package/dist/src/cli/commands/image.js +1 -1
  281. package/dist/src/cli/commands/init.js +2 -2
  282. package/dist/src/cli/commands/models.js +1 -1
  283. package/dist/src/cli/commands/skills-test.js +1 -1
  284. package/dist/src/cli/templates.js +1 -1
  285. package/dist/src/cli/utils/gateway-client.js +1 -1
  286. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  287. package/dist/src/config/agent-profile.js +1 -1
  288. package/dist/src/config/agent-typed-models.js +1 -1
  289. package/dist/src/config/gateway-bind.js +1 -1
  290. package/dist/src/config/index.js +7 -7
  291. package/dist/src/config/loader.js +4 -4
  292. package/dist/src/config/models-json.js +2 -2
  293. package/dist/src/config/paths-state.js +1 -1
  294. package/dist/src/config/paths.js +1 -1
  295. package/dist/src/config/profile.js +1 -1
  296. package/dist/src/config/reload.js +1 -1
  297. package/dist/src/config/rules.js +5 -0
  298. package/dist/src/config/rules.js.map +1 -1
  299. package/dist/src/config/schema.d.ts +8 -0
  300. package/dist/src/config/schema.js +7 -0
  301. package/dist/src/config/schema.js.map +1 -1
  302. package/dist/src/config/web-patch.d.ts +1 -0
  303. package/dist/src/config/web-patch.js +1 -0
  304. package/dist/src/config/web-patch.js.map +1 -1
  305. package/dist/src/config/workspace-path.js +1 -1
  306. package/dist/src/connectors/builtin-catalog.js +180 -1
  307. package/dist/src/connectors/builtin-catalog.js.map +1 -1
  308. package/dist/src/connectors/health.js +18 -9
  309. package/dist/src/connectors/health.js.map +1 -1
  310. package/dist/src/connectors/types.d.ts +19 -0
  311. package/dist/src/connectors/usage.js +12 -4
  312. package/dist/src/connectors/usage.js.map +1 -1
  313. package/dist/src/cron/executor.js +1 -1
  314. package/dist/src/cron/service.js +1 -1
  315. package/dist/src/daemon/constants.js +1 -1
  316. package/dist/src/daemon/install-plan.js +2 -2
  317. package/dist/src/daemon/launchd.js +2 -2
  318. package/dist/src/daemon/schtasks.js +2 -2
  319. package/dist/src/daemon/systemd.js +2 -2
  320. package/dist/src/extensions/bundle-mcp.js +1 -1
  321. package/dist/src/extensions/discover-extensions.js +2 -2
  322. package/dist/src/extensions/health.js +1 -1
  323. package/dist/src/extensions/install.js +2 -2
  324. package/dist/src/extensions/loader.js +2 -2
  325. package/dist/src/extensions/lockfile.js +3 -3
  326. package/dist/src/extensions/security.js +1 -1
  327. package/dist/src/extensions/types/tui.d.ts +2 -0
  328. package/dist/src/extensions/update.js +2 -2
  329. package/dist/src/gateway/agents-admin.js +2 -2
  330. package/dist/src/gateway/file-path-classifier.js +2 -2
  331. package/dist/src/gateway/heartbeat/service.js +13 -1
  332. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  333. package/dist/src/gateway/hono/app.js +18 -5
  334. package/dist/src/gateway/hono/app.js.map +1 -1
  335. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
  336. package/dist/src/gateway/hono/lib/config-payload.js +7 -4
  337. package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
  338. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  339. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  340. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
  341. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +19 -5
  342. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -1
  343. package/dist/src/gateway/hono/oauth-async.js +1 -1
  344. package/dist/src/gateway/hono/routes/agent-stream.js +6 -6
  345. package/dist/src/gateway/hono/routes/agent-stream.js.map +1 -1
  346. package/dist/src/gateway/hono/routes/agents.js +1 -1
  347. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  348. package/dist/src/gateway/hono/routes/channels.js +18 -14
  349. package/dist/src/gateway/hono/routes/channels.js.map +1 -1
  350. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +1 -1
  351. package/dist/src/gateway/hono/routes/config-patch/gateway.js +6 -0
  352. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
  353. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  354. package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
  355. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  356. package/dist/src/gateway/hono/routes/goals.js +16 -3
  357. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  358. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  359. package/dist/src/gateway/hono/routes/logs.js +1 -0
  360. package/dist/src/gateway/hono/routes/logs.js.map +1 -1
  361. package/dist/src/gateway/hono/routes/mcp.js +27 -8
  362. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  363. package/dist/src/gateway/hono/routes/models.js +1 -1
  364. package/dist/src/gateway/hono/routes/notes.js +14 -2
  365. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  366. package/dist/src/gateway/hono/routes/sessions.js +62 -4
  367. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  368. package/dist/src/gateway/hono/routes/shares.js +1 -1
  369. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  370. package/dist/src/gateway/hono/routes/workspace.js +5 -68
  371. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  372. package/dist/src/gateway/hono/sse.d.ts +2 -2
  373. package/dist/src/gateway/hono/sse.js +7 -15
  374. package/dist/src/gateway/hono/sse.js.map +1 -1
  375. package/dist/src/gateway/lock.js +3 -3
  376. package/dist/src/gateway/ports.js +1 -1
  377. package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
  378. package/dist/src/gateway/rate-limit/buckets.js +12 -0
  379. package/dist/src/gateway/rate-limit/buckets.js.map +1 -1
  380. package/dist/src/gateway/resolve-webchat-session-key.d.ts +2 -6
  381. package/dist/src/gateway/resolve-webchat-session-key.js +5 -31
  382. package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -1
  383. package/dist/src/gateway/service/agent-runner.d.ts +2 -3
  384. package/dist/src/gateway/service/agent-runner.js +9 -22
  385. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  386. package/dist/src/gateway/service/config-coordinator.js +1 -1
  387. package/dist/src/gateway/service/marketplace-service.js +2 -2
  388. package/dist/src/gateway/service/run-gateway-agent.js +9 -7
  389. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  390. package/dist/src/gateway/service/sessions-api.d.ts +9 -0
  391. package/dist/src/gateway/service/sessions-api.js +11 -0
  392. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  393. package/dist/src/gateway/service.d.ts +1 -1
  394. package/dist/src/gateway/service.js +23 -9
  395. package/dist/src/gateway/service.js.map +1 -1
  396. package/dist/src/gateway/workspace-file-search.d.ts +9 -0
  397. package/dist/src/gateway/workspace-file-search.js +76 -0
  398. package/dist/src/gateway/workspace-file-search.js.map +1 -0
  399. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  400. package/dist/src/goals/goal-notifications.d.ts +2 -0
  401. package/dist/src/goals/goal-notifications.js +16 -11
  402. package/dist/src/goals/goal-notifications.js.map +1 -1
  403. package/dist/src/goals/goal-service.js +1 -6
  404. package/dist/src/goals/goal-service.js.map +1 -1
  405. package/dist/src/goals/goal-workflow-judge.js +2 -2
  406. package/dist/src/i18n/goals-bundle.js +1 -1
  407. package/dist/src/i18n/index.js +1 -1
  408. package/dist/src/i18n/share-tool-bundle.js +2 -2
  409. package/dist/src/infra/brew.js +1 -1
  410. package/dist/src/infra/package-json.js +1 -1
  411. package/dist/src/infra/package-update-steps.js +1 -1
  412. package/dist/src/infra/path-env.js +2 -2
  413. package/dist/src/infra/restart.js +1 -1
  414. package/dist/src/infra/stable-node-path.js +1 -1
  415. package/dist/src/infra/update-check.js +1 -1
  416. package/dist/src/infra/update-global.js +1 -1
  417. package/dist/src/infra/update-lock.js +2 -2
  418. package/dist/src/infra/update-restart.js +1 -1
  419. package/dist/src/infra/update-runner.js +1 -1
  420. package/dist/src/infra/update-startup.js +1 -1
  421. package/dist/src/infra/write-file-atomic.js +2 -2
  422. package/dist/src/media/store.js +1 -1
  423. package/dist/src/notes/agent-context.js +1 -1
  424. package/dist/src/notes/service.js +1 -1
  425. package/dist/src/notes/store.js +2 -2
  426. package/dist/src/project-trust/trust-store.js +4 -2
  427. package/dist/src/project-trust/trust-store.js.map +1 -1
  428. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  429. package/dist/src/providers/index.js +1 -1
  430. package/dist/src/providers/model-registry.js +4 -4
  431. package/dist/src/session/index.d.ts +1 -1
  432. package/dist/src/session/index.js +2 -2
  433. package/dist/src/session/init-session-turn.js +7 -10
  434. package/dist/src/session/init-session-turn.js.map +1 -1
  435. package/dist/src/session/manager.d.ts +5 -1
  436. package/dist/src/session/manager.js +5 -2
  437. package/dist/src/session/manager.js.map +1 -1
  438. package/dist/src/session/reset-type.d.ts +0 -2
  439. package/dist/src/session/reset-type.js +3 -9
  440. package/dist/src/session/reset-type.js.map +1 -1
  441. package/dist/src/session/resolve-session.js +10 -21
  442. package/dist/src/session/resolve-session.js.map +1 -1
  443. package/dist/src/session/session-title.js +2 -2
  444. package/dist/src/session/store.d.ts +11 -3
  445. package/dist/src/session/store.js +30 -14
  446. package/dist/src/session/store.js.map +1 -1
  447. package/dist/src/session/types.d.ts +2 -4
  448. package/dist/src/session/types.js.map +1 -1
  449. package/dist/src/share/share-auto.js +2 -2
  450. package/dist/src/share/share-store.js +3 -3
  451. package/dist/src/share/share-thumbnail.js +2 -2
  452. package/dist/src/share/share-zip.js +1 -1
  453. package/dist/src/share/site-share-store.js +3 -3
  454. package/dist/src/share/site-static-serve.js +1 -1
  455. package/dist/src/storage/sqlite/connection.js +1 -1
  456. package/dist/src/storage/sqlite/index.d.ts +2 -2
  457. package/dist/src/storage/sqlite/index.js +3 -3
  458. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  459. package/dist/src/storage/sqlite/migrations/010_session_id_identity.sql +30 -0
  460. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  461. package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
  462. package/dist/src/storage/sqlite/migrations/runner.js +5 -5
  463. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  464. package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
  465. package/dist/src/storage/sqlite/row-mappers.d.ts +4 -4
  466. package/dist/src/storage/sqlite/row-mappers.js +11 -14
  467. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  468. package/dist/src/storage/sqlite/schema.js +4 -4
  469. package/dist/src/storage/sqlite/schema.js.map +1 -1
  470. package/dist/src/storage/sqlite/schema.sql +37 -10
  471. package/dist/src/storage/sqlite/session-metadata.d.ts +2 -7
  472. package/dist/src/storage/sqlite/session-metadata.js +18 -72
  473. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  474. package/dist/src/storage/sqlite/session-repository.d.ts +6 -5
  475. package/dist/src/storage/sqlite/session-repository.js +34 -40
  476. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  477. package/dist/src/storage/sqlite/transcript-repository.d.ts +2 -2
  478. package/dist/src/storage/sqlite/transcript-repository.js +52 -52
  479. package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
  480. package/dist/src/tui/backends/embedded-backend.d.ts +18 -4
  481. package/dist/src/tui/backends/embedded-backend.js +100 -1
  482. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  483. package/dist/src/tui/backends/gateway-sse-backend.d.ts +5 -1
  484. package/dist/src/tui/backends/gateway-sse-backend.js +45 -2
  485. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  486. package/dist/src/tui/clipboard-image.js +3 -3
  487. package/dist/src/tui/components/chat-log.d.ts +2 -0
  488. package/dist/src/tui/components/chat-log.js +19 -0
  489. package/dist/src/tui/components/chat-log.js.map +1 -1
  490. package/dist/src/tui/extension-host/autocomplete.d.ts +3 -2
  491. package/dist/src/tui/extension-host/autocomplete.js +29 -12
  492. package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
  493. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  494. package/dist/src/tui/extension-host/runtime.d.ts +12 -0
  495. package/dist/src/tui/extension-host/runtime.js +6 -4
  496. package/dist/src/tui/extension-host/runtime.js.map +1 -1
  497. package/dist/src/tui/theme-manager.js +1 -1
  498. package/dist/src/tui/tui-backend.d.ts +23 -0
  499. package/dist/src/tui/tui-command-formatters.js +4 -4
  500. package/dist/src/tui/tui-commands.d.ts +16 -3
  501. package/dist/src/tui/tui-commands.js +134 -27
  502. package/dist/src/tui/tui-commands.js.map +1 -1
  503. package/dist/src/tui/tui-file-autocomplete.d.ts +5 -0
  504. package/dist/src/tui/tui-file-autocomplete.js +26 -0
  505. package/dist/src/tui/tui-file-autocomplete.js.map +1 -0
  506. package/dist/src/tui/tui-keybindings-file.js +1 -1
  507. package/dist/src/tui/tui-picker-overlay.js +1 -1
  508. package/dist/src/tui/tui-scoped-models.js +2 -2
  509. package/dist/src/tui/tui-settings.js +1 -1
  510. package/dist/src/tui/tui-startup-resources.js +1 -1
  511. package/dist/src/tui/tui-startup-text.js +1 -1
  512. package/dist/src/tui/tui-startup-text.js.map +1 -1
  513. package/dist/src/tui/tui.js +106 -17
  514. package/dist/src/tui/tui.js.map +1 -1
  515. package/dist/src/tunnel/frpc-binary.js +4 -4
  516. package/dist/src/tunnel/frpc-config.js +1 -1
  517. package/dist/src/tunnel/frpc-extract.js +1 -1
  518. package/dist/src/tunnel/tunnel-state.js +1 -1
  519. package/dist/src/utils/logger/audit.js +1 -1
  520. package/dist/src/utils/logger/context.d.ts +2 -2
  521. package/dist/src/utils/logger/context.js +2 -1
  522. package/dist/src/utils/logger/context.js.map +1 -1
  523. package/dist/src/utils/logger/log-store.js +2 -1
  524. package/dist/src/utils/logger/log-store.js.map +1 -1
  525. package/dist/src/utils/logger/pino-record.js +3 -0
  526. package/dist/src/utils/logger/pino-record.js.map +1 -1
  527. package/dist/src/utils/logger/rotation.js +1 -1
  528. package/dist/src/utils/logger/streams.js +1 -1
  529. package/dist/src/utils/logger/types.d.ts +5 -0
  530. package/dist/src/utils/logger/types.js.map +1 -1
  531. package/dist/src/voice/tts/audio.js +1 -1
  532. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  533. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  534. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  535. package/dist/src/workflows/service/workflow-session-bridge.js +13 -1
  536. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  537. package/dist/src/workflows/store/event-store.js +1 -1
  538. package/dist/src/workflows/store/run-store.js +1 -1
  539. package/package.json +1 -1
  540. package/dist/gateway/static/root/assets/agent-browser-settings-page-rGbKc2Hh.js +0 -6
  541. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CtwVbjOA.js +0 -1
  542. package/dist/gateway/static/root/assets/agents-CCBmGcwc.js +0 -71
  543. package/dist/gateway/static/root/assets/apps-page-xwCsJS15.js +0 -1
  544. package/dist/gateway/static/root/assets/channels-settings-C044DcYk.js +0 -1
  545. package/dist/gateway/static/root/assets/connectors-settings-8VEWUOTj.js +0 -2
  546. package/dist/gateway/static/root/assets/cron-page-DqmNGNOy.js +0 -3
  547. package/dist/gateway/static/root/assets/goal-detail-page-bv0VRDaf.js +0 -1
  548. package/dist/gateway/static/root/assets/goals-page-1Ywnt4Cb.js +0 -2
  549. package/dist/gateway/static/root/assets/goals-settings-ceEBjnfc.js +0 -1
  550. package/dist/gateway/static/root/assets/index-Cxm6xsps.js +0 -122
  551. package/dist/gateway/static/root/assets/index-b_R4tKqt.css +0 -1
  552. package/dist/gateway/static/root/assets/logs-page-B_wrxhee.js +0 -2
  553. package/dist/gateway/static/root/assets/messages-CkT-lcgP.js +0 -3
  554. package/dist/gateway/static/root/assets/models-hub-panel-D0JDSbNu.js +0 -2
  555. package/dist/gateway/static/root/assets/note-detail-page-DpFV-EO6.js +0 -2
  556. package/dist/gateway/static/root/assets/notes-page-CdkjTch8.js +0 -1
  557. package/dist/gateway/static/root/assets/remote-access-hub-DSYVAi96.js +0 -1
  558. package/dist/gateway/static/root/assets/sessions-page-CenkcVjF.js +0 -1
  559. package/dist/gateway/static/root/assets/settings-advanced-gate-D9sva86V.js +0 -1
  560. package/dist/gateway/static/root/assets/settings-page-DL35U0x0.js +0 -1
  561. package/dist/gateway/static/root/assets/setup-status-panel-Ctwbp9Er.js +0 -1
  562. package/dist/gateway/static/root/assets/shares-settings-DIM3JNsr.js +0 -1
  563. package/dist/gateway/static/root/assets/skill-reload-api-DAlNaNzL.js +0 -1
  564. package/dist/gateway/static/root/assets/skills-page-CLrHVzAt.js +0 -2
  565. package/dist/gateway/static/root/assets/voice-api-key-field-vYAO71Gn.js +0 -1
  566. package/dist/gateway/static/root/assets/workflow-page.utils-sgHjOXOm.js +0 -1
  567. package/dist/gateway/static/root/assets/workflows-page-DYyOTmFx.js +0 -18
@@ -1,6 +1,6 @@
1
1
  import { DREAMING_LAST_RUN_RELATIVE } from "./constants.js";
2
- import fs from "node:fs/promises";
3
2
  import path from "node:path";
3
+ import fs from "node:fs/promises";
4
4
  //#region src/agent/memory/dreaming/last-run.ts
5
5
  const DREAMING_LAST_RUN_FORMAT_VERSION = 2;
6
6
  function isRecord(v) {
@@ -4,8 +4,8 @@ import { DREAMING_DIR_RELATIVE } from "./constants.js";
4
4
  import { buildEntryKey, isoDay, normalizeMemoryPath, normalizeSnippetForHash, snippetHash } from "./utils.js";
5
5
  import { bumpEntryPhaseSignal, loadDreamingStore, saveDreamingStore } from "./short-term-store.js";
6
6
  import "./last-run.js";
7
- import fs from "node:fs/promises";
8
7
  import path from "node:path";
8
+ import fs from "node:fs/promises";
9
9
  //#region src/agent/memory/dreaming/light-sweep.ts
10
10
  init_logger();
11
11
  const log = createLogger("Dreaming:Light");
@@ -1,8 +1,8 @@
1
1
  import { MEMORY_MD_FILENAME } from "./constants.js";
2
2
  import { clamp01, compareCandidatesByScore, computeCandidateScore, extractPromotionMarkers, isContaminatedSnippet, isExpiredEntry, readFileLines, resolveDeepDefaults, sliceRange, snippetHash } from "./utils.js";
3
3
  import { loadDreamingStore } from "./short-term-store.js";
4
- import fs from "node:fs/promises";
5
4
  import path from "node:path";
5
+ import fs from "node:fs/promises";
6
6
  //#region src/agent/memory/dreaming/preview.ts
7
7
  async function previewDreamingDeepPromotion(params) {
8
8
  const cfg = resolveDeepDefaults(params.config);
@@ -4,8 +4,8 @@ import { DREAMING_DIR_RELATIVE, DREAMS_MD_FILENAME, MS_PER_DAY } from "./constan
4
4
  import { isoDay } from "./utils.js";
5
5
  import { bumpEntryPhaseSignal, loadDreamingStore, saveDreamingStore } from "./short-term-store.js";
6
6
  import "./last-run.js";
7
- import fs from "node:fs/promises";
8
7
  import path from "node:path";
8
+ import fs from "node:fs/promises";
9
9
  //#region src/agent/memory/dreaming/rem-patterns.ts
10
10
  init_logger();
11
11
  const log = createLogger("Dreaming:REM");
@@ -2,9 +2,9 @@ import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
3
  import { SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "./constants.js";
4
4
  import { buildEntryKey, clamp01, isoDay, normalizeMemoryPath } from "./utils.js";
5
+ import path from "node:path";
5
6
  import { createHash, randomUUID } from "node:crypto";
6
7
  import fs from "node:fs/promises";
7
- import path from "node:path";
8
8
  //#region src/agent/memory/dreaming/short-term-store.ts
9
9
  init_logger();
10
10
  const log = createLogger("Dreaming:Store");
@@ -1,7 +1,7 @@
1
1
  import { DEFAULT_DEEP_CRON, DIVERSITY_WEIGHT, MS_PER_DAY, REINFORCEMENT_WEIGHT } from "./constants.js";
2
+ import path from "node:path";
2
3
  import { createHash } from "node:crypto";
3
4
  import fs from "node:fs/promises";
4
- import path from "node:path";
5
5
  //#region src/agent/memory/dreaming/utils.ts
6
6
  /** Normalize a workspace-relative memory path: forward slashes, no odd ../ escapes at start. */
7
7
  function normalizeMemoryPath(rel) {
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { join } from "node:path";
3
4
  import { existsSync } from "node:fs";
4
5
  import { appendFile, mkdir, readFile, writeFile } from "node:fs/promises";
5
- import { join } from "node:path";
6
6
  //#region src/agent/memory/memory-flush.ts
7
7
  init_logger();
8
8
  const log = createLogger("MemoryFlush");
@@ -1,5 +1,5 @@
1
- import { readdir, stat } from "node:fs/promises";
2
1
  import { dirname, join } from "node:path";
2
+ import { readdir, stat } from "node:fs/promises";
3
3
  import { fileURLToPath } from "node:url";
4
4
  //#region src/agent/memory/plugin-discovery.ts
5
5
  async function discoverMemoryPlugins() {
@@ -1,6 +1,6 @@
1
+ import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
4
4
  import { getAllModels, getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
5
5
  import { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "../orchestration/run-agent-turn-with-timeout.js";
6
6
  import { isAssistantTurnAborted, isAssistantTurnFailed, maybeRetryTurnAfterTransientLlmFailure } from "../orchestration/llm-turn-retry.js";
@@ -3,8 +3,8 @@ import { init_logger } from "../../../utils/logger.js";
3
3
  import { requireXopcDatabase } from "../../../storage/sqlite/connection.js";
4
4
  import { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex } from "../../../storage/sqlite/memory-index-repository.js";
5
5
  import "../../../storage/sqlite/index.js";
6
- import { existsSync, readFileSync } from "fs";
7
6
  import { join, relative } from "path";
7
+ import { existsSync, readFileSync } from "fs";
8
8
  //#region src/agent/prompt/memory/index.ts
9
9
  init_logger();
10
10
  const log = createLogger("MemorySearch");
@@ -1,7 +1,7 @@
1
1
  import { resolveStateDir } from "../../config/paths-state.js";
2
- import { init_paths } from "../../config/paths.js";
3
2
  import { createLogger } from "../../utils/logger/index.js";
4
3
  import { init_logger } from "../../utils/logger.js";
4
+ import { init_paths } from "../../config/paths.js";
5
5
  import { DEFAULT_USER_FILENAME } from "../context/workspace.js";
6
6
  import { resolveSystemPromptBuildParams } from "./system-prompt-params.js";
7
7
  import { buildSystemPrompt } from "./system-prompt.js";
@@ -9,8 +9,8 @@ import { createSkillConfigManager } from "../skills/config.js";
9
9
  import { buildTtsSystemPromptHint } from "../../voice/tts/directives.js";
10
10
  import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
11
11
  import { selectSkillsVisibleInPrompt } from "../skills/format-skills-prompt.js";
12
- import { existsSync, readFileSync } from "node:fs";
13
12
  import { join } from "node:path";
13
+ import { existsSync, readFileSync } from "node:fs";
14
14
  //#region src/agent/prompt/service-prompt-builder.ts
15
15
  /**
16
16
  * System Prompt Builder - Builds the complete system prompt
@@ -1,7 +1,7 @@
1
1
  import { init_agent_scope, resolveAgentProfileDir } from "../agent-scope.js";
2
2
  import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
3
- import { readFileSync } from "node:fs";
4
3
  import { join, resolve } from "node:path";
4
+ import { readFileSync } from "node:fs";
5
5
  //#region src/agent/reply/post-compaction-context.ts
6
6
  init_agent_scope();
7
7
  const MAX_CONTEXT_CHARS = 1800;
@@ -1,5 +1,5 @@
1
- import { readFileSync } from "node:fs";
2
1
  import { resolve } from "node:path";
2
+ import { readFileSync } from "node:fs";
3
3
  //#region src/agent/reply/workspace-boundary-read.ts
4
4
  /**
5
5
  * Read a file relative to workspace root with path traversal guard and byte cap.
@@ -1,6 +1,6 @@
1
- import { realpathSync } from "node:fs";
2
- import { isAbsolute, normalize, resolve, sep } from "node:path";
3
1
  import { homedir } from "node:os";
2
+ import { isAbsolute, normalize, resolve, sep } from "node:path";
3
+ import { realpathSync } from "node:fs";
4
4
  //#region src/agent/sandbox/path-policy.ts
5
5
  /**
6
6
  * Path safety validation for sandbox isolation.
@@ -3,6 +3,11 @@ import { readAgentMessageContent } from "../memory/agent-message-access.js";
3
3
  import { complete } from "@earendil-works/pi-ai";
4
4
  //#region src/agent/service/btw-query.ts
5
5
  init_providers();
6
+ function textFromCompleteContent(content) {
7
+ if (typeof content === "string") return content;
8
+ if (!Array.isArray(content)) return "";
9
+ return content.filter((c) => c?.type === "text" && typeof c.text === "string").map((c) => c.text || "").join("");
10
+ }
6
11
  function formatMessagesForBtw(messages) {
7
12
  return messages.map((m) => {
8
13
  const role = m.role;
@@ -63,12 +68,15 @@ async function runBtwQuery(opts) {
63
68
  const controller = new AbortController();
64
69
  const timeoutId = setTimeout(() => controller.abort(), 9e4);
65
70
  try {
66
- const out = await complete(model, { messages: [userMessage] }, {
71
+ const text = textFromCompleteContent((await complete(model, { messages: [userMessage] }, {
67
72
  maxTokens: 2048,
68
73
  temperature: .4,
69
74
  signal: controller.signal
70
- });
71
- return { text: (Array.isArray(out.content) ? out.content.filter((c) => c.type === "text" && typeof c.text === "string").map((c) => c.text || "").join("") : "").trim() };
75
+ })).content).trim();
76
+ return text ? { text } : {
77
+ text: "",
78
+ error: "No text returned from model."
79
+ };
72
80
  } catch (err) {
73
81
  const em = err instanceof Error ? err.message : String(err);
74
82
  opts.log.warn({
@@ -1 +1 @@
1
- {"version":3,"file":"btw-query.js","names":[],"sources":["../../../../src/agent/service/btw-query.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport { complete, type UserMessage } from '@earendil-works/pi-ai';\n\nimport { readAgentMessageContent } from '../memory/agent-message-access.js';\nimport type { SessionStore } from '../../session/index.js';\nimport { resolveModel } from '../../providers/index.js';\n\ntype BtwLog = { warn: (obj: Record<string, unknown>, msg: string) => void };\n\nfunction formatMessagesForBtw(messages: AgentMessage[]): string {\n return messages\n .map((m) => {\n const role = m.role;\n let body = '';\n const raw = readAgentMessageContent(m);\n if (typeof raw === 'string') {\n body = raw;\n } else if (Array.isArray(raw)) {\n body = raw\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map((c) => c.text || '')\n .join('\\n');\n }\n const line = `[${role}]: ${body}`;\n return line.length > 4000 ? `${line.slice(0, 4000)}…` : line;\n })\n .join('\\n\\n');\n}\n\n/** One-shot LLM answer for /btw: transcript as background only; does not persist. */\nexport async function runBtwQuery(opts: {\n sessionKey: string;\n question: string;\n sessionStore: SessionStore;\n modelForSession: string;\n log: BtwLog;\n}): Promise<{ text: string; error?: string }> {\n const q = opts.question.trim();\n if (!q) {\n return { text: '', error: 'Empty question.' };\n }\n const messages = await opts.sessionStore.load(opts.sessionKey);\n const modelRef = opts.modelForSession;\n let model;\n try {\n model = resolveModel(modelRef);\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n opts.log.warn({ err, modelRef, errorMessage: em }, 'btwQuery: model resolve failed');\n return { text: '', error: `Could not resolve model: ${modelRef}` };\n }\n\n const background = formatMessagesForBtw(messages.slice(-40));\n const systemBlock = [\n 'You are answering an ephemeral /btw side question about the current conversation.',\n 'Use the conversation only as background context.',\n 'Answer only the side question. Do not continue or complete any unfinished task from the conversation.',\n 'Do not use tools, shell, or file writes unless the question explicitly requires a tiny code snippet.',\n 'If the question can be answered briefly, answer briefly.',\n ].join('\\n');\n\n const userPrompt = [\n systemBlock,\n '',\n '---',\n 'Conversation background (read-only):',\n background || '(empty)',\n '',\n '---',\n 'Side question:',\n q,\n ].join('\\n');\n\n const userMessage: UserMessage = { role: 'user', content: userPrompt, timestamp: Date.now() };\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 90_000);\n try {\n const out = await complete(model, { messages: [userMessage] }, {\n maxTokens: 2048,\n temperature: 0.4,\n signal: controller.signal as AbortSignal,\n });\n const text = Array.isArray(out.content)\n ? out.content\n .filter(\n (c): c is { type: 'text'; text: string } =>\n c.type === 'text' && typeof (c as { text?: unknown }).text === 'string',\n )\n .map((c) => c.text || '')\n .join('')\n : '';\n return { text: text.trim() };\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n opts.log.warn({ err, sessionKey: opts.sessionKey, errorMessage: em }, 'btwQuery failed');\n return { text: '', error: em };\n } finally {\n clearTimeout(timeoutId);\n }\n}\n"],"mappings":";;;;gBAKwD;AAIxD,SAAS,qBAAqB,UAAkC;AAC9D,QAAO,SACJ,KAAK,MAAM;EACV,MAAM,OAAO,EAAE;EACf,IAAI,OAAO;EACX,MAAM,MAAM,wBAAwB,EAAE;AACtC,MAAI,OAAO,QAAQ,SACjB,QAAO;WACE,MAAM,QAAQ,IAAI,CAC3B,QAAO,IACJ,QAAQ,MAA2C,EAAE,SAAS,OAAO,CACrE,KAAK,MAAM,EAAE,QAAQ,GAAG,CACxB,KAAK,KAAK;EAEf,MAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,SAAO,KAAK,SAAS,MAAO,GAAG,KAAK,MAAM,GAAG,IAAK,CAAC,KAAK;GACxD,CACD,KAAK,OAAO;;;AAIjB,eAAsB,YAAY,MAMY;CAC5C,MAAM,IAAI,KAAK,SAAS,MAAM;AAC9B,KAAI,CAAC,EACH,QAAO;EAAE,MAAM;EAAI,OAAO;EAAmB;CAE/C,MAAM,WAAW,MAAM,KAAK,aAAa,KAAK,KAAK,WAAW;CAC9D,MAAM,WAAW,KAAK;CACtB,IAAI;AACJ,KAAI;AACF,UAAQ,aAAa,SAAS;UACvB,KAAK;EACZ,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC3D,OAAK,IAAI,KAAK;GAAE;GAAK;GAAU,cAAc;GAAI,EAAE,iCAAiC;AACpF,SAAO;GAAE,MAAM;GAAI,OAAO,4BAA4B;GAAY;;CAGpE,MAAM,aAAa,qBAAqB,SAAS,MAAM,IAAI,CAAC;CAqB5D,MAAM,cAA2B;EAAE,MAAM;EAAQ,SAZ9B;GARC;IAClB;IACA;IACA;IACA;IACA;IACD,CAAC,KAAK,KAGM;GACX;GACA;GACA;GACA,cAAc;GACd;GACA;GACA;GACA;GACD,CAAC,KAAK,KAE6D;EAAE,WAAW,KAAK,KAAK;EAAE;CAC7F,MAAM,aAAa,IAAI,iBAAiB;CACxC,MAAM,YAAY,iBAAiB,WAAW,OAAO,EAAE,IAAO;AAC9D,KAAI;EACF,MAAM,MAAM,MAAM,SAAS,OAAO,EAAE,UAAU,CAAC,YAAY,EAAE,EAAE;GAC7D,WAAW;GACX,aAAa;GACb,QAAQ,WAAW;GACpB,CAAC;AAUF,SAAO,EAAE,OATI,MAAM,QAAQ,IAAI,QAAQ,GACnC,IAAI,QACD,QACE,MACC,EAAE,SAAS,UAAU,OAAQ,EAAyB,SAAS,SAClE,CACA,KAAK,MAAM,EAAE,QAAQ,GAAG,CACxB,KAAK,GAAG,GACX,IACgB,MAAM,EAAE;UACrB,KAAK;EACZ,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC3D,OAAK,IAAI,KAAK;GAAE;GAAK,YAAY,KAAK;GAAY,cAAc;GAAI,EAAE,kBAAkB;AACxF,SAAO;GAAE,MAAM;GAAI,OAAO;GAAI;WACtB;AACR,eAAa,UAAU"}
1
+ {"version":3,"file":"btw-query.js","names":[],"sources":["../../../../src/agent/service/btw-query.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport { complete, type UserMessage } from '@earendil-works/pi-ai';\n\nimport { readAgentMessageContent } from '../memory/agent-message-access.js';\nimport type { SessionStore } from '../../session/index.js';\nimport { resolveModel } from '../../providers/index.js';\n\ntype BtwLog = { warn: (obj: Record<string, unknown>, msg: string) => void };\n\nfunction textFromCompleteContent(content: unknown): string {\n if (typeof content === 'string') {\n return content;\n }\n if (!Array.isArray(content)) {\n return '';\n }\n return content\n .filter(\n (c): c is { type: 'text'; text: string } =>\n c?.type === 'text' && typeof (c as { text?: unknown }).text === 'string',\n )\n .map((c) => c.text || '')\n .join('');\n}\n\nfunction formatMessagesForBtw(messages: AgentMessage[]): string {\n return messages\n .map((m) => {\n const role = m.role;\n let body = '';\n const raw = readAgentMessageContent(m);\n if (typeof raw === 'string') {\n body = raw;\n } else if (Array.isArray(raw)) {\n body = raw\n .filter((c): c is { type: 'text'; text: string } => c.type === 'text')\n .map((c) => c.text || '')\n .join('\\n');\n }\n const line = `[${role}]: ${body}`;\n return line.length > 4000 ? `${line.slice(0, 4000)}…` : line;\n })\n .join('\\n\\n');\n}\n\n/** One-shot LLM answer for /btw: transcript as background only; does not persist. */\nexport async function runBtwQuery(opts: {\n sessionKey: string;\n question: string;\n sessionStore: SessionStore;\n modelForSession: string;\n log: BtwLog;\n}): Promise<{ text: string; error?: string }> {\n const q = opts.question.trim();\n if (!q) {\n return { text: '', error: 'Empty question.' };\n }\n const messages = await opts.sessionStore.load(opts.sessionKey);\n const modelRef = opts.modelForSession;\n let model;\n try {\n model = resolveModel(modelRef);\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n opts.log.warn({ err, modelRef, errorMessage: em }, 'btwQuery: model resolve failed');\n return { text: '', error: `Could not resolve model: ${modelRef}` };\n }\n\n const background = formatMessagesForBtw(messages.slice(-40));\n const systemBlock = [\n 'You are answering an ephemeral /btw side question about the current conversation.',\n 'Use the conversation only as background context.',\n 'Answer only the side question. Do not continue or complete any unfinished task from the conversation.',\n 'Do not use tools, shell, or file writes unless the question explicitly requires a tiny code snippet.',\n 'If the question can be answered briefly, answer briefly.',\n ].join('\\n');\n\n const userPrompt = [\n systemBlock,\n '',\n '---',\n 'Conversation background (read-only):',\n background || '(empty)',\n '',\n '---',\n 'Side question:',\n q,\n ].join('\\n');\n\n const userMessage: UserMessage = { role: 'user', content: userPrompt, timestamp: Date.now() };\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), 90_000);\n try {\n const out = await complete(model, { messages: [userMessage] }, {\n maxTokens: 2048,\n temperature: 0.4,\n signal: controller.signal as AbortSignal,\n });\n const text = textFromCompleteContent((out as { content?: unknown }).content).trim();\n return text ? { text } : { text: '', error: 'No text returned from model.' };\n } catch (err) {\n const em = err instanceof Error ? err.message : String(err);\n opts.log.warn({ err, sessionKey: opts.sessionKey, errorMessage: em }, 'btwQuery failed');\n return { text: '', error: em };\n } finally {\n clearTimeout(timeoutId);\n }\n}\n"],"mappings":";;;;gBAKwD;AAIxD,SAAS,wBAAwB,SAA0B;AACzD,KAAI,OAAO,YAAY,SACrB,QAAO;AAET,KAAI,CAAC,MAAM,QAAQ,QAAQ,CACzB,QAAO;AAET,QAAO,QACJ,QACE,MACC,GAAG,SAAS,UAAU,OAAQ,EAAyB,SAAS,SACnE,CACA,KAAK,MAAM,EAAE,QAAQ,GAAG,CACxB,KAAK,GAAG;;AAGb,SAAS,qBAAqB,UAAkC;AAC9D,QAAO,SACJ,KAAK,MAAM;EACV,MAAM,OAAO,EAAE;EACf,IAAI,OAAO;EACX,MAAM,MAAM,wBAAwB,EAAE;AACtC,MAAI,OAAO,QAAQ,SACjB,QAAO;WACE,MAAM,QAAQ,IAAI,CAC3B,QAAO,IACJ,QAAQ,MAA2C,EAAE,SAAS,OAAO,CACrE,KAAK,MAAM,EAAE,QAAQ,GAAG,CACxB,KAAK,KAAK;EAEf,MAAM,OAAO,IAAI,KAAK,KAAK;AAC3B,SAAO,KAAK,SAAS,MAAO,GAAG,KAAK,MAAM,GAAG,IAAK,CAAC,KAAK;GACxD,CACD,KAAK,OAAO;;;AAIjB,eAAsB,YAAY,MAMY;CAC5C,MAAM,IAAI,KAAK,SAAS,MAAM;AAC9B,KAAI,CAAC,EACH,QAAO;EAAE,MAAM;EAAI,OAAO;EAAmB;CAE/C,MAAM,WAAW,MAAM,KAAK,aAAa,KAAK,KAAK,WAAW;CAC9D,MAAM,WAAW,KAAK;CACtB,IAAI;AACJ,KAAI;AACF,UAAQ,aAAa,SAAS;UACvB,KAAK;EACZ,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC3D,OAAK,IAAI,KAAK;GAAE;GAAK;GAAU,cAAc;GAAI,EAAE,iCAAiC;AACpF,SAAO;GAAE,MAAM;GAAI,OAAO,4BAA4B;GAAY;;CAGpE,MAAM,aAAa,qBAAqB,SAAS,MAAM,IAAI,CAAC;CAqB5D,MAAM,cAA2B;EAAE,MAAM;EAAQ,SAZ9B;GARC;IAClB;IACA;IACA;IACA;IACA;IACD,CAAC,KAAK,KAGM;GACX;GACA;GACA;GACA,cAAc;GACd;GACA;GACA;GACA;GACD,CAAC,KAAK,KAE6D;EAAE,WAAW,KAAK,KAAK;EAAE;CAC7F,MAAM,aAAa,IAAI,iBAAiB;CACxC,MAAM,YAAY,iBAAiB,WAAW,OAAO,EAAE,IAAO;AAC9D,KAAI;EAMF,MAAM,OAAO,yBAAyB,MALpB,SAAS,OAAO,EAAE,UAAU,CAAC,YAAY,EAAE,EAAE;GAC7D,WAAW;GACX,aAAa;GACb,QAAQ,WAAW;GACpB,CAAC,EACkE,QAAQ,CAAC,MAAM;AACnF,SAAO,OAAO,EAAE,MAAM,GAAG;GAAE,MAAM;GAAI,OAAO;GAAgC;UACrE,KAAK;EACZ,MAAM,KAAK,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC3D,OAAK,IAAI,KAAK;GAAE;GAAK,YAAY,KAAK;GAAY,cAAc;GAAI,EAAE,kBAAkB;AACxF,SAAO;GAAE,MAAM;GAAI,OAAO;GAAI;WACtB;AACR,eAAa,UAAU"}
@@ -1,7 +1,7 @@
1
- import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
1
+ import { getSessionMetadata } from "../../storage/sqlite/session-repository.js";
2
+ import "../../storage/sqlite/index.js";
2
3
  import { INTERNAL_OUTBOUND_DROP_CHANNEL } from "../../channels/internal-outbound.js";
3
4
  //#region src/agent/service/parse-outbound-session-key.ts
4
- init_session_key();
5
5
  /**
6
6
  * Map a session key to outbound channel routing (heartbeat/cron/virtual keys included).
7
7
  */
@@ -21,18 +21,23 @@ function parseOutboundSessionKey(sessionKey, config) {
21
21
  chatId: parts.slice(1).join(":") || "heartbeat"
22
22
  };
23
23
  }
24
- const parsed = parseSessionKey(sessionKey);
25
- if (parsed) return {
26
- channel: parsed.source,
27
- chatId: parsed.peerId
24
+ const metadata = getSessionMetadata(sessionKey);
25
+ const routing = metadata?.routing;
26
+ if (routing?.source && routing.peerId) return {
27
+ channel: routing.source,
28
+ chatId: routing.peerId
29
+ };
30
+ if (metadata?.sourceChannel && metadata.sourceChatId) return {
31
+ channel: metadata.sourceChannel,
32
+ chatId: metadata.sourceChatId
28
33
  };
29
34
  if (first === "cron") return {
30
35
  channel: INTERNAL_OUTBOUND_DROP_CHANNEL,
31
36
  chatId: parts.slice(1).join(":") || "cron"
32
37
  };
33
38
  return {
34
- channel: first,
35
- chatId: parts.slice(1).join(":") || "direct"
39
+ channel: "cli",
40
+ chatId: "main"
36
41
  };
37
42
  }
38
43
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"parse-outbound-session-key.js","names":["parseRoutingSessionKey"],"sources":["../../../../src/agent/service/parse-outbound-session-key.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { INTERNAL_OUTBOUND_DROP_CHANNEL } from '../../channels/internal-outbound.js';\nimport { parseSessionKey as parseRoutingSessionKey } from '../../routing/session-key.js';\n\n/**\n * Map a session key to outbound channel routing (heartbeat/cron/virtual keys included).\n */\nexport function parseOutboundSessionKey(\n sessionKey: string,\n config: Config | undefined,\n): { channel: string; chatId: string } {\n const parts = sessionKey.split(':').filter(Boolean);\n const first = parts[0] || 'cli';\n\n if (first === 'heartbeat') {\n const hb = config?.gateway?.heartbeat;\n const target = hb?.target?.trim();\n const targetChatId = hb?.targetChatId?.trim();\n if (target && targetChatId) {\n return { channel: target, chatId: targetChatId };\n }\n return { channel: INTERNAL_OUTBOUND_DROP_CHANNEL, chatId: parts.slice(1).join(':') || 'heartbeat' };\n }\n\n const parsed = parseRoutingSessionKey(sessionKey);\n if (parsed) {\n return { channel: parsed.source, chatId: parsed.peerId };\n }\n\n if (first === 'cron') {\n return { channel: INTERNAL_OUTBOUND_DROP_CHANNEL, chatId: parts.slice(1).join(':') || 'cron' };\n }\n\n return {\n channel: first,\n chatId: parts.slice(1).join(':') || 'direct',\n };\n}\n"],"mappings":";;;kBAEyF;;;;AAKzF,SAAgB,wBACd,YACA,QACqC;CACrC,MAAM,QAAQ,WAAW,MAAM,IAAI,CAAC,OAAO,QAAQ;CACnD,MAAM,QAAQ,MAAM,MAAM;AAE1B,KAAI,UAAU,aAAa;EACzB,MAAM,KAAK,QAAQ,SAAS;EAC5B,MAAM,SAAS,IAAI,QAAQ,MAAM;EACjC,MAAM,eAAe,IAAI,cAAc,MAAM;AAC7C,MAAI,UAAU,aACZ,QAAO;GAAE,SAAS;GAAQ,QAAQ;GAAc;AAElD,SAAO;GAAE,SAAS;GAAgC,QAAQ,MAAM,MAAM,EAAE,CAAC,KAAK,IAAI,IAAI;GAAa;;CAGrG,MAAM,SAASA,gBAAuB,WAAW;AACjD,KAAI,OACF,QAAO;EAAE,SAAS,OAAO;EAAQ,QAAQ,OAAO;EAAQ;AAG1D,KAAI,UAAU,OACZ,QAAO;EAAE,SAAS;EAAgC,QAAQ,MAAM,MAAM,EAAE,CAAC,KAAK,IAAI,IAAI;EAAQ;AAGhG,QAAO;EACL,SAAS;EACT,QAAQ,MAAM,MAAM,EAAE,CAAC,KAAK,IAAI,IAAI;EACrC"}
1
+ {"version":3,"file":"parse-outbound-session-key.js","names":[],"sources":["../../../../src/agent/service/parse-outbound-session-key.ts"],"sourcesContent":["import type { Config } from '../../config/schema.js';\nimport { INTERNAL_OUTBOUND_DROP_CHANNEL } from '../../channels/internal-outbound.js';\nimport { getSessionMetadata } from '../../storage/sqlite/index.js';\n\n/**\n * Map a session key to outbound channel routing (heartbeat/cron/virtual keys included).\n */\nexport function parseOutboundSessionKey(\n sessionKey: string,\n config: Config | undefined,\n): { channel: string; chatId: string } {\n const parts = sessionKey.split(':').filter(Boolean);\n const first = parts[0] || 'cli';\n\n if (first === 'heartbeat') {\n const hb = config?.gateway?.heartbeat;\n const target = hb?.target?.trim();\n const targetChatId = hb?.targetChatId?.trim();\n if (target && targetChatId) {\n return { channel: target, chatId: targetChatId };\n }\n return { channel: INTERNAL_OUTBOUND_DROP_CHANNEL, chatId: parts.slice(1).join(':') || 'heartbeat' };\n }\n\n const metadata = getSessionMetadata(sessionKey);\n const routing = metadata?.routing;\n if (routing?.source && routing.peerId) {\n return { channel: routing.source, chatId: routing.peerId };\n }\n if (metadata?.sourceChannel && metadata.sourceChatId) {\n return { channel: metadata.sourceChannel, chatId: metadata.sourceChatId };\n }\n\n if (first === 'cron') {\n return { channel: INTERNAL_OUTBOUND_DROP_CHANNEL, chatId: parts.slice(1).join(':') || 'cron' };\n }\n\n return { channel: 'cli', chatId: 'main' };\n}\n"],"mappings":";;;;;;;AAOA,SAAgB,wBACd,YACA,QACqC;CACrC,MAAM,QAAQ,WAAW,MAAM,IAAI,CAAC,OAAO,QAAQ;CACnD,MAAM,QAAQ,MAAM,MAAM;AAE1B,KAAI,UAAU,aAAa;EACzB,MAAM,KAAK,QAAQ,SAAS;EAC5B,MAAM,SAAS,IAAI,QAAQ,MAAM;EACjC,MAAM,eAAe,IAAI,cAAc,MAAM;AAC7C,MAAI,UAAU,aACZ,QAAO;GAAE,SAAS;GAAQ,QAAQ;GAAc;AAElD,SAAO;GAAE,SAAS;GAAgC,QAAQ,MAAM,MAAM,EAAE,CAAC,KAAK,IAAI,IAAI;GAAa;;CAGrG,MAAM,WAAW,mBAAmB,WAAW;CAC/C,MAAM,UAAU,UAAU;AAC1B,KAAI,SAAS,UAAU,QAAQ,OAC7B,QAAO;EAAE,SAAS,QAAQ;EAAQ,QAAQ,QAAQ;EAAQ;AAE5D,KAAI,UAAU,iBAAiB,SAAS,aACtC,QAAO;EAAE,SAAS,SAAS;EAAe,QAAQ,SAAS;EAAc;AAG3E,KAAI,UAAU,OACZ,QAAO;EAAE,SAAS;EAAgC,QAAQ,MAAM,MAAM,EAAE,CAAC,KAAK,IAAI,IAAI;EAAQ;AAGhG,QAAO;EAAE,SAAS;EAAO,QAAQ;EAAQ"}
@@ -8,10 +8,10 @@ import type { InboundAttachmentInput, MediaRef } from '../../channels/attachment
8
8
  export type RunProcessDirectDeps = {
9
9
  log: ProcessDirectStreamLog;
10
10
  config: Config;
11
- parseSessionKey: (sessionKey: string) => {
11
+ resolveSessionEndpoint: (sessionKey: string) => Promise<{
12
12
  channel: string;
13
13
  chatId: string;
14
- };
14
+ }>;
15
15
  initSessionContext: (sessionKey: string, channel: string, chatId: string) => void;
16
16
  hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;
17
17
  hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;
@@ -5,7 +5,7 @@ import { buildDirectUserMessageContent } from "./build-direct-message-content.js
5
5
  import { hydratePerTurnState, runDirectAgentTurn, tryRunSlashCommand } from "./direct-turn-helpers.js";
6
6
  //#region src/agent/service/process-direct-one-shot.ts
7
7
  async function runProcessDirect(deps, input) {
8
- const { channel, chatId } = deps.parseSessionKey(input.sessionKey);
8
+ const { channel, chatId } = await deps.resolveSessionEndpoint(input.sessionKey);
9
9
  deps.initSessionContext(input.sessionKey, channel, chatId);
10
10
  try {
11
11
  let turnBody = input.content;
@@ -1 +1 @@
1
- {"version":3,"file":"process-direct-one-shot.js","names":[],"sources":["../../../../src/agent/service/process-direct-one-shot.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { SessionStore } from '../../session/index.js';\nimport type { Config } from '../../config/schema.js';\nimport { initSessionTurn } from '../../session/index.js';\nimport {\n buildDirectUserMessageContent,\n} from './build-direct-message-content.js';\nimport type { ProcessDirectStreamLog } from './process-direct-streaming.js';\nimport type {\n InboundAttachmentInput,\n MediaRef,\n} from '../../channels/attachments/inbound-persist.js';\nimport {\n hydratePerTurnState,\n runDirectAgentTurn,\n tryRunSlashCommand,\n} from './direct-turn-helpers.js';\nimport {\n clearPendingTranscriptUserMessage,\n setPendingTranscriptUserMessage,\n type TranscriptUserMessage,\n} from '../inbound/attachment-pipeline.js';\n\nexport type RunProcessDirectDeps = {\n log: ProcessDirectStreamLog;\n config: Config;\n parseSessionKey: (sessionKey: string) => { channel: string; chatId: string };\n initSessionContext: (sessionKey: string, channel: string, chatId: string) => void;\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n agentManager: AgentInstanceGateway;\n sessionStore: SessionStore;\n modelManager: ModelManager;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n prepareInboundAttachments: (\n sessionKey: string,\n attachments?: InboundAttachmentInput[],\n ) => Promise<MediaRef[] | undefined>;\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n onTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n endDirectRequestContext: () => void;\n resetSession: (sessionKey: string) => Promise<{ sessionId: string; previousSessionId: string } | null>;\n};\n\nexport async function runProcessDirect(\n deps: RunProcessDirectDeps,\n input: {\n content: string;\n sessionKey: string;\n attachments?: InboundAttachmentInput[];\n thinking?: string;\n },\n): Promise<string> {\n const { channel, chatId } = deps.parseSessionKey(input.sessionKey);\n deps.initSessionContext(input.sessionKey, channel, chatId);\n\n try {\n let turnBody = input.content;\n let resetTriggeredAtInit = false;\n const turn = await initSessionTurn({\n cfg: deps.config,\n sessionKey: input.sessionKey,\n body: input.content,\n resetSession: deps.resetSession,\n });\n resetTriggeredAtInit = turn.resetTriggered;\n if (turn.bareReset && turn.ackMessage) {\n return turn.ackMessage;\n }\n turnBody = turn.bodyStripped;\n\n await hydratePerTurnState(deps, input.sessionKey, input.thinking);\n const prepared = await deps.prepareInboundAttachments(input.sessionKey, input.attachments);\n\n const slash = await tryRunSlashCommand(\n deps,\n { sessionKey: input.sessionKey, channel, chatId },\n turnBody,\n { skipResetCommands: resetTriggeredAtInit },\n );\n if (slash.matched) {\n const trimmed = slash.aggregatedText.trim();\n if (trimmed) {\n await deps.sessionStore.appendTranscriptMessage(input.sessionKey, {\n role: 'assistant',\n content: [{ type: 'text', text: trimmed }],\n timestamp: Date.now(),\n } as AgentMessage);\n }\n return slash.aggregatedText ?? '';\n }\n\n const textForDirect = turnBody.trimStart().startsWith('/skill:')\n ? deps.agentManager.expandSkillUserText(turnBody)\n : turnBody;\n const userMessage = await buildDirectUserMessageContent({\n content: textForDirect,\n attachments: prepared,\n sessionKey: input.sessionKey,\n config: deps.config,\n agentManager: deps.agentManager,\n modelManager: deps.modelManager,\n });\n\n const pendingUserMessage = userMessage as TranscriptUserMessage;\n setPendingTranscriptUserMessage(input.sessionKey, pendingUserMessage);\n\n const result = await (async () => {\n try {\n return await runDirectAgentTurn(\n { ...deps, config: deps.config },\n {\n sessionKey: input.sessionKey,\n userMessage,\n },\n );\n } finally {\n clearPendingTranscriptUserMessage(input.sessionKey, pendingUserMessage);\n }\n })();\n\n if (result.lastAssistantText) {\n deps.onTurnComplete?.(input.sessionKey, result.lastAssistantText);\n }\n\n return result.lastAssistantText ?? '';\n } finally {\n deps.endDirectRequestContext();\n }\n}\n"],"mappings":";;;;;;AAgDA,eAAsB,iBACpB,MACA,OAMiB;CACjB,MAAM,EAAE,SAAS,WAAW,KAAK,gBAAgB,MAAM,WAAW;AAClE,MAAK,mBAAmB,MAAM,YAAY,SAAS,OAAO;AAE1D,KAAI;EACF,IAAI,WAAW,MAAM;EACrB,IAAI,uBAAuB;EAC3B,MAAM,OAAO,MAAM,gBAAgB;GACjC,KAAK,KAAK;GACV,YAAY,MAAM;GAClB,MAAM,MAAM;GACZ,cAAc,KAAK;GACpB,CAAC;AACF,yBAAuB,KAAK;AAC5B,MAAI,KAAK,aAAa,KAAK,WACzB,QAAO,KAAK;AAEd,aAAW,KAAK;AAEhB,QAAM,oBAAoB,MAAM,MAAM,YAAY,MAAM,SAAS;EACjE,MAAM,WAAW,MAAM,KAAK,0BAA0B,MAAM,YAAY,MAAM,YAAY;EAE1F,MAAM,QAAQ,MAAM,mBAClB,MACA;GAAE,YAAY,MAAM;GAAY;GAAS;GAAQ,EACjD,UACA,EAAE,mBAAmB,sBAAsB,CAC5C;AACD,MAAI,MAAM,SAAS;GACjB,MAAM,UAAU,MAAM,eAAe,MAAM;AAC3C,OAAI,QACF,OAAM,KAAK,aAAa,wBAAwB,MAAM,YAAY;IAChE,MAAM;IACN,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM;KAAS,CAAC;IAC1C,WAAW,KAAK,KAAK;IACtB,CAAiB;AAEpB,UAAO,MAAM,kBAAkB;;EAMjC,MAAM,cAAc,MAAM,8BAA8B;GACtD,SAJoB,SAAS,WAAW,CAAC,WAAW,UAAU,GAC5D,KAAK,aAAa,oBAAoB,SAAS,GAC/C;GAGF,aAAa;GACb,YAAY,MAAM;GAClB,QAAQ,KAAK;GACb,cAAc,KAAK;GACnB,cAAc,KAAK;GACpB,CAAC;EAEF,MAAM,qBAAqB;AAC3B,kCAAgC,MAAM,YAAY,mBAAmB;EAErE,MAAM,SAAS,OAAO,YAAY;AAChC,OAAI;AACF,WAAO,MAAM,mBACX;KAAE,GAAG;KAAM,QAAQ,KAAK;KAAQ,EAChC;KACE,YAAY,MAAM;KAClB;KACD,CACF;aACO;AACR,sCAAkC,MAAM,YAAY,mBAAmB;;MAEvE;AAEJ,MAAI,OAAO,kBACT,MAAK,iBAAiB,MAAM,YAAY,OAAO,kBAAkB;AAGnE,SAAO,OAAO,qBAAqB;WAC3B;AACR,OAAK,yBAAyB"}
1
+ {"version":3,"file":"process-direct-one-shot.js","names":[],"sources":["../../../../src/agent/service/process-direct-one-shot.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\n\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { SessionStore } from '../../session/index.js';\nimport type { Config } from '../../config/schema.js';\nimport { initSessionTurn } from '../../session/index.js';\nimport {\n buildDirectUserMessageContent,\n} from './build-direct-message-content.js';\nimport type { ProcessDirectStreamLog } from './process-direct-streaming.js';\nimport type {\n InboundAttachmentInput,\n MediaRef,\n} from '../../channels/attachments/inbound-persist.js';\nimport {\n hydratePerTurnState,\n runDirectAgentTurn,\n tryRunSlashCommand,\n} from './direct-turn-helpers.js';\nimport {\n clearPendingTranscriptUserMessage,\n setPendingTranscriptUserMessage,\n type TranscriptUserMessage,\n} from '../inbound/attachment-pipeline.js';\n\nexport type RunProcessDirectDeps = {\n log: ProcessDirectStreamLog;\n config: Config;\n resolveSessionEndpoint: (sessionKey: string) => Promise<{ channel: string; chatId: string }>;\n initSessionContext: (sessionKey: string, channel: string, chatId: string) => void;\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n agentManager: AgentInstanceGateway;\n sessionStore: SessionStore;\n modelManager: ModelManager;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n prepareInboundAttachments: (\n sessionKey: string,\n attachments?: InboundAttachmentInput[],\n ) => Promise<MediaRef[] | undefined>;\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n onTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n endDirectRequestContext: () => void;\n resetSession: (sessionKey: string) => Promise<{ sessionId: string; previousSessionId: string } | null>;\n};\n\nexport async function runProcessDirect(\n deps: RunProcessDirectDeps,\n input: {\n content: string;\n sessionKey: string;\n attachments?: InboundAttachmentInput[];\n thinking?: string;\n },\n): Promise<string> {\n const { channel, chatId } = await deps.resolveSessionEndpoint(input.sessionKey);\n deps.initSessionContext(input.sessionKey, channel, chatId);\n\n try {\n let turnBody = input.content;\n let resetTriggeredAtInit = false;\n const turn = await initSessionTurn({\n cfg: deps.config,\n sessionKey: input.sessionKey,\n body: input.content,\n resetSession: deps.resetSession,\n });\n resetTriggeredAtInit = turn.resetTriggered;\n if (turn.bareReset && turn.ackMessage) {\n return turn.ackMessage;\n }\n turnBody = turn.bodyStripped;\n\n await hydratePerTurnState(deps, input.sessionKey, input.thinking);\n const prepared = await deps.prepareInboundAttachments(input.sessionKey, input.attachments);\n\n const slash = await tryRunSlashCommand(\n deps,\n { sessionKey: input.sessionKey, channel, chatId },\n turnBody,\n { skipResetCommands: resetTriggeredAtInit },\n );\n if (slash.matched) {\n const trimmed = slash.aggregatedText.trim();\n if (trimmed) {\n await deps.sessionStore.appendTranscriptMessage(input.sessionKey, {\n role: 'assistant',\n content: [{ type: 'text', text: trimmed }],\n timestamp: Date.now(),\n } as AgentMessage);\n }\n return slash.aggregatedText ?? '';\n }\n\n const textForDirect = turnBody.trimStart().startsWith('/skill:')\n ? deps.agentManager.expandSkillUserText(turnBody)\n : turnBody;\n const userMessage = await buildDirectUserMessageContent({\n content: textForDirect,\n attachments: prepared,\n sessionKey: input.sessionKey,\n config: deps.config,\n agentManager: deps.agentManager,\n modelManager: deps.modelManager,\n });\n\n const pendingUserMessage = userMessage as TranscriptUserMessage;\n setPendingTranscriptUserMessage(input.sessionKey, pendingUserMessage);\n\n const result = await (async () => {\n try {\n return await runDirectAgentTurn(\n { ...deps, config: deps.config },\n {\n sessionKey: input.sessionKey,\n userMessage,\n },\n );\n } finally {\n clearPendingTranscriptUserMessage(input.sessionKey, pendingUserMessage);\n }\n })();\n\n if (result.lastAssistantText) {\n deps.onTurnComplete?.(input.sessionKey, result.lastAssistantText);\n }\n\n return result.lastAssistantText ?? '';\n } finally {\n deps.endDirectRequestContext();\n }\n}\n"],"mappings":";;;;;;AAgDA,eAAsB,iBACpB,MACA,OAMiB;CACjB,MAAM,EAAE,SAAS,WAAW,MAAM,KAAK,uBAAuB,MAAM,WAAW;AAC/E,MAAK,mBAAmB,MAAM,YAAY,SAAS,OAAO;AAE1D,KAAI;EACF,IAAI,WAAW,MAAM;EACrB,IAAI,uBAAuB;EAC3B,MAAM,OAAO,MAAM,gBAAgB;GACjC,KAAK,KAAK;GACV,YAAY,MAAM;GAClB,MAAM,MAAM;GACZ,cAAc,KAAK;GACpB,CAAC;AACF,yBAAuB,KAAK;AAC5B,MAAI,KAAK,aAAa,KAAK,WACzB,QAAO,KAAK;AAEd,aAAW,KAAK;AAEhB,QAAM,oBAAoB,MAAM,MAAM,YAAY,MAAM,SAAS;EACjE,MAAM,WAAW,MAAM,KAAK,0BAA0B,MAAM,YAAY,MAAM,YAAY;EAE1F,MAAM,QAAQ,MAAM,mBAClB,MACA;GAAE,YAAY,MAAM;GAAY;GAAS;GAAQ,EACjD,UACA,EAAE,mBAAmB,sBAAsB,CAC5C;AACD,MAAI,MAAM,SAAS;GACjB,MAAM,UAAU,MAAM,eAAe,MAAM;AAC3C,OAAI,QACF,OAAM,KAAK,aAAa,wBAAwB,MAAM,YAAY;IAChE,MAAM;IACN,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM;KAAS,CAAC;IAC1C,WAAW,KAAK,KAAK;IACtB,CAAiB;AAEpB,UAAO,MAAM,kBAAkB;;EAMjC,MAAM,cAAc,MAAM,8BAA8B;GACtD,SAJoB,SAAS,WAAW,CAAC,WAAW,UAAU,GAC5D,KAAK,aAAa,oBAAoB,SAAS,GAC/C;GAGF,aAAa;GACb,YAAY,MAAM;GAClB,QAAQ,KAAK;GACb,cAAc,KAAK;GACnB,cAAc,KAAK;GACpB,CAAC;EAEF,MAAM,qBAAqB;AAC3B,kCAAgC,MAAM,YAAY,mBAAmB;EAErE,MAAM,SAAS,OAAO,YAAY;AAChC,OAAI;AACF,WAAO,MAAM,mBACX;KAAE,GAAG;KAAM,QAAQ,KAAK;KAAQ,EAChC;KACE,YAAY,MAAM;KAClB;KACD,CACF;aACO;AACR,sCAAkC,MAAM,YAAY,mBAAmB;;MAEvE;AAEJ,MAAI,OAAO,kBACT,MAAK,iBAAiB,MAAM,YAAY,OAAO,kBAAkB;AAGnE,SAAO,OAAO,qBAAqB;WAC3B;AACR,OAAK,yBAAyB"}
@@ -15,10 +15,10 @@ export type ProcessDirectStreamLog = {
15
15
  };
16
16
  export interface ProcessDirectStreamingDeps {
17
17
  log: ProcessDirectStreamLog;
18
- parseSessionKey: (sessionKey: string) => {
18
+ resolveSessionEndpoint: (sessionKey: string) => Promise<{
19
19
  channel: string;
20
20
  chatId: string;
21
- };
21
+ }>;
22
22
  initDirectStreamingSession: (sessionKey: string, channel: string, chatId: string) => SessionContext;
23
23
  registerWebchatSsePublisher: (sessionKey: string, publisher: (event: {
24
24
  type: string;
@@ -42,7 +42,7 @@ function pushAssistantReceipt(queue, text, runId) {
42
42
  }
43
43
  async function* runProcessDirectStreaming(deps, input) {
44
44
  const sessionKey = input.sessionKey ?? "agent:main:main";
45
- const { channel, chatId } = deps.parseSessionKey(sessionKey);
45
+ const { channel, chatId } = await deps.resolveSessionEndpoint(sessionKey);
46
46
  const context = deps.initDirectStreamingSession(sessionKey, channel, chatId);
47
47
  const queue = new AsyncQueue();
48
48
  let reasoningLevel = "stream";
@@ -1 +1 @@
1
- {"version":3,"file":"process-direct-streaming.js","names":[],"sources":["../../../../src/agent/service/process-direct-streaming.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { ImageContent } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport type { InboundAttachmentInput, MediaRef } from '../../channels/attachments/inbound-persist.js';\nimport { readAgentMessageContent } from '../memory/agent-message-access.js';\nimport {\n isVoiceLikeAttachment,\n mergeVoiceTranscriptsIntoUserText,\n mergeSttConfigFromAppConfig,\n} from '../../channels/attachments/voice-stt-webchat.js';\nimport {\n resolveEffectiveReasoningLevel,\n initSessionTurn,\n type SessionConfigStore,\n type SessionStore,\n} from '../../session/index.js';\nimport type { SessionContext } from '../session/index.js';\nimport { applyReasoningVisibilityToSseEvent } from '../streaming/reasoning-visibility-sse.js';\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\nimport { formatAgentRunErrorForClient } from '../client-error-format.js';\nimport { abortEmbeddedRun } from '../embedded/runs.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { ModelManager } from '../models/index.js';\nimport { injectSourceContextIntoUserMessage } from '../source-context/injector.js';\nimport { isSessionSourceBinding, type AgentSourceContextResolver } from '../source-context/types.js';\n\nimport { AsyncQueue } from './async-queue.js';\nimport {\n hydratePerTurnState,\n runDirectAgentTurn,\n tryRunSlashCommand,\n} from './direct-turn-helpers.js';\nimport {\n clearPendingTranscriptUserMessage,\n setPendingTranscriptUserMessage,\n type TranscriptUserMessage,\n} from '../inbound/attachment-pipeline.js';\n\nexport type DirectStreamInboundAttachment = InboundAttachmentInput;\n\nexport type ProcessDirectStreamLog = {\n info: (obj: Record<string, unknown>, msg: string) => void;\n warn: (obj: Record<string, unknown>, msg: string) => void;\n debug?: (obj: Record<string, unknown>, msg: string) => void;\n};\n\nexport interface ProcessDirectStreamingDeps {\n log: ProcessDirectStreamLog;\n parseSessionKey: (sessionKey: string) => { channel: string; chatId: string };\n initDirectStreamingSession: (\n sessionKey: string,\n channel: string,\n chatId: string,\n ) => SessionContext;\n registerWebchatSsePublisher: (\n sessionKey: string,\n publisher: (event: { type: string; [key: string]: unknown }) => void,\n ) => void;\n unregisterWebchatSsePublisher: (sessionKey: string) => void;\n agentManager: AgentInstanceGateway;\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n sessionStore: SessionStore;\n modelManager: ModelManager;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n getConfig: () => Config | undefined;\n sessionConfigStore: SessionConfigStore;\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n prepareInboundAttachments: (\n sessionKey: string,\n attachments?: DirectStreamInboundAttachment[],\n ) => Promise<MediaRef[] | undefined>;\n buildTranscriptUserMessage: (\n content: string,\n prepared: MediaRef[] | undefined,\n sessionKey: string,\n ) => Promise<TranscriptUserMessage>;\n recordPersistentGoalStreamOutcome?: (\n sessionKey: string,\n outcome: { skipPersistentGoalPostTurn: boolean },\n ) => void;\n onTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n enqueueProvisionalSessionTitle?: (sessionKey: string, userText: string) => void;\n /** Disk-only transcript sync (slash receipt already streamed as tokens). */\n reloadWebchatTranscript?: (sessionKey: string) => void;\n maybeEmitWebchatTts: (\n sessionKey: string,\n hadInboundVoice: boolean,\n ) => Promise<{ type: 'tts_audio'; uri: string; mimeType: string; name: string } | null>;\n endDirectRequestContext: () => void;\n resetSession: (sessionKey: string) => Promise<{ sessionId: string; previousSessionId: string } | null>;\n sourceContextResolver?: AgentSourceContextResolver;\n}\n\nexport interface ProcessDirectStreamingInput {\n content: string;\n sessionKey?: string;\n attachments?: DirectStreamInboundAttachment[];\n thinking?: string;\n signal?: AbortSignal;\n runId?: string;\n}\n\nexport type ProcessDirectStreamingSseEvent = { type: string; [key: string]: unknown };\n\nfunction makeAssistantReceiptMessage(text: string): AgentMessage {\n return {\n role: 'assistant',\n content: [{ type: 'text', text }],\n timestamp: Date.now(),\n } as AgentMessage;\n}\n\nfunction pushAssistantReceipt(\n queue: AsyncQueue<ProcessDirectStreamingSseEvent>,\n text: string,\n runId?: string,\n): void {\n const message = makeAssistantReceiptMessage(text);\n queue.push({ type: 'message_start', runId, message });\n queue.push({ type: 'message_update', runId, message });\n queue.push({ type: 'message_end', runId, message });\n}\n\nexport async function* runProcessDirectStreaming(\n deps: ProcessDirectStreamingDeps,\n input: ProcessDirectStreamingInput,\n): AsyncGenerator<ProcessDirectStreamingSseEvent, void, unknown> {\n const sessionKey = input.sessionKey ?? 'agent:main:main';\n const { channel, chatId } = deps.parseSessionKey(sessionKey);\n const context = deps.initDirectStreamingSession(sessionKey, channel, chatId);\n\n const queue = new AsyncQueue<ProcessDirectStreamingSseEvent>();\n let reasoningLevel: ReasoningLevel = 'stream';\n\n const pushVisible = (event: ProcessDirectStreamingSseEvent) => {\n const visible = applyReasoningVisibilityToSseEvent(event, reasoningLevel);\n if (visible !== null) {\n queue.push(visible);\n }\n };\n\n const formatStreamError = (raw: string): string => {\n let provider: string | undefined;\n let modelRef: string | undefined;\n try {\n const resolved = deps.modelManager.getResolvedModelForSession(sessionKey);\n provider = resolved.provider;\n modelRef = deps.modelManager.getModelForSession(sessionKey);\n } catch {\n /* ignore — format without provider context */\n }\n return formatAgentRunErrorForClient(raw, { provider, modelRef });\n };\n\n if (channel === 'webchat') {\n deps.registerWebchatSsePublisher(sessionKey, pushVisible);\n }\n\n const signal = input.signal;\n let userAborted = false;\n let abortHandled = false;\n let inboundVoice = false;\n let ranSlashCommand = false;\n let mergedUserText = input.content;\n let webchatSlashReceipt: string | undefined;\n let slashCommandMetadata: Record<string, unknown> | undefined;\n\n const taskPromise = (async () => {\n try {\n const cfg = deps.getConfig();\n let turnBody = input.content;\n let resetTriggeredAtInit = false;\n if (cfg) {\n const turn = await initSessionTurn({\n cfg,\n sessionKey,\n body: input.content,\n resetSession: deps.resetSession,\n });\n resetTriggeredAtInit = turn.resetTriggered;\n if (turn.bareReset && turn.ackMessage) {\n ranSlashCommand = true;\n webchatSlashReceipt = turn.ackMessage;\n pushAssistantReceipt(queue, turn.ackMessage, input.runId);\n return;\n }\n turnBody = turn.bodyStripped;\n if (turn.isNewSession) {\n deps.log.debug(\n {\n sessionKey,\n sessionId: turn.sessionId,\n previousSessionId: turn.previousSessionId,\n resetTriggered: turn.resetTriggered,\n staleRollover: turn.staleRollover,\n },\n 'Session reset boundary at direct turn start',\n );\n }\n }\n\n await hydratePerTurnState(deps, sessionKey, input.thinking);\n {\n const defReason = (deps.getConfig()?.agents?.defaults?.reasoningDefault ?? 'stream') as ReasoningLevel;\n reasoningLevel = await resolveEffectiveReasoningLevel(deps.sessionConfigStore, sessionKey, defReason);\n }\n\n const prepared = await deps.prepareInboundAttachments(sessionKey, input.attachments);\n\n const sttCfg = mergeSttConfigFromAppConfig(deps.getConfig()?.tools?.media?.audio, deps.getConfig()?.tools?.media);\n const voiceMerge = await mergeVoiceTranscriptsIntoUserText(prepared, turnBody, sttCfg);\n mergedUserText = voiceMerge.text;\n inboundVoice = voiceMerge.inboundVoice;\n\n if (inboundVoice) {\n const transcriptParts = [\n voiceMerge.voiceTranscripts.filter(Boolean).join('\\n'),\n turnBody.trim(),\n ].filter(Boolean);\n const voiceMedia = (prepared ?? []).filter(isVoiceLikeAttachment).map((att) => ({\n uri: att.uri,\n mimeType: att.mimeType,\n name: att.name,\n }));\n pushVisible({\n type: 'user_transcript',\n text: transcriptParts.join('\\n\\n'),\n media: voiceMedia,\n });\n }\n\n const armAbort = () => {\n if (abortHandled) {\n return;\n }\n abortHandled = true;\n userAborted = true;\n void abortEmbeddedRun(sessionKey);\n queue.close();\n };\n if (signal) {\n if (signal.aborted) {\n armAbort();\n return;\n }\n signal.addEventListener('abort', armAbort, { once: true });\n }\n\n const slash = await tryRunSlashCommand(\n deps,\n {\n sessionKey,\n channel,\n chatId,\n senderId: context.senderId,\n isGroup: context.isGroup,\n inboundMetadata: context.metadata,\n },\n mergedUserText,\n { skipResetCommands: resetTriggeredAtInit },\n );\n if (slash.matched) {\n ranSlashCommand = true;\n slashCommandMetadata = slash.metadata;\n const text = slash.aggregatedText.trim();\n if (text) {\n webchatSlashReceipt = text;\n pushAssistantReceipt(queue, text, input.runId);\n } else if (channel === 'webchat') {\n webchatSlashReceipt =\n 'Command finished with no assistant text. If you used `/goal`, a follow-up turn may still be scheduled automatically.';\n pushAssistantReceipt(queue, webchatSlashReceipt, input.runId);\n }\n const workflowRun = slash.metadata?.workflowRun;\n if (workflowRun && typeof workflowRun === 'object') {\n queue.push({\n type: 'workflow_run_started',\n runId: input.runId,\n payload: { workflowRun },\n });\n }\n return;\n }\n\n const textForAgent = mergedUserText.trimStart().startsWith('/skill:')\n ? deps.agentManager.expandSkillUserText(mergedUserText)\n : mergedUserText;\n const userMessage = await deps.buildTranscriptUserMessage(textForAgent, prepared, sessionKey);\n let sourceEnrichedUserMessage: AgentMessage = userMessage;\n let sourceImages: ImageContent[] | undefined;\n if (deps.sourceContextResolver) {\n const metadata = await deps.sessionStore.getMetadata(sessionKey).catch(() => null);\n const sourceBinding = metadata?.customData && typeof metadata.customData === 'object'\n ? (metadata.customData as Record<string, unknown>).sourceBinding\n : undefined;\n if (isSessionSourceBinding(sourceBinding)) {\n const sourceContext = await deps.sourceContextResolver(sourceBinding, sessionKey);\n sourceEnrichedUserMessage = injectSourceContextIntoUserMessage(userMessage, sourceContext);\n sourceImages = sourceContext?.images;\n }\n }\n\n if (channel === 'webchat') {\n pushVisible({\n type: 'user_message',\n timestamp: userMessage.timestamp ?? Date.now(),\n content: readAgentMessageContent(userMessage),\n media: userMessage.media,\n });\n if (textForAgent.trim()) {\n deps.enqueueProvisionalSessionTitle?.(sessionKey, textForAgent);\n }\n }\n\n const pendingUserMessage = userMessage as TranscriptUserMessage;\n setPendingTranscriptUserMessage(sessionKey, pendingUserMessage);\n\n try {\n const result = await runDirectAgentTurn(\n {\n sessionStore: deps.sessionStore,\n agentManager: deps.agentManager,\n modelManager: deps.modelManager,\n config: deps.getConfig(),\n },\n {\n sessionKey,\n userMessage: sourceEnrichedUserMessage,\n abortSignal: signal,\n sourceImages,\n runId: input.runId,\n onEvent: (embeddedEvent) => {\n const event = { ...embeddedEvent };\n if (event.type === 'error' && typeof event.content === 'string') {\n event.content = formatStreamError(event.content);\n }\n pushVisible(event);\n },\n },\n );\n\n if (result.lastAssistantText) {\n deps.onTurnComplete?.(sessionKey, result.lastAssistantText);\n }\n if (!result.ok && result.errorMessage && !abortHandled) {\n pushVisible({ type: 'error', content: formatStreamError(result.errorMessage) });\n }\n } finally {\n clearPendingTranscriptUserMessage(sessionKey, pendingUserMessage);\n }\n } catch (err) {\n if (!abortHandled) {\n const em = err instanceof Error ? err.message : String(err);\n pushVisible({ type: 'error', content: formatStreamError(em) });\n }\n } finally {\n if (!userAborted && channel === 'webchat') {\n try {\n const ttsAudioEvent = await deps.maybeEmitWebchatTts(sessionKey, inboundVoice);\n if (ttsAudioEvent) {\n queue.push(ttsAudioEvent);\n }\n } catch (ttsErr) {\n deps.log.warn({ err: ttsErr, sessionKey }, 'Failed to emit TTS audio before stream close');\n }\n }\n queue.close();\n }\n })();\n\n try {\n for await (const event of queue) {\n yield event;\n }\n await taskPromise;\n\n if (channel === 'webchat' && ranSlashCommand) {\n try {\n const userMsg = {\n role: 'user' as const,\n content: [{ type: 'text' as const, text: mergedUserText }],\n timestamp: Date.now(),\n } as AgentMessage;\n await deps.sessionStore.appendTranscriptMessage(sessionKey, userMsg);\n if (webchatSlashReceipt?.trim()) {\n const assistantMsg = {\n role: 'assistant' as const,\n content: [{ type: 'text' as const, text: webchatSlashReceipt.trim() }],\n timestamp: Date.now(),\n ...(slashCommandMetadata && Object.keys(slashCommandMetadata).length > 0\n ? { metadata: slashCommandMetadata }\n : {}),\n } as AgentMessage;\n await deps.sessionStore.appendTranscriptMessage(sessionKey, assistantMsg);\n }\n deps.reloadWebchatTranscript?.(sessionKey);\n } catch (err) {\n deps.log.warn({ err, sessionKey }, 'Failed to persist webchat slash command receipt');\n }\n }\n\n deps.recordPersistentGoalStreamOutcome?.(sessionKey, { skipPersistentGoalPostTurn: ranSlashCommand });\n } finally {\n if (channel === 'webchat') {\n deps.unregisterWebchatSsePublisher(sessionKey);\n }\n deps.endDirectRequestContext();\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"process-direct-streaming.js","names":[],"sources":["../../../../src/agent/service/process-direct-streaming.ts"],"sourcesContent":["import type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { ImageContent } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport type { InboundAttachmentInput, MediaRef } from '../../channels/attachments/inbound-persist.js';\nimport { readAgentMessageContent } from '../memory/agent-message-access.js';\nimport {\n isVoiceLikeAttachment,\n mergeVoiceTranscriptsIntoUserText,\n mergeSttConfigFromAppConfig,\n} from '../../channels/attachments/voice-stt-webchat.js';\nimport {\n resolveEffectiveReasoningLevel,\n initSessionTurn,\n type SessionConfigStore,\n type SessionStore,\n} from '../../session/index.js';\nimport type { SessionContext } from '../session/index.js';\nimport { applyReasoningVisibilityToSseEvent } from '../streaming/reasoning-visibility-sse.js';\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\nimport { formatAgentRunErrorForClient } from '../client-error-format.js';\nimport { abortEmbeddedRun } from '../embedded/runs.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { CommandHandler } from '../messaging/command-handler.js';\nimport type { ModelManager } from '../models/index.js';\nimport { injectSourceContextIntoUserMessage } from '../source-context/injector.js';\nimport { isSessionSourceBinding, type AgentSourceContextResolver } from '../source-context/types.js';\n\nimport { AsyncQueue } from './async-queue.js';\nimport {\n hydratePerTurnState,\n runDirectAgentTurn,\n tryRunSlashCommand,\n} from './direct-turn-helpers.js';\nimport {\n clearPendingTranscriptUserMessage,\n setPendingTranscriptUserMessage,\n type TranscriptUserMessage,\n} from '../inbound/attachment-pipeline.js';\n\nexport type DirectStreamInboundAttachment = InboundAttachmentInput;\n\nexport type ProcessDirectStreamLog = {\n info: (obj: Record<string, unknown>, msg: string) => void;\n warn: (obj: Record<string, unknown>, msg: string) => void;\n debug?: (obj: Record<string, unknown>, msg: string) => void;\n};\n\nexport interface ProcessDirectStreamingDeps {\n log: ProcessDirectStreamLog;\n resolveSessionEndpoint: (sessionKey: string) => Promise<{ channel: string; chatId: string }>;\n initDirectStreamingSession: (\n sessionKey: string,\n channel: string,\n chatId: string,\n ) => SessionContext;\n registerWebchatSsePublisher: (\n sessionKey: string,\n publisher: (event: { type: string; [key: string]: unknown }) => void,\n ) => void;\n unregisterWebchatSsePublisher: (sessionKey: string) => void;\n agentManager: AgentInstanceGateway;\n hydrateSessionWorkspaceFromStore: (sessionKey: string) => Promise<void>;\n hydrateSessionModelFromStore: (sessionKey: string) => Promise<void>;\n sessionStore: SessionStore;\n modelManager: ModelManager;\n applyResolvedThinkingLevel: (sessionKey: string, thinking?: string | null) => Promise<void>;\n getConfig: () => Config | undefined;\n sessionConfigStore: SessionConfigStore;\n commandHandler: Pick<CommandHandler, 'executeCommandAndAggregateReply'>;\n prepareInboundAttachments: (\n sessionKey: string,\n attachments?: DirectStreamInboundAttachment[],\n ) => Promise<MediaRef[] | undefined>;\n buildTranscriptUserMessage: (\n content: string,\n prepared: MediaRef[] | undefined,\n sessionKey: string,\n ) => Promise<TranscriptUserMessage>;\n recordPersistentGoalStreamOutcome?: (\n sessionKey: string,\n outcome: { skipPersistentGoalPostTurn: boolean },\n ) => void;\n onTurnComplete?: (sessionKey: string, lastAssistantText?: string) => void;\n enqueueProvisionalSessionTitle?: (sessionKey: string, userText: string) => void;\n /** Disk-only transcript sync (slash receipt already streamed as tokens). */\n reloadWebchatTranscript?: (sessionKey: string) => void;\n maybeEmitWebchatTts: (\n sessionKey: string,\n hadInboundVoice: boolean,\n ) => Promise<{ type: 'tts_audio'; uri: string; mimeType: string; name: string } | null>;\n endDirectRequestContext: () => void;\n resetSession: (sessionKey: string) => Promise<{ sessionId: string; previousSessionId: string } | null>;\n sourceContextResolver?: AgentSourceContextResolver;\n}\n\nexport interface ProcessDirectStreamingInput {\n content: string;\n sessionKey?: string;\n attachments?: DirectStreamInboundAttachment[];\n thinking?: string;\n signal?: AbortSignal;\n runId?: string;\n}\n\nexport type ProcessDirectStreamingSseEvent = { type: string; [key: string]: unknown };\n\nfunction makeAssistantReceiptMessage(text: string): AgentMessage {\n return {\n role: 'assistant',\n content: [{ type: 'text', text }],\n timestamp: Date.now(),\n } as AgentMessage;\n}\n\nfunction pushAssistantReceipt(\n queue: AsyncQueue<ProcessDirectStreamingSseEvent>,\n text: string,\n runId?: string,\n): void {\n const message = makeAssistantReceiptMessage(text);\n queue.push({ type: 'message_start', runId, message });\n queue.push({ type: 'message_update', runId, message });\n queue.push({ type: 'message_end', runId, message });\n}\n\nexport async function* runProcessDirectStreaming(\n deps: ProcessDirectStreamingDeps,\n input: ProcessDirectStreamingInput,\n): AsyncGenerator<ProcessDirectStreamingSseEvent, void, unknown> {\n const sessionKey = input.sessionKey ?? 'agent:main:main';\n const { channel, chatId } = await deps.resolveSessionEndpoint(sessionKey);\n const context = deps.initDirectStreamingSession(sessionKey, channel, chatId);\n\n const queue = new AsyncQueue<ProcessDirectStreamingSseEvent>();\n let reasoningLevel: ReasoningLevel = 'stream';\n\n const pushVisible = (event: ProcessDirectStreamingSseEvent) => {\n const visible = applyReasoningVisibilityToSseEvent(event, reasoningLevel);\n if (visible !== null) {\n queue.push(visible);\n }\n };\n\n const formatStreamError = (raw: string): string => {\n let provider: string | undefined;\n let modelRef: string | undefined;\n try {\n const resolved = deps.modelManager.getResolvedModelForSession(sessionKey);\n provider = resolved.provider;\n modelRef = deps.modelManager.getModelForSession(sessionKey);\n } catch {\n /* ignore — format without provider context */\n }\n return formatAgentRunErrorForClient(raw, { provider, modelRef });\n };\n\n if (channel === 'webchat') {\n deps.registerWebchatSsePublisher(sessionKey, pushVisible);\n }\n\n const signal = input.signal;\n let userAborted = false;\n let abortHandled = false;\n let inboundVoice = false;\n let ranSlashCommand = false;\n let mergedUserText = input.content;\n let webchatSlashReceipt: string | undefined;\n let slashCommandMetadata: Record<string, unknown> | undefined;\n\n const taskPromise = (async () => {\n try {\n const cfg = deps.getConfig();\n let turnBody = input.content;\n let resetTriggeredAtInit = false;\n if (cfg) {\n const turn = await initSessionTurn({\n cfg,\n sessionKey,\n body: input.content,\n resetSession: deps.resetSession,\n });\n resetTriggeredAtInit = turn.resetTriggered;\n if (turn.bareReset && turn.ackMessage) {\n ranSlashCommand = true;\n webchatSlashReceipt = turn.ackMessage;\n pushAssistantReceipt(queue, turn.ackMessage, input.runId);\n return;\n }\n turnBody = turn.bodyStripped;\n if (turn.isNewSession) {\n deps.log.debug(\n {\n sessionKey,\n sessionId: turn.sessionId,\n previousSessionId: turn.previousSessionId,\n resetTriggered: turn.resetTriggered,\n staleRollover: turn.staleRollover,\n },\n 'Session reset boundary at direct turn start',\n );\n }\n }\n\n await hydratePerTurnState(deps, sessionKey, input.thinking);\n {\n const defReason = (deps.getConfig()?.agents?.defaults?.reasoningDefault ?? 'stream') as ReasoningLevel;\n reasoningLevel = await resolveEffectiveReasoningLevel(deps.sessionConfigStore, sessionKey, defReason);\n }\n\n const prepared = await deps.prepareInboundAttachments(sessionKey, input.attachments);\n\n const sttCfg = mergeSttConfigFromAppConfig(deps.getConfig()?.tools?.media?.audio, deps.getConfig()?.tools?.media);\n const voiceMerge = await mergeVoiceTranscriptsIntoUserText(prepared, turnBody, sttCfg);\n mergedUserText = voiceMerge.text;\n inboundVoice = voiceMerge.inboundVoice;\n\n if (inboundVoice) {\n const transcriptParts = [\n voiceMerge.voiceTranscripts.filter(Boolean).join('\\n'),\n turnBody.trim(),\n ].filter(Boolean);\n const voiceMedia = (prepared ?? []).filter(isVoiceLikeAttachment).map((att) => ({\n uri: att.uri,\n mimeType: att.mimeType,\n name: att.name,\n }));\n pushVisible({\n type: 'user_transcript',\n text: transcriptParts.join('\\n\\n'),\n media: voiceMedia,\n });\n }\n\n const armAbort = () => {\n if (abortHandled) {\n return;\n }\n abortHandled = true;\n userAborted = true;\n void abortEmbeddedRun(sessionKey);\n queue.close();\n };\n if (signal) {\n if (signal.aborted) {\n armAbort();\n return;\n }\n signal.addEventListener('abort', armAbort, { once: true });\n }\n\n const slash = await tryRunSlashCommand(\n deps,\n {\n sessionKey,\n channel,\n chatId,\n senderId: context.senderId,\n isGroup: context.isGroup,\n inboundMetadata: context.metadata,\n },\n mergedUserText,\n { skipResetCommands: resetTriggeredAtInit },\n );\n if (slash.matched) {\n ranSlashCommand = true;\n slashCommandMetadata = slash.metadata;\n const text = slash.aggregatedText.trim();\n if (text) {\n webchatSlashReceipt = text;\n pushAssistantReceipt(queue, text, input.runId);\n } else if (channel === 'webchat') {\n webchatSlashReceipt =\n 'Command finished with no assistant text. If you used `/goal`, a follow-up turn may still be scheduled automatically.';\n pushAssistantReceipt(queue, webchatSlashReceipt, input.runId);\n }\n const workflowRun = slash.metadata?.workflowRun;\n if (workflowRun && typeof workflowRun === 'object') {\n queue.push({\n type: 'workflow_run_started',\n runId: input.runId,\n payload: { workflowRun },\n });\n }\n return;\n }\n\n const textForAgent = mergedUserText.trimStart().startsWith('/skill:')\n ? deps.agentManager.expandSkillUserText(mergedUserText)\n : mergedUserText;\n const userMessage = await deps.buildTranscriptUserMessage(textForAgent, prepared, sessionKey);\n let sourceEnrichedUserMessage: AgentMessage = userMessage;\n let sourceImages: ImageContent[] | undefined;\n if (deps.sourceContextResolver) {\n const metadata = await deps.sessionStore.getMetadata(sessionKey).catch(() => null);\n const sourceBinding = metadata?.customData && typeof metadata.customData === 'object'\n ? (metadata.customData as Record<string, unknown>).sourceBinding\n : undefined;\n if (isSessionSourceBinding(sourceBinding)) {\n const sourceContext = await deps.sourceContextResolver(sourceBinding, sessionKey);\n sourceEnrichedUserMessage = injectSourceContextIntoUserMessage(userMessage, sourceContext);\n sourceImages = sourceContext?.images;\n }\n }\n\n if (channel === 'webchat') {\n pushVisible({\n type: 'user_message',\n timestamp: userMessage.timestamp ?? Date.now(),\n content: readAgentMessageContent(userMessage),\n media: userMessage.media,\n });\n if (textForAgent.trim()) {\n deps.enqueueProvisionalSessionTitle?.(sessionKey, textForAgent);\n }\n }\n\n const pendingUserMessage = userMessage as TranscriptUserMessage;\n setPendingTranscriptUserMessage(sessionKey, pendingUserMessage);\n\n try {\n const result = await runDirectAgentTurn(\n {\n sessionStore: deps.sessionStore,\n agentManager: deps.agentManager,\n modelManager: deps.modelManager,\n config: deps.getConfig(),\n },\n {\n sessionKey,\n userMessage: sourceEnrichedUserMessage,\n abortSignal: signal,\n sourceImages,\n runId: input.runId,\n onEvent: (embeddedEvent) => {\n const event = { ...embeddedEvent };\n if (event.type === 'error' && typeof event.content === 'string') {\n event.content = formatStreamError(event.content);\n }\n pushVisible(event);\n },\n },\n );\n\n if (result.lastAssistantText) {\n deps.onTurnComplete?.(sessionKey, result.lastAssistantText);\n }\n if (!result.ok && result.errorMessage && !abortHandled) {\n pushVisible({ type: 'error', content: formatStreamError(result.errorMessage) });\n }\n } finally {\n clearPendingTranscriptUserMessage(sessionKey, pendingUserMessage);\n }\n } catch (err) {\n if (!abortHandled) {\n const em = err instanceof Error ? err.message : String(err);\n pushVisible({ type: 'error', content: formatStreamError(em) });\n }\n } finally {\n if (!userAborted && channel === 'webchat') {\n try {\n const ttsAudioEvent = await deps.maybeEmitWebchatTts(sessionKey, inboundVoice);\n if (ttsAudioEvent) {\n queue.push(ttsAudioEvent);\n }\n } catch (ttsErr) {\n deps.log.warn({ err: ttsErr, sessionKey }, 'Failed to emit TTS audio before stream close');\n }\n }\n queue.close();\n }\n })();\n\n try {\n for await (const event of queue) {\n yield event;\n }\n await taskPromise;\n\n if (channel === 'webchat' && ranSlashCommand) {\n try {\n const userMsg = {\n role: 'user' as const,\n content: [{ type: 'text' as const, text: mergedUserText }],\n timestamp: Date.now(),\n } as AgentMessage;\n await deps.sessionStore.appendTranscriptMessage(sessionKey, userMsg);\n if (webchatSlashReceipt?.trim()) {\n const assistantMsg = {\n role: 'assistant' as const,\n content: [{ type: 'text' as const, text: webchatSlashReceipt.trim() }],\n timestamp: Date.now(),\n ...(slashCommandMetadata && Object.keys(slashCommandMetadata).length > 0\n ? { metadata: slashCommandMetadata }\n : {}),\n } as AgentMessage;\n await deps.sessionStore.appendTranscriptMessage(sessionKey, assistantMsg);\n }\n deps.reloadWebchatTranscript?.(sessionKey);\n } catch (err) {\n deps.log.warn({ err, sessionKey }, 'Failed to persist webchat slash command receipt');\n }\n }\n\n deps.recordPersistentGoalStreamOutcome?.(sessionKey, { skipPersistentGoalPostTurn: ranSlashCommand });\n } finally {\n if (channel === 'webchat') {\n deps.unregisterWebchatSsePublisher(sessionKey);\n }\n deps.endDirectRequestContext();\n }\n}\n"],"mappings":"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"}
@@ -148,7 +148,7 @@ export declare class AgentService {
148
148
  */
149
149
  private enqueueMaybeAutoTitleAfterPersist;
150
150
  private prepareLoadedSessionMessages;
151
- private parseSessionKey;
151
+ private resolveSessionEndpoint;
152
152
  private initSessionContext;
153
153
  /**
154
154
  * Persist inbound file attachments to the global media store.
@@ -1,9 +1,9 @@
1
- import { init_agent_scope, resolveAgentHomeDir, resolveAgentProfileDir, resolveDefaultAgentId } from "./agent-scope.js";
2
- import { createLogger } from "../utils/logger/index.js";
3
- import { init_logger } from "../utils/logger.js";
4
1
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
5
2
  import { applyConfigOverrides } from "../config/runtime-overrides.js";
3
+ import { init_agent_scope, resolveAgentHomeDir, resolveAgentProfileDir, resolveDefaultAgentId } from "./agent-scope.js";
6
4
  import { extractProfileAgentId, resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
5
+ import { createLogger } from "../utils/logger/index.js";
6
+ import { init_logger } from "../utils/logger.js";
7
7
  import { extractTextContent } from "./context/workspace.js";
8
8
  import { parseNoteAttachmentTarget } from "../notes/attachment-ref.js";
9
9
  import { getWorkflowProgressBroker } from "./workflow/progress-broker.js";
@@ -57,13 +57,12 @@ import { FeedbackCoordinator } from "./feedback/feedback-coordinator.js";
57
57
  import "./feedback/index.js";
58
58
  import { PersistentGoalService } from "./goals/persistent-goal-service.js";
59
59
  import { reconcileManagedDreamingCronJobs } from "./service/reconcile-dreaming-cron.js";
60
- import { parseOutboundSessionKey } from "./service/parse-outbound-session-key.js";
61
60
  import { cleanTrailingErrors } from "./memory/message-sanitizer.js";
62
61
  import { MemoryFlushService } from "./memory/memory-flush.js";
63
62
  import { tryApplySessionTranscriptHygiene } from "./transcript/transcript-hygiene.js";
63
+ import { join } from "node:path";
64
64
  import { existsSync, readFileSync } from "node:fs";
65
65
  import { readFile } from "node:fs/promises";
66
- import { join } from "node:path";
67
66
  //#region src/agent/service.ts
68
67
  init_schema();
69
68
  init_logger();
@@ -232,7 +231,8 @@ var AgentService = class {
232
231
  gatewayClarify: config.gatewayClarify,
233
232
  getCronService: config.getCronService,
234
233
  getWorkflowRunService: config.getWorkflowRunService,
235
- onSkillsUpdated: config.onSkillsUpdated
234
+ onSkillsUpdated: config.onSkillsUpdated,
235
+ isWorkspaceTrusted: config.isWorkspaceTrusted
236
236
  });
237
237
  this.agentEventHandler = new AgentEventHandler({
238
238
  progressManager: this.progressManager,
@@ -356,7 +356,7 @@ var AgentService = class {
356
356
  if (!c) throw new Error("AgentService requires config.config");
357
357
  return c;
358
358
  },
359
- parseSessionKey: (sk) => this.parseSessionKey(sk),
359
+ resolveSessionEndpoint: (sk) => this.resolveSessionEndpoint(sk),
360
360
  initSessionContext: (sk, channel, chatId) => this.initSessionContext(sk, channel, chatId),
361
361
  sessionHydrator: this.sessionHydrator,
362
362
  prepareInboundAttachments: (sk, att) => this.prepareInboundAttachments(sk, att),
@@ -662,8 +662,12 @@ var AgentService = class {
662
662
  }
663
663
  return out;
664
664
  }
665
- parseSessionKey(sessionKey) {
666
- return parseOutboundSessionKey(sessionKey, this.config.config);
665
+ async resolveSessionEndpoint(sessionKey) {
666
+ const metadata = await this.sessionStore.getMetadata(sessionKey).catch(() => null);
667
+ return {
668
+ channel: metadata?.routing?.source?.trim() || metadata?.sourceChannel?.trim() || "cli",
669
+ chatId: metadata?.routing?.peerId?.trim() || metadata?.sourceChatId?.trim() || "main"
670
+ };
667
671
  }
668
672
  initSessionContext(sessionKey, channel, chatId, senderId = "") {
669
673
  const context = {