@poolzin/pool-bot 2026.2.25 → 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/dist/acp/event-mapper.js +87 -22
- package/dist/acp/meta.js +12 -6
- package/dist/agents/agent-paths.js +8 -9
- package/dist/agents/agent-scope.js +7 -5
- package/dist/agents/auth-profiles/oauth.js +148 -64
- package/dist/agents/auth-profiles/session-override.js +13 -7
- package/dist/agents/bash-tools.exec-host-gateway.js +14 -4
- package/dist/agents/bash-tools.exec-runtime.js +2 -25
- 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/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-selection.js +7 -1
- package/dist/agents/models-config.providers.js +93 -11
- 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-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.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/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.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/fast-coding-tools.js +1 -18
- package/dist/agents/test-helpers/fast-core-tools.js +1 -17
- 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.js +51 -26
- package/dist/agents/tools/browser-tool.js +2 -2
- package/dist/agents/tools/canvas-tool.js +27 -1
- package/dist/agents/tools/common.js +45 -0
- package/dist/agents/tools/discord-actions-guild.js +4 -1
- package/dist/agents/tools/gateway-tool.js +3 -1
- package/dist/agents/tools/nodes-utils.js +1 -10
- 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/auto-reply/commands-registry.data.js +51 -0
- package/dist/auto-reply/commands-registry.js +4 -3
- package/dist/auto-reply/group-activation.js +10 -5
- package/dist/auto-reply/inbound-debounce.js +10 -5
- package/dist/auto-reply/reply/abort.js +1 -1
- package/dist/auto-reply/reply/agent-runner-execution.js +4 -1
- 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.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 +4 -0
- package/dist/browser/extension-relay-auth.js +55 -0
- package/dist/browser/extension-relay.js +74 -29
- package/dist/browser/navigation-guard.js +9 -1
- 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 +2 -2
- package/dist/browser/server-context.js +7 -0
- package/dist/build-info.json +3 -3
- package/dist/channels/allow-from.js +2 -1
- 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/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/cli/banner.js +1 -1
- 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/gateway-cli/run-loop.js +23 -5
- package/dist/cli/node-cli/register.js +14 -5
- package/dist/cli/nodes-media-utils.js +7 -2
- 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 +34 -41
- package/dist/cli/ports.js +11 -10
- package/dist/cli/program/command-registry.js +2 -11
- package/dist/cli/program/command-tree.js +16 -0
- 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 +11 -7
- package/dist/cli/system-cli.js +36 -46
- 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 +22 -2
- 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/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/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/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 +30 -16
- package/dist/config/config-paths.js +9 -11
- package/dist/config/defaults.js +22 -2
- package/dist/config/discord-preview-streaming.js +104 -0
- package/dist/config/env-vars.js +37 -8
- package/dist/config/includes.js +4 -0
- package/dist/config/io.js +97 -12
- package/dist/config/legacy.migrations.part-1.js +189 -78
- package/dist/config/legacy.shared.js +3 -1
- package/dist/config/merge-patch.js +4 -0
- package/dist/config/prototype-keys.js +4 -0
- package/dist/config/schema.help.js +44 -7
- 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/zod-schema.agent-runtime.js +11 -0
- package/dist/config/zod-schema.js +148 -13
- 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/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/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 +34 -10
- package/dist/gateway/call.js +4 -16
- package/dist/gateway/client.js +28 -4
- package/dist/gateway/config-reload.js +3 -4
- package/dist/gateway/control-ui.js +219 -96
- package/dist/gateway/hooks-mapping.js +88 -38
- package/dist/gateway/http-auth-helpers.js +3 -2
- package/dist/gateway/http-endpoint-helpers.js +1 -0
- package/dist/gateway/net.js +54 -12
- 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 +1 -0
- package/dist/gateway/origin-check.js +1 -18
- package/dist/gateway/protocol/index.js +4 -3
- 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 +2 -1
- package/dist/gateway/protocol/schema/sessions.js +6 -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 +16 -7
- package/dist/gateway/server-maintenance.js +20 -5
- package/dist/gateway/server-methods/chat.js +10 -6
- package/dist/gateway/server-methods/config.js +12 -14
- package/dist/gateway/server-methods/devices.js +17 -3
- package/dist/gateway/server-methods/models.js +11 -1
- 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-runtime-config.js +34 -13
- package/dist/gateway/server-startup-memory.js +17 -11
- package/dist/gateway/session-utils.fs.js +32 -34
- package/dist/gateway/sessions-resolve.js +17 -5
- package/dist/gateway/test-helpers.openai-mock.js +14 -7
- 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 +6 -5
- package/dist/hooks/frontmatter.js +6 -6
- 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.js +174 -73
- package/dist/infra/control-ui-assets.js +14 -6
- package/dist/infra/device-pairing.js +108 -29
- package/dist/infra/env.js +10 -5
- package/dist/infra/exec-approvals-allowlist.js +122 -0
- package/dist/infra/exec-approvals-analysis.js +34 -3
- package/dist/infra/exec-approvals.js +5 -17
- package/dist/infra/exec-safe-bin-policy.js +53 -45
- package/dist/infra/fs-safe.js +71 -39
- package/dist/infra/gateway-lock.js +6 -2
- 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/net/ssrf.js +131 -38
- package/dist/infra/outbound/bound-delivery-router.js +88 -0
- 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/payloads.js +14 -7
- package/dist/infra/outbound/session-binding-service.js +123 -0
- package/dist/infra/path-guards.js +25 -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/retry-policy.js +4 -2
- package/dist/infra/retry.js +9 -5
- 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/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/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/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/webhook-targets.js +32 -0
- package/dist/plugins/bundled-dir.js +9 -6
- package/dist/plugins/hooks.js +50 -0
- package/dist/plugins/install.js +28 -16
- 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-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 +93 -2
- package/dist/security/audit-extra.async.js +159 -5
- package/dist/security/audit-extra.js +1 -1
- package/dist/security/audit-extra.sync.js +85 -6
- package/dist/security/audit.js +40 -4
- package/dist/security/dm-policy-shared.js +44 -0
- package/dist/security/external-content.js +26 -6
- package/dist/shared/entry-status.js +6 -0
- package/dist/shared/frontmatter.js +5 -5
- package/dist/shared/node-match.js +11 -4
- package/dist/shared/operator-scope-compat.js +8 -3
- 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/monitor/auth.js +1 -1
- package/dist/slack/monitor/message-handler/dispatch.js +50 -29
- 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 +155 -90
- package/dist/telegram/bot-native-commands.js +16 -0
- package/dist/telegram/draft-stream.js +14 -1
- 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/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/theme.js +12 -12
- package/dist/tts/tts.js +80 -567
- package/dist/tui/components/chat-log.js +41 -8
- package/dist/tui/theme/theme.js +10 -12
- package/dist/tui/tui-local-shell.js +16 -6
- package/dist/tui/tui.js +58 -6
- 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/queue-helpers.js +67 -12
- 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 +123 -16
- package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
- package/extensions/bluebubbles/src/monitor.ts +208 -1950
- package/package.json +1 -1
|
@@ -2,6 +2,8 @@ import { getChannelPlugin, normalizeChannelId } from "../channels/plugins/index.
|
|
|
2
2
|
import { normalizeTargetForProvider } from "../infra/outbound/target-normalization.js";
|
|
3
3
|
import { MEDIA_TOKEN_RE } from "../media/parse.js";
|
|
4
4
|
import { truncateUtf16Safe } from "../utils.js";
|
|
5
|
+
import { collectTextContentBlocks } from "./content-blocks.js";
|
|
6
|
+
import { normalizeToolName } from "./tool-policy.js";
|
|
5
7
|
const TOOL_RESULT_MAX_CHARS = 8000;
|
|
6
8
|
const TOOL_ERROR_MAX_CHARS = 400;
|
|
7
9
|
function truncateToolText(text) {
|
|
@@ -23,6 +25,20 @@ function normalizeToolErrorText(text) {
|
|
|
23
25
|
? `${truncateUtf16Safe(firstLine, TOOL_ERROR_MAX_CHARS)}…`
|
|
24
26
|
: firstLine;
|
|
25
27
|
}
|
|
28
|
+
function isErrorLikeStatus(status) {
|
|
29
|
+
const normalized = status.trim().toLowerCase();
|
|
30
|
+
if (!normalized) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
if (normalized === "0" ||
|
|
34
|
+
normalized === "ok" ||
|
|
35
|
+
normalized === "success" ||
|
|
36
|
+
normalized === "completed" ||
|
|
37
|
+
normalized === "running") {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
return /error|fail|timeout|timed[_\s-]?out|denied|cancel|invalid|forbidden/.test(normalized);
|
|
41
|
+
}
|
|
26
42
|
function readErrorCandidate(value) {
|
|
27
43
|
if (typeof value === "string") {
|
|
28
44
|
return normalizeToolErrorText(value);
|
|
@@ -51,7 +67,10 @@ function extractErrorField(value) {
|
|
|
51
67
|
return direct;
|
|
52
68
|
}
|
|
53
69
|
const status = typeof record.status === "string" ? record.status.trim() : "";
|
|
54
|
-
|
|
70
|
+
if (!status || !isErrorLikeStatus(status)) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
return normalizeToolErrorText(status);
|
|
55
74
|
}
|
|
56
75
|
export function sanitizeToolResult(result) {
|
|
57
76
|
if (!result || typeof result !== "object") {
|
|
@@ -87,20 +106,9 @@ export function extractToolResultText(result) {
|
|
|
87
106
|
return undefined;
|
|
88
107
|
}
|
|
89
108
|
const record = result;
|
|
90
|
-
const
|
|
91
|
-
if (!content) {
|
|
92
|
-
return undefined;
|
|
93
|
-
}
|
|
94
|
-
const texts = content
|
|
109
|
+
const texts = collectTextContentBlocks(record.content)
|
|
95
110
|
.map((item) => {
|
|
96
|
-
|
|
97
|
-
return undefined;
|
|
98
|
-
}
|
|
99
|
-
const entry = item;
|
|
100
|
-
if (entry.type !== "text" || typeof entry.text !== "string") {
|
|
101
|
-
return undefined;
|
|
102
|
-
}
|
|
103
|
-
const trimmed = entry.text.trim();
|
|
111
|
+
const trimmed = item.trim();
|
|
104
112
|
return trimmed ? trimmed : undefined;
|
|
105
113
|
})
|
|
106
114
|
.filter((value) => Boolean(value));
|
|
@@ -109,6 +117,52 @@ export function extractToolResultText(result) {
|
|
|
109
117
|
}
|
|
110
118
|
return texts.join("\n");
|
|
111
119
|
}
|
|
120
|
+
// Core tool names that are allowed to emit local MEDIA: paths.
|
|
121
|
+
// Plugin/MCP tools are intentionally excluded to prevent untrusted file reads.
|
|
122
|
+
const TRUSTED_TOOL_RESULT_MEDIA = new Set([
|
|
123
|
+
"agents_list",
|
|
124
|
+
"apply_patch",
|
|
125
|
+
"browser",
|
|
126
|
+
"canvas",
|
|
127
|
+
"cron",
|
|
128
|
+
"edit",
|
|
129
|
+
"exec",
|
|
130
|
+
"gateway",
|
|
131
|
+
"image",
|
|
132
|
+
"memory_get",
|
|
133
|
+
"memory_search",
|
|
134
|
+
"message",
|
|
135
|
+
"nodes",
|
|
136
|
+
"process",
|
|
137
|
+
"read",
|
|
138
|
+
"session_status",
|
|
139
|
+
"sessions_history",
|
|
140
|
+
"sessions_list",
|
|
141
|
+
"sessions_send",
|
|
142
|
+
"sessions_spawn",
|
|
143
|
+
"subagents",
|
|
144
|
+
"tts",
|
|
145
|
+
"web_fetch",
|
|
146
|
+
"web_search",
|
|
147
|
+
"write",
|
|
148
|
+
]);
|
|
149
|
+
const HTTP_URL_RE = /^https?:\/\//i;
|
|
150
|
+
export function isToolResultMediaTrusted(toolName) {
|
|
151
|
+
if (!toolName) {
|
|
152
|
+
return false;
|
|
153
|
+
}
|
|
154
|
+
const normalized = normalizeToolName(toolName);
|
|
155
|
+
return TRUSTED_TOOL_RESULT_MEDIA.has(normalized);
|
|
156
|
+
}
|
|
157
|
+
export function filterToolResultMediaUrls(toolName, mediaUrls) {
|
|
158
|
+
if (mediaUrls.length === 0) {
|
|
159
|
+
return mediaUrls;
|
|
160
|
+
}
|
|
161
|
+
if (isToolResultMediaTrusted(toolName)) {
|
|
162
|
+
return mediaUrls;
|
|
163
|
+
}
|
|
164
|
+
return mediaUrls.filter((url) => HTTP_URL_RE.test(url.trim()));
|
|
165
|
+
}
|
|
112
166
|
/**
|
|
113
167
|
* Extract media file paths from a tool result.
|
|
114
168
|
*
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { stripReasoningTagsFromText } from "../shared/text/reasoning-tags.js";
|
|
2
2
|
import { sanitizeUserFacingText } from "./pi-embedded-helpers.js";
|
|
3
3
|
import { formatToolDetail, resolveToolDisplay } from "./tool-display.js";
|
|
4
|
+
export function isAssistantMessage(msg) {
|
|
5
|
+
return msg?.role === "assistant";
|
|
6
|
+
}
|
|
4
7
|
/**
|
|
5
8
|
* Strip malformed Minimax tool invocations that leak into text content.
|
|
6
9
|
* Minimax sometimes embeds tool calls as XML in text blocks instead of
|
|
@@ -1,20 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const
|
|
4
|
-
export
|
|
5
|
-
if (!sessionManager || typeof sessionManager !== "object") {
|
|
6
|
-
return;
|
|
7
|
-
}
|
|
8
|
-
const key = sessionManager;
|
|
9
|
-
if (value === null) {
|
|
10
|
-
REGISTRY.delete(key);
|
|
11
|
-
return;
|
|
12
|
-
}
|
|
13
|
-
REGISTRY.set(key, value);
|
|
14
|
-
}
|
|
15
|
-
export function getCompactionSafeguardRuntime(sessionManager) {
|
|
16
|
-
if (!sessionManager || typeof sessionManager !== "object") {
|
|
17
|
-
return null;
|
|
18
|
-
}
|
|
19
|
-
return REGISTRY.get(sessionManager) ?? null;
|
|
20
|
-
}
|
|
1
|
+
import { createSessionManagerRuntimeRegistry } from "./session-manager-runtime-registry.js";
|
|
2
|
+
const registry = createSessionManagerRuntimeRegistry();
|
|
3
|
+
export const setCompactionSafeguardRuntime = registry.set;
|
|
4
|
+
export const getCompactionSafeguardRuntime = registry.get;
|
|
@@ -1,5 +1,11 @@
|
|
|
1
|
-
import
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
import { extractSections } from "../../auto-reply/reply/post-compaction-context.js";
|
|
4
|
+
import { createSubsystemLogger } from "../../logging/subsystem.js";
|
|
5
|
+
import { BASE_CHUNK_RATIO, MIN_CHUNK_RATIO, SAFETY_MARGIN, SUMMARIZATION_OVERHEAD_TOKENS, computeAdaptiveChunkRatio, estimateMessagesTokens, isOversizedForSummary, pruneHistoryForContextShare, resolveContextWindowTokens, summarizeInStages, } from "../compaction.js";
|
|
6
|
+
import { collectTextContentBlocks } from "../content-blocks.js";
|
|
2
7
|
import { getCompactionSafeguardRuntime } from "./compaction-safeguard-runtime.js";
|
|
8
|
+
const log = createSubsystemLogger("compaction-safeguard");
|
|
3
9
|
const FALLBACK_SUMMARY = "Summary unavailable due to context limits. Older messages were truncated.";
|
|
4
10
|
const TURN_PREFIX_INSTRUCTIONS = "This summary covers the prefix of a split turn. Focus on the original request," +
|
|
5
11
|
" early progress, and any details needed to understand the retained suffix.";
|
|
@@ -9,54 +15,51 @@ function normalizeFailureText(text) {
|
|
|
9
15
|
return text.replace(/\s+/g, " ").trim();
|
|
10
16
|
}
|
|
11
17
|
function truncateFailureText(text, maxChars) {
|
|
12
|
-
if (text.length <= maxChars)
|
|
18
|
+
if (text.length <= maxChars) {
|
|
13
19
|
return text;
|
|
20
|
+
}
|
|
14
21
|
return `${text.slice(0, Math.max(0, maxChars - 3))}...`;
|
|
15
22
|
}
|
|
16
23
|
function formatToolFailureMeta(details) {
|
|
17
|
-
if (!details || typeof details !== "object")
|
|
24
|
+
if (!details || typeof details !== "object") {
|
|
18
25
|
return undefined;
|
|
26
|
+
}
|
|
19
27
|
const record = details;
|
|
20
28
|
const status = typeof record.status === "string" ? record.status : undefined;
|
|
21
29
|
const exitCode = typeof record.exitCode === "number" && Number.isFinite(record.exitCode)
|
|
22
30
|
? record.exitCode
|
|
23
31
|
: undefined;
|
|
24
32
|
const parts = [];
|
|
25
|
-
if (status)
|
|
33
|
+
if (status) {
|
|
26
34
|
parts.push(`status=${status}`);
|
|
27
|
-
|
|
35
|
+
}
|
|
36
|
+
if (exitCode !== undefined) {
|
|
28
37
|
parts.push(`exitCode=${exitCode}`);
|
|
38
|
+
}
|
|
29
39
|
return parts.length > 0 ? parts.join(" ") : undefined;
|
|
30
40
|
}
|
|
31
41
|
function extractToolResultText(content) {
|
|
32
|
-
|
|
33
|
-
return "";
|
|
34
|
-
const parts = [];
|
|
35
|
-
for (const block of content) {
|
|
36
|
-
if (!block || typeof block !== "object")
|
|
37
|
-
continue;
|
|
38
|
-
const rec = block;
|
|
39
|
-
if (rec.type === "text" && typeof rec.text === "string") {
|
|
40
|
-
parts.push(rec.text);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
return parts.join("\n");
|
|
42
|
+
return collectTextContentBlocks(content).join("\n");
|
|
44
43
|
}
|
|
45
44
|
function collectToolFailures(messages) {
|
|
46
45
|
const failures = [];
|
|
47
46
|
const seen = new Set();
|
|
48
47
|
for (const message of messages) {
|
|
49
|
-
if (!message || typeof message !== "object")
|
|
48
|
+
if (!message || typeof message !== "object") {
|
|
50
49
|
continue;
|
|
50
|
+
}
|
|
51
51
|
const role = message.role;
|
|
52
|
-
if (role !== "toolResult")
|
|
52
|
+
if (role !== "toolResult") {
|
|
53
53
|
continue;
|
|
54
|
+
}
|
|
54
55
|
const toolResult = message;
|
|
55
|
-
if (toolResult.isError !== true)
|
|
56
|
+
if (toolResult.isError !== true) {
|
|
56
57
|
continue;
|
|
58
|
+
}
|
|
57
59
|
const toolCallId = typeof toolResult.toolCallId === "string" ? toolResult.toolCallId : "";
|
|
58
|
-
if (!toolCallId || seen.has(toolCallId))
|
|
60
|
+
if (!toolCallId || seen.has(toolCallId)) {
|
|
59
61
|
continue;
|
|
62
|
+
}
|
|
60
63
|
seen.add(toolCallId);
|
|
61
64
|
const toolName = typeof toolResult.toolName === "string" && toolResult.toolName.trim()
|
|
62
65
|
? toolResult.toolName
|
|
@@ -70,8 +73,9 @@ function collectToolFailures(messages) {
|
|
|
70
73
|
return failures;
|
|
71
74
|
}
|
|
72
75
|
function formatToolFailuresSection(failures) {
|
|
73
|
-
if (failures.length === 0)
|
|
76
|
+
if (failures.length === 0) {
|
|
74
77
|
return "";
|
|
78
|
+
}
|
|
75
79
|
const lines = failures.slice(0, MAX_TOOL_FAILURES).map((failure) => {
|
|
76
80
|
const meta = failure.meta ? ` (${failure.meta})` : "";
|
|
77
81
|
return `- ${failure.toolName}${meta}: ${failure.summary}`;
|
|
@@ -83,8 +87,8 @@ function formatToolFailuresSection(failures) {
|
|
|
83
87
|
}
|
|
84
88
|
function computeFileLists(fileOps) {
|
|
85
89
|
const modified = new Set([...fileOps.edited, ...fileOps.written]);
|
|
86
|
-
const readFiles = [...fileOps.read].filter((f) => !modified.has(f)).
|
|
87
|
-
const modifiedFiles = [...modified].
|
|
90
|
+
const readFiles = [...fileOps.read].filter((f) => !modified.has(f)).toSorted();
|
|
91
|
+
const modifiedFiles = [...modified].toSorted();
|
|
88
92
|
return { readFiles, modifiedFiles };
|
|
89
93
|
}
|
|
90
94
|
function formatFileOperations(readFiles, modifiedFiles) {
|
|
@@ -95,10 +99,39 @@ function formatFileOperations(readFiles, modifiedFiles) {
|
|
|
95
99
|
if (modifiedFiles.length > 0) {
|
|
96
100
|
sections.push(`<modified-files>\n${modifiedFiles.join("\n")}\n</modified-files>`);
|
|
97
101
|
}
|
|
98
|
-
if (sections.length === 0)
|
|
102
|
+
if (sections.length === 0) {
|
|
99
103
|
return "";
|
|
104
|
+
}
|
|
100
105
|
return `\n\n${sections.join("\n\n")}`;
|
|
101
106
|
}
|
|
107
|
+
/**
|
|
108
|
+
* Read and format critical workspace context for compaction summary.
|
|
109
|
+
* Extracts "Session Startup" and "Red Lines" from AGENTS.md.
|
|
110
|
+
* Limited to 2000 chars to avoid bloating the summary.
|
|
111
|
+
*/
|
|
112
|
+
async function readWorkspaceContextForSummary() {
|
|
113
|
+
const MAX_SUMMARY_CONTEXT_CHARS = 2000;
|
|
114
|
+
const workspaceDir = process.cwd();
|
|
115
|
+
const agentsPath = path.join(workspaceDir, "AGENTS.md");
|
|
116
|
+
try {
|
|
117
|
+
if (!fs.existsSync(agentsPath)) {
|
|
118
|
+
return "";
|
|
119
|
+
}
|
|
120
|
+
const content = await fs.promises.readFile(agentsPath, "utf-8");
|
|
121
|
+
const sections = extractSections(content, ["Session Startup", "Red Lines"]);
|
|
122
|
+
if (sections.length === 0) {
|
|
123
|
+
return "";
|
|
124
|
+
}
|
|
125
|
+
const combined = sections.join("\n\n");
|
|
126
|
+
const safeContent = combined.length > MAX_SUMMARY_CONTEXT_CHARS
|
|
127
|
+
? combined.slice(0, MAX_SUMMARY_CONTEXT_CHARS) + "\n...[truncated]..."
|
|
128
|
+
: combined;
|
|
129
|
+
return `\n\n<workspace-critical-rules>\n${safeContent}\n</workspace-critical-rules>`;
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
return "";
|
|
133
|
+
}
|
|
134
|
+
}
|
|
102
135
|
export default function compactionSafeguardExtension(api) {
|
|
103
136
|
api.on("session_before_compact", async (event, ctx) => {
|
|
104
137
|
const { preparation, customInstructions, signal } = event;
|
|
@@ -133,10 +166,11 @@ export default function compactionSafeguardExtension(api) {
|
|
|
133
166
|
};
|
|
134
167
|
}
|
|
135
168
|
try {
|
|
136
|
-
const
|
|
169
|
+
const runtime = getCompactionSafeguardRuntime(ctx.sessionManager);
|
|
170
|
+
const modelContextWindow = resolveContextWindowTokens(model);
|
|
171
|
+
const contextWindowTokens = runtime?.contextWindowTokens ?? modelContextWindow;
|
|
137
172
|
const turnPrefixMessages = preparation.turnPrefixMessages ?? [];
|
|
138
173
|
let messagesToSummarize = preparation.messagesToSummarize;
|
|
139
|
-
const runtime = getCompactionSafeguardRuntime(ctx.sessionManager);
|
|
140
174
|
const maxHistoryShare = runtime?.maxHistoryShare ?? 0.5;
|
|
141
175
|
const tokensBefore = typeof preparation.tokensBefore === "number" && Number.isFinite(preparation.tokensBefore)
|
|
142
176
|
? preparation.tokensBefore
|
|
@@ -156,14 +190,15 @@ export default function compactionSafeguardExtension(api) {
|
|
|
156
190
|
});
|
|
157
191
|
if (pruned.droppedChunks > 0) {
|
|
158
192
|
const newContentRatio = (newContentTokens / contextWindowTokens) * 100;
|
|
159
|
-
|
|
193
|
+
log.warn(`Compaction safeguard: new content uses ${newContentRatio.toFixed(1)}% of context; dropped ${pruned.droppedChunks} older chunk(s) ` +
|
|
160
194
|
`(${pruned.droppedMessages} messages) to fit history budget.`);
|
|
161
195
|
messagesToSummarize = pruned.messages;
|
|
162
196
|
// Summarize dropped messages so context isn't lost
|
|
163
197
|
if (pruned.droppedMessagesList.length > 0) {
|
|
164
198
|
try {
|
|
165
199
|
const droppedChunkRatio = computeAdaptiveChunkRatio(pruned.droppedMessagesList, contextWindowTokens);
|
|
166
|
-
const droppedMaxChunkTokens = Math.max(1, Math.floor(contextWindowTokens * droppedChunkRatio)
|
|
200
|
+
const droppedMaxChunkTokens = Math.max(1, Math.floor(contextWindowTokens * droppedChunkRatio) -
|
|
201
|
+
SUMMARIZATION_OVERHEAD_TOKENS);
|
|
167
202
|
droppedSummary = await summarizeInStages({
|
|
168
203
|
messages: pruned.droppedMessagesList,
|
|
169
204
|
model,
|
|
@@ -177,16 +212,18 @@ export default function compactionSafeguardExtension(api) {
|
|
|
177
212
|
});
|
|
178
213
|
}
|
|
179
214
|
catch (droppedError) {
|
|
180
|
-
|
|
215
|
+
log.warn(`Compaction safeguard: failed to summarize dropped messages, continuing without: ${droppedError instanceof Error ? droppedError.message : String(droppedError)}`);
|
|
181
216
|
}
|
|
182
217
|
}
|
|
183
218
|
}
|
|
184
219
|
}
|
|
185
220
|
}
|
|
186
|
-
// Use adaptive chunk ratio based on message sizes
|
|
221
|
+
// Use adaptive chunk ratio based on message sizes, reserving headroom for
|
|
222
|
+
// the summarization prompt, system prompt, previous summary, and reasoning budget
|
|
223
|
+
// that generateSummary adds on top of the serialized conversation chunk.
|
|
187
224
|
const allMessages = [...messagesToSummarize, ...turnPrefixMessages];
|
|
188
225
|
const adaptiveRatio = computeAdaptiveChunkRatio(allMessages, contextWindowTokens);
|
|
189
|
-
const maxChunkTokens = Math.max(1, Math.floor(contextWindowTokens * adaptiveRatio));
|
|
226
|
+
const maxChunkTokens = Math.max(1, Math.floor(contextWindowTokens * adaptiveRatio) - SUMMARIZATION_OVERHEAD_TOKENS);
|
|
190
227
|
const reserveTokens = Math.max(1, Math.floor(preparation.settings.reserveTokens));
|
|
191
228
|
// Feed dropped-messages summary as previousSummary so the main summarization
|
|
192
229
|
// incorporates context from pruned messages instead of losing it entirely.
|
|
@@ -219,6 +256,11 @@ export default function compactionSafeguardExtension(api) {
|
|
|
219
256
|
}
|
|
220
257
|
summary += toolFailureSection;
|
|
221
258
|
summary += fileOpsSummary;
|
|
259
|
+
// Append workspace critical context (Session Startup + Red Lines from AGENTS.md)
|
|
260
|
+
const workspaceContext = await readWorkspaceContextForSummary();
|
|
261
|
+
if (workspaceContext) {
|
|
262
|
+
summary += workspaceContext;
|
|
263
|
+
}
|
|
222
264
|
return {
|
|
223
265
|
compaction: {
|
|
224
266
|
summary,
|
|
@@ -229,7 +271,7 @@ export default function compactionSafeguardExtension(api) {
|
|
|
229
271
|
};
|
|
230
272
|
}
|
|
231
273
|
catch (error) {
|
|
232
|
-
|
|
274
|
+
log.warn(`Compaction summarization failed; truncating history: ${error instanceof Error ? error.message : String(error)}`);
|
|
233
275
|
return {
|
|
234
276
|
compaction: {
|
|
235
277
|
summary: fallbackSummary,
|
|
@@ -17,3 +17,43 @@ export function resolveCompactionReserveTokensFloor(cfg) {
|
|
|
17
17
|
}
|
|
18
18
|
return DEFAULT_PI_COMPACTION_RESERVE_TOKENS_FLOOR;
|
|
19
19
|
}
|
|
20
|
+
function toNonNegativeInt(value) {
|
|
21
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value < 0) {
|
|
22
|
+
return undefined;
|
|
23
|
+
}
|
|
24
|
+
return Math.floor(value);
|
|
25
|
+
}
|
|
26
|
+
function toPositiveInt(value) {
|
|
27
|
+
if (typeof value !== "number" || !Number.isFinite(value) || value <= 0) {
|
|
28
|
+
return undefined;
|
|
29
|
+
}
|
|
30
|
+
return Math.floor(value);
|
|
31
|
+
}
|
|
32
|
+
export function applyPiCompactionSettingsFromConfig(params) {
|
|
33
|
+
const currentReserveTokens = params.settingsManager.getCompactionReserveTokens();
|
|
34
|
+
const currentKeepRecentTokens = params.settingsManager.getCompactionKeepRecentTokens();
|
|
35
|
+
const compactionCfg = params.cfg?.agents?.defaults?.compaction;
|
|
36
|
+
const configuredReserveTokens = toNonNegativeInt(compactionCfg?.reserveTokens);
|
|
37
|
+
const configuredKeepRecentTokens = toPositiveInt(compactionCfg?.keepRecentTokens);
|
|
38
|
+
const reserveTokensFloor = resolveCompactionReserveTokensFloor(params.cfg);
|
|
39
|
+
const targetReserveTokens = Math.max(configuredReserveTokens ?? currentReserveTokens, reserveTokensFloor);
|
|
40
|
+
const targetKeepRecentTokens = configuredKeepRecentTokens ?? currentKeepRecentTokens;
|
|
41
|
+
const overrides = {};
|
|
42
|
+
if (targetReserveTokens !== currentReserveTokens) {
|
|
43
|
+
overrides.reserveTokens = targetReserveTokens;
|
|
44
|
+
}
|
|
45
|
+
if (targetKeepRecentTokens !== currentKeepRecentTokens) {
|
|
46
|
+
overrides.keepRecentTokens = targetKeepRecentTokens;
|
|
47
|
+
}
|
|
48
|
+
const didOverride = Object.keys(overrides).length > 0;
|
|
49
|
+
if (didOverride) {
|
|
50
|
+
params.settingsManager.applyOverrides({ compaction: overrides });
|
|
51
|
+
}
|
|
52
|
+
return {
|
|
53
|
+
didOverride,
|
|
54
|
+
compaction: {
|
|
55
|
+
reserveTokens: targetReserveTokens,
|
|
56
|
+
keepRecentTokens: targetKeepRecentTokens,
|
|
57
|
+
},
|
|
58
|
+
};
|
|
59
|
+
}
|
|
@@ -5,6 +5,7 @@ import { normalizeMessageChannel } from "../utils/message-channel.js";
|
|
|
5
5
|
import { resolveAgentConfig, resolveAgentIdFromSessionKey } from "./agent-scope.js";
|
|
6
6
|
import { compileGlobPatterns, matchesAnyGlobPattern } from "./glob-pattern.js";
|
|
7
7
|
import { pickSandboxToolPolicy } from "./sandbox-tool-policy.js";
|
|
8
|
+
import { DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH } from "../config/agent-limits.js";
|
|
8
9
|
import { expandToolGroups, normalizeToolName } from "./tool-policy.js";
|
|
9
10
|
function makeToolPolicyMatcher(policy) {
|
|
10
11
|
const deny = compileGlobPatterns({
|
|
@@ -75,7 +76,7 @@ function resolveSubagentDenyList(depth, maxSpawnDepth) {
|
|
|
75
76
|
}
|
|
76
77
|
export function resolveSubagentToolPolicy(cfg, depth) {
|
|
77
78
|
const configured = cfg?.tools?.subagents?.tools;
|
|
78
|
-
const maxSpawnDepth = cfg?.agents?.defaults?.subagents?.maxSpawnDepth ??
|
|
79
|
+
const maxSpawnDepth = cfg?.agents?.defaults?.subagents?.maxSpawnDepth ?? DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH;
|
|
79
80
|
const effectiveDepth = typeof depth === "number" && depth >= 0 ? depth : 1;
|
|
80
81
|
const baseDeny = resolveSubagentDenyList(effectiveDepth, maxSpawnDepth);
|
|
81
82
|
const deny = [...baseDeny, ...(Array.isArray(configured?.deny) ? configured.deny : [])];
|