@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,7 +1,7 @@
|
|
|
1
1
|
import { resolveGatewayLogPaths } from "../../daemon/launchd.js";
|
|
2
2
|
import { formatPortDiagnostics } from "../../infra/ports.js";
|
|
3
3
|
import { summarizeRestartSentinel, } from "../../infra/restart-sentinel.js";
|
|
4
|
-
import {
|
|
4
|
+
import { formatTimeAgo, redactSecrets } from "./format.js";
|
|
5
5
|
import { readFileTailLines, summarizeLogTail } from "./gateway.js";
|
|
6
6
|
export async function appendStatusAllDiagnosis(params) {
|
|
7
7
|
const { lines, muted, ok, warn, fail } = params;
|
|
@@ -11,7 +11,7 @@ export async function appendStatusAllDiagnosis(params) {
|
|
|
11
11
|
lines.push(`${icon} ${colored}`);
|
|
12
12
|
};
|
|
13
13
|
lines.push("");
|
|
14
|
-
lines.push(
|
|
14
|
+
lines.push(muted("Gateway connection details:"));
|
|
15
15
|
for (const line of redactSecrets(params.connectionDetailsForReport)
|
|
16
16
|
.split("\n")
|
|
17
17
|
.map((l) => l.trimEnd())) {
|
|
@@ -40,7 +40,7 @@ export async function appendStatusAllDiagnosis(params) {
|
|
|
40
40
|
}
|
|
41
41
|
if (params.sentinel?.payload) {
|
|
42
42
|
emitCheck("Restart sentinel present", "warn");
|
|
43
|
-
lines.push(` ${muted(`${summarizeRestartSentinel(params.sentinel.payload)} · ${
|
|
43
|
+
lines.push(` ${muted(`${summarizeRestartSentinel(params.sentinel.payload)} · ${formatTimeAgo(Date.now() - params.sentinel.payload.ts)}`)}`);
|
|
44
44
|
}
|
|
45
45
|
else {
|
|
46
46
|
emitCheck("Restart sentinel: none", "ok");
|
|
@@ -49,7 +49,7 @@ export async function appendStatusAllDiagnosis(params) {
|
|
|
49
49
|
const isTrivialLastErr = lastErrClean.length < 8 || lastErrClean === "}" || lastErrClean === "{";
|
|
50
50
|
if (lastErrClean && !isTrivialLastErr) {
|
|
51
51
|
lines.push("");
|
|
52
|
-
lines.push(
|
|
52
|
+
lines.push(muted("Gateway last log line:"));
|
|
53
53
|
lines.push(` ${muted(redactSecrets(lastErrClean))}`);
|
|
54
54
|
}
|
|
55
55
|
if (params.portUsage) {
|
|
@@ -101,7 +101,7 @@ export async function appendStatusAllDiagnosis(params) {
|
|
|
101
101
|
]);
|
|
102
102
|
if (stderrTail.length > 0 || stdoutTail.length > 0) {
|
|
103
103
|
lines.push("");
|
|
104
|
-
lines.push(
|
|
104
|
+
lines.push(muted(`Gateway logs (tail, summarized): ${logPaths.logDir}`));
|
|
105
105
|
lines.push(` ${muted(`# stderr: ${logPaths.stderrPath}`)}`);
|
|
106
106
|
for (const line of summarizeLogTail(stderrTail, { maxLines: 22 }).map(redactSecrets)) {
|
|
107
107
|
lines.push(` ${muted(line)}`);
|
|
@@ -127,16 +127,20 @@ export async function appendStatusAllDiagnosis(params) {
|
|
|
127
127
|
emitCheck(`Channel issues skipped (gateway ${params.gatewayReachable ? "query failed" : "unreachable"})`, "warn");
|
|
128
128
|
}
|
|
129
129
|
const healthErr = (() => {
|
|
130
|
-
if (!params.health || typeof params.health !== "object")
|
|
130
|
+
if (!params.health || typeof params.health !== "object") {
|
|
131
131
|
return "";
|
|
132
|
+
}
|
|
132
133
|
const record = params.health;
|
|
133
|
-
if (!("error" in record))
|
|
134
|
+
if (!("error" in record)) {
|
|
134
135
|
return "";
|
|
136
|
+
}
|
|
135
137
|
const value = record.error;
|
|
136
|
-
if (!value)
|
|
138
|
+
if (!value) {
|
|
137
139
|
return "";
|
|
138
|
-
|
|
140
|
+
}
|
|
141
|
+
if (typeof value === "string") {
|
|
139
142
|
return value;
|
|
143
|
+
}
|
|
140
144
|
try {
|
|
141
145
|
return JSON.stringify(value, null, 2);
|
|
142
146
|
}
|
|
@@ -146,7 +150,7 @@ export async function appendStatusAllDiagnosis(params) {
|
|
|
146
150
|
})();
|
|
147
151
|
if (healthErr) {
|
|
148
152
|
lines.push("");
|
|
149
|
-
lines.push(
|
|
153
|
+
lines.push(muted("Gateway health:"));
|
|
150
154
|
lines.push(` ${muted(redactSecrets(healthErr))}`);
|
|
151
155
|
}
|
|
152
156
|
lines.push("");
|
|
@@ -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,38 +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
|
+
}
|
|
53
|
+
export function isRestartEnabled(config) {
|
|
54
|
+
return getOwnCommandFlagValue(config, "restart") !== false;
|
|
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/config.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { createConfigIO, loadConfig, parseConfigJson5, readConfigFileSnapshot, resolveConfigSnapshotHash, writeConfigFile, } from "./io.js";
|
|
1
|
+
export { createConfigIO, loadConfig, parseConfigJson5, readConfigFileSnapshot, readConfigFileSnapshotForWrite, resolveConfigSnapshotHash, writeConfigFile, } from "./io.js";
|
|
2
2
|
export { migrateLegacyConfig } from "./legacy-migrate.js";
|
|
3
3
|
export * from "./paths.js";
|
|
4
4
|
export * from "./runtime-overrides.js";
|
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
|
+
}
|
|
@@ -21,6 +21,7 @@
|
|
|
21
21
|
*/
|
|
22
22
|
// Pattern for valid uppercase env var names: starts with letter or underscore,
|
|
23
23
|
// followed by letters, numbers, or underscores (all uppercase)
|
|
24
|
+
import { isPlainObject } from "../utils.js";
|
|
24
25
|
const ENV_VAR_NAME_PATTERN = /^[A-Z_][A-Z0-9_]*$/;
|
|
25
26
|
export class MissingEnvVarError extends Error {
|
|
26
27
|
varName;
|
|
@@ -32,11 +33,35 @@ export class MissingEnvVarError extends Error {
|
|
|
32
33
|
this.name = "MissingEnvVarError";
|
|
33
34
|
}
|
|
34
35
|
}
|
|
35
|
-
function
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
36
|
+
function parseEnvTokenAt(value, index) {
|
|
37
|
+
if (value[index] !== "$") {
|
|
38
|
+
return null;
|
|
39
|
+
}
|
|
40
|
+
const next = value[index + 1];
|
|
41
|
+
const afterNext = value[index + 2];
|
|
42
|
+
// Escaped: $${VAR} -> ${VAR}
|
|
43
|
+
if (next === "$" && afterNext === "{") {
|
|
44
|
+
const start = index + 3;
|
|
45
|
+
const end = value.indexOf("}", start);
|
|
46
|
+
if (end !== -1) {
|
|
47
|
+
const name = value.slice(start, end);
|
|
48
|
+
if (ENV_VAR_NAME_PATTERN.test(name)) {
|
|
49
|
+
return { kind: "escaped", name, end };
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// Substitution: ${VAR} -> value
|
|
54
|
+
if (next === "{") {
|
|
55
|
+
const start = index + 2;
|
|
56
|
+
const end = value.indexOf("}", start);
|
|
57
|
+
if (end !== -1) {
|
|
58
|
+
const name = value.slice(start, end);
|
|
59
|
+
if (ENV_VAR_NAME_PATTERN.test(name)) {
|
|
60
|
+
return { kind: "substitution", name, end };
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
return null;
|
|
40
65
|
}
|
|
41
66
|
function substituteString(value, env, configPath) {
|
|
42
67
|
if (!value.includes("$")) {
|
|
@@ -49,43 +74,46 @@ function substituteString(value, env, configPath) {
|
|
|
49
74
|
chunks.push(char);
|
|
50
75
|
continue;
|
|
51
76
|
}
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
const end = value.indexOf("}", start);
|
|
58
|
-
if (end !== -1) {
|
|
59
|
-
const name = value.slice(start, end);
|
|
60
|
-
if (ENV_VAR_NAME_PATTERN.test(name)) {
|
|
61
|
-
chunks.push(`\${${name}}`);
|
|
62
|
-
i = end;
|
|
63
|
-
continue;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
77
|
+
const token = parseEnvTokenAt(value, i);
|
|
78
|
+
if (token?.kind === "escaped") {
|
|
79
|
+
chunks.push(`\${${token.name}}`);
|
|
80
|
+
i = token.end;
|
|
81
|
+
continue;
|
|
66
82
|
}
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
if (end !== -1) {
|
|
72
|
-
const name = value.slice(start, end);
|
|
73
|
-
if (ENV_VAR_NAME_PATTERN.test(name)) {
|
|
74
|
-
const envValue = env[name];
|
|
75
|
-
if (envValue === undefined || envValue === "") {
|
|
76
|
-
throw new MissingEnvVarError(name, configPath);
|
|
77
|
-
}
|
|
78
|
-
chunks.push(envValue);
|
|
79
|
-
i = end;
|
|
80
|
-
continue;
|
|
81
|
-
}
|
|
83
|
+
if (token?.kind === "substitution") {
|
|
84
|
+
const envValue = env[token.name];
|
|
85
|
+
if (envValue === undefined || envValue === "") {
|
|
86
|
+
throw new MissingEnvVarError(token.name, configPath);
|
|
82
87
|
}
|
|
88
|
+
chunks.push(envValue);
|
|
89
|
+
i = token.end;
|
|
90
|
+
continue;
|
|
83
91
|
}
|
|
84
92
|
// Leave untouched if not a recognized pattern
|
|
85
93
|
chunks.push(char);
|
|
86
94
|
}
|
|
87
95
|
return chunks.join("");
|
|
88
96
|
}
|
|
97
|
+
export function containsEnvVarReference(value) {
|
|
98
|
+
if (!value.includes("$")) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
for (let i = 0; i < value.length; i += 1) {
|
|
102
|
+
const char = value[i];
|
|
103
|
+
if (char !== "$") {
|
|
104
|
+
continue;
|
|
105
|
+
}
|
|
106
|
+
const token = parseEnvTokenAt(value, i);
|
|
107
|
+
if (token?.kind === "escaped") {
|
|
108
|
+
i = token.end;
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
if (token?.kind === "substitution") {
|
|
112
|
+
return true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
89
117
|
function substituteAny(value, env, path) {
|
|
90
118
|
if (typeof value === "string") {
|
|
91
119
|
return substituteString(value, env, path);
|
package/dist/config/env-vars.js
CHANGED
|
@@ -1,21 +1,59 @@
|
|
|
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) {
|
|
9
15
|
continue;
|
|
16
|
+
}
|
|
17
|
+
if (isDangerousHostEnvVarName(key)) {
|
|
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") {
|
|
15
25
|
continue;
|
|
16
|
-
|
|
26
|
+
}
|
|
27
|
+
if (typeof value !== "string" || !value.trim()) {
|
|
28
|
+
continue;
|
|
29
|
+
}
|
|
30
|
+
const key = normalizeEnvVarKey(rawKey, { portable: true });
|
|
31
|
+
if (!key) {
|
|
32
|
+
continue;
|
|
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
|
+
}
|
|
51
|
+
export function applyConfigEnvVars(cfg, env = process.env) {
|
|
52
|
+
const entries = collectConfigRuntimeEnvVars(cfg);
|
|
53
|
+
for (const [key, value] of Object.entries(entries)) {
|
|
54
|
+
if (env[key]?.trim()) {
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
env[key] = value;
|
|
58
|
+
}
|
|
59
|
+
}
|