@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
|
@@ -1,20 +1,13 @@
|
|
|
1
|
-
import path from "node:path";
|
|
2
|
-
import { fileURLToPath } from "node:url";
|
|
3
1
|
import { resolveContextWindowInfo } from "../context-window-guard.js";
|
|
4
2
|
import { DEFAULT_CONTEXT_TOKENS } from "../defaults.js";
|
|
5
3
|
import { setCompactionSafeguardRuntime } from "../pi-extensions/compaction-safeguard-runtime.js";
|
|
4
|
+
import compactionSafeguardExtension from "../pi-extensions/compaction-safeguard.js";
|
|
5
|
+
import contextPruningExtension from "../pi-extensions/context-pruning.js";
|
|
6
6
|
import { setContextPruningRuntime } from "../pi-extensions/context-pruning/runtime.js";
|
|
7
7
|
import { computeEffectiveSettings } from "../pi-extensions/context-pruning/settings.js";
|
|
8
8
|
import { makeToolPrunablePredicate } from "../pi-extensions/context-pruning/tools.js";
|
|
9
9
|
import { ensurePiCompactionReserveTokens } from "../pi-settings.js";
|
|
10
10
|
import { isCacheTtlEligibleProvider, readLastCacheTtlTimestamp } from "./cache-ttl.js";
|
|
11
|
-
function resolvePiExtensionPath(id) {
|
|
12
|
-
const self = fileURLToPath(import.meta.url);
|
|
13
|
-
const dir = path.dirname(self);
|
|
14
|
-
// In dev this file is `.ts` (tsx), in production it's `.js`.
|
|
15
|
-
const ext = path.extname(self) === ".ts" ? "ts" : "js";
|
|
16
|
-
return path.join(dir, "..", "pi-extensions", `${id}.${ext}`);
|
|
17
|
-
}
|
|
18
11
|
function resolveContextWindowTokens(params) {
|
|
19
12
|
return resolveContextWindowInfo({
|
|
20
13
|
cfg: params.cfg,
|
|
@@ -24,41 +17,50 @@ function resolveContextWindowTokens(params) {
|
|
|
24
17
|
defaultTokens: DEFAULT_CONTEXT_TOKENS,
|
|
25
18
|
}).tokens;
|
|
26
19
|
}
|
|
27
|
-
function
|
|
20
|
+
function buildContextPruningFactory(params) {
|
|
28
21
|
const raw = params.cfg?.agents?.defaults?.contextPruning;
|
|
29
|
-
if (raw?.mode !== "cache-ttl")
|
|
30
|
-
return
|
|
31
|
-
|
|
32
|
-
|
|
22
|
+
if (raw?.mode !== "cache-ttl") {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
if (!isCacheTtlEligibleProvider(params.provider, params.modelId)) {
|
|
26
|
+
return undefined;
|
|
27
|
+
}
|
|
33
28
|
const settings = computeEffectiveSettings(raw);
|
|
34
|
-
if (!settings)
|
|
35
|
-
return
|
|
29
|
+
if (!settings) {
|
|
30
|
+
return undefined;
|
|
31
|
+
}
|
|
36
32
|
setContextPruningRuntime(params.sessionManager, {
|
|
37
33
|
settings,
|
|
38
34
|
contextWindowTokens: resolveContextWindowTokens(params),
|
|
39
35
|
isToolPrunable: makeToolPrunablePredicate(settings.tools),
|
|
40
36
|
lastCacheTouchAt: readLastCacheTtlTimestamp(params.sessionManager),
|
|
41
37
|
});
|
|
42
|
-
return
|
|
43
|
-
additionalExtensionPaths: [resolvePiExtensionPath("context-pruning")],
|
|
44
|
-
};
|
|
38
|
+
return contextPruningExtension;
|
|
45
39
|
}
|
|
46
40
|
function resolveCompactionMode(cfg) {
|
|
47
41
|
return cfg?.agents?.defaults?.compaction?.mode === "safeguard" ? "safeguard" : "default";
|
|
48
42
|
}
|
|
49
|
-
export function
|
|
50
|
-
const
|
|
43
|
+
export function buildEmbeddedExtensionFactories(params) {
|
|
44
|
+
const factories = [];
|
|
51
45
|
if (resolveCompactionMode(params.cfg) === "safeguard") {
|
|
52
46
|
const compactionCfg = params.cfg?.agents?.defaults?.compaction;
|
|
47
|
+
const contextWindowInfo = resolveContextWindowInfo({
|
|
48
|
+
cfg: params.cfg,
|
|
49
|
+
provider: params.provider,
|
|
50
|
+
modelId: params.modelId,
|
|
51
|
+
modelContextWindow: params.model?.contextWindow,
|
|
52
|
+
defaultTokens: DEFAULT_CONTEXT_TOKENS,
|
|
53
|
+
});
|
|
53
54
|
setCompactionSafeguardRuntime(params.sessionManager, {
|
|
54
55
|
maxHistoryShare: compactionCfg?.maxHistoryShare,
|
|
56
|
+
contextWindowTokens: contextWindowInfo.tokens,
|
|
55
57
|
});
|
|
56
|
-
|
|
58
|
+
factories.push(compactionSafeguardExtension);
|
|
57
59
|
}
|
|
58
|
-
const
|
|
59
|
-
if (
|
|
60
|
-
|
|
60
|
+
const pruningFactory = buildContextPruningFactory(params);
|
|
61
|
+
if (pruningFactory) {
|
|
62
|
+
factories.push(pruningFactory);
|
|
61
63
|
}
|
|
62
|
-
return
|
|
64
|
+
return factories;
|
|
63
65
|
}
|
|
64
66
|
export { ensurePiCompactionReserveTokens };
|
|
@@ -7,6 +7,7 @@ import { cleanToolSchemaForGemini } from "../pi-tools.schema.js";
|
|
|
7
7
|
import { sanitizeToolCallInputs, stripToolResultDetails, sanitizeToolUseResultPairing, } from "../session-transcript-repair.js";
|
|
8
8
|
import { resolveTranscriptPolicy } from "../transcript-policy.js";
|
|
9
9
|
import { log } from "./logger.js";
|
|
10
|
+
import { dropThinkingBlocks } from "./thinking.js";
|
|
10
11
|
import { describeUnknownError } from "./utils.js";
|
|
11
12
|
const GOOGLE_TURN_ORDERING_CUSTOM_TYPE = "google-turn-ordering-bootstrap";
|
|
12
13
|
const GOOGLE_SCHEMA_UNSUPPORTED_KEYWORDS = new Set([
|
|
@@ -71,6 +72,12 @@ export function sanitizeAntigravityThinkingBlocks(messages) {
|
|
|
71
72
|
const rec = block;
|
|
72
73
|
const candidate = rec.thinkingSignature ?? rec.signature ?? rec.thought_signature ?? rec.thoughtSignature;
|
|
73
74
|
if (!isValidAntigravitySignature(candidate)) {
|
|
75
|
+
// Preserve reasoning content as plain text when signatures are invalid/missing.
|
|
76
|
+
// Antigravity Claude rejects unsigned thinking blocks, but dropping them loses context.
|
|
77
|
+
const thinkingText = block.thinking;
|
|
78
|
+
if (typeof thinkingText === "string" && thinkingText.trim()) {
|
|
79
|
+
nextContent.push({ type: "text", text: thinkingText });
|
|
80
|
+
}
|
|
74
81
|
contentChanged = true;
|
|
75
82
|
continue;
|
|
76
83
|
}
|
|
@@ -199,11 +206,11 @@ function findUnsupportedSchemaKeywords(schema, path) {
|
|
|
199
206
|
return violations;
|
|
200
207
|
}
|
|
201
208
|
export function sanitizeToolsForGoogle(params) {
|
|
202
|
-
//
|
|
203
|
-
//
|
|
204
|
-
//
|
|
205
|
-
//
|
|
206
|
-
if (params.provider !== "google-gemini-cli") {
|
|
209
|
+
// Cloud Code Assist uses the OpenAPI 3.03 `parameters` field for both Gemini
|
|
210
|
+
// AND Claude models. This field does not support JSON Schema keywords such as
|
|
211
|
+
// patternProperties, additionalProperties, $ref, etc. We must clean schemas
|
|
212
|
+
// for every provider that routes through this path.
|
|
213
|
+
if (params.provider !== "google-gemini-cli" && params.provider !== "google-antigravity") {
|
|
207
214
|
return params.tools;
|
|
208
215
|
}
|
|
209
216
|
return params.tools.map((tool) => {
|
|
@@ -350,10 +357,15 @@ export async function sanitizeSessionHistory(params) {
|
|
|
350
357
|
sanitizeThoughtSignatures: policy.sanitizeThoughtSignatures,
|
|
351
358
|
...resolveImageSanitizationLimits(params.config),
|
|
352
359
|
});
|
|
353
|
-
const
|
|
354
|
-
?
|
|
360
|
+
const droppedThinking = policy.dropThinkingBlocks
|
|
361
|
+
? dropThinkingBlocks(sanitizedImages)
|
|
355
362
|
: sanitizedImages;
|
|
356
|
-
const
|
|
363
|
+
const sanitizedThinking = policy.sanitizeThinkingSignatures
|
|
364
|
+
? sanitizeAntigravityThinkingBlocks(droppedThinking)
|
|
365
|
+
: droppedThinking;
|
|
366
|
+
const sanitizedToolCalls = sanitizeToolCallInputs(sanitizedThinking, {
|
|
367
|
+
allowedToolNames: params.allowedToolNames,
|
|
368
|
+
});
|
|
357
369
|
const repairedTools = policy.repairToolUseResultPairing
|
|
358
370
|
? sanitizeToolUseResultPairing(sanitizedToolCalls)
|
|
359
371
|
: sanitizedToolCalls;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import { streamSimple } from "@mariozechner/pi-ai";
|
|
4
|
-
import { createAgentSession, SessionManager, SettingsManager } from "@mariozechner/pi-coding-agent";
|
|
4
|
+
import { createAgentSession, DefaultResourceLoader, SessionManager, SettingsManager, } from "@mariozechner/pi-coding-agent";
|
|
5
5
|
import { resolveHeartbeatPrompt } from "../../../auto-reply/heartbeat.js";
|
|
6
6
|
import { resolveChannelCapabilities } from "../../../config/channel-capabilities.js";
|
|
7
7
|
import { getMachineDisplayName } from "../../../infra/machine-name.js";
|
|
@@ -30,7 +30,7 @@ import { resolveDefaultModelForAgent } from "../../model-selection.js";
|
|
|
30
30
|
import { createOllamaStreamFn, OLLAMA_NATIVE_BASE_URL } from "../../ollama-stream.js";
|
|
31
31
|
import { isCloudCodeAssistFormatError, resolveBootstrapMaxChars, resolveBootstrapTotalMaxChars, validateAnthropicTurns, validateGeminiTurns, } from "../../pi-embedded-helpers.js";
|
|
32
32
|
import { subscribeEmbeddedPiSession } from "../../pi-embedded-subscribe.js";
|
|
33
|
-
import {
|
|
33
|
+
import { applyPiCompactionSettingsFromConfig } from "../../pi-settings.js";
|
|
34
34
|
import { toClientToolDefinitions } from "../../pi-tool-definition-adapter.js";
|
|
35
35
|
import { createPoolbotCodingTools, resolveToolLoopDetectionConfig } from "../../pi-tools.js";
|
|
36
36
|
import { resolveSandboxContext } from "../../sandbox.js";
|
|
@@ -47,7 +47,7 @@ import { resolveTranscriptPolicy } from "../../transcript-policy.js";
|
|
|
47
47
|
import { DEFAULT_BOOTSTRAP_FILENAME } from "../../workspace.js";
|
|
48
48
|
import { isRunnerAbortError } from "../abort.js";
|
|
49
49
|
import { appendCacheTtlTimestamp, isCacheTtlEligibleProvider } from "../cache-ttl.js";
|
|
50
|
-
import {
|
|
50
|
+
import { buildEmbeddedExtensionFactories } from "../extensions.js";
|
|
51
51
|
import { applyExtraParamsToAgent } from "../extra-params.js";
|
|
52
52
|
import { logToolSchemasForGoogle, sanitizeAntigravityThinkingBlocks, sanitizeSessionHistory, sanitizeToolsForGoogle, } from "../google.js";
|
|
53
53
|
import { getDmHistoryLimitFromSessionKey, limitHistoryTurns } from "../history.js";
|
|
@@ -58,6 +58,8 @@ import { buildEmbeddedSandboxInfo } from "../sandbox-info.js";
|
|
|
58
58
|
import { prewarmSessionFile, trackSessionManagerAccess } from "../session-manager-cache.js";
|
|
59
59
|
import { prepareSessionManagerForRun } from "../session-manager-init.js";
|
|
60
60
|
import { applySystemPromptOverrideToSession, buildEmbeddedSystemPrompt, createSystemPromptOverride, } from "../system-prompt.js";
|
|
61
|
+
import { dropThinkingBlocks } from "../thinking.js";
|
|
62
|
+
import { collectAllowedToolNames } from "../tool-name-allowlist.js";
|
|
61
63
|
import { installToolResultContextGuard } from "../tool-result-context-guard.js";
|
|
62
64
|
import { splitSdkTools } from "../tool-split.js";
|
|
63
65
|
import { describeUnknownError, mapThinkingLevel } from "../utils.js";
|
|
@@ -101,6 +103,37 @@ export function injectHistoryImagesIntoMessages(messages, historyImagesByIndex)
|
|
|
101
103
|
}
|
|
102
104
|
return didMutate;
|
|
103
105
|
}
|
|
106
|
+
export async function resolvePromptBuildHookResult(params) {
|
|
107
|
+
const promptBuildResult = params.hookRunner?.hasHooks("before_prompt_build")
|
|
108
|
+
? await params.hookRunner
|
|
109
|
+
.runBeforePromptBuild({
|
|
110
|
+
prompt: params.prompt,
|
|
111
|
+
messages: params.messages,
|
|
112
|
+
}, params.hookCtx)
|
|
113
|
+
.catch((hookErr) => {
|
|
114
|
+
log.warn(`before_prompt_build hook failed: ${String(hookErr)}`);
|
|
115
|
+
return undefined;
|
|
116
|
+
})
|
|
117
|
+
: undefined;
|
|
118
|
+
const legacyResult = params.legacyBeforeAgentStartResult ??
|
|
119
|
+
(params.hookRunner?.hasHooks("before_agent_start")
|
|
120
|
+
? await params.hookRunner
|
|
121
|
+
.runBeforeAgentStart({
|
|
122
|
+
prompt: params.prompt,
|
|
123
|
+
messages: params.messages,
|
|
124
|
+
}, params.hookCtx)
|
|
125
|
+
.catch((hookErr) => {
|
|
126
|
+
log.warn(`before_agent_start hook (legacy prompt build path) failed: ${String(hookErr)}`);
|
|
127
|
+
return undefined;
|
|
128
|
+
})
|
|
129
|
+
: undefined);
|
|
130
|
+
return {
|
|
131
|
+
systemPrompt: promptBuildResult?.systemPrompt ?? legacyResult?.systemPrompt,
|
|
132
|
+
prependContext: [promptBuildResult?.prependContext, legacyResult?.prependContext]
|
|
133
|
+
.filter((value) => Boolean(value))
|
|
134
|
+
.join("\n\n"),
|
|
135
|
+
};
|
|
136
|
+
}
|
|
104
137
|
function summarizeMessagePayload(msg) {
|
|
105
138
|
const content = msg.content;
|
|
106
139
|
if (typeof content === "string") {
|
|
@@ -244,6 +277,10 @@ export async function runEmbeddedAttempt(params) {
|
|
|
244
277
|
disableMessageTool: params.disableMessageTool,
|
|
245
278
|
});
|
|
246
279
|
const tools = sanitizeToolsForGoogle({ tools: toolsRaw, provider: params.provider });
|
|
280
|
+
const allowedToolNames = collectAllowedToolNames({
|
|
281
|
+
tools,
|
|
282
|
+
clientTools: params.clientTools,
|
|
283
|
+
});
|
|
247
284
|
logToolSchemasForGoogle({ tools, provider: params.provider });
|
|
248
285
|
const machineName = await getMachineDisplayName();
|
|
249
286
|
const runtimeChannel = normalizeMessageChannel(params.messageChannel ?? params.messageProvider);
|
|
@@ -349,6 +386,10 @@ export async function runEmbeddedAttempt(params) {
|
|
|
349
386
|
reasoningLevel: params.reasoningLevel ?? "off",
|
|
350
387
|
extraSystemPrompt: params.extraSystemPrompt,
|
|
351
388
|
ownerNumbers: params.ownerNumbers,
|
|
389
|
+
ownerDisplay: params.config?.commands?.ownerDisplay,
|
|
390
|
+
ownerDisplaySecret: params.config?.commands?.ownerDisplaySecret ??
|
|
391
|
+
params.config?.gateway?.auth?.token ??
|
|
392
|
+
params.config?.gateway?.remote?.token,
|
|
352
393
|
reasoningTagHint,
|
|
353
394
|
heartbeatPrompt: isDefaultAgent
|
|
354
395
|
? resolveHeartbeatPrompt(params.config?.agents?.defaults?.heartbeat?.prompt)
|
|
@@ -424,6 +465,7 @@ export async function runEmbeddedAttempt(params) {
|
|
|
424
465
|
sessionKey: params.sessionKey,
|
|
425
466
|
inputProvenance: params.inputProvenance,
|
|
426
467
|
allowSyntheticToolResults: transcriptPolicy.allowSyntheticToolResults,
|
|
468
|
+
allowedToolNames,
|
|
427
469
|
});
|
|
428
470
|
trackSessionManagerAccess(params.sessionFile);
|
|
429
471
|
await prepareSessionManagerForRun({
|
|
@@ -434,18 +476,31 @@ export async function runEmbeddedAttempt(params) {
|
|
|
434
476
|
cwd: effectiveWorkspace,
|
|
435
477
|
});
|
|
436
478
|
const settingsManager = SettingsManager.create(effectiveWorkspace, agentDir);
|
|
437
|
-
|
|
479
|
+
applyPiCompactionSettingsFromConfig({
|
|
438
480
|
settingsManager,
|
|
439
|
-
|
|
481
|
+
cfg: params.config,
|
|
440
482
|
});
|
|
441
|
-
//
|
|
442
|
-
|
|
483
|
+
// Sets compaction/pruning runtime state and returns extension factories
|
|
484
|
+
// that must be passed to the resource loader for the safeguard to be active.
|
|
485
|
+
const extensionFactories = buildEmbeddedExtensionFactories({
|
|
443
486
|
cfg: params.config,
|
|
444
487
|
sessionManager,
|
|
445
488
|
provider: params.provider,
|
|
446
489
|
modelId: params.modelId,
|
|
447
490
|
model: params.model,
|
|
448
491
|
});
|
|
492
|
+
// Only create an explicit resource loader when there are extension factories
|
|
493
|
+
// to register; otherwise let createAgentSession use its built-in default.
|
|
494
|
+
let resourceLoader;
|
|
495
|
+
if (extensionFactories.length > 0) {
|
|
496
|
+
resourceLoader = new DefaultResourceLoader({
|
|
497
|
+
cwd: resolvedWorkspace,
|
|
498
|
+
agentDir,
|
|
499
|
+
settingsManager,
|
|
500
|
+
extensionFactories,
|
|
501
|
+
});
|
|
502
|
+
await resourceLoader.reload();
|
|
503
|
+
}
|
|
449
504
|
// Get hook runner early so it's available when creating tools
|
|
450
505
|
const hookRunner = getGlobalHookRunner();
|
|
451
506
|
const { builtInTools, customTools } = splitSdkTools({
|
|
@@ -479,6 +534,7 @@ export async function runEmbeddedAttempt(params) {
|
|
|
479
534
|
customTools: allCustomTools,
|
|
480
535
|
sessionManager,
|
|
481
536
|
settingsManager,
|
|
537
|
+
resourceLoader,
|
|
482
538
|
}));
|
|
483
539
|
applySystemPromptOverrideToSession(session, systemPromptText);
|
|
484
540
|
if (!session) {
|
|
@@ -533,6 +589,28 @@ export async function runEmbeddedAttempt(params) {
|
|
|
533
589
|
});
|
|
534
590
|
activeSession.agent.streamFn = cacheTrace.wrapStreamFn(activeSession.agent.streamFn);
|
|
535
591
|
}
|
|
592
|
+
// Copilot/Claude can reject persisted `thinking` blocks (e.g. thinkingSignature:"reasoning_text")
|
|
593
|
+
// on *any* follow-up provider call (including tool continuations). Wrap the stream function
|
|
594
|
+
// so every outbound request sees sanitized messages.
|
|
595
|
+
if (transcriptPolicy.dropThinkingBlocks) {
|
|
596
|
+
const inner = activeSession.agent.streamFn;
|
|
597
|
+
activeSession.agent.streamFn = (model, context, options) => {
|
|
598
|
+
const ctx = context;
|
|
599
|
+
const messages = ctx?.messages;
|
|
600
|
+
if (!Array.isArray(messages)) {
|
|
601
|
+
return inner(model, context, options);
|
|
602
|
+
}
|
|
603
|
+
const sanitized = dropThinkingBlocks(messages);
|
|
604
|
+
if (sanitized === messages) {
|
|
605
|
+
return inner(model, context, options);
|
|
606
|
+
}
|
|
607
|
+
const nextContext = {
|
|
608
|
+
...context,
|
|
609
|
+
messages: sanitized,
|
|
610
|
+
};
|
|
611
|
+
return inner(model, nextContext, options);
|
|
612
|
+
};
|
|
613
|
+
}
|
|
536
614
|
if (anthropicPayloadLogger) {
|
|
537
615
|
activeSession.agent.streamFn = anthropicPayloadLogger.wrapStreamFn(activeSession.agent.streamFn);
|
|
538
616
|
}
|
|
@@ -542,6 +620,7 @@ export async function runEmbeddedAttempt(params) {
|
|
|
542
620
|
modelApi: params.model.api,
|
|
543
621
|
modelId: params.modelId,
|
|
544
622
|
provider: params.provider,
|
|
623
|
+
allowedToolNames,
|
|
545
624
|
config: params.config,
|
|
546
625
|
sessionManager,
|
|
547
626
|
sessionId: params.sessionId,
|
|
@@ -725,34 +804,13 @@ export async function runEmbeddedAttempt(params) {
|
|
|
725
804
|
workspaceDir: params.workspaceDir,
|
|
726
805
|
messageProvider: params.messageProvider ?? undefined,
|
|
727
806
|
};
|
|
728
|
-
const
|
|
729
|
-
|
|
730
|
-
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
log.warn(`before_prompt_build hook failed: ${String(hookErr)}`);
|
|
736
|
-
return undefined;
|
|
737
|
-
})
|
|
738
|
-
: undefined;
|
|
739
|
-
const legacyResult = hookRunner?.hasHooks("before_agent_start")
|
|
740
|
-
? await hookRunner
|
|
741
|
-
.runBeforeAgentStart({
|
|
742
|
-
prompt: params.prompt,
|
|
743
|
-
messages: activeSession.messages,
|
|
744
|
-
}, hookCtx)
|
|
745
|
-
.catch((hookErr) => {
|
|
746
|
-
log.warn(`before_agent_start hook (legacy prompt build path) failed: ${String(hookErr)}`);
|
|
747
|
-
return undefined;
|
|
748
|
-
})
|
|
749
|
-
: undefined;
|
|
750
|
-
const hookResult = {
|
|
751
|
-
systemPrompt: promptBuildResult?.systemPrompt ?? legacyResult?.systemPrompt,
|
|
752
|
-
prependContext: [promptBuildResult?.prependContext, legacyResult?.prependContext]
|
|
753
|
-
.filter((value) => Boolean(value))
|
|
754
|
-
.join("\n\n"),
|
|
755
|
-
};
|
|
807
|
+
const hookResult = await resolvePromptBuildHookResult({
|
|
808
|
+
prompt: params.prompt,
|
|
809
|
+
messages: activeSession.messages,
|
|
810
|
+
hookCtx,
|
|
811
|
+
hookRunner,
|
|
812
|
+
legacyBeforeAgentStartResult: params.legacyBeforeAgentStartResult,
|
|
813
|
+
});
|
|
756
814
|
{
|
|
757
815
|
if (hookResult?.prependContext) {
|
|
758
816
|
effectivePrompt = `${hookResult.prependContext}\n\n${params.prompt}`;
|
|
@@ -774,7 +832,8 @@ export async function runEmbeddedAttempt(params) {
|
|
|
774
832
|
sessionManager.resetLeaf();
|
|
775
833
|
}
|
|
776
834
|
const sessionContext = sessionManager.buildSessionContext();
|
|
777
|
-
const sanitizedOrphan = transcriptPolicy.
|
|
835
|
+
const sanitizedOrphan = transcriptPolicy.sanitizeThinkingSignatures ||
|
|
836
|
+
transcriptPolicy.normalizeAntigravityThinkingBlocks
|
|
778
837
|
? sanitizeAntigravityThinkingBlocks(sessionContext.messages)
|
|
779
838
|
: sessionContext.messages;
|
|
780
839
|
activeSession.agent.replaceMessages(sanitizedOrphan);
|
|
@@ -43,6 +43,16 @@ const createUsageAccumulator = () => ({
|
|
|
43
43
|
function createCompactionDiagId() {
|
|
44
44
|
return `ovf-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
45
45
|
}
|
|
46
|
+
// Defensive guard for the outer run loop across all retry branches.
|
|
47
|
+
const BASE_RUN_RETRY_ITERATIONS = 24;
|
|
48
|
+
const RUN_RETRY_ITERATIONS_PER_PROFILE = 8;
|
|
49
|
+
const MIN_RUN_RETRY_ITERATIONS = 32;
|
|
50
|
+
const MAX_RUN_RETRY_ITERATIONS = 160;
|
|
51
|
+
function resolveMaxRunRetryIterations(profileCandidateCount) {
|
|
52
|
+
const scaled = BASE_RUN_RETRY_ITERATIONS +
|
|
53
|
+
Math.max(1, profileCandidateCount) * RUN_RETRY_ITERATIONS_PER_PROFILE;
|
|
54
|
+
return Math.min(MAX_RUN_RETRY_ITERATIONS, Math.max(MIN_RUN_RETRY_ITERATIONS, scaled));
|
|
55
|
+
}
|
|
46
56
|
const hasUsageValues = (usage) => !!usage &&
|
|
47
57
|
[usage.input, usage.output, usage.cacheRead, usage.cacheWrite, usage.total].some((value) => typeof value === "number" && Number.isFinite(value) && value > 0);
|
|
48
58
|
const mergeUsageIntoAccumulator = (target, usage) => {
|
|
@@ -89,6 +99,12 @@ const toNormalizedUsage = (usage) => {
|
|
|
89
99
|
total: lastPromptTokens + usage.output || undefined,
|
|
90
100
|
};
|
|
91
101
|
};
|
|
102
|
+
function resolveActiveErrorContext(params) {
|
|
103
|
+
return {
|
|
104
|
+
provider: params.lastAssistant?.provider ?? params.provider,
|
|
105
|
+
model: params.lastAssistant?.model ?? params.model,
|
|
106
|
+
};
|
|
107
|
+
}
|
|
92
108
|
export async function runEmbeddedPiAgent(params) {
|
|
93
109
|
const sessionLane = resolveSessionLane(params.sessionKey?.trim() || params.sessionId);
|
|
94
110
|
const globalLane = resolveGlobalLane(params.lane);
|
|
@@ -129,6 +145,7 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
129
145
|
// Legacy compatibility: before_agent_start is also checked for override
|
|
130
146
|
// fields if present. New hook takes precedence when both are set.
|
|
131
147
|
let modelResolveOverride;
|
|
148
|
+
let legacyBeforeAgentStartResult;
|
|
132
149
|
const hookRunner = getGlobalHookRunner();
|
|
133
150
|
const hookCtx = {
|
|
134
151
|
agentId: workspaceResolution.agentId,
|
|
@@ -147,10 +164,11 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
147
164
|
}
|
|
148
165
|
if (hookRunner?.hasHooks("before_agent_start")) {
|
|
149
166
|
try {
|
|
150
|
-
|
|
167
|
+
legacyBeforeAgentStartResult = await hookRunner.runBeforeAgentStart({ prompt: params.prompt }, hookCtx);
|
|
151
168
|
modelResolveOverride = {
|
|
152
|
-
providerOverride: modelResolveOverride?.providerOverride ??
|
|
153
|
-
|
|
169
|
+
providerOverride: modelResolveOverride?.providerOverride ??
|
|
170
|
+
legacyBeforeAgentStartResult?.providerOverride,
|
|
171
|
+
modelOverride: modelResolveOverride?.modelOverride ?? legacyBeforeAgentStartResult?.modelOverride,
|
|
154
172
|
};
|
|
155
173
|
}
|
|
156
174
|
catch (hookErr) {
|
|
@@ -167,7 +185,11 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
167
185
|
}
|
|
168
186
|
const { model, error, authStorage, modelRegistry } = resolveModel(provider, modelId, agentDir, params.config);
|
|
169
187
|
if (!model) {
|
|
170
|
-
throw new
|
|
188
|
+
throw new FailoverError(error ?? `Unknown model: ${provider}/${modelId}`, {
|
|
189
|
+
reason: "model_not_found",
|
|
190
|
+
provider,
|
|
191
|
+
model: modelId,
|
|
192
|
+
});
|
|
171
193
|
}
|
|
172
194
|
const ctxInfo = resolveContextWindowInfo({
|
|
173
195
|
cfg: params.config,
|
|
@@ -335,13 +357,41 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
335
357
|
}
|
|
336
358
|
}
|
|
337
359
|
const MAX_OVERFLOW_COMPACTION_ATTEMPTS = 3;
|
|
360
|
+
const MAX_RUN_LOOP_ITERATIONS = resolveMaxRunRetryIterations(profileCandidates.length);
|
|
338
361
|
let overflowCompactionAttempts = 0;
|
|
339
362
|
let toolResultTruncationAttempted = false;
|
|
340
363
|
const usageAccumulator = createUsageAccumulator();
|
|
341
364
|
let lastRunPromptUsage;
|
|
342
365
|
let autoCompactionCount = 0;
|
|
366
|
+
let runLoopIterations = 0;
|
|
343
367
|
try {
|
|
344
368
|
while (true) {
|
|
369
|
+
if (runLoopIterations >= MAX_RUN_LOOP_ITERATIONS) {
|
|
370
|
+
const message = `Exceeded retry limit after ${runLoopIterations} attempts ` +
|
|
371
|
+
`(max=${MAX_RUN_LOOP_ITERATIONS}).`;
|
|
372
|
+
log.error(`[run-retry-limit] sessionKey=${params.sessionKey ?? params.sessionId} ` +
|
|
373
|
+
`provider=${provider}/${modelId} attempts=${runLoopIterations} ` +
|
|
374
|
+
`maxAttempts=${MAX_RUN_LOOP_ITERATIONS}`);
|
|
375
|
+
return {
|
|
376
|
+
payloads: [
|
|
377
|
+
{
|
|
378
|
+
text: "Request failed after repeated internal retries. " +
|
|
379
|
+
"Please try again, or use /new to start a fresh session.",
|
|
380
|
+
isError: true,
|
|
381
|
+
},
|
|
382
|
+
],
|
|
383
|
+
meta: {
|
|
384
|
+
durationMs: Date.now() - started,
|
|
385
|
+
agentMeta: {
|
|
386
|
+
sessionId: params.sessionId,
|
|
387
|
+
provider,
|
|
388
|
+
model: model.id,
|
|
389
|
+
},
|
|
390
|
+
error: { kind: "retry_limit", message },
|
|
391
|
+
},
|
|
392
|
+
};
|
|
393
|
+
}
|
|
394
|
+
runLoopIterations += 1;
|
|
345
395
|
attemptedThinking.add(thinkLevel);
|
|
346
396
|
await fs.mkdir(resolvedWorkspace, { recursive: true });
|
|
347
397
|
const prompt = provider === "anthropic" ? scrubAnthropicRefusalMagic(params.prompt) : params.prompt;
|
|
@@ -376,6 +426,7 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
376
426
|
authStorage,
|
|
377
427
|
modelRegistry,
|
|
378
428
|
agentId: workspaceResolution.agentId,
|
|
429
|
+
legacyBeforeAgentStartResult,
|
|
379
430
|
thinkLevel,
|
|
380
431
|
verboseLevel: params.verboseLevel,
|
|
381
432
|
reasoningLevel: params.reasoningLevel,
|
|
@@ -413,11 +464,17 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
413
464
|
const lastTurnTotal = lastAssistantUsage?.total ?? attemptUsage?.total;
|
|
414
465
|
const attemptCompactionCount = Math.max(0, attempt.compactionCount ?? 0);
|
|
415
466
|
autoCompactionCount += attemptCompactionCount;
|
|
467
|
+
const activeErrorContext = resolveActiveErrorContext({
|
|
468
|
+
lastAssistant,
|
|
469
|
+
provider,
|
|
470
|
+
model: modelId,
|
|
471
|
+
});
|
|
416
472
|
const formattedAssistantErrorText = lastAssistant
|
|
417
473
|
? formatAssistantErrorText(lastAssistant, {
|
|
418
474
|
cfg: params.config,
|
|
419
475
|
sessionKey: params.sessionKey ?? params.sessionId,
|
|
420
|
-
provider,
|
|
476
|
+
provider: activeErrorContext.provider,
|
|
477
|
+
model: activeErrorContext.model,
|
|
421
478
|
})
|
|
422
479
|
: undefined;
|
|
423
480
|
const assistantErrorText = lastAssistant?.stopReason === "error"
|
|
@@ -533,8 +590,8 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
533
590
|
});
|
|
534
591
|
if (truncResult.truncated) {
|
|
535
592
|
log.info(`[context-overflow-recovery] Truncated ${truncResult.truncatedCount} tool result(s); retrying prompt`);
|
|
536
|
-
//
|
|
537
|
-
|
|
593
|
+
// Do NOT reset overflowCompactionAttempts here — the global cap must remain
|
|
594
|
+
// enforced across all iterations to prevent unbounded compaction cycles (OC-65).
|
|
538
595
|
continue;
|
|
539
596
|
}
|
|
540
597
|
log.warn(`[context-overflow-recovery] Tool result truncation did not help: ${truncResult.reason ?? "unknown"}`);
|
|
@@ -725,7 +782,8 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
725
782
|
? formatAssistantErrorText(lastAssistant, {
|
|
726
783
|
cfg: params.config,
|
|
727
784
|
sessionKey: params.sessionKey ?? params.sessionId,
|
|
728
|
-
provider,
|
|
785
|
+
provider: activeErrorContext.provider,
|
|
786
|
+
model: activeErrorContext.model,
|
|
729
787
|
})
|
|
730
788
|
: undefined) ||
|
|
731
789
|
lastAssistant?.errorMessage?.trim() ||
|
|
@@ -734,7 +792,7 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
734
792
|
: rateLimitFailure
|
|
735
793
|
? "LLM request rate limited."
|
|
736
794
|
: billingFailure
|
|
737
|
-
? formatBillingErrorMessage(provider)
|
|
795
|
+
? formatBillingErrorMessage(activeErrorContext.provider, activeErrorContext.model)
|
|
738
796
|
: authFailure
|
|
739
797
|
? "LLM request unauthorized."
|
|
740
798
|
: "LLM request failed.");
|
|
@@ -742,8 +800,8 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
742
800
|
(isTimeoutErrorMessage(message) ? 408 : undefined);
|
|
743
801
|
throw new FailoverError(message, {
|
|
744
802
|
reason: assistantFailoverReason ?? "unknown",
|
|
745
|
-
provider,
|
|
746
|
-
model:
|
|
803
|
+
provider: activeErrorContext.provider,
|
|
804
|
+
model: activeErrorContext.model,
|
|
747
805
|
profileId: lastProfileId,
|
|
748
806
|
status,
|
|
749
807
|
});
|
|
@@ -776,7 +834,8 @@ export async function runEmbeddedPiAgent(params) {
|
|
|
776
834
|
lastToolError: attempt.lastToolError,
|
|
777
835
|
config: params.config,
|
|
778
836
|
sessionKey: params.sessionKey ?? params.sessionId,
|
|
779
|
-
provider,
|
|
837
|
+
provider: activeErrorContext.provider,
|
|
838
|
+
model: activeErrorContext.model,
|
|
780
839
|
verboseLevel: params.verboseLevel,
|
|
781
840
|
reasoningLevel: params.reasoningLevel,
|
|
782
841
|
toolResultFormat: resolvedToolResultFormat,
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export function makeAttemptResult(overrides = {}) {
|
|
2
|
+
return {
|
|
3
|
+
aborted: false,
|
|
4
|
+
timedOut: false,
|
|
5
|
+
timedOutDuringCompaction: false,
|
|
6
|
+
promptError: null,
|
|
7
|
+
sessionIdUsed: "test-session",
|
|
8
|
+
assistantTexts: ["Hello!"],
|
|
9
|
+
toolMetas: [],
|
|
10
|
+
lastAssistant: undefined,
|
|
11
|
+
messagesSnapshot: [],
|
|
12
|
+
didSendViaMessagingTool: false,
|
|
13
|
+
messagingToolSentTexts: [],
|
|
14
|
+
messagingToolSentMediaUrls: [],
|
|
15
|
+
messagingToolSentTargets: [],
|
|
16
|
+
cloudCodeAssistFormatError: false,
|
|
17
|
+
...overrides,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
export function mockOverflowRetrySuccess(params) {
|
|
21
|
+
const overflowError = new Error(params.overflowMessage ?? "request_too_large: Request size exceeds model context window");
|
|
22
|
+
params.runEmbeddedAttempt.mockResolvedValueOnce(makeAttemptResult({ promptError: overflowError }));
|
|
23
|
+
params.runEmbeddedAttempt.mockResolvedValueOnce(makeAttemptResult({ promptError: null }));
|
|
24
|
+
params.compactDirect.mockResolvedValueOnce({
|
|
25
|
+
ok: true,
|
|
26
|
+
compacted: true,
|
|
27
|
+
result: {
|
|
28
|
+
summary: "Compacted session",
|
|
29
|
+
firstKeptEntryId: "entry-5",
|
|
30
|
+
tokensBefore: 150000,
|
|
31
|
+
},
|
|
32
|
+
});
|
|
33
|
+
return overflowError;
|
|
34
|
+
}
|
|
@@ -1,4 +1,13 @@
|
|
|
1
1
|
import { vi } from "vitest";
|
|
2
|
+
export const mockedGlobalHookRunner = {
|
|
3
|
+
hasHooks: vi.fn((_hookName) => false),
|
|
4
|
+
runBeforeAgentStart: vi.fn(async (_event, _ctx) => undefined),
|
|
5
|
+
runBeforePromptBuild: vi.fn(async (_event, _ctx) => undefined),
|
|
6
|
+
runBeforeModelResolve: vi.fn(async (_event, _ctx) => undefined),
|
|
7
|
+
};
|
|
8
|
+
vi.mock("../../plugins/hook-runner-global.js", () => ({
|
|
9
|
+
getGlobalHookRunner: vi.fn(() => mockedGlobalHookRunner),
|
|
10
|
+
}));
|
|
2
11
|
vi.mock("../auth-profiles.js", () => ({
|
|
3
12
|
isProfileInCooldown: vi.fn(() => false),
|
|
4
13
|
markAuthProfileFailure: vi.fn(async () => { }),
|
|
@@ -78,7 +87,7 @@ vi.mock("../model-auth.js", () => ({
|
|
|
78
87
|
resolveAuthProfileOrder: vi.fn(() => []),
|
|
79
88
|
}));
|
|
80
89
|
vi.mock("../models-config.js", () => ({
|
|
81
|
-
|
|
90
|
+
ensurePoolBotModelsJson: vi.fn(async () => { }),
|
|
82
91
|
}));
|
|
83
92
|
vi.mock("../context-window-guard.js", () => ({
|
|
84
93
|
CONTEXT_WINDOW_HARD_MIN_TOKENS: 1000,
|
|
@@ -101,7 +110,7 @@ vi.mock("../../utils/message-channel.js", () => ({
|
|
|
101
110
|
isMarkdownCapableMessageChannel: vi.fn(() => true),
|
|
102
111
|
}));
|
|
103
112
|
vi.mock("../agent-paths.js", () => ({
|
|
104
|
-
|
|
113
|
+
resolvePoolBotAgentDir: vi.fn(() => "/tmp/agent-dir"),
|
|
105
114
|
}));
|
|
106
115
|
vi.mock("../defaults.js", () => ({
|
|
107
116
|
DEFAULT_CONTEXT_TOKENS: 200000,
|