@poolzin/pool-bot 2026.2.24 → 2026.2.26
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 +21 -0
- package/dist/acp/client.js +207 -18
- package/dist/acp/event-mapper.js +87 -22
- package/dist/acp/meta.js +12 -6
- package/dist/acp/secret-file.js +22 -0
- package/dist/agents/agent-paths.js +8 -9
- package/dist/agents/agent-scope.js +17 -5
- package/dist/agents/auth-profiles/oauth.js +148 -64
- package/dist/agents/auth-profiles/session-override.js +13 -7
- package/dist/agents/bash-process-registry.test-helpers.js +29 -0
- package/dist/agents/bash-tools.exec-approval-request.js +20 -0
- package/dist/agents/bash-tools.exec-host-gateway.js +240 -0
- package/dist/agents/bash-tools.exec-host-node.js +235 -0
- package/dist/agents/bash-tools.exec-runtime.js +2 -25
- package/dist/agents/bash-tools.exec-types.js +1 -0
- package/dist/agents/bash-tools.process.js +224 -218
- package/dist/agents/bedrock-discovery.js +3 -1
- package/dist/agents/byteplus-models.js +97 -0
- package/dist/agents/chutes-oauth.js +1 -0
- package/dist/agents/cli-runner/helpers.js +4 -0
- package/dist/agents/compaction.js +41 -14
- package/dist/agents/content-blocks.js +16 -0
- package/dist/agents/doubao-models.js +121 -0
- package/dist/agents/failover-error.js +2 -0
- package/dist/agents/huggingface-models.js +5 -3
- package/dist/agents/live-model-filter.js +5 -0
- package/dist/agents/minimax-vlm.js +10 -8
- package/dist/agents/model-auth.js +6 -0
- package/dist/agents/model-catalog.js +3 -1
- package/dist/agents/model-fallback.js +96 -101
- package/dist/agents/model-selection.js +7 -1
- package/dist/agents/models-config.providers.js +364 -165
- package/dist/agents/ollama-stream.js +117 -4
- package/dist/agents/opencode-zen-models.js +22 -11
- package/dist/agents/pi-embedded-helpers/errors.js +55 -33
- package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
- package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
- package/dist/agents/pi-embedded-helpers.js +1 -1
- package/dist/agents/pi-embedded-payloads.js +1 -0
- package/dist/agents/pi-embedded-runner/compact.js +29 -7
- package/dist/agents/pi-embedded-runner/extensions.js +28 -26
- package/dist/agents/pi-embedded-runner/google.js +20 -8
- package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
- package/dist/agents/pi-embedded-runner/run.js +71 -12
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.fixture.js +34 -0
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
- package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
- package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
- package/dist/agents/pi-embedded-runner/thinking.js +42 -0
- package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
- package/dist/agents/pi-embedded-runner/utils.js +7 -10
- package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
- package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
- package/dist/agents/pi-embedded-subscribe.js +9 -4
- package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
- package/dist/agents/pi-embedded-utils.js +3 -0
- package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
- package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
- package/dist/agents/pi-settings.js +40 -0
- package/dist/agents/pi-tools.policy.js +2 -1
- package/dist/agents/provider/config-loader.js +1 -1
- package/dist/agents/sandbox/browser.js +170 -33
- package/dist/agents/sandbox/config-hash.js +14 -27
- package/dist/agents/sandbox/config.js +21 -2
- package/dist/agents/sandbox/constants.js +2 -0
- package/dist/agents/sandbox/docker.js +16 -2
- package/dist/agents/sandbox/novnc-auth.js +62 -0
- package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
- package/dist/agents/sandbox/shared.js +10 -6
- package/dist/agents/sandbox-paths.js +24 -11
- package/dist/agents/schema/clean-for-gemini.js +132 -85
- package/dist/agents/session-slug.js +10 -5
- package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
- package/dist/agents/session-tool-result-guard.js +3 -1
- package/dist/agents/session-transcript-repair.js +40 -6
- package/dist/agents/skills/bundled-dir.js +19 -5
- package/dist/agents/skills/env-overrides.js +124 -43
- package/dist/agents/skills/frontmatter.js +6 -6
- package/dist/agents/skills/plugin-skills.js +14 -7
- package/dist/agents/skills/workspace.js +1 -0
- package/dist/agents/skills.test-helpers.js +13 -0
- package/dist/agents/stable-stringify.js +12 -0
- package/dist/agents/subagent-announce.js +251 -49
- package/dist/agents/subagent-lifecycle-events.js +19 -0
- package/dist/agents/subagent-registry-cleanup.js +31 -0
- package/dist/agents/subagent-registry-completion.js +68 -0
- package/dist/agents/subagent-registry-queries.js +117 -0
- package/dist/agents/subagent-registry-state.js +46 -0
- package/dist/agents/subagent-registry.js +252 -221
- package/dist/agents/subagent-registry.mocks.shared.js +12 -0
- package/dist/agents/subagent-registry.store.js +1 -0
- package/dist/agents/subagent-registry.types.js +1 -0
- package/dist/agents/subagent-spawn.js +195 -7
- package/dist/agents/system-prompt.js +22 -6
- package/dist/agents/test-helpers/assistant-message-fixtures.js +29 -0
- package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
- package/dist/agents/test-helpers/fast-core-tools.js +1 -17
- package/dist/agents/test-helpers/pi-tools-sandbox-context.js +27 -0
- package/dist/agents/timeout.js +18 -6
- package/dist/agents/tool-call-id.js +1 -1
- package/dist/agents/tool-display-common.js +162 -29
- package/dist/agents/tool-images.js +82 -9
- package/dist/agents/tool-policy-shared.js +108 -0
- package/dist/agents/tool-policy.js +51 -26
- package/dist/agents/tools/browser-tool.js +160 -54
- package/dist/agents/tools/canvas-tool.js +27 -1
- package/dist/agents/tools/common.js +45 -0
- package/dist/agents/tools/cron-tool.test-helpers.js +12 -0
- package/dist/agents/tools/discord-actions-guild.js +4 -1
- package/dist/agents/tools/discord-actions-moderation-shared.js +27 -0
- package/dist/agents/tools/gateway-tool.js +3 -1
- package/dist/agents/tools/image-tool.js +214 -99
- package/dist/agents/tools/nodes-utils.js +1 -10
- package/dist/agents/tools/sessions-history-tool.js +140 -108
- package/dist/agents/tools/sessions-send-helpers.js +12 -6
- package/dist/agents/tools/sessions-spawn-tool.js +8 -2
- package/dist/agents/tools/subagents-tool.js +2 -1
- package/dist/agents/tools/whatsapp-actions.js +10 -2
- package/dist/agents/tools/whatsapp-target-auth.js +18 -0
- package/dist/agents/transcript-policy.js +22 -8
- package/dist/agents/venice-models.js +11 -3
- package/dist/agents/workspace.js +222 -46
- package/dist/auto-reply/commands-registry.data.js +51 -0
- package/dist/auto-reply/commands-registry.js +19 -21
- package/dist/auto-reply/fallback-state.js +114 -0
- package/dist/auto-reply/group-activation.js +10 -5
- package/dist/auto-reply/inbound-debounce.js +10 -5
- package/dist/auto-reply/model-runtime.js +68 -0
- package/dist/auto-reply/reply/abort.js +1 -1
- package/dist/auto-reply/reply/agent-runner-execution.js +40 -5
- package/dist/auto-reply/reply/agent-runner.js +165 -39
- package/dist/auto-reply/reply/bash-command.js +41 -39
- package/dist/auto-reply/reply/command-gates.js +25 -0
- package/dist/auto-reply/reply/commands-allowlist.js +111 -72
- package/dist/auto-reply/reply/commands-bash.js +6 -5
- package/dist/auto-reply/reply/commands-config.js +30 -28
- package/dist/auto-reply/reply/commands-core.js +2 -1
- package/dist/auto-reply/reply/commands-info.js +1 -0
- package/dist/auto-reply/reply/commands-models.js +65 -14
- package/dist/auto-reply/reply/commands-session.js +237 -82
- package/dist/auto-reply/reply/commands-setunset-standard.js +13 -0
- package/dist/auto-reply/reply/commands-setunset.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
- package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
- package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
- package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
- package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
- package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
- package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
- package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
- package/dist/auto-reply/reply/commands-subagents.js +51 -587
- package/dist/auto-reply/reply/commands-tts.js +10 -5
- package/dist/auto-reply/reply/config-value.js +10 -5
- package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
- package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
- package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
- package/dist/auto-reply/reply/followup-runner.js +1 -0
- package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
- package/dist/auto-reply/reply/get-reply-directives.js +17 -28
- package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
- package/dist/auto-reply/reply/get-reply.js +71 -12
- package/dist/auto-reply/reply/model-selection.js +80 -39
- package/dist/auto-reply/reply/queue/enqueue.js +10 -5
- package/dist/auto-reply/reply/queue/state.js +13 -12
- package/dist/auto-reply/reply/reply-payloads.js +67 -36
- package/dist/auto-reply/reply/reply-reference.js +9 -8
- package/dist/auto-reply/reply/route-reply.js +15 -8
- package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
- package/dist/auto-reply/reply/session.js +22 -6
- package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
- package/dist/auto-reply/reply/subagents-utils.js +56 -30
- package/dist/auto-reply/reply/typing.js +46 -21
- package/dist/auto-reply/send-policy.js +14 -7
- package/dist/auto-reply/status.js +140 -16
- package/dist/auto-reply/templating.js +10 -5
- package/dist/auto-reply/thinking.js +7 -16
- package/dist/auto-reply/tokens.js +21 -5
- package/dist/browser/bridge-server.js +36 -20
- package/dist/browser/cdp.helpers.js +7 -14
- package/dist/browser/cdp.js +35 -15
- package/dist/browser/chrome.profile-decoration.js +7 -4
- package/dist/browser/config.js +30 -0
- package/dist/browser/extension-relay-auth.js +55 -0
- package/dist/browser/extension-relay.js +74 -29
- package/dist/browser/navigation-guard.js +39 -0
- package/dist/browser/paths.js +77 -0
- package/dist/browser/profiles.js +13 -8
- package/dist/browser/pw-ai-module.js +10 -5
- package/dist/browser/pw-session.js +76 -39
- package/dist/browser/pw-tools-core.interactions.js +14 -7
- package/dist/browser/pw-tools-core.state.js +12 -6
- package/dist/browser/routes/agent.act.js +431 -424
- package/dist/browser/routes/agent.shared.js +47 -3
- package/dist/browser/routes/agent.snapshot.js +122 -116
- package/dist/browser/routes/agent.storage.js +303 -297
- package/dist/browser/routes/tabs.js +154 -100
- package/dist/browser/server-context.js +7 -0
- package/dist/browser/server-lifecycle.js +37 -0
- package/dist/build-info.json +3 -3
- package/dist/channels/allow-from.js +26 -0
- package/dist/channels/allowlists/resolve-utils.js +43 -19
- package/dist/channels/channel-config.js +14 -7
- package/dist/channels/draft-stream-loop.js +7 -0
- package/dist/channels/model-overrides.js +82 -0
- package/dist/channels/plugins/account-action-gate.js +13 -0
- package/dist/channels/plugins/message-actions.js +10 -0
- package/dist/channels/plugins/normalize/imessage.js +14 -7
- package/dist/channels/plugins/normalize/slack.js +10 -5
- package/dist/channels/plugins/normalize/telegram.js +14 -7
- package/dist/channels/plugins/outbound/discord.js +80 -8
- package/dist/channels/plugins/outbound/signal.js +11 -11
- package/dist/channels/plugins/setup-helpers.js +10 -5
- package/dist/channels/sender-label.js +14 -7
- package/dist/channels/session.js +4 -2
- package/dist/channels/status-reactions.js +297 -0
- package/dist/channels/telegram/api.js +18 -0
- package/dist/cli/argv.js +84 -21
- package/dist/cli/banner.js +3 -2
- package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
- package/dist/cli/cli-name.js +11 -11
- package/dist/cli/cli-utils.js +13 -3
- package/dist/cli/command-format.js +1 -1
- package/dist/cli/config-cli.js +1 -1
- package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
- package/dist/cli/daemon-cli/lifecycle.js +64 -2
- package/dist/cli/daemon-cli/restart-health.js +126 -0
- package/dist/cli/daemon-cli/status.gather.js +9 -13
- package/dist/cli/daemon-cli/status.print.js +2 -10
- package/dist/cli/deps.js +27 -22
- package/dist/cli/exec-approvals-cli.js +92 -124
- package/dist/cli/gateway-cli/run-loop.js +23 -5
- package/dist/cli/memory-cli.js +158 -61
- package/dist/cli/node-cli/register.js +14 -5
- package/dist/cli/nodes-cli/register.push.js +63 -0
- package/dist/cli/nodes-media-utils.js +26 -0
- package/dist/cli/outbound-send-deps.js +2 -9
- package/dist/cli/outbound-send-mapping.js +11 -0
- package/dist/cli/pairing-cli.js +40 -14
- package/dist/cli/plugins-cli.js +250 -73
- package/dist/cli/ports.js +11 -10
- package/dist/cli/program/build-program.js +3 -1
- package/dist/cli/program/command-registry.js +214 -136
- package/dist/cli/program/command-tree.js +16 -0
- package/dist/cli/program/help.js +43 -12
- package/dist/cli/program/preaction.js +13 -9
- package/dist/cli/program/register.configure.js +3 -18
- package/dist/cli/program/register.maintenance.js +2 -2
- package/dist/cli/program/register.onboard.js +2 -0
- package/dist/cli/program/register.status-health-sessions.js +16 -17
- package/dist/cli/program/register.subclis.js +93 -52
- package/dist/cli/route.js +12 -8
- package/dist/cli/system-cli.js +36 -46
- package/dist/cli/test-runtime-capture.js +24 -0
- package/dist/cli/update-cli/shared.js +22 -9
- package/dist/cli/update-cli/update-command.js +89 -14
- package/dist/cli/update-cli/wizard.js +6 -12
- package/dist/commands/agent/run-context.js +18 -5
- package/dist/commands/agent/session-store.js +17 -4
- package/dist/commands/agent.js +185 -89
- package/dist/commands/agents.bindings.js +14 -7
- package/dist/commands/agents.commands.add.js +13 -9
- package/dist/commands/agents.commands.identity.js +12 -6
- package/dist/commands/agents.commands.list.js +11 -6
- package/dist/commands/agents.config.js +8 -10
- package/dist/commands/agents.providers.js +12 -6
- package/dist/commands/auth-choice-options.js +103 -75
- package/dist/commands/auth-choice.apply.byteplus.js +55 -0
- package/dist/commands/auth-choice.apply.js +4 -0
- package/dist/commands/auth-choice.apply.minimax.js +61 -13
- package/dist/commands/auth-choice.apply.openai.js +3 -1
- package/dist/commands/auth-choice.apply.volcengine.js +55 -0
- package/dist/commands/auth-choice.preferred-provider.js +2 -0
- package/dist/commands/channels/remove.js +13 -6
- package/dist/commands/channels/shared.js +4 -14
- package/dist/commands/channels.mock-harness.js +23 -0
- package/dist/commands/configure.commands.js +14 -0
- package/dist/commands/configure.gateway.js +2 -4
- package/dist/commands/configure.js +1 -1
- package/dist/commands/configure.shared.js +11 -0
- package/dist/commands/daemon-install-helpers.js +2 -2
- package/dist/commands/daemon-install-runtime-warning.js +11 -0
- package/dist/commands/dashboard.js +12 -10
- package/dist/commands/docs.js +14 -8
- package/dist/commands/doctor-config-flow.js +11 -9
- package/dist/commands/doctor-legacy-config.js +281 -0
- package/dist/commands/doctor-state-integrity.js +99 -23
- package/dist/commands/doctor-update.js +12 -9
- package/dist/commands/models/list.list-command.js +7 -5
- package/dist/commands/models/set-image.js +2 -21
- package/dist/commands/node-daemon-install-helpers.js +10 -8
- package/dist/commands/onboard-auth.config-minimax.js +54 -80
- package/dist/commands/onboard-auth.config-opencode.js +2 -18
- package/dist/commands/onboard-auth.credentials.js +90 -13
- package/dist/commands/onboard-auth.js +1 -1
- package/dist/commands/onboard-auth.models.js +6 -5
- package/dist/commands/onboard-hooks.js +1 -1
- package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
- package/dist/commands/onboard-provider-auth-flags.js +14 -0
- package/dist/commands/onboard-remote.js +14 -7
- package/dist/commands/onboard.js +11 -13
- package/dist/commands/sandbox-display.js +6 -5
- package/dist/commands/sessions.test-helpers.js +61 -0
- package/dist/commands/status-all/diagnosis.js +14 -10
- package/dist/commands/status-all/format.js +1 -0
- package/dist/commands/status.gateway-probe.js +1 -16
- package/dist/commands/systemd-linger.js +12 -6
- package/dist/config/agent-limits.js +2 -0
- package/dist/config/commands.js +32 -15
- package/dist/config/config-paths.js +9 -11
- package/dist/config/config.js +1 -1
- package/dist/config/defaults.js +22 -2
- package/dist/config/discord-preview-streaming.js +104 -0
- package/dist/config/env-substitution.js +62 -34
- package/dist/config/env-vars.js +45 -7
- package/dist/config/includes.js +4 -0
- package/dist/config/io.js +656 -171
- package/dist/config/legacy.migrations.part-1.js +189 -78
- package/dist/config/legacy.shared.js +3 -1
- package/dist/config/merge-patch.js +54 -4
- package/dist/config/prototype-keys.js +4 -0
- package/dist/config/redact-snapshot.js +404 -76
- package/dist/config/schema.help.js +44 -7
- package/dist/config/schema.js +58 -570
- package/dist/config/schema.labels.js +38 -6
- package/dist/config/sessions/delivery-info.js +10 -3
- package/dist/config/sessions/main-session.js +10 -5
- package/dist/config/sessions/session-file.js +33 -0
- package/dist/config/sessions/session-key.js +10 -5
- package/dist/config/sessions/store.js +1 -1
- package/dist/config/sessions.js +1 -0
- package/dist/config/validation.js +140 -85
- package/dist/config/zod-schema.agent-runtime.js +11 -0
- package/dist/config/zod-schema.hooks.js +40 -11
- package/dist/config/zod-schema.installs.js +20 -0
- package/dist/config/zod-schema.js +156 -20
- package/dist/config/zod-schema.providers-core.js +78 -4
- package/dist/config/zod-schema.providers.js +6 -1
- package/dist/config/zod-schema.session.js +41 -2
- package/dist/cron/run-log.js +3 -0
- package/dist/cron/schedule.js +21 -10
- package/dist/cron/service/ops.js +35 -21
- package/dist/cron/service/timer.js +116 -16
- package/dist/cron/stagger.js +3 -1
- package/dist/daemon/cmd-argv.js +21 -0
- package/dist/daemon/cmd-set.js +58 -0
- package/dist/daemon/service-types.js +1 -0
- package/dist/discord/api.js +12 -6
- package/dist/discord/draft-chunking.js +22 -0
- package/dist/discord/draft-stream.js +124 -0
- package/dist/discord/monitor/agent-components.js +1 -1
- package/dist/discord/monitor/commands.js +5 -0
- package/dist/discord/monitor/exec-approvals.js +357 -162
- package/dist/discord/monitor/gateway-plugin.js +2 -1
- package/dist/discord/monitor/listeners.js +37 -27
- package/dist/discord/monitor/message-handler.js +4 -1
- package/dist/discord/monitor/message-handler.preflight.js +65 -8
- package/dist/discord/monitor/message-handler.process.js +246 -217
- package/dist/discord/monitor/message-utils.js +143 -6
- package/dist/discord/monitor/model-picker-preferences.js +143 -0
- package/dist/discord/monitor/model-picker.js +651 -0
- package/dist/discord/monitor/native-command.js +573 -16
- package/dist/discord/monitor/provider.allowlist.js +223 -0
- package/dist/discord/monitor/provider.js +275 -347
- package/dist/discord/monitor/provider.lifecycle.js +100 -0
- package/dist/discord/monitor/reply-delivery.js +123 -16
- package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
- package/dist/discord/monitor/thread-bindings.js +4 -0
- package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
- package/dist/discord/monitor/thread-bindings.manager.js +423 -0
- package/dist/discord/monitor/thread-bindings.messages.js +55 -0
- package/dist/discord/monitor/thread-bindings.state.js +358 -0
- package/dist/discord/monitor/thread-bindings.types.js +6 -0
- package/dist/discord/resolve-users.js +33 -21
- package/dist/discord/send.channels.js +15 -0
- package/dist/discord/send.js +3 -2
- package/dist/discord/send.outbound.js +82 -26
- package/dist/discord/send.permissions.js +83 -30
- package/dist/discord/send.reactions.js +8 -4
- package/dist/discord/token.js +10 -5
- package/dist/discord/voice/command.js +263 -0
- package/dist/discord/voice/manager.js +531 -0
- package/dist/gateway/auth.js +72 -13
- package/dist/gateway/call.js +152 -83
- package/dist/gateway/canvas-capability.js +75 -0
- package/dist/gateway/client.js +28 -4
- package/dist/gateway/config-reload.js +3 -4
- package/dist/gateway/control-plane-audit.js +28 -0
- package/dist/gateway/control-plane-rate-limit.js +53 -0
- package/dist/gateway/control-ui.js +219 -96
- package/dist/gateway/events.js +1 -0
- package/dist/gateway/hooks-mapping.js +88 -38
- package/dist/gateway/hooks.js +109 -54
- package/dist/gateway/http-auth-helpers.js +3 -2
- package/dist/gateway/http-common.js +22 -0
- package/dist/gateway/http-endpoint-helpers.js +1 -0
- package/dist/gateway/method-scopes.js +169 -0
- package/dist/gateway/net.js +74 -9
- package/dist/gateway/node-invoke-system-run-approval.js +14 -35
- package/dist/gateway/node-registry.js +10 -5
- package/dist/gateway/openai-http.js +1 -0
- package/dist/gateway/openresponses-http.js +121 -110
- package/dist/gateway/origin-check.js +1 -18
- package/dist/gateway/probe-auth.js +2 -0
- package/dist/gateway/protocol/index.js +4 -2
- package/dist/gateway/protocol/schema/cron.js +1 -0
- package/dist/gateway/protocol/schema/devices.js +1 -0
- package/dist/gateway/protocol/schema/protocol-schemas.js +4 -1
- package/dist/gateway/protocol/schema/push.js +18 -0
- package/dist/gateway/protocol/schema/sessions.js +6 -0
- package/dist/gateway/protocol/schema.js +1 -0
- package/dist/gateway/role-policy.js +17 -0
- package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
- package/dist/gateway/server/ws-connection/message-handler.js +175 -148
- package/dist/gateway/server-chat.js +83 -25
- package/dist/gateway/server-constants.js +10 -9
- package/dist/gateway/server-cron.js +1 -0
- package/dist/gateway/server-http.js +247 -54
- package/dist/gateway/server-maintenance.js +20 -5
- package/dist/gateway/server-methods/agent.js +162 -24
- package/dist/gateway/server-methods/chat.js +465 -130
- package/dist/gateway/server-methods/config.js +193 -152
- package/dist/gateway/server-methods/devices.js +17 -3
- package/dist/gateway/server-methods/models.js +11 -1
- package/dist/gateway/server-methods/nodes.helpers.js +12 -0
- package/dist/gateway/server-methods/nodes.js +251 -69
- package/dist/gateway/server-methods/push.js +53 -0
- package/dist/gateway/server-methods/sessions.js +64 -8
- package/dist/gateway/server-methods/usage.js +162 -75
- package/dist/gateway/server-node-events.js +29 -0
- package/dist/gateway/server-reload-handlers.js +2 -3
- package/dist/gateway/server-runtime-config.js +39 -13
- package/dist/gateway/server-runtime-state.js +2 -0
- package/dist/gateway/server-startup-memory.js +17 -11
- package/dist/gateway/server-ws-runtime.js +1 -0
- package/dist/gateway/server.impl.js +296 -139
- package/dist/gateway/session-preview.test-helpers.js +11 -0
- package/dist/gateway/session-utils.fs.js +32 -34
- package/dist/gateway/sessions-resolve.js +17 -5
- package/dist/gateway/startup-auth.js +126 -0
- package/dist/gateway/test-helpers.agent-results.js +15 -0
- package/dist/gateway/test-helpers.mocks.js +37 -14
- package/dist/gateway/test-helpers.openai-mock.js +14 -7
- package/dist/gateway/test-helpers.server.js +161 -77
- package/dist/gateway/tools-invoke-http.js +21 -10
- package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
- package/dist/hooks/bundled/command-logger/handler.js +7 -2
- package/dist/hooks/bundled/session-memory/handler.js +170 -38
- package/dist/hooks/frontmatter.js +6 -6
- package/dist/hooks/gmail-watcher-lifecycle.js +23 -0
- package/dist/hooks/gmail-watcher.js +11 -6
- package/dist/hooks/internal-hooks.js +11 -1
- package/dist/hooks/llm-slug-generator.js +4 -1
- package/dist/hooks/workspace.js +47 -17
- package/dist/imessage/accounts.js +9 -20
- package/dist/imessage/monitor/inbound-processing.js +2 -1
- package/dist/infra/archive-path.js +49 -0
- package/dist/infra/archive.js +174 -73
- package/dist/infra/control-ui-assets.js +14 -6
- package/dist/infra/device-pairing.js +204 -144
- package/dist/infra/env.js +10 -5
- package/dist/infra/exec-approvals-allowlist.js +141 -70
- package/dist/infra/exec-approvals-analysis.js +78 -20
- package/dist/infra/exec-approvals.js +5 -17
- package/dist/infra/exec-safe-bin-policy.js +277 -0
- package/dist/infra/fixed-window-rate-limit.js +33 -0
- package/dist/infra/fs-safe.js +71 -39
- package/dist/infra/gateway-lock.js +6 -2
- package/dist/infra/git-root.js +61 -0
- package/dist/infra/heartbeat-active-hours.js +2 -2
- package/dist/infra/heartbeat-reason.js +40 -0
- package/dist/infra/heartbeat-runner.js +72 -32
- package/dist/infra/heartbeat-wake.js +6 -12
- package/dist/infra/host-env-security-policy.json +19 -0
- package/dist/infra/host-env-security.js +66 -0
- package/dist/infra/install-source-utils.js +91 -7
- package/dist/infra/net/ssrf.js +131 -38
- package/dist/infra/node-pairing.js +50 -105
- package/dist/infra/npm-integrity.js +45 -0
- package/dist/infra/npm-pack-install.js +40 -0
- package/dist/infra/outbound/bound-delivery-router.js +88 -0
- package/dist/infra/outbound/channel-adapters.js +20 -7
- package/dist/infra/outbound/channel-selection.js +12 -6
- package/dist/infra/outbound/envelope.js +1 -1
- package/dist/infra/outbound/format.js +12 -6
- package/dist/infra/outbound/message-action-runner.js +107 -327
- package/dist/infra/outbound/message.js +59 -36
- package/dist/infra/outbound/outbound-policy.js +52 -25
- package/dist/infra/outbound/outbound-send-service.js +58 -71
- package/dist/infra/outbound/payloads.js +14 -7
- package/dist/infra/outbound/session-binding-service.js +123 -0
- package/dist/infra/pairing-files.js +10 -0
- package/dist/infra/path-guards.js +25 -0
- package/dist/infra/plain-object.js +9 -0
- package/dist/infra/provider-usage.fetch.codex.js +7 -15
- package/dist/infra/provider-usage.fetch.gemini.js +14 -11
- package/dist/infra/provider-usage.fetch.shared.js +30 -1
- package/dist/infra/provider-usage.fetch.zai.js +10 -9
- package/dist/infra/push-apns.js +365 -0
- package/dist/infra/restart-sentinel.js +16 -1
- package/dist/infra/restart.js +229 -26
- package/dist/infra/retry-policy.js +4 -2
- package/dist/infra/retry.js +9 -5
- package/dist/infra/scp-host.js +54 -0
- package/dist/infra/session-cost-usage.js +107 -59
- package/dist/infra/session-maintenance-warning.js +3 -1
- package/dist/infra/shell-env.js +98 -34
- package/dist/infra/ssh-config.js +12 -6
- package/dist/infra/system-run-command.js +49 -4
- package/dist/infra/update-channels.js +10 -5
- package/dist/infra/update-startup.js +86 -9
- package/dist/line/accounts.js +5 -7
- package/dist/line/bot-access.js +8 -20
- package/dist/line/bot-handlers.js +3 -1
- package/dist/link-understanding/detect.js +15 -7
- package/dist/media/constants.js +15 -6
- package/dist/media/image-ops.js +7 -0
- package/dist/media/inbound-path-policy.js +114 -0
- package/dist/media/input-files.js +16 -0
- package/dist/media/local-roots.js +3 -2
- package/dist/media-understanding/apply.js +4 -1
- package/dist/media-understanding/concurrency.js +8 -20
- package/dist/memory/backend-config.js +45 -6
- package/dist/memory/embeddings.js +10 -4
- package/dist/memory/fs-utils.js +23 -0
- package/dist/memory/manager-search.js +12 -6
- package/dist/memory/manager-sync-ops.js +12 -2
- package/dist/memory/qmd-manager.js +466 -53
- package/dist/memory/query-expansion.js +167 -3
- package/dist/memory/status-format.js +10 -5
- package/dist/memory/sync-memory-files.js +1 -1
- package/dist/memory/test-manager.js +8 -0
- package/dist/node-host/invoke-system-run.js +281 -0
- package/dist/node-host/invoke.js +55 -337
- package/dist/pairing/pairing-store.js +22 -0
- package/dist/plugin-sdk/allow-from.js +1 -1
- package/dist/plugin-sdk/command-auth.js +3 -1
- package/dist/plugin-sdk/index.js +6 -3
- package/dist/plugin-sdk/temp-path.js +47 -0
- package/dist/plugin-sdk/webhook-targets.js +32 -0
- package/dist/plugins/bundled-dir.js +9 -6
- package/dist/plugins/discovery.js +217 -23
- package/dist/plugins/hook-runner-global.js +16 -0
- package/dist/plugins/hooks.js +50 -0
- package/dist/plugins/install.js +28 -16
- package/dist/plugins/loader.js +192 -26
- package/dist/plugins/logger.js +8 -0
- package/dist/plugins/manifest-registry.js +3 -0
- package/dist/plugins/path-safety.js +34 -0
- package/dist/plugins/registry.js +5 -2
- package/dist/plugins/runtime/index.js +271 -206
- package/dist/plugins/runtime.js +3 -17
- package/dist/plugins/update.js +78 -12
- package/dist/process/spawn-utils.js +14 -7
- package/dist/providers/github-copilot-models.js +4 -1
- package/dist/providers/github-copilot-token.js +11 -6
- package/dist/providers/qwen-portal-oauth.js +14 -6
- package/dist/routing/account-id.js +30 -0
- package/dist/routing/resolve-route.js +3 -7
- package/dist/routing/session-key.js +2 -16
- package/dist/security/audit-channel.js +100 -20
- package/dist/security/audit-extra.async.js +505 -179
- package/dist/security/audit-extra.js +12 -2
- package/dist/security/audit-extra.sync.js +421 -35
- package/dist/security/audit-fs.js +31 -13
- package/dist/security/audit.js +180 -370
- package/dist/security/dm-policy-shared.js +68 -0
- package/dist/security/external-content.js +46 -14
- package/dist/security/fix.js +49 -85
- package/dist/security/scan-paths.js +20 -0
- package/dist/security/secret-equal.js +3 -7
- package/dist/security/windows-acl.js +30 -15
- package/dist/shared/entry-status.js +6 -0
- package/dist/shared/frontmatter.js +5 -5
- package/dist/shared/node-list-parse.js +13 -0
- package/dist/shared/node-match.js +11 -4
- package/dist/shared/operator-scope-compat.js +42 -0
- package/dist/shared/text-chunking.js +29 -0
- package/dist/signal/accounts.js +7 -20
- package/dist/signal/monitor/event-handler.js +3 -1
- package/dist/slack/accounts.js +6 -19
- package/dist/slack/actions.js +11 -3
- package/dist/slack/blocks.test-helpers.js +31 -0
- package/dist/slack/monitor/auth.js +1 -1
- package/dist/slack/monitor/message-handler/dispatch.js +50 -29
- package/dist/slack/monitor/mrkdwn.js +8 -0
- package/dist/slack/monitor/replies.js +15 -7
- package/dist/slack/monitor/slash.js +22 -13
- package/dist/slack/resolve-channels.js +10 -5
- package/dist/slack/send.js +102 -12
- package/dist/slack/stream-mode.js +10 -0
- package/dist/slack/streaming.js +4 -2
- package/dist/telegram/accounts.js +19 -14
- package/dist/telegram/bot/helpers.js +3 -5
- package/dist/telegram/bot-access.js +35 -36
- package/dist/telegram/bot-handlers.js +120 -148
- package/dist/telegram/bot-message-context.js +68 -9
- package/dist/telegram/bot-message-dispatch.js +477 -210
- package/dist/telegram/bot-native-commands.js +16 -0
- package/dist/telegram/draft-stream.js +44 -8
- package/dist/telegram/inline-buttons.js +5 -15
- package/dist/telegram/monitor.js +11 -7
- package/dist/telegram/network-config.js +19 -7
- package/dist/telegram/reasoning-lane-coordinator.js +128 -0
- package/dist/telegram/send.js +3 -2
- package/dist/telegram/sent-message-cache.js +5 -6
- package/dist/telegram/status-reaction-variants.js +208 -0
- package/dist/telegram/sticker-cache.js +11 -9
- package/dist/terminal/prompt-select-styled.js +9 -0
- package/dist/terminal/theme.js +12 -12
- package/dist/test-utils/command-runner.js +6 -0
- package/dist/test-utils/internal-hook-event-payload.js +10 -0
- package/dist/test-utils/model-auth-mock.js +12 -0
- package/dist/test-utils/provider-usage-fetch.js +14 -0
- package/dist/test-utils/temp-home.js +33 -0
- package/dist/tts/tts.js +80 -567
- package/dist/tui/components/chat-log.js +50 -8
- package/dist/tui/theme/theme.js +10 -12
- package/dist/tui/tui-command-handlers.js +36 -27
- package/dist/tui/tui-event-handlers.js +122 -32
- package/dist/tui/tui-local-shell.js +16 -6
- package/dist/tui/tui.js +236 -48
- package/dist/utils/account-id.js +2 -4
- package/dist/utils/boolean.js +10 -5
- package/dist/utils/directive-tags.js +11 -0
- package/dist/utils/mask-api-key.js +10 -0
- package/dist/utils/queue-helpers.js +67 -12
- package/dist/utils/run-with-concurrency.js +39 -0
- package/dist/web/auto-reply/deliver-reply.js +8 -4
- package/dist/web/auto-reply/mentions.js +10 -5
- package/dist/web/auto-reply/monitor/group-members.js +14 -7
- package/dist/web/auto-reply/monitor/process-message.js +45 -24
- package/dist/web/inbound/access-control.js +5 -2
- package/dist/web/login-qr.js +12 -6
- package/dist/web/media.js +126 -15
- package/docs/tools/slash-commands.md +5 -1
- package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
- package/extensions/bluebubbles/src/monitor.ts +208 -1950
- package/extensions/feishu/src/external-keys.ts +19 -0
- package/extensions/lobster/src/windows-spawn.ts +193 -0
- package/extensions/matrix/src/matrix/actions/limits.ts +6 -0
- package/extensions/mattermost/src/mattermost/reactions.test-helpers.ts +83 -0
- package/package.json +1 -1
|
@@ -411,20 +411,24 @@ function scanTopLevelChars(command, visit) {
|
|
|
411
411
|
}
|
|
412
412
|
}
|
|
413
413
|
}
|
|
414
|
-
function
|
|
415
|
-
|
|
414
|
+
function splitTopLevelStages(command) {
|
|
415
|
+
const parts = [];
|
|
416
|
+
let start = 0;
|
|
416
417
|
scanTopLevelChars(command, (char, index) => {
|
|
417
418
|
if (char === ";") {
|
|
418
|
-
|
|
419
|
-
|
|
419
|
+
parts.push(command.slice(start, index));
|
|
420
|
+
start = index + 1;
|
|
421
|
+
return true;
|
|
420
422
|
}
|
|
421
423
|
if ((char === "&" || char === "|") && command[index + 1] === char) {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
+
parts.push(command.slice(start, index));
|
|
425
|
+
start = index + 2;
|
|
426
|
+
return true;
|
|
424
427
|
}
|
|
425
428
|
return true;
|
|
426
429
|
});
|
|
427
|
-
|
|
430
|
+
parts.push(command.slice(start));
|
|
431
|
+
return parts.map((part) => part.trim()).filter((part) => part.length > 0);
|
|
428
432
|
}
|
|
429
433
|
function splitTopLevelPipes(command) {
|
|
430
434
|
const parts = [];
|
|
@@ -439,31 +443,66 @@ function splitTopLevelPipes(command) {
|
|
|
439
443
|
parts.push(command.slice(start));
|
|
440
444
|
return parts.map((part) => part.trim()).filter((part) => part.length > 0);
|
|
441
445
|
}
|
|
446
|
+
function parseChdirTarget(head) {
|
|
447
|
+
const words = splitShellWords(head, 3);
|
|
448
|
+
const bin = binaryName(words[0]);
|
|
449
|
+
if (bin === "cd" || bin === "pushd") {
|
|
450
|
+
return words[1] || undefined;
|
|
451
|
+
}
|
|
452
|
+
return undefined;
|
|
453
|
+
}
|
|
454
|
+
function isChdirCommand(head) {
|
|
455
|
+
const bin = binaryName(splitShellWords(head, 2)[0]);
|
|
456
|
+
return bin === "cd" || bin === "pushd" || bin === "popd";
|
|
457
|
+
}
|
|
458
|
+
function isPopdCommand(head) {
|
|
459
|
+
return binaryName(splitShellWords(head, 2)[0]) === "popd";
|
|
460
|
+
}
|
|
442
461
|
function stripShellPreamble(command) {
|
|
443
462
|
let rest = command.trim();
|
|
463
|
+
let chdirPath;
|
|
444
464
|
for (let i = 0; i < 4; i += 1) {
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
465
|
+
// Find the first top-level separator (&&, ||, ;, \n) respecting quotes/escaping.
|
|
466
|
+
let first;
|
|
467
|
+
scanTopLevelChars(rest, (char, idx) => {
|
|
468
|
+
if (char === "&" && rest[idx + 1] === "&") {
|
|
469
|
+
first = { index: idx, length: 2 };
|
|
470
|
+
return false;
|
|
471
|
+
}
|
|
472
|
+
if (char === "|" && rest[idx + 1] === "|") {
|
|
473
|
+
first = { index: idx, length: 2, isOr: true };
|
|
474
|
+
return false;
|
|
475
|
+
}
|
|
476
|
+
if (char === ";" || char === "\n") {
|
|
477
|
+
first = { index: idx, length: 1 };
|
|
478
|
+
return false;
|
|
479
|
+
}
|
|
480
|
+
});
|
|
456
481
|
const head = (first ? rest.slice(0, first.index) : rest).trim();
|
|
457
|
-
|
|
482
|
+
// cd/pushd/popd is preamble when followed by && / ; / \n, or when we already
|
|
483
|
+
// stripped at least one preamble segment (handles chained cd's like `cd /tmp && cd /app`).
|
|
484
|
+
// NOT for || — `cd /app || npm install` means npm runs when cd *fails*, so (in /app) is wrong.
|
|
485
|
+
const isChdir = (first ? !first.isOr : i > 0) && isChdirCommand(head);
|
|
486
|
+
const isPreamble = head.startsWith("set ") || head.startsWith("export ") || head.startsWith("unset ") || isChdir;
|
|
458
487
|
if (!isPreamble) {
|
|
459
488
|
break;
|
|
460
489
|
}
|
|
490
|
+
if (isChdir) {
|
|
491
|
+
// popd returns to the previous directory, so inferred cwd from earlier
|
|
492
|
+
// preamble steps is no longer reliable.
|
|
493
|
+
if (isPopdCommand(head)) {
|
|
494
|
+
chdirPath = undefined;
|
|
495
|
+
}
|
|
496
|
+
else {
|
|
497
|
+
chdirPath = parseChdirTarget(head) ?? chdirPath;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
461
500
|
rest = first ? rest.slice(first.index + first.length).trimStart() : "";
|
|
462
501
|
if (!rest) {
|
|
463
502
|
break;
|
|
464
503
|
}
|
|
465
504
|
}
|
|
466
|
-
return rest.trim();
|
|
505
|
+
return { command: rest.trim(), chdirPath };
|
|
467
506
|
}
|
|
468
507
|
function summarizeKnownExec(words) {
|
|
469
508
|
if (words.length === 0) {
|
|
@@ -696,12 +735,7 @@ function summarizeKnownExec(words) {
|
|
|
696
735
|
}
|
|
697
736
|
return /^[A-Za-z0-9._/-]+$/.test(arg) ? `run ${bin} ${arg}` : `run ${bin}`;
|
|
698
737
|
}
|
|
699
|
-
function
|
|
700
|
-
const cleaned = stripShellPreamble(command);
|
|
701
|
-
const stage = firstTopLevelStage(cleaned).trim();
|
|
702
|
-
if (!stage) {
|
|
703
|
-
return cleaned ? summarizeKnownExec(trimLeadingEnv(splitShellWords(cleaned))) : undefined;
|
|
704
|
-
}
|
|
738
|
+
function summarizePipeline(stage) {
|
|
705
739
|
const pipeline = splitTopLevelPipes(stage);
|
|
706
740
|
if (pipeline.length > 1) {
|
|
707
741
|
const first = summarizeKnownExec(trimLeadingEnv(splitShellWords(pipeline[0])));
|
|
@@ -711,6 +745,92 @@ function summarizeExecCommand(command) {
|
|
|
711
745
|
}
|
|
712
746
|
return summarizeKnownExec(trimLeadingEnv(splitShellWords(stage)));
|
|
713
747
|
}
|
|
748
|
+
function summarizeExecCommand(command) {
|
|
749
|
+
const { command: cleaned, chdirPath } = stripShellPreamble(command);
|
|
750
|
+
if (!cleaned) {
|
|
751
|
+
// All segments were preamble (e.g. `cd /tmp && cd /app`) — preserve chdirPath for context.
|
|
752
|
+
return chdirPath ? { text: "", chdirPath } : undefined;
|
|
753
|
+
}
|
|
754
|
+
const stages = splitTopLevelStages(cleaned);
|
|
755
|
+
if (stages.length === 0) {
|
|
756
|
+
return undefined;
|
|
757
|
+
}
|
|
758
|
+
const summaries = stages.map((stage) => summarizePipeline(stage));
|
|
759
|
+
const text = summaries.length === 1 ? summaries[0] : summaries.join(" → ");
|
|
760
|
+
const allGeneric = summaries.every((s) => isGenericSummary(s));
|
|
761
|
+
return { text, chdirPath, allGeneric };
|
|
762
|
+
}
|
|
763
|
+
/** Known summarizer prefixes that indicate a recognized command with useful context. */
|
|
764
|
+
const KNOWN_SUMMARY_PREFIXES = [
|
|
765
|
+
"check git",
|
|
766
|
+
"view git",
|
|
767
|
+
"show git",
|
|
768
|
+
"list git",
|
|
769
|
+
"switch git",
|
|
770
|
+
"create git",
|
|
771
|
+
"pull git",
|
|
772
|
+
"push git",
|
|
773
|
+
"fetch git",
|
|
774
|
+
"merge git",
|
|
775
|
+
"rebase git",
|
|
776
|
+
"stage git",
|
|
777
|
+
"restore git",
|
|
778
|
+
"reset git",
|
|
779
|
+
"stash git",
|
|
780
|
+
"search ",
|
|
781
|
+
"find files",
|
|
782
|
+
"list files",
|
|
783
|
+
"show first",
|
|
784
|
+
"show last",
|
|
785
|
+
"print line",
|
|
786
|
+
"print text",
|
|
787
|
+
"copy ",
|
|
788
|
+
"move ",
|
|
789
|
+
"remove ",
|
|
790
|
+
"create folder",
|
|
791
|
+
"create file",
|
|
792
|
+
"fetch http",
|
|
793
|
+
"install dependencies",
|
|
794
|
+
"run tests",
|
|
795
|
+
"run build",
|
|
796
|
+
"start app",
|
|
797
|
+
"run lint",
|
|
798
|
+
"run poolbot",
|
|
799
|
+
"run node script",
|
|
800
|
+
"run node ",
|
|
801
|
+
"run python",
|
|
802
|
+
"run ruby",
|
|
803
|
+
"run php",
|
|
804
|
+
"run sed",
|
|
805
|
+
"run git ",
|
|
806
|
+
"run npm ",
|
|
807
|
+
"run pnpm ",
|
|
808
|
+
"run yarn ",
|
|
809
|
+
"run bun ",
|
|
810
|
+
"check js syntax",
|
|
811
|
+
];
|
|
812
|
+
/** True when the summary is generic and the raw command would be more informative. */
|
|
813
|
+
function isGenericSummary(summary) {
|
|
814
|
+
if (summary === "run command") {
|
|
815
|
+
return true;
|
|
816
|
+
}
|
|
817
|
+
// "run <binary>" or "run <binary> <arg>" without useful context
|
|
818
|
+
if (summary.startsWith("run ")) {
|
|
819
|
+
return !KNOWN_SUMMARY_PREFIXES.some((prefix) => summary.startsWith(prefix));
|
|
820
|
+
}
|
|
821
|
+
return false;
|
|
822
|
+
}
|
|
823
|
+
/** Compact the raw command for display: collapse whitespace, trim long strings. */
|
|
824
|
+
function compactRawCommand(raw, maxLength = 120) {
|
|
825
|
+
const oneLine = raw
|
|
826
|
+
.replace(/\s*\n\s*/g, " ")
|
|
827
|
+
.replace(/\s{2,}/g, " ")
|
|
828
|
+
.trim();
|
|
829
|
+
if (oneLine.length <= maxLength) {
|
|
830
|
+
return oneLine;
|
|
831
|
+
}
|
|
832
|
+
return `${oneLine.slice(0, Math.max(0, maxLength - 1))}…`;
|
|
833
|
+
}
|
|
714
834
|
export function resolveExecDetail(args) {
|
|
715
835
|
const record = asRecord(args);
|
|
716
836
|
if (!record) {
|
|
@@ -721,14 +841,27 @@ export function resolveExecDetail(args) {
|
|
|
721
841
|
return undefined;
|
|
722
842
|
}
|
|
723
843
|
const unwrapped = unwrapShellWrapper(raw);
|
|
724
|
-
const
|
|
844
|
+
const result = summarizeExecCommand(unwrapped) ?? summarizeExecCommand(raw);
|
|
845
|
+
const summary = result?.text || "run command";
|
|
725
846
|
const cwdRaw = typeof record.workdir === "string"
|
|
726
847
|
? record.workdir
|
|
727
848
|
: typeof record.cwd === "string"
|
|
728
849
|
? record.cwd
|
|
729
850
|
: undefined;
|
|
730
|
-
|
|
731
|
-
|
|
851
|
+
// Explicit workdir takes priority; fall back to cd path extracted from the command.
|
|
852
|
+
const cwd = cwdRaw?.trim() || result?.chdirPath || undefined;
|
|
853
|
+
const compact = compactRawCommand(unwrapped);
|
|
854
|
+
// When ALL stages are generic (e.g. "run jj"), use the compact raw command instead.
|
|
855
|
+
// For mixed stages like "run cargo build → run tests", keep the summary since some parts are useful.
|
|
856
|
+
if (result?.allGeneric !== false && isGenericSummary(summary)) {
|
|
857
|
+
return cwd ? `${compact} (in ${cwd})` : compact;
|
|
858
|
+
}
|
|
859
|
+
const displaySummary = cwd ? `${summary} (in ${cwd})` : summary;
|
|
860
|
+
// Append the raw command when the summary differs meaningfully from the command itself.
|
|
861
|
+
if (compact && compact !== displaySummary && compact !== summary) {
|
|
862
|
+
return `${displaySummary}\n\n\`${compact}\``;
|
|
863
|
+
}
|
|
864
|
+
return displaySummary;
|
|
732
865
|
}
|
|
733
866
|
export function resolveActionSpec(spec, action) {
|
|
734
867
|
if (!spec || !action) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { createSubsystemLogger } from "../logging/subsystem.js";
|
|
2
|
-
import { getImageMetadata, resizeToJpeg } from "../media/image-ops.js";
|
|
2
|
+
import { buildImageResizeSideGrid, getImageMetadata, IMAGE_REDUCE_QUALITY_STEPS, resizeToJpeg, } from "../media/image-ops.js";
|
|
3
3
|
import { DEFAULT_IMAGE_MAX_BYTES, DEFAULT_IMAGE_MAX_DIMENSION_PX, } from "./image-sanitization.js";
|
|
4
4
|
// Anthropic Messages API limitations (observed in Pool Bot sessions):
|
|
5
5
|
// - Images over ~2000px per side can fail in multi-image requests.
|
|
@@ -49,6 +49,68 @@ function formatBytesShort(bytes) {
|
|
|
49
49
|
}
|
|
50
50
|
return `${(bytes / (1024 * 1024)).toFixed(2)}MB`;
|
|
51
51
|
}
|
|
52
|
+
function parseMediaPathFromText(text) {
|
|
53
|
+
for (const line of text.split(/\r?\n/u)) {
|
|
54
|
+
const trimmed = line.trim();
|
|
55
|
+
if (!trimmed.startsWith("MEDIA:")) {
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
const raw = trimmed.slice("MEDIA:".length).trim();
|
|
59
|
+
if (!raw) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
const backtickWrapped = raw.match(/^`([^`]+)`$/u);
|
|
63
|
+
return (backtickWrapped?.[1] ?? raw).trim();
|
|
64
|
+
}
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
function fileNameFromPathLike(pathLike) {
|
|
68
|
+
const value = pathLike.trim();
|
|
69
|
+
if (!value) {
|
|
70
|
+
return undefined;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const url = new URL(value);
|
|
74
|
+
const candidate = url.pathname.split("/").filter(Boolean).at(-1);
|
|
75
|
+
return candidate && candidate.length > 0 ? candidate : undefined;
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Not a URL; continue with path-like parsing.
|
|
79
|
+
}
|
|
80
|
+
const normalized = value.replaceAll("\\", "/");
|
|
81
|
+
const candidate = normalized.split("/").filter(Boolean).at(-1);
|
|
82
|
+
return candidate && candidate.length > 0 ? candidate : undefined;
|
|
83
|
+
}
|
|
84
|
+
function inferImageFileName(params) {
|
|
85
|
+
const rec = params.block;
|
|
86
|
+
const explicitKeys = ["fileName", "filename", "path", "url"];
|
|
87
|
+
for (const key of explicitKeys) {
|
|
88
|
+
const raw = rec[key];
|
|
89
|
+
if (typeof raw !== "string" || raw.trim().length === 0) {
|
|
90
|
+
continue;
|
|
91
|
+
}
|
|
92
|
+
const candidate = fileNameFromPathLike(raw);
|
|
93
|
+
if (candidate) {
|
|
94
|
+
return candidate;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
if (typeof rec.name === "string" && rec.name.trim().length > 0) {
|
|
98
|
+
return rec.name.trim();
|
|
99
|
+
}
|
|
100
|
+
if (params.mediaPathHint) {
|
|
101
|
+
const candidate = fileNameFromPathLike(params.mediaPathHint);
|
|
102
|
+
if (candidate) {
|
|
103
|
+
return candidate;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
if (typeof params.label === "string" && params.label.startsWith("read:")) {
|
|
107
|
+
const candidate = fileNameFromPathLike(params.label.slice("read:".length));
|
|
108
|
+
if (candidate) {
|
|
109
|
+
return candidate;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return undefined;
|
|
113
|
+
}
|
|
52
114
|
async function resizeImageBase64IfNeeded(params) {
|
|
53
115
|
const buf = Buffer.from(params.base64, "base64");
|
|
54
116
|
const meta = await getImageMetadata(buf);
|
|
@@ -69,16 +131,12 @@ async function resizeImageBase64IfNeeded(params) {
|
|
|
69
131
|
height,
|
|
70
132
|
};
|
|
71
133
|
}
|
|
72
|
-
const qualities = [85, 75, 65, 55, 45, 35];
|
|
73
134
|
const maxDim = hasDimensions ? Math.max(width ?? 0, height ?? 0) : params.maxDimensionPx;
|
|
74
135
|
const sideStart = maxDim > 0 ? Math.min(params.maxDimensionPx, maxDim) : params.maxDimensionPx;
|
|
75
|
-
const sideGrid =
|
|
76
|
-
.filter((v) => v > 0 && v <= params.maxDimensionPx)
|
|
77
|
-
.filter((v, i, arr) => v > 0 && arr.indexOf(v) === i)
|
|
78
|
-
.toSorted((a, b) => b - a);
|
|
136
|
+
const sideGrid = buildImageResizeSideGrid(params.maxDimensionPx, sideStart);
|
|
79
137
|
let smallest = null;
|
|
80
138
|
for (const side of sideGrid) {
|
|
81
|
-
for (const quality of
|
|
139
|
+
for (const quality of IMAGE_REDUCE_QUALITY_STEPS) {
|
|
82
140
|
const out = await resizeToJpeg({
|
|
83
141
|
buffer: buf,
|
|
84
142
|
maxSide: side,
|
|
@@ -92,11 +150,15 @@ async function resizeImageBase64IfNeeded(params) {
|
|
|
92
150
|
const sourcePixels = typeof width === "number" && typeof height === "number"
|
|
93
151
|
? `${width}x${height}px`
|
|
94
152
|
: "unknown";
|
|
153
|
+
const sourceWithFile = params.fileName
|
|
154
|
+
? `${params.fileName} ${sourcePixels}`
|
|
155
|
+
: sourcePixels;
|
|
95
156
|
const byteReductionPct = buf.byteLength > 0
|
|
96
157
|
? Number((((buf.byteLength - out.byteLength) / buf.byteLength) * 100).toFixed(1))
|
|
97
158
|
: 0;
|
|
98
|
-
log.info(`Image resized to fit limits: ${
|
|
159
|
+
log.info(`Image resized to fit limits: ${sourceWithFile} ${formatBytesShort(buf.byteLength)} -> ${formatBytesShort(out.byteLength)} (-${byteReductionPct}%)`, {
|
|
99
160
|
label: params.label,
|
|
161
|
+
fileName: params.fileName,
|
|
100
162
|
sourceMimeType: params.mimeType,
|
|
101
163
|
sourceWidth: width,
|
|
102
164
|
sourceHeight: height,
|
|
@@ -125,8 +187,10 @@ async function resizeImageBase64IfNeeded(params) {
|
|
|
125
187
|
const maxMb = (params.maxBytes / (1024 * 1024)).toFixed(0);
|
|
126
188
|
const gotMb = (best.byteLength / (1024 * 1024)).toFixed(2);
|
|
127
189
|
const sourcePixels = typeof width === "number" && typeof height === "number" ? `${width}x${height}px` : "unknown";
|
|
128
|
-
|
|
190
|
+
const sourceWithFile = params.fileName ? `${params.fileName} ${sourcePixels}` : sourcePixels;
|
|
191
|
+
log.warn(`Image resize failed to fit limits: ${sourceWithFile} best=${formatBytesShort(best.byteLength)} limit=${formatBytesShort(params.maxBytes)}`, {
|
|
129
192
|
label: params.label,
|
|
193
|
+
fileName: params.fileName,
|
|
130
194
|
sourceMimeType: params.mimeType,
|
|
131
195
|
sourceWidth: width,
|
|
132
196
|
sourceHeight: height,
|
|
@@ -143,7 +207,14 @@ export async function sanitizeContentBlocksImages(blocks, label, opts = {}) {
|
|
|
143
207
|
const maxDimensionPx = Math.max(opts.maxDimensionPx ?? MAX_IMAGE_DIMENSION_PX, 1);
|
|
144
208
|
const maxBytes = Math.max(opts.maxBytes ?? MAX_IMAGE_BYTES, 1);
|
|
145
209
|
const out = [];
|
|
210
|
+
let mediaPathHint;
|
|
146
211
|
for (const block of blocks) {
|
|
212
|
+
if (isTextBlock(block)) {
|
|
213
|
+
const mediaPath = parseMediaPathFromText(block.text);
|
|
214
|
+
if (mediaPath) {
|
|
215
|
+
mediaPathHint = mediaPath;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
147
218
|
if (!isImageBlock(block)) {
|
|
148
219
|
out.push(block);
|
|
149
220
|
continue;
|
|
@@ -159,12 +230,14 @@ export async function sanitizeContentBlocksImages(blocks, label, opts = {}) {
|
|
|
159
230
|
try {
|
|
160
231
|
const inferredMimeType = inferMimeTypeFromBase64(data);
|
|
161
232
|
const mimeType = inferredMimeType ?? block.mimeType;
|
|
233
|
+
const fileName = inferImageFileName({ block, label, mediaPathHint });
|
|
162
234
|
const resized = await resizeImageBase64IfNeeded({
|
|
163
235
|
base64: data,
|
|
164
236
|
mimeType,
|
|
165
237
|
maxDimensionPx,
|
|
166
238
|
maxBytes,
|
|
167
239
|
label,
|
|
240
|
+
fileName,
|
|
168
241
|
});
|
|
169
242
|
out.push({
|
|
170
243
|
...block,
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
const TOOL_NAME_ALIASES = {
|
|
2
|
+
bash: "exec",
|
|
3
|
+
"apply-patch": "apply_patch",
|
|
4
|
+
};
|
|
5
|
+
export const TOOL_GROUPS = {
|
|
6
|
+
// NOTE: Keep canonical (lowercase) tool names here.
|
|
7
|
+
"group:memory": ["memory_search", "memory_get"],
|
|
8
|
+
"group:web": ["web_search", "web_fetch"],
|
|
9
|
+
// Basic workspace/file tools
|
|
10
|
+
"group:fs": ["read", "write", "edit", "apply_patch"],
|
|
11
|
+
// Host/runtime execution tools
|
|
12
|
+
"group:runtime": ["exec", "process"],
|
|
13
|
+
// Session management tools
|
|
14
|
+
"group:sessions": [
|
|
15
|
+
"sessions_list",
|
|
16
|
+
"sessions_history",
|
|
17
|
+
"sessions_send",
|
|
18
|
+
"sessions_spawn",
|
|
19
|
+
"subagents",
|
|
20
|
+
"session_status",
|
|
21
|
+
],
|
|
22
|
+
// UI helpers
|
|
23
|
+
"group:ui": ["browser", "canvas"],
|
|
24
|
+
// Automation + infra
|
|
25
|
+
"group:automation": ["cron", "gateway"],
|
|
26
|
+
// Messaging surface
|
|
27
|
+
"group:messaging": ["message"],
|
|
28
|
+
// Nodes + device tools
|
|
29
|
+
"group:nodes": ["nodes"],
|
|
30
|
+
// All Pool Bot native tools (excludes provider plugins).
|
|
31
|
+
"group:poolbot": [
|
|
32
|
+
"browser",
|
|
33
|
+
"canvas",
|
|
34
|
+
"nodes",
|
|
35
|
+
"cron",
|
|
36
|
+
"message",
|
|
37
|
+
"gateway",
|
|
38
|
+
"agents_list",
|
|
39
|
+
"sessions_list",
|
|
40
|
+
"sessions_history",
|
|
41
|
+
"sessions_send",
|
|
42
|
+
"sessions_spawn",
|
|
43
|
+
"subagents",
|
|
44
|
+
"session_status",
|
|
45
|
+
"memory_search",
|
|
46
|
+
"memory_get",
|
|
47
|
+
"web_search",
|
|
48
|
+
"web_fetch",
|
|
49
|
+
"image",
|
|
50
|
+
],
|
|
51
|
+
};
|
|
52
|
+
const TOOL_PROFILES = {
|
|
53
|
+
minimal: {
|
|
54
|
+
allow: ["session_status"],
|
|
55
|
+
},
|
|
56
|
+
coding: {
|
|
57
|
+
allow: ["group:fs", "group:runtime", "group:sessions", "group:memory", "image"],
|
|
58
|
+
},
|
|
59
|
+
messaging: {
|
|
60
|
+
allow: [
|
|
61
|
+
"group:messaging",
|
|
62
|
+
"sessions_list",
|
|
63
|
+
"sessions_history",
|
|
64
|
+
"sessions_send",
|
|
65
|
+
"session_status",
|
|
66
|
+
],
|
|
67
|
+
},
|
|
68
|
+
full: {},
|
|
69
|
+
};
|
|
70
|
+
export function normalizeToolName(name) {
|
|
71
|
+
const normalized = name.trim().toLowerCase();
|
|
72
|
+
return TOOL_NAME_ALIASES[normalized] ?? normalized;
|
|
73
|
+
}
|
|
74
|
+
export function normalizeToolList(list) {
|
|
75
|
+
if (!list) {
|
|
76
|
+
return [];
|
|
77
|
+
}
|
|
78
|
+
return list.map(normalizeToolName).filter(Boolean);
|
|
79
|
+
}
|
|
80
|
+
export function expandToolGroups(list) {
|
|
81
|
+
const normalized = normalizeToolList(list);
|
|
82
|
+
const expanded = [];
|
|
83
|
+
for (const value of normalized) {
|
|
84
|
+
const group = TOOL_GROUPS[value];
|
|
85
|
+
if (group) {
|
|
86
|
+
expanded.push(...group);
|
|
87
|
+
continue;
|
|
88
|
+
}
|
|
89
|
+
expanded.push(value);
|
|
90
|
+
}
|
|
91
|
+
return Array.from(new Set(expanded));
|
|
92
|
+
}
|
|
93
|
+
export function resolveToolProfilePolicy(profile) {
|
|
94
|
+
if (!profile) {
|
|
95
|
+
return undefined;
|
|
96
|
+
}
|
|
97
|
+
const resolved = TOOL_PROFILES[profile];
|
|
98
|
+
if (!resolved) {
|
|
99
|
+
return undefined;
|
|
100
|
+
}
|
|
101
|
+
if (!resolved.allow && !resolved.deny) {
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
return {
|
|
105
|
+
allow: resolved.allow ? [...resolved.allow] : undefined,
|
|
106
|
+
deny: resolved.deny ? [...resolved.deny] : undefined,
|
|
107
|
+
};
|
|
108
|
+
}
|