@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.
- package/CHANGELOG.md +25 -0
- package/dist/agents/api-key-rotation.js +47 -0
- package/dist/agents/apply-patch-update.js +19 -9
- package/dist/agents/apply-patch.js +72 -47
- package/dist/agents/bash-tools.exec.js +141 -559
- package/dist/agents/cli-backends.js +49 -6
- package/dist/agents/cli-runner/helpers.js +69 -152
- package/dist/agents/cli-runner.js +70 -19
- package/dist/agents/identity.js +20 -1
- package/dist/agents/image-sanitization.js +9 -0
- package/dist/agents/live-auth-keys.js +123 -26
- package/dist/agents/live-model-filter.js +13 -4
- package/dist/agents/model-catalog.js +40 -9
- package/dist/agents/model-forward-compat.js +60 -23
- package/dist/agents/model-selection.js +134 -41
- package/dist/agents/pi-auth-json.js +2 -2
- package/dist/agents/pi-embedded-helpers/bootstrap.js +65 -15
- package/dist/agents/pi-embedded-helpers/errors.js +140 -15
- package/dist/agents/pi-embedded-helpers/images.js +22 -12
- package/dist/agents/pi-embedded-helpers.js +2 -2
- package/dist/agents/pi-embedded-runner/abort.js +10 -3
- package/dist/agents/pi-embedded-runner/compact.js +230 -32
- package/dist/agents/pi-embedded-runner/extra-params.js +203 -12
- package/dist/agents/pi-embedded-runner/google.js +109 -19
- package/dist/agents/pi-embedded-runner/history.js +35 -17
- package/dist/agents/pi-embedded-runner/run/attempt.js +386 -95
- package/dist/agents/pi-embedded-runner/run/images.js +81 -55
- package/dist/agents/pi-embedded-runner/run/payloads.js +89 -39
- package/dist/agents/pi-embedded-runner/run.js +193 -25
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +2 -2
- package/dist/agents/pi-embedded-runner/runs.js +17 -8
- package/dist/agents/pi-embedded-runner/tool-result-context-guard.js +262 -0
- package/dist/agents/pi-embedded-runner.js +1 -1
- package/dist/agents/pi-embedded-subscribe.handlers.tools.js +180 -10
- package/dist/agents/pi-embedded-subscribe.js +37 -0
- package/dist/agents/pi-embedded-subscribe.tools.js +127 -30
- package/dist/agents/pi-model-discovery.js +9 -2
- package/dist/agents/pi-tool-definition-adapter.js +60 -8
- package/dist/agents/pi-tools.before-tool-call.js +1 -1
- package/dist/agents/pi-tools.js +113 -94
- package/dist/agents/pi-tools.read.js +337 -38
- package/dist/agents/poolbot-tools.js +14 -5
- package/dist/agents/sandbox/docker.js +10 -5
- package/dist/agents/sandbox/registry.js +96 -46
- package/dist/agents/sandbox/sanitize-env-vars.js +82 -0
- package/dist/agents/sandbox-paths.js +43 -10
- package/dist/agents/session-tool-result-guard-wrapper.js +23 -11
- package/dist/agents/session-tool-result-guard.js +39 -39
- package/dist/agents/session-transcript-repair.js +36 -33
- package/dist/agents/session-write-lock.js +62 -44
- package/dist/agents/skills/frontmatter.js +49 -88
- package/dist/agents/skills/workspace.js +335 -28
- package/dist/agents/subagent-announce.js +508 -174
- package/dist/agents/subagent-registry.js +45 -4
- package/dist/agents/subagent-spawn.js +16 -33
- package/dist/agents/system-prompt-report.js +27 -10
- package/dist/agents/system-prompt.js +26 -32
- package/dist/agents/tool-call-id.js +69 -17
- package/dist/agents/tool-display-common.js +1 -1
- package/dist/agents/tool-images.js +64 -31
- package/dist/agents/tools/canvas-tool.js +17 -11
- package/dist/agents/tools/common.js +37 -19
- package/dist/agents/tools/cron-tool.js +40 -38
- package/dist/agents/tools/gateway.js +70 -2
- package/dist/agents/tools/message-tool.js +181 -40
- package/dist/agents/tools/nodes-tool.js +128 -36
- package/dist/agents/tools/nodes-utils.js +12 -38
- package/dist/agents/tools/session-status-tool.js +24 -71
- package/dist/agents/tools/sessions-helpers.js +38 -210
- package/dist/agents/tools/sessions-spawn-tool.js +28 -198
- package/dist/agents/tools/telegram-actions.js +58 -7
- package/dist/agents/tools/web-fetch-utils.js +112 -7
- package/dist/agents/tools/web-fetch.js +279 -175
- package/dist/agents/tools/web-shared.js +71 -8
- package/dist/agents/usage.js +25 -16
- package/dist/auto-reply/commands-registry.data.js +85 -11
- package/dist/auto-reply/dispatch.js +40 -21
- package/dist/auto-reply/reply/abort.js +102 -33
- package/dist/auto-reply/reply/commands-core.js +82 -33
- package/dist/auto-reply/reply/commands-export-session.js +1 -1
- package/dist/auto-reply/reply/commands-info.js +41 -12
- package/dist/auto-reply/reply/commands-subagents.js +352 -100
- package/dist/auto-reply/reply/commands-system-prompt.js +2 -2
- package/dist/auto-reply/reply/dispatch-from-config.js +100 -29
- package/dist/auto-reply/reply/elevated-unavailable.js +1 -1
- package/dist/auto-reply/reply/inbound-meta.js +12 -1
- package/dist/auto-reply/reply/mentions.js +18 -11
- package/dist/auto-reply/reply/normalize-reply.js +17 -8
- package/dist/auto-reply/reply/reply-dispatcher.js +62 -10
- package/dist/auto-reply/reply/session.js +102 -21
- package/dist/auto-reply/reply/streaming-directives.js +16 -5
- package/dist/auto-reply/status.js +73 -50
- package/dist/browser/extension-relay.js +3 -3
- package/dist/browser/http-auth.js +1 -1
- package/dist/browser/paths.js +2 -2
- package/dist/build-info.json +3 -3
- package/dist/channels/allowlist-match.js +20 -0
- package/dist/channels/allowlists/resolve-utils.js +65 -2
- package/dist/channels/chat-type.js +8 -4
- package/dist/channels/dock.js +127 -35
- package/dist/channels/draft-stream-loop.js +6 -2
- package/dist/channels/plugins/actions/telegram.js +42 -18
- package/dist/channels/plugins/allowlist-match.js +1 -1
- package/dist/channels/plugins/group-mentions.js +51 -41
- package/dist/channels/plugins/message-action-names.js +2 -0
- package/dist/channels/plugins/message-actions.js +24 -5
- package/dist/channels/plugins/normalize/discord.js +26 -4
- package/dist/channels/plugins/normalize/signal.js +35 -22
- package/dist/channels/plugins/onboarding/helpers.js +8 -26
- package/dist/channels/plugins/outbound/imessage.js +15 -14
- package/dist/channels/registry.js +20 -7
- package/dist/cli/acp-cli.js +7 -5
- package/dist/cli/browser-cli-extension.js +25 -12
- package/dist/cli/browser-cli-state.cookies-storage.js +25 -6
- package/dist/cli/browser-cli-state.js +101 -145
- package/dist/cli/command-options.js +28 -0
- package/dist/cli/completion-cli.js +6 -6
- package/dist/cli/cron-cli/register.cron-add.js +25 -1
- package/dist/cli/cron-cli/register.cron-edit.js +44 -0
- package/dist/cli/cron-cli/shared.js +7 -1
- package/dist/cli/daemon-cli/lifecycle-core.js +23 -21
- package/dist/cli/daemon-cli/lifecycle.js +23 -247
- package/dist/cli/daemon-cli/register-service-commands.js +25 -4
- package/dist/cli/daemon-cli.js +1 -0
- package/dist/cli/devices-cli.js +33 -20
- package/dist/cli/gateway-cli/register.js +37 -105
- package/dist/cli/gateway-cli/run.js +49 -11
- package/dist/cli/nodes-camera.js +59 -4
- package/dist/cli/nodes-cli/register.camera.js +27 -24
- package/dist/cli/nodes-cli/rpc.js +21 -38
- package/dist/cli/qr-cli.js +2 -2
- package/dist/cli/skills-cli.format.js +2 -2
- package/dist/cli/update-cli/progress.js +2 -2
- package/dist/cli/update-cli/restart-helper.js +28 -7
- package/dist/cli/update-cli/shared.js +7 -7
- package/dist/cli/update-cli/status.js +1 -1
- package/dist/cli/update-cli/update-command.js +14 -8
- package/dist/cli/update-cli/wizard.js +2 -2
- package/dist/cli/update-cli.js +21 -1027
- package/dist/commands/auth-choice.apply.anthropic.js +10 -2
- package/dist/commands/channels/add-mutators.js +3 -35
- package/dist/commands/channels/add.js +39 -51
- package/dist/commands/config-validation.js +1 -1
- package/dist/commands/configure.gateway-auth.js +52 -15
- package/dist/commands/configure.gateway.js +84 -40
- package/dist/commands/doctor-completion.js +3 -3
- package/dist/commands/doctor-config-flow.js +536 -16
- package/dist/commands/doctor-gateway-services.js +103 -79
- package/dist/commands/doctor-memory-search.js +9 -9
- package/dist/commands/doctor-platform-notes.js +57 -30
- package/dist/commands/doctor-prompter.js +26 -15
- package/dist/commands/doctor-session-locks.js +1 -1
- package/dist/commands/doctor.js +21 -9
- package/dist/commands/model-picker.js +120 -95
- package/dist/commands/models/set.js +2 -21
- package/dist/commands/models/shared.js +65 -37
- package/dist/commands/onboard-helpers.js +81 -39
- package/dist/commands/openai-codex-oauth.js +1 -1
- package/dist/commands/sessions.js +52 -53
- package/dist/commands/status.summary.js +52 -34
- package/dist/commands/test-wizard-helpers.js +2 -2
- package/dist/config/defaults.js +79 -42
- package/dist/config/group-policy.js +50 -18
- package/dist/config/includes.js +37 -10
- package/dist/config/schema.help.js +5 -4
- package/dist/config/schema.hints.js +2 -2
- package/dist/config/schema.labels.js +1 -0
- package/dist/config/sessions/group.js +12 -11
- package/dist/config/sessions/paths.js +137 -11
- package/dist/config/sessions/store.js +185 -65
- package/dist/config/sessions/types.js +15 -1
- package/dist/config/sessions.js +1 -0
- package/dist/config/telegram-custom-commands.js +3 -2
- package/dist/config/types.js +2 -0
- package/dist/config/zod-schema.agent-defaults.js +6 -27
- package/dist/config/zod-schema.agent-runtime.js +171 -79
- package/dist/config/zod-schema.providers-core.js +138 -65
- package/dist/config/zod-schema.session.js +49 -22
- package/dist/control-ui/assets/index-HRr1grwl.js.map +1 -1
- package/dist/cron/isolated-agent/run.js +224 -57
- package/dist/cron/normalize.js +48 -45
- package/dist/cron/run-log.js +14 -0
- package/dist/cron/service/jobs.js +190 -28
- package/dist/cron/service/normalize.js +29 -11
- package/dist/cron/service/store.js +30 -44
- package/dist/cron/service/timer.js +182 -96
- package/dist/cron/service.js +3 -0
- package/dist/cron/stagger.js +37 -0
- package/dist/daemon/inspect.js +132 -92
- package/dist/daemon/runtime-paths.js +25 -4
- package/dist/daemon/service-audit.js +47 -16
- package/dist/discord/accounts.js +23 -20
- package/dist/discord/monitor/agent-components.js +1115 -219
- package/dist/discord/monitor/allow-list.js +114 -34
- package/dist/discord/monitor/listeners.js +204 -97
- package/dist/discord/monitor/message-handler.js +21 -10
- package/dist/discord/monitor/message-handler.preflight.js +195 -101
- package/dist/discord/monitor/message-handler.process.js +384 -123
- package/dist/discord/monitor/message-utils.js +86 -23
- package/dist/discord/monitor/native-command.js +77 -57
- package/dist/discord/monitor/provider.js +122 -117
- package/dist/discord/monitor/reply-context.js +20 -16
- package/dist/discord/monitor/reply-delivery.js +40 -8
- package/dist/discord/monitor/rest-fetch.js +22 -0
- package/dist/discord/monitor/threading.js +117 -24
- package/dist/discord/send.js +2 -1
- package/dist/discord/send.outbound.js +124 -11
- package/dist/discord/send.shared.js +112 -72
- package/dist/discord/voice-message.js +3 -3
- package/dist/gateway/auth.js +119 -44
- package/dist/gateway/call.js +76 -34
- package/dist/gateway/channel-health-monitor.js +57 -50
- package/dist/gateway/client.js +63 -29
- package/dist/gateway/control-ui-contract.js +1 -1
- package/dist/gateway/gateway-config-prompts.shared.js +2 -2
- package/dist/gateway/net.js +109 -1
- package/dist/gateway/protocol/index.js +5 -8
- package/dist/gateway/protocol/schema/agent.js +19 -1
- package/dist/gateway/protocol/schema/channels.js +21 -0
- package/dist/gateway/protocol/schema/cron.js +43 -30
- package/dist/gateway/protocol/schema/protocol-schemas.js +6 -11
- package/dist/gateway/protocol/schema/sessions.js +5 -1
- package/dist/gateway/protocol/schema.js +0 -1
- package/dist/gateway/server/presence-events.js +12 -0
- package/dist/gateway/server/ws-connection/message-handler.js +203 -212
- package/dist/gateway/server/ws-connection.js +58 -21
- package/dist/gateway/server-broadcast.js +18 -13
- package/dist/gateway/server-cron.js +177 -10
- package/dist/gateway/server-methods/agent-job.js +131 -38
- package/dist/gateway/server-methods/send.js +60 -14
- package/dist/gateway/server-methods/sessions.js +160 -96
- package/dist/gateway/server-methods/system.js +5 -7
- package/dist/gateway/server-methods-list.js +8 -0
- package/dist/gateway/server-methods.js +24 -8
- package/dist/gateway/server-node-events.js +278 -68
- package/dist/gateway/session-utils.fs.js +316 -75
- package/dist/gateway/session-utils.js +224 -70
- package/dist/gateway/sessions-patch.js +63 -20
- package/dist/gateway/test-temp-config.js +1 -1
- package/dist/gateway/tools-invoke-http.js +118 -70
- package/dist/gateway/ws-log.js +135 -107
- package/dist/hooks/frontmatter.js +36 -82
- package/dist/hooks/install.js +149 -139
- package/dist/hooks/internal-hooks.js +29 -4
- package/dist/hooks/plugin-hooks.js +2 -1
- package/dist/imessage/monitor/deliver.js +10 -4
- package/dist/imessage/monitor/monitor-provider.js +138 -375
- package/dist/imessage/monitor/runtime.js +4 -8
- package/dist/imessage/send.js +65 -19
- package/dist/infra/exec-approvals-allowlist.js +7 -0
- package/dist/infra/exec-approvals.js +35 -920
- package/dist/infra/exec-safe-bin-trust.js +64 -0
- package/dist/infra/heartbeat-runner.js +207 -134
- package/dist/infra/heartbeat-wake.js +183 -22
- package/dist/infra/install-source-utils.js +47 -0
- package/dist/infra/net/ssrf.js +170 -36
- package/dist/infra/outbound/deliver.js +224 -58
- package/dist/infra/outbound/message-action-spec.js +12 -5
- package/dist/infra/outbound/outbound-session.js +27 -25
- package/dist/infra/poolbot-root.js +32 -22
- package/dist/infra/ports.js +14 -11
- package/dist/infra/skills-remote.js +48 -37
- package/dist/infra/system-events.js +25 -11
- package/dist/infra/system-presence.js +26 -33
- package/dist/infra/tmp-poolbot-dir.js +81 -2
- package/dist/infra/wsl.js +37 -1
- package/dist/line/bot-message-context.js +163 -191
- package/dist/logging/subsystem.js +59 -22
- package/dist/markdown/ir.js +124 -50
- package/dist/media/store.js +1 -1
- package/dist/media-understanding/runner.entries.js +42 -25
- package/dist/media-understanding/runner.js +53 -488
- package/dist/memory/embeddings-gemini.js +53 -38
- package/dist/memory/manager-embedding-ops.js +48 -69
- package/dist/pairing/pairing-store.js +178 -119
- package/dist/plugin-sdk/index.js +34 -6
- package/dist/plugins/hooks.js +135 -14
- package/dist/plugins/install.js +190 -152
- package/dist/polls.js +11 -0
- package/dist/routing/resolve-route.js +190 -56
- package/dist/routing/session-key.js +38 -22
- package/dist/runtime.js +35 -9
- package/dist/security/audit-channel.js +1 -1
- package/dist/sessions/session-key-utils.js +29 -11
- package/dist/shared/frontmatter.js +5 -5
- package/dist/shared/node-list-types.js +1 -0
- package/dist/shared/string-normalization.js +15 -0
- package/dist/signal/monitor/event-handler.js +68 -36
- package/dist/signal/send.js +29 -37
- package/dist/slack/monitor/allow-list.js +10 -11
- package/dist/slack/monitor/commands.js +14 -3
- package/dist/slack/monitor/events/interactions.js +4 -4
- package/dist/slack/monitor/media.js +224 -16
- package/dist/slack/monitor/message-handler/dispatch.js +247 -13
- package/dist/slack/monitor/message-handler/prepare.js +128 -45
- package/dist/slack/monitor/slash.js +357 -144
- package/dist/slack/streaming.js +77 -0
- package/dist/telegram/accounts.js +40 -13
- package/dist/telegram/allowed-updates.js +3 -0
- package/dist/telegram/bot/delivery.js +129 -66
- package/dist/telegram/bot/helpers.js +136 -122
- package/dist/telegram/bot-handlers.js +600 -339
- package/dist/telegram/bot-message-context.js +115 -73
- package/dist/telegram/bot-message-dispatch.js +235 -104
- package/dist/telegram/bot-native-command-menu.js +3 -1
- package/dist/telegram/bot-native-commands.js +213 -193
- package/dist/telegram/bot.js +24 -132
- package/dist/telegram/draft-stream.js +84 -75
- package/dist/telegram/format.js +150 -6
- package/dist/telegram/send.js +415 -255
- package/dist/telegram/targets.js +21 -2
- package/dist/telegram/update-offset-store.js +19 -3
- package/dist/terminal/restore.js +5 -2
- package/dist/test-utils/fetch-mock.js +5 -0
- package/dist/version.js +18 -5
- package/dist/web/auto-reply/monitor/broadcast.js +7 -3
- package/dist/web/auto-reply/monitor/on-message.js +6 -3
- package/dist/web/inbound/media.js +34 -8
- package/dist/web/inbound/monitor.js +34 -17
- package/dist/web/inbound/send-api.js +18 -17
- package/dist/web/outbound.js +12 -5
- package/dist/wizard/clack-prompter.js +40 -7
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/device-pair/index.ts +2 -2
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/discord/package.json +1 -1
- package/extensions/feishu/package.json +1 -1
- package/extensions/google-antigravity-auth/package.json +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/package.json +1 -1
- package/extensions/imessage/package.json +1 -1
- package/extensions/irc/package.json +1 -1
- package/extensions/irc/src/accounts.ts +1 -1
- package/extensions/irc/src/onboarding.ts +4 -4
- package/extensions/line/package.json +1 -1
- package/extensions/llm-task/package.json +1 -1
- package/extensions/lobster/package.json +1 -1
- package/extensions/matrix/CHANGELOG.md +10 -0
- package/extensions/matrix/package.json +1 -1
- package/extensions/mattermost/package.json +1 -1
- package/extensions/memory-core/package.json +1 -1
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/minimax-portal-auth/package.json +1 -1
- package/extensions/msteams/CHANGELOG.md +10 -0
- package/extensions/msteams/package.json +1 -1
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nostr/CHANGELOG.md +10 -0
- package/extensions/nostr/package.json +1 -1
- package/extensions/open-prose/package.json +1 -1
- package/extensions/openai-codex-auth/package.json +1 -1
- package/extensions/signal/package.json +1 -1
- package/extensions/slack/package.json +1 -1
- package/extensions/telegram/package.json +1 -1
- package/extensions/tlon/package.json +1 -1
- package/extensions/twitch/CHANGELOG.md +10 -0
- package/extensions/twitch/package.json +1 -1
- package/extensions/voice-call/CHANGELOG.md +10 -0
- package/extensions/voice-call/package.json +1 -1
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/zalo/CHANGELOG.md +10 -0
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalouser/CHANGELOG.md +10 -0
- package/extensions/zalouser/package.json +1 -1
- package/package.json +1 -1
- package/skills/apple-reminders/SKILL.md +100 -49
- package/skills/coding-agent/SKILL.md +34 -28
- package/skills/github/SKILL.md +131 -16
- package/skills/imsg/SKILL.md +112 -15
- package/skills/openhue/SKILL.md +101 -19
- package/skills/tmux/SKILL.md +111 -79
- package/skills/weather/SKILL.md +88 -25
- package/dist/agents/openclaw-tools.js +0 -151
- package/dist/agents/tool-security.js +0 -96
- package/dist/gateway/url-validation.js +0 -94
- package/dist/infra/openclaw-root.js +0 -109
- package/dist/infra/tmp-openclaw-dir.js +0 -81
- package/dist/media/path-sanitization.js +0 -78
package/dist/agents/pi-tools.js
CHANGED
|
@@ -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 {
|
|
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 {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
132
|
-
const
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
155
|
-
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
? [
|
|
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
|
-
|
|
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
|
|
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.
|