@xopcai/xopc 0.0.98 → 0.0.100

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 (515) 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/account-manager.d.ts +3 -3
  5. package/dist/extensions/telegram/src/account-manager.js +8 -8
  6. package/dist/extensions/telegram/src/account-manager.js.map +1 -1
  7. package/dist/extensions/telegram/src/actions/message-actions.d.ts +4 -0
  8. package/dist/extensions/telegram/src/actions/message-actions.js +71 -0
  9. package/dist/extensions/telegram/src/actions/message-actions.js.map +1 -0
  10. package/dist/extensions/telegram/src/adapters/config-adapter.js +9 -1
  11. package/dist/extensions/telegram/src/adapters/config-adapter.js.map +1 -1
  12. package/dist/extensions/telegram/src/adapters/config-surface.js +1 -1
  13. package/dist/extensions/telegram/src/adapters/config-surface.js.map +1 -1
  14. package/dist/extensions/telegram/src/adapters/outbound-adapter.d.ts +2 -1
  15. package/dist/extensions/telegram/src/adapters/outbound-adapter.js +18 -4
  16. package/dist/extensions/telegram/src/adapters/outbound-adapter.js.map +1 -1
  17. package/dist/extensions/telegram/src/adapters/security-adapter.js +2 -1
  18. package/dist/extensions/telegram/src/adapters/security-adapter.js.map +1 -1
  19. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +90 -6
  20. package/dist/extensions/telegram/src/adapters/streaming-adapter.js.map +1 -1
  21. package/dist/extensions/telegram/src/adapters/types.d.ts +9 -1
  22. package/dist/extensions/telegram/src/api-root.d.ts +4 -0
  23. package/dist/extensions/telegram/src/api-root.js +42 -0
  24. package/dist/extensions/telegram/src/api-root.js.map +1 -0
  25. package/dist/extensions/telegram/src/approval-delivery.d.ts +9 -0
  26. package/dist/extensions/telegram/src/approval-delivery.js +36 -0
  27. package/dist/extensions/telegram/src/approval-delivery.js.map +1 -0
  28. package/dist/extensions/telegram/src/approval-store.d.ts +25 -0
  29. package/dist/extensions/telegram/src/approval-store.js +61 -0
  30. package/dist/extensions/telegram/src/approval-store.js.map +1 -0
  31. package/dist/extensions/telegram/src/config-schema.d.ts +185 -35
  32. package/dist/extensions/telegram/src/config-schema.js +67 -45
  33. package/dist/extensions/telegram/src/config-schema.js.map +1 -1
  34. package/dist/extensions/telegram/src/conversation-id.d.ts +6 -0
  35. package/dist/extensions/telegram/src/conversation-id.js +18 -0
  36. package/dist/extensions/telegram/src/conversation-id.js.map +1 -0
  37. package/dist/extensions/telegram/src/doctor.d.ts +5 -0
  38. package/dist/extensions/telegram/src/doctor.js +80 -0
  39. package/dist/extensions/telegram/src/doctor.js.map +1 -0
  40. package/dist/extensions/telegram/src/exec-approval-handler.d.ts +7 -0
  41. package/dist/extensions/telegram/src/exec-approval-handler.js +36 -0
  42. package/dist/extensions/telegram/src/exec-approval-handler.js.map +1 -0
  43. package/dist/extensions/telegram/src/exec-approvals.d.ts +8 -0
  44. package/dist/extensions/telegram/src/exec-approvals.js +20 -0
  45. package/dist/extensions/telegram/src/exec-approvals.js.map +1 -0
  46. package/dist/extensions/telegram/src/focus-handler.d.ts +12 -0
  47. package/dist/extensions/telegram/src/focus-handler.js +55 -0
  48. package/dist/extensions/telegram/src/focus-handler.js.map +1 -0
  49. package/dist/extensions/telegram/src/group-config-resolver.d.ts +12 -0
  50. package/dist/extensions/telegram/src/group-config-resolver.js +17 -0
  51. package/dist/extensions/telegram/src/group-config-resolver.js.map +1 -0
  52. package/dist/extensions/telegram/src/inbound-coalescer.d.ts +15 -0
  53. package/dist/extensions/telegram/src/inbound-coalescer.js +107 -0
  54. package/dist/extensions/telegram/src/inbound-coalescer.js.map +1 -0
  55. package/dist/extensions/telegram/src/inbound-processor.d.ts +1 -0
  56. package/dist/extensions/telegram/src/inbound-processor.js +41 -4
  57. package/dist/extensions/telegram/src/inbound-processor.js.map +1 -1
  58. package/dist/extensions/telegram/src/network-errors.d.ts +2 -0
  59. package/dist/extensions/telegram/src/network-errors.js +23 -0
  60. package/dist/extensions/telegram/src/network-errors.js.map +1 -0
  61. package/dist/extensions/telegram/src/plugin.d.ts +11 -0
  62. package/dist/extensions/telegram/src/plugin.js +192 -58
  63. package/dist/extensions/telegram/src/plugin.js.map +1 -1
  64. package/dist/extensions/telegram/src/polling-session.d.ts +17 -0
  65. package/dist/extensions/telegram/src/polling-session.js +112 -0
  66. package/dist/extensions/telegram/src/polling-session.js.map +1 -0
  67. package/dist/extensions/telegram/src/proxy-fetch.d.ts +2 -0
  68. package/dist/extensions/telegram/src/proxy-fetch.js +14 -0
  69. package/dist/extensions/telegram/src/proxy-fetch.js.map +1 -0
  70. package/dist/extensions/telegram/src/reactions.d.ts +14 -0
  71. package/dist/extensions/telegram/src/reactions.js +48 -0
  72. package/dist/extensions/telegram/src/reactions.js.map +1 -0
  73. package/dist/extensions/telegram/src/reply-params.d.ts +15 -0
  74. package/dist/extensions/telegram/src/reply-params.js +28 -0
  75. package/dist/extensions/telegram/src/reply-params.js.map +1 -0
  76. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  77. package/dist/extensions/telegram/src/startup-errors.d.ts +3 -0
  78. package/dist/extensions/telegram/src/startup-errors.js +27 -0
  79. package/dist/extensions/telegram/src/startup-errors.js.map +1 -0
  80. package/dist/extensions/telegram/src/telegram-actions.d.ts +25 -0
  81. package/dist/extensions/telegram/src/telegram-actions.js +65 -0
  82. package/dist/extensions/telegram/src/telegram-actions.js.map +1 -0
  83. package/dist/extensions/telegram/src/thread-bindings.d.ts +15 -0
  84. package/dist/extensions/telegram/src/thread-bindings.js +22 -0
  85. package/dist/extensions/telegram/src/thread-bindings.js.map +1 -0
  86. package/dist/extensions/telegram/src/token-resolver.d.ts +8 -0
  87. package/dist/extensions/telegram/src/token-resolver.js +34 -0
  88. package/dist/extensions/telegram/src/token-resolver.js.map +1 -0
  89. package/dist/extensions/telegram/src/update-offset-store.d.ts +9 -0
  90. package/dist/extensions/telegram/src/update-offset-store.js +66 -0
  91. package/dist/extensions/telegram/src/update-offset-store.js.map +1 -0
  92. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  93. package/dist/extensions/telegram/xopc.extension.json +1 -1
  94. package/dist/extensions/weixin/src/api/api.js +2 -2
  95. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  96. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  97. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  98. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  99. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  100. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  101. package/dist/extensions/weixin/src/plugin.js +1 -1
  102. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  103. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  104. package/dist/gateway/static/root/assets/{agents-NI7FFR-h.js → agents-C5jtBK-H.js} +1 -1
  105. package/dist/gateway/static/root/assets/{apps-page-BB4iSCrJ.js → apps-page-smJl-qf_.js} +1 -1
  106. package/dist/gateway/static/root/assets/channels-settings-CH6KgFK6.js +1 -0
  107. package/dist/gateway/static/root/assets/channels-status-swr-CV70xvY7.js +8 -0
  108. package/dist/gateway/static/root/assets/{cron-api-1dHoVFEA.js → cron-api-CgBO8B7I.js} +1 -1
  109. package/dist/gateway/static/root/assets/{cron-page-CVX6FPfb.js → cron-page-Be0cW1cR.js} +1 -1
  110. package/dist/gateway/static/root/assets/{dist-BZnl4G4p.js → dist-P8HRGUuh.js} +1 -1
  111. package/dist/gateway/static/root/assets/{extension-debug-page-DwQp_4Qv.js → extension-debug-page-BowuycYu.js} +1 -1
  112. package/dist/gateway/static/root/assets/{extension-page-l9crxSvM.js → extension-page-27-Zpv8O.js} +1 -1
  113. package/dist/gateway/static/root/assets/{extension-settings-page-CXzLbq9B.js → extension-settings-page-DDFa_rIq.js} +1 -1
  114. package/dist/gateway/static/root/assets/{fetch-BLLOP2CM.js → fetch-drJUxxKP.js} +1 -1
  115. package/dist/gateway/static/root/assets/{field-primitives-BRnEyxSl.js → field-primitives-BWLssxEb.js} +1 -1
  116. package/dist/gateway/static/root/assets/{heartbeat-config-api-eMo0k381.js → heartbeat-config-api-BVuYNYT_.js} +1 -1
  117. package/dist/gateway/static/root/assets/index-CRDAmr3W.js +4840 -0
  118. package/dist/gateway/static/root/assets/index-DjNDHzwG.css +1 -0
  119. package/dist/gateway/static/root/assets/{logs-page-BvTEevBZ.js → logs-page-BDX8IrDQ.js} +1 -1
  120. package/dist/gateway/static/root/assets/{note-detail-page-Dl3jhcWg.js → note-detail-page-BmQ9KeiA.js} +1 -1
  121. package/dist/gateway/static/root/assets/{note-time-D8Tlyotb.js → note-time-14I9Sgqh.js} +1 -1
  122. package/dist/gateway/static/root/assets/{notes-page-BWILOitx.js → notes-page-BMfP0FFf.js} +1 -1
  123. package/dist/gateway/static/root/assets/{sessions-page-3EJRugZg.js → sessions-page-C3scyChq.js} +1 -1
  124. package/dist/gateway/static/root/assets/{settings-advanced-gate-CZ5wlM_q.js → settings-advanced-gate-2ODuCjHP.js} +1 -1
  125. package/dist/gateway/static/root/assets/{settings-form-section-C6RYGnKK.js → settings-form-section-DUoGKAiW.js} +1 -1
  126. package/dist/gateway/static/root/assets/{settings-page-0egNvAMr.js → settings-page-CttAfOWV.js} +1 -1
  127. package/dist/gateway/static/root/assets/{share-preview-page-BVJtaSoK.js → share-preview-page-B77xqiiI.js} +1 -1
  128. package/dist/gateway/static/root/assets/{skills-page-DVnRQ5Mo.js → skills-page-B_bAZGzB.js} +1 -1
  129. package/dist/gateway/static/root/assets/{theme-store-e2q2yjs4.js → theme-store-BgCPrmxU.js} +1 -1
  130. package/dist/gateway/static/root/assets/url-q28QhI7l.js +3 -0
  131. package/dist/gateway/static/root/assets/{utils-Bl-94YzI.js → utils-CCGejlcX.js} +1 -1
  132. package/dist/gateway/static/root/assets/{voice-api-key-field-B53JA8qW.js → voice-api-key-field-DZzzihcY.js} +1 -1
  133. package/dist/gateway/static/root/assets/{workflow-page.utils-ontUT7yL.js → workflow-page.utils-D5RMAmT4.js} +1 -1
  134. package/dist/gateway/static/root/assets/{workflows-page-Bz7YRTdp.js → workflows-page-DEYpC6Bv.js} +1 -1
  135. package/dist/gateway/static/root/index.html +5 -5
  136. package/dist/package.js +1 -1
  137. package/dist/src/agent/agent-manager.d.ts +4 -0
  138. package/dist/src/agent/agent-manager.js +75 -11
  139. package/dist/src/agent/agent-manager.js.map +1 -1
  140. package/dist/src/agent/agent-scope.js +1 -1
  141. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  142. package/dist/src/agent/child-agent-factory.d.ts +1 -0
  143. package/dist/src/agent/child-agent-factory.js +13 -10
  144. package/dist/src/agent/child-agent-factory.js.map +1 -1
  145. package/dist/src/agent/context/workspace-seed.js +2 -2
  146. package/dist/src/agent/context/workspace-state.js +1 -1
  147. package/dist/src/agent/embedded/run-for-session.d.ts +1 -0
  148. package/dist/src/agent/embedded/run-for-session.js +1 -0
  149. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  150. package/dist/src/agent/embedded/run-turn.js +1 -17
  151. package/dist/src/agent/embedded/run-turn.js.map +1 -1
  152. package/dist/src/agent/embedded/session-runner.js +3 -1
  153. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  154. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +1 -0
  155. package/dist/src/agent/embedded/session-tool-result-guard.js +1 -0
  156. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  157. package/dist/src/agent/goals/goal-run-store.js +4 -4
  158. package/dist/src/agent/goals/persistent-goal-service.js +1 -1
  159. package/dist/src/agent/goals/post-turn.js +2 -2
  160. package/dist/src/agent/image/load-image-media.js +2 -2
  161. package/dist/src/agent/inbound/attachment-pipeline.d.ts +37 -0
  162. package/dist/src/agent/inbound/attachment-pipeline.js +169 -0
  163. package/dist/src/agent/inbound/attachment-pipeline.js.map +1 -0
  164. package/dist/src/agent/inbound/turn-dispatcher.d.ts +3 -5
  165. package/dist/src/agent/inbound/turn-dispatcher.js +1 -2
  166. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
  167. package/dist/src/agent/ipc/bus.js +1 -1
  168. package/dist/src/agent/ipc/inbox.js +2 -2
  169. package/dist/src/agent/ipc/socket.js +1 -1
  170. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  171. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  172. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  173. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  174. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  175. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  176. package/dist/src/agent/memory/dreaming/events.js +1 -1
  177. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  178. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  179. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  180. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  181. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  182. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  183. package/dist/src/agent/memory/index.d.ts +2 -0
  184. package/dist/src/agent/memory/index.js +2 -1
  185. package/dist/src/agent/memory/memory-flush.d.ts +27 -0
  186. package/dist/src/agent/memory/memory-flush.js +124 -0
  187. package/dist/src/agent/memory/memory-flush.js.map +1 -0
  188. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  189. package/dist/src/agent/messaging/outbound-coordinator.js +2 -1
  190. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -1
  191. package/dist/src/agent/messaging/stream-manager.d.ts +2 -0
  192. package/dist/src/agent/messaging/stream-manager.js +3 -0
  193. package/dist/src/agent/messaging/stream-manager.js.map +1 -1
  194. package/dist/src/agent/models/manager.js +1 -1
  195. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +0 -4
  196. package/dist/src/agent/orchestration/agent-orchestrator.js +40 -107
  197. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  198. package/dist/src/agent/prompt/contribution.d.ts +9 -0
  199. package/dist/src/agent/prompt/contribution.js +1 -0
  200. package/dist/src/agent/prompt/safety.js +0 -10
  201. package/dist/src/agent/prompt/safety.js.map +1 -1
  202. package/dist/src/agent/prompt/sanitize-for-prompt.d.ts +6 -0
  203. package/dist/src/agent/prompt/sanitize-for-prompt.js +13 -0
  204. package/dist/src/agent/prompt/sanitize-for-prompt.js.map +1 -0
  205. package/dist/src/agent/prompt/sections/behavior.d.ts +5 -0
  206. package/dist/src/agent/prompt/sections/behavior.js +50 -0
  207. package/dist/src/agent/prompt/sections/behavior.js.map +1 -0
  208. package/dist/src/agent/prompt/sections/memory-skills.d.ts +9 -0
  209. package/dist/src/agent/prompt/sections/memory-skills.js +59 -0
  210. package/dist/src/agent/prompt/sections/memory-skills.js.map +1 -0
  211. package/dist/src/agent/prompt/sections/messaging-runtime.d.ts +16 -0
  212. package/dist/src/agent/prompt/sections/messaging-runtime.js +69 -0
  213. package/dist/src/agent/prompt/sections/messaging-runtime.js.map +1 -0
  214. package/dist/src/agent/prompt/sections/project-context.d.ts +16 -0
  215. package/dist/src/agent/prompt/sections/project-context.js +58 -0
  216. package/dist/src/agent/prompt/sections/project-context.js.map +1 -0
  217. package/dist/src/agent/prompt/sections/tooling.d.ts +5 -0
  218. package/dist/src/agent/prompt/sections/tooling.js +119 -0
  219. package/dist/src/agent/prompt/sections/tooling.js.map +1 -0
  220. package/dist/src/agent/prompt/sections/workspace-runtime.d.ts +11 -0
  221. package/dist/src/agent/prompt/sections/workspace-runtime.js +32 -0
  222. package/dist/src/agent/prompt/sections/workspace-runtime.js.map +1 -0
  223. package/dist/src/agent/prompt/service-prompt-builder.d.ts +13 -0
  224. package/dist/src/agent/prompt/service-prompt-builder.js +56 -15
  225. package/dist/src/agent/prompt/service-prompt-builder.js.map +1 -1
  226. package/dist/src/agent/prompt/subagent-context.d.ts +15 -0
  227. package/dist/src/agent/prompt/subagent-context.js +68 -0
  228. package/dist/src/agent/prompt/subagent-context.js.map +1 -0
  229. package/dist/src/agent/prompt/system-prompt-params.d.ts +53 -0
  230. package/dist/src/agent/prompt/system-prompt-params.js +74 -0
  231. package/dist/src/agent/prompt/system-prompt-params.js.map +1 -0
  232. package/dist/src/agent/prompt/system-prompt.d.ts +22 -11
  233. package/dist/src/agent/prompt/system-prompt.js +79 -193
  234. package/dist/src/agent/prompt/system-prompt.js.map +1 -1
  235. package/dist/src/agent/prompt/types.d.ts +3 -0
  236. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  237. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  238. package/dist/src/agent/sandbox/path-policy.js +2 -2
  239. package/dist/src/agent/service/build-direct-message-content.d.ts +5 -21
  240. package/dist/src/agent/service/build-direct-message-content.js +11 -64
  241. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  242. package/dist/src/agent/service/direct-turn-helpers.d.ts +1 -1
  243. package/dist/src/agent/service/direct-turn-helpers.js +7 -0
  244. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  245. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  246. package/dist/src/agent/service/process-direct-one-shot.js +22 -17
  247. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  248. package/dist/src/agent/service/process-direct-streaming.d.ts +6 -20
  249. package/dist/src/agent/service/process-direct-streaming.js +39 -40
  250. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  251. package/dist/src/agent/service/webchat-tts.d.ts +4 -9
  252. package/dist/src/agent/service/webchat-tts.js +9 -20
  253. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  254. package/dist/src/agent/service.d.ts +8 -19
  255. package/dist/src/agent/service.js +57 -15
  256. package/dist/src/agent/service.js.map +1 -1
  257. package/dist/src/agent/session/session-inspector.js +1 -1
  258. package/dist/src/agent/skills/config.js +1 -1
  259. package/dist/src/agent/skills/hub-hash.js +2 -2
  260. package/dist/src/agent/skills/hub-lock.js +1 -1
  261. package/dist/src/agent/skills/hub-pull.js +2 -2
  262. package/dist/src/agent/skills/index.js +1 -1
  263. package/dist/src/agent/skills/managed-store.js +1 -1
  264. package/dist/src/agent/skills/scanner.js +1 -1
  265. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  266. package/dist/src/agent/skills/skill-manager.js +1 -1
  267. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  268. package/dist/src/agent/tools/factory.js +3 -1
  269. package/dist/src/agent/tools/factory.js.map +1 -1
  270. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  271. package/dist/src/agent/tools/index.d.ts +1 -0
  272. package/dist/src/agent/tools/index.js +2 -1
  273. package/dist/src/agent/tools/media-read-tool.d.ts +2 -0
  274. package/dist/src/agent/tools/media-read-tool.js +89 -0
  275. package/dist/src/agent/tools/media-read-tool.js.map +1 -0
  276. package/dist/src/agent/tools/send-media.js +1 -1
  277. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  278. package/dist/src/agent/tools/workflow-tool.js +1 -1
  279. package/dist/src/agent/tools/write.js +1 -1
  280. package/dist/src/agent/workflow/catalog.js +1 -1
  281. package/dist/src/auth/credentials.js +3 -3
  282. package/dist/src/auth/profiles/store.js +1 -1
  283. package/dist/src/auth/sync-provider-auth.js +1 -1
  284. package/dist/src/browser/cache-dir-policy.js +1 -1
  285. package/dist/src/browser/cdp-local-launcher.js +2 -2
  286. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  287. package/dist/src/browser/providers/cloakbrowser.js +4 -4
  288. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  289. package/dist/src/browser/stealth.js +1 -1
  290. package/dist/src/channels/attachments/attachment-classifiers.d.ts +8 -0
  291. package/dist/src/channels/attachments/attachment-classifiers.js +11 -0
  292. package/dist/src/channels/attachments/attachment-classifiers.js.map +1 -0
  293. package/dist/src/channels/attachments/inbound-persist.d.ts +13 -34
  294. package/dist/src/channels/attachments/inbound-persist.js +34 -102
  295. package/dist/src/channels/attachments/inbound-persist.js.map +1 -1
  296. package/dist/src/channels/attachments/inbound-types.d.ts +13 -0
  297. package/dist/src/channels/attachments/inbound-types.js +30 -0
  298. package/dist/src/channels/attachments/inbound-types.js.map +1 -0
  299. package/dist/src/channels/attachments/outbound-tts-persist.d.ts +3 -12
  300. package/dist/src/channels/attachments/outbound-tts-persist.js +28 -48
  301. package/dist/src/channels/attachments/outbound-tts-persist.js.map +1 -1
  302. package/dist/src/channels/attachments/voice-stt-webchat.d.ts +3 -3
  303. package/dist/src/channels/attachments/voice-stt-webchat.js +8 -14
  304. package/dist/src/channels/attachments/voice-stt-webchat.js.map +1 -1
  305. package/dist/src/channels/channel-domain.d.ts +30 -2
  306. package/dist/src/channels/exec-approval-runtime.d.ts +29 -0
  307. package/dist/src/channels/exec-approval-runtime.js +30 -0
  308. package/dist/src/channels/exec-approval-runtime.js.map +1 -0
  309. package/dist/src/channels/index.js +1 -1
  310. package/dist/src/channels/outbound/persist-store.js +1 -1
  311. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  312. package/dist/src/channels/pairing/pairing-store.js +2 -2
  313. package/dist/src/channels/plugin-types.d.ts +1 -0
  314. package/dist/src/channels/transport-types.d.ts +2 -2
  315. package/dist/src/chat-commands/agent-edit.js +2 -2
  316. package/dist/src/chat-commands/builtins/config.js +2 -2
  317. package/dist/src/chat-commands/context.js +1 -1
  318. package/dist/src/cli/commands/channels.js +1 -1
  319. package/dist/src/cli/commands/config.js +1 -1
  320. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  321. package/dist/src/cli/commands/doctor/checks/database-schema.d.ts +2 -0
  322. package/dist/src/cli/commands/doctor/checks/database-schema.js +62 -0
  323. package/dist/src/cli/commands/doctor/checks/database-schema.js.map +1 -0
  324. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  325. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  326. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  327. package/dist/src/cli/commands/doctor/flow.js +2 -0
  328. package/dist/src/cli/commands/doctor/flow.js.map +1 -1
  329. package/dist/src/cli/commands/extension-dev.js +1 -1
  330. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  331. package/dist/src/cli/commands/extension-pack.js +1 -1
  332. package/dist/src/cli/commands/gateway/logs.js +1 -1
  333. package/dist/src/cli/commands/image.js +1 -1
  334. package/dist/src/cli/commands/init.js +5 -60
  335. package/dist/src/cli/commands/init.js.map +1 -1
  336. package/dist/src/cli/commands/onboard/channels/registry.js +1 -1
  337. package/dist/src/cli/commands/setup.js +6 -5
  338. package/dist/src/cli/commands/setup.js.map +1 -1
  339. package/dist/src/cli/utils/init-workspace-core.js +2 -3
  340. package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
  341. package/dist/src/commands/agents.config.js +1 -1
  342. package/dist/src/config/agent-profile.js +1 -1
  343. package/dist/src/config/gateway-bind.js +1 -1
  344. package/dist/src/config/index.js +7 -7
  345. package/dist/src/config/loader.js +2 -2
  346. package/dist/src/config/models-json.js +2 -2
  347. package/dist/src/config/paths-state.js +1 -1
  348. package/dist/src/config/paths.d.ts +0 -13
  349. package/dist/src/config/paths.js +1 -20
  350. package/dist/src/config/paths.js.map +1 -1
  351. package/dist/src/config/profile.js +2 -2
  352. package/dist/src/config/rules.js +1 -1
  353. package/dist/src/config/schema.d.ts +24 -0
  354. package/dist/src/config/schema.js +33 -2
  355. package/dist/src/config/schema.js.map +1 -1
  356. package/dist/src/config/workspace-path.js +1 -1
  357. package/dist/src/cron/executor.js +4 -4
  358. package/dist/src/cron/persistence.js +1 -1
  359. package/dist/src/daemon/constants.js +1 -1
  360. package/dist/src/daemon/install-plan.js +2 -2
  361. package/dist/src/daemon/launchd.js +2 -2
  362. package/dist/src/daemon/schtasks.js +2 -2
  363. package/dist/src/daemon/systemd.js +2 -2
  364. package/dist/src/extensions/bundle-mcp.js +1 -1
  365. package/dist/src/extensions/discover-extensions.js +1 -1
  366. package/dist/src/extensions/health.js +1 -1
  367. package/dist/src/extensions/loader.js +1 -1
  368. package/dist/src/extensions/lockfile.js +2 -2
  369. package/dist/src/extensions/update.js +1 -1
  370. package/dist/src/gateway/agents-admin.js +3 -3
  371. package/dist/src/gateway/file-path-classifier.js +2 -2
  372. package/dist/src/gateway/heartbeat/service.js +1 -1
  373. package/dist/src/gateway/hono/lib/config-payload.js +2 -2
  374. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  375. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  376. package/dist/src/gateway/hono/oauth.js +1 -1
  377. package/dist/src/gateway/hono/routes/agents.js +1 -1
  378. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  379. package/dist/src/gateway/hono/routes/config-patch/channels.js +3 -3
  380. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -1
  381. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  382. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  383. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  384. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  385. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  386. package/dist/src/gateway/hono/routes/media.d.ts +3 -0
  387. package/dist/src/gateway/hono/routes/media.js +50 -0
  388. package/dist/src/gateway/hono/routes/media.js.map +1 -0
  389. package/dist/src/gateway/hono/routes/models.js +1 -1
  390. package/dist/src/gateway/hono/routes/sessions.js +6 -0
  391. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  392. package/dist/src/gateway/hono/routes/shares.js +1 -1
  393. package/dist/src/gateway/hono/routes/workspace.js +3 -89
  394. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  395. package/dist/src/gateway/lock.js +3 -3
  396. package/dist/src/gateway/ports.js +1 -1
  397. package/dist/src/gateway/service/agent-runner.js +2 -2
  398. package/dist/src/gateway/service/marketplace-service.js +2 -2
  399. package/dist/src/gateway/service/sessions-api.js +3 -0
  400. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  401. package/dist/src/gateway/service.js +1 -1
  402. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  403. package/dist/src/heartbeat/index.js +1 -1
  404. package/dist/src/infra/brew.js +1 -1
  405. package/dist/src/infra/package-json.js +1 -1
  406. package/dist/src/infra/package-update-steps.js +1 -1
  407. package/dist/src/infra/path-env.js +2 -2
  408. package/dist/src/infra/restart.js +2 -2
  409. package/dist/src/infra/stable-node-path.js +1 -1
  410. package/dist/src/infra/update-check.js +1 -1
  411. package/dist/src/infra/update-global.js +1 -1
  412. package/dist/src/infra/update-lock.js +3 -3
  413. package/dist/src/infra/update-runner.js +1 -1
  414. package/dist/src/infra/update-startup.js +2 -2
  415. package/dist/src/infra/write-file-atomic.js +2 -2
  416. package/dist/src/media/index.d.ts +5 -0
  417. package/dist/src/media/index.js +5 -0
  418. package/dist/src/media/media-reference.d.ts +23 -0
  419. package/dist/src/media/media-reference.js +34 -0
  420. package/dist/src/media/media-reference.js.map +1 -0
  421. package/dist/src/media/paths.d.ts +5 -0
  422. package/dist/src/media/paths.js +20 -0
  423. package/dist/src/media/paths.js.map +1 -0
  424. package/dist/src/media/session-references.d.ts +8 -0
  425. package/dist/src/media/session-references.js +45 -0
  426. package/dist/src/media/session-references.js.map +1 -0
  427. package/dist/src/media/store.d.ts +19 -0
  428. package/dist/src/media/store.js +131 -0
  429. package/dist/src/media/store.js.map +1 -0
  430. package/dist/src/media/types.d.ts +34 -0
  431. package/dist/src/media/types.js +1 -0
  432. package/dist/src/media/uri.d.ts +15 -0
  433. package/dist/src/media/uri.js +51 -0
  434. package/dist/src/media/uri.js.map +1 -0
  435. package/dist/src/notes/store.js +2 -2
  436. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  437. package/dist/src/providers/index.js +2 -2
  438. package/dist/src/providers/model-registry.js +1 -1
  439. package/dist/src/session/init-session-turn.js +2 -2
  440. package/dist/src/session/resolve-session.js +3 -3
  441. package/dist/src/session/session-title.js +8 -5
  442. package/dist/src/session/session-title.js.map +1 -1
  443. package/dist/src/session/store.js +3 -3
  444. package/dist/src/session/store.js.map +1 -1
  445. package/dist/src/session/types.d.ts +12 -7
  446. package/dist/src/session/types.js.map +1 -1
  447. package/dist/src/share/share-auto.js +2 -2
  448. package/dist/src/share/share-store.js +3 -3
  449. package/dist/src/share/share-thumbnail.js +2 -2
  450. package/dist/src/share/share-zip.js +1 -1
  451. package/dist/src/share/site-share-store.js +3 -3
  452. package/dist/src/share/site-static-serve.js +1 -1
  453. package/dist/src/storage/sqlite/connection.js +2 -2
  454. package/dist/src/storage/sqlite/index.d.ts +4 -1
  455. package/dist/src/storage/sqlite/index.js +6 -2
  456. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  457. package/dist/src/storage/sqlite/migrations/002_add_flush_columns.sql +3 -0
  458. package/dist/src/storage/sqlite/migrations/discover.d.ts +4 -0
  459. package/dist/src/storage/sqlite/migrations/discover.js +38 -0
  460. package/dist/src/storage/sqlite/migrations/discover.js.map +1 -0
  461. package/dist/src/storage/sqlite/migrations/discover.ts +52 -0
  462. package/dist/src/storage/sqlite/migrations/errors.d.ts +11 -0
  463. package/dist/src/storage/sqlite/migrations/errors.js +27 -0
  464. package/dist/src/storage/sqlite/migrations/errors.js.map +1 -0
  465. package/dist/src/storage/sqlite/migrations/errors.ts +32 -0
  466. package/dist/src/storage/sqlite/migrations/runner.d.ts +22 -0
  467. package/dist/src/storage/sqlite/migrations/runner.js +97 -0
  468. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -0
  469. package/dist/src/storage/sqlite/migrations/runner.ts +153 -0
  470. package/dist/src/storage/sqlite/migrations/types.d.ts +12 -0
  471. package/dist/src/storage/sqlite/migrations/types.js +1 -0
  472. package/dist/src/storage/sqlite/migrations/types.ts +13 -0
  473. package/dist/src/storage/sqlite/row-mappers.d.ts +4 -0
  474. package/dist/src/storage/sqlite/row-mappers.js +4 -0
  475. package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
  476. package/dist/src/storage/sqlite/schema-version.d.ts +6 -0
  477. package/dist/src/storage/sqlite/schema-version.js +29 -0
  478. package/dist/src/storage/sqlite/schema-version.js.map +1 -0
  479. package/dist/src/storage/sqlite/schema.d.ts +5 -3
  480. package/dist/src/storage/sqlite/schema.js +25 -29
  481. package/dist/src/storage/sqlite/schema.js.map +1 -1
  482. package/dist/src/storage/sqlite/schema.sql +2 -0
  483. package/dist/src/storage/sqlite/session-metadata.js +1 -0
  484. package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
  485. package/dist/src/storage/sqlite/session-repository.js +7 -3
  486. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  487. package/dist/src/tui/clipboard-image.js +3 -3
  488. package/dist/src/tui/theme-manager.js +1 -1
  489. package/dist/src/tui/tui-keybindings-file.js +1 -1
  490. package/dist/src/tui/tui-scoped-models.js +2 -2
  491. package/dist/src/tui/tui-settings.js +1 -1
  492. package/dist/src/tui/tui.js +3 -3
  493. package/dist/src/tunnel/frpc-binary.js +3 -3
  494. package/dist/src/tunnel/frpc-config.js +1 -1
  495. package/dist/src/tunnel/frpc-extract.js +1 -1
  496. package/dist/src/tunnel/tunnel-state.js +1 -1
  497. package/dist/src/utils/logger/audit.js +1 -1
  498. package/dist/src/utils/logger/log-store.js +1 -1
  499. package/dist/src/utils/logger/rotation.js +1 -1
  500. package/dist/src/voice/tts/audio.js +1 -1
  501. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  502. package/dist/src/workflows/store/event-store.js +1 -1
  503. package/dist/src/workflows/store/run-store.js +1 -1
  504. package/package.json +1 -1
  505. package/dist/gateway/static/root/assets/channels-settings-BmN5udFV.js +0 -1
  506. package/dist/gateway/static/root/assets/channels-status-swr-LXGc1lXo.js +0 -8
  507. package/dist/gateway/static/root/assets/index-BJDmBCSl.css +0 -1
  508. package/dist/gateway/static/root/assets/index-DsmZjtSc.js +0 -4707
  509. package/dist/gateway/static/root/assets/url-DpFBIyN9.js +0 -3
  510. package/dist/src/cli/commands/onboard/workspace.d.ts +0 -14
  511. package/dist/src/cli/commands/onboard/workspace.js +0 -33
  512. package/dist/src/cli/commands/onboard/workspace.js.map +0 -1
  513. package/dist/src/cli/utils/workspace.d.ts +0 -35
  514. package/dist/src/cli/utils/workspace.js +0 -72
  515. package/dist/src/cli/utils/workspace.js.map +0 -1
@@ -4,9 +4,9 @@ import { formatScanSummary, scanSkillDirectory } from "./scanner.js";
4
4
  import { getSkillsLockEntry, recordSkillsHubInstall } from "./hub-lock.js";
5
5
  import { installSkillFromZip, isValidSkillId } from "./managed-store.js";
6
6
  import { computeSkillTreeHashSync } from "./hub-hash.js";
7
- import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
8
- import { basename, join, normalize, resolve, sep } from "node:path";
9
7
  import { tmpdir } from "node:os";
8
+ import { basename, join, normalize, resolve, sep } from "node:path";
9
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
10
10
  import { fileURLToPath } from "node:url";
11
11
  import { execFileSync } from "node:child_process";
12
12
  import { fetch } from "undici";
@@ -1,6 +1,6 @@
1
+ import { resolveStateDir } from "../../config/paths-state.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { resolveStateDir } from "../../config/paths-state.js";
4
4
  import { init_paths } from "../../config/paths.js";
5
5
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
6
6
  import { findInstallSpec, getDefaultInstallerPreferences, hasBinary, init_installer, installSkill } from "./installer.js";
@@ -1,8 +1,8 @@
1
1
  import { init_paths, resolveSkillsDir } from "../../config/paths.js";
2
2
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
3
3
  import { loadSkillsLock } from "./hub-lock.js";
4
- import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
5
4
  import { dirname, join, resolve, sep } from "node:path";
5
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
6
6
  import AdmZip from "adm-zip";
7
7
  //#region src/agent/skills/managed-store.ts
8
8
  /**
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { readFile, readdir } from "fs/promises";
4
3
  import { join } from "path";
4
+ import { readFile, readdir } from "fs/promises";
5
5
  //#region src/agent/skills/scanner.ts
6
6
  /**
7
7
  * Skill security scanner — scans skill directories for potentially dangerous code patterns.
@@ -2,9 +2,9 @@ import { init_paths, resolveSkillsDir } from "../../config/paths.js";
2
2
  import { parseFrontmatter } from "../../markdown/frontmatter.js";
3
3
  import { fuzzyFindText, normalizeForFuzzyMatch, normalizeToLF, restoreLineEndings } from "../tools/edit-diff.js";
4
4
  import { formatScanSummary, scanSkillDirectory } from "./scanner.js";
5
- import { mkdir, writeFile } from "fs/promises";
6
5
  import { join, resolve, sep } from "path";
7
6
  import { existsSync, realpathSync } from "fs";
7
+ import { mkdir, writeFile } from "fs/promises";
8
8
  //#region src/agent/skills/skill-manage-ops.ts
9
9
  /**
10
10
  * Shared logic for the skill_manage agent tool (create / edit / patch / delete / write_file / remove_file).
@@ -1,6 +1,6 @@
1
+ import { resolveStateDir } from "../../config/paths-state.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { resolveStateDir } from "../../config/paths-state.js";
4
4
  import { init_paths, resolveBundledSkillsDir } from "../../config/paths.js";
5
5
  import { createSkillConfigManager, isSkillEnabled } from "./config.js";
6
6
  import { formatSkillsForPrompt, selectSkillsVisibleInPrompt } from "./format-skills-prompt.js";
@@ -3,8 +3,8 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "../memory/dreaming/constants.js";
4
4
  import { loadDreamingStore, saveDreamingStore } from "../memory/dreaming/short-term-store.js";
5
5
  import { resolveDreamingConfig } from "../memory/dreaming/config.js";
6
- import fs from "node:fs/promises";
7
6
  import path from "node:path";
7
+ import fs from "node:fs/promises";
8
8
  import { Type } from "@sinclair/typebox";
9
9
  //#region src/agent/tools/dreaming-tool.ts
10
10
  init_logger();
@@ -1,6 +1,6 @@
1
+ import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
4
4
  import { createReadFileTool } from "./read.js";
5
5
  import { createWriteFileTool } from "./write.js";
6
6
  import { createEditFileTool } from "./edit.js";
@@ -15,6 +15,7 @@ import { createWebFetchTool, createWebSearchTool } from "./web.js";
15
15
  import { createWebExtractTool } from "./web-extract.js";
16
16
  import { createMessageTool } from "./communication.js";
17
17
  import { createSendMediaTool } from "./send-media.js";
18
+ import { createReadMediaTool } from "./media-read-tool.js";
18
19
  import { createCreateShareTool, isShareToolAvailable } from "./create-share-tool.js";
19
20
  import { createTodoTool } from "./todo-tool.js";
20
21
  import { createSessionStatusTool } from "./session-status-tool.js";
@@ -221,6 +222,7 @@ var AgentToolsFactory = class AgentToolsFactory {
221
222
  getConfig: () => this.deps.getConfig?.()
222
223
  })] : [],
223
224
  createSendMediaTool(workspace, bus, () => this.deps.getCurrentContext()),
225
+ createReadMediaTool(),
224
226
  ...isShareToolAvailable(cfg) ? [createCreateShareTool({
225
227
  workspace,
226
228
  getConfig: () => this.deps.getConfig?.()
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","names":["parseRoutingSessionKey"],"sources":["../../../../src/agent/tools/factory.ts"],"sourcesContent":["/**\n * Agent Tools Factory - Creates and configures agent tools\n *\n * Centralizes tool creation logic to keep service.ts focused on orchestration.\n *\n * TTS: auto TTS is applied at the ChannelManager via maybeApplyTtsToPayload().\n * Optional \\`text_to_speech\\` tool sends explicit voice when TTS is enabled.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport type { Page } from 'playwright-core';\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport {\n createReadFileTool,\n createWriteFileTool,\n createEditFileTool,\n createListDirTool,\n createGrepTool,\n createFindTool,\n createShellTool,\n createWebSearchTool,\n createWebFetchTool,\n createWebExtractTool,\n createMessageTool,\n createSendMediaTool,\n createCreateShareTool,\n isShareToolAvailable,\n createMemorySearchTool,\n createMemoryGetTool,\n createTodoTool,\n createSessionStatusTool,\n createDreamingTool,\n createClarifyTool,\n} from './index.js';\nimport { createCuratedMemoryTool } from './curated-memory-tool.js';\nimport { createSessionSearchTool } from './session-search-tool.js';\nimport type { BuiltinMemoryStore } from '../memory/builtin-memory-store.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { parseSessionKey as parseRoutingSessionKey } from '../../routing/session-key.js';\nimport type { GatewayClarifyRequestFn } from './clarify-tool.js';\nimport { createImageTool } from './image-tool.js';\nimport { createImageGenerateTool } from './image-generate-tool.js';\nimport {\n BrowserManager,\n BrowserNotReadyError,\n CdpSupervisor,\n checkBrowserReadiness,\n resolveBrowserBackendFromConfig,\n} from '../../browser/index.js';\nimport { createBrowserUseTool } from './browser/tool/browser-use-tool.js';\nimport { createDelegateTool } from './delegate-tool.js';\nimport { createWorkflowTool } from './workflow-tool.js';\nimport { createWorkflowCatalog } from '../workflow/catalog.js';\nimport { buildSandboxToolMap, createExecuteCodeTool } from './execute-code-tool.js';\nimport { createCronjobTool } from './cronjob-tool.js';\nimport type { CronService } from '../../cron/index.js';\nimport type { WorkflowRunServiceLike } from '../../workflows/service/workflow-run-service.types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { wrapToolsWithProtection, type ToolExecutorConfig } from './executor.js';\nimport { createSkillsListTool, createSkillViewTool } from './skills-tools.js';\nimport { createSkillManageTool } from './skill-manage-tool.js';\nimport { createTextToSpeechTool } from './tts-tool.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\n\nconst log = createLogger('AgentToolsFactory');\n\n/** Channels where `clarify` can block for a user answer (web UI, Telegram, CLI readline). */\nconst CLARIFY_SUPPORTED_CHANNELS = new Set(['webchat', 'telegram', 'cli']);\n\nfunction clarifyTransportSource(sessionKey: string): string | undefined {\n const parsed = parseRoutingSessionKey(sessionKey);\n if (parsed) return parsed.source;\n // Fallback for simple `<channel>:<chatId>` keys used by webchat and CLI.\n const first = sessionKey.split(':').filter(Boolean)[0] ?? '';\n if (first === 'cli' || first === 'webchat') return first;\n return undefined;\n}\n\nexport interface ToolFactoryDeps {\n workspace: string;\n extensionRegistry?: any;\n getCurrentContext: () => { channel: string; chatId: string; sessionKey: string } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /** Agent defaults (image tools, etc.); use getter so hot-reloaded config applies. */\n getConfig?: () => Config | undefined;\n /** Session / default chat model for vision tool description. */\n getPrimaryModel?: () => Model<Api>;\n /** Built-in curated memory store (agent home `memories/`). */\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n /** Memory orchestration (prefetch/sync + external tools). */\n getMemoryManager?: () => MemoryManager;\n /** Session store for `session_search`. */\n getSessionStore?: () => SessionStore;\n /** When set (gateway webchat), enables the `clarify` tool. */\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: enables the `cronjob` tool. */\n getCronService?: () => CronService | undefined;\n /** Gateway: starts persisted workflow runs (dedicated chat session per run). */\n getWorkflowRunService?: () => WorkflowRunServiceLike | undefined;\n /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */\n getSkillIndexingContext?: () =>\n | { registeredToolNames: string[]; skillAllowlist?: string[] }\n | undefined;\n /** After skill_manage mutates disk, reload skills + refresh agent prompts (optional). */\n onSkillsFilesystemMutate?: () => void;\n /** Names registered via skill_view for shell env passthrough. */\n getSkillPassthroughEnvVarNames?: () => string[];\n /** Add declared env names for the current session (no values stored). */\n registerSkillEnvPassthrough?: (names: string[]) => void;\n}\n\nexport interface CreateCoreToolsOptions {\n /** Workspace root for file/shell tools (defaults to factory workspace). */\n workspace?: string;\n /** Canonical `agents/<id>/profile/`: bare SOUL.md / IDENTITY.md resolve here after the workspace. */\n profileMarkdownRoot?: string;\n /** Tool `name` values to omit (e.g. `shell`, `extensions` for extension tools). */\n disabledTools?: Set<string>;\n /** Optional primary model for image tool heuristics. */\n getPrimaryModel?: () => Model<Api>;\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n getMemoryManager?: () => MemoryManager;\n /** When set, registers `skills_list` and `skill_view` bound to this workspace\\'s skills. */\n getSkillManager?: () => SkillManager;\n}\n\nexport class AgentToolsFactory {\n private browserManager: BrowserManager | null = null;\n /** One dialog/console supervisor per chat session (browser tab). */\n private readonly browserTaskSupervisors = new Map<string, CdpSupervisor>();\n /** Cached readiness probe — keyed by backend mode + extension host:port. */\n private browserReadinessCache: {\n key: string;\n expiresAt: number;\n inflight?: Promise<BrowserNotReadyError | null>;\n result?: BrowserNotReadyError | null;\n } | null = null;\n\n constructor(private deps: ToolFactoryDeps) {}\n\n private browserReadinessKey(): string {\n const cfg = this.deps.getConfig?.();\n const backend = resolveBrowserBackendFromConfig(cfg);\n const ext = cfg?.agents?.defaults?.browser?.extension;\n const host = typeof ext?.host === 'string' && ext.host.trim() ? ext.host.trim() : '127.0.0.1';\n const port = typeof ext?.port === 'number' ? ext.port : 19820;\n const cdpUrl = backend.mode === 'cdp' ? backend.config.wsEndpoint : '';\n const cloudKind = backend.mode === 'cloud' ? backend.config.type : '';\n return `${backend.mode}@${host}:${port}|${cdpUrl}|${cloudKind}`;\n }\n\n private async checkBrowserReadinessCached(): Promise<BrowserNotReadyError | null> {\n const key = this.browserReadinessKey();\n const now = Date.now();\n const cached = this.browserReadinessCache;\n if (cached && cached.key === key && cached.expiresAt > now && cached.inflight === undefined) {\n return cached.result ?? null;\n }\n if (cached && cached.key === key && cached.inflight) {\n return cached.inflight;\n }\n const inflight = checkBrowserReadiness(this.deps.getConfig?.());\n this.browserReadinessCache = { key, expiresAt: now + 30_000, inflight };\n try {\n const result = await inflight;\n this.browserReadinessCache = { key, expiresAt: Date.now() + 30_000, result };\n return result;\n } catch (e) {\n // Probe should never throw, but if it does we just bypass the cache.\n this.browserReadinessCache = null;\n log.warn({ err: e }, 'browserReadiness probe failed');\n return null;\n }\n }\n\n /** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */\n invalidateBrowserReadinessCache(): void {\n this.browserReadinessCache = null;\n }\n\n private browserSupervisorForTask(taskId: string): CdpSupervisor {\n let s = this.browserTaskSupervisors.get(taskId);\n if (!s) {\n const b = this.deps.getConfig?.()?.agents?.defaults?.browser;\n const dialogPolicy =\n b?.dialogPolicy === 'must_respond' || b?.dialogPolicy === 'auto_accept' || b?.dialogPolicy === 'auto_dismiss'\n ? b.dialogPolicy\n : 'auto_dismiss';\n const dialogTimeoutSeconds =\n typeof b?.dialogTimeoutSeconds === 'number' &&\n Number.isFinite(b.dialogTimeoutSeconds) &&\n b.dialogTimeoutSeconds >= 1\n ? Math.floor(b.dialogTimeoutSeconds)\n : 300;\n s = new CdpSupervisor({ dialogPolicy, dialogTimeoutSeconds });\n this.browserTaskSupervisors.set(taskId, s);\n }\n return s;\n }\n\n private async acquireBrowserPage(): Promise<Page> {\n const taskId = this.deps.getCurrentContext()?.sessionKey ?? 'default';\n const mgr = this.ensureBrowserManager();\n await mgr.ensureConnected();\n if (mgr.getExtensionProvider()) {\n return null as unknown as Page;\n }\n const page = await mgr.getPage(taskId);\n this.browserSupervisorForTask(taskId).attach(page);\n return page;\n }\n\n private ensureBrowserManager(): BrowserManager {\n if (!this.browserManager) {\n this.browserManager = new BrowserManager({\n getHeadless: () => this.deps.getConfig?.()?.agents?.defaults?.browser?.headless === true,\n getBackend: () => resolveBrowserBackendFromConfig(this.deps.getConfig?.()),\n });\n }\n return this.browserManager;\n }\n\n /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */\n async shutdownBrowser(): Promise<void> {\n this.browserReadinessCache = null;\n if (!this.browserManager) {\n return;\n }\n await this.browserManager.shutdown();\n this.browserManager = null;\n this.browserTaskSupervisors.clear();\n }\n\n /** Drop the tab for a session when its agent instance is removed. */\n async closeBrowserPageForSession(sessionKey: string): Promise<void> {\n this.browserTaskSupervisors.delete(sessionKey);\n await this.browserManager?.closePage(sessionKey);\n }\n\n createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const workspace = options?.workspace ?? this.deps.workspace;\n const { bus } = this.deps;\n const getPrimary = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const getBuiltin = options?.getBuiltinMemoryStore ?? this.deps.getBuiltinMemoryStore;\n const builtinStore = getBuiltin?.();\n const memoriesDir = builtinStore?.memoriesDir;\n const getMemMgr = options?.getMemoryManager ?? this.deps.getMemoryManager;\n const getSkillMgr = options?.getSkillManager;\n const disabled = options?.disabledTools;\n\n const primary = getPrimary?.();\n const modelHasVision = primary?.input?.includes('image') ?? false;\n const cfg = this.deps.getConfig?.();\n const imageTool = createImageTool({\n config: cfg,\n workspace,\n modelHasVision,\n });\n const imageGenerateTool = createImageGenerateTool({\n config: cfg,\n workspace,\n });\n\n const optionalTools = [imageTool, imageGenerateTool].filter((t) => t != null) as any[];\n\n const readTool = createReadFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const writeTool = createWriteFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const editTool = createEditFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const listDir = createListDirTool(workspace);\n const grep = createGrepTool(workspace);\n const find = createFindTool(workspace);\n\n const core: AgentTool<any, any>[] = [\n createSessionStatusTool(),\n createDreamingTool({\n getWorkspace: () => workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n createClarifyTool({\n resolveAskUser: () => {\n const req = this.deps.gatewayClarify?.requestClarification;\n if (!req) return null;\n const ctx = this.deps.getCurrentContext();\n if (!ctx?.sessionKey) return null;\n const source = clarifyTransportSource(ctx.sessionKey);\n if (!source || !CLARIFY_SUPPORTED_CHANNELS.has(source)) return null;\n return (r) => req(ctx.sessionKey, r);\n },\n }),\n createTodoTool({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ...(getSkillMgr\n ? [\n createSkillsListTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n }),\n createSkillViewTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n registerSkillEnvPassthrough: this.deps.registerSkillEnvPassthrough,\n }),\n createSkillManageTool({\n getSkillManager: getSkillMgr,\n getWorkspace: () => workspace,\n onSkillsFilesystemMutate: this.deps.onSkillsFilesystemMutate,\n }),\n ]\n : []),\n readTool,\n writeTool,\n editTool,\n listDir,\n grep,\n find,\n createShellTool(workspace, {\n getSkillPassthroughEnvVarNames: this.deps.getSkillPassthroughEnvVarNames,\n }),\n createWebSearchTool(() => this.deps.getConfig?.()),\n createWebFetchTool(() => this.deps.getConfig?.()),\n createWebExtractTool({ getConfig: () => this.deps.getConfig?.() }),\n // Note: TTS is NOT handled by send_message tool anymore\n // TTS is applied at the ChannelManager dispatch layer\n createMessageTool(bus, () => this.deps.getCurrentContext()),\n ...(mergeTtsConfigFromAppConfig(cfg?.messages?.tts).enabled\n ? [\n createTextToSpeechTool({\n bus,\n getContext: () => this.deps.getCurrentContext(),\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createSendMediaTool(workspace, bus, () => this.deps.getCurrentContext()),\n ...(isShareToolAvailable(cfg)\n ? [\n createCreateShareTool({\n workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createMemorySearchTool({ workspaceDir: workspace, memoriesDir }),\n createMemoryGetTool({ workspaceDir: workspace, memoriesDir }),\n ...(getBuiltin && shouldRegisterCuratedMemoryTool(this.deps.getConfig?.())\n ? [\n createCuratedMemoryTool(getBuiltin, {\n onMemoryWrite: (action, target, content) => {\n getMemMgr?.().onMemoryWrite(action, target, content);\n },\n }),\n ]\n : []),\n ...(getMemMgr?.().getAdditionalTools() ?? []),\n ...(this.deps.getSessionStore\n ? [\n createSessionSearchTool({\n getSessionStore: this.deps.getSessionStore,\n getConfig: this.deps.getConfig,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ]\n : []),\n ...(this.deps.getCronService\n ? [\n createCronjobTool({\n getCronService: this.deps.getCronService,\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.browser?.enabled !== false\n ? [\n createBrowserUseTool({\n getManager: () => this.ensureBrowserManager(),\n getPageForTask: () => this.acquireBrowserPage(),\n getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? 'default',\n getConfig: () => this.deps.getConfig?.(),\n getReadiness: () => this.checkBrowserReadinessCached(),\n getSupervisor: () =>\n this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? 'default'),\n notifyBrowserPageClosed: (taskId) => {\n this.browserTaskSupervisors.delete(taskId);\n },\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.workflow?.enabled !== false && primary\n ? [\n createWorkflowTool({\n catalog: createWorkflowCatalog(),\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n getConfig: () => this.deps.getConfig?.(),\n startWorkflowRun: this.deps.getWorkflowRunService\n ? (params) => this.deps.getWorkflowRunService!().startWorkflowRun(params)\n : undefined,\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.delegate?.enabled === true && primary\n ? [\n createDelegateTool({\n workspace,\n getSubagentModel: () => {\n const gp = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const m = gp?.();\n if (!m) {\n throw new Error('No primary model configured for delegate_task');\n }\n return m;\n },\n bus: this.deps.bus,\n getConfig: () => this.deps.getConfig?.(),\n getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,\n hookRunner: this.deps.hookRunner,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n // Injected so `child-agent-factory.ts` does not need to import\n // `AgentToolsFactory` directly (which would form a cycle).\n buildChildTools: (childOpts) => {\n const childFactory = new AgentToolsFactory({\n workspace: childOpts.workspace,\n bus: childOpts.bus,\n getCurrentContext: () => null,\n getConfig: childOpts.getConfig,\n getPrimaryModel: () => childOpts.model,\n toolExecutorConfig: childOpts.toolExecutorConfig,\n });\n return childFactory.createAllTools({\n workspace: childOpts.workspace,\n getPrimaryModel: () => childOpts.model,\n disabledTools: new Set(['extensions']),\n });\n },\n }),\n ]\n : []),\n ...optionalTools,\n ];\n\n return filterToolsByDisabledSet(core, disabled);\n }\n\n createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const coreTools = this.createCoreTools(coreOptions);\n const disableExtensions = coreOptions?.disabledTools?.has('extensions');\n const cfg = this.deps.getConfig?.();\n\n let bundled: AgentTool<any, any>[];\n if (!this.deps.extensionRegistry || disableExtensions) {\n bundled = coreTools;\n } else {\n const extensionTools = this.deps.extensionRegistry.getAllTools();\n log.info({ count: extensionTools.length }, 'Loaded extension tools');\n bundled = [...coreTools, ...extensionTools];\n }\n\n const wrapped = wrapToolsWithProtection(bundled, this.deps.toolExecutorConfig);\n\n const executeEnabled =\n cfg?.agents?.defaults?.executeCode?.enabled === true &&\n !coreOptions?.disabledTools?.has('execute_code');\n\n if (executeEnabled) {\n const sandboxMap = buildSandboxToolMap(wrapped);\n const executeTool = createExecuteCodeTool({ getSandboxToolMap: () => sandboxMap });\n const wrappedExecute = wrapToolsWithProtection([executeTool as any], this.deps.toolExecutorConfig);\n return [...wrapped, ...wrappedExecute];\n }\n\n return wrapped;\n }\n}\n\nfunction filterToolsByDisabledSet(\n tools: any[],\n disabled: Set<string> | undefined,\n): any[] {\n if (!disabled || disabled.size === 0) {\n return tools;\n }\n return tools.filter((t) => !disabled.has(t.name));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"factory.js","names":["parseRoutingSessionKey"],"sources":["../../../../src/agent/tools/factory.ts"],"sourcesContent":["/**\n * Agent Tools Factory - Creates and configures agent tools\n *\n * Centralizes tool creation logic to keep service.ts focused on orchestration.\n *\n * TTS: auto TTS is applied at the ChannelManager via maybeApplyTtsToPayload().\n * Optional \\`text_to_speech\\` tool sends explicit voice when TTS is enabled.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport type { Page } from 'playwright-core';\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport {\n createReadFileTool,\n createWriteFileTool,\n createEditFileTool,\n createListDirTool,\n createGrepTool,\n createFindTool,\n createShellTool,\n createWebSearchTool,\n createWebFetchTool,\n createWebExtractTool,\n createMessageTool,\n createSendMediaTool,\n createReadMediaTool,\n createCreateShareTool,\n isShareToolAvailable,\n createMemorySearchTool,\n createMemoryGetTool,\n createTodoTool,\n createSessionStatusTool,\n createDreamingTool,\n createClarifyTool,\n} from './index.js';\nimport { createCuratedMemoryTool } from './curated-memory-tool.js';\nimport { createSessionSearchTool } from './session-search-tool.js';\nimport type { BuiltinMemoryStore } from '../memory/builtin-memory-store.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { parseSessionKey as parseRoutingSessionKey } from '../../routing/session-key.js';\nimport type { GatewayClarifyRequestFn } from './clarify-tool.js';\nimport { createImageTool } from './image-tool.js';\nimport { createImageGenerateTool } from './image-generate-tool.js';\nimport {\n BrowserManager,\n BrowserNotReadyError,\n CdpSupervisor,\n checkBrowserReadiness,\n resolveBrowserBackendFromConfig,\n} from '../../browser/index.js';\nimport { createBrowserUseTool } from './browser/tool/browser-use-tool.js';\nimport { createDelegateTool } from './delegate-tool.js';\nimport { createWorkflowTool } from './workflow-tool.js';\nimport { createWorkflowCatalog } from '../workflow/catalog.js';\nimport { buildSandboxToolMap, createExecuteCodeTool } from './execute-code-tool.js';\nimport { createCronjobTool } from './cronjob-tool.js';\nimport type { CronService } from '../../cron/index.js';\nimport type { WorkflowRunServiceLike } from '../../workflows/service/workflow-run-service.types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { wrapToolsWithProtection, type ToolExecutorConfig } from './executor.js';\nimport { createSkillsListTool, createSkillViewTool } from './skills-tools.js';\nimport { createSkillManageTool } from './skill-manage-tool.js';\nimport { createTextToSpeechTool } from './tts-tool.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\n\nconst log = createLogger('AgentToolsFactory');\n\n/** Channels where `clarify` can block for a user answer (web UI, Telegram, CLI readline). */\nconst CLARIFY_SUPPORTED_CHANNELS = new Set(['webchat', 'telegram', 'cli']);\n\nfunction clarifyTransportSource(sessionKey: string): string | undefined {\n const parsed = parseRoutingSessionKey(sessionKey);\n if (parsed) return parsed.source;\n // Fallback for simple `<channel>:<chatId>` keys used by webchat and CLI.\n const first = sessionKey.split(':').filter(Boolean)[0] ?? '';\n if (first === 'cli' || first === 'webchat') return first;\n return undefined;\n}\n\nexport interface ToolFactoryDeps {\n workspace: string;\n extensionRegistry?: any;\n getCurrentContext: () => { channel: string; chatId: string; sessionKey: string } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /** Agent defaults (image tools, etc.); use getter so hot-reloaded config applies. */\n getConfig?: () => Config | undefined;\n /** Session / default chat model for vision tool description. */\n getPrimaryModel?: () => Model<Api>;\n /** Built-in curated memory store (agent home `memories/`). */\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n /** Memory orchestration (prefetch/sync + external tools). */\n getMemoryManager?: () => MemoryManager;\n /** Session store for `session_search`. */\n getSessionStore?: () => SessionStore;\n /** When set (gateway webchat), enables the `clarify` tool. */\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: enables the `cronjob` tool. */\n getCronService?: () => CronService | undefined;\n /** Gateway: starts persisted workflow runs (dedicated chat session per run). */\n getWorkflowRunService?: () => WorkflowRunServiceLike | undefined;\n /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */\n getSkillIndexingContext?: () =>\n | { registeredToolNames: string[]; skillAllowlist?: string[] }\n | undefined;\n /** After skill_manage mutates disk, reload skills + refresh agent prompts (optional). */\n onSkillsFilesystemMutate?: () => void;\n /** Names registered via skill_view for shell env passthrough. */\n getSkillPassthroughEnvVarNames?: () => string[];\n /** Add declared env names for the current session (no values stored). */\n registerSkillEnvPassthrough?: (names: string[]) => void;\n}\n\nexport interface CreateCoreToolsOptions {\n /** Workspace root for file/shell tools (defaults to factory workspace). */\n workspace?: string;\n /** Canonical `agents/<id>/profile/`: bare SOUL.md / IDENTITY.md resolve here after the workspace. */\n profileMarkdownRoot?: string;\n /** Tool `name` values to omit (e.g. `shell`, `extensions` for extension tools). */\n disabledTools?: Set<string>;\n /** Optional primary model for image tool heuristics. */\n getPrimaryModel?: () => Model<Api>;\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n getMemoryManager?: () => MemoryManager;\n /** When set, registers `skills_list` and `skill_view` bound to this workspace\\'s skills. */\n getSkillManager?: () => SkillManager;\n}\n\nexport class AgentToolsFactory {\n private browserManager: BrowserManager | null = null;\n /** One dialog/console supervisor per chat session (browser tab). */\n private readonly browserTaskSupervisors = new Map<string, CdpSupervisor>();\n /** Cached readiness probe — keyed by backend mode + extension host:port. */\n private browserReadinessCache: {\n key: string;\n expiresAt: number;\n inflight?: Promise<BrowserNotReadyError | null>;\n result?: BrowserNotReadyError | null;\n } | null = null;\n\n constructor(private deps: ToolFactoryDeps) {}\n\n private browserReadinessKey(): string {\n const cfg = this.deps.getConfig?.();\n const backend = resolveBrowserBackendFromConfig(cfg);\n const ext = cfg?.agents?.defaults?.browser?.extension;\n const host = typeof ext?.host === 'string' && ext.host.trim() ? ext.host.trim() : '127.0.0.1';\n const port = typeof ext?.port === 'number' ? ext.port : 19820;\n const cdpUrl = backend.mode === 'cdp' ? backend.config.wsEndpoint : '';\n const cloudKind = backend.mode === 'cloud' ? backend.config.type : '';\n return `${backend.mode}@${host}:${port}|${cdpUrl}|${cloudKind}`;\n }\n\n private async checkBrowserReadinessCached(): Promise<BrowserNotReadyError | null> {\n const key = this.browserReadinessKey();\n const now = Date.now();\n const cached = this.browserReadinessCache;\n if (cached && cached.key === key && cached.expiresAt > now && cached.inflight === undefined) {\n return cached.result ?? null;\n }\n if (cached && cached.key === key && cached.inflight) {\n return cached.inflight;\n }\n const inflight = checkBrowserReadiness(this.deps.getConfig?.());\n this.browserReadinessCache = { key, expiresAt: now + 30_000, inflight };\n try {\n const result = await inflight;\n this.browserReadinessCache = { key, expiresAt: Date.now() + 30_000, result };\n return result;\n } catch (e) {\n // Probe should never throw, but if it does we just bypass the cache.\n this.browserReadinessCache = null;\n log.warn({ err: e }, 'browserReadiness probe failed');\n return null;\n }\n }\n\n /** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */\n invalidateBrowserReadinessCache(): void {\n this.browserReadinessCache = null;\n }\n\n private browserSupervisorForTask(taskId: string): CdpSupervisor {\n let s = this.browserTaskSupervisors.get(taskId);\n if (!s) {\n const b = this.deps.getConfig?.()?.agents?.defaults?.browser;\n const dialogPolicy =\n b?.dialogPolicy === 'must_respond' || b?.dialogPolicy === 'auto_accept' || b?.dialogPolicy === 'auto_dismiss'\n ? b.dialogPolicy\n : 'auto_dismiss';\n const dialogTimeoutSeconds =\n typeof b?.dialogTimeoutSeconds === 'number' &&\n Number.isFinite(b.dialogTimeoutSeconds) &&\n b.dialogTimeoutSeconds >= 1\n ? Math.floor(b.dialogTimeoutSeconds)\n : 300;\n s = new CdpSupervisor({ dialogPolicy, dialogTimeoutSeconds });\n this.browserTaskSupervisors.set(taskId, s);\n }\n return s;\n }\n\n private async acquireBrowserPage(): Promise<Page> {\n const taskId = this.deps.getCurrentContext()?.sessionKey ?? 'default';\n const mgr = this.ensureBrowserManager();\n await mgr.ensureConnected();\n if (mgr.getExtensionProvider()) {\n return null as unknown as Page;\n }\n const page = await mgr.getPage(taskId);\n this.browserSupervisorForTask(taskId).attach(page);\n return page;\n }\n\n private ensureBrowserManager(): BrowserManager {\n if (!this.browserManager) {\n this.browserManager = new BrowserManager({\n getHeadless: () => this.deps.getConfig?.()?.agents?.defaults?.browser?.headless === true,\n getBackend: () => resolveBrowserBackendFromConfig(this.deps.getConfig?.()),\n });\n }\n return this.browserManager;\n }\n\n /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */\n async shutdownBrowser(): Promise<void> {\n this.browserReadinessCache = null;\n if (!this.browserManager) {\n return;\n }\n await this.browserManager.shutdown();\n this.browserManager = null;\n this.browserTaskSupervisors.clear();\n }\n\n /** Drop the tab for a session when its agent instance is removed. */\n async closeBrowserPageForSession(sessionKey: string): Promise<void> {\n this.browserTaskSupervisors.delete(sessionKey);\n await this.browserManager?.closePage(sessionKey);\n }\n\n createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const workspace = options?.workspace ?? this.deps.workspace;\n const { bus } = this.deps;\n const getPrimary = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const getBuiltin = options?.getBuiltinMemoryStore ?? this.deps.getBuiltinMemoryStore;\n const builtinStore = getBuiltin?.();\n const memoriesDir = builtinStore?.memoriesDir;\n const getMemMgr = options?.getMemoryManager ?? this.deps.getMemoryManager;\n const getSkillMgr = options?.getSkillManager;\n const disabled = options?.disabledTools;\n\n const primary = getPrimary?.();\n const modelHasVision = primary?.input?.includes('image') ?? false;\n const cfg = this.deps.getConfig?.();\n const imageTool = createImageTool({\n config: cfg,\n workspace,\n modelHasVision,\n });\n const imageGenerateTool = createImageGenerateTool({\n config: cfg,\n workspace,\n });\n\n const optionalTools = [imageTool, imageGenerateTool].filter((t) => t != null) as any[];\n\n const readTool = createReadFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const writeTool = createWriteFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const editTool = createEditFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const listDir = createListDirTool(workspace);\n const grep = createGrepTool(workspace);\n const find = createFindTool(workspace);\n\n const core: AgentTool<any, any>[] = [\n createSessionStatusTool(),\n createDreamingTool({\n getWorkspace: () => workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n createClarifyTool({\n resolveAskUser: () => {\n const req = this.deps.gatewayClarify?.requestClarification;\n if (!req) return null;\n const ctx = this.deps.getCurrentContext();\n if (!ctx?.sessionKey) return null;\n const source = clarifyTransportSource(ctx.sessionKey);\n if (!source || !CLARIFY_SUPPORTED_CHANNELS.has(source)) return null;\n return (r) => req(ctx.sessionKey, r);\n },\n }),\n createTodoTool({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ...(getSkillMgr\n ? [\n createSkillsListTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n }),\n createSkillViewTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n registerSkillEnvPassthrough: this.deps.registerSkillEnvPassthrough,\n }),\n createSkillManageTool({\n getSkillManager: getSkillMgr,\n getWorkspace: () => workspace,\n onSkillsFilesystemMutate: this.deps.onSkillsFilesystemMutate,\n }),\n ]\n : []),\n readTool,\n writeTool,\n editTool,\n listDir,\n grep,\n find,\n createShellTool(workspace, {\n getSkillPassthroughEnvVarNames: this.deps.getSkillPassthroughEnvVarNames,\n }),\n createWebSearchTool(() => this.deps.getConfig?.()),\n createWebFetchTool(() => this.deps.getConfig?.()),\n createWebExtractTool({ getConfig: () => this.deps.getConfig?.() }),\n // Note: TTS is NOT handled by send_message tool anymore\n // TTS is applied at the ChannelManager dispatch layer\n createMessageTool(bus, () => this.deps.getCurrentContext()),\n ...(mergeTtsConfigFromAppConfig(cfg?.messages?.tts).enabled\n ? [\n createTextToSpeechTool({\n bus,\n getContext: () => this.deps.getCurrentContext(),\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createSendMediaTool(workspace, bus, () => this.deps.getCurrentContext()),\n createReadMediaTool(),\n ...(isShareToolAvailable(cfg)\n ? [\n createCreateShareTool({\n workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createMemorySearchTool({ workspaceDir: workspace, memoriesDir }),\n createMemoryGetTool({ workspaceDir: workspace, memoriesDir }),\n ...(getBuiltin && shouldRegisterCuratedMemoryTool(this.deps.getConfig?.())\n ? [\n createCuratedMemoryTool(getBuiltin, {\n onMemoryWrite: (action, target, content) => {\n getMemMgr?.().onMemoryWrite(action, target, content);\n },\n }),\n ]\n : []),\n ...(getMemMgr?.().getAdditionalTools() ?? []),\n ...(this.deps.getSessionStore\n ? [\n createSessionSearchTool({\n getSessionStore: this.deps.getSessionStore,\n getConfig: this.deps.getConfig,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ]\n : []),\n ...(this.deps.getCronService\n ? [\n createCronjobTool({\n getCronService: this.deps.getCronService,\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.browser?.enabled !== false\n ? [\n createBrowserUseTool({\n getManager: () => this.ensureBrowserManager(),\n getPageForTask: () => this.acquireBrowserPage(),\n getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? 'default',\n getConfig: () => this.deps.getConfig?.(),\n getReadiness: () => this.checkBrowserReadinessCached(),\n getSupervisor: () =>\n this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? 'default'),\n notifyBrowserPageClosed: (taskId) => {\n this.browserTaskSupervisors.delete(taskId);\n },\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.workflow?.enabled !== false && primary\n ? [\n createWorkflowTool({\n catalog: createWorkflowCatalog(),\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n getConfig: () => this.deps.getConfig?.(),\n startWorkflowRun: this.deps.getWorkflowRunService\n ? (params) => this.deps.getWorkflowRunService!().startWorkflowRun(params)\n : undefined,\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.delegate?.enabled === true && primary\n ? [\n createDelegateTool({\n workspace,\n getSubagentModel: () => {\n const gp = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const m = gp?.();\n if (!m) {\n throw new Error('No primary model configured for delegate_task');\n }\n return m;\n },\n bus: this.deps.bus,\n getConfig: () => this.deps.getConfig?.(),\n getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,\n hookRunner: this.deps.hookRunner,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n // Injected so `child-agent-factory.ts` does not need to import\n // `AgentToolsFactory` directly (which would form a cycle).\n buildChildTools: (childOpts) => {\n const childFactory = new AgentToolsFactory({\n workspace: childOpts.workspace,\n bus: childOpts.bus,\n getCurrentContext: () => null,\n getConfig: childOpts.getConfig,\n getPrimaryModel: () => childOpts.model,\n toolExecutorConfig: childOpts.toolExecutorConfig,\n });\n return childFactory.createAllTools({\n workspace: childOpts.workspace,\n getPrimaryModel: () => childOpts.model,\n disabledTools: new Set(['extensions']),\n });\n },\n }),\n ]\n : []),\n ...optionalTools,\n ];\n\n return filterToolsByDisabledSet(core, disabled);\n }\n\n createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const coreTools = this.createCoreTools(coreOptions);\n const disableExtensions = coreOptions?.disabledTools?.has('extensions');\n const cfg = this.deps.getConfig?.();\n\n let bundled: AgentTool<any, any>[];\n if (!this.deps.extensionRegistry || disableExtensions) {\n bundled = coreTools;\n } else {\n const extensionTools = this.deps.extensionRegistry.getAllTools();\n log.info({ count: extensionTools.length }, 'Loaded extension tools');\n bundled = [...coreTools, ...extensionTools];\n }\n\n const wrapped = wrapToolsWithProtection(bundled, this.deps.toolExecutorConfig);\n\n const executeEnabled =\n cfg?.agents?.defaults?.executeCode?.enabled === true &&\n !coreOptions?.disabledTools?.has('execute_code');\n\n if (executeEnabled) {\n const sandboxMap = buildSandboxToolMap(wrapped);\n const executeTool = createExecuteCodeTool({ getSandboxToolMap: () => sandboxMap });\n const wrappedExecute = wrapToolsWithProtection([executeTool as any], this.deps.toolExecutorConfig);\n return [...wrapped, ...wrappedExecute];\n }\n\n return wrapped;\n }\n}\n\nfunction filterToolsByDisabledSet(\n tools: any[],\n disabled: Set<string> | undefined,\n): any[] {\n if (!disabled || disabled.size === 0) {\n return tools;\n }\n return tools.filter((t) => !disabled.has(t.name));\n}\n"],"mappings":"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"}
@@ -4,9 +4,9 @@ import { isFailoverError } from "../failover-error.js";
4
4
  import { imageAssetFromDataUrl, imageFileExtensionForMimeType, mimeTypeFromFileName, parseImageDataUrl, sniffImageMimeType } from "../image/generation/image-assets.js";
5
5
  import { getImageGenerationProvider } from "../image/generation/provider-registry.js";
6
6
  import { generateImage, listImageGenerationProvidersSummary } from "../image/generation/runtime.js";
7
+ import path from "node:path";
7
8
  import { randomBytes } from "node:crypto";
8
9
  import { mkdir, readFile, writeFile } from "node:fs/promises";
9
- import path from "node:path";
10
10
  import { Type } from "@sinclair/typebox";
11
11
  //#region src/agent/tools/image-generate-tool.ts
12
12
  const DEFAULT_COUNT = 1;
@@ -12,6 +12,7 @@ export { createWebSearchTool, createWebFetchTool } from './web.js';
12
12
  export { createWebExtractTool, stripHtmlBoilerplate, DEFAULT_WEB_EXTRACT_MAX_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, } from './web-extract.js';
13
13
  export { createMessageTool } from './communication.js';
14
14
  export { createSendMediaTool } from './send-media.js';
15
+ export { createReadMediaTool } from './media-read-tool.js';
15
16
  export { createCreateShareTool, isShareToolAvailable, type CreateShareToolDeps, } from './create-share-tool.js';
16
17
  export { createTodoTool, TodoStore, type TodoItem, type TodoStatus } from './todo-tool.js';
17
18
  export { createSessionStatusTool } from './session-status-tool.js';
@@ -14,6 +14,7 @@ import { createWebFetchTool, createWebSearchTool } from "./web.js";
14
14
  import { DEFAULT_WEB_EXTRACT_MAX_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, createWebExtractTool, stripHtmlBoilerplate } from "./web-extract.js";
15
15
  import { createMessageTool } from "./communication.js";
16
16
  import { createSendMediaTool } from "./send-media.js";
17
+ import { createReadMediaTool } from "./media-read-tool.js";
17
18
  import { createCreateShareTool, isShareToolAvailable } from "./create-share-tool.js";
18
19
  import { TodoStore, createTodoTool } from "./todo-tool.js";
19
20
  import { createSessionStatusTool } from "./session-status-tool.js";
@@ -31,4 +32,4 @@ import { createSkillManageTool } from "./skill-manage-tool.js";
31
32
  import { resolveImageModelConfigForTool } from "../image/tool-model-config.js";
32
33
  import { createImageTool } from "./image-tool.js";
33
34
  import { createImageGenerateTool, resolveImageGenerationModelConfigForTool } from "./image-generate-tool.js";
34
- export { BrowserManager, DEFAULT_DELEGATE_TOOLS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, DEFAULT_WEB_EXTRACT_MAX_LENGTH, DELEGATE_BLOCKED_TOOLS, GREP_MAX_LINE_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, SANDBOX_ALLOWED_TOOLS, TodoStore, assertBrowserUrlAllowed, buildSandboxToolMap, createClarifyTool, createCreateShareTool, createCronjobTool, createCuratedMemoryTool, createDelegateTool, createDreamingTool, createEditFileTool, createExecuteCodeTool, createFindTool, createGrepTool, createImageGenerateTool, createImageTool, createListDirTool, createMemoryGetTool, createMemorySearchTool, createMessageTool, createReadFileTool, createSendMediaTool, createSessionSearchTool, createSessionStatusTool, createShellTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createTodoTool, createWebExtractTool, createWebFetchTool, createWebSearchTool, createWorkflowTool, createWriteFileTool, editFileTool, findTool, formatSize, fuzzyFindText, generateDiffString, grepTool, isShareToolAvailable, listDirTool, normalizeForFuzzyMatch, normalizeToLF, resolveImageGenerationModelConfigForTool, resolveImageModelConfigForTool, restoreLineEndings, scanCronPrompt, stripBom, stripHtmlBoilerplate, truncateHead, truncateLine, truncateTail, writeFileTool };
35
+ export { BrowserManager, DEFAULT_DELEGATE_TOOLS, DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, DEFAULT_WEB_EXTRACT_MAX_LENGTH, DELEGATE_BLOCKED_TOOLS, GREP_MAX_LINE_LENGTH, MAX_RAW_HTML_CHARS_FOR_WEB_EXTRACT, SANDBOX_ALLOWED_TOOLS, TodoStore, assertBrowserUrlAllowed, buildSandboxToolMap, createClarifyTool, createCreateShareTool, createCronjobTool, createCuratedMemoryTool, createDelegateTool, createDreamingTool, createEditFileTool, createExecuteCodeTool, createFindTool, createGrepTool, createImageGenerateTool, createImageTool, createListDirTool, createMemoryGetTool, createMemorySearchTool, createMessageTool, createReadFileTool, createReadMediaTool, createSendMediaTool, createSessionSearchTool, createSessionStatusTool, createShellTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createTodoTool, createWebExtractTool, createWebFetchTool, createWebSearchTool, createWorkflowTool, createWriteFileTool, editFileTool, findTool, formatSize, fuzzyFindText, generateDiffString, grepTool, isShareToolAvailable, listDirTool, normalizeForFuzzyMatch, normalizeToLF, resolveImageGenerationModelConfigForTool, resolveImageModelConfigForTool, restoreLineEndings, scanCronPrompt, stripBom, stripHtmlBoilerplate, truncateHead, truncateLine, truncateTail, writeFileTool };
@@ -0,0 +1,2 @@
1
+ import type { AgentTool } from '@earendil-works/pi-agent-core';
2
+ export declare function createReadMediaTool(): AgentTool;
@@ -0,0 +1,89 @@
1
+ import { mimeTypeFromMediaPath } from "../../media/store.js";
2
+ import { readMediaReference } from "../../media/media-reference.js";
3
+ import { Type } from "@sinclair/typebox";
4
+ //#region src/agent/tools/media-read-tool.ts
5
+ const DEFAULT_MAX_BYTES = 1024 * 1024;
6
+ const HARD_MAX_BYTES = 5 * 1024 * 1024;
7
+ const ReadMediaSchema = Type.Object({
8
+ uri: Type.String({ description: "The media:// URI from an xopc-media-uri line in the user message." }),
9
+ maxBytes: Type.Optional(Type.Number({ description: "Maximum bytes to read, capped at 5 MiB." }))
10
+ });
11
+ function isLikelyText(mimeType) {
12
+ return mimeType.startsWith("text/") || mimeType === "application/json" || mimeType === "application/xml" || mimeType === "application/javascript" || mimeType === "application/typescript";
13
+ }
14
+ function clampMaxBytes(raw) {
15
+ if (typeof raw !== "number" || !Number.isFinite(raw) || raw <= 0) return DEFAULT_MAX_BYTES;
16
+ return Math.min(Math.floor(raw), HARD_MAX_BYTES);
17
+ }
18
+ function createReadMediaTool() {
19
+ return {
20
+ name: "read_media",
21
+ label: "Read Media Attachment",
22
+ description: "Read an attachment by media:// URI. Use this for xopc-media-uri attachments in user messages.",
23
+ parameters: ReadMediaSchema,
24
+ async execute(_toolCallId, params, _signal) {
25
+ const uri = typeof params.uri === "string" ? params.uri.trim() : "";
26
+ if (!uri) return {
27
+ content: [{
28
+ type: "text",
29
+ text: "Missing media URI."
30
+ }],
31
+ details: {
32
+ ok: false,
33
+ error: "missing_uri"
34
+ }
35
+ };
36
+ try {
37
+ const { buffer, path } = await readMediaReference(uri, clampMaxBytes(params.maxBytes));
38
+ const mimeType = mimeTypeFromMediaPath(path);
39
+ const metadata = {
40
+ ok: true,
41
+ uri,
42
+ mimeType,
43
+ size: buffer.byteLength,
44
+ path
45
+ };
46
+ if (isLikelyText(mimeType)) return {
47
+ content: [{
48
+ type: "text",
49
+ text: buffer.toString("utf8")
50
+ }],
51
+ details: {
52
+ ...metadata,
53
+ kind: "text"
54
+ }
55
+ };
56
+ return {
57
+ content: [{
58
+ type: "text",
59
+ text: JSON.stringify({
60
+ ...metadata,
61
+ kind: "binary",
62
+ base64: buffer.toString("base64")
63
+ }, null, 2)
64
+ }],
65
+ details: {
66
+ ...metadata,
67
+ kind: "binary"
68
+ }
69
+ };
70
+ } catch (err) {
71
+ const message = err instanceof Error ? err.message : String(err);
72
+ return {
73
+ content: [{
74
+ type: "text",
75
+ text: `Media read error: ${message}`
76
+ }],
77
+ details: {
78
+ ok: false,
79
+ error: message
80
+ }
81
+ };
82
+ }
83
+ }
84
+ };
85
+ }
86
+ //#endregion
87
+ export { createReadMediaTool };
88
+
89
+ //# sourceMappingURL=media-read-tool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"media-read-tool.js","names":[],"sources":["../../../../src/agent/tools/media-read-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport { readMediaReference } from '../../media/media-reference.js';\nimport { mimeTypeFromMediaPath } from '../../media/store.js';\n\nconst DEFAULT_MAX_BYTES = 1024 * 1024;\nconst HARD_MAX_BYTES = 5 * 1024 * 1024;\n\nconst ReadMediaSchema = Type.Object({\n uri: Type.String({\n description: 'The media:// URI from an xopc-media-uri line in the user message.',\n }),\n maxBytes: Type.Optional(Type.Number({\n description: 'Maximum bytes to read, capped at 5 MiB.',\n })),\n});\n\nfunction isLikelyText(mimeType: string): boolean {\n return (\n mimeType.startsWith('text/') ||\n mimeType === 'application/json' ||\n mimeType === 'application/xml' ||\n mimeType === 'application/javascript' ||\n mimeType === 'application/typescript'\n );\n}\n\nfunction clampMaxBytes(raw: unknown): number {\n if (typeof raw !== 'number' || !Number.isFinite(raw) || raw <= 0) {\n return DEFAULT_MAX_BYTES;\n }\n return Math.min(Math.floor(raw), HARD_MAX_BYTES);\n}\n\nexport function createReadMediaTool(): AgentTool {\n return {\n name: 'read_media',\n label: 'Read Media Attachment',\n description:\n 'Read an attachment by media:// URI. Use this for xopc-media-uri attachments in user messages.',\n parameters: ReadMediaSchema,\n\n async execute(\n _toolCallId: string,\n params: { uri?: string; maxBytes?: number },\n _signal?: AbortSignal,\n ): Promise<AgentToolResult<Record<string, unknown>>> {\n const uri = typeof params.uri === 'string' ? params.uri.trim() : '';\n if (!uri) {\n return {\n content: [{ type: 'text', text: 'Missing media URI.' }],\n details: { ok: false, error: 'missing_uri' },\n };\n }\n\n try {\n const maxBytes = clampMaxBytes(params.maxBytes);\n const { buffer, path } = await readMediaReference(uri, maxBytes);\n const mimeType = mimeTypeFromMediaPath(path);\n const metadata = {\n ok: true,\n uri,\n mimeType,\n size: buffer.byteLength,\n path,\n };\n\n if (isLikelyText(mimeType)) {\n const text = buffer.toString('utf8');\n return {\n content: [{ type: 'text', text }],\n details: { ...metadata, kind: 'text' },\n };\n }\n\n return {\n content: [\n {\n type: 'text',\n text: JSON.stringify({\n ...metadata,\n kind: 'binary',\n base64: buffer.toString('base64'),\n }, null, 2),\n },\n ],\n details: { ...metadata, kind: 'binary' },\n };\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n return {\n content: [{ type: 'text', text: `Media read error: ${message}` }],\n details: { ok: false, error: message },\n };\n }\n },\n } as AgentTool;\n}\n"],"mappings":";;;;AAMA,MAAM,oBAAoB,OAAO;AACjC,MAAM,iBAAiB,IAAI,OAAO;AAElC,MAAM,kBAAkB,KAAK,OAAO;CAClC,KAAK,KAAK,OAAO,EACf,aAAa,qEACd,CAAC;CACF,UAAU,KAAK,SAAS,KAAK,OAAO,EAClC,aAAa,2CACd,CAAC,CAAC;CACJ,CAAC;AAEF,SAAS,aAAa,UAA2B;AAC/C,QACE,SAAS,WAAW,QAAQ,IAC5B,aAAa,sBACb,aAAa,qBACb,aAAa,4BACb,aAAa;;AAIjB,SAAS,cAAc,KAAsB;AAC3C,KAAI,OAAO,QAAQ,YAAY,CAAC,OAAO,SAAS,IAAI,IAAI,OAAO,EAC7D,QAAO;AAET,QAAO,KAAK,IAAI,KAAK,MAAM,IAAI,EAAE,eAAe;;AAGlD,SAAgB,sBAAiC;AAC/C,QAAO;EACL,MAAM;EACN,OAAO;EACP,aACE;EACF,YAAY;EAEZ,MAAM,QACJ,aACA,QACA,SACmD;GACnD,MAAM,MAAM,OAAO,OAAO,QAAQ,WAAW,OAAO,IAAI,MAAM,GAAG;AACjE,OAAI,CAAC,IACH,QAAO;IACL,SAAS,CAAC;KAAE,MAAM;KAAQ,MAAM;KAAsB,CAAC;IACvD,SAAS;KAAE,IAAI;KAAO,OAAO;KAAe;IAC7C;AAGH,OAAI;IAEF,MAAM,EAAE,QAAQ,SAAS,MAAM,mBAAmB,KADjC,cAAc,OAAO,SACyB,CAAC;IAChE,MAAM,WAAW,sBAAsB,KAAK;IAC5C,MAAM,WAAW;KACf,IAAI;KACJ;KACA;KACA,MAAM,OAAO;KACb;KACD;AAED,QAAI,aAAa,SAAS,CAExB,QAAO;KACL,SAAS,CAAC;MAAE,MAAM;MAAQ,MAFf,OAAO,SAAS,OAEG;MAAE,CAAC;KACjC,SAAS;MAAE,GAAG;MAAU,MAAM;MAAQ;KACvC;AAGH,WAAO;KACL,SAAS,CACP;MACE,MAAM;MACN,MAAM,KAAK,UAAU;OACnB,GAAG;OACH,MAAM;OACN,QAAQ,OAAO,SAAS,SAAS;OAClC,EAAE,MAAM,EAAE;MACZ,CACF;KACD,SAAS;MAAE,GAAG;MAAU,MAAM;MAAU;KACzC;YACM,KAAK;IACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAChE,WAAO;KACL,SAAS,CAAC;MAAE,MAAM;MAAQ,MAAM,qBAAqB;MAAW,CAAC;KACjE,SAAS;MAAE,IAAI;MAAO,OAAO;MAAS;KACvC;;;EAGN"}
@@ -1,7 +1,7 @@
1
1
  import { checkFileSafety } from "../prompt/safety.js";
2
2
  import { resolvePathUnderWorkspace } from "./tool-paths.js";
3
- import { readFile } from "fs/promises";
4
3
  import { basename } from "node:path";
4
+ import { readFile } from "fs/promises";
5
5
  import { Type } from "@sinclair/typebox";
6
6
  //#region src/agent/tools/send-media.ts
7
7
  const SendMediaSchema = Type.Object({
@@ -2,9 +2,9 @@ import { resolveStateDir } from "../../config/paths-state.js";
2
2
  import { init_paths } from "../../config/paths.js";
3
3
  import { createSkillConfigManager } from "../skills/config.js";
4
4
  import { applyPatchToContent, atomicWriteUtf8, effectiveAgentWritePolicy, ensureCategorySegment, isPathInsideDir, maxSkillMdChars, maxSupportFileBytes, mutatableSkillOrNull, resolveCreateSkillDir, scanSkillDirOrError, validateSkillMdContent, validateSkillNameSegment, validateSupportingRelativePath } from "../skills/skill-manage-ops.js";
5
- import { readFile, rm } from "fs/promises";
6
5
  import { join } from "path";
7
6
  import { existsSync, rmSync } from "fs";
7
+ import { readFile, rm } from "fs/promises";
8
8
  import { Type } from "@sinclair/typebox";
9
9
  //#region src/agent/tools/skill-manage-tool.ts
10
10
  init_paths();
@@ -1,6 +1,6 @@
1
+ import { extractProfileAgentId } from "../../config/agent-profile.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { extractProfileAgentId } from "../../config/agent-profile.js";
4
4
  import { parseWorkflowScript } from "../workflow/parser.js";
5
5
  import "../workflow/index.js";
6
6
  import { Type } from "@sinclair/typebox";
@@ -1,8 +1,8 @@
1
1
  import { checkFileSafety } from "../prompt/safety.js";
2
2
  import { isBareProfileMarkdownFileName, resolvePathUnderWorkspace, resolveProfileMarkdownPathIfBareName } from "./tool-paths.js";
3
3
  import { evaluateFilePolicy } from "../sandbox/exec-policy.js";
4
- import { mkdir, writeFile } from "fs/promises";
5
4
  import { dirname } from "path";
5
+ import { mkdir, writeFile } from "fs/promises";
6
6
  import { Type } from "@sinclair/typebox";
7
7
  //#region src/agent/tools/write.ts
8
8
  const MAX_FILE_SIZE = 10 * 1024 * 1024;
@@ -1,8 +1,8 @@
1
1
  import { init_paths_state, resolveStateDir } from "../../config/paths-state.js";
2
2
  import { BUILTIN_WORKFLOWS } from "./builtins/index.js";
3
3
  import { parseWorkflowScript } from "./parser.js";
4
- import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync } from "node:fs";
5
4
  import { join } from "node:path";
5
+ import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync, writeFileSync } from "node:fs";
6
6
  //#region src/agent/workflow/catalog.ts
7
7
  /**
8
8
  * Catalog for named workflows.
@@ -1,11 +1,11 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
3
2
  import { createLogger } from "../utils/logger/index.js";
4
3
  import { init_logger } from "../utils/logger.js";
5
- import { getApiKeyFromEnv, init_env_keys } from "../providers/env-keys.js";
6
4
  import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
7
- import { mkdir, readFile, rm } from "fs/promises";
5
+ import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
6
+ import { getApiKeyFromEnv, init_env_keys } from "../providers/env-keys.js";
8
7
  import { dirname, join } from "path";
8
+ import { mkdir, readFile, rm } from "fs/promises";
9
9
  //#region src/auth/credentials.ts
10
10
  function getCredentialResolver(options) {
11
11
  return new CredentialResolver(options);
@@ -1,6 +1,6 @@
1
1
  import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
- import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
3
2
  import path from "node:path";
3
+ import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
4
4
  import { homedir } from "os";
5
5
  //#region src/auth/profiles/store.ts
6
6
  /**
@@ -1,7 +1,7 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
+ import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
2
3
  import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveOAuthPath } from "../config/paths.js";
3
4
  import { init_loader, loadConfig } from "../config/loader.js";
4
- import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
5
5
  import { existsSync, readFileSync } from "node:fs";
6
6
  //#region src/auth/sync-provider-auth.ts
7
7
  /**
@@ -1,6 +1,6 @@
1
1
  import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
2
- import { isAbsolute, relative, resolve, sep } from "node:path";
3
2
  import { homedir } from "node:os";
3
+ import { isAbsolute, relative, resolve, sep } from "node:path";
4
4
  //#region src/browser/cache-dir-policy.ts
5
5
  function expandHome(input) {
6
6
  if (input === "~") return homedir();
@@ -2,10 +2,10 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { loadPlaywrightCoreModule } from "./providers/playwright-doctor.js";
4
4
  import { pickFreePort } from "./free-port.js";
5
+ import { homedir, platform } from "node:os";
6
+ import { join } from "node:path";
5
7
  import { existsSync } from "node:fs";
6
8
  import { mkdir, rm } from "node:fs/promises";
7
- import { join } from "node:path";
8
- import { homedir, platform } from "node:os";
9
9
  import { spawn } from "node:child_process";
10
10
  //#region src/browser/cdp-local-launcher.ts
11
11
  /**
@@ -1,13 +1,13 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../../package-version.js";
2
- import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
2
+ import { assertCacheDir, init_cache_dir_policy } from "../cache-dir-policy.js";
3
3
  import { createLogger } from "../../utils/logger/index.js";
4
4
  import { init_logger } from "../../utils/logger.js";
5
5
  import { init_paths, resolveBinDir } from "../../config/paths.js";
6
- import { assertCacheDir, init_cache_dir_policy } from "../cache-dir-policy.js";
6
+ import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
7
7
  import { resolvePackageRoot } from "../../infra/update-check.js";
8
+ import { dirname, join } from "node:path";
8
9
  import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
9
10
  import { readFile, readdir, rm } from "node:fs/promises";
10
- import { dirname, join } from "node:path";
11
11
  import { fileURLToPath } from "node:url";
12
12
  import { spawn } from "node:child_process";
13
13
  //#region src/browser/providers/browser-ext-install.ts
@@ -1,15 +1,15 @@
1
+ import { assertCacheDir, expandHome, init_cache_dir_policy } from "../cache-dir-policy.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
4
  import { init_paths, resolveBinDir } from "../../config/paths.js";
4
- import { assertCacheDir, expandHome, init_cache_dir_policy } from "../cache-dir-policy.js";
5
5
  import { loadPlaywrightCoreModule } from "./playwright-doctor.js";
6
6
  import { WEBDRIVER_OVERRIDE_SCRIPT, buildStealthArgs, filterCloakBrowserExtraArgs, generateFingerprintSeed, makeExecutable, removeQuarantineAttr } from "../stealth.js";
7
7
  import { pickFreePort } from "../free-port.js";
8
- import { createHash } from "node:crypto";
8
+ import { arch, platform, tmpdir } from "node:os";
9
+ import { join, resolve } from "node:path";
9
10
  import { createReadStream, createWriteStream } from "node:fs";
11
+ import { createHash } from "node:crypto";
10
12
  import { mkdir, mkdtemp, rm, stat } from "node:fs/promises";
11
- import { join, resolve } from "node:path";
12
- import { arch, platform, tmpdir } from "node:os";
13
13
  import { spawn } from "node:child_process";
14
14
  import { Readable, Transform } from "node:stream";
15
15
  import AdmZip from "adm-zip";
@@ -1,7 +1,7 @@
1
1
  import { createRequire } from "node:module";
2
+ import { dirname, join } from "node:path";
2
3
  import { existsSync } from "node:fs";
3
4
  import { stat } from "node:fs/promises";
4
- import { dirname, join } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  //#region src/browser/providers/playwright-doctor.ts
7
7
  /** Root directory of the `playwright-core` package (Electron extraResources or node_modules). */
@@ -1,7 +1,7 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { chmod, stat } from "node:fs/promises";
4
3
  import { platform } from "node:os";
4
+ import { chmod, stat } from "node:fs/promises";
5
5
  import { exec } from "node:child_process";
6
6
  import { promisify } from "node:util";
7
7
  //#region src/browser/stealth.ts
@@ -0,0 +1,8 @@
1
+ export declare function isImageInboundAttachment(att: {
2
+ type?: string;
3
+ mimeType?: string;
4
+ }): boolean;
5
+ export declare function isVoiceInboundAttachment(att: {
6
+ type?: string;
7
+ mimeType?: string;
8
+ }): boolean;
@@ -0,0 +1,11 @@
1
+ //#region src/channels/attachments/attachment-classifiers.ts
2
+ function isImageInboundAttachment(att) {
3
+ return att.type === "image" || att.type === "photo" || att.mimeType?.startsWith("image/") === true;
4
+ }
5
+ function isVoiceInboundAttachment(att) {
6
+ return att.type === "voice" || att.type === "audio" || att.mimeType?.startsWith("audio/") === true;
7
+ }
8
+ //#endregion
9
+ export { isImageInboundAttachment, isVoiceInboundAttachment };
10
+
11
+ //# sourceMappingURL=attachment-classifiers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attachment-classifiers.js","names":[],"sources":["../../../../src/channels/attachments/attachment-classifiers.ts"],"sourcesContent":["export function isImageInboundAttachment(att: {\n type?: string;\n mimeType?: string;\n}): boolean {\n return (\n att.type === 'image' ||\n att.type === 'photo' ||\n att.mimeType?.startsWith('image/') === true\n );\n}\n\nexport function isVoiceInboundAttachment(att: { type?: string; mimeType?: string }): boolean {\n return (\n att.type === 'voice' ||\n att.type === 'audio' ||\n att.mimeType?.startsWith('audio/') === true\n );\n}\n"],"mappings":";AAAA,SAAgB,yBAAyB,KAG7B;AACV,QACE,IAAI,SAAS,WACb,IAAI,SAAS,WACb,IAAI,UAAU,WAAW,SAAS,KAAK;;AAI3C,SAAgB,yBAAyB,KAAoD;AAC3F,QACE,IAAI,SAAS,WACb,IAAI,SAAS,WACb,IAAI,UAAU,WAAW,SAAS,KAAK"}