@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,6 +1,8 @@
1
1
  import { z } from "zod";
2
2
  import { parseDurationMs } from "../cli/parse-duration.js";
3
+ import { AgentModelSchema } from "./zod-schema.agent-model.js";
3
4
  import { GroupChatSchema, HumanDelaySchema, IdentitySchema, ToolsLinksSchema, ToolsMediaSchema, } from "./zod-schema.core.js";
5
+ import { sensitive } from "./zod-schema.sensitive.js";
4
6
  export const HeartbeatSchema = z
5
7
  .object({
6
8
  every: z.string().optional(),
@@ -20,11 +22,13 @@ export const HeartbeatSchema = z
20
22
  accountId: z.string().optional(),
21
23
  prompt: z.string().optional(),
22
24
  ackMaxChars: z.number().int().nonnegative().optional(),
25
+ suppressToolErrorWarnings: z.boolean().optional(),
23
26
  })
24
27
  .strict()
25
28
  .superRefine((val, ctx) => {
26
- if (!val.every)
29
+ if (!val.every) {
27
30
  return;
31
+ }
28
32
  try {
29
33
  parseDurationMs(val.every, { defaultUnit: "m" });
30
34
  }
@@ -36,12 +40,14 @@ export const HeartbeatSchema = z
36
40
  });
37
41
  }
38
42
  const active = val.activeHours;
39
- if (!active)
43
+ if (!active) {
40
44
  return;
45
+ }
41
46
  const timePattern = /^([01]\d|2[0-3]|24):([0-5]\d)$/;
42
47
  const validateTime = (raw, opts, path) => {
43
- if (!raw)
48
+ if (!raw) {
44
49
  return;
50
+ }
45
51
  if (!timePattern.test(raw)) {
46
52
  ctx.addIssue({
47
53
  code: z.ZodIssueCode.custom,
@@ -108,6 +114,54 @@ export const SandboxDockerSchema = z
108
114
  binds: z.array(z.string()).optional(),
109
115
  })
110
116
  .strict()
117
+ .superRefine((data, ctx) => {
118
+ if (data.binds) {
119
+ for (let i = 0; i < data.binds.length; i += 1) {
120
+ const bind = data.binds[i]?.trim() ?? "";
121
+ if (!bind) {
122
+ ctx.addIssue({
123
+ code: z.ZodIssueCode.custom,
124
+ path: ["binds", i],
125
+ message: "Sandbox security: bind mount entry must be a non-empty string.",
126
+ });
127
+ continue;
128
+ }
129
+ const firstColon = bind.indexOf(":");
130
+ const source = (firstColon <= 0 ? bind : bind.slice(0, firstColon)).trim();
131
+ if (!source.startsWith("/")) {
132
+ ctx.addIssue({
133
+ code: z.ZodIssueCode.custom,
134
+ path: ["binds", i],
135
+ message: `Sandbox security: bind mount "${bind}" uses a non-absolute source path "${source}". ` +
136
+ "Only absolute POSIX paths are supported for sandbox binds.",
137
+ });
138
+ }
139
+ }
140
+ }
141
+ if (data.network?.trim().toLowerCase() === "host") {
142
+ ctx.addIssue({
143
+ code: z.ZodIssueCode.custom,
144
+ path: ["network"],
145
+ message: 'Sandbox security: network mode "host" is blocked. Use "bridge" or "none" instead.',
146
+ });
147
+ }
148
+ if (data.seccompProfile?.trim().toLowerCase() === "unconfined") {
149
+ ctx.addIssue({
150
+ code: z.ZodIssueCode.custom,
151
+ path: ["seccompProfile"],
152
+ message: 'Sandbox security: seccomp profile "unconfined" is blocked. ' +
153
+ "Use a custom seccomp profile file or omit this setting.",
154
+ });
155
+ }
156
+ if (data.apparmorProfile?.trim().toLowerCase() === "unconfined") {
157
+ ctx.addIssue({
158
+ code: z.ZodIssueCode.custom,
159
+ path: ["apparmorProfile"],
160
+ message: 'Sandbox security: apparmor profile "unconfined" is blocked. ' +
161
+ "Use a named AppArmor profile or omit this setting.",
162
+ });
163
+ }
164
+ })
111
165
  .optional();
112
166
  export const SandboxBrowserSchema = z
113
167
  .object({
@@ -122,6 +176,7 @@ export const SandboxBrowserSchema = z
122
176
  allowHostControl: z.boolean().optional(),
123
177
  autoStart: z.boolean().optional(),
124
178
  autoStartTimeoutMs: z.number().int().positive().optional(),
179
+ binds: z.array(z.string()).optional(),
125
180
  })
126
181
  .strict()
127
182
  .optional();
@@ -150,19 +205,27 @@ export const ToolPolicySchema = ToolPolicyBaseSchema.superRefine((value, ctx) =>
150
205
  export const ToolsWebSearchSchema = z
151
206
  .object({
152
207
  enabled: z.boolean().optional(),
153
- provider: z.union([z.literal("brave"), z.literal("perplexity")]).optional(),
154
- apiKey: z.string().optional(),
208
+ provider: z.union([z.literal("brave"), z.literal("perplexity"), z.literal("grok")]).optional(),
209
+ apiKey: z.string().optional().register(sensitive),
155
210
  maxResults: z.number().int().positive().optional(),
156
211
  timeoutSeconds: z.number().int().positive().optional(),
157
212
  cacheTtlMinutes: z.number().nonnegative().optional(),
158
213
  perplexity: z
159
214
  .object({
160
- apiKey: z.string().optional(),
215
+ apiKey: z.string().optional().register(sensitive),
161
216
  baseUrl: z.string().optional(),
162
217
  model: z.string().optional(),
163
218
  })
164
219
  .strict()
165
220
  .optional(),
221
+ grok: z
222
+ .object({
223
+ apiKey: z.string().optional().register(sensitive),
224
+ model: z.string().optional(),
225
+ inlineCitations: z.boolean().optional(),
226
+ })
227
+ .strict()
228
+ .optional(),
166
229
  })
167
230
  .strict()
168
231
  .optional();
@@ -170,6 +233,7 @@ export const ToolsWebFetchSchema = z
170
233
  .object({
171
234
  enabled: z.boolean().optional(),
172
235
  maxChars: z.number().int().positive().optional(),
236
+ maxCharsCap: z.number().int().positive().optional(),
173
237
  timeoutSeconds: z.number().int().positive().optional(),
174
238
  cacheTtlMinutes: z.number().nonnegative().optional(),
175
239
  maxRedirects: z.number().int().nonnegative().optional(),
@@ -187,6 +251,14 @@ export const ToolsWebSchema = z
187
251
  export const ToolProfileSchema = z
188
252
  .union([z.literal("minimal"), z.literal("coding"), z.literal("messaging"), z.literal("full")])
189
253
  .optional();
254
+ function addAllowAlsoAllowConflictIssue(value, ctx, message) {
255
+ if (value.allow && value.allow.length > 0 && value.alsoAllow && value.alsoAllow.length > 0) {
256
+ ctx.addIssue({
257
+ code: z.ZodIssueCode.custom,
258
+ message,
259
+ });
260
+ }
261
+ }
190
262
  export const ToolPolicyWithProfileSchema = z
191
263
  .object({
192
264
  allow: z.array(z.string()).optional(),
@@ -196,17 +268,87 @@ export const ToolPolicyWithProfileSchema = z
196
268
  })
197
269
  .strict()
198
270
  .superRefine((value, ctx) => {
199
- if (value.allow && value.allow.length > 0 && value.alsoAllow && value.alsoAllow.length > 0) {
200
- ctx.addIssue({
201
- code: z.ZodIssueCode.custom,
202
- message: "tools.byProvider policy cannot set both allow and alsoAllow in the same scope (merge alsoAllow into allow, or remove allow and use profile + alsoAllow)",
203
- });
204
- }
271
+ addAllowAlsoAllowConflictIssue(value, ctx, "tools.byProvider policy cannot set both allow and alsoAllow in the same scope (merge alsoAllow into allow, or remove allow and use profile + alsoAllow)");
205
272
  });
206
273
  // Provider docking: allowlists keyed by provider id (no schema updates when adding providers).
207
274
  export const ElevatedAllowFromSchema = z
208
275
  .record(z.string(), z.array(z.union([z.string(), z.number()])))
209
276
  .optional();
277
+ const ToolExecApplyPatchSchema = z
278
+ .object({
279
+ enabled: z.boolean().optional(),
280
+ workspaceOnly: z.boolean().optional(),
281
+ allowModels: z.array(z.string()).optional(),
282
+ })
283
+ .strict()
284
+ .optional();
285
+ const ToolExecBaseShape = {
286
+ host: z.enum(["sandbox", "gateway", "node"]).optional(),
287
+ security: z.enum(["deny", "allowlist", "full"]).optional(),
288
+ ask: z.enum(["off", "on-miss", "always"]).optional(),
289
+ node: z.string().optional(),
290
+ pathPrepend: z.array(z.string()).optional(),
291
+ safeBins: z.array(z.string()).optional(),
292
+ backgroundMs: z.number().int().positive().optional(),
293
+ timeoutSec: z.number().int().positive().optional(),
294
+ cleanupMs: z.number().int().positive().optional(),
295
+ notifyOnExit: z.boolean().optional(),
296
+ notifyOnExitEmptySuccess: z.boolean().optional(),
297
+ applyPatch: ToolExecApplyPatchSchema,
298
+ };
299
+ const AgentToolExecSchema = z
300
+ .object({
301
+ ...ToolExecBaseShape,
302
+ approvalRunningNoticeMs: z.number().int().nonnegative().optional(),
303
+ })
304
+ .strict()
305
+ .optional();
306
+ const ToolExecSchema = z.object(ToolExecBaseShape).strict().optional();
307
+ const ToolFsSchema = z
308
+ .object({
309
+ workspaceOnly: z.boolean().optional(),
310
+ })
311
+ .strict()
312
+ .optional();
313
+ const ToolLoopDetectionDetectorSchema = z
314
+ .object({
315
+ genericRepeat: z.boolean().optional(),
316
+ knownPollNoProgress: z.boolean().optional(),
317
+ pingPong: z.boolean().optional(),
318
+ })
319
+ .strict()
320
+ .optional();
321
+ const ToolLoopDetectionSchema = z
322
+ .object({
323
+ enabled: z.boolean().optional(),
324
+ historySize: z.number().int().positive().optional(),
325
+ warningThreshold: z.number().int().positive().optional(),
326
+ criticalThreshold: z.number().int().positive().optional(),
327
+ globalCircuitBreakerThreshold: z.number().int().positive().optional(),
328
+ detectors: ToolLoopDetectionDetectorSchema,
329
+ })
330
+ .strict()
331
+ .superRefine((value, ctx) => {
332
+ if (value.warningThreshold !== undefined &&
333
+ value.criticalThreshold !== undefined &&
334
+ value.warningThreshold >= value.criticalThreshold) {
335
+ ctx.addIssue({
336
+ code: z.ZodIssueCode.custom,
337
+ path: ["criticalThreshold"],
338
+ message: "tools.loopDetection.warningThreshold must be lower than criticalThreshold.",
339
+ });
340
+ }
341
+ if (value.criticalThreshold !== undefined &&
342
+ value.globalCircuitBreakerThreshold !== undefined &&
343
+ value.criticalThreshold >= value.globalCircuitBreakerThreshold) {
344
+ ctx.addIssue({
345
+ code: z.ZodIssueCode.custom,
346
+ path: ["globalCircuitBreakerThreshold"],
347
+ message: "tools.loopDetection.criticalThreshold must be lower than globalCircuitBreakerThreshold.",
348
+ });
349
+ }
350
+ })
351
+ .optional();
210
352
  export const AgentSandboxSchema = z
211
353
  .object({
212
354
  mode: z.union([z.literal("off"), z.literal("non-main"), z.literal("all")]).optional(),
@@ -235,29 +377,9 @@ export const AgentToolsSchema = z
235
377
  })
236
378
  .strict()
237
379
  .optional(),
238
- exec: z
239
- .object({
240
- host: z.enum(["sandbox", "gateway", "node"]).optional(),
241
- security: z.enum(["deny", "allowlist", "full"]).optional(),
242
- ask: z.enum(["off", "on-miss", "always"]).optional(),
243
- node: z.string().optional(),
244
- pathPrepend: z.array(z.string()).optional(),
245
- safeBins: z.array(z.string()).optional(),
246
- backgroundMs: z.number().int().positive().optional(),
247
- timeoutSec: z.number().int().positive().optional(),
248
- approvalRunningNoticeMs: z.number().int().nonnegative().optional(),
249
- cleanupMs: z.number().int().positive().optional(),
250
- notifyOnExit: z.boolean().optional(),
251
- applyPatch: z
252
- .object({
253
- enabled: z.boolean().optional(),
254
- allowModels: z.array(z.string()).optional(),
255
- })
256
- .strict()
257
- .optional(),
258
- })
259
- .strict()
260
- .optional(),
380
+ exec: AgentToolExecSchema,
381
+ fs: ToolFsSchema,
382
+ loopDetection: ToolLoopDetectionSchema,
261
383
  sandbox: z
262
384
  .object({
263
385
  tools: ToolPolicySchema,
@@ -267,12 +389,7 @@ export const AgentToolsSchema = z
267
389
  })
268
390
  .strict()
269
391
  .superRefine((value, ctx) => {
270
- if (value.allow && value.allow.length > 0 && value.alsoAllow && value.alsoAllow.length > 0) {
271
- ctx.addIssue({
272
- code: z.ZodIssueCode.custom,
273
- message: "agent tools cannot set both allow and alsoAllow in the same scope (merge alsoAllow into allow, or remove allow and use profile + alsoAllow)",
274
- });
275
- }
392
+ addAllowAlsoAllowConflictIssue(value, ctx, "agent tools cannot set both allow and alsoAllow in the same scope (merge alsoAllow into allow, or remove allow and use profile + alsoAllow)");
276
393
  })
277
394
  .optional();
278
395
  export const MemorySearchSchema = z
@@ -292,7 +409,7 @@ export const MemorySearchSchema = z
292
409
  remote: z
293
410
  .object({
294
411
  baseUrl: z.string().optional(),
295
- apiKey: z.string().optional(),
412
+ apiKey: z.string().optional().register(sensitive),
296
413
  headers: z.record(z.string(), z.string()).optional(),
297
414
  batch: z
298
415
  .object({
@@ -402,15 +519,7 @@ export const MemorySearchSchema = z
402
519
  })
403
520
  .strict()
404
521
  .optional();
405
- export const AgentModelSchema = z.union([
406
- z.string(),
407
- z
408
- .object({
409
- primary: z.string().optional(),
410
- fallbacks: z.array(z.string()).optional(),
411
- })
412
- .strict(),
413
- ]);
522
+ export { AgentModelSchema };
414
523
  export const AgentEntrySchema = z
415
524
  .object({
416
525
  id: z.string(),
@@ -419,6 +528,7 @@ export const AgentEntrySchema = z
419
528
  workspace: z.string().optional(),
420
529
  agentDir: z.string().optional(),
421
530
  model: AgentModelSchema.optional(),
531
+ skills: z.array(z.string()).optional(),
422
532
  memorySearch: MemorySearchSchema,
423
533
  humanDelay: HumanDelaySchema.optional(),
424
534
  heartbeat: HeartbeatSchema,
@@ -456,6 +566,13 @@ export const ToolsSchema = z
456
566
  web: ToolsWebSchema,
457
567
  media: ToolsMediaSchema,
458
568
  links: ToolsLinksSchema,
569
+ sessions: z
570
+ .object({
571
+ visibility: z.enum(["self", "tree", "agent", "all"]).optional(),
572
+ })
573
+ .strict()
574
+ .optional(),
575
+ loopDetection: ToolLoopDetectionSchema,
459
576
  message: z
460
577
  .object({
461
578
  allowCrossContextSend: z.boolean().optional(),
@@ -497,28 +614,8 @@ export const ToolsSchema = z
497
614
  })
498
615
  .strict()
499
616
  .optional(),
500
- exec: z
501
- .object({
502
- host: z.enum(["sandbox", "gateway", "node"]).optional(),
503
- security: z.enum(["deny", "allowlist", "full"]).optional(),
504
- ask: z.enum(["off", "on-miss", "always"]).optional(),
505
- node: z.string().optional(),
506
- pathPrepend: z.array(z.string()).optional(),
507
- safeBins: z.array(z.string()).optional(),
508
- backgroundMs: z.number().int().positive().optional(),
509
- timeoutSec: z.number().int().positive().optional(),
510
- cleanupMs: z.number().int().positive().optional(),
511
- notifyOnExit: z.boolean().optional(),
512
- applyPatch: z
513
- .object({
514
- enabled: z.boolean().optional(),
515
- allowModels: z.array(z.string()).optional(),
516
- })
517
- .strict()
518
- .optional(),
519
- })
520
- .strict()
521
- .optional(),
617
+ exec: ToolExecSchema,
618
+ fs: ToolFsSchema,
522
619
  subagents: z
523
620
  .object({
524
621
  tools: ToolPolicySchema,
@@ -534,11 +631,6 @@ export const ToolsSchema = z
534
631
  })
535
632
  .strict()
536
633
  .superRefine((value, ctx) => {
537
- if (value.allow && value.allow.length > 0 && value.alsoAllow && value.alsoAllow.length > 0) {
538
- ctx.addIssue({
539
- code: z.ZodIssueCode.custom,
540
- message: "tools cannot set both allow and alsoAllow in the same scope (merge alsoAllow into allow, or remove allow and use profile + alsoAllow)",
541
- });
542
- }
634
+ addAllowAlsoAllowConflictIssue(value, ctx, "tools cannot set both allow and alsoAllow in the same scope (merge alsoAllow into allow, or remove allow and use profile + alsoAllow)");
543
635
  })
544
636
  .optional();