@xopcai/xopc 0.0.82 → 0.0.83

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 (704) hide show
  1. package/README.md +1 -1
  2. package/README.zh-CN.md +1 -1
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +2 -3
  5. package/dist/extensions/feishu/src/outbound/media-load.js.map +1 -1
  6. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  7. package/dist/extensions/telegram/src/config-schema.d.ts +6 -6
  8. package/dist/extensions/telegram/src/plugin.d.ts +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  11. package/dist/extensions/telegram/xopc.extension.json +1 -1
  12. package/dist/extensions/weixin/src/api/api.js +3 -3
  13. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  14. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  15. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  16. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  18. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  19. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  20. package/dist/extensions/weixin/src/plugin.js +1 -1
  21. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  22. package/dist/gateway/static/root/assets/agents-CrpYTHJS.js +222 -0
  23. package/dist/gateway/static/root/assets/{apps-page-pJ27dsqn.js → apps-page-1mcKh5Rh.js} +1 -1
  24. package/dist/gateway/static/root/assets/channels-settings-zd6QNKPx.js +1 -0
  25. package/dist/gateway/static/root/assets/{channels-status-swr-D1KYmOmi.js → channels-status-swr-uRAuhiUo.js} +1 -1
  26. package/dist/gateway/static/root/assets/{cron-api-Y2wfSJVI.js → cron-api-O2Q_ruV6.js} +1 -1
  27. package/dist/gateway/static/root/assets/{cron-page-B97KU_RG.js → cron-page-By09AQD-.js} +1 -1
  28. package/dist/gateway/static/root/assets/{dist-CboA_Css.js → dist-BpQxde0t.js} +1 -1
  29. package/dist/gateway/static/root/assets/{extension-debug-page-DN_zNmpo.js → extension-debug-page-CY27wj_p.js} +1 -1
  30. package/dist/gateway/static/root/assets/{extension-page-BUXtOzv5.js → extension-page-C-Ed5ZmP.js} +1 -1
  31. package/dist/gateway/static/root/assets/{extension-settings-page-C2dX4KCW.js → extension-settings-page-raLux7E7.js} +1 -1
  32. package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
  33. package/dist/gateway/static/root/assets/{field-primitives-B9rOLqdm.js → field-primitives-fa_hiQcX.js} +1 -1
  34. package/dist/gateway/static/root/assets/{heartbeat-config-api-DvfiRVrc.js → heartbeat-config-api-BVl5VHvL.js} +1 -1
  35. package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
  36. package/dist/gateway/static/root/assets/{index-DQuaMye9.js → index-Y-iqo-gL.js} +94 -85
  37. package/dist/gateway/static/root/assets/{logs-page-BQuBpHcc.js → logs-page-BdH2n7ZW.js} +1 -1
  38. package/dist/gateway/static/root/assets/sessions-page-Vpchzdp-.js +1 -0
  39. package/dist/gateway/static/root/assets/{settings-form-section-2Yu-FASs.js → settings-form-section-Kk1yAGBl.js} +1 -1
  40. package/dist/gateway/static/root/assets/settings-page-KBm0u6Dz.js +3 -0
  41. package/dist/gateway/static/root/assets/skills-page-BjeXXaOn.js +2 -0
  42. package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
  43. package/dist/gateway/static/root/assets/{utils-D2Gn2qod.js → utils-DpTxN4AF.js} +1 -1
  44. package/dist/gateway/static/root/assets/voice-api-key-field-CwO8Cf01.js +1 -0
  45. package/dist/gateway/static/root/index.html +4 -4
  46. package/dist/package.js +1 -1
  47. package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
  48. package/dist/src/agent/agent-instance-gateway.js +1 -0
  49. package/dist/src/agent/agent-manager.d.ts +20 -14
  50. package/dist/src/agent/agent-manager.js +74 -186
  51. package/dist/src/agent/agent-manager.js.map +1 -1
  52. package/dist/src/agent/background-review/coordinator.d.ts +61 -0
  53. package/dist/src/agent/background-review/coordinator.js +120 -0
  54. package/dist/src/agent/background-review/coordinator.js.map +1 -0
  55. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  56. package/dist/src/agent/child-agent-factory.d.ts +14 -0
  57. package/dist/src/agent/child-agent-factory.js +2 -8
  58. package/dist/src/agent/child-agent-factory.js.map +1 -1
  59. package/dist/src/agent/context/workspace-seed.js +3 -3
  60. package/dist/src/agent/embedded/index.d.ts +1 -2
  61. package/dist/src/agent/embedded/index.js +2 -3
  62. package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
  63. package/dist/src/agent/embedded/run-for-session.js.map +1 -1
  64. package/dist/src/agent/embedded/runs.d.ts +32 -0
  65. package/dist/src/agent/embedded/runs.js +79 -19
  66. package/dist/src/agent/embedded/runs.js.map +1 -1
  67. package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
  68. package/dist/src/agent/embedded/session-manager-cache.js +32 -11
  69. package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
  70. package/dist/src/agent/embedded/session-runner.d.ts +37 -7
  71. package/dist/src/agent/embedded/session-runner.js +184 -153
  72. package/dist/src/agent/embedded/session-runner.js.map +1 -1
  73. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
  74. package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
  75. package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
  76. package/dist/src/agent/goals/goal-run-store.js +4 -4
  77. package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
  78. package/dist/src/agent/goals/persistent-goal-service.js +139 -0
  79. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
  80. package/dist/src/agent/goals/post-turn.js +2 -2
  81. package/dist/src/agent/goals/state.d.ts +1 -1
  82. package/dist/src/agent/goals/state.js.map +1 -1
  83. package/dist/src/agent/image/load-image-media.js +1 -1
  84. package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
  85. package/dist/src/agent/inbound/inbound-loop.js +226 -0
  86. package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
  87. package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
  88. package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
  89. package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
  90. package/dist/src/agent/ipc/bus.js +1 -1
  91. package/dist/src/agent/ipc/inbox.js +2 -2
  92. package/dist/src/agent/ipc/socket.js +1 -1
  93. package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
  94. package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
  95. package/dist/src/agent/lifecycle/manager.d.ts +1 -1
  96. package/dist/src/agent/lifecycle/manager.js.map +1 -1
  97. package/dist/src/agent/lifecycle/types.d.ts +1 -1
  98. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  99. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  100. package/dist/src/agent/memory/dreaming/events.js +1 -1
  101. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  102. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  103. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  104. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  105. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  106. package/dist/src/agent/memory/dreaming/utils.d.ts +12 -2
  107. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  108. package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
  109. package/dist/src/agent/memory/index.js +3 -3
  110. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  111. package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
  112. package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
  113. package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
  114. package/dist/src/agent/messaging/command-handler.d.ts +5 -1
  115. package/dist/src/agent/messaging/command-handler.js +24 -96
  116. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  117. package/dist/src/agent/messaging/index.d.ts +1 -0
  118. package/dist/src/agent/messaging/index.js +2 -1
  119. package/dist/src/agent/messaging/message-router.d.ts +1 -1
  120. package/dist/src/agent/messaging/message-router.js.map +1 -1
  121. package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
  122. package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
  123. package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
  124. package/dist/src/agent/models/manager.js +1 -1
  125. package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
  126. package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
  127. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  128. package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
  129. package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
  130. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  131. package/dist/src/agent/orchestration/index.d.ts +1 -1
  132. package/dist/src/agent/orchestration/index.js +2 -2
  133. package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
  134. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  135. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  136. package/dist/src/agent/sandbox/path-policy.js +1 -1
  137. package/dist/src/agent/service/async-queue.d.ts +20 -0
  138. package/dist/src/agent/service/async-queue.js +53 -0
  139. package/dist/src/agent/service/async-queue.js.map +1 -0
  140. package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
  141. package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
  142. package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
  143. package/dist/src/agent/service/direct-turn-helpers.js +90 -0
  144. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
  145. package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
  146. package/dist/src/agent/service/process-direct-one-shot.js +17 -34
  147. package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
  148. package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
  149. package/dist/src/agent/service/process-direct-streaming.js +122 -168
  150. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  151. package/dist/src/agent/service/webchat-tts.d.ts +2 -2
  152. package/dist/src/agent/service/webchat-tts.js +1 -1
  153. package/dist/src/agent/service/webchat-tts.js.map +1 -1
  154. package/dist/src/agent/service.d.ts +62 -167
  155. package/dist/src/agent/service.js +177 -786
  156. package/dist/src/agent/service.js.map +1 -1
  157. package/dist/src/agent/session/index.d.ts +4 -0
  158. package/dist/src/agent/session/index.js +5 -1
  159. package/dist/src/agent/session/session-config-service.d.ts +68 -0
  160. package/dist/src/agent/session/session-config-service.js +172 -0
  161. package/dist/src/agent/session/session-config-service.js.map +1 -0
  162. package/dist/src/agent/session/session-context.d.ts +27 -19
  163. package/dist/src/agent/session/session-context.js +39 -24
  164. package/dist/src/agent/session/session-context.js.map +1 -1
  165. package/dist/src/agent/session/session-hydrator.d.ts +42 -0
  166. package/dist/src/agent/session/session-hydrator.js +66 -0
  167. package/dist/src/agent/session/session-hydrator.js.map +1 -0
  168. package/dist/src/agent/session/session-inspector.d.ts +80 -0
  169. package/dist/src/agent/session/session-inspector.js +119 -0
  170. package/dist/src/agent/session/session-inspector.js.map +1 -0
  171. package/dist/src/agent/session/session-state-bag.d.ts +83 -0
  172. package/dist/src/agent/session/session-state-bag.js +192 -0
  173. package/dist/src/agent/session/session-state-bag.js.map +1 -0
  174. package/dist/src/agent/skills/config.js +1 -1
  175. package/dist/src/agent/skills/hub-hash.js +2 -2
  176. package/dist/src/agent/skills/hub-lock.js +1 -1
  177. package/dist/src/agent/skills/hub-pull.js +2 -2
  178. package/dist/src/agent/skills/index.d.ts +0 -2
  179. package/dist/src/agent/skills/index.js +3 -5
  180. package/dist/src/agent/skills/index.js.map +1 -1
  181. package/dist/src/agent/skills/managed-store.js +1 -1
  182. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
  183. package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
  184. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
  185. package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
  186. package/dist/src/agent/skills/scanner.js +1 -1
  187. package/dist/src/agent/skills/skill-manage-ops.js +2 -2
  188. package/dist/src/agent/skills/skill-manager.js +1 -1
  189. package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
  190. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
  191. package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
  192. package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
  193. package/dist/src/agent/tools/delegate-tool.js +2 -1
  194. package/dist/src/agent/tools/delegate-tool.js.map +1 -1
  195. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  196. package/dist/src/agent/tools/executor.d.ts +34 -15
  197. package/dist/src/agent/tools/executor.js +44 -79
  198. package/dist/src/agent/tools/executor.js.map +1 -1
  199. package/dist/src/agent/tools/factory.d.ts +6 -0
  200. package/dist/src/agent/tools/factory.js +63 -4
  201. package/dist/src/agent/tools/factory.js.map +1 -1
  202. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  203. package/dist/src/agent/tools/send-media.js +1 -1
  204. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  205. package/dist/src/agent/tools/skills-tools.js +1 -1
  206. package/dist/src/agent/tools/tts-tool.js +1 -1
  207. package/dist/src/agent/tools/write.js +1 -1
  208. package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
  209. package/dist/src/agent/workspace-runtime/registry.js +59 -0
  210. package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
  211. package/dist/src/auth/credentials.js +3 -3
  212. package/dist/src/auth/profiles/store.js +1 -1
  213. package/dist/src/auth/sync-provider-auth.js +1 -1
  214. package/dist/src/browser/cdp-local-launcher.js +4 -3
  215. package/dist/src/browser/cdp-local-launcher.js.map +1 -1
  216. package/dist/src/browser/index.d.ts +1 -0
  217. package/dist/src/browser/index.js +2 -1
  218. package/dist/src/browser/manager.js +3 -2
  219. package/dist/src/browser/manager.js.map +1 -1
  220. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  221. package/dist/src/browser/providers/browser-use.js +2 -1
  222. package/dist/src/browser/providers/browser-use.js.map +1 -1
  223. package/dist/src/browser/providers/browserbase.js +2 -1
  224. package/dist/src/browser/providers/browserbase.js.map +1 -1
  225. package/dist/src/browser/providers/cloakbrowser.js +7 -6
  226. package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
  227. package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
  228. package/dist/src/browser/providers/playwright-doctor.js +7 -3
  229. package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
  230. package/dist/src/browser/readiness.d.ts +33 -0
  231. package/dist/src/browser/readiness.js +138 -0
  232. package/dist/src/browser/readiness.js.map +1 -0
  233. package/dist/src/browser/stealth.js +2 -2
  234. package/dist/src/channels/attachments/inbound-persist.js +1 -1
  235. package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
  236. package/dist/src/channels/channel-domain.d.ts +1 -1
  237. package/dist/src/channels/config-helpers.d.ts +1 -1
  238. package/dist/src/channels/config-helpers.js.map +1 -1
  239. package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
  240. package/dist/src/channels/heartbeat-scheduler.js +94 -0
  241. package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
  242. package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
  243. package/dist/src/channels/lifecycle-supervisor.js +263 -0
  244. package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
  245. package/dist/src/channels/manager.d.ts +34 -68
  246. package/dist/src/channels/manager.js +107 -477
  247. package/dist/src/channels/manager.js.map +1 -1
  248. package/dist/src/channels/outbound/deliver.d.ts +1 -1
  249. package/dist/src/channels/outbound/deliver.js.map +1 -1
  250. package/dist/src/channels/outbound/persist-store.js +1 -1
  251. package/dist/src/channels/outbound-sender.d.ts +51 -0
  252. package/dist/src/channels/outbound-sender.js +125 -0
  253. package/dist/src/channels/outbound-sender.js.map +1 -0
  254. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  255. package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
  256. package/dist/src/channels/pairing/pairing-service.js.map +1 -1
  257. package/dist/src/channels/pairing/pairing-store.js +2 -2
  258. package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
  259. package/dist/src/channels/pairing/pairing-types.js +1 -0
  260. package/dist/src/channels/plugin-registry.d.ts +22 -0
  261. package/dist/src/channels/plugin-registry.js +44 -0
  262. package/dist/src/channels/plugin-registry.js.map +1 -0
  263. package/dist/src/channels/plugin-types.d.ts +1 -1
  264. package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
  265. package/dist/src/channels/security-helpers.d.ts +1 -1
  266. package/dist/src/channels/security-helpers.js.map +1 -1
  267. package/dist/src/channels/setup-wizard.d.ts +1 -1
  268. package/dist/src/chat-commands/builtins/config.js +2 -2
  269. package/dist/src/chat-commands/context.js +1 -1
  270. package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
  271. package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
  272. package/dist/src/cli/commands/agent.js +4 -4
  273. package/dist/src/cli/commands/agent.js.map +1 -1
  274. package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
  275. package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
  276. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  277. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  278. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  279. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  280. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  281. package/dist/src/cli/commands/extension-dev.js +2 -2
  282. package/dist/src/cli/commands/extension-dev.js.map +1 -1
  283. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  284. package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
  285. package/dist/src/cli/commands/extension-pack.js +1 -1
  286. package/dist/src/cli/commands/gateway/call.js +1 -1
  287. package/dist/src/cli/commands/gateway/call.js.map +1 -1
  288. package/dist/src/cli/commands/gateway/health.js +1 -1
  289. package/dist/src/cli/commands/gateway/health.js.map +1 -1
  290. package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
  291. package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
  292. package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
  293. package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
  294. package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
  295. package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
  296. package/dist/src/cli/commands/gateway/logs.js +1 -1
  297. package/dist/src/cli/commands/gateway/logs.js.map +1 -1
  298. package/dist/src/cli/commands/gateway/probe.js +1 -1
  299. package/dist/src/cli/commands/gateway/probe.js.map +1 -1
  300. package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
  301. package/dist/src/cli/commands/gateway/restart-health.js +45 -1
  302. package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
  303. package/dist/src/cli/commands/gateway/restart.js +3 -3
  304. package/dist/src/cli/commands/gateway/restart.js.map +1 -1
  305. package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
  306. package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
  307. package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
  308. package/dist/src/cli/commands/gateway/service.js +1 -1
  309. package/dist/src/cli/commands/gateway/service.js.map +1 -1
  310. package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
  311. package/dist/src/cli/commands/gateway/shared.js +54 -0
  312. package/dist/src/cli/commands/gateway/shared.js.map +1 -0
  313. package/dist/src/cli/commands/gateway/status.js +1 -1
  314. package/dist/src/cli/commands/gateway/status.js.map +1 -1
  315. package/dist/src/cli/commands/gateway/stop.js +2 -2
  316. package/dist/src/cli/commands/gateway/stop.js.map +1 -1
  317. package/dist/src/cli/commands/gateway/token.js +1 -1
  318. package/dist/src/cli/commands/gateway/token.js.map +1 -1
  319. package/dist/src/cli/commands/gateway.js +5 -5
  320. package/dist/src/cli/commands/gateway.js.map +1 -1
  321. package/dist/src/cli/commands/image.js +2 -2
  322. package/dist/src/cli/commands/image.js.map +1 -1
  323. package/dist/src/cli/commands/init.js +4 -4
  324. package/dist/src/cli/commands/models.js +1 -1
  325. package/dist/src/cli/commands/models.js.map +1 -1
  326. package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
  327. package/dist/src/cli/commands/onboard/gateway.js +48 -49
  328. package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
  329. package/dist/src/cli/commands/onboard.js +9 -64
  330. package/dist/src/cli/commands/onboard.js.map +1 -1
  331. package/dist/src/cli/commands/session/utils.js +1 -1
  332. package/dist/src/cli/commands/session/utils.js.map +1 -1
  333. package/dist/src/cli/commands/skills.js +1 -1
  334. package/dist/src/cli/commands/tailscale.js +1 -1
  335. package/dist/src/cli/commands/tailscale.js.map +1 -1
  336. package/dist/src/cli/context.d.ts +20 -0
  337. package/dist/src/cli/context.js +23 -0
  338. package/dist/src/cli/context.js.map +1 -0
  339. package/dist/src/cli/extension-cli-register.js +3 -3
  340. package/dist/src/cli/gateway-run-argv.js +1 -4
  341. package/dist/src/cli/gateway-run-argv.js.map +1 -1
  342. package/dist/src/cli/gateway-run-fast-path.js +1 -1
  343. package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
  344. package/dist/src/cli/index.d.ts +1 -7
  345. package/dist/src/cli/index.js +4 -6
  346. package/dist/src/cli/index.js.map +1 -1
  347. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  348. package/dist/src/config/commands.flags.d.ts +3 -0
  349. package/dist/src/config/commands.flags.js +11 -0
  350. package/dist/src/config/commands.flags.js.map +1 -0
  351. package/dist/src/config/index.d.ts +1 -0
  352. package/dist/src/config/index.js +6 -5
  353. package/dist/src/config/index.js.map +1 -1
  354. package/dist/src/config/loader.js +2 -2
  355. package/dist/src/config/models-json.js +2 -2
  356. package/dist/src/config/profile.js +2 -2
  357. package/dist/src/config/schema.d.ts +11 -4
  358. package/dist/src/config/schema.js +13 -12
  359. package/dist/src/config/schema.js.map +1 -1
  360. package/dist/src/config/workspace-path-helpers.d.ts +15 -0
  361. package/dist/src/config/workspace-path-helpers.js +14 -0
  362. package/dist/src/config/workspace-path-helpers.js.map +1 -0
  363. package/dist/src/cron/executor.js +4 -4
  364. package/dist/src/cron/executor.js.map +1 -1
  365. package/dist/src/cron/persistence.js +1 -1
  366. package/dist/src/cron/run-log-store.js +1 -1
  367. package/dist/src/daemon/index.d.ts +0 -1
  368. package/dist/src/daemon/index.js +1 -2
  369. package/dist/src/daemon/install-plan.js +3 -2
  370. package/dist/src/daemon/install-plan.js.map +1 -1
  371. package/dist/src/daemon/launchd.js +2 -2
  372. package/dist/src/daemon/systemd.js +2 -2
  373. package/dist/src/daemon/types.d.ts +0 -6
  374. package/dist/src/extensions/api.d.ts +1 -1
  375. package/dist/src/extensions/api.js +2 -2
  376. package/dist/src/extensions/api.js.map +1 -1
  377. package/dist/src/extensions/bundle-mcp.js +1 -1
  378. package/dist/src/extensions/discover-extensions.js +1 -1
  379. package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
  380. package/dist/src/extensions/extension-registry-impl.js +117 -0
  381. package/dist/src/extensions/extension-registry-impl.js.map +1 -0
  382. package/dist/src/extensions/health.js +1 -1
  383. package/dist/src/extensions/index.js +3 -2
  384. package/dist/src/extensions/loader.d.ts +3 -43
  385. package/dist/src/extensions/loader.js +3 -110
  386. package/dist/src/extensions/loader.js.map +1 -1
  387. package/dist/src/extensions/lockfile.js +2 -2
  388. package/dist/src/extensions/sdk/index.js +2 -1
  389. package/dist/src/extensions/sdk/index.js.map +1 -1
  390. package/dist/src/extensions/types/events.d.ts +7 -1
  391. package/dist/src/gateway/agents-admin.js +2 -2
  392. package/dist/src/gateway/file-path-classifier.js +2 -2
  393. package/dist/src/gateway/heartbeat/service.js +2 -2
  394. package/dist/src/gateway/heartbeat/service.js.map +1 -1
  395. package/dist/src/gateway/hono/app.js +5 -53
  396. package/dist/src/gateway/hono/app.js.map +1 -1
  397. package/dist/src/gateway/hono/lib/extension-store.js +1 -1
  398. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  399. package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
  400. package/dist/src/gateway/hono/middleware/auth.js +89 -126
  401. package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
  402. package/dist/src/gateway/hono/middleware/logger.js +1 -1
  403. package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
  404. package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
  405. package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
  406. package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
  407. package/dist/src/gateway/hono/oauth.js +1 -1
  408. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
  409. package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
  410. package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
  411. package/dist/src/gateway/hono/routes/browser.js +626 -0
  412. package/dist/src/gateway/hono/routes/browser.js.map +1 -0
  413. package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
  414. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  415. package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
  416. package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
  417. package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
  418. package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
  419. package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
  420. package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
  421. package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
  422. package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
  423. package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
  424. package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
  425. package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
  426. package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
  427. package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
  428. package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
  429. package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
  430. package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
  431. package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
  432. package/dist/src/gateway/hono/routes/config.js +20 -1764
  433. package/dist/src/gateway/hono/routes/config.js.map +1 -1
  434. package/dist/src/gateway/hono/routes/dreaming.js +2 -3
  435. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  436. package/dist/src/gateway/hono/routes/host-fs.js +1 -1
  437. package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
  438. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  439. package/dist/src/gateway/hono/routes/mcp.js +1 -2
  440. package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
  441. package/dist/src/gateway/hono/routes/models.js +1 -1
  442. package/dist/src/gateway/hono/routes/sessions.js +32 -32
  443. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  444. package/dist/src/gateway/hono/routes/shares.js +4 -4
  445. package/dist/src/gateway/hono/routes/shares.js.map +1 -1
  446. package/dist/src/gateway/hono/routes/tunnel.js +1 -1
  447. package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
  448. package/dist/src/gateway/hono/routes/workspace.js +6 -7
  449. package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
  450. package/dist/src/gateway/hono/sse.js +2 -2
  451. package/dist/src/gateway/index.d.ts +1 -1
  452. package/dist/src/gateway/index.js +4 -2
  453. package/dist/src/gateway/lock.js +3 -3
  454. package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
  455. package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
  456. package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
  457. package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
  458. package/dist/src/gateway/rate-limit/buckets.js +143 -0
  459. package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
  460. package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
  461. package/dist/src/gateway/rate-limit/env-flags.js +16 -0
  462. package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
  463. package/dist/src/gateway/rate-limit/index.d.ts +3 -0
  464. package/dist/src/gateway/rate-limit/index.js +4 -0
  465. package/dist/src/gateway/run-loop.d.ts +1 -1
  466. package/dist/src/gateway/run-loop.js +24 -4
  467. package/dist/src/gateway/run-loop.js.map +1 -1
  468. package/dist/src/gateway/runtime-config.js +2 -1
  469. package/dist/src/gateway/runtime-config.js.map +1 -1
  470. package/dist/src/gateway/security/audit.js +2 -1
  471. package/dist/src/gateway/security/audit.js.map +1 -1
  472. package/dist/src/gateway/security/index.d.ts +0 -1
  473. package/dist/src/gateway/security/index.js +1 -2
  474. package/dist/src/gateway/security/loopback.d.ts +13 -0
  475. package/dist/src/gateway/security/loopback.js +45 -0
  476. package/dist/src/gateway/security/loopback.js.map +1 -0
  477. package/dist/src/gateway/service/agent-runner.d.ts +108 -0
  478. package/dist/src/gateway/service/agent-runner.js +184 -0
  479. package/dist/src/gateway/service/agent-runner.js.map +1 -0
  480. package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
  481. package/dist/src/gateway/service/config-coordinator.js +351 -0
  482. package/dist/src/gateway/service/config-coordinator.js.map +1 -0
  483. package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
  484. package/dist/src/gateway/service/marketplace-service.js +239 -0
  485. package/dist/src/gateway/service/marketplace-service.js.map +1 -0
  486. package/dist/src/gateway/service/run-gateway-agent.js +5 -5
  487. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  488. package/dist/src/gateway/service/sessions-api.d.ts +125 -0
  489. package/dist/src/gateway/service/sessions-api.js +135 -0
  490. package/dist/src/gateway/service/sessions-api.js.map +1 -0
  491. package/dist/src/gateway/service.d.ts +30 -360
  492. package/dist/src/gateway/service.js +121 -903
  493. package/dist/src/gateway/service.js.map +1 -1
  494. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  495. package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
  496. package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
  497. package/dist/src/heartbeat/index.js +1 -1
  498. package/dist/src/infra/gateway-process-argv.d.ts +4 -0
  499. package/dist/src/infra/gateway-process-argv.js +26 -0
  500. package/dist/src/infra/gateway-process-argv.js.map +1 -0
  501. package/dist/src/infra/gateway-processes.d.ts +5 -0
  502. package/dist/src/infra/gateway-processes.js +65 -0
  503. package/dist/src/infra/gateway-processes.js.map +1 -0
  504. package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
  505. package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
  506. package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
  507. package/dist/src/infra/rate-limit/index.d.ts +5 -0
  508. package/dist/src/infra/rate-limit/index.js +3 -0
  509. package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
  510. package/dist/src/infra/rate-limit/keyed-store.js +44 -0
  511. package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
  512. package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
  513. package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
  514. package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
  515. package/dist/src/infra/restart.d.ts +21 -0
  516. package/dist/src/infra/restart.js +122 -0
  517. package/dist/src/infra/restart.js.map +1 -0
  518. package/dist/src/infra/update-check.js +1 -1
  519. package/dist/src/infra/update-lock.js +3 -3
  520. package/dist/src/infra/update-runner.js +1 -1
  521. package/dist/src/infra/update-startup.js +2 -2
  522. package/dist/src/infra/write-file-atomic.js +2 -2
  523. package/dist/src/mcp/channel-bridge.d.ts +0 -6
  524. package/dist/src/mcp/channel-bridge.js +1 -5
  525. package/dist/src/mcp/channel-bridge.js.map +1 -1
  526. package/dist/src/media-shared/http/ssrf-guard.js +1 -1
  527. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  528. package/dist/src/providers/index.js +2 -2
  529. package/dist/src/providers/model-registry.js +1 -1
  530. package/dist/src/session/config-store.js +2 -2
  531. package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
  532. package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
  533. package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
  534. package/dist/src/session/parity/sessions-json-file.js +1 -1
  535. package/dist/src/session/parity/transcript-file-lock.js +2 -2
  536. package/dist/src/session/parity/transcript-paths.js +1 -1
  537. package/dist/src/session/search-index-cache.js +1 -1
  538. package/dist/src/session/search-index.js +1 -1
  539. package/dist/src/session/session-title.js +1 -1
  540. package/dist/src/session/store.js +5 -5
  541. package/dist/src/share/share-rate-limit.d.ts +10 -2
  542. package/dist/src/share/share-rate-limit.js +33 -42
  543. package/dist/src/share/share-rate-limit.js.map +1 -1
  544. package/dist/src/share/share-store.js +3 -3
  545. package/dist/src/tui/backends/embedded-backend.js +16 -12
  546. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  547. package/dist/src/tui/clipboard-image.js +2 -2
  548. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  549. package/dist/src/tui/format-tui-hotkeys.js +1 -1
  550. package/dist/src/tui/theme-manager.js +1 -1
  551. package/dist/src/tui/tui-keybindings-file.js +1 -1
  552. package/dist/src/tui/tui-scoped-models.js +1 -1
  553. package/dist/src/tui/tui-settings.js +1 -1
  554. package/dist/src/tui/tui-skills-autocomplete.js +1 -1
  555. package/dist/src/tui/tui.js +1 -2
  556. package/dist/src/tui/tui.js.map +1 -1
  557. package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
  558. package/dist/src/tui/xopc-tui-keybindings.js +1 -2
  559. package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
  560. package/dist/src/tunnel/frpc-binary.js +2 -2
  561. package/dist/src/tunnel/frpc-config.js +1 -1
  562. package/dist/src/tunnel/frpc-extract.js +1 -1
  563. package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
  564. package/dist/src/tunnel/pairing-rate-limit.js +19 -15
  565. package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
  566. package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
  567. package/dist/src/tunnel/tunnel-rate-limit.js +11 -22
  568. package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
  569. package/dist/src/tunnel/tunnel-state.js +1 -1
  570. package/dist/src/utils/logger/audit.js +1 -1
  571. package/dist/src/utils/logger/log-store.js +1 -1
  572. package/dist/src/utils/logger/rotation.js +1 -1
  573. package/dist/src/utils/logger/stats.d.ts +1 -1
  574. package/dist/src/voice/tts/audio.js +1 -1
  575. package/dist/src/voice/tts/factory.js +1 -1
  576. package/dist/src/voice/tts/index.js +2 -2
  577. package/dist/src/voice/tts/merge-config.js +1 -1
  578. package/dist/src/voice/tts/providers/edge-speech.js +1 -1
  579. package/dist/src/voice/tts/service.js +1 -1
  580. package/dist/src/voice/tts/service.js.map +1 -1
  581. package/dist/src/voice/tts/speak-core.js +1 -1
  582. package/package.json +10 -5
  583. package/dist/gateway/static/root/assets/agents-Cqh1ts38.js +0 -222
  584. package/dist/gateway/static/root/assets/channels-settings-wTiWStg9.js +0 -1
  585. package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
  586. package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
  587. package/dist/gateway/static/root/assets/sessions-page-BeiFm0Ms.js +0 -1
  588. package/dist/gateway/static/root/assets/settings-page-RPAz_Wg_.js +0 -3
  589. package/dist/gateway/static/root/assets/skills-page-Wu4aNWDx.js +0 -2
  590. package/dist/gateway/static/root/assets/voice-api-key-field-BxIGhhEL.js +0 -1
  591. package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
  592. package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
  593. package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
  594. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
  595. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
  596. package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
  597. package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
  598. package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
  599. package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
  600. package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
  601. package/dist/src/daemon/launchd-restart-handoff.js +0 -132
  602. package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
  603. package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
  604. package/dist/src/gateway/auth-rate-limit.js +0 -192
  605. package/dist/src/gateway/auth-rate-limit.js.map +0 -1
  606. package/dist/src/gateway/restart-handler.d.ts +0 -14
  607. package/dist/src/gateway/restart-handler.js +0 -64
  608. package/dist/src/gateway/restart-handler.js.map +0 -1
  609. package/dist/src/gateway/security/flood-guard.d.ts +0 -28
  610. package/dist/src/gateway/security/flood-guard.js +0 -42
  611. package/dist/src/gateway/security/flood-guard.js.map +0 -1
  612. package/dist/src/infra/rate-limit.d.ts +0 -38
  613. package/dist/src/infra/rate-limit.js +0 -60
  614. package/dist/src/infra/rate-limit.js.map +0 -1
  615. package/dist/src/infra/restart-intent.d.ts +0 -13
  616. package/dist/src/infra/restart-intent.js +0 -40
  617. package/dist/src/infra/restart-intent.js.map +0 -1
  618. package/dist/src/infra/restart-sentinel.d.ts +0 -23
  619. package/dist/src/infra/restart-sentinel.js +0 -75
  620. package/dist/src/infra/restart-sentinel.js.map +0 -1
  621. package/skills/creative/canvas-design/LICENSE.txt +0 -202
  622. package/skills/creative/canvas-design/SKILL-zh.md +0 -130
  623. package/skills/creative/canvas-design/SKILL.md +0 -130
  624. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
  625. package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
  626. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
  627. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
  628. package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
  629. package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
  630. package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
  631. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
  632. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
  633. package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
  634. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
  635. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
  636. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
  637. package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
  638. package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
  639. package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
  640. package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
  641. package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
  642. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
  643. package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
  644. package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
  645. package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
  646. package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
  647. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
  648. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
  649. package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
  650. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
  651. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
  652. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
  653. package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
  654. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
  655. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
  656. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
  657. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
  658. package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
  659. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
  660. package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
  661. package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
  662. package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
  663. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
  664. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
  665. package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
  666. package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
  667. package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
  668. package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
  669. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
  670. package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
  671. package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
  672. package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
  673. package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
  674. package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
  675. package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
  676. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
  677. package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
  678. package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
  679. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
  680. package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
  681. package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
  682. package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
  683. package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
  684. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
  685. package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
  686. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
  687. package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
  688. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
  689. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
  690. package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
  691. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
  692. package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
  693. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
  694. package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
  695. package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
  696. package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
  697. package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
  698. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
  699. package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
  700. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
  701. package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
  702. package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
  703. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
  704. package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"delegate-tool.js","names":[],"sources":["../../../../src/agent/tools/delegate-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport { createDelegateChildHandle, type DelegateChildHandleOptions } from '../child-agent-factory.js';\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport const DEFAULT_DELEGATE_TOOLS = [\n 'shell',\n 'read_file',\n 'write_file',\n 'edit_file',\n 'grep',\n 'find',\n 'list_dir',\n 'web_search',\n 'web_fetch',\n] as const;\n\n/** Tools never passed to a delegated sub-agent (even if requested). */\nexport const DELEGATE_BLOCKED_TOOLS = new Set([\n 'delegate_task',\n 'clarify',\n 'curated_memory',\n 'send_message',\n 'send_media',\n 'todo',\n 'session_search',\n 'memory_search',\n 'memory_get',\n 'cronjob',\n 'skills_list',\n 'skill_view',\n 'skill_manage',\n 'bundle-mcp',\n]);\n\nconst DelegateTaskSchema = Type.Object({\n goal: Type.String({\n description: 'Clear description of what the sub-agent should accomplish',\n }),\n context: Type.Optional(\n Type.String({\n description: 'Additional context the sub-agent needs (file paths, constraints, etc.)',\n }),\n ),\n toolset: Type.Optional(\n Type.Array(Type.String(), {\n description:\n 'Tool names the sub-agent may use. Defaults to shell, read_file, write_file, edit_file, grep, find, list_dir, web_search, web_fetch. ' +\n 'Dangerous or interactive tools are always removed.',\n }),\n ),\n maxIterations: Type.Optional(\n Type.Number({\n description: 'Maximum tool executions in the sub-agent (default: 30)',\n default: DEFAULT_MAX_ITERATIONS,\n }),\n ),\n});\n\nexport interface DelegateToolDeps {\n workspace: string;\n getSubagentModel: () => import('@earendil-works/pi-ai').Model<import('@earendil-works/pi-ai').Api>;\n bus: import('../../infra/bus/index.js').MessageBus;\n getConfig: () => import('../../config/schema.js').Config | undefined;\n getCurrentContext?: () => { sessionKey?: string; channel?: string; accountId?: string; to?: string; threadId?: string | number } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n toolExecutorConfig?: Partial<import('./executor.js').ToolExecutorConfig>;\n}\n\ntype DelegateTaskParams = {\n goal: string;\n context?: string;\n toolset?: string[];\n maxIterations?: number;\n};\n\nexport function createDelegateTool(deps: DelegateToolDeps): AgentTool {\n return {\n name: 'delegate_task',\n label: '🤖 Delegate',\n description:\n 'Spawn a sub-agent for an isolated subtask with a fresh conversation (no parent transcript).\\n\\n' +\n 'The sub-agent returns a text summary only — tool traces stay out of your context.\\n\\n' +\n 'WHEN TO USE:\\n' +\n '- Independent work (research, multi-file exploration) where you only need the outcome\\n' +\n '- Avoiding context bloat from long intermediate tool output\\n\\n' +\n 'WHEN NOT TO USE:\\n' +\n '- Tasks that need this chat history or user clarification\\n' +\n '- Single trivial steps\\n\\n' +\n 'Sub-agents cannot use clarify, messaging, memory tools, todo, or nested delegate_task.',\n parameters: DelegateTaskSchema,\n\n async execute(\n _toolCallId: string,\n params: any,\n signal?: AbortSignal,\n ): Promise<AgentToolResult<{ summary: string; iterations: number }>> {\n const p = params as DelegateTaskParams;\n const maxIterations = p.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n if (!Number.isFinite(maxIterations) || maxIterations < 1 || maxIterations > 200) {\n return {\n content: [{ type: 'text', text: 'Invalid maxIterations (use 1–200).' }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const requested = p.toolset ?? [...DEFAULT_DELEGATE_TOOLS];\n const allowedNames = [\n ...new Set(\n requested.map((t) => String(t).trim()).filter(Boolean).filter((t) => !DELEGATE_BLOCKED_TOOLS.has(t)),\n ),\n ];\n\n if (allowedNames.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No allowed tools remain after applying the delegation blocklist. Expand `toolset` with safe tools.',\n },\n ],\n details: { summary: '', iterations: 0 },\n };\n }\n\n let model: ReturnType<DelegateToolDeps['getSubagentModel']>;\n try {\n model = deps.getSubagentModel();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `delegate_task: ${msg}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: deps.workspace,\n goal: p.goal,\n context: p.context,\n allowedToolNames: allowedNames,\n maxIterations,\n model,\n bus: deps.bus,\n getConfig: deps.getConfig,\n toolExecutorConfig: deps.toolExecutorConfig,\n };\n\n // Sub-agent lifecycle hook (parity surface for channel thread bindings).\n const ctx = deps.getCurrentContext?.() ?? null;\n const parentSessionKey = ctx?.sessionKey;\n let childSessionKey: string | undefined;\n try {\n if (deps.hookRunner && parentSessionKey) {\n const { parseSessionKey, buildSessionKey } = await import('../../routing/session-key.js');\n const parsed = parseSessionKey(parentSessionKey);\n if (parsed) {\n childSessionKey = buildSessionKey({\n agentId: 'subagent',\n source: parsed.agentId,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n threadId: parsed.threadId,\n scopeId: parsed.scopeId,\n });\n }\n if (childSessionKey) {\n const hookResult = await (deps.hookRunner as any).runHooksWithResult(\n 'subagent_spawning',\n {\n childSessionKey,\n requester: {\n channel: ctx?.channel,\n accountId: ctx?.accountId,\n to: (ctx as any)?.to,\n threadId: (ctx as any)?.threadId,\n },\n threadRequested: true,\n agentId: 'subagent',\n label: 'delegate_task',\n },\n { sessionKey: parentSessionKey, agentId: ctx?.channel },\n );\n const r = hookResult as any;\n if (r && r.status === 'error') {\n return {\n content: [{ type: 'text', text: `delegate_task: ${String(r.error || 'subagent spawn blocked')}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n }\n }\n } catch {\n // Hooks are best-effort.\n }\n\n const child = createDelegateChildHandle(childOptions);\n\n if (signal) {\n signal.addEventListener('abort', () => child.abort(), { once: true });\n }\n\n try {\n const { summary, toolIterations } = await child.run();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n return {\n content: [{ type: 'text', text: `Sub-agent completed:\\n\\n${summary}` }],\n details: { summary, iterations: toolIterations },\n };\n } catch (error) {\n child.abort();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: `Sub-agent failed: ${message}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n },\n } as any;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"delegate-tool.js","names":[],"sources":["../../../../src/agent/tools/delegate-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport {\n createDelegateChildHandle,\n type BuildChildToolsOptions,\n type DelegateChildHandleOptions,\n} from '../child-agent-factory.js';\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport const DEFAULT_DELEGATE_TOOLS = [\n 'shell',\n 'read_file',\n 'write_file',\n 'edit_file',\n 'grep',\n 'find',\n 'list_dir',\n 'web_search',\n 'web_fetch',\n] as const;\n\n/** Tools never passed to a delegated sub-agent (even if requested). */\nexport const DELEGATE_BLOCKED_TOOLS = new Set([\n 'delegate_task',\n 'clarify',\n 'curated_memory',\n 'send_message',\n 'send_media',\n 'todo',\n 'session_search',\n 'memory_search',\n 'memory_get',\n 'cronjob',\n 'skills_list',\n 'skill_view',\n 'skill_manage',\n 'bundle-mcp',\n]);\n\nconst DelegateTaskSchema = Type.Object({\n goal: Type.String({\n description: 'Clear description of what the sub-agent should accomplish',\n }),\n context: Type.Optional(\n Type.String({\n description: 'Additional context the sub-agent needs (file paths, constraints, etc.)',\n }),\n ),\n toolset: Type.Optional(\n Type.Array(Type.String(), {\n description:\n 'Tool names the sub-agent may use. Defaults to shell, read_file, write_file, edit_file, grep, find, list_dir, web_search, web_fetch. ' +\n 'Dangerous or interactive tools are always removed.',\n }),\n ),\n maxIterations: Type.Optional(\n Type.Number({\n description: 'Maximum tool executions in the sub-agent (default: 30)',\n default: DEFAULT_MAX_ITERATIONS,\n }),\n ),\n});\n\nexport interface DelegateToolDeps {\n workspace: string;\n getSubagentModel: () => import('@earendil-works/pi-ai').Model<import('@earendil-works/pi-ai').Api>;\n bus: import('../../infra/bus/index.js').MessageBus;\n getConfig: () => import('../../config/schema.js').Config | undefined;\n getCurrentContext?: () => { sessionKey?: string; channel?: string; accountId?: string; to?: string; threadId?: string | number } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n toolExecutorConfig?: Partial<import('./executor.js').ToolExecutorConfig>;\n /**\n * Construct the child agent's tool set. Injected by `AgentToolsFactory` so\n * the child-agent-factory module does not import `tools/factory.ts`\n * (which would form a factory ↔ delegate-tool ↔ child-agent-factory cycle).\n */\n buildChildTools: (opts: BuildChildToolsOptions) => AgentTool<any, any>[];\n}\n\ntype DelegateTaskParams = {\n goal: string;\n context?: string;\n toolset?: string[];\n maxIterations?: number;\n};\n\nexport function createDelegateTool(deps: DelegateToolDeps): AgentTool {\n return {\n name: 'delegate_task',\n label: '🤖 Delegate',\n description:\n 'Spawn a sub-agent for an isolated subtask with a fresh conversation (no parent transcript).\\n\\n' +\n 'The sub-agent returns a text summary only — tool traces stay out of your context.\\n\\n' +\n 'WHEN TO USE:\\n' +\n '- Independent work (research, multi-file exploration) where you only need the outcome\\n' +\n '- Avoiding context bloat from long intermediate tool output\\n\\n' +\n 'WHEN NOT TO USE:\\n' +\n '- Tasks that need this chat history or user clarification\\n' +\n '- Single trivial steps\\n\\n' +\n 'Sub-agents cannot use clarify, messaging, memory tools, todo, or nested delegate_task.',\n parameters: DelegateTaskSchema,\n\n async execute(\n _toolCallId: string,\n params: any,\n signal?: AbortSignal,\n ): Promise<AgentToolResult<{ summary: string; iterations: number }>> {\n const p = params as DelegateTaskParams;\n const maxIterations = p.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n if (!Number.isFinite(maxIterations) || maxIterations < 1 || maxIterations > 200) {\n return {\n content: [{ type: 'text', text: 'Invalid maxIterations (use 1–200).' }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const requested = p.toolset ?? [...DEFAULT_DELEGATE_TOOLS];\n const allowedNames = [\n ...new Set(\n requested.map((t) => String(t).trim()).filter(Boolean).filter((t) => !DELEGATE_BLOCKED_TOOLS.has(t)),\n ),\n ];\n\n if (allowedNames.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No allowed tools remain after applying the delegation blocklist. Expand `toolset` with safe tools.',\n },\n ],\n details: { summary: '', iterations: 0 },\n };\n }\n\n let model: ReturnType<DelegateToolDeps['getSubagentModel']>;\n try {\n model = deps.getSubagentModel();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `delegate_task: ${msg}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: deps.workspace,\n goal: p.goal,\n context: p.context,\n allowedToolNames: allowedNames,\n maxIterations,\n model,\n bus: deps.bus,\n getConfig: deps.getConfig,\n toolExecutorConfig: deps.toolExecutorConfig,\n buildChildTools: deps.buildChildTools,\n };\n\n // Sub-agent lifecycle hook (parity surface for channel thread bindings).\n const ctx = deps.getCurrentContext?.() ?? null;\n const parentSessionKey = ctx?.sessionKey;\n let childSessionKey: string | undefined;\n try {\n if (deps.hookRunner && parentSessionKey) {\n const { parseSessionKey, buildSessionKey } = await import('../../routing/session-key.js');\n const parsed = parseSessionKey(parentSessionKey);\n if (parsed) {\n childSessionKey = buildSessionKey({\n agentId: 'subagent',\n source: parsed.agentId,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n threadId: parsed.threadId,\n scopeId: parsed.scopeId,\n });\n }\n if (childSessionKey) {\n const hookResult = await (deps.hookRunner as any).runHooksWithResult(\n 'subagent_spawning',\n {\n childSessionKey,\n requester: {\n channel: ctx?.channel,\n accountId: ctx?.accountId,\n to: (ctx as any)?.to,\n threadId: (ctx as any)?.threadId,\n },\n threadRequested: true,\n agentId: 'subagent',\n label: 'delegate_task',\n },\n { sessionKey: parentSessionKey, agentId: ctx?.channel },\n );\n const r = hookResult as any;\n if (r && r.status === 'error') {\n return {\n content: [{ type: 'text', text: `delegate_task: ${String(r.error || 'subagent spawn blocked')}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n }\n }\n } catch {\n // Hooks are best-effort.\n }\n\n const child = createDelegateChildHandle(childOptions);\n\n if (signal) {\n signal.addEventListener('abort', () => child.abort(), { once: true });\n }\n\n try {\n const { summary, toolIterations } = await child.run();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n return {\n content: [{ type: 'text', text: `Sub-agent completed:\\n\\n${summary}` }],\n details: { summary, iterations: toolIterations },\n };\n } catch (error) {\n child.abort();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: `Sub-agent failed: ${message}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n },\n } as any;\n}\n"],"mappings":"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"}
@@ -3,8 +3,8 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "../memory/dreaming/constants.js";
4
4
  import { loadDreamingStore, saveDreamingStore } from "../memory/dreaming/short-term-store.js";
5
5
  import { resolveDreamingConfig } from "../memory/dreaming/config.js";
6
- import path from "node:path";
7
6
  import fs from "node:fs/promises";
7
+ import path from "node:path";
8
8
  import { Type } from "@sinclair/typebox";
9
9
  //#region src/agent/tools/dreaming-tool.ts
10
10
  init_logger();
@@ -1,34 +1,53 @@
1
1
  /**
2
- * Tool Executor - Unified tool execution with timeout and retry
2
+ * Tool Executor - Unified tool execution wrapper.
3
3
  *
4
- * Wraps tool execution with:
5
- * - Timeout protection (prevents hanging)
6
- * - Retry mechanism (for transient failures)
7
- * - Error tracking (for reliability)
4
+ * Adds:
5
+ * - Timeout protection (tools that hang would otherwise stall the turn).
6
+ * - Optional retry for tools explicitly marked `idempotent`.
7
+ *
8
+ * Pi-agent contract (from `AgentTool.execute` docstring): "Throw on failure
9
+ * instead of encoding errors in `content`." Pi-agent turns thrown errors into
10
+ * `tool_execution_end` events with `isError=true`, which feeds the loop guard,
11
+ * error tracker, and error-pattern matcher. This wrapper therefore re-throws
12
+ * instead of synthesising fake-success results.
8
13
  */
9
- import type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';
14
+ import type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from '@earendil-works/pi-agent-core';
10
15
  export interface ToolExecutorConfig {
16
+ /** Default per-tool timeout when the tool does not declare its own `timeoutMs`. */
11
17
  defaultTimeoutMs: number;
12
- shellTimeoutMs: number;
13
- readTimeoutMs: number;
14
- writeTimeoutMs: number;
15
- networkTimeoutMs: number;
18
+ /** Max retry attempts for tools opted into retry via `idempotent: true`. */
16
19
  maxRetries: number;
20
+ /** Initial backoff between retries (passed straight to `withRetry`). */
17
21
  retryDelayMs: number;
22
+ /** Master switches; default both on so the wrapper is still effective. */
18
23
  enableTimeout: boolean;
19
24
  enableRetry: boolean;
20
25
  }
21
26
  declare const DEFAULT_CONFIG: ToolExecutorConfig;
22
27
  /**
23
- * Execute tool with timeout and retry protection
28
+ * Optional xopc-side hints that any tool may attach. They are not part of the
29
+ * pi-agent `AgentTool` contract; the wrapper reads them via structural typing.
30
+ *
31
+ * - `timeoutMs`: per-tool override of the default execution timeout.
32
+ * - `idempotent`: marks a tool as safe to retry. The wrapper retries only
33
+ * tools that opt in — write/edit-like tools must leave this `false`.
34
+ */
35
+ export interface XopcToolHints {
36
+ timeoutMs?: number;
37
+ idempotent?: boolean;
38
+ }
39
+ /**
40
+ * Execute tool with timeout (always) and retry (only for idempotent tools).
41
+ * Re-throws on failure so pi-agent records `isError=true`.
24
42
  */
25
- export declare function executeToolWithProtection(tool: AgentTool<any, any>, toolCallId: string, params: any, config?: Partial<ToolExecutorConfig>): Promise<AgentToolResult<any>>;
43
+ export declare function executeToolWithProtection<TDetails>(tool: AgentTool<any, TDetails>, toolCallId: string, params: any, signal?: AbortSignal, onUpdate?: AgentToolUpdateCallback<TDetails>, config?: Partial<ToolExecutorConfig>): Promise<AgentToolResult<TDetails>>;
26
44
  /**
27
- * Create wrapped tool with protection
45
+ * Wrap a single tool with the protection pipeline. Preserves the original
46
+ * `execute` signature so streaming `signal` / `onUpdate` reach the tool.
28
47
  */
29
- export declare function wrapToolWithProtection(tool: AgentTool<any, any>, config?: Partial<ToolExecutorConfig>): AgentTool<any, any>;
48
+ export declare function wrapToolWithProtection<TDetails>(tool: AgentTool<any, TDetails>, config?: Partial<ToolExecutorConfig>): AgentTool<any, TDetails>;
30
49
  /**
31
- * Wrap all tools with protection
50
+ * Wrap a batch of tools with protection.
32
51
  */
33
52
  export declare function wrapToolsWithProtection(tools: AgentTool<any, any>[], config?: Partial<ToolExecutorConfig>): AgentTool<any, any>[];
34
53
  export { DEFAULT_CONFIG as DEFAULT_TOOL_EXECUTOR_CONFIG };
@@ -7,79 +7,64 @@ init_logger();
7
7
  const log = createLogger("ToolExecutor");
8
8
  const DEFAULT_CONFIG = {
9
9
  defaultTimeoutMs: 300 * 1e3,
10
- shellTimeoutMs: 300 * 1e3,
11
- readTimeoutMs: 30 * 1e3,
12
- writeTimeoutMs: 60 * 1e3,
13
- networkTimeoutMs: 60 * 1e3,
14
10
  maxRetries: 2,
15
11
  retryDelayMs: 1e3,
16
12
  enableTimeout: true,
17
13
  enableRetry: true
18
14
  };
19
- /**
20
- * Get timeout for specific tool type
21
- */
22
- function getTimeoutForTool(toolName, config) {
23
- const name = toolName.toLowerCase();
24
- if (name.includes("shell") || name.includes("exec") || name.includes("bash")) return config.shellTimeoutMs;
25
- if (name.includes("read") || name.includes("view") || name.includes("cat")) return config.readTimeoutMs;
26
- if (name.includes("write") || name.includes("edit") || name.includes("create")) return config.writeTimeoutMs;
27
- if (name.includes("web") || name.includes("http") || name.includes("fetch") || name.includes("search")) return config.networkTimeoutMs;
28
- return config.defaultTimeoutMs;
15
+ function readToolHints(tool) {
16
+ const t = tool;
17
+ return {
18
+ timeoutMs: typeof t.timeoutMs === "number" && t.timeoutMs > 0 ? t.timeoutMs : void 0,
19
+ idempotent: t.idempotent === true
20
+ };
21
+ }
22
+ function resolveTimeoutMs(tool, config) {
23
+ return readToolHints(tool).timeoutMs ?? config.defaultTimeoutMs;
29
24
  }
30
25
  /**
31
- * Execute tool with timeout and retry protection
26
+ * Execute tool with timeout (always) and retry (only for idempotent tools).
27
+ * Re-throws on failure so pi-agent records `isError=true`.
32
28
  */
33
- async function executeToolWithProtection(tool, toolCallId, params, config = {}) {
29
+ async function executeToolWithProtection(tool, toolCallId, params, signal, onUpdate, config = {}) {
34
30
  const fullConfig = {
35
31
  ...DEFAULT_CONFIG,
36
32
  ...config
37
33
  };
38
34
  const toolName = tool.name;
39
- const execute = async () => {
40
- try {
41
- return await tool.execute(toolCallId, params);
42
- } catch (error) {
43
- if (error instanceof Error) throw error;
44
- throw new Error(String(error));
45
- }
46
- };
47
- let operation = execute;
35
+ const hints = readToolHints(tool);
36
+ const runOnce = () => tool.execute(toolCallId, params, signal, onUpdate);
37
+ let operation = runOnce;
48
38
  if (fullConfig.enableTimeout) {
49
- const timeoutMs = getTimeoutForTool(toolName, fullConfig);
50
- const originalExecute = execute;
51
- operation = async () => {
52
- return executeWithTimeout(originalExecute, {
53
- toolName,
54
- timeoutMs,
55
- description: `Executing ${toolName}`
56
- });
57
- };
39
+ const timeoutMs = resolveTimeoutMs(tool, fullConfig);
40
+ const inner = operation;
41
+ operation = () => executeWithTimeout(inner, {
42
+ toolName,
43
+ timeoutMs,
44
+ description: `Executing ${toolName}`
45
+ });
58
46
  }
59
- if (fullConfig.enableRetry && fullConfig.maxRetries > 0) {
60
- const originalOperation = operation;
61
- operation = async () => {
62
- return withRetry(originalOperation, {
63
- attempts: fullConfig.maxRetries + 1,
64
- minDelayMs: fullConfig.retryDelayMs,
65
- onRetry: (info) => {
66
- log.warn({
67
- tool: toolName,
68
- attempt: info.attempt,
69
- delayMs: info.delayMs,
70
- error: info.error
71
- }, "Tool execution failed, retrying");
72
- }
73
- });
74
- };
47
+ if (fullConfig.enableRetry && fullConfig.maxRetries > 0 && hints.idempotent) {
48
+ const inner = operation;
49
+ operation = () => withRetry(inner, {
50
+ attempts: fullConfig.maxRetries + 1,
51
+ minDelayMs: fullConfig.retryDelayMs,
52
+ onRetry: (info) => {
53
+ log.warn({
54
+ tool: toolName,
55
+ attempt: info.attempt,
56
+ delayMs: info.delayMs,
57
+ error: info.error
58
+ }, "Tool execution failed, retrying (idempotent)");
59
+ }
60
+ });
75
61
  }
76
62
  const startTime = Date.now();
77
63
  try {
78
64
  const result = await operation();
79
- const durationMs = Date.now() - startTime;
80
65
  log.debug({
81
66
  tool: toolName,
82
- durationMs,
67
+ durationMs: Date.now() - startTime,
83
68
  success: true
84
69
  }, "Tool execution completed");
85
70
  return result;
@@ -91,17 +76,7 @@ async function executeToolWithProtection(tool, toolCallId, params, config = {})
91
76
  timeoutMs: error.timeoutMs,
92
77
  durationMs
93
78
  }, "Tool execution timed out");
94
- return {
95
- content: [{
96
- type: "text",
97
- text: error.getUserMessage()
98
- }],
99
- details: {
100
- exitCode: null,
101
- timedOut: true,
102
- truncated: false
103
- }
104
- };
79
+ throw new Error(`Tool '${toolName}' timed out after ${error.timeoutMs}ms`, { cause: error });
105
80
  }
106
81
  const errorMessage = error instanceof Error ? error.message : String(error);
107
82
  log.error({
@@ -109,33 +84,23 @@ async function executeToolWithProtection(tool, toolCallId, params, config = {})
109
84
  error: errorMessage,
110
85
  durationMs
111
86
  }, "Tool execution failed");
112
- return {
113
- content: [{
114
- type: "text",
115
- text: `❌ Tool '${toolName}' failed: ${errorMessage}`
116
- }],
117
- details: {
118
- exitCode: null,
119
- timedOut: false,
120
- truncated: false,
121
- error: errorMessage
122
- }
123
- };
87
+ throw error instanceof Error ? error : new Error(errorMessage);
124
88
  }
125
89
  }
126
90
  /**
127
- * Create wrapped tool with protection
91
+ * Wrap a single tool with the protection pipeline. Preserves the original
92
+ * `execute` signature so streaming `signal` / `onUpdate` reach the tool.
128
93
  */
129
94
  function wrapToolWithProtection(tool, config) {
130
95
  return {
131
96
  ...tool,
132
- async execute(toolCallId, params) {
133
- return executeToolWithProtection(tool, toolCallId, params, config);
97
+ async execute(toolCallId, params, signal, onUpdate) {
98
+ return executeToolWithProtection(tool, toolCallId, params, signal, onUpdate, config);
134
99
  }
135
100
  };
136
101
  }
137
102
  /**
138
- * Wrap all tools with protection
103
+ * Wrap a batch of tools with protection.
139
104
  */
140
105
  function wrapToolsWithProtection(tools, config) {
141
106
  return tools.map((tool) => wrapToolWithProtection(tool, config));
@@ -1 +1 @@
1
- {"version":3,"file":"executor.js","names":[],"sources":["../../../../src/agent/tools/executor.ts"],"sourcesContent":["/**\n * Tool Executor - Unified tool execution with timeout and retry\n *\n * Wraps tool execution with:\n * - Timeout protection (prevents hanging)\n * - Retry mechanism (for transient failures)\n * - Error tracking (for reliability)\n */\n\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\nimport { createLogger } from '../../utils/logger.js';\nimport { executeWithTimeout, TimeoutError } from '../lifecycle/timeout-wrapper.js';\nimport { withRetry } from '../../infra/retry.js';\n\nconst log = createLogger('ToolExecutor');\n\nexport interface ToolExecutorConfig {\n // Timeout configuration\n defaultTimeoutMs: number;\n shellTimeoutMs: number;\n readTimeoutMs: number;\n writeTimeoutMs: number;\n networkTimeoutMs: number;\n \n // Retry configuration\n maxRetries: number;\n retryDelayMs: number;\n \n // Enable/disable features\n enableTimeout: boolean;\n enableRetry: boolean;\n}\n\nconst DEFAULT_CONFIG: ToolExecutorConfig = {\n defaultTimeoutMs: 5 * 60 * 1000, // 5 minutes\n shellTimeoutMs: 5 * 60 * 1000, // 5 minutes\n readTimeoutMs: 30 * 1000, // 30 seconds\n writeTimeoutMs: 60 * 1000, // 1 minute\n networkTimeoutMs: 60 * 1000, // 1 minute\n \n maxRetries: 2,\n retryDelayMs: 1000,\n \n enableTimeout: true,\n enableRetry: true,\n};\n\n/**\n * Get timeout for specific tool type\n */\nfunction getTimeoutForTool(toolName: string, config: ToolExecutorConfig): number {\n const name = toolName.toLowerCase();\n \n if (name.includes('shell') || name.includes('exec') || name.includes('bash')) {\n return config.shellTimeoutMs;\n }\n if (name.includes('read') || name.includes('view') || name.includes('cat')) {\n return config.readTimeoutMs;\n }\n if (name.includes('write') || name.includes('edit') || name.includes('create')) {\n return config.writeTimeoutMs;\n }\n if (name.includes('web') || name.includes('http') || name.includes('fetch') || name.includes('search')) {\n return config.networkTimeoutMs;\n }\n \n return config.defaultTimeoutMs;\n}\n\n/**\n * Execute tool with timeout and retry protection\n */\nexport async function executeToolWithProtection(\n tool: AgentTool<any, any>,\n toolCallId: string,\n params: any,\n config: Partial<ToolExecutorConfig> = {}\n): Promise<AgentToolResult<any>> {\n const fullConfig = { ...DEFAULT_CONFIG, ...config };\n const toolName = tool.name;\n \n // Build execution function\n const execute = async (): Promise<AgentToolResult<any>> => {\n try {\n const result = await (tool as any).execute(toolCallId, params);\n return result;\n } catch (error) {\n // Wrap non-error throws\n if (error instanceof Error) {\n throw error;\n }\n throw new Error(String(error));\n }\n };\n \n // Apply timeout if enabled\n let operation = execute;\n if (fullConfig.enableTimeout) {\n const timeoutMs = getTimeoutForTool(toolName, fullConfig);\n const originalExecute = execute;\n \n operation = async () => {\n return executeWithTimeout(\n originalExecute,\n {\n toolName,\n timeoutMs,\n description: `Executing ${toolName}`,\n }\n );\n };\n }\n \n // Apply retry if enabled\n if (fullConfig.enableRetry && fullConfig.maxRetries > 0) {\n const originalOperation = operation;\n \n operation = async () => {\n return withRetry(\n originalOperation,\n {\n attempts: fullConfig.maxRetries + 1,\n minDelayMs: fullConfig.retryDelayMs,\n onRetry: (info) => {\n log.warn(\n { tool: toolName, attempt: info.attempt, delayMs: info.delayMs, error: info.error },\n 'Tool execution failed, retrying'\n );\n },\n }\n );\n };\n }\n \n // Execute with error handling\n const startTime = Date.now();\n try {\n const result = await operation();\n const durationMs = Date.now() - startTime;\n \n log.debug(\n { tool: toolName, durationMs, success: true },\n 'Tool execution completed'\n );\n \n return result;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n \n // Handle timeout error\n if (error instanceof TimeoutError) {\n log.error(\n { tool: toolName, timeoutMs: error.timeoutMs, durationMs },\n 'Tool execution timed out'\n );\n \n return {\n content: [\n {\n type: 'text',\n text: error.getUserMessage(),\n },\n ],\n details: {\n exitCode: null,\n timedOut: true,\n truncated: false,\n },\n };\n }\n \n // Handle other errors\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.error(\n { tool: toolName, error: errorMessage, durationMs },\n 'Tool execution failed'\n );\n \n return {\n content: [\n {\n type: 'text',\n text: `❌ Tool '${toolName}' failed: ${errorMessage}`,\n },\n ],\n details: {\n exitCode: null,\n timedOut: false,\n truncated: false,\n error: errorMessage,\n },\n };\n }\n}\n\n/**\n * Create wrapped tool with protection\n */\nexport function wrapToolWithProtection(\n tool: AgentTool<any, any>,\n config?: Partial<ToolExecutorConfig>\n): AgentTool<any, any> {\n return ({\n ...tool,\n async execute(toolCallId: string, params: any): Promise<AgentToolResult<any>> {\n return executeToolWithProtection(tool, toolCallId, params, config);\n },\n } as any) as AgentTool<any, any>;\n}\n\n/**\n * Wrap all tools with protection\n */\nexport function wrapToolsWithProtection(\n tools: AgentTool<any, any>[],\n config?: Partial<ToolExecutorConfig>\n): AgentTool<any, any>[] {\n return tools.map(tool => wrapToolWithProtection(tool, config));\n}\n\n// Export configuration\nexport { DEFAULT_CONFIG as DEFAULT_TOOL_EXECUTOR_CONFIG };\n"],"mappings":"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"}
1
+ {"version":3,"file":"executor.js","names":[],"sources":["../../../../src/agent/tools/executor.ts"],"sourcesContent":["/**\n * Tool Executor - Unified tool execution wrapper.\n *\n * Adds:\n * - Timeout protection (tools that hang would otherwise stall the turn).\n * - Optional retry for tools explicitly marked `idempotent`.\n *\n * Pi-agent contract (from `AgentTool.execute` docstring): \"Throw on failure\n * instead of encoding errors in `content`.\" Pi-agent turns thrown errors into\n * `tool_execution_end` events with `isError=true`, which feeds the loop guard,\n * error tracker, and error-pattern matcher. This wrapper therefore re-throws\n * instead of synthesising fake-success results.\n */\n\nimport type {\n AgentTool,\n AgentToolResult,\n AgentToolUpdateCallback,\n} from '@earendil-works/pi-agent-core';\nimport { createLogger } from '../../utils/logger.js';\nimport { executeWithTimeout, TimeoutError } from '../lifecycle/timeout-wrapper.js';\nimport { withRetry } from '../../infra/retry.js';\n\nconst log = createLogger('ToolExecutor');\n\nexport interface ToolExecutorConfig {\n /** Default per-tool timeout when the tool does not declare its own `timeoutMs`. */\n defaultTimeoutMs: number;\n\n /** Max retry attempts for tools opted into retry via `idempotent: true`. */\n maxRetries: number;\n /** Initial backoff between retries (passed straight to `withRetry`). */\n retryDelayMs: number;\n\n /** Master switches; default both on so the wrapper is still effective. */\n enableTimeout: boolean;\n enableRetry: boolean;\n}\n\nconst DEFAULT_CONFIG: ToolExecutorConfig = {\n defaultTimeoutMs: 5 * 60 * 1000, // 5 minutes\n maxRetries: 2,\n retryDelayMs: 1000,\n enableTimeout: true,\n enableRetry: true,\n};\n\n/**\n * Optional xopc-side hints that any tool may attach. They are not part of the\n * pi-agent `AgentTool` contract; the wrapper reads them via structural typing.\n *\n * - `timeoutMs`: per-tool override of the default execution timeout.\n * - `idempotent`: marks a tool as safe to retry. The wrapper retries only\n * tools that opt in write/edit-like tools must leave this `false`.\n */\nexport interface XopcToolHints {\n timeoutMs?: number;\n idempotent?: boolean;\n}\n\nfunction readToolHints(tool: AgentTool<any, any>): XopcToolHints {\n const t = tool as AgentTool<any, any> & XopcToolHints;\n return {\n timeoutMs: typeof t.timeoutMs === 'number' && t.timeoutMs > 0 ? t.timeoutMs : undefined,\n idempotent: t.idempotent === true,\n };\n}\n\nfunction resolveTimeoutMs(tool: AgentTool<any, any>, config: ToolExecutorConfig): number {\n const hints = readToolHints(tool);\n return hints.timeoutMs ?? config.defaultTimeoutMs;\n}\n\n/**\n * Execute tool with timeout (always) and retry (only for idempotent tools).\n * Re-throws on failure so pi-agent records `isError=true`.\n */\nexport async function executeToolWithProtection<TDetails>(\n tool: AgentTool<any, TDetails>,\n toolCallId: string,\n params: any,\n signal?: AbortSignal,\n onUpdate?: AgentToolUpdateCallback<TDetails>,\n config: Partial<ToolExecutorConfig> = {},\n): Promise<AgentToolResult<TDetails>> {\n const fullConfig = { ...DEFAULT_CONFIG, ...config };\n const toolName = tool.name;\n const hints = readToolHints(tool);\n\n const runOnce = (): Promise<AgentToolResult<TDetails>> =>\n tool.execute(toolCallId, params, signal, onUpdate);\n\n let operation: () => Promise<AgentToolResult<TDetails>> = runOnce;\n\n if (fullConfig.enableTimeout) {\n const timeoutMs = resolveTimeoutMs(tool, fullConfig);\n const inner = operation;\n operation = () =>\n executeWithTimeout(inner, {\n toolName,\n timeoutMs,\n description: `Executing ${toolName}`,\n });\n }\n\n const shouldRetry = fullConfig.enableRetry && fullConfig.maxRetries > 0 && hints.idempotent;\n if (shouldRetry) {\n const inner = operation;\n operation = () =>\n withRetry(inner, {\n attempts: fullConfig.maxRetries + 1,\n minDelayMs: fullConfig.retryDelayMs,\n onRetry: (info) => {\n log.warn(\n { tool: toolName, attempt: info.attempt, delayMs: info.delayMs, error: info.error },\n 'Tool execution failed, retrying (idempotent)',\n );\n },\n });\n }\n\n const startTime = Date.now();\n try {\n const result = await operation();\n log.debug(\n { tool: toolName, durationMs: Date.now() - startTime, success: true },\n 'Tool execution completed',\n );\n return result;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n if (error instanceof TimeoutError) {\n log.error(\n { tool: toolName, timeoutMs: error.timeoutMs, durationMs },\n 'Tool execution timed out',\n );\n throw new Error(`Tool '${toolName}' timed out after ${error.timeoutMs}ms`, { cause: error });\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.error(\n { tool: toolName, error: errorMessage, durationMs },\n 'Tool execution failed',\n );\n throw error instanceof Error ? error : new Error(errorMessage);\n }\n}\n\n/**\n * Wrap a single tool with the protection pipeline. Preserves the original\n * `execute` signature so streaming `signal` / `onUpdate` reach the tool.\n */\nexport function wrapToolWithProtection<TDetails>(\n tool: AgentTool<any, TDetails>,\n config?: Partial<ToolExecutorConfig>,\n): AgentTool<any, TDetails> {\n return {\n ...tool,\n async execute(\n toolCallId: string,\n params: any,\n signal?: AbortSignal,\n onUpdate?: AgentToolUpdateCallback<TDetails>,\n ): Promise<AgentToolResult<TDetails>> {\n return executeToolWithProtection(tool, toolCallId, params, signal, onUpdate, config);\n },\n } as AgentTool<any, TDetails>;\n}\n\n/**\n * Wrap a batch of tools with protection.\n */\nexport function wrapToolsWithProtection(\n tools: AgentTool<any, any>[],\n config?: Partial<ToolExecutorConfig>,\n): AgentTool<any, any>[] {\n return tools.map((tool) => wrapToolWithProtection(tool, config));\n}\n\n// Export configuration\nexport { DEFAULT_CONFIG as DEFAULT_TOOL_EXECUTOR_CONFIG };\n"],"mappings":";;;;;aAmBqD;AAIrD,MAAM,MAAM,aAAa,eAAe;AAgBxC,MAAM,iBAAqC;CACzC,kBAAkB,MAAS;CAC3B,YAAY;CACZ,cAAc;CACd,eAAe;CACf,aAAa;CACd;AAeD,SAAS,cAAc,MAA0C;CAC/D,MAAM,IAAI;AACV,QAAO;EACL,WAAW,OAAO,EAAE,cAAc,YAAY,EAAE,YAAY,IAAI,EAAE,YAAY,KAAA;EAC9E,YAAY,EAAE,eAAe;EAC9B;;AAGH,SAAS,iBAAiB,MAA2B,QAAoC;AAEvF,QADc,cAAc,KAChB,CAAC,aAAa,OAAO;;;;;;AAOnC,eAAsB,0BACpB,MACA,YACA,QACA,QACA,UACA,SAAsC,EAAE,EACJ;CACpC,MAAM,aAAa;EAAE,GAAG;EAAgB,GAAG;EAAQ;CACnD,MAAM,WAAW,KAAK;CACtB,MAAM,QAAQ,cAAc,KAAK;CAEjC,MAAM,gBACJ,KAAK,QAAQ,YAAY,QAAQ,QAAQ,SAAS;CAEpD,IAAI,YAAsD;AAE1D,KAAI,WAAW,eAAe;EAC5B,MAAM,YAAY,iBAAiB,MAAM,WAAW;EACpD,MAAM,QAAQ;AACd,oBACE,mBAAmB,OAAO;GACxB;GACA;GACA,aAAa,aAAa;GAC3B,CAAC;;AAIN,KADoB,WAAW,eAAe,WAAW,aAAa,KAAK,MAAM,YAChE;EACf,MAAM,QAAQ;AACd,oBACE,UAAU,OAAO;GACf,UAAU,WAAW,aAAa;GAClC,YAAY,WAAW;GACvB,UAAU,SAAS;AACjB,QAAI,KACF;KAAE,MAAM;KAAU,SAAS,KAAK;KAAS,SAAS,KAAK;KAAS,OAAO,KAAK;KAAO,EACnF,+CACD;;GAEJ,CAAC;;CAGN,MAAM,YAAY,KAAK,KAAK;AAC5B,KAAI;EACF,MAAM,SAAS,MAAM,WAAW;AAChC,MAAI,MACF;GAAE,MAAM;GAAU,YAAY,KAAK,KAAK,GAAG;GAAW,SAAS;GAAM,EACrE,2BACD;AACD,SAAO;UACA,OAAO;EACd,MAAM,aAAa,KAAK,KAAK,GAAG;AAEhC,MAAI,iBAAiB,cAAc;AACjC,OAAI,MACF;IAAE,MAAM;IAAU,WAAW,MAAM;IAAW;IAAY,EAC1D,2BACD;AACD,SAAM,IAAI,MAAM,SAAS,SAAS,oBAAoB,MAAM,UAAU,KAAK,EAAE,OAAO,OAAO,CAAC;;EAG9F,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,MAAI,MACF;GAAE,MAAM;GAAU,OAAO;GAAc;GAAY,EACnD,wBACD;AACD,QAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,aAAa;;;;;;;AAQlE,SAAgB,uBACd,MACA,QAC0B;AAC1B,QAAO;EACL,GAAG;EACH,MAAM,QACJ,YACA,QACA,QACA,UACoC;AACpC,UAAO,0BAA0B,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO;;EAEvF;;;;;AAMH,SAAgB,wBACd,OACA,QACuB;AACvB,QAAO,MAAM,KAAK,SAAS,uBAAuB,MAAM,OAAO,CAAC"}
@@ -75,7 +75,13 @@ export declare class AgentToolsFactory {
75
75
  private browserManager;
76
76
  /** One dialog/console supervisor per chat session (browser tab). */
77
77
  private readonly browserTaskSupervisors;
78
+ /** Cached readiness probe — keyed by backend mode + extension host:port. */
79
+ private browserReadinessCache;
78
80
  constructor(deps: ToolFactoryDeps);
81
+ private browserReadinessKey;
82
+ private checkBrowserReadinessCached;
83
+ /** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */
84
+ invalidateBrowserReadinessCache(): void;
79
85
  private browserSupervisorForTask;
80
86
  private acquireBrowserPage;
81
87
  private ensureBrowserManager;
@@ -1,7 +1,6 @@
1
- import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
2
1
  import { createLogger } from "../../utils/logger/index.js";
3
2
  import { init_logger } from "../../utils/logger.js";
4
- import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
3
+ import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
5
4
  import { createReadFileTool } from "./read.js";
6
5
  import { createWriteFileTool } from "./write.js";
7
6
  import { createEditFileTool } from "./edit.js";
@@ -23,6 +22,7 @@ import { createClarifyTool } from "./clarify-tool.js";
23
22
  import { createImageTool } from "./image-tool.js";
24
23
  import { BrowserManager } from "../../browser/manager.js";
25
24
  import { resolveBrowserBackendFromConfig } from "../../browser/backend-from-config.js";
25
+ import { checkBrowserReadiness } from "../../browser/readiness.js";
26
26
  import { CdpSupervisor } from "../../browser/cdp-supervisor.js";
27
27
  import "../../browser/index.js";
28
28
  import { createDelegateTool } from "./delegate-tool.js";
@@ -35,6 +35,7 @@ import "./index.js";
35
35
  import { shouldRegisterCuratedMemoryTool } from "../memory/memory-config.js";
36
36
  import { createBrowserUseTool } from "./browser/tool/browser-use-tool.js";
37
37
  import { wrapToolsWithProtection } from "./executor.js";
38
+ import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
38
39
  import { createTextToSpeechTool } from "./tts-tool.js";
39
40
  //#region src/agent/tools/factory.ts
40
41
  init_session_key();
@@ -52,13 +53,55 @@ function clarifyTransportSource(sessionKey) {
52
53
  const first = sessionKey.split(":").filter(Boolean)[0] ?? "";
53
54
  if (first === "cli" || first === "webchat") return first;
54
55
  }
55
- var AgentToolsFactory = class {
56
+ var AgentToolsFactory = class AgentToolsFactory {
56
57
  browserManager = null;
57
58
  /** One dialog/console supervisor per chat session (browser tab). */
58
59
  browserTaskSupervisors = /* @__PURE__ */ new Map();
60
+ /** Cached readiness probe — keyed by backend mode + extension host:port. */
61
+ browserReadinessCache = null;
59
62
  constructor(deps) {
60
63
  this.deps = deps;
61
64
  }
65
+ browserReadinessKey() {
66
+ const cfg = this.deps.getConfig?.();
67
+ const backend = resolveBrowserBackendFromConfig(cfg);
68
+ const ext = cfg?.agents?.defaults?.browser?.extension;
69
+ const host = typeof ext?.host === "string" && ext.host.trim() ? ext.host.trim() : "127.0.0.1";
70
+ const port = typeof ext?.port === "number" ? ext.port : 19820;
71
+ const cdpUrl = backend.mode === "cdp" ? backend.config.wsEndpoint : "";
72
+ const cloudKind = backend.mode === "cloud" ? backend.config.type : "";
73
+ return `${backend.mode}@${host}:${port}|${cdpUrl}|${cloudKind}`;
74
+ }
75
+ async checkBrowserReadinessCached() {
76
+ const key = this.browserReadinessKey();
77
+ const now = Date.now();
78
+ const cached = this.browserReadinessCache;
79
+ if (cached && cached.key === key && cached.expiresAt > now && cached.inflight === void 0) return cached.result ?? null;
80
+ if (cached && cached.key === key && cached.inflight) return cached.inflight;
81
+ const inflight = checkBrowserReadiness(this.deps.getConfig?.());
82
+ this.browserReadinessCache = {
83
+ key,
84
+ expiresAt: now + 3e4,
85
+ inflight
86
+ };
87
+ try {
88
+ const result = await inflight;
89
+ this.browserReadinessCache = {
90
+ key,
91
+ expiresAt: Date.now() + 3e4,
92
+ result
93
+ };
94
+ return result;
95
+ } catch (e) {
96
+ this.browserReadinessCache = null;
97
+ log.warn({ err: e }, "browserReadiness probe failed");
98
+ return null;
99
+ }
100
+ }
101
+ /** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */
102
+ invalidateBrowserReadinessCache() {
103
+ this.browserReadinessCache = null;
104
+ }
62
105
  browserSupervisorForTask(taskId) {
63
106
  let s = this.browserTaskSupervisors.get(taskId);
64
107
  if (!s) {
@@ -89,6 +132,7 @@ var AgentToolsFactory = class {
89
132
  }
90
133
  /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */
91
134
  async shutdownBrowser() {
135
+ this.browserReadinessCache = null;
92
136
  if (!this.browserManager) return;
93
137
  await this.browserManager.shutdown();
94
138
  this.browserManager = null;
@@ -197,6 +241,7 @@ var AgentToolsFactory = class {
197
241
  getPageForTask: () => this.acquireBrowserPage(),
198
242
  getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? "default",
199
243
  getConfig: () => this.deps.getConfig?.(),
244
+ getReadiness: () => this.checkBrowserReadinessCached(),
200
245
  getSupervisor: () => this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? "default"),
201
246
  notifyBrowserPageClosed: (taskId) => {
202
247
  this.browserTaskSupervisors.delete(taskId);
@@ -213,7 +258,21 @@ var AgentToolsFactory = class {
213
258
  getConfig: () => this.deps.getConfig?.(),
214
259
  getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,
215
260
  hookRunner: this.deps.hookRunner,
216
- toolExecutorConfig: this.deps.toolExecutorConfig
261
+ toolExecutorConfig: this.deps.toolExecutorConfig,
262
+ buildChildTools: (childOpts) => {
263
+ return new AgentToolsFactory({
264
+ workspace: childOpts.workspace,
265
+ bus: childOpts.bus,
266
+ getCurrentContext: () => null,
267
+ getConfig: childOpts.getConfig,
268
+ getPrimaryModel: () => childOpts.model,
269
+ toolExecutorConfig: childOpts.toolExecutorConfig
270
+ }).createAllTools({
271
+ workspace: childOpts.workspace,
272
+ getPrimaryModel: () => childOpts.model,
273
+ disabledTools: new Set(["extensions"])
274
+ });
275
+ }
217
276
  })] : [],
218
277
  ...optionalTools
219
278
  ], disabled);
@@ -1 +1 @@
1
- {"version":3,"file":"factory.js","names":["parseRoutingSessionKey"],"sources":["../../../../src/agent/tools/factory.ts"],"sourcesContent":["/**\n * Agent Tools Factory - Creates and configures agent tools\n *\n * Centralizes tool creation logic to keep service.ts focused on orchestration.\n *\n * TTS: auto TTS is applied at the ChannelManager via maybeApplyTtsToPayload().\n * Optional \\`text_to_speech\\` tool sends explicit voice when TTS is enabled.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport type { Page } from 'playwright-core';\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport {\n createReadFileTool,\n createWriteFileTool,\n createEditFileTool,\n createListDirTool,\n createGrepTool,\n createFindTool,\n createShellTool,\n createWebSearchTool,\n createWebFetchTool,\n createWebExtractTool,\n createMessageTool,\n createSendMediaTool,\n createMemorySearchTool,\n createMemoryGetTool,\n createTodoTool,\n createSessionStatusTool,\n createDreamingTool,\n createClarifyTool,\n} from './index.js';\nimport { createCuratedMemoryTool } from './curated-memory-tool.js';\nimport { createSessionSearchTool } from './session-search-tool.js';\nimport type { BuiltinMemoryStore } from '../memory/builtin-memory-store.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { parseSessionKey as parseRoutingSessionKey } from '../../routing/session-key.js';\nimport type { GatewayClarifyRequestFn } from './clarify-tool.js';\nimport { createImageTool } from './image-tool.js';\nimport { createImageGenerateTool } from './image-generate-tool.js';\nimport {\n BrowserManager,\n CdpSupervisor,\n resolveBrowserBackendFromConfig,\n} from '../../browser/index.js';\nimport { createBrowserUseTool } from './browser/tool/browser-use-tool.js';\nimport { createDelegateTool } from './delegate-tool.js';\nimport { buildSandboxToolMap, createExecuteCodeTool } from './execute-code-tool.js';\nimport { createCronjobTool } from './cronjob-tool.js';\nimport type { CronService } from '../../cron/index.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { wrapToolsWithProtection, type ToolExecutorConfig } from './executor.js';\nimport { createSkillsListTool, createSkillViewTool } from './skills-tools.js';\nimport { createSkillManageTool } from './skill-manage-tool.js';\nimport { createTextToSpeechTool } from './tts-tool.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\n\nconst log = createLogger('AgentToolsFactory');\n\n/** Channels where `clarify` can block for a user answer (web UI, Telegram, CLI readline). */\nconst CLARIFY_SUPPORTED_CHANNELS = new Set(['webchat', 'telegram', 'cli']);\n\nfunction clarifyTransportSource(sessionKey: string): string | undefined {\n const parsed = parseRoutingSessionKey(sessionKey);\n if (parsed) return parsed.source;\n // Fallback for simple `<channel>:<chatId>` keys used by webchat and CLI.\n const first = sessionKey.split(':').filter(Boolean)[0] ?? '';\n if (first === 'cli' || first === 'webchat') return first;\n return undefined;\n}\n\nexport interface ToolFactoryDeps {\n workspace: string;\n extensionRegistry?: any;\n getCurrentContext: () => { channel: string; chatId: string; sessionKey: string } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /** Agent defaults (image tools, etc.); use getter so hot-reloaded config applies. */\n getConfig?: () => Config | undefined;\n /** Session / default chat model for vision tool description. */\n getPrimaryModel?: () => Model<Api>;\n /** Built-in curated memory store (agent home `memories/`). */\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n /** Memory orchestration (prefetch/sync + external tools). */\n getMemoryManager?: () => MemoryManager;\n /** Session store for `session_search`. */\n getSessionStore?: () => SessionStore;\n /** When set (gateway webchat), enables the `clarify` tool. */\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: enables the `cronjob` tool. */\n getCronService?: () => CronService | undefined;\n /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */\n getSkillIndexingContext?: () =>\n | { registeredToolNames: string[]; skillAllowlist?: string[] }\n | undefined;\n /** After skill_manage mutates disk, reload skills + refresh agent prompts (optional). */\n onSkillsFilesystemMutate?: () => void;\n /** Names registered via skill_view for shell env passthrough. */\n getSkillPassthroughEnvVarNames?: () => string[];\n /** Add declared env names for the current session (no values stored). */\n registerSkillEnvPassthrough?: (names: string[]) => void;\n}\n\nexport interface CreateCoreToolsOptions {\n /** Workspace root for file/shell tools (defaults to factory workspace). */\n workspace?: string;\n /** Canonical `agents/<id>/profile/`: bare SOUL.md / IDENTITY.md resolve here after the workspace. */\n profileMarkdownRoot?: string;\n /** Tool `name` values to omit (e.g. `shell`, `extensions` for extension tools). */\n disabledTools?: Set<string>;\n /** Optional primary model for image tool heuristics. */\n getPrimaryModel?: () => Model<Api>;\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n getMemoryManager?: () => MemoryManager;\n /** When set, registers `skills_list` and `skill_view` bound to this workspace\\'s skills. */\n getSkillManager?: () => SkillManager;\n}\n\nexport class AgentToolsFactory {\n private browserManager: BrowserManager | null = null;\n /** One dialog/console supervisor per chat session (browser tab). */\n private readonly browserTaskSupervisors = new Map<string, CdpSupervisor>();\n\n constructor(private deps: ToolFactoryDeps) {}\n\n private browserSupervisorForTask(taskId: string): CdpSupervisor {\n let s = this.browserTaskSupervisors.get(taskId);\n if (!s) {\n const b = this.deps.getConfig?.()?.agents?.defaults?.browser;\n const dialogPolicy =\n b?.dialogPolicy === 'must_respond' || b?.dialogPolicy === 'auto_accept' || b?.dialogPolicy === 'auto_dismiss'\n ? b.dialogPolicy\n : 'auto_dismiss';\n const dialogTimeoutSeconds =\n typeof b?.dialogTimeoutSeconds === 'number' &&\n Number.isFinite(b.dialogTimeoutSeconds) &&\n b.dialogTimeoutSeconds >= 1\n ? Math.floor(b.dialogTimeoutSeconds)\n : 300;\n s = new CdpSupervisor({ dialogPolicy, dialogTimeoutSeconds });\n this.browserTaskSupervisors.set(taskId, s);\n }\n return s;\n }\n\n private async acquireBrowserPage(): Promise<Page> {\n const taskId = this.deps.getCurrentContext()?.sessionKey ?? 'default';\n const mgr = this.ensureBrowserManager();\n await mgr.ensureConnected();\n if (mgr.getExtensionProvider()) {\n return null as unknown as Page;\n }\n const page = await mgr.getPage(taskId);\n this.browserSupervisorForTask(taskId).attach(page);\n return page;\n }\n\n private ensureBrowserManager(): BrowserManager {\n if (!this.browserManager) {\n this.browserManager = new BrowserManager({\n getHeadless: () => this.deps.getConfig?.()?.agents?.defaults?.browser?.headless === true,\n getBackend: () => resolveBrowserBackendFromConfig(this.deps.getConfig?.()),\n });\n }\n return this.browserManager;\n }\n\n /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */\n async shutdownBrowser(): Promise<void> {\n if (!this.browserManager) {\n return;\n }\n await this.browserManager.shutdown();\n this.browserManager = null;\n this.browserTaskSupervisors.clear();\n }\n\n /** Drop the tab for a session when its agent instance is removed. */\n async closeBrowserPageForSession(sessionKey: string): Promise<void> {\n this.browserTaskSupervisors.delete(sessionKey);\n await this.browserManager?.closePage(sessionKey);\n }\n\n createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const workspace = options?.workspace ?? this.deps.workspace;\n const { bus } = this.deps;\n const getPrimary = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const getBuiltin = options?.getBuiltinMemoryStore ?? this.deps.getBuiltinMemoryStore;\n const builtinStore = getBuiltin?.();\n const memoriesDir = builtinStore?.memoriesDir;\n const getMemMgr = options?.getMemoryManager ?? this.deps.getMemoryManager;\n const getSkillMgr = options?.getSkillManager;\n const disabled = options?.disabledTools;\n\n const primary = getPrimary?.();\n const modelHasVision = primary?.input?.includes('image') ?? false;\n const cfg = this.deps.getConfig?.();\n const imageTool = createImageTool({\n config: cfg,\n workspace,\n modelHasVision,\n });\n const imageGenerateTool = createImageGenerateTool({\n config: cfg,\n workspace,\n });\n\n const optionalTools = [imageTool, imageGenerateTool].filter((t) => t != null) as any[];\n\n const readTool = createReadFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const writeTool = createWriteFileTool(workspace);\n const editTool = createEditFileTool(workspace);\n const listDir = createListDirTool(workspace);\n const grep = createGrepTool(workspace);\n const find = createFindTool(workspace);\n\n const core: AgentTool<any, any>[] = [\n createSessionStatusTool(),\n createDreamingTool({\n getWorkspace: () => workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n createClarifyTool({\n resolveAskUser: () => {\n const req = this.deps.gatewayClarify?.requestClarification;\n if (!req) return null;\n const ctx = this.deps.getCurrentContext();\n if (!ctx?.sessionKey) return null;\n const source = clarifyTransportSource(ctx.sessionKey);\n if (!source || !CLARIFY_SUPPORTED_CHANNELS.has(source)) return null;\n return (r) => req(ctx.sessionKey, r);\n },\n }),\n createTodoTool({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ...(getSkillMgr\n ? [\n createSkillsListTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n }),\n createSkillViewTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n registerSkillEnvPassthrough: this.deps.registerSkillEnvPassthrough,\n }),\n createSkillManageTool({\n getSkillManager: getSkillMgr,\n getWorkspace: () => workspace,\n onSkillsFilesystemMutate: this.deps.onSkillsFilesystemMutate,\n }),\n ]\n : []),\n readTool,\n writeTool,\n editTool,\n listDir,\n grep,\n find,\n createShellTool(workspace, {\n getSkillPassthroughEnvVarNames: this.deps.getSkillPassthroughEnvVarNames,\n }),\n createWebSearchTool(() => this.deps.getConfig?.()),\n createWebFetchTool(() => this.deps.getConfig?.()),\n createWebExtractTool({ getConfig: () => this.deps.getConfig?.() }),\n // Note: TTS is NOT handled by send_message tool anymore\n // TTS is applied at the ChannelManager dispatch layer\n createMessageTool(bus, () => this.deps.getCurrentContext()),\n ...(mergeTtsConfigFromAppConfig(cfg?.messages?.tts).enabled\n ? [\n createTextToSpeechTool({\n bus,\n getContext: () => this.deps.getCurrentContext(),\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createSendMediaTool(workspace, bus, () => this.deps.getCurrentContext()),\n createMemorySearchTool({ workspaceDir: workspace, memoriesDir }),\n createMemoryGetTool({ workspaceDir: workspace, memoriesDir }),\n ...(getBuiltin && shouldRegisterCuratedMemoryTool(this.deps.getConfig?.())\n ? [\n createCuratedMemoryTool(getBuiltin, {\n onMemoryWrite: (action, target, content) => {\n getMemMgr?.().onMemoryWrite(action, target, content);\n },\n }),\n ]\n : []),\n ...(getMemMgr?.().getAdditionalTools() ?? []),\n ...(this.deps.getSessionStore\n ? [\n createSessionSearchTool({\n getSessionStore: this.deps.getSessionStore,\n getConfig: this.deps.getConfig,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ]\n : []),\n ...(this.deps.getCronService\n ? [\n createCronjobTool({\n getCronService: this.deps.getCronService,\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.browser?.enabled !== false\n ? [\n createBrowserUseTool({\n getManager: () => this.ensureBrowserManager(),\n getPageForTask: () => this.acquireBrowserPage(),\n getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? 'default',\n getConfig: () => this.deps.getConfig?.(),\n getSupervisor: () =>\n this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? 'default'),\n notifyBrowserPageClosed: (taskId) => {\n this.browserTaskSupervisors.delete(taskId);\n },\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.delegate?.enabled === true && primary\n ? [\n createDelegateTool({\n workspace,\n getSubagentModel: () => {\n const gp = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const m = gp?.();\n if (!m) {\n throw new Error('No primary model configured for delegate_task');\n }\n return m;\n },\n bus: this.deps.bus,\n getConfig: () => this.deps.getConfig?.(),\n getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,\n hookRunner: this.deps.hookRunner,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n }),\n ]\n : []),\n ...optionalTools,\n ];\n\n return filterToolsByDisabledSet(core, disabled);\n }\n\n createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const coreTools = this.createCoreTools(coreOptions);\n const disableExtensions = coreOptions?.disabledTools?.has('extensions');\n const cfg = this.deps.getConfig?.();\n\n let bundled: AgentTool<any, any>[];\n if (!this.deps.extensionRegistry || disableExtensions) {\n bundled = coreTools;\n } else {\n const extensionTools = this.deps.extensionRegistry.getAllTools();\n log.info({ count: extensionTools.length }, 'Loaded extension tools');\n bundled = [...coreTools, ...extensionTools];\n }\n\n const wrapped = wrapToolsWithProtection(bundled, this.deps.toolExecutorConfig);\n\n const executeEnabled =\n cfg?.agents?.defaults?.executeCode?.enabled === true &&\n !coreOptions?.disabledTools?.has('execute_code');\n\n if (executeEnabled) {\n const sandboxMap = buildSandboxToolMap(wrapped);\n const executeTool = createExecuteCodeTool({ getSandboxToolMap: () => sandboxMap });\n const wrappedExecute = wrapToolsWithProtection([executeTool as any], this.deps.toolExecutorConfig);\n return [...wrapped, ...wrappedExecute];\n }\n\n return wrapped;\n }\n}\n\nfunction filterToolsByDisabledSet(\n tools: any[],\n disabled: Set<string> | undefined,\n): any[] {\n if (!disabled || disabled.size === 0) {\n return tools;\n }\n return tools.filter((t) => !disabled.has(t.name));\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"factory.js","names":["parseRoutingSessionKey"],"sources":["../../../../src/agent/tools/factory.ts"],"sourcesContent":["/**\n * Agent Tools Factory - Creates and configures agent tools\n *\n * Centralizes tool creation logic to keep service.ts focused on orchestration.\n *\n * TTS: auto TTS is applied at the ChannelManager via maybeApplyTtsToPayload().\n * Optional \\`text_to_speech\\` tool sends explicit voice when TTS is enabled.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport type { Page } from 'playwright-core';\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport {\n createReadFileTool,\n createWriteFileTool,\n createEditFileTool,\n createListDirTool,\n createGrepTool,\n createFindTool,\n createShellTool,\n createWebSearchTool,\n createWebFetchTool,\n createWebExtractTool,\n createMessageTool,\n createSendMediaTool,\n createMemorySearchTool,\n createMemoryGetTool,\n createTodoTool,\n createSessionStatusTool,\n createDreamingTool,\n createClarifyTool,\n} from './index.js';\nimport { createCuratedMemoryTool } from './curated-memory-tool.js';\nimport { createSessionSearchTool } from './session-search-tool.js';\nimport type { BuiltinMemoryStore } from '../memory/builtin-memory-store.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { parseSessionKey as parseRoutingSessionKey } from '../../routing/session-key.js';\nimport type { GatewayClarifyRequestFn } from './clarify-tool.js';\nimport { createImageTool } from './image-tool.js';\nimport { createImageGenerateTool } from './image-generate-tool.js';\nimport {\n BrowserManager,\n BrowserNotReadyError,\n CdpSupervisor,\n checkBrowserReadiness,\n resolveBrowserBackendFromConfig,\n} from '../../browser/index.js';\nimport { createBrowserUseTool } from './browser/tool/browser-use-tool.js';\nimport { createDelegateTool } from './delegate-tool.js';\nimport { buildSandboxToolMap, createExecuteCodeTool } from './execute-code-tool.js';\nimport { createCronjobTool } from './cronjob-tool.js';\nimport type { CronService } from '../../cron/index.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { wrapToolsWithProtection, type ToolExecutorConfig } from './executor.js';\nimport { createSkillsListTool, createSkillViewTool } from './skills-tools.js';\nimport { createSkillManageTool } from './skill-manage-tool.js';\nimport { createTextToSpeechTool } from './tts-tool.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\n\nconst log = createLogger('AgentToolsFactory');\n\n/** Channels where `clarify` can block for a user answer (web UI, Telegram, CLI readline). */\nconst CLARIFY_SUPPORTED_CHANNELS = new Set(['webchat', 'telegram', 'cli']);\n\nfunction clarifyTransportSource(sessionKey: string): string | undefined {\n const parsed = parseRoutingSessionKey(sessionKey);\n if (parsed) return parsed.source;\n // Fallback for simple `<channel>:<chatId>` keys used by webchat and CLI.\n const first = sessionKey.split(':').filter(Boolean)[0] ?? '';\n if (first === 'cli' || first === 'webchat') return first;\n return undefined;\n}\n\nexport interface ToolFactoryDeps {\n workspace: string;\n extensionRegistry?: any;\n getCurrentContext: () => { channel: string; chatId: string; sessionKey: string } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /** Agent defaults (image tools, etc.); use getter so hot-reloaded config applies. */\n getConfig?: () => Config | undefined;\n /** Session / default chat model for vision tool description. */\n getPrimaryModel?: () => Model<Api>;\n /** Built-in curated memory store (agent home `memories/`). */\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n /** Memory orchestration (prefetch/sync + external tools). */\n getMemoryManager?: () => MemoryManager;\n /** Session store for `session_search`. */\n getSessionStore?: () => SessionStore;\n /** When set (gateway webchat), enables the `clarify` tool. */\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: enables the `cronjob` tool. */\n getCronService?: () => CronService | undefined;\n /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */\n getSkillIndexingContext?: () =>\n | { registeredToolNames: string[]; skillAllowlist?: string[] }\n | undefined;\n /** After skill_manage mutates disk, reload skills + refresh agent prompts (optional). */\n onSkillsFilesystemMutate?: () => void;\n /** Names registered via skill_view for shell env passthrough. */\n getSkillPassthroughEnvVarNames?: () => string[];\n /** Add declared env names for the current session (no values stored). */\n registerSkillEnvPassthrough?: (names: string[]) => void;\n}\n\nexport interface CreateCoreToolsOptions {\n /** Workspace root for file/shell tools (defaults to factory workspace). */\n workspace?: string;\n /** Canonical `agents/<id>/profile/`: bare SOUL.md / IDENTITY.md resolve here after the workspace. */\n profileMarkdownRoot?: string;\n /** Tool `name` values to omit (e.g. `shell`, `extensions` for extension tools). */\n disabledTools?: Set<string>;\n /** Optional primary model for image tool heuristics. */\n getPrimaryModel?: () => Model<Api>;\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n getMemoryManager?: () => MemoryManager;\n /** When set, registers `skills_list` and `skill_view` bound to this workspace\\'s skills. */\n getSkillManager?: () => SkillManager;\n}\n\nexport class AgentToolsFactory {\n private browserManager: BrowserManager | null = null;\n /** One dialog/console supervisor per chat session (browser tab). */\n private readonly browserTaskSupervisors = new Map<string, CdpSupervisor>();\n /** Cached readiness probe — keyed by backend mode + extension host:port. */\n private browserReadinessCache: {\n key: string;\n expiresAt: number;\n inflight?: Promise<BrowserNotReadyError | null>;\n result?: BrowserNotReadyError | null;\n } | null = null;\n\n constructor(private deps: ToolFactoryDeps) {}\n\n private browserReadinessKey(): string {\n const cfg = this.deps.getConfig?.();\n const backend = resolveBrowserBackendFromConfig(cfg);\n const ext = cfg?.agents?.defaults?.browser?.extension;\n const host = typeof ext?.host === 'string' && ext.host.trim() ? ext.host.trim() : '127.0.0.1';\n const port = typeof ext?.port === 'number' ? ext.port : 19820;\n const cdpUrl = backend.mode === 'cdp' ? backend.config.wsEndpoint : '';\n const cloudKind = backend.mode === 'cloud' ? backend.config.type : '';\n return `${backend.mode}@${host}:${port}|${cdpUrl}|${cloudKind}`;\n }\n\n private async checkBrowserReadinessCached(): Promise<BrowserNotReadyError | null> {\n const key = this.browserReadinessKey();\n const now = Date.now();\n const cached = this.browserReadinessCache;\n if (cached && cached.key === key && cached.expiresAt > now && cached.inflight === undefined) {\n return cached.result ?? null;\n }\n if (cached && cached.key === key && cached.inflight) {\n return cached.inflight;\n }\n const inflight = checkBrowserReadiness(this.deps.getConfig?.());\n this.browserReadinessCache = { key, expiresAt: now + 30_000, inflight };\n try {\n const result = await inflight;\n this.browserReadinessCache = { key, expiresAt: Date.now() + 30_000, result };\n return result;\n } catch (e) {\n // Probe should never throw, but if it does we just bypass the cache.\n this.browserReadinessCache = null;\n log.warn({ err: e }, 'browserReadiness probe failed');\n return null;\n }\n }\n\n /** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */\n invalidateBrowserReadinessCache(): void {\n this.browserReadinessCache = null;\n }\n\n private browserSupervisorForTask(taskId: string): CdpSupervisor {\n let s = this.browserTaskSupervisors.get(taskId);\n if (!s) {\n const b = this.deps.getConfig?.()?.agents?.defaults?.browser;\n const dialogPolicy =\n b?.dialogPolicy === 'must_respond' || b?.dialogPolicy === 'auto_accept' || b?.dialogPolicy === 'auto_dismiss'\n ? b.dialogPolicy\n : 'auto_dismiss';\n const dialogTimeoutSeconds =\n typeof b?.dialogTimeoutSeconds === 'number' &&\n Number.isFinite(b.dialogTimeoutSeconds) &&\n b.dialogTimeoutSeconds >= 1\n ? Math.floor(b.dialogTimeoutSeconds)\n : 300;\n s = new CdpSupervisor({ dialogPolicy, dialogTimeoutSeconds });\n this.browserTaskSupervisors.set(taskId, s);\n }\n return s;\n }\n\n private async acquireBrowserPage(): Promise<Page> {\n const taskId = this.deps.getCurrentContext()?.sessionKey ?? 'default';\n const mgr = this.ensureBrowserManager();\n await mgr.ensureConnected();\n if (mgr.getExtensionProvider()) {\n return null as unknown as Page;\n }\n const page = await mgr.getPage(taskId);\n this.browserSupervisorForTask(taskId).attach(page);\n return page;\n }\n\n private ensureBrowserManager(): BrowserManager {\n if (!this.browserManager) {\n this.browserManager = new BrowserManager({\n getHeadless: () => this.deps.getConfig?.()?.agents?.defaults?.browser?.headless === true,\n getBackend: () => resolveBrowserBackendFromConfig(this.deps.getConfig?.()),\n });\n }\n return this.browserManager;\n }\n\n /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */\n async shutdownBrowser(): Promise<void> {\n this.browserReadinessCache = null;\n if (!this.browserManager) {\n return;\n }\n await this.browserManager.shutdown();\n this.browserManager = null;\n this.browserTaskSupervisors.clear();\n }\n\n /** Drop the tab for a session when its agent instance is removed. */\n async closeBrowserPageForSession(sessionKey: string): Promise<void> {\n this.browserTaskSupervisors.delete(sessionKey);\n await this.browserManager?.closePage(sessionKey);\n }\n\n createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const workspace = options?.workspace ?? this.deps.workspace;\n const { bus } = this.deps;\n const getPrimary = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const getBuiltin = options?.getBuiltinMemoryStore ?? this.deps.getBuiltinMemoryStore;\n const builtinStore = getBuiltin?.();\n const memoriesDir = builtinStore?.memoriesDir;\n const getMemMgr = options?.getMemoryManager ?? this.deps.getMemoryManager;\n const getSkillMgr = options?.getSkillManager;\n const disabled = options?.disabledTools;\n\n const primary = getPrimary?.();\n const modelHasVision = primary?.input?.includes('image') ?? false;\n const cfg = this.deps.getConfig?.();\n const imageTool = createImageTool({\n config: cfg,\n workspace,\n modelHasVision,\n });\n const imageGenerateTool = createImageGenerateTool({\n config: cfg,\n workspace,\n });\n\n const optionalTools = [imageTool, imageGenerateTool].filter((t) => t != null) as any[];\n\n const readTool = createReadFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const writeTool = createWriteFileTool(workspace);\n const editTool = createEditFileTool(workspace);\n const listDir = createListDirTool(workspace);\n const grep = createGrepTool(workspace);\n const find = createFindTool(workspace);\n\n const core: AgentTool<any, any>[] = [\n createSessionStatusTool(),\n createDreamingTool({\n getWorkspace: () => workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n createClarifyTool({\n resolveAskUser: () => {\n const req = this.deps.gatewayClarify?.requestClarification;\n if (!req) return null;\n const ctx = this.deps.getCurrentContext();\n if (!ctx?.sessionKey) return null;\n const source = clarifyTransportSource(ctx.sessionKey);\n if (!source || !CLARIFY_SUPPORTED_CHANNELS.has(source)) return null;\n return (r) => req(ctx.sessionKey, r);\n },\n }),\n createTodoTool({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ...(getSkillMgr\n ? [\n createSkillsListTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n }),\n createSkillViewTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n registerSkillEnvPassthrough: this.deps.registerSkillEnvPassthrough,\n }),\n createSkillManageTool({\n getSkillManager: getSkillMgr,\n getWorkspace: () => workspace,\n onSkillsFilesystemMutate: this.deps.onSkillsFilesystemMutate,\n }),\n ]\n : []),\n readTool,\n writeTool,\n editTool,\n listDir,\n grep,\n find,\n createShellTool(workspace, {\n getSkillPassthroughEnvVarNames: this.deps.getSkillPassthroughEnvVarNames,\n }),\n createWebSearchTool(() => this.deps.getConfig?.()),\n createWebFetchTool(() => this.deps.getConfig?.()),\n createWebExtractTool({ getConfig: () => this.deps.getConfig?.() }),\n // Note: TTS is NOT handled by send_message tool anymore\n // TTS is applied at the ChannelManager dispatch layer\n createMessageTool(bus, () => this.deps.getCurrentContext()),\n ...(mergeTtsConfigFromAppConfig(cfg?.messages?.tts).enabled\n ? [\n createTextToSpeechTool({\n bus,\n getContext: () => this.deps.getCurrentContext(),\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createSendMediaTool(workspace, bus, () => this.deps.getCurrentContext()),\n createMemorySearchTool({ workspaceDir: workspace, memoriesDir }),\n createMemoryGetTool({ workspaceDir: workspace, memoriesDir }),\n ...(getBuiltin && shouldRegisterCuratedMemoryTool(this.deps.getConfig?.())\n ? [\n createCuratedMemoryTool(getBuiltin, {\n onMemoryWrite: (action, target, content) => {\n getMemMgr?.().onMemoryWrite(action, target, content);\n },\n }),\n ]\n : []),\n ...(getMemMgr?.().getAdditionalTools() ?? []),\n ...(this.deps.getSessionStore\n ? [\n createSessionSearchTool({\n getSessionStore: this.deps.getSessionStore,\n getConfig: this.deps.getConfig,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ]\n : []),\n ...(this.deps.getCronService\n ? [\n createCronjobTool({\n getCronService: this.deps.getCronService,\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.browser?.enabled !== false\n ? [\n createBrowserUseTool({\n getManager: () => this.ensureBrowserManager(),\n getPageForTask: () => this.acquireBrowserPage(),\n getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? 'default',\n getConfig: () => this.deps.getConfig?.(),\n getReadiness: () => this.checkBrowserReadinessCached(),\n getSupervisor: () =>\n this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? 'default'),\n notifyBrowserPageClosed: (taskId) => {\n this.browserTaskSupervisors.delete(taskId);\n },\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.delegate?.enabled === true && primary\n ? [\n createDelegateTool({\n workspace,\n getSubagentModel: () => {\n const gp = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const m = gp?.();\n if (!m) {\n throw new Error('No primary model configured for delegate_task');\n }\n return m;\n },\n bus: this.deps.bus,\n getConfig: () => this.deps.getConfig?.(),\n getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,\n hookRunner: this.deps.hookRunner,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n // Injected so `child-agent-factory.ts` does not need to import\n // `AgentToolsFactory` directly (which would form a cycle).\n buildChildTools: (childOpts) => {\n const childFactory = new AgentToolsFactory({\n workspace: childOpts.workspace,\n bus: childOpts.bus,\n getCurrentContext: () => null,\n getConfig: childOpts.getConfig,\n getPrimaryModel: () => childOpts.model,\n toolExecutorConfig: childOpts.toolExecutorConfig,\n });\n return childFactory.createAllTools({\n workspace: childOpts.workspace,\n getPrimaryModel: () => childOpts.model,\n disabledTools: new Set(['extensions']),\n });\n },\n }),\n ]\n : []),\n ...optionalTools,\n ];\n\n return filterToolsByDisabledSet(core, disabled);\n }\n\n createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const coreTools = this.createCoreTools(coreOptions);\n const disableExtensions = coreOptions?.disabledTools?.has('extensions');\n const cfg = this.deps.getConfig?.();\n\n let bundled: AgentTool<any, any>[];\n if (!this.deps.extensionRegistry || disableExtensions) {\n bundled = coreTools;\n } else {\n const extensionTools = this.deps.extensionRegistry.getAllTools();\n log.info({ count: extensionTools.length }, 'Loaded extension tools');\n bundled = [...coreTools, ...extensionTools];\n }\n\n const wrapped = wrapToolsWithProtection(bundled, this.deps.toolExecutorConfig);\n\n const executeEnabled =\n cfg?.agents?.defaults?.executeCode?.enabled === true &&\n !coreOptions?.disabledTools?.has('execute_code');\n\n if (executeEnabled) {\n const sandboxMap = buildSandboxToolMap(wrapped);\n const executeTool = createExecuteCodeTool({ getSandboxToolMap: () => sandboxMap });\n const wrappedExecute = wrapToolsWithProtection([executeTool as any], this.deps.toolExecutorConfig);\n return [...wrapped, ...wrappedExecute];\n }\n\n return wrapped;\n }\n}\n\nfunction filterToolsByDisabledSet(\n tools: any[],\n disabled: Set<string> | undefined,\n): any[] {\n if (!disabled || disabled.size === 0) {\n return tools;\n }\n return tools.filter((t) => !disabled.has(t.name));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAwCyF;aAgBpC;AAQrD,MAAM,MAAM,aAAa,oBAAoB;;AAG7C,MAAM,6BAA6B,IAAI,IAAI;CAAC;CAAW;CAAY;CAAM,CAAC;AAE1E,SAAS,uBAAuB,YAAwC;CACtE,MAAM,SAASA,gBAAuB,WAAW;AACjD,KAAI,OAAQ,QAAO,OAAO;CAE1B,MAAM,QAAQ,WAAW,MAAM,IAAI,CAAC,OAAO,QAAQ,CAAC,MAAM;AAC1D,KAAI,UAAU,SAAS,UAAU,UAAW,QAAO;;AAoDrD,IAAa,oBAAb,MAAa,kBAAkB;CAC7B,iBAAgD;;CAEhD,yCAA0C,IAAI,KAA4B;;CAE1E,wBAKW;CAEX,YAAY,MAA+B;AAAvB,OAAA,OAAA;;CAEpB,sBAAsC;EACpC,MAAM,MAAM,KAAK,KAAK,aAAa;EACnC,MAAM,UAAU,gCAAgC,IAAI;EACpD,MAAM,MAAM,KAAK,QAAQ,UAAU,SAAS;EAC5C,MAAM,OAAO,OAAO,KAAK,SAAS,YAAY,IAAI,KAAK,MAAM,GAAG,IAAI,KAAK,MAAM,GAAG;EAClF,MAAM,OAAO,OAAO,KAAK,SAAS,WAAW,IAAI,OAAO;EACxD,MAAM,SAAS,QAAQ,SAAS,QAAQ,QAAQ,OAAO,aAAa;EACpE,MAAM,YAAY,QAAQ,SAAS,UAAU,QAAQ,OAAO,OAAO;AACnE,SAAO,GAAG,QAAQ,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG;;CAGtD,MAAc,8BAAoE;EAChF,MAAM,MAAM,KAAK,qBAAqB;EACtC,MAAM,MAAM,KAAK,KAAK;EACtB,MAAM,SAAS,KAAK;AACpB,MAAI,UAAU,OAAO,QAAQ,OAAO,OAAO,YAAY,OAAO,OAAO,aAAa,KAAA,EAChF,QAAO,OAAO,UAAU;AAE1B,MAAI,UAAU,OAAO,QAAQ,OAAO,OAAO,SACzC,QAAO,OAAO;EAEhB,MAAM,WAAW,sBAAsB,KAAK,KAAK,aAAa,CAAC;AAC/D,OAAK,wBAAwB;GAAE;GAAK,WAAW,MAAM;GAAQ;GAAU;AACvE,MAAI;GACF,MAAM,SAAS,MAAM;AACrB,QAAK,wBAAwB;IAAE;IAAK,WAAW,KAAK,KAAK,GAAG;IAAQ;IAAQ;AAC5E,UAAO;WACA,GAAG;AAEV,QAAK,wBAAwB;AAC7B,OAAI,KAAK,EAAE,KAAK,GAAG,EAAE,gCAAgC;AACrD,UAAO;;;;CAKX,kCAAwC;AACtC,OAAK,wBAAwB;;CAG/B,yBAAiC,QAA+B;EAC9D,IAAI,IAAI,KAAK,uBAAuB,IAAI,OAAO;AAC/C,MAAI,CAAC,GAAG;GACN,MAAM,IAAI,KAAK,KAAK,aAAa,EAAE,QAAQ,UAAU;AAWrD,OAAI,IAAI,cAAc;IAAE,cATtB,GAAG,iBAAiB,kBAAkB,GAAG,iBAAiB,iBAAiB,GAAG,iBAAiB,iBAC3F,EAAE,eACF;IAOgC,sBALpC,OAAO,GAAG,yBAAyB,YACnC,OAAO,SAAS,EAAE,qBAAqB,IACvC,EAAE,wBAAwB,IACtB,KAAK,MAAM,EAAE,qBAAqB,GAClC;IACsD,CAAC;AAC7D,QAAK,uBAAuB,IAAI,QAAQ,EAAE;;AAE5C,SAAO;;CAGT,MAAc,qBAAoC;EAChD,MAAM,SAAS,KAAK,KAAK,mBAAmB,EAAE,cAAc;EAC5D,MAAM,MAAM,KAAK,sBAAsB;AACvC,QAAM,IAAI,iBAAiB;AAC3B,MAAI,IAAI,sBAAsB,CAC5B,QAAO;EAET,MAAM,OAAO,MAAM,IAAI,QAAQ,OAAO;AACtC,OAAK,yBAAyB,OAAO,CAAC,OAAO,KAAK;AAClD,SAAO;;CAGT,uBAA+C;AAC7C,MAAI,CAAC,KAAK,eACR,MAAK,iBAAiB,IAAI,eAAe;GACvC,mBAAmB,KAAK,KAAK,aAAa,EAAE,QAAQ,UAAU,SAAS,aAAa;GACpF,kBAAkB,gCAAgC,KAAK,KAAK,aAAa,CAAC;GAC3E,CAAC;AAEJ,SAAO,KAAK;;;CAId,MAAM,kBAAiC;AACrC,OAAK,wBAAwB;AAC7B,MAAI,CAAC,KAAK,eACR;AAEF,QAAM,KAAK,eAAe,UAAU;AACpC,OAAK,iBAAiB;AACtB,OAAK,uBAAuB,OAAO;;;CAIrC,MAAM,2BAA2B,YAAmC;AAClE,OAAK,uBAAuB,OAAO,WAAW;AAC9C,QAAM,KAAK,gBAAgB,UAAU,WAAW;;CAGlD,gBAAgB,SAAyD;EACvE,MAAM,YAAY,SAAS,aAAa,KAAK,KAAK;EAClD,MAAM,EAAE,QAAQ,KAAK;EACrB,MAAM,aAAa,SAAS,mBAAmB,KAAK,KAAK;EACzD,MAAM,aAAa,SAAS,yBAAyB,KAAK,KAAK;EAE/D,MAAM,eADe,cAAc,GACD;EAClC,MAAM,YAAY,SAAS,oBAAoB,KAAK,KAAK;EACzD,MAAM,cAAc,SAAS;EAC7B,MAAM,WAAW,SAAS;EAE1B,MAAM,UAAU,cAAc;EAC9B,MAAM,iBAAiB,SAAS,OAAO,SAAS,QAAQ,IAAI;EAC5D,MAAM,MAAM,KAAK,KAAK,aAAa;EAWnC,MAAM,gBAAgB,CAVJ,gBAAgB;GAChC,QAAQ;GACR;GACA;GACD,CAM+B,EALN,wBAAwB;GAChD,QAAQ;GACR;GACD,CAEkD,CAAC,CAAC,QAAQ,MAAM,KAAK,KAAK;EAE7E,MAAM,WAAW,mBAAmB,WAAW,EAC7C,qBAAqB,SAAS,qBAC/B,CAAC;EACF,MAAM,YAAY,oBAAoB,UAAU;EAChD,MAAM,WAAW,mBAAmB,UAAU;EAC9C,MAAM,UAAU,kBAAkB,UAAU;EAC5C,MAAM,OAAO,eAAe,UAAU;EACtC,MAAM,OAAO,eAAe,UAAU;AAqJtC,SAAO,yBAAyB;GAlJ9B,yBAAyB;GACzB,mBAAmB;IACjB,oBAAoB;IACpB,iBAAiB,KAAK,KAAK,aAAa;IACzC,CAAC;GACF,kBAAkB,EAChB,sBAAsB;IACpB,MAAM,MAAM,KAAK,KAAK,gBAAgB;AACtC,QAAI,CAAC,IAAK,QAAO;IACjB,MAAM,MAAM,KAAK,KAAK,mBAAmB;AACzC,QAAI,CAAC,KAAK,WAAY,QAAO;IAC7B,MAAM,SAAS,uBAAuB,IAAI,WAAW;AACrD,QAAI,CAAC,UAAU,CAAC,2BAA2B,IAAI,OAAO,CAAE,QAAO;AAC/D,YAAQ,MAAM,IAAI,IAAI,YAAY,EAAE;MAEvC,CAAC;GACF,eAAe,EACb,qBAAqB,KAAK,KAAK,mBAAmB,EAAE,YACrD,CAAC;GACF,GAAI,cACA;IACE,qBAAqB;KACnB,iBAAiB;KACjB,yBAAyB,KAAK,KAAK;KACpC,CAAC;IACF,oBAAoB;KAClB,iBAAiB;KACjB,yBAAyB,KAAK,KAAK;KACnC,6BAA6B,KAAK,KAAK;KACxC,CAAC;IACF,sBAAsB;KACpB,iBAAiB;KACjB,oBAAoB;KACpB,0BAA0B,KAAK,KAAK;KACrC,CAAC;IACH,GACD,EAAE;GACN;GACA;GACA;GACA;GACA;GACA;GACA,gBAAgB,WAAW,EACzB,gCAAgC,KAAK,KAAK,gCAC3C,CAAC;GACF,0BAA0B,KAAK,KAAK,aAAa,CAAC;GAClD,yBAAyB,KAAK,KAAK,aAAa,CAAC;GACjD,qBAAqB,EAAE,iBAAiB,KAAK,KAAK,aAAa,EAAE,CAAC;GAGlE,kBAAkB,WAAW,KAAK,KAAK,mBAAmB,CAAC;GAC3D,GAAI,4BAA4B,KAAK,UAAU,IAAI,CAAC,UAChD,CACE,uBAAuB;IACrB;IACA,kBAAkB,KAAK,KAAK,mBAAmB;IAC/C,iBAAiB,KAAK,KAAK,aAAa;IACzC,CAAC,CACH,GACD,EAAE;GACN,oBAAoB,WAAW,WAAW,KAAK,KAAK,mBAAmB,CAAC;GACxE,uBAAuB;IAAE,cAAc;IAAW;IAAa,CAAC;GAChE,oBAAoB;IAAE,cAAc;IAAW;IAAa,CAAC;GAC7D,GAAI,cAAc,gCAAgC,KAAK,KAAK,aAAa,CAAC,GACtE,CACE,wBAAwB,YAAY,EAClC,gBAAgB,QAAQ,QAAQ,YAAY;AAC1C,iBAAa,CAAC,cAAc,QAAQ,QAAQ,QAAQ;MAEvD,CAAC,CACH,GACD,EAAE;GACN,GAAI,aAAa,CAAC,oBAAoB,IAAI,EAAE;GAC5C,GAAI,KAAK,KAAK,kBACV,CACE,wBAAwB;IACtB,iBAAiB,KAAK,KAAK;IAC3B,WAAW,KAAK,KAAK;IACrB,4BAA4B,KAAK,KAAK,mBAAmB,EAAE;IAC5D,CAAC,CACH,GACD,EAAE;GACN,GAAI,KAAK,KAAK,iBACV,CACE,kBAAkB,EAChB,gBAAgB,KAAK,KAAK,gBAC3B,CAAC,CACH,GACD,EAAE;GACN,GAAI,KAAK,QAAQ,UAAU,SAAS,YAAY,QAC5C,CACE,qBAAqB;IACnB,kBAAkB,KAAK,sBAAsB;IAC7C,sBAAsB,KAAK,oBAAoB;IAC/C,iBAAiB,KAAK,KAAK,mBAAmB,EAAE,cAAc;IAC9D,iBAAiB,KAAK,KAAK,aAAa;IACxC,oBAAoB,KAAK,6BAA6B;IACtD,qBACE,KAAK,yBAAyB,KAAK,KAAK,mBAAmB,EAAE,cAAc,UAAU;IACvF,0BAA0B,WAAW;AACnC,UAAK,uBAAuB,OAAO,OAAO;;IAE7C,CAAC,CACH,GACD,EAAE;GACN,GAAI,KAAK,QAAQ,UAAU,UAAU,YAAY,QAAQ,UACrD,CACE,mBAAmB;IACjB;IACA,wBAAwB;KAEtB,MAAM,KADK,SAAS,mBAAmB,KAAK,KAAK,oBACjC;AAChB,SAAI,CAAC,EACH,OAAM,IAAI,MAAM,gDAAgD;AAElE,YAAO;;IAET,KAAK,KAAK,KAAK;IACf,iBAAiB,KAAK,KAAK,aAAa;IACxC,yBAAyB,KAAK,KAAK,qBAAqB,IAAI;IAC5D,YAAY,KAAK,KAAK;IACtB,oBAAoB,KAAK,KAAK;IAG9B,kBAAkB,cAAc;AAS9B,YAAO,IARkB,kBAAkB;MACzC,WAAW,UAAU;MACrB,KAAK,UAAU;MACf,yBAAyB;MACzB,WAAW,UAAU;MACrB,uBAAuB,UAAU;MACjC,oBAAoB,UAAU;MAC/B,CACkB,CAAC,eAAe;MACjC,WAAW,UAAU;MACrB,uBAAuB,UAAU;MACjC,eAAe,IAAI,IAAI,CAAC,aAAa,CAAC;MACvC,CAAC;;IAEL,CAAC,CACH,GACD,EAAE;GACN,GAAG;GAG+B,EAAE,SAAS;;CAGjD,eAAe,aAA6D;EAC1E,MAAM,YAAY,KAAK,gBAAgB,YAAY;EACnD,MAAM,oBAAoB,aAAa,eAAe,IAAI,aAAa;EACvE,MAAM,MAAM,KAAK,KAAK,aAAa;EAEnC,IAAI;AACJ,MAAI,CAAC,KAAK,KAAK,qBAAqB,kBAClC,WAAU;OACL;GACL,MAAM,iBAAiB,KAAK,KAAK,kBAAkB,aAAa;AAChE,OAAI,KAAK,EAAE,OAAO,eAAe,QAAQ,EAAE,yBAAyB;AACpE,aAAU,CAAC,GAAG,WAAW,GAAG,eAAe;;EAG7C,MAAM,UAAU,wBAAwB,SAAS,KAAK,KAAK,mBAAmB;AAM9E,MAHE,KAAK,QAAQ,UAAU,aAAa,YAAY,QAChD,CAAC,aAAa,eAAe,IAAI,eAAe,EAE9B;GAClB,MAAM,aAAa,oBAAoB,QAAQ;GAE/C,MAAM,iBAAiB,wBAAwB,CAD3B,sBAAsB,EAAE,yBAAyB,YAAY,CACtB,CAAQ,EAAE,KAAK,KAAK,mBAAmB;AAClG,UAAO,CAAC,GAAG,SAAS,GAAG,eAAe;;AAGxC,SAAO;;;AAIX,SAAS,yBACP,OACA,UACO;AACP,KAAI,CAAC,YAAY,SAAS,SAAS,EACjC,QAAO;AAET,QAAO,MAAM,QAAQ,MAAM,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC"}