@poolzin/pool-bot 2026.2.21 → 2026.2.23

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 (378) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/agents/api-key-rotation.js +47 -0
  3. package/dist/agents/apply-patch-update.js +19 -9
  4. package/dist/agents/apply-patch.js +72 -47
  5. package/dist/agents/bash-tools.exec.js +141 -559
  6. package/dist/agents/cli-backends.js +49 -6
  7. package/dist/agents/cli-runner/helpers.js +69 -152
  8. package/dist/agents/cli-runner.js +70 -19
  9. package/dist/agents/identity.js +20 -1
  10. package/dist/agents/image-sanitization.js +9 -0
  11. package/dist/agents/live-auth-keys.js +123 -26
  12. package/dist/agents/live-model-filter.js +13 -4
  13. package/dist/agents/model-catalog.js +40 -9
  14. package/dist/agents/model-forward-compat.js +60 -23
  15. package/dist/agents/model-selection.js +134 -41
  16. package/dist/agents/pi-auth-json.js +2 -2
  17. package/dist/agents/pi-embedded-helpers/bootstrap.js +65 -15
  18. package/dist/agents/pi-embedded-helpers/errors.js +140 -15
  19. package/dist/agents/pi-embedded-helpers/images.js +22 -12
  20. package/dist/agents/pi-embedded-helpers.js +2 -2
  21. package/dist/agents/pi-embedded-runner/abort.js +10 -3
  22. package/dist/agents/pi-embedded-runner/compact.js +230 -32
  23. package/dist/agents/pi-embedded-runner/extra-params.js +203 -12
  24. package/dist/agents/pi-embedded-runner/google.js +109 -19
  25. package/dist/agents/pi-embedded-runner/history.js +35 -17
  26. package/dist/agents/pi-embedded-runner/run/attempt.js +386 -95
  27. package/dist/agents/pi-embedded-runner/run/images.js +81 -55
  28. package/dist/agents/pi-embedded-runner/run/payloads.js +89 -39
  29. package/dist/agents/pi-embedded-runner/run.js +193 -25
  30. package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +2 -2
  31. package/dist/agents/pi-embedded-runner/runs.js +17 -8
  32. package/dist/agents/pi-embedded-runner/tool-result-context-guard.js +262 -0
  33. package/dist/agents/pi-embedded-runner.js +1 -1
  34. package/dist/agents/pi-embedded-subscribe.handlers.tools.js +180 -10
  35. package/dist/agents/pi-embedded-subscribe.js +37 -0
  36. package/dist/agents/pi-embedded-subscribe.tools.js +127 -30
  37. package/dist/agents/pi-model-discovery.js +9 -2
  38. package/dist/agents/pi-tool-definition-adapter.js +60 -8
  39. package/dist/agents/pi-tools.before-tool-call.js +1 -1
  40. package/dist/agents/pi-tools.js +113 -94
  41. package/dist/agents/pi-tools.read.js +337 -38
  42. package/dist/agents/poolbot-tools.js +14 -5
  43. package/dist/agents/sandbox/docker.js +10 -5
  44. package/dist/agents/sandbox/registry.js +96 -46
  45. package/dist/agents/sandbox/sanitize-env-vars.js +82 -0
  46. package/dist/agents/sandbox-paths.js +43 -10
  47. package/dist/agents/session-tool-result-guard-wrapper.js +23 -11
  48. package/dist/agents/session-tool-result-guard.js +39 -39
  49. package/dist/agents/session-transcript-repair.js +36 -33
  50. package/dist/agents/session-write-lock.js +62 -44
  51. package/dist/agents/skills/frontmatter.js +49 -88
  52. package/dist/agents/skills/workspace.js +335 -28
  53. package/dist/agents/subagent-announce.js +508 -174
  54. package/dist/agents/subagent-registry.js +45 -4
  55. package/dist/agents/subagent-spawn.js +16 -33
  56. package/dist/agents/system-prompt-report.js +27 -10
  57. package/dist/agents/system-prompt.js +26 -32
  58. package/dist/agents/tool-call-id.js +69 -17
  59. package/dist/agents/tool-display-common.js +1 -1
  60. package/dist/agents/tool-images.js +64 -31
  61. package/dist/agents/tools/canvas-tool.js +17 -11
  62. package/dist/agents/tools/common.js +37 -19
  63. package/dist/agents/tools/cron-tool.js +40 -38
  64. package/dist/agents/tools/gateway.js +70 -2
  65. package/dist/agents/tools/message-tool.js +181 -40
  66. package/dist/agents/tools/nodes-tool.js +128 -36
  67. package/dist/agents/tools/nodes-utils.js +12 -38
  68. package/dist/agents/tools/session-status-tool.js +24 -71
  69. package/dist/agents/tools/sessions-helpers.js +38 -210
  70. package/dist/agents/tools/sessions-spawn-tool.js +28 -198
  71. package/dist/agents/tools/telegram-actions.js +58 -7
  72. package/dist/agents/tools/web-fetch-utils.js +112 -7
  73. package/dist/agents/tools/web-fetch.js +279 -175
  74. package/dist/agents/tools/web-shared.js +71 -8
  75. package/dist/agents/usage.js +25 -16
  76. package/dist/auto-reply/commands-registry.data.js +85 -11
  77. package/dist/auto-reply/dispatch.js +40 -21
  78. package/dist/auto-reply/reply/abort.js +102 -33
  79. package/dist/auto-reply/reply/commands-core.js +82 -33
  80. package/dist/auto-reply/reply/commands-export-session.js +1 -1
  81. package/dist/auto-reply/reply/commands-info.js +41 -12
  82. package/dist/auto-reply/reply/commands-subagents.js +352 -100
  83. package/dist/auto-reply/reply/commands-system-prompt.js +2 -2
  84. package/dist/auto-reply/reply/dispatch-from-config.js +100 -29
  85. package/dist/auto-reply/reply/elevated-unavailable.js +1 -1
  86. package/dist/auto-reply/reply/inbound-meta.js +12 -1
  87. package/dist/auto-reply/reply/mentions.js +18 -11
  88. package/dist/auto-reply/reply/normalize-reply.js +17 -8
  89. package/dist/auto-reply/reply/reply-dispatcher.js +62 -10
  90. package/dist/auto-reply/reply/session.js +102 -21
  91. package/dist/auto-reply/reply/streaming-directives.js +16 -5
  92. package/dist/auto-reply/status.js +73 -50
  93. package/dist/browser/extension-relay.js +3 -3
  94. package/dist/browser/http-auth.js +1 -1
  95. package/dist/browser/paths.js +2 -2
  96. package/dist/build-info.json +3 -3
  97. package/dist/channels/allowlist-match.js +20 -0
  98. package/dist/channels/allowlists/resolve-utils.js +65 -2
  99. package/dist/channels/chat-type.js +8 -4
  100. package/dist/channels/dock.js +127 -35
  101. package/dist/channels/draft-stream-loop.js +6 -2
  102. package/dist/channels/plugins/actions/telegram.js +42 -18
  103. package/dist/channels/plugins/allowlist-match.js +1 -1
  104. package/dist/channels/plugins/group-mentions.js +51 -41
  105. package/dist/channels/plugins/message-action-names.js +2 -0
  106. package/dist/channels/plugins/message-actions.js +24 -5
  107. package/dist/channels/plugins/normalize/discord.js +26 -4
  108. package/dist/channels/plugins/normalize/signal.js +35 -22
  109. package/dist/channels/plugins/onboarding/helpers.js +8 -26
  110. package/dist/channels/plugins/outbound/imessage.js +15 -14
  111. package/dist/channels/registry.js +20 -7
  112. package/dist/cli/acp-cli.js +7 -5
  113. package/dist/cli/browser-cli-extension.js +25 -12
  114. package/dist/cli/browser-cli-state.cookies-storage.js +25 -6
  115. package/dist/cli/browser-cli-state.js +101 -145
  116. package/dist/cli/command-options.js +28 -0
  117. package/dist/cli/completion-cli.js +6 -6
  118. package/dist/cli/cron-cli/register.cron-add.js +25 -1
  119. package/dist/cli/cron-cli/register.cron-edit.js +44 -0
  120. package/dist/cli/cron-cli/shared.js +7 -1
  121. package/dist/cli/daemon-cli/lifecycle-core.js +23 -21
  122. package/dist/cli/daemon-cli/lifecycle.js +23 -247
  123. package/dist/cli/daemon-cli/register-service-commands.js +25 -4
  124. package/dist/cli/daemon-cli.js +1 -0
  125. package/dist/cli/devices-cli.js +33 -20
  126. package/dist/cli/gateway-cli/register.js +37 -105
  127. package/dist/cli/gateway-cli/run.js +49 -11
  128. package/dist/cli/nodes-camera.js +59 -4
  129. package/dist/cli/nodes-cli/register.camera.js +27 -24
  130. package/dist/cli/nodes-cli/rpc.js +21 -38
  131. package/dist/cli/qr-cli.js +2 -2
  132. package/dist/cli/skills-cli.format.js +2 -2
  133. package/dist/cli/update-cli/progress.js +2 -2
  134. package/dist/cli/update-cli/restart-helper.js +28 -7
  135. package/dist/cli/update-cli/shared.js +7 -7
  136. package/dist/cli/update-cli/status.js +1 -1
  137. package/dist/cli/update-cli/update-command.js +14 -8
  138. package/dist/cli/update-cli/wizard.js +2 -2
  139. package/dist/cli/update-cli.js +21 -1027
  140. package/dist/commands/auth-choice.apply.anthropic.js +10 -2
  141. package/dist/commands/channels/add-mutators.js +3 -35
  142. package/dist/commands/channels/add.js +39 -51
  143. package/dist/commands/config-validation.js +1 -1
  144. package/dist/commands/configure.gateway-auth.js +52 -15
  145. package/dist/commands/configure.gateway.js +84 -40
  146. package/dist/commands/doctor-completion.js +3 -3
  147. package/dist/commands/doctor-config-flow.js +536 -16
  148. package/dist/commands/doctor-gateway-services.js +103 -79
  149. package/dist/commands/doctor-memory-search.js +9 -9
  150. package/dist/commands/doctor-platform-notes.js +57 -30
  151. package/dist/commands/doctor-prompter.js +26 -15
  152. package/dist/commands/doctor-session-locks.js +1 -1
  153. package/dist/commands/doctor.js +21 -9
  154. package/dist/commands/model-picker.js +120 -95
  155. package/dist/commands/models/set.js +2 -21
  156. package/dist/commands/models/shared.js +65 -37
  157. package/dist/commands/onboard-helpers.js +81 -39
  158. package/dist/commands/openai-codex-oauth.js +1 -1
  159. package/dist/commands/sessions.js +52 -53
  160. package/dist/commands/status.summary.js +52 -34
  161. package/dist/commands/test-wizard-helpers.js +2 -2
  162. package/dist/config/defaults.js +79 -42
  163. package/dist/config/group-policy.js +50 -18
  164. package/dist/config/includes.js +37 -10
  165. package/dist/config/schema.help.js +5 -4
  166. package/dist/config/schema.hints.js +2 -2
  167. package/dist/config/schema.labels.js +1 -0
  168. package/dist/config/sessions/group.js +12 -11
  169. package/dist/config/sessions/paths.js +137 -11
  170. package/dist/config/sessions/store.js +185 -65
  171. package/dist/config/sessions/types.js +15 -1
  172. package/dist/config/sessions.js +1 -0
  173. package/dist/config/telegram-custom-commands.js +3 -2
  174. package/dist/config/types.js +2 -0
  175. package/dist/config/zod-schema.agent-defaults.js +6 -27
  176. package/dist/config/zod-schema.agent-runtime.js +171 -79
  177. package/dist/config/zod-schema.providers-core.js +138 -65
  178. package/dist/config/zod-schema.session.js +49 -22
  179. package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -1
  180. package/dist/cron/isolated-agent/run.js +224 -57
  181. package/dist/cron/normalize.js +48 -45
  182. package/dist/cron/run-log.js +14 -0
  183. package/dist/cron/service/jobs.js +190 -28
  184. package/dist/cron/service/normalize.js +29 -11
  185. package/dist/cron/service/store.js +30 -44
  186. package/dist/cron/service/timer.js +182 -96
  187. package/dist/cron/service.js +3 -0
  188. package/dist/cron/stagger.js +37 -0
  189. package/dist/daemon/inspect.js +132 -92
  190. package/dist/daemon/runtime-paths.js +25 -4
  191. package/dist/daemon/service-audit.js +47 -16
  192. package/dist/discord/accounts.js +23 -20
  193. package/dist/discord/monitor/agent-components.js +1115 -219
  194. package/dist/discord/monitor/allow-list.js +114 -34
  195. package/dist/discord/monitor/listeners.js +204 -97
  196. package/dist/discord/monitor/message-handler.js +21 -10
  197. package/dist/discord/monitor/message-handler.preflight.js +195 -101
  198. package/dist/discord/monitor/message-handler.process.js +384 -123
  199. package/dist/discord/monitor/message-utils.js +86 -23
  200. package/dist/discord/monitor/native-command.js +77 -57
  201. package/dist/discord/monitor/provider.js +122 -117
  202. package/dist/discord/monitor/reply-context.js +20 -16
  203. package/dist/discord/monitor/reply-delivery.js +40 -8
  204. package/dist/discord/monitor/rest-fetch.js +22 -0
  205. package/dist/discord/monitor/threading.js +117 -24
  206. package/dist/discord/send.js +2 -1
  207. package/dist/discord/send.outbound.js +124 -11
  208. package/dist/discord/send.shared.js +112 -72
  209. package/dist/discord/voice-message.js +3 -3
  210. package/dist/gateway/auth.js +119 -44
  211. package/dist/gateway/call.js +76 -34
  212. package/dist/gateway/channel-health-monitor.js +57 -50
  213. package/dist/gateway/client.js +63 -29
  214. package/dist/gateway/control-ui-contract.js +1 -1
  215. package/dist/gateway/gateway-config-prompts.shared.js +2 -2
  216. package/dist/gateway/net.js +109 -1
  217. package/dist/gateway/protocol/index.js +5 -8
  218. package/dist/gateway/protocol/schema/agent.js +19 -1
  219. package/dist/gateway/protocol/schema/channels.js +21 -0
  220. package/dist/gateway/protocol/schema/cron.js +43 -30
  221. package/dist/gateway/protocol/schema/protocol-schemas.js +6 -11
  222. package/dist/gateway/protocol/schema/sessions.js +5 -1
  223. package/dist/gateway/protocol/schema.js +0 -1
  224. package/dist/gateway/server/presence-events.js +12 -0
  225. package/dist/gateway/server/ws-connection/message-handler.js +203 -212
  226. package/dist/gateway/server/ws-connection.js +58 -21
  227. package/dist/gateway/server-broadcast.js +18 -13
  228. package/dist/gateway/server-cron.js +177 -10
  229. package/dist/gateway/server-methods/agent-job.js +131 -38
  230. package/dist/gateway/server-methods/send.js +60 -14
  231. package/dist/gateway/server-methods/sessions.js +160 -96
  232. package/dist/gateway/server-methods/system.js +5 -7
  233. package/dist/gateway/server-methods-list.js +8 -0
  234. package/dist/gateway/server-methods.js +24 -8
  235. package/dist/gateway/server-node-events.js +278 -68
  236. package/dist/gateway/session-utils.fs.js +316 -75
  237. package/dist/gateway/session-utils.js +224 -70
  238. package/dist/gateway/sessions-patch.js +63 -20
  239. package/dist/gateway/test-temp-config.js +1 -1
  240. package/dist/gateway/tools-invoke-http.js +118 -70
  241. package/dist/gateway/ws-log.js +135 -107
  242. package/dist/hooks/frontmatter.js +36 -82
  243. package/dist/hooks/install.js +149 -139
  244. package/dist/hooks/internal-hooks.js +29 -4
  245. package/dist/hooks/plugin-hooks.js +2 -1
  246. package/dist/imessage/monitor/deliver.js +10 -4
  247. package/dist/imessage/monitor/monitor-provider.js +138 -375
  248. package/dist/imessage/monitor/runtime.js +4 -8
  249. package/dist/imessage/send.js +65 -19
  250. package/dist/infra/exec-approvals-allowlist.js +7 -0
  251. package/dist/infra/exec-approvals.js +35 -920
  252. package/dist/infra/exec-safe-bin-trust.js +64 -0
  253. package/dist/infra/heartbeat-runner.js +207 -134
  254. package/dist/infra/heartbeat-wake.js +183 -22
  255. package/dist/infra/install-source-utils.js +47 -0
  256. package/dist/infra/net/ssrf.js +170 -36
  257. package/dist/infra/outbound/deliver.js +224 -58
  258. package/dist/infra/outbound/message-action-spec.js +12 -5
  259. package/dist/infra/outbound/outbound-session.js +27 -25
  260. package/dist/infra/poolbot-root.js +32 -22
  261. package/dist/infra/ports.js +14 -11
  262. package/dist/infra/skills-remote.js +48 -37
  263. package/dist/infra/system-events.js +25 -11
  264. package/dist/infra/system-presence.js +26 -33
  265. package/dist/infra/tmp-poolbot-dir.js +81 -2
  266. package/dist/infra/wsl.js +37 -1
  267. package/dist/line/bot-message-context.js +163 -191
  268. package/dist/logging/subsystem.js +59 -22
  269. package/dist/markdown/ir.js +124 -50
  270. package/dist/media/store.js +1 -1
  271. package/dist/media-understanding/runner.entries.js +42 -25
  272. package/dist/media-understanding/runner.js +53 -488
  273. package/dist/memory/embeddings-gemini.js +53 -38
  274. package/dist/memory/manager-embedding-ops.js +48 -69
  275. package/dist/pairing/pairing-store.js +178 -119
  276. package/dist/plugin-sdk/index.js +34 -6
  277. package/dist/plugins/hooks.js +135 -14
  278. package/dist/plugins/install.js +190 -152
  279. package/dist/polls.js +11 -0
  280. package/dist/routing/resolve-route.js +190 -56
  281. package/dist/routing/session-key.js +38 -22
  282. package/dist/runtime.js +35 -9
  283. package/dist/security/audit-channel.js +1 -1
  284. package/dist/sessions/session-key-utils.js +29 -11
  285. package/dist/shared/frontmatter.js +5 -5
  286. package/dist/shared/node-list-types.js +1 -0
  287. package/dist/shared/string-normalization.js +15 -0
  288. package/dist/signal/monitor/event-handler.js +68 -36
  289. package/dist/signal/send.js +29 -37
  290. package/dist/slack/monitor/allow-list.js +10 -11
  291. package/dist/slack/monitor/commands.js +14 -3
  292. package/dist/slack/monitor/events/interactions.js +4 -4
  293. package/dist/slack/monitor/media.js +224 -16
  294. package/dist/slack/monitor/message-handler/dispatch.js +247 -13
  295. package/dist/slack/monitor/message-handler/prepare.js +128 -45
  296. package/dist/slack/monitor/slash.js +357 -144
  297. package/dist/slack/streaming.js +77 -0
  298. package/dist/telegram/accounts.js +40 -13
  299. package/dist/telegram/allowed-updates.js +3 -0
  300. package/dist/telegram/bot/delivery.js +129 -66
  301. package/dist/telegram/bot/helpers.js +136 -122
  302. package/dist/telegram/bot-handlers.js +600 -339
  303. package/dist/telegram/bot-message-context.js +115 -73
  304. package/dist/telegram/bot-message-dispatch.js +235 -104
  305. package/dist/telegram/bot-native-command-menu.js +3 -1
  306. package/dist/telegram/bot-native-commands.js +213 -193
  307. package/dist/telegram/bot.js +24 -132
  308. package/dist/telegram/draft-stream.js +84 -75
  309. package/dist/telegram/format.js +150 -6
  310. package/dist/telegram/send.js +415 -255
  311. package/dist/telegram/targets.js +21 -2
  312. package/dist/telegram/update-offset-store.js +19 -3
  313. package/dist/terminal/restore.js +5 -2
  314. package/dist/test-utils/fetch-mock.js +5 -0
  315. package/dist/version.js +18 -5
  316. package/dist/web/auto-reply/monitor/broadcast.js +7 -3
  317. package/dist/web/auto-reply/monitor/on-message.js +6 -3
  318. package/dist/web/inbound/media.js +34 -8
  319. package/dist/web/inbound/monitor.js +34 -17
  320. package/dist/web/inbound/send-api.js +18 -17
  321. package/dist/web/outbound.js +12 -5
  322. package/dist/wizard/clack-prompter.js +40 -7
  323. package/extensions/bluebubbles/package.json +1 -1
  324. package/extensions/copilot-proxy/package.json +1 -1
  325. package/extensions/device-pair/index.ts +2 -2
  326. package/extensions/diagnostics-otel/package.json +1 -1
  327. package/extensions/discord/package.json +1 -1
  328. package/extensions/feishu/package.json +1 -1
  329. package/extensions/google-antigravity-auth/package.json +1 -1
  330. package/extensions/google-gemini-cli-auth/package.json +1 -1
  331. package/extensions/googlechat/package.json +1 -1
  332. package/extensions/imessage/package.json +1 -1
  333. package/extensions/irc/package.json +1 -1
  334. package/extensions/irc/src/accounts.ts +1 -1
  335. package/extensions/irc/src/onboarding.ts +4 -4
  336. package/extensions/line/package.json +1 -1
  337. package/extensions/llm-task/package.json +1 -1
  338. package/extensions/lobster/package.json +1 -1
  339. package/extensions/matrix/CHANGELOG.md +10 -0
  340. package/extensions/matrix/package.json +1 -1
  341. package/extensions/mattermost/package.json +1 -1
  342. package/extensions/memory-core/package.json +1 -1
  343. package/extensions/memory-lancedb/package.json +1 -1
  344. package/extensions/minimax-portal-auth/package.json +1 -1
  345. package/extensions/msteams/CHANGELOG.md +10 -0
  346. package/extensions/msteams/package.json +1 -1
  347. package/extensions/nextcloud-talk/package.json +1 -1
  348. package/extensions/nostr/CHANGELOG.md +10 -0
  349. package/extensions/nostr/package.json +1 -1
  350. package/extensions/open-prose/package.json +1 -1
  351. package/extensions/openai-codex-auth/package.json +1 -1
  352. package/extensions/signal/package.json +1 -1
  353. package/extensions/slack/package.json +1 -1
  354. package/extensions/telegram/package.json +1 -1
  355. package/extensions/tlon/package.json +1 -1
  356. package/extensions/twitch/CHANGELOG.md +10 -0
  357. package/extensions/twitch/package.json +1 -1
  358. package/extensions/voice-call/CHANGELOG.md +10 -0
  359. package/extensions/voice-call/package.json +1 -1
  360. package/extensions/whatsapp/package.json +1 -1
  361. package/extensions/zalo/CHANGELOG.md +10 -0
  362. package/extensions/zalo/package.json +1 -1
  363. package/extensions/zalouser/CHANGELOG.md +10 -0
  364. package/extensions/zalouser/package.json +1 -1
  365. package/package.json +1 -1
  366. package/skills/apple-reminders/SKILL.md +100 -49
  367. package/skills/coding-agent/SKILL.md +34 -28
  368. package/skills/github/SKILL.md +131 -16
  369. package/skills/imsg/SKILL.md +112 -15
  370. package/skills/openhue/SKILL.md +101 -19
  371. package/skills/tmux/SKILL.md +111 -79
  372. package/skills/weather/SKILL.md +88 -25
  373. package/dist/agents/openclaw-tools.js +0 -151
  374. package/dist/agents/tool-security.js +0 -96
  375. package/dist/gateway/url-validation.js +0 -94
  376. package/dist/infra/openclaw-root.js +0 -109
  377. package/dist/infra/tmp-openclaw-dir.js +0 -81
  378. package/dist/media/path-sanitization.js +0 -78
@@ -1,30 +1,36 @@
1
1
  import { codingTools, createEditTool, createReadTool, createWriteTool, readTool, } from "@mariozechner/pi-coding-agent";
2
+ import { logWarn } from "../logger.js";
3
+ import { getPluginToolMeta } from "../plugins/tools.js";
2
4
  import { isSubagentSessionKey } from "../routing/session-key.js";
3
5
  import { resolveGatewayMessageChannel } from "../utils/message-channel.js";
6
+ import { resolveAgentConfig } from "./agent-scope.js";
4
7
  import { createApplyPatchTool } from "./apply-patch.js";
5
8
  import { createExecTool, createProcessTool, } from "./bash-tools.js";
6
9
  import { listChannelAgentTools } from "./channel-tools.js";
10
+ import { resolveImageSanitizationLimits } from "./image-sanitization.js";
7
11
  import { createPoolBotTools } from "./poolbot-tools.js";
8
- import { resolveAgentConfig } from "./agent-scope.js";
9
12
  import { wrapToolWithAbortSignal } from "./pi-tools.abort.js";
10
13
  import { wrapToolWithBeforeToolCallHook } from "./pi-tools.before-tool-call.js";
11
- import { filterToolsByPolicy, isToolAllowedByPolicies, resolveEffectiveToolPolicy, resolveGroupToolPolicy, resolveSubagentToolPolicy, } from "./pi-tools.policy.js";
12
- import { assertRequiredParams, CLAUDE_PARAM_GROUPS, createPoolbotReadTool, createSandboxedEditTool, createSandboxedReadTool, createSandboxedWriteTool, normalizeToolParams, patchToolSchemaForClaudeCompatibility, wrapToolParamNormalization, } from "./pi-tools.read.js";
14
+ import { isToolAllowedByPolicies, resolveEffectiveToolPolicy, resolveGroupToolPolicy, resolveSubagentToolPolicy, } from "./pi-tools.policy.js";
15
+ import { assertRequiredParams, CLAUDE_PARAM_GROUPS, createPoolbotReadTool, createSandboxedEditTool, createSandboxedReadTool, createSandboxedWriteTool, normalizeToolParams, patchToolSchemaForClaudeCompatibility, wrapToolWorkspaceRootGuard, wrapToolParamNormalization, } from "./pi-tools.read.js";
13
16
  import { cleanToolSchemaForGemini, normalizeToolParameters } from "./pi-tools.schema.js";
14
- import { buildPluginToolGroups, collectExplicitAllowlist, expandPolicyWithPluginGroups, mergeAlsoAllowPolicy, normalizeToolName, resolveToolProfilePolicy, stripPluginOnlyAllowlist, applyOwnerOnlyToolPolicy, } from "./tool-policy.js";
15
- import { getPluginToolMeta } from "../plugins/tools.js";
16
- import { logWarn } from "../logger.js";
17
+ import { getSubagentDepthFromSessionStore } from "./subagent-depth.js";
18
+ import { applyToolPolicyPipeline, buildDefaultToolPolicyPipelineSteps, } from "./tool-policy-pipeline.js";
19
+ import { applyOwnerOnlyToolPolicy, collectExplicitAllowlist, mergeAlsoAllowPolicy, resolveToolProfilePolicy, } from "./tool-policy.js";
20
+ import { resolveWorkspaceRoot } from "./workspace-dir.js";
17
21
  function isOpenAIProvider(provider) {
18
22
  const normalized = provider?.trim().toLowerCase();
19
23
  return normalized === "openai" || normalized === "openai-codex";
20
24
  }
21
25
  function isApplyPatchAllowedForModel(params) {
22
26
  const allowModels = Array.isArray(params.allowModels) ? params.allowModels : [];
23
- if (allowModels.length === 0)
27
+ if (allowModels.length === 0) {
24
28
  return true;
29
+ }
25
30
  const modelId = params.modelId?.trim();
26
- if (!modelId)
31
+ if (!modelId) {
27
32
  return false;
33
+ }
28
34
  const normalizedModelId = modelId.toLowerCase();
29
35
  const provider = params.modelProvider?.trim().toLowerCase();
30
36
  const normalizedFull = provider && !normalizedModelId.includes("/")
@@ -32,26 +38,38 @@ function isApplyPatchAllowedForModel(params) {
32
38
  : normalizedModelId;
33
39
  return allowModels.some((entry) => {
34
40
  const normalized = entry.trim().toLowerCase();
35
- if (!normalized)
41
+ if (!normalized) {
36
42
  return false;
43
+ }
37
44
  return normalized === normalizedModelId || normalized === normalizedFull;
38
45
  });
39
46
  }
40
- function resolveExecConfig(cfg) {
47
+ function resolveExecConfig(params) {
48
+ const cfg = params.cfg;
41
49
  const globalExec = cfg?.tools?.exec;
50
+ const agentExec = cfg && params.agentId ? resolveAgentConfig(cfg, params.agentId)?.tools?.exec : undefined;
51
+ return {
52
+ host: agentExec?.host ?? globalExec?.host,
53
+ security: agentExec?.security ?? globalExec?.security,
54
+ ask: agentExec?.ask ?? globalExec?.ask,
55
+ node: agentExec?.node ?? globalExec?.node,
56
+ pathPrepend: agentExec?.pathPrepend ?? globalExec?.pathPrepend,
57
+ safeBins: agentExec?.safeBins ?? globalExec?.safeBins,
58
+ backgroundMs: agentExec?.backgroundMs ?? globalExec?.backgroundMs,
59
+ timeoutSec: agentExec?.timeoutSec ?? globalExec?.timeoutSec,
60
+ approvalRunningNoticeMs: agentExec?.approvalRunningNoticeMs ?? globalExec?.approvalRunningNoticeMs,
61
+ cleanupMs: agentExec?.cleanupMs ?? globalExec?.cleanupMs,
62
+ notifyOnExit: agentExec?.notifyOnExit ?? globalExec?.notifyOnExit,
63
+ notifyOnExitEmptySuccess: agentExec?.notifyOnExitEmptySuccess ?? globalExec?.notifyOnExitEmptySuccess,
64
+ applyPatch: agentExec?.applyPatch ?? globalExec?.applyPatch,
65
+ };
66
+ }
67
+ function resolveFsConfig(params) {
68
+ const cfg = params.cfg;
69
+ const globalFs = cfg?.tools?.fs;
70
+ const agentFs = cfg && params.agentId ? resolveAgentConfig(cfg, params.agentId)?.tools?.fs : undefined;
42
71
  return {
43
- host: globalExec?.host,
44
- security: globalExec?.security,
45
- ask: globalExec?.ask,
46
- node: globalExec?.node,
47
- pathPrepend: globalExec?.pathPrepend,
48
- safeBins: globalExec?.safeBins,
49
- backgroundMs: globalExec?.backgroundMs,
50
- timeoutSec: globalExec?.timeoutSec,
51
- approvalRunningNoticeMs: globalExec?.approvalRunningNoticeMs,
52
- cleanupMs: globalExec?.cleanupMs,
53
- notifyOnExit: globalExec?.notifyOnExit,
54
- applyPatch: globalExec?.applyPatch,
72
+ workspaceOnly: agentFs?.workspaceOnly ?? globalFs?.workspaceOnly,
55
73
  };
56
74
  }
57
75
  export function resolveToolLoopDetectionConfig(params) {
@@ -81,8 +99,6 @@ export const __testing = {
81
99
  wrapToolParamNormalization,
82
100
  assertRequiredParams,
83
101
  };
84
- /** Alias for upstream compatibility — callers importing the upstream name get the pool-bot version. */
85
- export const createOpenClawCodingTools = createPoolbotCodingTools;
86
102
  export function createPoolbotCodingTools(options) {
87
103
  const execToolName = "exec";
88
104
  const sandbox = options?.sandbox?.enabled ? options.sandbox : undefined;
@@ -110,9 +126,11 @@ export function createPoolbotCodingTools(options) {
110
126
  const providerProfilePolicy = resolveToolProfilePolicy(providerProfile);
111
127
  const profilePolicyWithAlsoAllow = mergeAlsoAllowPolicy(profilePolicy, profileAlsoAllow);
112
128
  const providerProfilePolicyWithAlsoAllow = mergeAlsoAllowPolicy(providerProfilePolicy, providerProfileAlsoAllow);
113
- const scopeKey = options?.exec?.scopeKey ?? (agentId ? `agent:${agentId}` : undefined);
129
+ // Prefer sessionKey for process isolation scope to prevent cross-session process visibility/killing.
130
+ // Fallback to agentId if no sessionKey is available (e.g. legacy or global contexts).
131
+ const scopeKey = options?.exec?.scopeKey ?? options?.sessionKey ?? (agentId ? `agent:${agentId}` : undefined);
114
132
  const subagentPolicy = isSubagentSessionKey(options?.sessionKey) && options?.sessionKey
115
- ? resolveSubagentToolPolicy(options.config)
133
+ ? resolveSubagentToolPolicy(options.config, getSubagentDepthFromSessionStore(options.sessionKey, { cfg: options.config }))
116
134
  : undefined;
117
135
  const allowBackground = isToolAllowedByPolicies("process", [
118
136
  profilePolicyWithAlsoAllow,
@@ -125,11 +143,17 @@ export function createPoolbotCodingTools(options) {
125
143
  sandbox?.tools,
126
144
  subagentPolicy,
127
145
  ]);
128
- const execConfig = resolveExecConfig(options?.config);
146
+ const execConfig = resolveExecConfig({ cfg: options?.config, agentId });
147
+ const fsConfig = resolveFsConfig({ cfg: options?.config, agentId });
129
148
  const sandboxRoot = sandbox?.workspaceDir;
149
+ const sandboxFsBridge = sandbox?.fsBridge;
130
150
  const allowWorkspaceWrites = sandbox?.workspaceAccess !== "ro";
131
- const workspaceRoot = options?.workspaceDir ?? process.cwd();
132
- const applyPatchConfig = options?.config?.tools?.exec?.applyPatch;
151
+ const workspaceRoot = resolveWorkspaceRoot(options?.workspaceDir);
152
+ const workspaceOnly = fsConfig.workspaceOnly === true;
153
+ const applyPatchConfig = execConfig.applyPatch;
154
+ // Secure by default: apply_patch is workspace-contained unless explicitly disabled.
155
+ // (tools.fs.workspaceOnly is a separate umbrella flag for read/write/edit/apply_patch.)
156
+ const applyPatchWorkspaceOnly = workspaceOnly || applyPatchConfig?.workspaceOnly !== false;
133
157
  const applyPatchEnabled = !!applyPatchConfig?.enabled &&
134
158
  isOpenAIProvider(options?.modelProvider) &&
135
159
  isApplyPatchAllowedForModel({
@@ -137,29 +161,46 @@ export function createPoolbotCodingTools(options) {
137
161
  modelId: options?.modelId,
138
162
  allowModels: applyPatchConfig?.allowModels,
139
163
  });
164
+ if (sandboxRoot && !sandboxFsBridge) {
165
+ throw new Error("Sandbox filesystem bridge is unavailable.");
166
+ }
167
+ const imageSanitization = resolveImageSanitizationLimits(options?.config);
140
168
  const base = codingTools.flatMap((tool) => {
141
169
  if (tool.name === readTool.name) {
142
170
  if (sandboxRoot) {
143
- return [createSandboxedReadTool(sandboxRoot)];
171
+ const sandboxed = createSandboxedReadTool({
172
+ root: sandboxRoot,
173
+ bridge: sandboxFsBridge,
174
+ modelContextWindowTokens: options?.modelContextWindowTokens,
175
+ imageSanitization,
176
+ });
177
+ return [workspaceOnly ? wrapToolWorkspaceRootGuard(sandboxed, sandboxRoot) : sandboxed];
144
178
  }
145
179
  const freshReadTool = createReadTool(workspaceRoot);
146
- return [createPoolbotReadTool(freshReadTool)];
180
+ const wrapped = createPoolbotReadTool(freshReadTool, {
181
+ modelContextWindowTokens: options?.modelContextWindowTokens,
182
+ imageSanitization,
183
+ });
184
+ return [workspaceOnly ? wrapToolWorkspaceRootGuard(wrapped, workspaceRoot) : wrapped];
147
185
  }
148
- if (tool.name === "bash" || tool.name === execToolName)
186
+ if (tool.name === "bash" || tool.name === execToolName) {
149
187
  return [];
188
+ }
150
189
  if (tool.name === "write") {
151
- if (sandboxRoot)
190
+ if (sandboxRoot) {
152
191
  return [];
192
+ }
153
193
  // Wrap with param normalization for Claude Code compatibility
154
- return [
155
- wrapToolParamNormalization(createWriteTool(workspaceRoot), CLAUDE_PARAM_GROUPS.write),
156
- ];
194
+ const wrapped = wrapToolParamNormalization(createWriteTool(workspaceRoot), CLAUDE_PARAM_GROUPS.write);
195
+ return [workspaceOnly ? wrapToolWorkspaceRootGuard(wrapped, workspaceRoot) : wrapped];
157
196
  }
158
197
  if (tool.name === "edit") {
159
- if (sandboxRoot)
198
+ if (sandboxRoot) {
160
199
  return [];
200
+ }
161
201
  // Wrap with param normalization for Claude Code compatibility
162
- return [wrapToolParamNormalization(createEditTool(workspaceRoot), CLAUDE_PARAM_GROUPS.edit)];
202
+ const wrapped = wrapToolParamNormalization(createEditTool(workspaceRoot), CLAUDE_PARAM_GROUPS.edit);
203
+ return [workspaceOnly ? wrapToolWorkspaceRootGuard(wrapped, workspaceRoot) : wrapped];
163
204
  }
164
205
  return [tool];
165
206
  });
@@ -173,7 +214,7 @@ export function createPoolbotCodingTools(options) {
173
214
  pathPrepend: options?.exec?.pathPrepend ?? execConfig.pathPrepend,
174
215
  safeBins: options?.exec?.safeBins ?? execConfig.safeBins,
175
216
  agentId,
176
- cwd: options?.workspaceDir,
217
+ cwd: workspaceRoot,
177
218
  allowBackground,
178
219
  scopeKey,
179
220
  sessionKey: options?.sessionKey,
@@ -182,6 +223,7 @@ export function createPoolbotCodingTools(options) {
182
223
  timeoutSec: options?.exec?.timeoutSec ?? execConfig.timeoutSec,
183
224
  approvalRunningNoticeMs: options?.exec?.approvalRunningNoticeMs ?? execConfig.approvalRunningNoticeMs,
184
225
  notifyOnExit: options?.exec?.notifyOnExit ?? execConfig.notifyOnExit,
226
+ notifyOnExitEmptySuccess: options?.exec?.notifyOnExitEmptySuccess ?? execConfig.notifyOnExitEmptySuccess,
185
227
  sandbox: sandbox
186
228
  ? {
187
229
  containerName: sandbox.containerName,
@@ -199,13 +241,23 @@ export function createPoolbotCodingTools(options) {
199
241
  ? null
200
242
  : createApplyPatchTool({
201
243
  cwd: sandboxRoot ?? workspaceRoot,
202
- sandboxRoot: sandboxRoot && allowWorkspaceWrites ? sandboxRoot : undefined,
244
+ sandbox: sandboxRoot && allowWorkspaceWrites
245
+ ? { root: sandboxRoot, bridge: sandboxFsBridge }
246
+ : undefined,
247
+ workspaceOnly: applyPatchWorkspaceOnly,
203
248
  });
204
249
  const tools = [
205
250
  ...base,
206
251
  ...(sandboxRoot
207
252
  ? allowWorkspaceWrites
208
- ? [createSandboxedEditTool(sandboxRoot), createSandboxedWriteTool(sandboxRoot)]
253
+ ? [
254
+ workspaceOnly
255
+ ? wrapToolWorkspaceRootGuard(createSandboxedEditTool({ root: sandboxRoot, bridge: sandboxFsBridge }), sandboxRoot)
256
+ : createSandboxedEditTool({ root: sandboxRoot, bridge: sandboxFsBridge }),
257
+ workspaceOnly
258
+ ? wrapToolWorkspaceRootGuard(createSandboxedWriteTool({ root: sandboxRoot, bridge: sandboxFsBridge }), sandboxRoot)
259
+ : createSandboxedWriteTool({ root: sandboxRoot, bridge: sandboxFsBridge }),
260
+ ]
209
261
  : []
210
262
  : []),
211
263
  ...(applyPatchTool ? [applyPatchTool] : []),
@@ -226,7 +278,8 @@ export function createPoolbotCodingTools(options) {
226
278
  agentGroupSpace: options?.groupSpace ?? null,
227
279
  agentDir: options?.agentDir,
228
280
  sandboxRoot,
229
- workspaceDir: options?.workspaceDir,
281
+ sandboxFsBridge,
282
+ workspaceDir: workspaceRoot,
230
283
  sandboxed: !!sandbox,
231
284
  config: options?.config,
232
285
  pluginToolAllowlist: collectExplicitAllowlist([
@@ -253,61 +306,27 @@ export function createPoolbotCodingTools(options) {
253
306
  // Security: treat unknown/undefined as unauthorized (opt-in, not opt-out)
254
307
  const senderIsOwner = options?.senderIsOwner === true;
255
308
  const toolsByAuthorization = applyOwnerOnlyToolPolicy(tools, senderIsOwner);
256
- const coreToolNames = new Set(toolsByAuthorization
257
- .filter((tool) => !getPluginToolMeta(tool))
258
- .map((tool) => normalizeToolName(tool.name))
259
- .filter(Boolean));
260
- const pluginGroups = buildPluginToolGroups({
309
+ const subagentFiltered = applyToolPolicyPipeline({
261
310
  tools: toolsByAuthorization,
262
311
  toolMeta: (tool) => getPluginToolMeta(tool),
312
+ warn: logWarn,
313
+ steps: [
314
+ ...buildDefaultToolPolicyPipelineSteps({
315
+ profilePolicy: profilePolicyWithAlsoAllow,
316
+ profile,
317
+ providerProfilePolicy: providerProfilePolicyWithAlsoAllow,
318
+ providerProfile,
319
+ globalPolicy,
320
+ globalProviderPolicy,
321
+ agentPolicy,
322
+ agentProviderPolicy,
323
+ groupPolicy,
324
+ agentId,
325
+ }),
326
+ { policy: sandbox?.tools, label: "sandbox tools.allow" },
327
+ { policy: subagentPolicy, label: "subagent tools.allow" },
328
+ ],
263
329
  });
264
- const resolvePolicy = (policy, label) => {
265
- const resolved = stripPluginOnlyAllowlist(policy, pluginGroups, coreToolNames);
266
- if (resolved.unknownAllowlist.length > 0) {
267
- const entries = resolved.unknownAllowlist.join(", ");
268
- const suffix = resolved.strippedAllowlist
269
- ? "Ignoring allowlist so core tools remain available. Use tools.alsoAllow for additive plugin tool enablement."
270
- : "These entries won't match any tool unless the plugin is enabled.";
271
- logWarn(`tools: ${label} allowlist contains unknown entries (${entries}). ${suffix}`);
272
- }
273
- return expandPolicyWithPluginGroups(resolved.policy, pluginGroups);
274
- };
275
- const profilePolicyExpanded = resolvePolicy(profilePolicyWithAlsoAllow, profile ? `tools.profile (${profile})` : "tools.profile");
276
- const providerProfileExpanded = resolvePolicy(providerProfilePolicyWithAlsoAllow, providerProfile ? `tools.byProvider.profile (${providerProfile})` : "tools.byProvider.profile");
277
- const globalPolicyExpanded = resolvePolicy(globalPolicy, "tools.allow");
278
- const globalProviderExpanded = resolvePolicy(globalProviderPolicy, "tools.byProvider.allow");
279
- const agentPolicyExpanded = resolvePolicy(agentPolicy, agentId ? `agents.${agentId}.tools.allow` : "agent tools.allow");
280
- const agentProviderExpanded = resolvePolicy(agentProviderPolicy, agentId ? `agents.${agentId}.tools.byProvider.allow` : "agent tools.byProvider.allow");
281
- const groupPolicyExpanded = resolvePolicy(groupPolicy, "group tools.allow");
282
- const sandboxPolicyExpanded = expandPolicyWithPluginGroups(sandbox?.tools, pluginGroups);
283
- const subagentPolicyExpanded = expandPolicyWithPluginGroups(subagentPolicy, pluginGroups);
284
- const toolsFiltered = profilePolicyExpanded
285
- ? filterToolsByPolicy(toolsByAuthorization, profilePolicyExpanded)
286
- : toolsByAuthorization;
287
- const providerProfileFiltered = providerProfileExpanded
288
- ? filterToolsByPolicy(toolsFiltered, providerProfileExpanded)
289
- : toolsFiltered;
290
- const globalFiltered = globalPolicyExpanded
291
- ? filterToolsByPolicy(providerProfileFiltered, globalPolicyExpanded)
292
- : providerProfileFiltered;
293
- const globalProviderFiltered = globalProviderExpanded
294
- ? filterToolsByPolicy(globalFiltered, globalProviderExpanded)
295
- : globalFiltered;
296
- const agentFiltered = agentPolicyExpanded
297
- ? filterToolsByPolicy(globalProviderFiltered, agentPolicyExpanded)
298
- : globalProviderFiltered;
299
- const agentProviderFiltered = agentProviderExpanded
300
- ? filterToolsByPolicy(agentFiltered, agentProviderExpanded)
301
- : agentFiltered;
302
- const groupFiltered = groupPolicyExpanded
303
- ? filterToolsByPolicy(agentProviderFiltered, groupPolicyExpanded)
304
- : agentProviderFiltered;
305
- const sandboxed = sandboxPolicyExpanded
306
- ? filterToolsByPolicy(groupFiltered, sandboxPolicyExpanded)
307
- : groupFiltered;
308
- const subagentFiltered = subagentPolicyExpanded
309
- ? filterToolsByPolicy(sandboxed, subagentPolicyExpanded)
310
- : sandboxed;
311
330
  // Always normalize tool JSON Schemas before handing them to pi-agent/pi-ai.
312
331
  // Without this, some providers (notably OpenAI) will reject root-level union schemas.
313
332
  // Provider-specific cleaning: Gemini needs constraint keywords stripped, but Anthropic expects them.