@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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
export { pickGatewaySelfPresence } from "./gateway-presence.js";
|
|
1
2
|
export function resolveGatewayProbeAuth(cfg) {
|
|
2
3
|
const isRemoteMode = cfg.gateway?.mode === "remote";
|
|
3
4
|
const remote = isRemoteMode ? cfg.gateway?.remote : undefined;
|
|
@@ -8,10 +9,8 @@ export function resolveGatewayProbeAuth(cfg) {
|
|
|
8
9
|
? remote.token.trim()
|
|
9
10
|
: undefined
|
|
10
11
|
: process.env.POOLBOT_GATEWAY_TOKEN?.trim() ||
|
|
11
|
-
process.env.CLAWDBOT_GATEWAY_TOKEN?.trim() ||
|
|
12
12
|
(typeof authToken === "string" && authToken.trim().length > 0 ? authToken.trim() : undefined);
|
|
13
13
|
const password = process.env.POOLBOT_GATEWAY_PASSWORD?.trim() ||
|
|
14
|
-
process.env.CLAWDBOT_GATEWAY_PASSWORD?.trim() ||
|
|
15
14
|
(isRemoteMode
|
|
16
15
|
? typeof remote?.password === "string" && remote.password.trim().length > 0
|
|
17
16
|
? remote.password.trim()
|
|
@@ -21,17 +20,3 @@ export function resolveGatewayProbeAuth(cfg) {
|
|
|
21
20
|
: undefined);
|
|
22
21
|
return { token, password };
|
|
23
22
|
}
|
|
24
|
-
export function pickGatewaySelfPresence(presence) {
|
|
25
|
-
if (!Array.isArray(presence))
|
|
26
|
-
return null;
|
|
27
|
-
const entries = presence;
|
|
28
|
-
const self = entries.find((e) => e.mode === "gateway" && e.reason === "self") ?? null;
|
|
29
|
-
if (!self)
|
|
30
|
-
return null;
|
|
31
|
-
return {
|
|
32
|
-
host: typeof self.host === "string" ? self.host : undefined,
|
|
33
|
-
ip: typeof self.ip === "string" ? self.ip : undefined,
|
|
34
|
-
version: typeof self.version === "string" ? self.version : undefined,
|
|
35
|
-
platform: typeof self.platform === "string" ? self.platform : undefined,
|
|
36
|
-
};
|
|
37
|
-
}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { enableSystemdUserLinger, isSystemdUserServiceAvailable, readSystemdUserLingerStatus, } from "../daemon/systemd.js";
|
|
2
2
|
import { note } from "../terminal/note.js";
|
|
3
3
|
export async function ensureSystemdUserLingerInteractive(params) {
|
|
4
|
-
if (process.platform !== "linux")
|
|
4
|
+
if (process.platform !== "linux") {
|
|
5
5
|
return;
|
|
6
|
-
|
|
6
|
+
}
|
|
7
|
+
if (params.prompt === false) {
|
|
7
8
|
return;
|
|
9
|
+
}
|
|
8
10
|
const env = params.env ?? process.env;
|
|
9
11
|
const prompter = params.prompter ?? { note };
|
|
10
12
|
const title = params.title ?? "Systemd";
|
|
@@ -17,8 +19,9 @@ export async function ensureSystemdUserLingerInteractive(params) {
|
|
|
17
19
|
await prompter.note("Unable to read loginctl linger status. Ensure systemd + loginctl are available.", title);
|
|
18
20
|
return;
|
|
19
21
|
}
|
|
20
|
-
if (status.linger === "yes")
|
|
22
|
+
if (status.linger === "yes") {
|
|
21
23
|
return;
|
|
24
|
+
}
|
|
22
25
|
const reason = params.reason ??
|
|
23
26
|
"Systemd user services stop when you log out or go idle, which kills the Gateway.";
|
|
24
27
|
const actionNote = params.requireConfirm
|
|
@@ -56,14 +59,17 @@ export async function ensureSystemdUserLingerInteractive(params) {
|
|
|
56
59
|
await prompter.note(`Run manually: sudo loginctl enable-linger ${status.user}`, title);
|
|
57
60
|
}
|
|
58
61
|
export async function ensureSystemdUserLingerNonInteractive(params) {
|
|
59
|
-
if (process.platform !== "linux")
|
|
62
|
+
if (process.platform !== "linux") {
|
|
60
63
|
return;
|
|
64
|
+
}
|
|
61
65
|
const env = params.env ?? process.env;
|
|
62
|
-
if (!(await isSystemdUserServiceAvailable()))
|
|
66
|
+
if (!(await isSystemdUserServiceAvailable())) {
|
|
63
67
|
return;
|
|
68
|
+
}
|
|
64
69
|
const status = await readSystemdUserLingerStatus(env);
|
|
65
|
-
if (!status || status.linger === "yes")
|
|
70
|
+
if (!status || status.linger === "yes") {
|
|
66
71
|
return;
|
|
72
|
+
}
|
|
67
73
|
const result = await enableSystemdUserLinger({
|
|
68
74
|
env,
|
|
69
75
|
user: status.user,
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
export const DEFAULT_AGENT_MAX_CONCURRENT = 4;
|
|
2
2
|
export const DEFAULT_SUBAGENT_MAX_CONCURRENT = 8;
|
|
3
|
+
// Keep depth-1 subagents as leaves unless config explicitly opts into nesting.
|
|
4
|
+
export const DEFAULT_SUBAGENT_MAX_SPAWN_DEPTH = 1;
|
|
3
5
|
export function resolveAgentMaxConcurrent(cfg) {
|
|
4
6
|
const raw = cfg?.agents?.defaults?.maxConcurrent;
|
|
5
7
|
if (typeof raw === "number" && Number.isFinite(raw)) {
|
package/dist/config/commands.js
CHANGED
|
@@ -1,41 +1,55 @@
|
|
|
1
1
|
import { normalizeChannelId } from "../channels/plugins/index.js";
|
|
2
|
+
import { isPlainObject } from "../infra/plain-object.js";
|
|
2
3
|
function resolveAutoDefault(providerId) {
|
|
3
4
|
const id = normalizeChannelId(providerId);
|
|
4
|
-
if (!id)
|
|
5
|
+
if (!id) {
|
|
5
6
|
return false;
|
|
6
|
-
|
|
7
|
+
}
|
|
8
|
+
if (id === "discord" || id === "telegram") {
|
|
7
9
|
return true;
|
|
8
|
-
|
|
10
|
+
}
|
|
11
|
+
if (id === "slack") {
|
|
9
12
|
return false;
|
|
13
|
+
}
|
|
10
14
|
return false;
|
|
11
15
|
}
|
|
12
16
|
export function resolveNativeSkillsEnabled(params) {
|
|
13
|
-
|
|
14
|
-
const setting = providerSetting === undefined ? globalSetting : providerSetting;
|
|
15
|
-
if (setting === true)
|
|
16
|
-
return true;
|
|
17
|
-
if (setting === false)
|
|
18
|
-
return false;
|
|
19
|
-
return resolveAutoDefault(providerId);
|
|
17
|
+
return resolveNativeCommandSetting(params);
|
|
20
18
|
}
|
|
21
19
|
export function resolveNativeCommandsEnabled(params) {
|
|
20
|
+
return resolveNativeCommandSetting(params);
|
|
21
|
+
}
|
|
22
|
+
function resolveNativeCommandSetting(params) {
|
|
22
23
|
const { providerId, providerSetting, globalSetting } = params;
|
|
23
24
|
const setting = providerSetting === undefined ? globalSetting : providerSetting;
|
|
24
|
-
if (setting === true)
|
|
25
|
+
if (setting === true) {
|
|
25
26
|
return true;
|
|
26
|
-
|
|
27
|
+
}
|
|
28
|
+
if (setting === false) {
|
|
27
29
|
return false;
|
|
28
|
-
|
|
30
|
+
}
|
|
29
31
|
return resolveAutoDefault(providerId);
|
|
30
32
|
}
|
|
31
33
|
export function isNativeCommandsExplicitlyDisabled(params) {
|
|
32
34
|
const { providerSetting, globalSetting } = params;
|
|
33
|
-
if (providerSetting === false)
|
|
35
|
+
if (providerSetting === false) {
|
|
34
36
|
return true;
|
|
35
|
-
|
|
37
|
+
}
|
|
38
|
+
if (providerSetting === undefined) {
|
|
36
39
|
return globalSetting === false;
|
|
40
|
+
}
|
|
37
41
|
return false;
|
|
38
42
|
}
|
|
43
|
+
function getOwnCommandFlagValue(config, key) {
|
|
44
|
+
const { commands } = config ?? {};
|
|
45
|
+
if (!isPlainObject(commands) || !Object.hasOwn(commands, key)) {
|
|
46
|
+
return undefined;
|
|
47
|
+
}
|
|
48
|
+
return commands[key];
|
|
49
|
+
}
|
|
50
|
+
export function isCommandFlagEnabled(config, key) {
|
|
51
|
+
return getOwnCommandFlagValue(config, key) === true;
|
|
52
|
+
}
|
|
39
53
|
export function isRestartEnabled(config) {
|
|
40
|
-
return config
|
|
54
|
+
return getOwnCommandFlagValue(config, "restart") !== false;
|
|
41
55
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import { isPlainObject } from "../utils.js";
|
|
2
|
+
import { isBlockedObjectKey } from "./prototype-keys.js";
|
|
2
3
|
export function parseConfigPath(raw) {
|
|
3
4
|
const trimmed = raw.trim();
|
|
4
5
|
if (!trimmed) {
|
|
@@ -14,7 +15,7 @@ export function parseConfigPath(raw) {
|
|
|
14
15
|
error: "Invalid path. Use dot notation (e.g. foo.bar).",
|
|
15
16
|
};
|
|
16
17
|
}
|
|
17
|
-
if (parts.some((part) =>
|
|
18
|
+
if (parts.some((part) => isBlockedObjectKey(part))) {
|
|
18
19
|
return { ok: false, error: "Invalid path segment." };
|
|
19
20
|
}
|
|
20
21
|
return { ok: true, path: parts };
|
|
@@ -37,14 +38,16 @@ export function unsetConfigValueAtPath(root, path) {
|
|
|
37
38
|
for (let idx = 0; idx < path.length - 1; idx += 1) {
|
|
38
39
|
const key = path[idx];
|
|
39
40
|
const next = cursor[key];
|
|
40
|
-
if (!isPlainObject(next))
|
|
41
|
+
if (!isPlainObject(next)) {
|
|
41
42
|
return false;
|
|
43
|
+
}
|
|
42
44
|
stack.push({ node: cursor, key });
|
|
43
45
|
cursor = next;
|
|
44
46
|
}
|
|
45
47
|
const leafKey = path[path.length - 1];
|
|
46
|
-
if (!(leafKey in cursor))
|
|
48
|
+
if (!(leafKey in cursor)) {
|
|
47
49
|
return false;
|
|
50
|
+
}
|
|
48
51
|
delete cursor[leafKey];
|
|
49
52
|
for (let idx = stack.length - 1; idx >= 0; idx -= 1) {
|
|
50
53
|
const { node, key } = stack[idx];
|
|
@@ -61,15 +64,10 @@ export function unsetConfigValueAtPath(root, path) {
|
|
|
61
64
|
export function getConfigValueAtPath(root, path) {
|
|
62
65
|
let cursor = root;
|
|
63
66
|
for (const key of path) {
|
|
64
|
-
if (!isPlainObject(cursor))
|
|
67
|
+
if (!isPlainObject(cursor)) {
|
|
65
68
|
return undefined;
|
|
69
|
+
}
|
|
66
70
|
cursor = cursor[key];
|
|
67
71
|
}
|
|
68
72
|
return cursor;
|
|
69
73
|
}
|
|
70
|
-
function isPlainObject(value) {
|
|
71
|
-
return (typeof value === "object" &&
|
|
72
|
-
value !== null &&
|
|
73
|
-
!Array.isArray(value) &&
|
|
74
|
-
Object.prototype.toString.call(value) === "[object Object]");
|
|
75
|
-
}
|
package/dist/config/defaults.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DEFAULT_CONTEXT_TOKENS } from "../agents/defaults.js";
|
|
2
|
-
import { parseModelRef } from "../agents/model-selection.js";
|
|
2
|
+
import { normalizeProviderId, parseModelRef } from "../agents/model-selection.js";
|
|
3
3
|
import { DEFAULT_AGENT_MAX_CONCURRENT, DEFAULT_SUBAGENT_MAX_CONCURRENT } from "./agent-limits.js";
|
|
4
4
|
import { resolveTalkApiKey } from "./talk.js";
|
|
5
5
|
let defaultWarnState = { warned: false };
|
|
@@ -22,6 +22,12 @@ const DEFAULT_MODEL_COST = {
|
|
|
22
22
|
};
|
|
23
23
|
const DEFAULT_MODEL_INPUT = ["text"];
|
|
24
24
|
const DEFAULT_MODEL_MAX_TOKENS = 8192;
|
|
25
|
+
function resolveDefaultProviderApi(providerId, providerApi) {
|
|
26
|
+
if (providerApi) {
|
|
27
|
+
return providerApi;
|
|
28
|
+
}
|
|
29
|
+
return normalizeProviderId(providerId) === "anthropic" ? "anthropic-messages" : undefined;
|
|
30
|
+
}
|
|
25
31
|
function isPositiveNumber(value) {
|
|
26
32
|
return typeof value === "number" && Number.isFinite(value) && value > 0;
|
|
27
33
|
}
|
|
@@ -135,6 +141,12 @@ export function applyModelDefaults(cfg) {
|
|
|
135
141
|
if (!Array.isArray(models) || models.length === 0) {
|
|
136
142
|
continue;
|
|
137
143
|
}
|
|
144
|
+
const providerApi = resolveDefaultProviderApi(providerId, provider.api);
|
|
145
|
+
let nextProvider = provider;
|
|
146
|
+
if (providerApi && provider.api !== providerApi) {
|
|
147
|
+
mutated = true;
|
|
148
|
+
nextProvider = { ...nextProvider, api: providerApi };
|
|
149
|
+
}
|
|
138
150
|
let providerMutated = false;
|
|
139
151
|
const nextModels = models.map((model) => {
|
|
140
152
|
const raw = model;
|
|
@@ -168,6 +180,10 @@ export function applyModelDefaults(cfg) {
|
|
|
168
180
|
if (raw.maxTokens !== maxTokens) {
|
|
169
181
|
modelMutated = true;
|
|
170
182
|
}
|
|
183
|
+
const api = raw.api ?? providerApi;
|
|
184
|
+
if (raw.api !== api) {
|
|
185
|
+
modelMutated = true;
|
|
186
|
+
}
|
|
171
187
|
if (!modelMutated) {
|
|
172
188
|
return model;
|
|
173
189
|
}
|
|
@@ -179,12 +195,16 @@ export function applyModelDefaults(cfg) {
|
|
|
179
195
|
cost,
|
|
180
196
|
contextWindow,
|
|
181
197
|
maxTokens,
|
|
198
|
+
api,
|
|
182
199
|
};
|
|
183
200
|
});
|
|
184
201
|
if (!providerMutated) {
|
|
202
|
+
if (nextProvider !== provider) {
|
|
203
|
+
nextProviders[providerId] = nextProvider;
|
|
204
|
+
}
|
|
185
205
|
continue;
|
|
186
206
|
}
|
|
187
|
-
nextProviders[providerId] = { ...
|
|
207
|
+
nextProviders[providerId] = { ...nextProvider, models: nextModels };
|
|
188
208
|
mutated = true;
|
|
189
209
|
}
|
|
190
210
|
if (mutated) {
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
function normalizeStreamingMode(value) {
|
|
2
|
+
if (typeof value !== "string") {
|
|
3
|
+
return null;
|
|
4
|
+
}
|
|
5
|
+
const normalized = value.trim().toLowerCase();
|
|
6
|
+
return normalized || null;
|
|
7
|
+
}
|
|
8
|
+
export function parseStreamingMode(value) {
|
|
9
|
+
const normalized = normalizeStreamingMode(value);
|
|
10
|
+
if (normalized === "off" ||
|
|
11
|
+
normalized === "partial" ||
|
|
12
|
+
normalized === "block" ||
|
|
13
|
+
normalized === "progress") {
|
|
14
|
+
return normalized;
|
|
15
|
+
}
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
export function parseDiscordPreviewStreamMode(value) {
|
|
19
|
+
const parsed = parseStreamingMode(value);
|
|
20
|
+
if (!parsed) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return parsed === "progress" ? "partial" : parsed;
|
|
24
|
+
}
|
|
25
|
+
export function parseSlackLegacyDraftStreamMode(value) {
|
|
26
|
+
const normalized = normalizeStreamingMode(value);
|
|
27
|
+
if (normalized === "replace" || normalized === "status_final" || normalized === "append") {
|
|
28
|
+
return normalized;
|
|
29
|
+
}
|
|
30
|
+
return null;
|
|
31
|
+
}
|
|
32
|
+
export function mapSlackLegacyDraftStreamModeToStreaming(mode) {
|
|
33
|
+
if (mode === "append") {
|
|
34
|
+
return "block";
|
|
35
|
+
}
|
|
36
|
+
if (mode === "status_final") {
|
|
37
|
+
return "progress";
|
|
38
|
+
}
|
|
39
|
+
return "partial";
|
|
40
|
+
}
|
|
41
|
+
export function mapStreamingModeToSlackLegacyDraftStreamMode(mode) {
|
|
42
|
+
if (mode === "block") {
|
|
43
|
+
return "append";
|
|
44
|
+
}
|
|
45
|
+
if (mode === "progress") {
|
|
46
|
+
return "status_final";
|
|
47
|
+
}
|
|
48
|
+
return "replace";
|
|
49
|
+
}
|
|
50
|
+
export function resolveTelegramPreviewStreamMode(params = {}) {
|
|
51
|
+
const parsedStreaming = parseStreamingMode(params.streaming);
|
|
52
|
+
if (parsedStreaming) {
|
|
53
|
+
if (parsedStreaming === "progress") {
|
|
54
|
+
return "partial";
|
|
55
|
+
}
|
|
56
|
+
return parsedStreaming;
|
|
57
|
+
}
|
|
58
|
+
const legacy = parseDiscordPreviewStreamMode(params.streamMode);
|
|
59
|
+
if (legacy) {
|
|
60
|
+
return legacy;
|
|
61
|
+
}
|
|
62
|
+
if (typeof params.streaming === "boolean") {
|
|
63
|
+
return params.streaming ? "partial" : "off";
|
|
64
|
+
}
|
|
65
|
+
return "off";
|
|
66
|
+
}
|
|
67
|
+
export function resolveDiscordPreviewStreamMode(params = {}) {
|
|
68
|
+
const parsedStreaming = parseDiscordPreviewStreamMode(params.streaming);
|
|
69
|
+
if (parsedStreaming) {
|
|
70
|
+
return parsedStreaming;
|
|
71
|
+
}
|
|
72
|
+
const legacy = parseDiscordPreviewStreamMode(params.streamMode);
|
|
73
|
+
if (legacy) {
|
|
74
|
+
return legacy;
|
|
75
|
+
}
|
|
76
|
+
if (typeof params.streaming === "boolean") {
|
|
77
|
+
return params.streaming ? "partial" : "off";
|
|
78
|
+
}
|
|
79
|
+
return "off";
|
|
80
|
+
}
|
|
81
|
+
export function resolveSlackStreamingMode(params = {}) {
|
|
82
|
+
const parsedStreaming = parseStreamingMode(params.streaming);
|
|
83
|
+
if (parsedStreaming) {
|
|
84
|
+
return parsedStreaming;
|
|
85
|
+
}
|
|
86
|
+
const legacyStreamMode = parseSlackLegacyDraftStreamMode(params.streamMode);
|
|
87
|
+
if (legacyStreamMode) {
|
|
88
|
+
return mapSlackLegacyDraftStreamModeToStreaming(legacyStreamMode);
|
|
89
|
+
}
|
|
90
|
+
// Legacy `streaming` was a Slack native-streaming toggle; preview mode stayed replace.
|
|
91
|
+
if (typeof params.streaming === "boolean") {
|
|
92
|
+
return "partial";
|
|
93
|
+
}
|
|
94
|
+
return "partial";
|
|
95
|
+
}
|
|
96
|
+
export function resolveSlackNativeStreaming(params = {}) {
|
|
97
|
+
if (typeof params.nativeStreaming === "boolean") {
|
|
98
|
+
return params.nativeStreaming;
|
|
99
|
+
}
|
|
100
|
+
if (typeof params.streaming === "boolean") {
|
|
101
|
+
return params.streaming;
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
}
|
package/dist/config/env-vars.js
CHANGED
|
@@ -1,26 +1,55 @@
|
|
|
1
|
-
|
|
1
|
+
import { isDangerousHostEnvVarName, normalizeEnvVarKey } from "../infra/host-env-security.js";
|
|
2
|
+
function collectConfigEnvVarsByTarget(cfg) {
|
|
2
3
|
const envConfig = cfg?.env;
|
|
3
|
-
if (!envConfig)
|
|
4
|
+
if (!envConfig) {
|
|
4
5
|
return {};
|
|
6
|
+
}
|
|
5
7
|
const entries = {};
|
|
6
8
|
if (envConfig.vars) {
|
|
7
|
-
for (const [
|
|
8
|
-
if (!value)
|
|
9
|
+
for (const [rawKey, value] of Object.entries(envConfig.vars)) {
|
|
10
|
+
if (!value) {
|
|
11
|
+
continue;
|
|
12
|
+
}
|
|
13
|
+
const key = normalizeEnvVarKey(rawKey, { portable: true });
|
|
14
|
+
if (!key) {
|
|
15
|
+
continue;
|
|
16
|
+
}
|
|
17
|
+
if (isDangerousHostEnvVarName(key)) {
|
|
9
18
|
continue;
|
|
19
|
+
}
|
|
10
20
|
entries[key] = value;
|
|
11
21
|
}
|
|
12
22
|
}
|
|
13
|
-
for (const [
|
|
14
|
-
if (
|
|
23
|
+
for (const [rawKey, value] of Object.entries(envConfig)) {
|
|
24
|
+
if (rawKey === "shellEnv" || rawKey === "vars") {
|
|
25
|
+
continue;
|
|
26
|
+
}
|
|
27
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const key = normalizeEnvVarKey(rawKey, { portable: true });
|
|
31
|
+
if (!key) {
|
|
15
32
|
continue;
|
|
16
|
-
|
|
33
|
+
}
|
|
34
|
+
if (isDangerousHostEnvVarName(key)) {
|
|
17
35
|
continue;
|
|
36
|
+
}
|
|
18
37
|
entries[key] = value;
|
|
19
38
|
}
|
|
20
39
|
return entries;
|
|
21
40
|
}
|
|
41
|
+
export function collectConfigRuntimeEnvVars(cfg) {
|
|
42
|
+
return collectConfigEnvVarsByTarget(cfg);
|
|
43
|
+
}
|
|
44
|
+
export function collectConfigServiceEnvVars(cfg) {
|
|
45
|
+
return collectConfigEnvVarsByTarget(cfg);
|
|
46
|
+
}
|
|
47
|
+
/** @deprecated Use `collectConfigRuntimeEnvVars` or `collectConfigServiceEnvVars`. */
|
|
48
|
+
export function collectConfigEnvVars(cfg) {
|
|
49
|
+
return collectConfigRuntimeEnvVars(cfg);
|
|
50
|
+
}
|
|
22
51
|
export function applyConfigEnvVars(cfg, env = process.env) {
|
|
23
|
-
const entries =
|
|
52
|
+
const entries = collectConfigRuntimeEnvVars(cfg);
|
|
24
53
|
for (const [key, value] of Object.entries(entries)) {
|
|
25
54
|
if (env[key]?.trim()) {
|
|
26
55
|
continue;
|
package/dist/config/includes.js
CHANGED
|
@@ -14,6 +14,7 @@ import path from "node:path";
|
|
|
14
14
|
import JSON5 from "json5";
|
|
15
15
|
import { isPathInside } from "../security/scan-paths.js";
|
|
16
16
|
import { isPlainObject } from "../utils.js";
|
|
17
|
+
import { isBlockedObjectKey } from "./prototype-keys.js";
|
|
17
18
|
export const INCLUDE_KEY = "$include";
|
|
18
19
|
export const MAX_INCLUDE_DEPTH = 10;
|
|
19
20
|
// ============================================================================
|
|
@@ -48,6 +49,9 @@ export function deepMerge(target, source) {
|
|
|
48
49
|
if (isPlainObject(target) && isPlainObject(source)) {
|
|
49
50
|
const result = { ...target };
|
|
50
51
|
for (const key of Object.keys(source)) {
|
|
52
|
+
if (isBlockedObjectKey(key)) {
|
|
53
|
+
continue;
|
|
54
|
+
}
|
|
51
55
|
result[key] = key in result ? deepMerge(result[key], source[key]) : source[key];
|
|
52
56
|
}
|
|
53
57
|
return result;
|
package/dist/config/io.js
CHANGED
|
@@ -51,6 +51,82 @@ function hashConfigRaw(raw) {
|
|
|
51
51
|
.update(raw ?? "")
|
|
52
52
|
.digest("hex");
|
|
53
53
|
}
|
|
54
|
+
function isNumericPathSegment(raw) {
|
|
55
|
+
return /^[0-9]+$/.test(raw);
|
|
56
|
+
}
|
|
57
|
+
function isWritePlainObject(value) {
|
|
58
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
59
|
+
}
|
|
60
|
+
function unsetPathForWrite(root, pathSegments) {
|
|
61
|
+
if (pathSegments.length === 0) {
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
const traversal = [];
|
|
65
|
+
let cursor = root;
|
|
66
|
+
for (let i = 0; i < pathSegments.length - 1; i += 1) {
|
|
67
|
+
const segment = pathSegments[i];
|
|
68
|
+
if (Array.isArray(cursor)) {
|
|
69
|
+
if (!isNumericPathSegment(segment)) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
const index = Number.parseInt(segment, 10);
|
|
73
|
+
if (!Number.isFinite(index) || index < 0 || index >= cursor.length) {
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
traversal.push({ container: cursor, key: index });
|
|
77
|
+
cursor = cursor[index];
|
|
78
|
+
continue;
|
|
79
|
+
}
|
|
80
|
+
if (!isWritePlainObject(cursor) || !(segment in cursor)) {
|
|
81
|
+
return false;
|
|
82
|
+
}
|
|
83
|
+
traversal.push({ container: cursor, key: segment });
|
|
84
|
+
cursor = cursor[segment];
|
|
85
|
+
}
|
|
86
|
+
const leaf = pathSegments[pathSegments.length - 1];
|
|
87
|
+
if (Array.isArray(cursor)) {
|
|
88
|
+
if (!isNumericPathSegment(leaf)) {
|
|
89
|
+
return false;
|
|
90
|
+
}
|
|
91
|
+
const index = Number.parseInt(leaf, 10);
|
|
92
|
+
if (!Number.isFinite(index) || index < 0 || index >= cursor.length) {
|
|
93
|
+
return false;
|
|
94
|
+
}
|
|
95
|
+
cursor.splice(index, 1);
|
|
96
|
+
}
|
|
97
|
+
else {
|
|
98
|
+
if (!isWritePlainObject(cursor) || !(leaf in cursor)) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
delete cursor[leaf];
|
|
102
|
+
}
|
|
103
|
+
// Prune now-empty object branches after unsetting to avoid dead config scaffolding.
|
|
104
|
+
for (let i = traversal.length - 1; i >= 0; i -= 1) {
|
|
105
|
+
const { container, key } = traversal[i];
|
|
106
|
+
let child;
|
|
107
|
+
if (Array.isArray(container)) {
|
|
108
|
+
child = typeof key === "number" ? container[key] : undefined;
|
|
109
|
+
}
|
|
110
|
+
else if (isWritePlainObject(container)) {
|
|
111
|
+
child = container[String(key)];
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
break;
|
|
115
|
+
}
|
|
116
|
+
if (!isWritePlainObject(child) || Object.keys(child).length > 0) {
|
|
117
|
+
break;
|
|
118
|
+
}
|
|
119
|
+
if (Array.isArray(container) && typeof key === "number") {
|
|
120
|
+
if (key >= 0 && key < container.length) {
|
|
121
|
+
container.splice(key, 1);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
else if (isWritePlainObject(container)) {
|
|
125
|
+
delete container[String(key)];
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
return true;
|
|
129
|
+
}
|
|
54
130
|
export function resolveConfigSnapshotHash(snapshot) {
|
|
55
131
|
if (typeof snapshot.hash === "string") {
|
|
56
132
|
const trimmed = snapshot.hash.trim();
|
|
@@ -683,6 +759,14 @@ export function createConfigIO(overrides = {}) {
|
|
|
683
759
|
const outputConfig = envRefMap && changedPaths
|
|
684
760
|
? restoreEnvRefsFromMap(cfgToWrite, "", envRefMap, changedPaths)
|
|
685
761
|
: cfgToWrite;
|
|
762
|
+
if (options.unsetPaths?.length) {
|
|
763
|
+
for (const unsetPath of options.unsetPaths) {
|
|
764
|
+
if (!Array.isArray(unsetPath) || unsetPath.length === 0) {
|
|
765
|
+
continue;
|
|
766
|
+
}
|
|
767
|
+
unsetPathForWrite(outputConfig, unsetPath);
|
|
768
|
+
}
|
|
769
|
+
}
|
|
686
770
|
// Do NOT apply runtime defaults when writing — user config should only contain
|
|
687
771
|
// explicitly set values. Runtime defaults are applied when loading (issue #6070).
|
|
688
772
|
const stampedOutputConfig = stampConfigVersion(outputConfig);
|
|
@@ -709,7 +793,7 @@ export function createConfigIO(overrides = {}) {
|
|
|
709
793
|
return;
|
|
710
794
|
}
|
|
711
795
|
const isVitest = deps.env.VITEST === "true";
|
|
712
|
-
const shouldLogInVitest = deps.env.
|
|
796
|
+
const shouldLogInVitest = deps.env.POOLBOT_TEST_CONFIG_OVERWRITE_LOG === "1";
|
|
713
797
|
if (isVitest && !shouldLogInVitest) {
|
|
714
798
|
return;
|
|
715
799
|
}
|
|
@@ -722,7 +806,7 @@ export function createConfigIO(overrides = {}) {
|
|
|
722
806
|
}
|
|
723
807
|
// Tests often write minimal configs (missing meta, etc); keep output quiet unless requested.
|
|
724
808
|
const isVitest = deps.env.VITEST === "true";
|
|
725
|
-
const shouldLogInVitest = deps.env.
|
|
809
|
+
const shouldLogInVitest = deps.env.POOLBOT_TEST_CONFIG_WRITE_ANOMALY_LOG === "1";
|
|
726
810
|
if (isVitest && !shouldLogInVitest) {
|
|
727
811
|
return;
|
|
728
812
|
}
|
|
@@ -738,14 +822,14 @@ export function createConfigIO(overrides = {}) {
|
|
|
738
822
|
cwd: process.cwd(),
|
|
739
823
|
argv: process.argv.slice(0, 8),
|
|
740
824
|
execArgv: process.execArgv.slice(0, 8),
|
|
741
|
-
watchMode: deps.env.
|
|
742
|
-
watchSession: typeof deps.env.
|
|
743
|
-
deps.env.
|
|
744
|
-
? deps.env.
|
|
825
|
+
watchMode: deps.env.POOLBOT_WATCH_MODE === "1",
|
|
826
|
+
watchSession: typeof deps.env.POOLBOT_WATCH_SESSION === "string" &&
|
|
827
|
+
deps.env.POOLBOT_WATCH_SESSION.trim().length > 0
|
|
828
|
+
? deps.env.POOLBOT_WATCH_SESSION.trim()
|
|
745
829
|
: null,
|
|
746
|
-
watchCommand: typeof deps.env.
|
|
747
|
-
deps.env.
|
|
748
|
-
? deps.env.
|
|
830
|
+
watchCommand: typeof deps.env.POOLBOT_WATCH_COMMAND === "string" &&
|
|
831
|
+
deps.env.POOLBOT_WATCH_COMMAND.trim().length > 0
|
|
832
|
+
? deps.env.POOLBOT_WATCH_COMMAND.trim()
|
|
749
833
|
: null,
|
|
750
834
|
existsBefore: snapshot.exists,
|
|
751
835
|
previousHash: previousHash ?? null,
|
|
@@ -829,12 +913,12 @@ export function createConfigIO(overrides = {}) {
|
|
|
829
913
|
};
|
|
830
914
|
}
|
|
831
915
|
// NOTE: These wrappers intentionally do *not* cache the resolved config path at
|
|
832
|
-
// module scope. `
|
|
916
|
+
// module scope. `POOLBOT_CONFIG_PATH` (and friends) are expected to work even
|
|
833
917
|
// when set after the module has been imported (tests, one-off scripts, etc.).
|
|
834
918
|
const DEFAULT_CONFIG_CACHE_MS = 200;
|
|
835
919
|
let configCache = null;
|
|
836
920
|
function resolveConfigCacheMs(env) {
|
|
837
|
-
const raw = env.
|
|
921
|
+
const raw = env.POOLBOT_CONFIG_CACHE_MS?.trim();
|
|
838
922
|
if (raw === "" || raw === "0") {
|
|
839
923
|
return 0;
|
|
840
924
|
}
|
|
@@ -848,7 +932,7 @@ function resolveConfigCacheMs(env) {
|
|
|
848
932
|
return Math.max(0, parsed);
|
|
849
933
|
}
|
|
850
934
|
function shouldUseConfigCache(env) {
|
|
851
|
-
if (env.
|
|
935
|
+
if (env.POOLBOT_DISABLE_CONFIG_CACHE?.trim()) {
|
|
852
936
|
return false;
|
|
853
937
|
}
|
|
854
938
|
return resolveConfigCacheMs(env) > 0;
|
|
@@ -890,5 +974,6 @@ export async function writeConfigFile(cfg, options = {}) {
|
|
|
890
974
|
const sameConfigPath = options.expectedConfigPath === undefined || options.expectedConfigPath === io.configPath;
|
|
891
975
|
await io.writeConfigFile(cfg, {
|
|
892
976
|
envSnapshotForRestore: sameConfigPath ? options.envSnapshotForRestore : undefined,
|
|
977
|
+
unsetPaths: options.unsetPaths,
|
|
893
978
|
});
|
|
894
979
|
}
|