@xopcai/xopc 0.0.6 → 0.0.8

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 (291) hide show
  1. package/dist/extensions/telegram/src/plugin.js +1 -1
  2. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  3. package/dist/extensions/weixin/src/api/api.js +1 -1
  4. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  5. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  6. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  7. package/dist/extensions/weixin/src/plugin.js +1 -1
  8. package/dist/gateway/static/root/assets/{agents-B6s2BvpH.js → agents-BSNzJWbQ.js} +2 -2
  9. package/dist/gateway/static/root/assets/{agents-B6s2BvpH.js.map → agents-BSNzJWbQ.js.map} +1 -1
  10. package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js → apps-page-BKk9SB4D.js} +2 -2
  11. package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js.map → apps-page-BKk9SB4D.js.map} +1 -1
  12. package/dist/gateway/static/root/assets/attachment-load-DXcJLSWT.js +1 -0
  13. package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js → channels-settings-_J6cQN6G.js} +2 -2
  14. package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js.map → channels-settings-_J6cQN6G.js.map} +1 -1
  15. package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js → chat-agents-api-DPb_0O8M.js} +2 -2
  16. package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js.map → chat-agents-api-DPb_0O8M.js.map} +1 -1
  17. package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js → cron-page-BUJOuuKX.js} +2 -2
  18. package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js.map → cron-page-BUJOuuKX.js.map} +1 -1
  19. package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js → cron-utils-Cn0YVg8x.js} +2 -2
  20. package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js.map → cron-utils-Cn0YVg8x.js.map} +1 -1
  21. package/dist/gateway/static/root/assets/electron-env-D9bm1FIu.js +2 -0
  22. package/dist/gateway/static/root/assets/electron-env-D9bm1FIu.js.map +1 -0
  23. package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js → extension-debug-page-DTz4O5Ua.js} +2 -2
  24. package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js.map → extension-debug-page-DTz4O5Ua.js.map} +1 -1
  25. package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js → extension-iframe-host-Cs1Kde9o.js} +2 -2
  26. package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js.map → extension-iframe-host-Cs1Kde9o.js.map} +1 -1
  27. package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js → extension-page-G52iX0Bo.js} +2 -2
  28. package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js.map → extension-page-G52iX0Bo.js.map} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js → extension-provider-CO2jxBA9.js} +2 -2
  30. package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js.map → extension-provider-CO2jxBA9.js.map} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js → extension-settings-page-D9Ul8uSt.js} +2 -2
  32. package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js.map → extension-settings-page-D9Ul8uSt.js.map} +1 -1
  33. package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js → gateway-config-swr-Bc8SVD15.js} +2 -2
  34. package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js.map → gateway-config-swr-Bc8SVD15.js.map} +1 -1
  35. package/dist/gateway/static/root/assets/index-BXUJbteW.js +16 -0
  36. package/dist/gateway/static/root/assets/index-BXUJbteW.js.map +1 -0
  37. package/dist/gateway/static/root/assets/index-CQLMxWSA.css +2 -0
  38. package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js → logs-page-5V25JkQY.js} +2 -2
  39. package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js.map → logs-page-5V25JkQY.js.map} +1 -1
  40. package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js → model-selector-he3aQfme.js} +2 -2
  41. package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js.map → model-selector-he3aQfme.js.map} +1 -1
  42. package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js +2 -0
  43. package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js.map +1 -0
  44. package/dist/gateway/static/root/assets/page-header-store-DJHD9Ean.js +2 -0
  45. package/dist/gateway/static/root/assets/{page-header-store-HcRZK5CZ.js.map → page-header-store-DJHD9Ean.js.map} +1 -1
  46. package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js → session-api-n-4O5d9U.js} +2 -2
  47. package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js.map → session-api-n-4O5d9U.js.map} +1 -1
  48. package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js → session-working-directory-control-B6dHLvbr.js} +3 -3
  49. package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js.map → session-working-directory-control-B6dHLvbr.js.map} +1 -1
  50. package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js → sessions-page-rBUfTdm3.js} +2 -2
  51. package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js.map → sessions-page-rBUfTdm3.js.map} +1 -1
  52. package/dist/gateway/static/root/assets/settings-page-B3QrJm-E.js +2 -0
  53. package/dist/gateway/static/root/assets/settings-page-B3QrJm-E.js.map +1 -0
  54. package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js → skill-api-vxtE8kI6.js} +2 -2
  55. package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js.map → skill-api-vxtE8kI6.js.map} +1 -1
  56. package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js → skills-page-D36_O2Ub.js} +2 -2
  57. package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js.map → skills-page-D36_O2Ub.js.map} +1 -1
  58. package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js → theme-store-CmiSsYBd.js} +2 -2
  59. package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js.map → theme-store-CmiSsYBd.js.map} +1 -1
  60. package/dist/gateway/static/root/assets/url-CtSqjF9J.js +2 -0
  61. package/dist/gateway/static/root/assets/url-CtSqjF9J.js.map +1 -0
  62. package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js → useTranslation-DYORQ7x6.js} +2 -2
  63. package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js.map → useTranslation-DYORQ7x6.js.map} +1 -1
  64. package/dist/gateway/static/root/index.html +16 -16
  65. package/dist/package.js +1 -1
  66. package/dist/src/agent/agent-manager.js +4 -4
  67. package/dist/src/agent/context/workspace-seed.js +2 -2
  68. package/dist/src/agent/image/index.d.ts +0 -1
  69. package/dist/src/agent/image/index.js +1 -2
  70. package/dist/src/agent/ipc/bus.js +1 -1
  71. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  72. package/dist/src/agent/models/manager.js +1 -1
  73. package/dist/src/agent/prompt/service-prompt-builder.js +1 -1
  74. package/dist/src/agent/service.js +3 -3
  75. package/dist/src/agent/skills/hub-hash.js +1 -1
  76. package/dist/src/agent/skills/hub-pull.js +1 -1
  77. package/dist/src/agent/skills/index.js +1 -1
  78. package/dist/src/agent/skills/skill-manager.js +1 -1
  79. package/dist/src/agent/tools/browser/tools.js +2 -2
  80. package/dist/src/agent/tools/browser/tools.js.map +1 -1
  81. package/dist/src/agent/tools/factory.js +1 -1
  82. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  83. package/dist/src/agent/tools/image-tool.js +2 -2
  84. package/dist/src/agent/tools/image-tool.js.map +1 -1
  85. package/dist/src/agent/tools/index.d.ts +1 -1
  86. package/dist/src/agent/tools/index.js +2 -2
  87. package/dist/src/agent/tools/read.d.ts +0 -2
  88. package/dist/src/agent/tools/read.js +1 -3
  89. package/dist/src/agent/tools/read.js.map +1 -1
  90. package/dist/src/agent/tools/send-media.js +1 -1
  91. package/dist/src/auth/sync-provider-auth.js +1 -1
  92. package/dist/src/channels/plugin-types.d.ts +14 -0
  93. package/dist/src/cli/commands/agent.js +1 -1
  94. package/dist/src/cli/commands/doctor/checks/channel-config.d.ts +2 -0
  95. package/dist/src/cli/commands/doctor/checks/channel-config.js +113 -0
  96. package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -0
  97. package/dist/src/cli/commands/doctor/checks/channel-plugins.d.ts +2 -0
  98. package/dist/src/cli/commands/doctor/checks/channel-plugins.js +47 -0
  99. package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -0
  100. package/dist/src/cli/commands/doctor/checks/config-health.d.ts +2 -0
  101. package/dist/src/cli/commands/doctor/checks/config-health.js +82 -0
  102. package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -0
  103. package/dist/src/cli/commands/doctor/checks/cron-health.d.ts +2 -0
  104. package/dist/src/cli/commands/doctor/checks/cron-health.js +116 -0
  105. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -0
  106. package/dist/src/cli/commands/doctor/checks/gateway-health.d.ts +2 -0
  107. package/dist/src/cli/commands/doctor/checks/gateway-health.js +64 -0
  108. package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -0
  109. package/dist/src/cli/commands/doctor/checks/gateway-service.d.ts +2 -0
  110. package/dist/src/cli/commands/doctor/checks/gateway-service.js +64 -0
  111. package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -0
  112. package/dist/src/cli/commands/doctor/checks/node-version.d.ts +2 -0
  113. package/dist/src/cli/commands/doctor/checks/node-version.js +33 -0
  114. package/dist/src/cli/commands/doctor/checks/node-version.js.map +1 -0
  115. package/dist/src/cli/commands/doctor/checks/provider-auth.d.ts +2 -0
  116. package/dist/src/cli/commands/doctor/checks/provider-auth.js +91 -0
  117. package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -0
  118. package/dist/src/cli/commands/doctor/checks/security-audit.d.ts +2 -0
  119. package/dist/src/cli/commands/doctor/checks/security-audit.js +85 -0
  120. package/dist/src/cli/commands/doctor/checks/security-audit.js.map +1 -0
  121. package/dist/src/cli/commands/doctor/checks/session-integrity.d.ts +2 -0
  122. package/dist/src/cli/commands/doctor/checks/session-integrity.js +118 -0
  123. package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -0
  124. package/dist/src/cli/commands/doctor/checks/state-integrity.d.ts +2 -0
  125. package/dist/src/cli/commands/doctor/checks/state-integrity.js +99 -0
  126. package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -0
  127. package/dist/src/cli/commands/doctor/checks/version-check.d.ts +2 -0
  128. package/dist/src/cli/commands/doctor/checks/version-check.js +71 -0
  129. package/dist/src/cli/commands/doctor/checks/version-check.js.map +1 -0
  130. package/dist/src/cli/commands/doctor/checks/workspace-status.d.ts +2 -0
  131. package/dist/src/cli/commands/doctor/checks/workspace-status.js +73 -0
  132. package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -0
  133. package/dist/src/cli/commands/doctor/flow.d.ts +9 -0
  134. package/dist/src/cli/commands/doctor/flow.js +51 -0
  135. package/dist/src/cli/commands/doctor/flow.js.map +1 -0
  136. package/dist/src/cli/commands/doctor/format.d.ts +6 -0
  137. package/dist/src/cli/commands/doctor/format.js +61 -0
  138. package/dist/src/cli/commands/doctor/format.js.map +1 -0
  139. package/dist/src/cli/commands/doctor/index.js +44 -0
  140. package/dist/src/cli/commands/doctor/index.js.map +1 -0
  141. package/dist/src/cli/commands/doctor/types.d.ts +20 -0
  142. package/dist/src/cli/commands/doctor/types.js +1 -0
  143. package/dist/src/cli/commands/init.js +2 -2
  144. package/dist/src/cli/index.d.ts +1 -1
  145. package/dist/src/cli/index.js +1 -1
  146. package/dist/src/cli/index.js.map +1 -1
  147. package/dist/src/cli/utils/init-workspace.js +1 -1
  148. package/dist/src/config/index.js +3 -3
  149. package/dist/src/config/loader.js +1 -1
  150. package/dist/src/config/models-json.d.ts +15 -15
  151. package/dist/src/config/models-json.js +1 -1
  152. package/dist/src/config/profile.js +1 -1
  153. package/dist/src/config/schema.d.ts +0 -105
  154. package/dist/src/config/schema.js +3 -40
  155. package/dist/src/config/schema.js.map +1 -1
  156. package/dist/src/cron/executor.js +2 -2
  157. package/dist/src/daemon/launchd.js +2 -2
  158. package/dist/src/daemon/launchd.js.map +1 -1
  159. package/dist/src/daemon/systemd.js +2 -2
  160. package/dist/src/daemon/systemd.js.map +1 -1
  161. package/dist/src/extensions/loader.js +1 -1
  162. package/dist/src/gateway/agents-admin.js +1 -1
  163. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  164. package/dist/src/gateway/hono/routes/doctor.d.ts +3 -0
  165. package/dist/src/gateway/hono/routes/doctor.js +35 -0
  166. package/dist/src/gateway/hono/routes/doctor.js.map +1 -0
  167. package/dist/src/gateway/hono/routes/index.js +2 -0
  168. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  169. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  170. package/dist/src/gateway/hono/sse.js +2 -2
  171. package/dist/src/gateway/lock.js +1 -1
  172. package/dist/src/gateway/ports.js +98 -3
  173. package/dist/src/gateway/ports.js.map +1 -1
  174. package/dist/src/gateway/service.d.ts +0 -4
  175. package/dist/src/gateway/service.js +4 -23
  176. package/dist/src/gateway/service.js.map +1 -1
  177. package/dist/src/routing/bindings.js +1 -1
  178. package/dist/src/routing/index.d.ts +1 -1
  179. package/dist/src/routing/index.js +2 -2
  180. package/dist/src/routing/index.js.map +1 -1
  181. package/dist/src/routing/resolve-route.js +1 -1
  182. package/dist/src/routing/session-key.d.ts +0 -5
  183. package/dist/src/routing/session-key.js +1 -27
  184. package/dist/src/routing/session-key.js.map +1 -1
  185. package/dist/src/session/session-title.js +1 -1
  186. package/dist/src/session/store.js +2 -6
  187. package/dist/src/session/store.js.map +1 -1
  188. package/dist/src/session/types.d.ts +0 -10
  189. package/dist/src/session/types.js.map +1 -1
  190. package/package.json +1 -2
  191. package/dist/gateway/static/root/assets/attachment-load-6pRlDPZ8.js +0 -1
  192. package/dist/gateway/static/root/assets/index-DBZ5eXW5.js +0 -16
  193. package/dist/gateway/static/root/assets/index-DBZ5eXW5.js.map +0 -1
  194. package/dist/gateway/static/root/assets/index-KsVMH-Jo.css +0 -2
  195. package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js +0 -2
  196. package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js.map +0 -1
  197. package/dist/gateway/static/root/assets/page-header-store-HcRZK5CZ.js +0 -2
  198. package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js +0 -2
  199. package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js.map +0 -1
  200. package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js +0 -2
  201. package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js.map +0 -1
  202. package/dist/gateway/static/root/assets/url-QmwQTJ-j.js +0 -2
  203. package/dist/gateway/static/root/assets/url-QmwQTJ-j.js.map +0 -1
  204. package/dist/src/acp/commands.d.ts +0 -11
  205. package/dist/src/acp/commands.js +0 -17
  206. package/dist/src/acp/commands.js.map +0 -1
  207. package/dist/src/acp/control-plane/identity-reconcile.d.ts +0 -36
  208. package/dist/src/acp/control-plane/identity-reconcile.js +0 -124
  209. package/dist/src/acp/control-plane/identity-reconcile.js.map +0 -1
  210. package/dist/src/acp/control-plane/index.d.ts +0 -10
  211. package/dist/src/acp/control-plane/index.js +0 -6
  212. package/dist/src/acp/control-plane/manager.d.ts +0 -86
  213. package/dist/src/acp/control-plane/manager.js +0 -502
  214. package/dist/src/acp/control-plane/manager.js.map +0 -1
  215. package/dist/src/acp/control-plane/manager.types.d.ts +0 -125
  216. package/dist/src/acp/control-plane/manager.types.js +0 -14
  217. package/dist/src/acp/control-plane/manager.types.js.map +0 -1
  218. package/dist/src/acp/control-plane/manager.utils.d.ts +0 -29
  219. package/dist/src/acp/control-plane/manager.utils.js +0 -46
  220. package/dist/src/acp/control-plane/manager.utils.js.map +0 -1
  221. package/dist/src/acp/control-plane/runtime-cache-manager.d.ts +0 -49
  222. package/dist/src/acp/control-plane/runtime-cache-manager.js +0 -155
  223. package/dist/src/acp/control-plane/runtime-cache-manager.js.map +0 -1
  224. package/dist/src/acp/control-plane/runtime-cache.d.ts +0 -45
  225. package/dist/src/acp/control-plane/runtime-cache.js +0 -58
  226. package/dist/src/acp/control-plane/runtime-cache.js.map +0 -1
  227. package/dist/src/acp/control-plane/runtime-options.d.ts +0 -30
  228. package/dist/src/acp/control-plane/runtime-options.js +0 -92
  229. package/dist/src/acp/control-plane/runtime-options.js.map +0 -1
  230. package/dist/src/acp/control-plane/session-actor-queue.d.ts +0 -22
  231. package/dist/src/acp/control-plane/session-actor-queue.js +0 -70
  232. package/dist/src/acp/control-plane/session-actor-queue.js.map +0 -1
  233. package/dist/src/acp/control-plane/session-lifecycle-manager.d.ts +0 -59
  234. package/dist/src/acp/control-plane/session-lifecycle-manager.js +0 -209
  235. package/dist/src/acp/control-plane/session-lifecycle-manager.js.map +0 -1
  236. package/dist/src/acp/control-plane/session-store.d.ts +0 -39
  237. package/dist/src/acp/control-plane/session-store.js +0 -149
  238. package/dist/src/acp/control-plane/session-store.js.map +0 -1
  239. package/dist/src/acp/control-plane/turn-manager.d.ts +0 -40
  240. package/dist/src/acp/control-plane/turn-manager.js +0 -134
  241. package/dist/src/acp/control-plane/turn-manager.js.map +0 -1
  242. package/dist/src/acp/event-mapper.d.ts +0 -48
  243. package/dist/src/acp/event-mapper.js +0 -94
  244. package/dist/src/acp/event-mapper.js.map +0 -1
  245. package/dist/src/acp/index.d.ts +0 -10
  246. package/dist/src/acp/index.js +0 -5
  247. package/dist/src/acp/meta.d.ts +0 -15
  248. package/dist/src/acp/meta.js +0 -36
  249. package/dist/src/acp/meta.js.map +0 -1
  250. package/dist/src/acp/routing-integration.d.ts +0 -37
  251. package/dist/src/acp/routing-integration.js +0 -58
  252. package/dist/src/acp/routing-integration.js.map +0 -1
  253. package/dist/src/acp/runtime/backends/index.d.ts +0 -4
  254. package/dist/src/acp/runtime/backends/index.js +0 -2
  255. package/dist/src/acp/runtime/backends/local.d.ts +0 -136
  256. package/dist/src/acp/runtime/backends/local.js +0 -603
  257. package/dist/src/acp/runtime/backends/local.js.map +0 -1
  258. package/dist/src/acp/runtime/error-text.d.ts +0 -16
  259. package/dist/src/acp/runtime/error-text.js +0 -40
  260. package/dist/src/acp/runtime/error-text.js.map +0 -1
  261. package/dist/src/acp/runtime/errors.d.ts +0 -31
  262. package/dist/src/acp/runtime/errors.js +0 -47
  263. package/dist/src/acp/runtime/errors.js.map +0 -1
  264. package/dist/src/acp/runtime/index.d.ts +0 -7
  265. package/dist/src/acp/runtime/index.js +0 -4
  266. package/dist/src/acp/runtime/registry.d.ts +0 -35
  267. package/dist/src/acp/runtime/registry.js +0 -85
  268. package/dist/src/acp/runtime/registry.js.map +0 -1
  269. package/dist/src/acp/runtime/session-identity.d.ts +0 -35
  270. package/dist/src/acp/runtime/session-identity.js +0 -134
  271. package/dist/src/acp/runtime/session-identity.js.map +0 -1
  272. package/dist/src/acp/runtime/types.d.ts +0 -214
  273. package/dist/src/acp/secret-file.d.ts +0 -7
  274. package/dist/src/acp/secret-file.js +0 -19
  275. package/dist/src/acp/secret-file.js.map +0 -1
  276. package/dist/src/acp/server.d.ts +0 -48
  277. package/dist/src/acp/server.js +0 -300
  278. package/dist/src/acp/server.js.map +0 -1
  279. package/dist/src/acp/session.d.ts +0 -29
  280. package/dist/src/acp/session.js +0 -30
  281. package/dist/src/acp/session.js.map +0 -1
  282. package/dist/src/acp/types.d.ts +0 -39
  283. package/dist/src/acp/types.js +0 -13
  284. package/dist/src/acp/types.js.map +0 -1
  285. package/dist/src/agent/image/describe-images.d.ts +0 -18
  286. package/dist/src/agent/image/describe-images.js +0 -19
  287. package/dist/src/agent/image/describe-images.js.map +0 -1
  288. package/dist/src/cli/commands/acp.d.ts +0 -4
  289. package/dist/src/cli/commands/acp.js +0 -200
  290. package/dist/src/cli/commands/acp.js.map +0 -1
  291. /package/dist/src/{acp/runtime/types.js → cli/commands/doctor/index.d.ts} +0 -0
@@ -1,2 +1,2 @@
1
- import{i as e}from"./rolldown-runtime-B1FJdls4.js";import{i as t}from"./vendor-react-QAsRxa6t.js";import{m as n,p as r}from"./url-QmwQTJ-j.js";import{o as i}from"./vendor-swr-8rdcElid.js";var a=e(t()),o=(e,t,n,r)=>{let i=[n,{code:t,...r||{}}];if(e?.services?.logger?.forward)return e.services.logger.forward(i,`warn`,`react-i18next::`,!0);p(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),e?.services?.logger?.warn?e.services.logger.warn(...i):console?.warn&&console.warn(...i)},s={},c=(e,t,n,r)=>{p(n)&&s[n]||(p(n)&&(s[n]=new Date),o(e,t,n,r))},l=(e,t)=>()=>{if(e.isInitialized)t();else{let n=()=>{setTimeout(()=>{e.off(`initialized`,n)},0),t()};e.on(`initialized`,n)}},u=(e,t,n)=>{e.loadNamespaces(t,l(e,n))},d=(e,t,n,r)=>{if(p(n)&&(n=[n]),e.options.preload&&e.options.preload.indexOf(t)>-1)return u(e,n,r);n.forEach(t=>{e.options.ns.indexOf(t)<0&&e.options.ns.push(t)}),e.loadLanguages(t,l(e,r))},f=(e,t,n={})=>!t.languages||!t.languages.length?(c(t,`NO_LANGUAGES`,`i18n.languages were undefined or empty`,{languages:t.languages}),!0):t.hasLoadedNamespace(e,{lng:n.lng,precheck:(t,r)=>{if(n.bindI18n&&n.bindI18n.indexOf(`languageChanging`)>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!r(t.isLanguageChangingTo,e))return!1}}),p=e=>typeof e==`string`,m=e=>typeof e==`object`&&!!e,h=(0,a.createContext)(),g=class{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(e=>{this.usedNamespaces[e]||(this.usedNamespaces[e]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}},_=i(),v={t:(e,t)=>{if(p(t))return t;if(m(t)&&p(t.defaultValue))return t.defaultValue;if(typeof e==`function`)return``;if(Array.isArray(e)){let t=e[e.length-1];return typeof t==`function`?``:t}return e},ready:!1},y=()=>()=>{},b=(e,t={})=>{let{i18n:i}=t,{i18n:o,defaultNS:s}=(0,a.useContext)(h)||{},l=i||o||r();l&&!l.reportNamespaces&&(l.reportNamespaces=new g),l||c(l,`NO_I18NEXT_INSTANCE`,`useTranslation: You will need to pass in an i18next instance by using initReactI18next`);let m=(0,a.useMemo)(()=>({...n(),...l?.options?.react,...t}),[l,t]),{useSuspense:b,keyPrefix:x}=m,S=e||s||l?.options?.defaultNS,C=p(S)?[S]:S||[`translation`],w=(0,a.useMemo)(()=>C,C);l?.reportNamespaces?.addUsedNamespaces?.(w);let T=(0,a.useRef)(0),E=(0,a.useCallback)(e=>{if(!l)return y;let{bindI18n:t,bindI18nStore:n}=m,r=()=>{T.current+=1,e()};return t&&l.on(t,r),n&&l.store.on(n,r),()=>{t&&t.split(` `).forEach(e=>l.off(e,r)),n&&n.split(` `).forEach(e=>l.store.off(e,r))}},[l,m]),D=(0,a.useRef)(),O=(0,a.useCallback)(()=>{if(!l)return v;let e=!!(l.isInitialized||l.initializedStoreOnce)&&w.every(e=>f(e,l,m)),n=t.lng||l.language,r=T.current,i=D.current;if(i&&i.ready===e&&i.lng===n&&i.keyPrefix===x&&i.revision===r)return i;let a={t:l.getFixedT(n,m.nsMode===`fallback`?w:w[0],x),ready:e,lng:n,keyPrefix:x,revision:r};return D.current=a,a},[l,w,x,m,t.lng]),[k,A]=(0,a.useState)(0),{t:j,ready:M}=(0,_.useSyncExternalStore)(E,O,O);(0,a.useEffect)(()=>{if(l&&!M&&!b){let e=()=>A(e=>e+1);t.lng?d(l,t.lng,w,e):u(l,w,e)}},[l,t.lng,w,M,b,k]);let N=l||{},P=(0,a.useRef)(null),F=(0,a.useRef)(),I=e=>{let t=Object.getOwnPropertyDescriptors(e);t.__original&&delete t.__original;let n=Object.create(Object.getPrototypeOf(e),t);if(!Object.prototype.hasOwnProperty.call(n,`__original`))try{Object.defineProperty(n,`__original`,{value:e,writable:!1,enumerable:!1,configurable:!1})}catch{}return n},L=(0,a.useMemo)(()=>{let e=N,t=e?.language,n=e;e&&(P.current&&P.current.__original===e&&F.current===t?n=P.current:(n=I(e),P.current=n,F.current=t));let r=!M&&!b?(...e)=>(c(l,`USE_T_BEFORE_READY`,`useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.`),j(...e)):j,i=[r,n,M];return i.t=r,i.i18n=n,i.ready=M,i},[j,N,M,N.resolvedLanguage,N.language,N.languages]);if(l&&b&&!M)throw new Promise(e=>{let n=()=>e();t.lng?d(l,t.lng,w,n):u(l,w,n)});return L};export{h as n,b as t};
2
- //# sourceMappingURL=useTranslation-BEUWOMuh.js.map
1
+ import{i as e}from"./rolldown-runtime-B1FJdls4.js";import{i as t}from"./vendor-react-QAsRxa6t.js";import{m as n,p as r}from"./url-CtSqjF9J.js";import{o as i}from"./vendor-swr-8rdcElid.js";var a=e(t()),o=(e,t,n,r)=>{let i=[n,{code:t,...r||{}}];if(e?.services?.logger?.forward)return e.services.logger.forward(i,`warn`,`react-i18next::`,!0);p(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),e?.services?.logger?.warn?e.services.logger.warn(...i):console?.warn&&console.warn(...i)},s={},c=(e,t,n,r)=>{p(n)&&s[n]||(p(n)&&(s[n]=new Date),o(e,t,n,r))},l=(e,t)=>()=>{if(e.isInitialized)t();else{let n=()=>{setTimeout(()=>{e.off(`initialized`,n)},0),t()};e.on(`initialized`,n)}},u=(e,t,n)=>{e.loadNamespaces(t,l(e,n))},d=(e,t,n,r)=>{if(p(n)&&(n=[n]),e.options.preload&&e.options.preload.indexOf(t)>-1)return u(e,n,r);n.forEach(t=>{e.options.ns.indexOf(t)<0&&e.options.ns.push(t)}),e.loadLanguages(t,l(e,r))},f=(e,t,n={})=>!t.languages||!t.languages.length?(c(t,`NO_LANGUAGES`,`i18n.languages were undefined or empty`,{languages:t.languages}),!0):t.hasLoadedNamespace(e,{lng:n.lng,precheck:(t,r)=>{if(n.bindI18n&&n.bindI18n.indexOf(`languageChanging`)>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!r(t.isLanguageChangingTo,e))return!1}}),p=e=>typeof e==`string`,m=e=>typeof e==`object`&&!!e,h=(0,a.createContext)(),g=class{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(e=>{this.usedNamespaces[e]||(this.usedNamespaces[e]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}},_=i(),v={t:(e,t)=>{if(p(t))return t;if(m(t)&&p(t.defaultValue))return t.defaultValue;if(typeof e==`function`)return``;if(Array.isArray(e)){let t=e[e.length-1];return typeof t==`function`?``:t}return e},ready:!1},y=()=>()=>{},b=(e,t={})=>{let{i18n:i}=t,{i18n:o,defaultNS:s}=(0,a.useContext)(h)||{},l=i||o||r();l&&!l.reportNamespaces&&(l.reportNamespaces=new g),l||c(l,`NO_I18NEXT_INSTANCE`,`useTranslation: You will need to pass in an i18next instance by using initReactI18next`);let m=(0,a.useMemo)(()=>({...n(),...l?.options?.react,...t}),[l,t]),{useSuspense:b,keyPrefix:x}=m,S=e||s||l?.options?.defaultNS,C=p(S)?[S]:S||[`translation`],w=(0,a.useMemo)(()=>C,C);l?.reportNamespaces?.addUsedNamespaces?.(w);let T=(0,a.useRef)(0),E=(0,a.useCallback)(e=>{if(!l)return y;let{bindI18n:t,bindI18nStore:n}=m,r=()=>{T.current+=1,e()};return t&&l.on(t,r),n&&l.store.on(n,r),()=>{t&&t.split(` `).forEach(e=>l.off(e,r)),n&&n.split(` `).forEach(e=>l.store.off(e,r))}},[l,m]),D=(0,a.useRef)(),O=(0,a.useCallback)(()=>{if(!l)return v;let e=!!(l.isInitialized||l.initializedStoreOnce)&&w.every(e=>f(e,l,m)),n=t.lng||l.language,r=T.current,i=D.current;if(i&&i.ready===e&&i.lng===n&&i.keyPrefix===x&&i.revision===r)return i;let a={t:l.getFixedT(n,m.nsMode===`fallback`?w:w[0],x),ready:e,lng:n,keyPrefix:x,revision:r};return D.current=a,a},[l,w,x,m,t.lng]),[k,A]=(0,a.useState)(0),{t:j,ready:M}=(0,_.useSyncExternalStore)(E,O,O);(0,a.useEffect)(()=>{if(l&&!M&&!b){let e=()=>A(e=>e+1);t.lng?d(l,t.lng,w,e):u(l,w,e)}},[l,t.lng,w,M,b,k]);let N=l||{},P=(0,a.useRef)(null),F=(0,a.useRef)(),I=e=>{let t=Object.getOwnPropertyDescriptors(e);t.__original&&delete t.__original;let n=Object.create(Object.getPrototypeOf(e),t);if(!Object.prototype.hasOwnProperty.call(n,`__original`))try{Object.defineProperty(n,`__original`,{value:e,writable:!1,enumerable:!1,configurable:!1})}catch{}return n},L=(0,a.useMemo)(()=>{let e=N,t=e?.language,n=e;e&&(P.current&&P.current.__original===e&&F.current===t?n=P.current:(n=I(e),P.current=n,F.current=t));let r=!M&&!b?(...e)=>(c(l,`USE_T_BEFORE_READY`,`useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.`),j(...e)):j,i=[r,n,M];return i.t=r,i.i18n=n,i.ready=M,i},[j,N,M,N.resolvedLanguage,N.language,N.languages]);if(l&&b&&!M)throw new Promise(e=>{let n=()=>e();t.lng?d(l,t.lng,w,n):u(l,w,n)});return L};export{h as n,b as t};
2
+ //# sourceMappingURL=useTranslation-DYORQ7x6.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTranslation-BEUWOMuh.js","names":[],"sources":["../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/utils.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/context.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/useTranslation.js"],"sourcesContent":["export const warn = (i18n, code, msg, rest) => {\n const args = [msg, {\n code,\n ...(rest || {})\n }];\n if (i18n?.services?.logger?.forward) {\n return i18n.services.logger.forward(args, 'warn', 'react-i18next::', true);\n }\n if (isString(args[0])) args[0] = `react-i18next:: ${args[0]}`;\n if (i18n?.services?.logger?.warn) {\n i18n.services.logger.warn(...args);\n } else if (console?.warn) {\n console.warn(...args);\n }\n};\nconst alreadyWarned = {};\nexport const warnOnce = (i18n, code, msg, rest) => {\n if (isString(msg) && alreadyWarned[msg]) return;\n if (isString(msg)) alreadyWarned[msg] = new Date();\n warn(i18n, code, msg, rest);\n};\nconst loadedClb = (i18n, cb) => () => {\n if (i18n.isInitialized) {\n cb();\n } else {\n const initialized = () => {\n setTimeout(() => {\n i18n.off('initialized', initialized);\n }, 0);\n cb();\n };\n i18n.on('initialized', initialized);\n }\n};\nexport const loadNamespaces = (i18n, ns, cb) => {\n i18n.loadNamespaces(ns, loadedClb(i18n, cb));\n};\nexport const loadLanguages = (i18n, lng, ns, cb) => {\n if (isString(ns)) ns = [ns];\n if (i18n.options.preload && i18n.options.preload.indexOf(lng) > -1) return loadNamespaces(i18n, ns, cb);\n ns.forEach(n => {\n if (i18n.options.ns.indexOf(n) < 0) i18n.options.ns.push(n);\n });\n i18n.loadLanguages(lng, loadedClb(i18n, cb));\n};\nexport const hasLoadedNamespace = (ns, i18n, options = {}) => {\n if (!i18n.languages || !i18n.languages.length) {\n warnOnce(i18n, 'NO_LANGUAGES', 'i18n.languages were undefined or empty', {\n languages: i18n.languages\n });\n return true;\n }\n return i18n.hasLoadedNamespace(ns, {\n lng: options.lng,\n precheck: (i18nInstance, loadNotPending) => {\n if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false;\n }\n });\n};\nexport const getDisplayName = Component => Component.displayName || Component.name || (isString(Component) && Component.length > 0 ? Component : 'Unknown');\nexport const isString = obj => typeof obj === 'string';\nexport const isObject = obj => typeof obj === 'object' && obj !== null;","import { createContext } from 'react';\nimport { getDefaults, setDefaults } from './defaults.js';\nimport { getI18n, setI18n } from './i18nInstance.js';\nimport { initReactI18next } from './initReactI18next.js';\nexport { getDefaults, setDefaults, getI18n, setI18n, initReactI18next };\nexport const I18nContext = createContext();\nexport class ReportNamespaces {\n constructor() {\n this.usedNamespaces = {};\n }\n addUsedNamespaces(namespaces) {\n namespaces.forEach(ns => {\n if (!this.usedNamespaces[ns]) this.usedNamespaces[ns] = true;\n });\n }\n getUsedNamespaces() {\n return Object.keys(this.usedNamespaces);\n }\n}\nexport const composeInitialProps = ForComponent => async ctx => {\n const componentsInitialProps = (await ForComponent.getInitialProps?.(ctx)) ?? {};\n const i18nInitialProps = getInitialProps();\n return {\n ...componentsInitialProps,\n ...i18nInitialProps\n };\n};\nexport const getInitialProps = () => {\n const i18n = getI18n();\n if (!i18n) {\n console.warn('react-i18next:: getInitialProps: You will need to pass in an i18next instance by using initReactI18next');\n return {};\n }\n const namespaces = i18n.reportNamespaces?.getUsedNamespaces() ?? [];\n const ret = {};\n const initialI18nStore = {};\n i18n.languages.forEach(l => {\n initialI18nStore[l] = {};\n namespaces.forEach(ns => {\n initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};\n });\n });\n ret.initialI18nStore = initialI18nStore;\n ret.initialLanguage = i18n.language;\n return ret;\n};","import { useContext, useCallback, useMemo, useEffect, useRef, useState } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport { getI18n, getDefaults, ReportNamespaces, I18nContext } from './context.js';\nimport { warnOnce, loadNamespaces, loadLanguages, hasLoadedNamespace, isString, isObject } from './utils.js';\nconst notReadyT = (k, optsOrDefaultValue) => {\n if (isString(optsOrDefaultValue)) return optsOrDefaultValue;\n if (isObject(optsOrDefaultValue) && isString(optsOrDefaultValue.defaultValue)) return optsOrDefaultValue.defaultValue;\n if (typeof k === 'function') return '';\n if (Array.isArray(k)) {\n const last = k[k.length - 1];\n return typeof last === 'function' ? '' : last;\n }\n return k;\n};\nconst notReadySnapshot = {\n t: notReadyT,\n ready: false\n};\nconst dummySubscribe = () => () => {};\nexport const useTranslation = (ns, props = {}) => {\n const {\n i18n: i18nFromProps\n } = props;\n const {\n i18n: i18nFromContext,\n defaultNS: defaultNSFromContext\n } = useContext(I18nContext) || {};\n const i18n = i18nFromProps || i18nFromContext || getI18n();\n if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new ReportNamespaces();\n if (!i18n) {\n warnOnce(i18n, 'NO_I18NEXT_INSTANCE', 'useTranslation: You will need to pass in an i18next instance by using initReactI18next');\n }\n const i18nOptions = useMemo(() => ({\n ...getDefaults(),\n ...i18n?.options?.react,\n ...props\n }), [i18n, props]);\n const {\n useSuspense,\n keyPrefix\n } = i18nOptions;\n const nsOrContext = ns || defaultNSFromContext || i18n?.options?.defaultNS;\n const unstableNamespaces = isString(nsOrContext) ? [nsOrContext] : nsOrContext || ['translation'];\n const namespaces = useMemo(() => unstableNamespaces, unstableNamespaces);\n i18n?.reportNamespaces?.addUsedNamespaces?.(namespaces);\n const revisionRef = useRef(0);\n const subscribe = useCallback(callback => {\n if (!i18n) return dummySubscribe;\n const {\n bindI18n,\n bindI18nStore\n } = i18nOptions;\n const wrappedCallback = () => {\n revisionRef.current += 1;\n callback();\n };\n if (bindI18n) i18n.on(bindI18n, wrappedCallback);\n if (bindI18nStore) i18n.store.on(bindI18nStore, wrappedCallback);\n return () => {\n if (bindI18n) bindI18n.split(' ').forEach(e => i18n.off(e, wrappedCallback));\n if (bindI18nStore) bindI18nStore.split(' ').forEach(e => i18n.store.off(e, wrappedCallback));\n };\n }, [i18n, i18nOptions]);\n const snapshotRef = useRef();\n const getSnapshot = useCallback(() => {\n if (!i18n) {\n return notReadySnapshot;\n }\n const calculatedReady = !!(i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(n => hasLoadedNamespace(n, i18n, i18nOptions));\n const currentLng = props.lng || i18n.language;\n const currentRevision = revisionRef.current;\n const lastSnapshot = snapshotRef.current;\n if (lastSnapshot && lastSnapshot.ready === calculatedReady && lastSnapshot.lng === currentLng && lastSnapshot.keyPrefix === keyPrefix && lastSnapshot.revision === currentRevision) {\n return lastSnapshot;\n }\n const calculatedT = i18n.getFixedT(currentLng, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);\n const newSnapshot = {\n t: calculatedT,\n ready: calculatedReady,\n lng: currentLng,\n keyPrefix,\n revision: currentRevision\n };\n snapshotRef.current = newSnapshot;\n return newSnapshot;\n }, [i18n, namespaces, keyPrefix, i18nOptions, props.lng]);\n const [loadCount, setLoadCount] = useState(0);\n const {\n t,\n ready\n } = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n useEffect(() => {\n if (i18n && !ready && !useSuspense) {\n const onLoaded = () => setLoadCount(c => c + 1);\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n }\n }, [i18n, props.lng, namespaces, ready, useSuspense, loadCount]);\n const finalI18n = i18n || {};\n const wrapperRef = useRef(null);\n const wrapperLangRef = useRef();\n const createI18nWrapper = original => {\n const descriptors = Object.getOwnPropertyDescriptors(original);\n if (descriptors.__original) delete descriptors.__original;\n const wrapper = Object.create(Object.getPrototypeOf(original), descriptors);\n if (!Object.prototype.hasOwnProperty.call(wrapper, '__original')) {\n try {\n Object.defineProperty(wrapper, '__original', {\n value: original,\n writable: false,\n enumerable: false,\n configurable: false\n });\n } catch (_) {}\n }\n return wrapper;\n };\n const ret = useMemo(() => {\n const original = finalI18n;\n const lang = original?.language;\n let i18nWrapper = original;\n if (original) {\n if (wrapperRef.current && wrapperRef.current.__original === original) {\n if (wrapperLangRef.current !== lang) {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n } else {\n i18nWrapper = wrapperRef.current;\n }\n } else {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n }\n }\n const effectiveT = !ready && !useSuspense ? (...args) => {\n warnOnce(i18n, 'USE_T_BEFORE_READY', 'useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.');\n return t(...args);\n } : t;\n const arr = [effectiveT, i18nWrapper, ready];\n arr.t = effectiveT;\n arr.i18n = i18nWrapper;\n arr.ready = ready;\n return arr;\n }, [t, finalI18n, ready, finalI18n.resolvedLanguage, finalI18n.language, finalI18n.languages]);\n if (i18n && useSuspense && !ready) {\n throw new Promise(resolve => {\n const onLoaded = () => resolve();\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n });\n }\n return ret;\n};"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
1
+ {"version":3,"file":"useTranslation-DYORQ7x6.js","names":[],"sources":["../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/utils.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/context.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/useTranslation.js"],"sourcesContent":["export const warn = (i18n, code, msg, rest) => {\n const args = [msg, {\n code,\n ...(rest || {})\n }];\n if (i18n?.services?.logger?.forward) {\n return i18n.services.logger.forward(args, 'warn', 'react-i18next::', true);\n }\n if (isString(args[0])) args[0] = `react-i18next:: ${args[0]}`;\n if (i18n?.services?.logger?.warn) {\n i18n.services.logger.warn(...args);\n } else if (console?.warn) {\n console.warn(...args);\n }\n};\nconst alreadyWarned = {};\nexport const warnOnce = (i18n, code, msg, rest) => {\n if (isString(msg) && alreadyWarned[msg]) return;\n if (isString(msg)) alreadyWarned[msg] = new Date();\n warn(i18n, code, msg, rest);\n};\nconst loadedClb = (i18n, cb) => () => {\n if (i18n.isInitialized) {\n cb();\n } else {\n const initialized = () => {\n setTimeout(() => {\n i18n.off('initialized', initialized);\n }, 0);\n cb();\n };\n i18n.on('initialized', initialized);\n }\n};\nexport const loadNamespaces = (i18n, ns, cb) => {\n i18n.loadNamespaces(ns, loadedClb(i18n, cb));\n};\nexport const loadLanguages = (i18n, lng, ns, cb) => {\n if (isString(ns)) ns = [ns];\n if (i18n.options.preload && i18n.options.preload.indexOf(lng) > -1) return loadNamespaces(i18n, ns, cb);\n ns.forEach(n => {\n if (i18n.options.ns.indexOf(n) < 0) i18n.options.ns.push(n);\n });\n i18n.loadLanguages(lng, loadedClb(i18n, cb));\n};\nexport const hasLoadedNamespace = (ns, i18n, options = {}) => {\n if (!i18n.languages || !i18n.languages.length) {\n warnOnce(i18n, 'NO_LANGUAGES', 'i18n.languages were undefined or empty', {\n languages: i18n.languages\n });\n return true;\n }\n return i18n.hasLoadedNamespace(ns, {\n lng: options.lng,\n precheck: (i18nInstance, loadNotPending) => {\n if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false;\n }\n });\n};\nexport const getDisplayName = Component => Component.displayName || Component.name || (isString(Component) && Component.length > 0 ? Component : 'Unknown');\nexport const isString = obj => typeof obj === 'string';\nexport const isObject = obj => typeof obj === 'object' && obj !== null;","import { createContext } from 'react';\nimport { getDefaults, setDefaults } from './defaults.js';\nimport { getI18n, setI18n } from './i18nInstance.js';\nimport { initReactI18next } from './initReactI18next.js';\nexport { getDefaults, setDefaults, getI18n, setI18n, initReactI18next };\nexport const I18nContext = createContext();\nexport class ReportNamespaces {\n constructor() {\n this.usedNamespaces = {};\n }\n addUsedNamespaces(namespaces) {\n namespaces.forEach(ns => {\n if (!this.usedNamespaces[ns]) this.usedNamespaces[ns] = true;\n });\n }\n getUsedNamespaces() {\n return Object.keys(this.usedNamespaces);\n }\n}\nexport const composeInitialProps = ForComponent => async ctx => {\n const componentsInitialProps = (await ForComponent.getInitialProps?.(ctx)) ?? {};\n const i18nInitialProps = getInitialProps();\n return {\n ...componentsInitialProps,\n ...i18nInitialProps\n };\n};\nexport const getInitialProps = () => {\n const i18n = getI18n();\n if (!i18n) {\n console.warn('react-i18next:: getInitialProps: You will need to pass in an i18next instance by using initReactI18next');\n return {};\n }\n const namespaces = i18n.reportNamespaces?.getUsedNamespaces() ?? [];\n const ret = {};\n const initialI18nStore = {};\n i18n.languages.forEach(l => {\n initialI18nStore[l] = {};\n namespaces.forEach(ns => {\n initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};\n });\n });\n ret.initialI18nStore = initialI18nStore;\n ret.initialLanguage = i18n.language;\n return ret;\n};","import { useContext, useCallback, useMemo, useEffect, useRef, useState } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport { getI18n, getDefaults, ReportNamespaces, I18nContext } from './context.js';\nimport { warnOnce, loadNamespaces, loadLanguages, hasLoadedNamespace, isString, isObject } from './utils.js';\nconst notReadyT = (k, optsOrDefaultValue) => {\n if (isString(optsOrDefaultValue)) return optsOrDefaultValue;\n if (isObject(optsOrDefaultValue) && isString(optsOrDefaultValue.defaultValue)) return optsOrDefaultValue.defaultValue;\n if (typeof k === 'function') return '';\n if (Array.isArray(k)) {\n const last = k[k.length - 1];\n return typeof last === 'function' ? '' : last;\n }\n return k;\n};\nconst notReadySnapshot = {\n t: notReadyT,\n ready: false\n};\nconst dummySubscribe = () => () => {};\nexport const useTranslation = (ns, props = {}) => {\n const {\n i18n: i18nFromProps\n } = props;\n const {\n i18n: i18nFromContext,\n defaultNS: defaultNSFromContext\n } = useContext(I18nContext) || {};\n const i18n = i18nFromProps || i18nFromContext || getI18n();\n if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new ReportNamespaces();\n if (!i18n) {\n warnOnce(i18n, 'NO_I18NEXT_INSTANCE', 'useTranslation: You will need to pass in an i18next instance by using initReactI18next');\n }\n const i18nOptions = useMemo(() => ({\n ...getDefaults(),\n ...i18n?.options?.react,\n ...props\n }), [i18n, props]);\n const {\n useSuspense,\n keyPrefix\n } = i18nOptions;\n const nsOrContext = ns || defaultNSFromContext || i18n?.options?.defaultNS;\n const unstableNamespaces = isString(nsOrContext) ? [nsOrContext] : nsOrContext || ['translation'];\n const namespaces = useMemo(() => unstableNamespaces, unstableNamespaces);\n i18n?.reportNamespaces?.addUsedNamespaces?.(namespaces);\n const revisionRef = useRef(0);\n const subscribe = useCallback(callback => {\n if (!i18n) return dummySubscribe;\n const {\n bindI18n,\n bindI18nStore\n } = i18nOptions;\n const wrappedCallback = () => {\n revisionRef.current += 1;\n callback();\n };\n if (bindI18n) i18n.on(bindI18n, wrappedCallback);\n if (bindI18nStore) i18n.store.on(bindI18nStore, wrappedCallback);\n return () => {\n if (bindI18n) bindI18n.split(' ').forEach(e => i18n.off(e, wrappedCallback));\n if (bindI18nStore) bindI18nStore.split(' ').forEach(e => i18n.store.off(e, wrappedCallback));\n };\n }, [i18n, i18nOptions]);\n const snapshotRef = useRef();\n const getSnapshot = useCallback(() => {\n if (!i18n) {\n return notReadySnapshot;\n }\n const calculatedReady = !!(i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(n => hasLoadedNamespace(n, i18n, i18nOptions));\n const currentLng = props.lng || i18n.language;\n const currentRevision = revisionRef.current;\n const lastSnapshot = snapshotRef.current;\n if (lastSnapshot && lastSnapshot.ready === calculatedReady && lastSnapshot.lng === currentLng && lastSnapshot.keyPrefix === keyPrefix && lastSnapshot.revision === currentRevision) {\n return lastSnapshot;\n }\n const calculatedT = i18n.getFixedT(currentLng, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);\n const newSnapshot = {\n t: calculatedT,\n ready: calculatedReady,\n lng: currentLng,\n keyPrefix,\n revision: currentRevision\n };\n snapshotRef.current = newSnapshot;\n return newSnapshot;\n }, [i18n, namespaces, keyPrefix, i18nOptions, props.lng]);\n const [loadCount, setLoadCount] = useState(0);\n const {\n t,\n ready\n } = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n useEffect(() => {\n if (i18n && !ready && !useSuspense) {\n const onLoaded = () => setLoadCount(c => c + 1);\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n }\n }, [i18n, props.lng, namespaces, ready, useSuspense, loadCount]);\n const finalI18n = i18n || {};\n const wrapperRef = useRef(null);\n const wrapperLangRef = useRef();\n const createI18nWrapper = original => {\n const descriptors = Object.getOwnPropertyDescriptors(original);\n if (descriptors.__original) delete descriptors.__original;\n const wrapper = Object.create(Object.getPrototypeOf(original), descriptors);\n if (!Object.prototype.hasOwnProperty.call(wrapper, '__original')) {\n try {\n Object.defineProperty(wrapper, '__original', {\n value: original,\n writable: false,\n enumerable: false,\n configurable: false\n });\n } catch (_) {}\n }\n return wrapper;\n };\n const ret = useMemo(() => {\n const original = finalI18n;\n const lang = original?.language;\n let i18nWrapper = original;\n if (original) {\n if (wrapperRef.current && wrapperRef.current.__original === original) {\n if (wrapperLangRef.current !== lang) {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n } else {\n i18nWrapper = wrapperRef.current;\n }\n } else {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n }\n }\n const effectiveT = !ready && !useSuspense ? (...args) => {\n warnOnce(i18n, 'USE_T_BEFORE_READY', 'useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.');\n return t(...args);\n } : t;\n const arr = [effectiveT, i18nWrapper, ready];\n arr.t = effectiveT;\n arr.i18n = i18nWrapper;\n arr.ready = ready;\n return arr;\n }, [t, finalI18n, ready, finalI18n.resolvedLanguage, finalI18n.language, finalI18n.languages]);\n if (i18n && useSuspense && !ready) {\n throw new Promise(resolve => {\n const onLoaded = () => resolve();\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n });\n }\n return ret;\n};"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
@@ -9,7 +9,7 @@
9
9
  <link rel="icon" type="image/svg+xml" href="/logo.svg" />
10
10
  <link rel="apple-touch-icon" href="/logo.svg" />
11
11
  <title>xopc</title>
12
- <script type="module" crossorigin src="/assets/index-DBZ5eXW5.js"></script>
12
+ <script type="module" crossorigin src="/assets/index-BXUJbteW.js"></script>
13
13
  <link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-B1FJdls4.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-DzyYoeor.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/dist-CjRB05pZ.js">
@@ -24,34 +24,34 @@
24
24
  <link rel="modulepreload" crossorigin href="/assets/dist-CpMMntuC.js">
25
25
  <link rel="modulepreload" crossorigin href="/assets/cn-DPF56z7S.js">
26
26
  <link rel="modulepreload" crossorigin href="/assets/vendor-swr-8rdcElid.js">
27
- <link rel="modulepreload" crossorigin href="/assets/url-QmwQTJ-j.js">
27
+ <link rel="modulepreload" crossorigin href="/assets/url-CtSqjF9J.js">
28
28
  <link rel="modulepreload" crossorigin href="/assets/check-CDc_K89l.js">
29
29
  <link rel="modulepreload" crossorigin href="/assets/chunk-QFMPRPBF-DOYp8d2p.js">
30
30
  <link rel="modulepreload" crossorigin href="/assets/form-field-width-BlpNwrfn.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/interaction-C4gx-xSs.js">
32
- <link rel="modulepreload" crossorigin href="/assets/model-selector-BiiDq8Pk.js">
32
+ <link rel="modulepreload" crossorigin href="/assets/model-selector-he3aQfme.js">
33
33
  <link rel="modulepreload" crossorigin href="/assets/button-CRQ9eQGX.js">
34
34
  <link rel="modulepreload" crossorigin href="/assets/markdown-view-BpEqr7_J.js">
35
35
  <link rel="modulepreload" crossorigin href="/assets/settings-nav-state-BSa0kz44.js">
36
36
  <link rel="modulepreload" crossorigin href="/assets/pin-DlJMazAN.js">
37
37
  <link rel="modulepreload" crossorigin href="/assets/extension-paths-BNsLxSIK.js">
38
38
  <link rel="modulepreload" crossorigin href="/assets/sparkles-BG1XFBU0.js">
39
- <link rel="modulepreload" crossorigin href="/assets/theme-store-CPTH77BE.js">
40
- <link rel="modulepreload" crossorigin href="/assets/preference-select-fields-B4AJBqUY.js">
39
+ <link rel="modulepreload" crossorigin href="/assets/theme-store-CmiSsYBd.js">
40
+ <link rel="modulepreload" crossorigin href="/assets/electron-env-D9bm1FIu.js">
41
41
  <link rel="modulepreload" crossorigin href="/assets/chevron-down-DUplxB5j.js">
42
- <link rel="modulepreload" crossorigin href="/assets/skill-api-CxbNlOD_.js">
42
+ <link rel="modulepreload" crossorigin href="/assets/skill-api-vxtE8kI6.js">
43
43
  <link rel="modulepreload" crossorigin href="/assets/chevron-right-DmT4UtDa.js">
44
44
  <link rel="modulepreload" crossorigin href="/assets/loader-circle-B2bCE4iI.js">
45
45
  <link rel="modulepreload" crossorigin href="/assets/attachment-utils-core-B42k7cMx.js">
46
- <link rel="modulepreload" crossorigin href="/assets/session-api-DxNaAkmX.js">
47
- <link rel="modulepreload" crossorigin href="/assets/session-working-directory-control-CDH-Wk4E.js">
46
+ <link rel="modulepreload" crossorigin href="/assets/session-api-n-4O5d9U.js">
47
+ <link rel="modulepreload" crossorigin href="/assets/session-working-directory-control-B6dHLvbr.js">
48
48
  <link rel="modulepreload" crossorigin href="/assets/segmented-styles-DEG4J-_P.js">
49
49
  <link rel="modulepreload" crossorigin href="/assets/sliding-segmented-BIYAScDL.js">
50
- <link rel="modulepreload" crossorigin href="/assets/navigation-BpLKd2Ca.js">
50
+ <link rel="modulepreload" crossorigin href="/assets/navigation-DB9S-C6S.js">
51
51
  <link rel="modulepreload" crossorigin href="/assets/ellipsis-vertical-BJP8MSr5.js">
52
52
  <link rel="modulepreload" crossorigin href="/assets/send-CPmJTrt0.js">
53
53
  <link rel="modulepreload" crossorigin href="/assets/external-link-DxIqSrRZ.js">
54
- <link rel="modulepreload" crossorigin href="/assets/gateway-config-swr-C7ZFPhNj.js">
54
+ <link rel="modulepreload" crossorigin href="/assets/gateway-config-swr-Bc8SVD15.js">
55
55
  <link rel="modulepreload" crossorigin href="/assets/file-text-CVBsYEv2.js">
56
56
  <link rel="modulepreload" crossorigin href="/assets/folder-BZ5toHcH.js">
57
57
  <link rel="modulepreload" crossorigin href="/assets/info-Ccltk00r.js">
@@ -61,13 +61,13 @@
61
61
  <link rel="modulepreload" crossorigin href="/assets/refresh-cw-D7hzzeQ5.js">
62
62
  <link rel="modulepreload" crossorigin href="/assets/search-DoMetBR0.js">
63
63
  <link rel="modulepreload" crossorigin href="/assets/trash-2-D9v5oysq.js">
64
- <link rel="modulepreload" crossorigin href="/assets/useTranslation-BEUWOMuh.js">
65
- <link rel="modulepreload" crossorigin href="/assets/extension-provider-BpHodVRj.js">
66
- <link rel="modulepreload" crossorigin href="/assets/chat-agents-api-BR30M2YQ.js">
67
- <link rel="modulepreload" crossorigin href="/assets/extension-iframe-host-PWB-Pw2d.js">
68
- <link rel="modulepreload" crossorigin href="/assets/page-header-store-HcRZK5CZ.js">
64
+ <link rel="modulepreload" crossorigin href="/assets/useTranslation-DYORQ7x6.js">
65
+ <link rel="modulepreload" crossorigin href="/assets/extension-provider-CO2jxBA9.js">
66
+ <link rel="modulepreload" crossorigin href="/assets/chat-agents-api-DPb_0O8M.js">
67
+ <link rel="modulepreload" crossorigin href="/assets/extension-iframe-host-Cs1Kde9o.js">
68
+ <link rel="modulepreload" crossorigin href="/assets/page-header-store-DJHD9Ean.js">
69
69
  <link rel="stylesheet" crossorigin href="/assets/markdown-view-CL7jotIt.css">
70
- <link rel="stylesheet" crossorigin href="/assets/index-KsVMH-Jo.css">
70
+ <link rel="stylesheet" crossorigin href="/assets/index-CQLMxWSA.css">
71
71
  </head>
72
72
  <body>
73
73
  <div id="root"></div>
package/dist/package.js CHANGED
@@ -1,5 +1,5 @@
1
1
  //#region package.json
2
- var version = "0.0.6";
2
+ var version = "0.0.8";
3
3
  //#endregion
4
4
  export { version };
5
5
 
@@ -1,11 +1,11 @@
1
- import { createLogger } from "../utils/logger/index.js";
2
- import { init_logger } from "../utils/logger.js";
3
1
  import { resolveStateDir } from "../config/paths-state.js";
4
2
  import { expandWorkspacePathString, init_workspace_path } from "../config/workspace-path.js";
5
3
  import { resolveAgentBootstrapDir } from "./agent-scope.js";
6
4
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
7
- import { init_paths, resolveBundledSkillsDir } from "../config/paths.js";
8
5
  import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
6
+ import { createLogger } from "../utils/logger/index.js";
7
+ import { init_logger } from "../utils/logger.js";
8
+ import { init_paths, resolveBundledSkillsDir } from "../config/paths.js";
9
9
  import { init_sync_provider_auth, resolveProviderApiKeySync } from "../auth/sync-provider-auth.js";
10
10
  import { CredentialResolver, init_credentials } from "../auth/credentials.js";
11
11
  import { getApiKeySync, getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
@@ -26,9 +26,9 @@ import { extractAgentUserPlainText } from "./memory/user-message-text.js";
26
26
  import { resolveBackgroundReviewSettings } from "./background-review/settings.js";
27
27
  import { isAssistantTurnAborted, isAssistantTurnFailed } from "./orchestration/llm-turn-retry.js";
28
28
  import { runBackgroundReviewTurn } from "./background-review/run-background-review.js";
29
+ import { Agent } from "@mariozechner/pi-agent-core";
29
30
  import { basename, resolve, sep } from "node:path";
30
31
  import { readFileSync } from "node:fs";
31
- import { Agent } from "@mariozechner/pi-agent-core";
32
32
  //#region src/agent/agent-manager.ts
33
33
  /**
34
34
  * Agent Manager - Manages Agent instances per session
@@ -1,11 +1,11 @@
1
+ import { DEFAULT_AGENT_ID, init_agent_scope, resolveAgentBootstrapDir } from "../agent-scope.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { DEFAULT_AGENT_ID, init_agent_scope, resolveAgentBootstrapDir } from "../agent-scope.js";
4
4
  import { WORKSPACE_FILES, init_paths } from "../../config/paths.js";
5
5
  import { BOOTSTRAP_FILES } from "./workspace.js";
6
6
  import { dirname, join } from "node:path";
7
- import { fileURLToPath } from "node:url";
8
7
  import { existsSync, mkdirSync, readFileSync, writeFileSync } from "node:fs";
8
+ import { fileURLToPath } from "node:url";
9
9
  //#region src/agent/context/workspace-seed.ts
10
10
  /**
11
11
  * Seed bootstrap persona Markdown files under `…/agents/<id>/bootstrap/` (ensure workspace + write-if-missing).
@@ -2,7 +2,6 @@
2
2
  * Unified image stack: understanding (pi-ai multimodal) under this folder;
3
3
  * generation (OpenAI Images API; DashScope Beijing wan2.6-t2i via `dashscope/`) under `./generation/`.
4
4
  */
5
- export { describeImagesWithPiAi } from './describe-images.js';
6
5
  export { describeImages, describeImagesWithFallback, type DescribeImagesParams, type DescribeImagesWithFallbackParams, type DescribeImagesWithFallbackResult, type DescribeImagesAttempt, } from './understanding/runtime.js';
7
6
  export { registerImageUnderstandingProvider, getImageUnderstandingProvider, listImageUnderstandingProviders, } from './understanding/provider-registry.js';
8
7
  export type { ImageUnderstandingProvider, ImageUnderstandingRequest, ImageUnderstandingResult, } from './understanding/types.js';
@@ -1,11 +1,10 @@
1
1
  import { getImageUnderstandingProvider, listImageUnderstandingProviders, registerImageUnderstandingProvider } from "./understanding/provider-registry.js";
2
2
  import { resolveImageModelConfigForTool } from "./tool-model-config.js";
3
3
  import { describeImages, describeImagesWithFallback } from "./understanding/runtime.js";
4
- import { describeImagesWithPiAi } from "./describe-images.js";
5
4
  import { runWithImageModelFallback } from "./image-model-fallback.js";
6
5
  import { loadImageForToolInput } from "./load-image-media.js";
7
6
  import { DASHSCOPE_DEFAULT_IMAGE_MODEL, OPENAI_DEFAULT_IMAGE_MODEL } from "./generation/constants.js";
8
7
  import { getImageGenerationProvider, listImageGenerationProviders, registerImageGenerationProvider } from "./generation/provider-registry.js";
9
8
  import { generateImage, listImageGenerationProvidersSummary } from "./generation/runtime.js";
10
9
  import { modelSupportsVision, resolveImageHandlingStrategy } from "./vision-detection.js";
11
- export { DASHSCOPE_DEFAULT_IMAGE_MODEL, OPENAI_DEFAULT_IMAGE_MODEL, describeImages, describeImagesWithFallback, describeImagesWithPiAi, generateImage, getImageGenerationProvider, getImageUnderstandingProvider, listImageGenerationProviders, listImageGenerationProvidersSummary, listImageUnderstandingProviders, loadImageForToolInput, modelSupportsVision, registerImageGenerationProvider, registerImageUnderstandingProvider, resolveImageHandlingStrategy, resolveImageModelConfigForTool, runWithImageModelFallback };
10
+ export { DASHSCOPE_DEFAULT_IMAGE_MODEL, OPENAI_DEFAULT_IMAGE_MODEL, describeImages, describeImagesWithFallback, generateImage, getImageGenerationProvider, getImageUnderstandingProvider, listImageGenerationProviders, listImageGenerationProvidersSummary, listImageUnderstandingProviders, loadImageForToolInput, modelSupportsVision, registerImageGenerationProvider, registerImageUnderstandingProvider, resolveImageHandlingStrategy, resolveImageModelConfigForTool, runWithImageModelFallback };
@@ -1,6 +1,6 @@
1
+ import { init_agent_scope, resolveDefaultAgentId } from "../agent-scope.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { init_agent_scope, resolveDefaultAgentId } from "../agent-scope.js";
4
4
  import { createResponseMessage, createSignalMessage, createTaskMessage } from "./types.js";
5
5
  import { AgentInbox } from "./inbox.js";
6
6
  //#region src/agent/ipc/bus.ts
@@ -1,6 +1,6 @@
1
1
  import { dirname, join } from "node:path";
2
- import { fileURLToPath } from "node:url";
3
2
  import { readdir, stat } from "node:fs/promises";
3
+ import { fileURLToPath } from "node:url";
4
4
  //#region src/agent/memory/plugin-discovery.ts
5
5
  async function discoverMemoryPlugins() {
6
6
  const pluginsDir = join(dirname(fileURLToPath(import.meta.url)), "..", "..", "plugins", "memory");
@@ -1,6 +1,6 @@
1
+ import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { getAgentDefaultModelRef, init_schema } from "../../config/schema.js";
4
4
  import { getAllModels, getDefaultModelSync, init_providers, resolveModel } from "../../providers/index.js";
5
5
  import { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "../orchestration/run-agent-turn-with-timeout.js";
6
6
  import { isAssistantTurnAborted, isAssistantTurnFailed, maybeRetryTurnAfterTransientLlmFailure } from "../orchestration/llm-turn-retry.js";
@@ -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 { DEFAULT_USER_FILENAME, toWorkspaceBootstrapFile } from "../context/workspace.js";
6
6
  import { createSkillConfigManager } from "../skills/config.js";
@@ -1,10 +1,10 @@
1
- import { runWithLogContext, updateAsyncLogContext } from "../utils/logger/context.js";
2
- import { createLogger } from "../utils/logger/index.js";
3
- import { init_logger } from "../utils/logger.js";
4
1
  import { init_agent_scope, resolveAgentBootstrapDir, resolveAgentHomeDir, resolveDefaultAgentId } from "./agent-scope.js";
5
2
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
6
3
  import { init_session_key, parseSessionKey } from "../routing/session-key.js";
7
4
  import { extractProfileAgentId } from "../config/agent-profile.js";
5
+ import { runWithLogContext, updateAsyncLogContext } from "../utils/logger/context.js";
6
+ import { createLogger } from "../utils/logger/index.js";
7
+ import { init_logger } from "../utils/logger.js";
8
8
  import { getDefaultModelSync, init_providers } from "../providers/index.js";
9
9
  import { extractTextContent, loadBootstrapFiles } from "./context/workspace.js";
10
10
  import { isTTSAvailable } from "../voice/tts/factory.js";
@@ -1,6 +1,6 @@
1
1
  import { join, relative } from "node:path";
2
- import { createHash } from "node:crypto";
3
2
  import { createReadStream, existsSync, readFileSync, readdirSync, statSync } from "node:fs";
3
+ import { createHash } from "node:crypto";
4
4
  //#region src/agent/skills/hub-hash.ts
5
5
  /**
6
6
  * Deterministic content hash for a skill directory (for hub lock / drift detection).
@@ -6,8 +6,8 @@ import { installSkillFromZip, isValidSkillId } from "./managed-store.js";
6
6
  import { computeSkillTreeHashSync } from "./hub-hash.js";
7
7
  import { basename, join, normalize, resolve, sep } from "node:path";
8
8
  import { tmpdir } from "node:os";
9
- import { fileURLToPath } from "node:url";
10
9
  import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
10
+ import { fileURLToPath } from "node:url";
11
11
  import { fetch } from "undici";
12
12
  import { execFileSync } from "node:child_process";
13
13
  //#region src/agent/skills/hub-pull.ts
@@ -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,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";
@@ -1,6 +1,6 @@
1
1
  import { resolveImageModelConfigForTool } from "../../image/tool-model-config.js";
2
2
  import { buildImageToolTextResult } from "../../image/image-helpers.js";
3
- import { describeImagesWithPiAi } from "../../image/describe-images.js";
3
+ import { describeImages } from "../../image/understanding/runtime.js";
4
4
  import { runWithImageModelFallback } from "../../image/image-model-fallback.js";
5
5
  import "../image-tool.js";
6
6
  import { BrowserClickSchema, BrowserNavigateSchema, BrowserScreenshotSchema, BrowserScrollSchema, BrowserSnapshotSchema, BrowserTypeSchema } from "./schemas.js";
@@ -247,7 +247,7 @@ function createBrowserTools(deps) {
247
247
  toolConfig: imageModelConfig,
248
248
  modelOverride: void 0,
249
249
  run: async (modelRef) => {
250
- const { text, provider, model } = await describeImagesWithPiAi({
250
+ const { text, provider, model } = await describeImages({
251
251
  modelRef,
252
252
  prompt,
253
253
  images: [{
@@ -1 +1 @@
1
- {"version":3,"file":"tools.js","names":[],"sources":["../../../../../src/agent/tools/browser/tools.ts"],"sourcesContent":["import type { Static } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@mariozechner/pi-agent-core';\nimport type { Locator, Page } from 'playwright-core';\n\nimport type { Config } from '../../../config/schema.js';\nimport { describeImagesWithPiAi } from '../../image/describe-images.js';\nimport { buildImageToolTextResult } from '../../image/image-helpers.js';\nimport { runWithImageModelFallback } from '../../image/image-model-fallback.js';\nimport { resolveImageModelConfigForTool } from '../image-tool.js';\nimport type { BrowserManager } from './manager.js';\nimport {\n BrowserClickSchema,\n BrowserNavigateSchema,\n BrowserScreenshotSchema,\n BrowserScrollSchema,\n BrowserSnapshotSchema,\n BrowserTypeSchema,\n} from './schemas.js';\nimport { assertBrowserUrlAllowed } from './url-policy.js';\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst NAV_TIMEOUT_MS = 30_000;\nconst MAX_SCREENSHOT_BYTES = 6 * 1024 * 1024;\n\nexport interface CreateBrowserToolsDeps {\n getManager: () => BrowserManager;\n getTaskId: () => string;\n getConfig: () => Config | undefined;\n}\n\nfunction resolveClickLocator(page: Page, params: Static<typeof BrowserClickSchema>): Locator {\n const hasSel = Boolean(params.selector?.trim());\n const hasText = Boolean(params.text?.trim());\n const hasRole = Boolean(params.role?.trim());\n const n = (hasSel ? 1 : 0) + (hasText ? 1 : 0) + (hasRole ? 1 : 0);\n if (n !== 1) {\n throw new Error('Provide exactly one of: selector, text, role');\n }\n if (hasSel) {\n return page.locator(params.selector!.trim()).first();\n }\n if (hasText) {\n return page.getByText(params.text!.trim(), { exact: false }).first();\n }\n const raw = params.role!.trim();\n const idx = raw.indexOf(':');\n const role = (idx >= 0 ? raw.slice(0, idx) : raw).trim();\n const name = idx >= 0 ? raw.slice(idx + 1).trim() : '';\n if (!role) {\n throw new Error('Invalid role: empty ARIA role');\n }\n // Playwright typings list roles as a union; the model may pass any valid ARIA role string.\n return page.getByRole(role as never, name ? { name } : undefined).first();\n}\n\nfunction resolveTypeLocator(page: Page, params: Static<typeof BrowserTypeSchema>): Locator {\n const hasSel = Boolean(params.selector?.trim());\n const hasLab = Boolean(params.label?.trim());\n if (hasSel === hasLab) {\n throw new Error('Provide exactly one of: selector, label');\n }\n if (hasSel) {\n return page.locator(params.selector!.trim()).first();\n }\n return page.getByLabel(params.label!.trim()).first();\n}\n\nasync function ariaSnapshotFor(\n page: Page,\n selector: string | undefined,\n maxLength: number,\n): Promise<string> {\n const loc = selector?.trim() ? page.locator(selector.trim()).first() : page.locator('body');\n await loc.waitFor({ state: 'attached', timeout: 15_000 });\n let text = await loc.ariaSnapshot({ mode: 'ai', timeout: 15_000 });\n if (!text || !text.trim()) {\n text = '(empty snapshot)';\n }\n if (text.length > maxLength) {\n text = `${text.slice(0, maxLength)}\\n... (truncated)`;\n }\n return text;\n}\n\nexport function createBrowserTools(deps: CreateBrowserToolsDeps): AgentTool<any, any>[] {\n const pageFor = () => deps.getManager().getPage(deps.getTaskId());\n\n const navigate: AgentTool<typeof BrowserNavigateSchema, { url: string; title: string }> = {\n name: 'browser_navigate',\n label: '🌐 Browser Navigate',\n description:\n 'Navigate the headless browser to a URL. The page persists for this chat session.\\n' +\n 'Call `browser_snapshot` after navigation to inspect the UI. Only http(s) public URLs; private IPs and localhost are blocked.',\n parameters: BrowserNavigateSchema,\n\n async execute(_id, params, signal) {\n assertBrowserUrlAllowed(params.url);\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const waitUntil = params.waitFor ?? 'domcontentloaded';\n await page.goto(params.url, {\n waitUntil,\n timeout: NAV_TIMEOUT_MS,\n });\n const title = await page.title();\n const url = page.url();\n return {\n content: [{ type: 'text', text: `Navigated to: ${title}\\nURL: ${url}` }],\n details: { url, title },\n };\n },\n };\n\n const snapshot: AgentTool<typeof BrowserSnapshotSchema, { length: number }> = {\n name: 'browser_snapshot',\n label: '📸 Browser Snapshot',\n description:\n 'Capture an AI-oriented ARIA snapshot of the current page (YAML-like tree with element refs).\\n' +\n 'Use after `browser_navigate` to see interactive elements before `browser_click` / `browser_type`.',\n parameters: BrowserSnapshotSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const maxLength = params.maxLength ?? DEFAULT_SNAPSHOT_MAX;\n try {\n const text = await ariaSnapshotFor(page, params.selector, maxLength);\n return {\n content: [{ type: 'text', text }],\n details: { length: text.length },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Snapshot failed: ${msg}` }],\n details: { length: 0 },\n };\n }\n },\n };\n\n const click: AgentTool<typeof BrowserClickSchema, { ok: boolean }> = {\n name: 'browser_click',\n label: '🖱️ Browser Click',\n description:\n 'Click an element. Provide exactly one targeting mode: `selector` (CSS), `text` (visible text), or `role` (e.g. `button:Submit`).',\n parameters: BrowserClickSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n try {\n const loc = resolveClickLocator(page, params);\n await loc.click({ timeout: 15_000 });\n return {\n content: [{ type: 'text', text: 'Click succeeded.' }],\n details: { ok: true },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Click failed: ${msg}` }],\n details: { ok: false },\n };\n }\n },\n };\n\n const typeTool: AgentTool<typeof BrowserTypeSchema, { ok: boolean }> = {\n name: 'browser_type',\n label: '⌨️ Browser Type',\n description:\n 'Type into an input. Provide exactly one of `selector` or `label` (associated label text). Optional `pressEnter` to submit.',\n parameters: BrowserTypeSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n try {\n const loc = resolveTypeLocator(page, params);\n await loc.clear({ timeout: 5000 }).catch(() => {});\n await loc.fill(params.text, { timeout: 15_000 });\n if (params.pressEnter) {\n await page.keyboard.press('Enter');\n }\n return {\n content: [{ type: 'text', text: 'Typed into field.' }],\n details: { ok: true },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Type failed: ${msg}` }],\n details: { ok: false },\n };\n }\n },\n };\n\n const scroll: AgentTool<typeof BrowserScrollSchema, { ok: boolean }> = {\n name: 'browser_scroll',\n label: '📜 Browser Scroll',\n description: 'Scroll the page up or down by a pixel amount (default 500).',\n parameters: BrowserScrollSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const amount = params.amount ?? 500;\n const dy = params.direction === 'down' ? amount : -amount;\n await page.evaluate(\n ({ deltaY }) => {\n (globalThis as unknown as { scrollBy: (x: number, y: number) => void }).scrollBy(0, deltaY);\n },\n { deltaY: dy },\n );\n return {\n content: [{ type: 'text', text: `Scrolled ${params.direction} by ${amount}px.` }],\n details: { ok: true },\n };\n },\n };\n\n const screenshot: AgentTool<typeof BrowserScreenshotSchema, Record<string, unknown>> = {\n name: 'browser_screenshot',\n label: '🖼️ Browser Screenshot',\n description:\n 'Take a PNG screenshot of the viewport or a CSS selector. When `agents.defaults.imageModel` is configured, runs vision on the image using `description` as the prompt (default: short UI summary).',\n parameters: BrowserScreenshotSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const cfg = deps.getConfig();\n let buf: Buffer;\n try {\n if (params.selector?.trim()) {\n const loc = page.locator(params.selector.trim()).first();\n await loc.waitFor({ state: 'visible', timeout: 15_000 });\n buf = await loc.screenshot({ type: 'png', timeout: 15_000 });\n } else {\n buf = await page.screenshot({ type: 'png', fullPage: false, timeout: 15_000 });\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Screenshot failed: ${msg}` }],\n details: { error: msg },\n };\n }\n\n if (buf.length > MAX_SCREENSHOT_BYTES) {\n return {\n content: [\n {\n type: 'text',\n text: `Screenshot too large (${buf.length} bytes, max ${MAX_SCREENSHOT_BYTES}). Try a narrower selector.`,\n },\n ],\n details: { error: 'too_large', bytes: buf.length },\n };\n }\n\n const imageModelConfig = resolveImageModelConfigForTool({ cfg });\n const prompt =\n params.description?.trim() ||\n 'Describe this browser screenshot briefly. Focus on visible text, controls, and actionable UI state.';\n\n if (!imageModelConfig) {\n return {\n content: [\n {\n type: 'text',\n text:\n `Captured PNG screenshot (${buf.length} bytes). Configure agents.defaults.imageModel for automatic visual description.`,\n },\n ],\n details: { bytes: buf.length, vision: false },\n };\n }\n\n try {\n const runResult = await runWithImageModelFallback({\n toolConfig: imageModelConfig,\n modelOverride: undefined,\n run: async (modelRef) => {\n const { text, provider, model } = await describeImagesWithPiAi({\n modelRef,\n prompt,\n images: [{ buffer: buf, mimeType: 'image/png' }],\n timeoutMs: 60_000,\n signal,\n });\n return { text, provider, model };\n },\n });\n const { result: inner, attempts } = runResult;\n return buildImageToolTextResult(\n { text: inner.text, provider: inner.provider, model: inner.model, attempts },\n { bytes: buf.length, vision: true },\n );\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [\n {\n type: 'text',\n text: `Screenshot captured (${buf.length} bytes) but vision failed: ${msg}`,\n },\n ],\n details: { bytes: buf.length, visionError: msg },\n };\n }\n },\n };\n\n return [navigate, snapshot, click, typeTool, scroll, screenshot];\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"tools.js","names":[],"sources":["../../../../../src/agent/tools/browser/tools.ts"],"sourcesContent":["import type { Static } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@mariozechner/pi-agent-core';\nimport type { Locator, Page } from 'playwright-core';\n\nimport type { Config } from '../../../config/schema.js';\nimport { describeImages } from '../../image/understanding/runtime.js';\nimport { buildImageToolTextResult } from '../../image/image-helpers.js';\nimport { runWithImageModelFallback } from '../../image/image-model-fallback.js';\nimport { resolveImageModelConfigForTool } from '../image-tool.js';\nimport type { BrowserManager } from './manager.js';\nimport {\n BrowserClickSchema,\n BrowserNavigateSchema,\n BrowserScreenshotSchema,\n BrowserScrollSchema,\n BrowserSnapshotSchema,\n BrowserTypeSchema,\n} from './schemas.js';\nimport { assertBrowserUrlAllowed } from './url-policy.js';\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst NAV_TIMEOUT_MS = 30_000;\nconst MAX_SCREENSHOT_BYTES = 6 * 1024 * 1024;\n\nexport interface CreateBrowserToolsDeps {\n getManager: () => BrowserManager;\n getTaskId: () => string;\n getConfig: () => Config | undefined;\n}\n\nfunction resolveClickLocator(page: Page, params: Static<typeof BrowserClickSchema>): Locator {\n const hasSel = Boolean(params.selector?.trim());\n const hasText = Boolean(params.text?.trim());\n const hasRole = Boolean(params.role?.trim());\n const n = (hasSel ? 1 : 0) + (hasText ? 1 : 0) + (hasRole ? 1 : 0);\n if (n !== 1) {\n throw new Error('Provide exactly one of: selector, text, role');\n }\n if (hasSel) {\n return page.locator(params.selector!.trim()).first();\n }\n if (hasText) {\n return page.getByText(params.text!.trim(), { exact: false }).first();\n }\n const raw = params.role!.trim();\n const idx = raw.indexOf(':');\n const role = (idx >= 0 ? raw.slice(0, idx) : raw).trim();\n const name = idx >= 0 ? raw.slice(idx + 1).trim() : '';\n if (!role) {\n throw new Error('Invalid role: empty ARIA role');\n }\n // Playwright typings list roles as a union; the model may pass any valid ARIA role string.\n return page.getByRole(role as never, name ? { name } : undefined).first();\n}\n\nfunction resolveTypeLocator(page: Page, params: Static<typeof BrowserTypeSchema>): Locator {\n const hasSel = Boolean(params.selector?.trim());\n const hasLab = Boolean(params.label?.trim());\n if (hasSel === hasLab) {\n throw new Error('Provide exactly one of: selector, label');\n }\n if (hasSel) {\n return page.locator(params.selector!.trim()).first();\n }\n return page.getByLabel(params.label!.trim()).first();\n}\n\nasync function ariaSnapshotFor(\n page: Page,\n selector: string | undefined,\n maxLength: number,\n): Promise<string> {\n const loc = selector?.trim() ? page.locator(selector.trim()).first() : page.locator('body');\n await loc.waitFor({ state: 'attached', timeout: 15_000 });\n let text = await loc.ariaSnapshot({ mode: 'ai', timeout: 15_000 });\n if (!text || !text.trim()) {\n text = '(empty snapshot)';\n }\n if (text.length > maxLength) {\n text = `${text.slice(0, maxLength)}\\n... (truncated)`;\n }\n return text;\n}\n\nexport function createBrowserTools(deps: CreateBrowserToolsDeps): AgentTool<any, any>[] {\n const pageFor = () => deps.getManager().getPage(deps.getTaskId());\n\n const navigate: AgentTool<typeof BrowserNavigateSchema, { url: string; title: string }> = {\n name: 'browser_navigate',\n label: '🌐 Browser Navigate',\n description:\n 'Navigate the headless browser to a URL. The page persists for this chat session.\\n' +\n 'Call `browser_snapshot` after navigation to inspect the UI. Only http(s) public URLs; private IPs and localhost are blocked.',\n parameters: BrowserNavigateSchema,\n\n async execute(_id, params, signal) {\n assertBrowserUrlAllowed(params.url);\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const waitUntil = params.waitFor ?? 'domcontentloaded';\n await page.goto(params.url, {\n waitUntil,\n timeout: NAV_TIMEOUT_MS,\n });\n const title = await page.title();\n const url = page.url();\n return {\n content: [{ type: 'text', text: `Navigated to: ${title}\\nURL: ${url}` }],\n details: { url, title },\n };\n },\n };\n\n const snapshot: AgentTool<typeof BrowserSnapshotSchema, { length: number }> = {\n name: 'browser_snapshot',\n label: '📸 Browser Snapshot',\n description:\n 'Capture an AI-oriented ARIA snapshot of the current page (YAML-like tree with element refs).\\n' +\n 'Use after `browser_navigate` to see interactive elements before `browser_click` / `browser_type`.',\n parameters: BrowserSnapshotSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const maxLength = params.maxLength ?? DEFAULT_SNAPSHOT_MAX;\n try {\n const text = await ariaSnapshotFor(page, params.selector, maxLength);\n return {\n content: [{ type: 'text', text }],\n details: { length: text.length },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Snapshot failed: ${msg}` }],\n details: { length: 0 },\n };\n }\n },\n };\n\n const click: AgentTool<typeof BrowserClickSchema, { ok: boolean }> = {\n name: 'browser_click',\n label: '🖱️ Browser Click',\n description:\n 'Click an element. Provide exactly one targeting mode: `selector` (CSS), `text` (visible text), or `role` (e.g. `button:Submit`).',\n parameters: BrowserClickSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n try {\n const loc = resolveClickLocator(page, params);\n await loc.click({ timeout: 15_000 });\n return {\n content: [{ type: 'text', text: 'Click succeeded.' }],\n details: { ok: true },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Click failed: ${msg}` }],\n details: { ok: false },\n };\n }\n },\n };\n\n const typeTool: AgentTool<typeof BrowserTypeSchema, { ok: boolean }> = {\n name: 'browser_type',\n label: '⌨️ Browser Type',\n description:\n 'Type into an input. Provide exactly one of `selector` or `label` (associated label text). Optional `pressEnter` to submit.',\n parameters: BrowserTypeSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n try {\n const loc = resolveTypeLocator(page, params);\n await loc.clear({ timeout: 5000 }).catch(() => {});\n await loc.fill(params.text, { timeout: 15_000 });\n if (params.pressEnter) {\n await page.keyboard.press('Enter');\n }\n return {\n content: [{ type: 'text', text: 'Typed into field.' }],\n details: { ok: true },\n };\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Type failed: ${msg}` }],\n details: { ok: false },\n };\n }\n },\n };\n\n const scroll: AgentTool<typeof BrowserScrollSchema, { ok: boolean }> = {\n name: 'browser_scroll',\n label: '📜 Browser Scroll',\n description: 'Scroll the page up or down by a pixel amount (default 500).',\n parameters: BrowserScrollSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const amount = params.amount ?? 500;\n const dy = params.direction === 'down' ? amount : -amount;\n await page.evaluate(\n ({ deltaY }) => {\n (globalThis as unknown as { scrollBy: (x: number, y: number) => void }).scrollBy(0, deltaY);\n },\n { deltaY: dy },\n );\n return {\n content: [{ type: 'text', text: `Scrolled ${params.direction} by ${amount}px.` }],\n details: { ok: true },\n };\n },\n };\n\n const screenshot: AgentTool<typeof BrowserScreenshotSchema, Record<string, unknown>> = {\n name: 'browser_screenshot',\n label: '🖼️ Browser Screenshot',\n description:\n 'Take a PNG screenshot of the viewport or a CSS selector. When `agents.defaults.imageModel` is configured, runs vision on the image using `description` as the prompt (default: short UI summary).',\n parameters: BrowserScreenshotSchema,\n\n async execute(_id, params, signal) {\n if (signal?.aborted) {\n throw new Error('aborted');\n }\n const page = await pageFor();\n const cfg = deps.getConfig();\n let buf: Buffer;\n try {\n if (params.selector?.trim()) {\n const loc = page.locator(params.selector.trim()).first();\n await loc.waitFor({ state: 'visible', timeout: 15_000 });\n buf = await loc.screenshot({ type: 'png', timeout: 15_000 });\n } else {\n buf = await page.screenshot({ type: 'png', fullPage: false, timeout: 15_000 });\n }\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `Screenshot failed: ${msg}` }],\n details: { error: msg },\n };\n }\n\n if (buf.length > MAX_SCREENSHOT_BYTES) {\n return {\n content: [\n {\n type: 'text',\n text: `Screenshot too large (${buf.length} bytes, max ${MAX_SCREENSHOT_BYTES}). Try a narrower selector.`,\n },\n ],\n details: { error: 'too_large', bytes: buf.length },\n };\n }\n\n const imageModelConfig = resolveImageModelConfigForTool({ cfg });\n const prompt =\n params.description?.trim() ||\n 'Describe this browser screenshot briefly. Focus on visible text, controls, and actionable UI state.';\n\n if (!imageModelConfig) {\n return {\n content: [\n {\n type: 'text',\n text:\n `Captured PNG screenshot (${buf.length} bytes). Configure agents.defaults.imageModel for automatic visual description.`,\n },\n ],\n details: { bytes: buf.length, vision: false },\n };\n }\n\n try {\n const runResult = await runWithImageModelFallback({\n toolConfig: imageModelConfig,\n modelOverride: undefined,\n run: async (modelRef) => {\n const { text, provider, model } = await describeImages({\n modelRef,\n prompt,\n images: [{ buffer: buf, mimeType: 'image/png' }],\n timeoutMs: 60_000,\n signal,\n });\n return { text, provider, model };\n },\n });\n const { result: inner, attempts } = runResult;\n return buildImageToolTextResult(\n { text: inner.text, provider: inner.provider, model: inner.model, attempts },\n { bytes: buf.length, vision: true },\n );\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [\n {\n type: 'text',\n text: `Screenshot captured (${buf.length} bytes) but vision failed: ${msg}`,\n },\n ],\n details: { bytes: buf.length, visionError: msg },\n };\n }\n },\n };\n\n return [navigate, snapshot, click, typeTool, scroll, screenshot];\n}\n"],"mappings":"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"}
@@ -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 { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
5
5
  import { createReadFileTool } from "./read.js";
6
6
  import { createWriteFileTool } from "./write.js";
@@ -3,9 +3,9 @@ import { applyImageGenerationModelConfigDefaults } from "../image/image-helpers.
3
3
  import { DASHSCOPE_DEFAULT_IMAGE_MODEL, OPENAI_DEFAULT_IMAGE_MODEL } from "../image/generation/constants.js";
4
4
  import { generateImage, listImageGenerationProvidersSummary } from "../image/generation/runtime.js";
5
5
  import path from "node:path";
6
- import { randomBytes } from "node:crypto";
7
6
  import { Type } from "@sinclair/typebox";
8
7
  import { mkdir, writeFile } from "node:fs/promises";
8
+ import { randomBytes } from "node:crypto";
9
9
  //#region src/agent/tools/image-generate-tool.ts
10
10
  const DEFAULT_COUNT = 1;
11
11
  const MAX_COUNT = 4;
@@ -1,6 +1,6 @@
1
1
  import { resolveImageModelConfigForTool } from "../image/tool-model-config.js";
2
2
  import { buildImageToolTextResult, resolvePromptAndModelOverride } from "../image/image-helpers.js";
3
- import { describeImagesWithPiAi } from "../image/describe-images.js";
3
+ import { describeImages } from "../image/understanding/runtime.js";
4
4
  import { runWithImageModelFallback } from "../image/image-model-fallback.js";
5
5
  import { loadImageForToolInput } from "../image/load-image-media.js";
6
6
  import { Type } from "@sinclair/typebox";
@@ -121,7 +121,7 @@ function createImageTool(options) {
121
121
  toolConfig: imageModelConfig,
122
122
  modelOverride,
123
123
  run: async (modelRef) => {
124
- const { text, provider, model } = await describeImagesWithPiAi({
124
+ const { text, provider, model } = await describeImages({
125
125
  modelRef,
126
126
  prompt: promptRaw,
127
127
  images: loadedImages.map((img) => ({
@@ -1 +1 @@
1
- {"version":3,"file":"image-tool.js","names":[],"sources":["../../../../src/agent/tools/image-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@mariozechner/pi-agent-core';\nimport type { Config } from '../../config/schema.js';\nimport { describeImagesWithPiAi } from '../image/describe-images.js';\nimport { buildImageToolTextResult, resolvePromptAndModelOverride } from '../image/image-helpers.js';\nimport { runWithImageModelFallback } from '../image/image-model-fallback.js';\nimport { loadImageForToolInput } from '../image/load-image-media.js';\nimport {\n resolveImageModelConfigForTool,\n type ToolModelConfig,\n} from '../image/tool-model-config.js';\n\nconst DEFAULT_PROMPT = 'Describe the image.';\nconst DEFAULT_MAX_IMAGES = 20;\n\nexport { resolveImageModelConfigForTool } from '../image/tool-model-config.js';\n\nfunction pickMaxBytes(cfg?: Config, maxBytesMb?: number): number {\n if (typeof maxBytesMb === 'number' && Number.isFinite(maxBytesMb) && maxBytesMb > 0) {\n return Math.floor(maxBytesMb * 1024 * 1024);\n }\n const configured = cfg?.agents?.defaults?.mediaMaxMb;\n if (typeof configured === 'number' && Number.isFinite(configured) && configured > 0) {\n return Math.floor(configured * 1024 * 1024);\n }\n return 20 * 1024 * 1024;\n}\n\nexport function createImageTool(options: {\n config?: Config;\n workspace: string;\n /** When true, session model already receives images in the user message. */\n modelHasVision?: boolean;\n}): AgentTool<any, Record<string, unknown>> | null {\n const imageModelConfig = resolveImageModelConfigForTool({ cfg: options.config });\n if (!imageModelConfig) {\n return null;\n }\n\n const description = options.modelHasVision\n ? 'Analyze one or more images with a vision model. Use `image` for a single path/URL, or `images` for multiple (up to 20). Only use when images were NOT already in the user message.'\n : 'Analyze one or more images using the configured image model (agents.defaults.imageModel). Use `image` or `images` for paths/URLs; optional `prompt` for what to extract.';\n\n const localRoots = [options.workspace];\n\n return {\n name: 'image',\n label: 'Image',\n description,\n parameters: Type.Object({\n prompt: Type.Optional(Type.String()),\n image: Type.Optional(Type.String({ description: 'Single image path or URL.' })),\n images: Type.Optional(\n Type.Array(Type.String(), {\n description: 'Multiple image paths or URLs (up to maxImages, default 20).',\n }),\n ),\n model: Type.Optional(Type.String({ description: 'Optional provider/model override.' })),\n maxBytesMb: Type.Optional(Type.Number()),\n maxImages: Type.Optional(Type.Number()),\n }),\n async execute(\n _toolCallId: string,\n args: Record<string, unknown>,\n ): Promise<AgentToolResult<Record<string, unknown>>> {\n const record = args && typeof args === 'object' ? args : {};\n\n const imageCandidates: string[] = [];\n if (typeof record.image === 'string') {\n imageCandidates.push(record.image);\n }\n if (Array.isArray(record.images)) {\n imageCandidates.push(...record.images.filter((v): v is string => typeof v === 'string'));\n }\n\n const seenImages = new Set<string>();\n const imageInputs: string[] = [];\n for (const candidate of imageCandidates) {\n const trimmedCandidate = candidate.trim();\n const normalizedForDedupe = trimmedCandidate.startsWith('@')\n ? trimmedCandidate.slice(1).trim()\n : trimmedCandidate;\n if (!normalizedForDedupe || seenImages.has(normalizedForDedupe)) {\n continue;\n }\n seenImages.add(normalizedForDedupe);\n imageInputs.push(trimmedCandidate);\n }\n\n if (imageInputs.length === 0) {\n return {\n content: [{ type: 'text', text: 'Error: provide `image` or `images`.' }],\n details: { error: 'missing_image' },\n };\n }\n\n const maxImagesRaw = typeof record.maxImages === 'number' ? record.maxImages : undefined;\n const maxImages =\n typeof maxImagesRaw === 'number' && Number.isFinite(maxImagesRaw) && maxImagesRaw > 0\n ? Math.floor(maxImagesRaw)\n : DEFAULT_MAX_IMAGES;\n if (imageInputs.length > maxImages) {\n return {\n content: [\n {\n type: 'text',\n text: `Too many images: ${imageInputs.length} (max ${maxImages}).`,\n },\n ],\n details: { error: 'too_many_images', count: imageInputs.length, max: maxImages },\n };\n }\n\n const { prompt: promptRaw, modelOverride } = resolvePromptAndModelOverride(\n record,\n DEFAULT_PROMPT,\n );\n const maxBytesMb = typeof record.maxBytesMb === 'number' ? record.maxBytesMb : undefined;\n const maxBytes = pickMaxBytes(options.config, maxBytesMb);\n\n const loadedImages: Array<{ buffer: Buffer; mimeType: string; resolvedImage: string }> = [];\n\n for (const imageRawInput of imageInputs) {\n const trimmed = imageRawInput.trim();\n const imageRaw = trimmed.startsWith('@') ? trimmed.slice(1).trim() : trimmed;\n if (!imageRaw) {\n return {\n content: [{ type: 'text', text: 'Error: empty image entry.' }],\n details: { error: 'empty_image' },\n };\n }\n\n const looksLikeWindowsDrivePath = /^[a-zA-Z]:[\\\\/]/.test(imageRaw);\n const hasScheme = /^[a-z][a-z0-9+.-]*:/i.test(imageRaw);\n const isFileUrl = /^file:/i.test(imageRaw);\n const isHttpUrl = /^https?:\\/\\//i.test(imageRaw);\n const isDataUrl = /^data:/i.test(imageRaw);\n if (hasScheme && !looksLikeWindowsDrivePath && !isFileUrl && !isHttpUrl && !isDataUrl) {\n return {\n content: [\n {\n type: 'text',\n text: `Unsupported image reference: ${imageRawInput}. Use a path, file://, data:, or http(s) URL.`,\n },\n ],\n details: { error: 'unsupported_image_reference', image: imageRawInput },\n };\n }\n\n try {\n const media = await loadImageForToolInput(imageRaw, {\n maxBytes,\n workspace: options.workspace,\n localRoots,\n });\n loadedImages.push({\n buffer: media.buffer,\n mimeType: media.mimeType,\n resolvedImage: imageRaw,\n });\n } catch (e) {\n return {\n content: [\n {\n type: 'text',\n text: `Failed to load image (${imageRawInput}): ${e instanceof Error ? e.message : String(e)}`,\n },\n ],\n details: { error: 'load_failed', image: imageRawInput },\n };\n }\n }\n\n const runResult = await runWithImageModelFallback({\n toolConfig: imageModelConfig,\n modelOverride,\n run: async (modelRef) => {\n const { text, provider, model } = await describeImagesWithPiAi({\n modelRef,\n prompt: promptRaw,\n images: loadedImages.map((img) => ({ buffer: img.buffer, mimeType: img.mimeType })),\n timeoutMs: 60_000,\n });\n return { text, provider, model };\n },\n });\n\n const { result: inner, attempts } = runResult;\n const result = {\n text: inner.text,\n provider: inner.provider,\n model: inner.model,\n attempts,\n };\n\n const imageDetails =\n loadedImages.length === 1\n ? { image: loadedImages[0].resolvedImage }\n : {\n images: loadedImages.map((img) => ({ image: img.resolvedImage })),\n };\n\n return buildImageToolTextResult(result, imageDetails);\n },\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"image-tool.js","names":[],"sources":["../../../../src/agent/tools/image-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@mariozechner/pi-agent-core';\nimport type { Config } from '../../config/schema.js';\nimport { describeImages } from '../image/understanding/runtime.js';\nimport { buildImageToolTextResult, resolvePromptAndModelOverride } from '../image/image-helpers.js';\nimport { runWithImageModelFallback } from '../image/image-model-fallback.js';\nimport { loadImageForToolInput } from '../image/load-image-media.js';\nimport {\n resolveImageModelConfigForTool,\n type ToolModelConfig,\n} from '../image/tool-model-config.js';\n\nconst DEFAULT_PROMPT = 'Describe the image.';\nconst DEFAULT_MAX_IMAGES = 20;\n\nexport { resolveImageModelConfigForTool } from '../image/tool-model-config.js';\n\nfunction pickMaxBytes(cfg?: Config, maxBytesMb?: number): number {\n if (typeof maxBytesMb === 'number' && Number.isFinite(maxBytesMb) && maxBytesMb > 0) {\n return Math.floor(maxBytesMb * 1024 * 1024);\n }\n const configured = cfg?.agents?.defaults?.mediaMaxMb;\n if (typeof configured === 'number' && Number.isFinite(configured) && configured > 0) {\n return Math.floor(configured * 1024 * 1024);\n }\n return 20 * 1024 * 1024;\n}\n\nexport function createImageTool(options: {\n config?: Config;\n workspace: string;\n /** When true, session model already receives images in the user message. */\n modelHasVision?: boolean;\n}): AgentTool<any, Record<string, unknown>> | null {\n const imageModelConfig = resolveImageModelConfigForTool({ cfg: options.config });\n if (!imageModelConfig) {\n return null;\n }\n\n const description = options.modelHasVision\n ? 'Analyze one or more images with a vision model. Use `image` for a single path/URL, or `images` for multiple (up to 20). Only use when images were NOT already in the user message.'\n : 'Analyze one or more images using the configured image model (agents.defaults.imageModel). Use `image` or `images` for paths/URLs; optional `prompt` for what to extract.';\n\n const localRoots = [options.workspace];\n\n return {\n name: 'image',\n label: 'Image',\n description,\n parameters: Type.Object({\n prompt: Type.Optional(Type.String()),\n image: Type.Optional(Type.String({ description: 'Single image path or URL.' })),\n images: Type.Optional(\n Type.Array(Type.String(), {\n description: 'Multiple image paths or URLs (up to maxImages, default 20).',\n }),\n ),\n model: Type.Optional(Type.String({ description: 'Optional provider/model override.' })),\n maxBytesMb: Type.Optional(Type.Number()),\n maxImages: Type.Optional(Type.Number()),\n }),\n async execute(\n _toolCallId: string,\n args: Record<string, unknown>,\n ): Promise<AgentToolResult<Record<string, unknown>>> {\n const record = args && typeof args === 'object' ? args : {};\n\n const imageCandidates: string[] = [];\n if (typeof record.image === 'string') {\n imageCandidates.push(record.image);\n }\n if (Array.isArray(record.images)) {\n imageCandidates.push(...record.images.filter((v): v is string => typeof v === 'string'));\n }\n\n const seenImages = new Set<string>();\n const imageInputs: string[] = [];\n for (const candidate of imageCandidates) {\n const trimmedCandidate = candidate.trim();\n const normalizedForDedupe = trimmedCandidate.startsWith('@')\n ? trimmedCandidate.slice(1).trim()\n : trimmedCandidate;\n if (!normalizedForDedupe || seenImages.has(normalizedForDedupe)) {\n continue;\n }\n seenImages.add(normalizedForDedupe);\n imageInputs.push(trimmedCandidate);\n }\n\n if (imageInputs.length === 0) {\n return {\n content: [{ type: 'text', text: 'Error: provide `image` or `images`.' }],\n details: { error: 'missing_image' },\n };\n }\n\n const maxImagesRaw = typeof record.maxImages === 'number' ? record.maxImages : undefined;\n const maxImages =\n typeof maxImagesRaw === 'number' && Number.isFinite(maxImagesRaw) && maxImagesRaw > 0\n ? Math.floor(maxImagesRaw)\n : DEFAULT_MAX_IMAGES;\n if (imageInputs.length > maxImages) {\n return {\n content: [\n {\n type: 'text',\n text: `Too many images: ${imageInputs.length} (max ${maxImages}).`,\n },\n ],\n details: { error: 'too_many_images', count: imageInputs.length, max: maxImages },\n };\n }\n\n const { prompt: promptRaw, modelOverride } = resolvePromptAndModelOverride(\n record,\n DEFAULT_PROMPT,\n );\n const maxBytesMb = typeof record.maxBytesMb === 'number' ? record.maxBytesMb : undefined;\n const maxBytes = pickMaxBytes(options.config, maxBytesMb);\n\n const loadedImages: Array<{ buffer: Buffer; mimeType: string; resolvedImage: string }> = [];\n\n for (const imageRawInput of imageInputs) {\n const trimmed = imageRawInput.trim();\n const imageRaw = trimmed.startsWith('@') ? trimmed.slice(1).trim() : trimmed;\n if (!imageRaw) {\n return {\n content: [{ type: 'text', text: 'Error: empty image entry.' }],\n details: { error: 'empty_image' },\n };\n }\n\n const looksLikeWindowsDrivePath = /^[a-zA-Z]:[\\\\/]/.test(imageRaw);\n const hasScheme = /^[a-z][a-z0-9+.-]*:/i.test(imageRaw);\n const isFileUrl = /^file:/i.test(imageRaw);\n const isHttpUrl = /^https?:\\/\\//i.test(imageRaw);\n const isDataUrl = /^data:/i.test(imageRaw);\n if (hasScheme && !looksLikeWindowsDrivePath && !isFileUrl && !isHttpUrl && !isDataUrl) {\n return {\n content: [\n {\n type: 'text',\n text: `Unsupported image reference: ${imageRawInput}. Use a path, file://, data:, or http(s) URL.`,\n },\n ],\n details: { error: 'unsupported_image_reference', image: imageRawInput },\n };\n }\n\n try {\n const media = await loadImageForToolInput(imageRaw, {\n maxBytes,\n workspace: options.workspace,\n localRoots,\n });\n loadedImages.push({\n buffer: media.buffer,\n mimeType: media.mimeType,\n resolvedImage: imageRaw,\n });\n } catch (e) {\n return {\n content: [\n {\n type: 'text',\n text: `Failed to load image (${imageRawInput}): ${e instanceof Error ? e.message : String(e)}`,\n },\n ],\n details: { error: 'load_failed', image: imageRawInput },\n };\n }\n }\n\n const runResult = await runWithImageModelFallback({\n toolConfig: imageModelConfig,\n modelOverride,\n run: async (modelRef) => {\n const { text, provider, model } = await describeImages({\n modelRef,\n prompt: promptRaw,\n images: loadedImages.map((img) => ({ buffer: img.buffer, mimeType: img.mimeType })),\n timeoutMs: 60_000,\n });\n return { text, provider, model };\n },\n });\n\n const { result: inner, attempts } = runResult;\n const result = {\n text: inner.text,\n provider: inner.provider,\n model: inner.model,\n attempts,\n };\n\n const imageDetails =\n loadedImages.length === 1\n ? { image: loadedImages[0].resolvedImage }\n : {\n images: loadedImages.map((img) => ({ image: img.resolvedImage })),\n };\n\n return buildImageToolTextResult(result, imageDetails);\n },\n };\n}\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export { createReadFileTool, readFileTool, type CreateReadFileToolOptions, } from './read.js';
1
+ export { createReadFileTool, type CreateReadFileToolOptions } from './read.js';
2
2
  export { createWriteFileTool, writeFileTool } from './write.js';
3
3
  export { createEditFileTool, editFileTool, type EditToolDetails } from './edit.js';
4
4
  export { createListDirTool, listDirTool } from './list-dir.js';
@@ -1,5 +1,5 @@
1
1
  import { DEFAULT_MAX_BYTES, DEFAULT_MAX_LINES, GREP_MAX_LINE_LENGTH, formatSize, truncateHead, truncateLine, truncateTail } from "./truncate.js";
2
- import { createReadFileTool, readFileTool } from "./read.js";
2
+ import { createReadFileTool } from "./read.js";
3
3
  import { createWriteFileTool, writeFileTool } from "./write.js";
4
4
  import { fuzzyFindText, generateDiffString, normalizeForFuzzyMatch, normalizeToLF, restoreLineEndings, stripBom } from "./edit-diff.js";
5
5
  import { createEditFileTool, editFileTool } from "./edit.js";
@@ -29,4 +29,4 @@ import { createCronjobTool, scanCronPrompt } from "./cronjob-tool.js";
29
29
  import { createSkillViewTool, createSkillsListTool } from "./skills-tools.js";
30
30
  import { createSkillManageTool } from "./skill-manage-tool.js";
31
31
  import { createImageGenerateTool, resolveImageGenerationModelConfigForTool } from "./image-generate-tool.js";
32
- 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, createBrowserTools, createClarifyTool, createCronjobTool, createCuratedMemoryTool, createDelegateTool, createEditFileTool, createExecuteCodeTool, createFindTool, createGrepTool, createImageGenerateTool, createImageTool, createListDirTool, createMemoryGetTool, createMemorySearchTool, createMessageTool, createReadFileTool, createSendMediaTool, createSessionSearchTool, createShellTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createTodoTool, createWebExtractTool, createWebSearchTool, createWriteFileTool, editFileTool, findTool, formatSize, fuzzyFindText, generateDiffString, grepTool, invalidateSessionSearchIndexCache, listDirTool, normalizeForFuzzyMatch, normalizeToLF, readFileTool, resolveImageGenerationModelConfigForTool, resolveImageModelConfigForTool, restoreLineEndings, scanCronPrompt, stripBom, stripHtmlBoilerplate, truncateHead, truncateLine, truncateTail, webFetchTool, writeFileTool };
32
+ 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, createBrowserTools, createClarifyTool, createCronjobTool, createCuratedMemoryTool, createDelegateTool, createEditFileTool, createExecuteCodeTool, createFindTool, createGrepTool, createImageGenerateTool, createImageTool, createListDirTool, createMemoryGetTool, createMemorySearchTool, createMessageTool, createReadFileTool, createSendMediaTool, createSessionSearchTool, createShellTool, createSkillManageTool, createSkillViewTool, createSkillsListTool, createTodoTool, createWebExtractTool, createWebSearchTool, createWriteFileTool, editFileTool, findTool, formatSize, fuzzyFindText, generateDiffString, grepTool, invalidateSessionSearchIndexCache, listDirTool, normalizeForFuzzyMatch, normalizeToLF, resolveImageGenerationModelConfigForTool, resolveImageModelConfigForTool, restoreLineEndings, scanCronPrompt, stripBom, stripHtmlBoilerplate, truncateHead, truncateLine, truncateTail, webFetchTool, writeFileTool };
@@ -8,6 +8,4 @@ export interface CreateReadFileToolOptions {
8
8
  bootstrapDir?: string;
9
9
  }
10
10
  export declare function createReadFileTool(workspace: string, options?: CreateReadFileToolOptions): AgentTool<typeof ReadFileSchema, {}>;
11
- /** @deprecated Use {@link createReadFileTool}(process.cwd()) — default cwd; prefer factory with workspace. */
12
- export declare const readFileTool: AgentTool<typeof ReadFileSchema, {}>;
13
11
  export {};