@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
package/dist/infra/shell-env.js
CHANGED
|
@@ -1,26 +1,100 @@
|
|
|
1
1
|
import { execFileSync } from "node:child_process";
|
|
2
|
+
import fs from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
2
4
|
import { isTruthyEnvValue } from "./env.js";
|
|
3
5
|
const DEFAULT_TIMEOUT_MS = 15_000;
|
|
4
6
|
const DEFAULT_MAX_BUFFER_BYTES = 2 * 1024 * 1024;
|
|
7
|
+
const DEFAULT_SHELL = "/bin/sh";
|
|
8
|
+
const TRUSTED_SHELL_PREFIXES = [
|
|
9
|
+
"/bin/",
|
|
10
|
+
"/usr/bin/",
|
|
11
|
+
"/usr/local/bin/",
|
|
12
|
+
"/opt/homebrew/bin/",
|
|
13
|
+
"/run/current-system/sw/bin/",
|
|
14
|
+
];
|
|
5
15
|
let lastAppliedKeys = [];
|
|
6
16
|
let cachedShellPath;
|
|
17
|
+
let cachedEtcShells;
|
|
18
|
+
function resolveTimeoutMs(timeoutMs) {
|
|
19
|
+
if (typeof timeoutMs !== "number" || !Number.isFinite(timeoutMs)) {
|
|
20
|
+
return DEFAULT_TIMEOUT_MS;
|
|
21
|
+
}
|
|
22
|
+
return Math.max(0, timeoutMs);
|
|
23
|
+
}
|
|
24
|
+
function readEtcShells() {
|
|
25
|
+
if (cachedEtcShells !== undefined) {
|
|
26
|
+
return cachedEtcShells;
|
|
27
|
+
}
|
|
28
|
+
try {
|
|
29
|
+
const raw = fs.readFileSync("/etc/shells", "utf8");
|
|
30
|
+
const entries = raw
|
|
31
|
+
.split(/\r?\n/)
|
|
32
|
+
.map((line) => line.trim())
|
|
33
|
+
.filter((line) => line.length > 0 && !line.startsWith("#") && path.isAbsolute(line));
|
|
34
|
+
cachedEtcShells = new Set(entries);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
cachedEtcShells = null;
|
|
38
|
+
}
|
|
39
|
+
return cachedEtcShells;
|
|
40
|
+
}
|
|
41
|
+
function isTrustedShellPath(shell) {
|
|
42
|
+
if (!path.isAbsolute(shell)) {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
const normalized = path.normalize(shell);
|
|
46
|
+
if (normalized !== shell) {
|
|
47
|
+
return false;
|
|
48
|
+
}
|
|
49
|
+
// Primary trust anchor: shell registered in /etc/shells.
|
|
50
|
+
const registeredShells = readEtcShells();
|
|
51
|
+
if (registeredShells?.has(shell)) {
|
|
52
|
+
return true;
|
|
53
|
+
}
|
|
54
|
+
// Fallback for environments where /etc/shells is incomplete/unavailable.
|
|
55
|
+
if (!TRUSTED_SHELL_PREFIXES.some((prefix) => shell.startsWith(prefix))) {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
fs.accessSync(shell, fs.constants.X_OK);
|
|
60
|
+
return true;
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return false;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
7
66
|
function resolveShell(env) {
|
|
8
67
|
const shell = env.SHELL?.trim();
|
|
9
|
-
|
|
68
|
+
if (shell && isTrustedShellPath(shell)) {
|
|
69
|
+
return shell;
|
|
70
|
+
}
|
|
71
|
+
return DEFAULT_SHELL;
|
|
72
|
+
}
|
|
73
|
+
function execLoginShellEnvZero(params) {
|
|
74
|
+
return params.exec(params.shell, ["-l", "-c", "env -0"], {
|
|
75
|
+
encoding: "buffer",
|
|
76
|
+
timeout: params.timeoutMs,
|
|
77
|
+
maxBuffer: DEFAULT_MAX_BUFFER_BYTES,
|
|
78
|
+
env: params.env,
|
|
79
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
80
|
+
});
|
|
10
81
|
}
|
|
11
82
|
function parseShellEnv(stdout) {
|
|
12
83
|
const shellEnv = new Map();
|
|
13
84
|
const parts = stdout.toString("utf8").split("\0");
|
|
14
85
|
for (const part of parts) {
|
|
15
|
-
if (!part)
|
|
86
|
+
if (!part) {
|
|
16
87
|
continue;
|
|
88
|
+
}
|
|
17
89
|
const eq = part.indexOf("=");
|
|
18
|
-
if (eq <= 0)
|
|
90
|
+
if (eq <= 0) {
|
|
19
91
|
continue;
|
|
92
|
+
}
|
|
20
93
|
const key = part.slice(0, eq);
|
|
21
94
|
const value = part.slice(eq + 1);
|
|
22
|
-
if (!key)
|
|
95
|
+
if (!key) {
|
|
23
96
|
continue;
|
|
97
|
+
}
|
|
24
98
|
shellEnv.set(key, value);
|
|
25
99
|
}
|
|
26
100
|
return shellEnv;
|
|
@@ -37,19 +111,11 @@ export function loadShellEnvFallback(opts) {
|
|
|
37
111
|
lastAppliedKeys = [];
|
|
38
112
|
return { ok: true, applied: [], skippedReason: "already-has-keys" };
|
|
39
113
|
}
|
|
40
|
-
const timeoutMs =
|
|
41
|
-
? Math.max(0, opts.timeoutMs)
|
|
42
|
-
: DEFAULT_TIMEOUT_MS;
|
|
114
|
+
const timeoutMs = resolveTimeoutMs(opts.timeoutMs);
|
|
43
115
|
const shell = resolveShell(opts.env);
|
|
44
116
|
let stdout;
|
|
45
117
|
try {
|
|
46
|
-
stdout =
|
|
47
|
-
encoding: "buffer",
|
|
48
|
-
timeout: timeoutMs,
|
|
49
|
-
maxBuffer: DEFAULT_MAX_BUFFER_BYTES,
|
|
50
|
-
env: opts.env,
|
|
51
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
52
|
-
});
|
|
118
|
+
stdout = execLoginShellEnvZero({ shell, env: opts.env, exec, timeoutMs });
|
|
53
119
|
}
|
|
54
120
|
catch (err) {
|
|
55
121
|
const msg = err instanceof Error ? err.message : String(err);
|
|
@@ -60,11 +126,13 @@ export function loadShellEnvFallback(opts) {
|
|
|
60
126
|
const shellEnv = parseShellEnv(stdout);
|
|
61
127
|
const applied = [];
|
|
62
128
|
for (const key of opts.expectedKeys) {
|
|
63
|
-
if (opts.env[key]?.trim())
|
|
129
|
+
if (opts.env[key]?.trim()) {
|
|
64
130
|
continue;
|
|
131
|
+
}
|
|
65
132
|
const value = shellEnv.get(key);
|
|
66
|
-
if (!value?.trim())
|
|
133
|
+
if (!value?.trim()) {
|
|
67
134
|
continue;
|
|
135
|
+
}
|
|
68
136
|
opts.env[key] = value;
|
|
69
137
|
applied.push(key);
|
|
70
138
|
}
|
|
@@ -72,42 +140,37 @@ export function loadShellEnvFallback(opts) {
|
|
|
72
140
|
return { ok: true, applied };
|
|
73
141
|
}
|
|
74
142
|
export function shouldEnableShellEnvFallback(env) {
|
|
75
|
-
return
|
|
143
|
+
return isTruthyEnvValue(env.POOLBOT_LOAD_SHELL_ENV);
|
|
76
144
|
}
|
|
77
145
|
export function shouldDeferShellEnvFallback(env) {
|
|
78
|
-
return
|
|
79
|
-
isTruthyEnvValue(env.CLAWDBOT_DEFER_SHELL_ENV_FALLBACK));
|
|
146
|
+
return isTruthyEnvValue(env.POOLBOT_DEFER_SHELL_ENV_FALLBACK);
|
|
80
147
|
}
|
|
81
148
|
export function resolveShellEnvFallbackTimeoutMs(env) {
|
|
82
|
-
const raw = env.POOLBOT_SHELL_ENV_TIMEOUT_MS?.trim()
|
|
83
|
-
if (!raw)
|
|
149
|
+
const raw = env.POOLBOT_SHELL_ENV_TIMEOUT_MS?.trim();
|
|
150
|
+
if (!raw) {
|
|
84
151
|
return DEFAULT_TIMEOUT_MS;
|
|
152
|
+
}
|
|
85
153
|
const parsed = Number.parseInt(raw, 10);
|
|
86
|
-
if (!Number.isFinite(parsed))
|
|
154
|
+
if (!Number.isFinite(parsed)) {
|
|
87
155
|
return DEFAULT_TIMEOUT_MS;
|
|
156
|
+
}
|
|
88
157
|
return Math.max(0, parsed);
|
|
89
158
|
}
|
|
90
159
|
export function getShellPathFromLoginShell(opts) {
|
|
91
|
-
if (cachedShellPath !== undefined)
|
|
160
|
+
if (cachedShellPath !== undefined) {
|
|
92
161
|
return cachedShellPath;
|
|
93
|
-
|
|
162
|
+
}
|
|
163
|
+
const platform = opts.platform ?? process.platform;
|
|
164
|
+
if (platform === "win32") {
|
|
94
165
|
cachedShellPath = null;
|
|
95
166
|
return cachedShellPath;
|
|
96
167
|
}
|
|
97
168
|
const exec = opts.exec ?? execFileSync;
|
|
98
|
-
const timeoutMs =
|
|
99
|
-
? Math.max(0, opts.timeoutMs)
|
|
100
|
-
: DEFAULT_TIMEOUT_MS;
|
|
169
|
+
const timeoutMs = resolveTimeoutMs(opts.timeoutMs);
|
|
101
170
|
const shell = resolveShell(opts.env);
|
|
102
171
|
let stdout;
|
|
103
172
|
try {
|
|
104
|
-
stdout =
|
|
105
|
-
encoding: "buffer",
|
|
106
|
-
timeout: timeoutMs,
|
|
107
|
-
maxBuffer: DEFAULT_MAX_BUFFER_BYTES,
|
|
108
|
-
env: opts.env,
|
|
109
|
-
stdio: ["ignore", "pipe", "pipe"],
|
|
110
|
-
});
|
|
173
|
+
stdout = execLoginShellEnvZero({ shell, env: opts.env, exec, timeoutMs });
|
|
111
174
|
}
|
|
112
175
|
catch {
|
|
113
176
|
cachedShellPath = null;
|
|
@@ -120,6 +183,7 @@ export function getShellPathFromLoginShell(opts) {
|
|
|
120
183
|
}
|
|
121
184
|
export function resetShellPathCacheForTests() {
|
|
122
185
|
cachedShellPath = undefined;
|
|
186
|
+
cachedEtcShells = undefined;
|
|
123
187
|
}
|
|
124
188
|
export function getShellEnvAppliedKeys() {
|
|
125
189
|
return [...lastAppliedKeys];
|
package/dist/infra/ssh-config.js
CHANGED
|
@@ -1,10 +1,12 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
2
|
function parsePort(value) {
|
|
3
|
-
if (!value)
|
|
3
|
+
if (!value) {
|
|
4
4
|
return undefined;
|
|
5
|
+
}
|
|
5
6
|
const parsed = Number.parseInt(value, 10);
|
|
6
|
-
if (!Number.isFinite(parsed) || parsed <= 0)
|
|
7
|
+
if (!Number.isFinite(parsed) || parsed <= 0) {
|
|
7
8
|
return undefined;
|
|
9
|
+
}
|
|
8
10
|
return parsed;
|
|
9
11
|
}
|
|
10
12
|
export function parseSshConfigOutput(output) {
|
|
@@ -12,12 +14,14 @@ export function parseSshConfigOutput(output) {
|
|
|
12
14
|
const lines = output.split("\n");
|
|
13
15
|
for (const raw of lines) {
|
|
14
16
|
const line = raw.trim();
|
|
15
|
-
if (!line)
|
|
17
|
+
if (!line) {
|
|
16
18
|
continue;
|
|
19
|
+
}
|
|
17
20
|
const [key, ...rest] = line.split(/\s+/);
|
|
18
21
|
const value = rest.join(" ").trim();
|
|
19
|
-
if (!key || !value)
|
|
22
|
+
if (!key || !value) {
|
|
20
23
|
continue;
|
|
24
|
+
}
|
|
21
25
|
switch (key) {
|
|
22
26
|
case "user":
|
|
23
27
|
result.user = value;
|
|
@@ -29,8 +33,9 @@ export function parseSshConfigOutput(output) {
|
|
|
29
33
|
result.port = parsePort(value);
|
|
30
34
|
break;
|
|
31
35
|
case "identityfile":
|
|
32
|
-
if (value !== "none")
|
|
36
|
+
if (value !== "none") {
|
|
33
37
|
result.identityFiles.push(value);
|
|
38
|
+
}
|
|
34
39
|
break;
|
|
35
40
|
default:
|
|
36
41
|
break;
|
|
@@ -48,7 +53,8 @@ export async function resolveSshConfig(target, opts = {}) {
|
|
|
48
53
|
args.push("-i", opts.identity.trim());
|
|
49
54
|
}
|
|
50
55
|
const userHost = target.user ? `${target.user}@${target.host}` : target.host;
|
|
51
|
-
|
|
56
|
+
// Use "--" so userHost can't be parsed as an ssh option.
|
|
57
|
+
args.push("--", userHost);
|
|
52
58
|
return await new Promise((resolve) => {
|
|
53
59
|
const child = spawn(sshPath, args, {
|
|
54
60
|
stdio: ["ignore", "pipe", "ignore"],
|
|
@@ -45,8 +45,12 @@ export function extractShellCommandFromArgv(argv) {
|
|
|
45
45
|
if (idx === -1) {
|
|
46
46
|
return null;
|
|
47
47
|
}
|
|
48
|
-
const
|
|
49
|
-
|
|
48
|
+
const tail = argv.slice(idx + 1).map((item) => String(item));
|
|
49
|
+
if (tail.length === 0) {
|
|
50
|
+
return null;
|
|
51
|
+
}
|
|
52
|
+
const cmd = tail.join(" ").trim();
|
|
53
|
+
return cmd.length > 0 ? cmd : null;
|
|
50
54
|
}
|
|
51
55
|
return null;
|
|
52
56
|
}
|
|
@@ -55,7 +59,7 @@ export function validateSystemRunCommandConsistency(params) {
|
|
|
55
59
|
? params.rawCommand.trim()
|
|
56
60
|
: null;
|
|
57
61
|
const shellCommand = extractShellCommandFromArgv(params.argv);
|
|
58
|
-
const inferred = shellCommand ? shellCommand.trim() : formatExecCommand(params.argv);
|
|
62
|
+
const inferred = shellCommand !== null ? shellCommand.trim() : formatExecCommand(params.argv);
|
|
59
63
|
if (raw && raw !== inferred) {
|
|
60
64
|
return {
|
|
61
65
|
ok: false,
|
|
@@ -72,7 +76,48 @@ export function validateSystemRunCommandConsistency(params) {
|
|
|
72
76
|
// Only treat this as a shell command when argv is a recognized shell wrapper.
|
|
73
77
|
// For direct argv execution, rawCommand is purely display/approval text and
|
|
74
78
|
// must match the formatted argv.
|
|
75
|
-
shellCommand: shellCommand ? (raw ?? shellCommand) : null,
|
|
79
|
+
shellCommand: shellCommand !== null ? (raw ?? shellCommand) : null,
|
|
76
80
|
cmdText: raw ?? shellCommand ?? inferred,
|
|
77
81
|
};
|
|
78
82
|
}
|
|
83
|
+
export function resolveSystemRunCommand(params) {
|
|
84
|
+
const raw = typeof params.rawCommand === "string" && params.rawCommand.trim().length > 0
|
|
85
|
+
? params.rawCommand.trim()
|
|
86
|
+
: null;
|
|
87
|
+
const command = Array.isArray(params.command) ? params.command : [];
|
|
88
|
+
if (command.length === 0) {
|
|
89
|
+
if (raw) {
|
|
90
|
+
return {
|
|
91
|
+
ok: false,
|
|
92
|
+
message: "rawCommand requires params.command",
|
|
93
|
+
details: { code: "MISSING_COMMAND" },
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
return {
|
|
97
|
+
ok: true,
|
|
98
|
+
argv: [],
|
|
99
|
+
rawCommand: null,
|
|
100
|
+
shellCommand: null,
|
|
101
|
+
cmdText: "",
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
const argv = command.map((v) => String(v));
|
|
105
|
+
const validation = validateSystemRunCommandConsistency({
|
|
106
|
+
argv,
|
|
107
|
+
rawCommand: raw,
|
|
108
|
+
});
|
|
109
|
+
if (!validation.ok) {
|
|
110
|
+
return {
|
|
111
|
+
ok: false,
|
|
112
|
+
message: validation.message,
|
|
113
|
+
details: validation.details ?? { code: "RAW_COMMAND_MISMATCH" },
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
return {
|
|
117
|
+
ok: true,
|
|
118
|
+
argv,
|
|
119
|
+
rawCommand: raw,
|
|
120
|
+
shellCommand: validation.shellCommand,
|
|
121
|
+
cmdText: validation.cmdText,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
@@ -2,18 +2,22 @@ export const DEFAULT_PACKAGE_CHANNEL = "stable";
|
|
|
2
2
|
export const DEFAULT_GIT_CHANNEL = "dev";
|
|
3
3
|
export const DEV_BRANCH = "main";
|
|
4
4
|
export function normalizeUpdateChannel(value) {
|
|
5
|
-
if (!value)
|
|
5
|
+
if (!value) {
|
|
6
6
|
return null;
|
|
7
|
+
}
|
|
7
8
|
const normalized = value.trim().toLowerCase();
|
|
8
|
-
if (normalized === "stable" || normalized === "beta" || normalized === "dev")
|
|
9
|
+
if (normalized === "stable" || normalized === "beta" || normalized === "dev") {
|
|
9
10
|
return normalized;
|
|
11
|
+
}
|
|
10
12
|
return null;
|
|
11
13
|
}
|
|
12
14
|
export function channelToNpmTag(channel) {
|
|
13
|
-
if (channel === "beta")
|
|
15
|
+
if (channel === "beta") {
|
|
14
16
|
return "beta";
|
|
15
|
-
|
|
17
|
+
}
|
|
18
|
+
if (channel === "dev") {
|
|
16
19
|
return "dev";
|
|
20
|
+
}
|
|
17
21
|
return "latest";
|
|
18
22
|
}
|
|
19
23
|
export function isBetaTag(tag) {
|
|
@@ -43,8 +47,9 @@ export function resolveEffectiveUpdateChannel(params) {
|
|
|
43
47
|
return { channel: DEFAULT_PACKAGE_CHANNEL, source: "default" };
|
|
44
48
|
}
|
|
45
49
|
export function formatUpdateChannelLabel(params) {
|
|
46
|
-
if (params.source === "config")
|
|
50
|
+
if (params.source === "config") {
|
|
47
51
|
return `${params.channel} (config)`;
|
|
52
|
+
}
|
|
48
53
|
if (params.source === "git-tag") {
|
|
49
54
|
return params.gitTag ? `${params.channel} (${params.gitTag})` : `${params.channel} (tag)`;
|
|
50
55
|
}
|
package/dist/line/accounts.js
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
|
-
|
|
2
|
+
import { DEFAULT_ACCOUNT_ID, normalizeAccountId as normalizeSharedAccountId, } from "../routing/account-id.js";
|
|
3
|
+
export { DEFAULT_ACCOUNT_ID } from "../routing/account-id.js";
|
|
3
4
|
function readFileIfExists(filePath) {
|
|
4
|
-
if (!filePath)
|
|
5
|
+
if (!filePath) {
|
|
5
6
|
return undefined;
|
|
7
|
+
}
|
|
6
8
|
try {
|
|
7
9
|
return fs.readFileSync(filePath, "utf-8").trim();
|
|
8
10
|
}
|
|
@@ -122,9 +124,5 @@ export function resolveDefaultLineAccountId(cfg) {
|
|
|
122
124
|
return ids[0] ?? DEFAULT_ACCOUNT_ID;
|
|
123
125
|
}
|
|
124
126
|
export function normalizeAccountId(accountId) {
|
|
125
|
-
|
|
126
|
-
if (!trimmed || trimmed === "default") {
|
|
127
|
-
return DEFAULT_ACCOUNT_ID;
|
|
128
|
-
}
|
|
129
|
-
return trimmed;
|
|
127
|
+
return normalizeSharedAccountId(accountId);
|
|
130
128
|
}
|
package/dist/line/bot-access.js
CHANGED
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { firstDefined, isSenderIdAllowed, mergeAllowFromSources } from "../channels/allow-from.js";
|
|
1
2
|
function normalizeAllowEntry(value) {
|
|
2
3
|
const trimmed = String(value).trim();
|
|
3
|
-
if (!trimmed)
|
|
4
|
+
if (!trimmed) {
|
|
4
5
|
return "";
|
|
5
|
-
|
|
6
|
+
}
|
|
7
|
+
if (trimmed === "*") {
|
|
6
8
|
return "*";
|
|
9
|
+
}
|
|
7
10
|
return trimmed.replace(/^line:(?:user:)?/i, "");
|
|
8
11
|
}
|
|
9
12
|
export const normalizeAllowFrom = (list) => {
|
|
@@ -15,24 +18,9 @@ export const normalizeAllowFrom = (list) => {
|
|
|
15
18
|
hasEntries: entries.length > 0,
|
|
16
19
|
};
|
|
17
20
|
};
|
|
18
|
-
export const normalizeAllowFromWithStore = (params) =>
|
|
19
|
-
const combined = [...(params.allowFrom ?? []), ...(params.storeAllowFrom ?? [])];
|
|
20
|
-
return normalizeAllowFrom(combined);
|
|
21
|
-
};
|
|
22
|
-
export const firstDefined = (...values) => {
|
|
23
|
-
for (const value of values) {
|
|
24
|
-
if (typeof value !== "undefined")
|
|
25
|
-
return value;
|
|
26
|
-
}
|
|
27
|
-
return undefined;
|
|
28
|
-
};
|
|
21
|
+
export const normalizeAllowFromWithStore = (params) => normalizeAllowFrom(mergeAllowFromSources(params));
|
|
29
22
|
export const isSenderAllowed = (params) => {
|
|
30
23
|
const { allow, senderId } = params;
|
|
31
|
-
|
|
32
|
-
return false;
|
|
33
|
-
if (allow.hasWildcard)
|
|
34
|
-
return true;
|
|
35
|
-
if (!senderId)
|
|
36
|
-
return false;
|
|
37
|
-
return allow.entries.includes(senderId);
|
|
24
|
+
return isSenderIdAllowed(allow, senderId, false);
|
|
38
25
|
};
|
|
26
|
+
export { firstDefined };
|
|
@@ -77,10 +77,12 @@ async function shouldProcessLineEvent(event, context) {
|
|
|
77
77
|
const { cfg, account } = context;
|
|
78
78
|
const { userId, groupId, roomId, isGroup } = getSourceInfo(event.source);
|
|
79
79
|
const senderId = userId ?? "";
|
|
80
|
+
const dmPolicy = account.config.dmPolicy ?? "pairing";
|
|
80
81
|
const storeAllowFrom = await readChannelAllowFromStore("line").catch(() => []);
|
|
81
82
|
const effectiveDmAllow = normalizeAllowFromWithStore({
|
|
82
83
|
allowFrom: account.config.allowFrom,
|
|
83
84
|
storeAllowFrom,
|
|
85
|
+
dmPolicy,
|
|
84
86
|
});
|
|
85
87
|
const groupConfig = resolveLineGroupConfig({ config: account.config, groupId, roomId });
|
|
86
88
|
const groupAllowOverride = groupConfig?.allowFrom;
|
|
@@ -91,8 +93,8 @@ async function shouldProcessLineEvent(event, context) {
|
|
|
91
93
|
const effectiveGroupAllow = normalizeAllowFromWithStore({
|
|
92
94
|
allowFrom: groupAllowFrom,
|
|
93
95
|
storeAllowFrom,
|
|
96
|
+
dmPolicy,
|
|
94
97
|
});
|
|
95
|
-
const dmPolicy = account.config.dmPolicy ?? "pairing";
|
|
96
98
|
const defaultGroupPolicy = cfg.channels?.defaults?.groupPolicy;
|
|
97
99
|
const groupPolicy = account.config.groupPolicy ?? defaultGroupPolicy ?? "allowlist";
|
|
98
100
|
if (isGroup) {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isBlockedHostnameOrIp } from "../infra/net/ssrf.js";
|
|
1
2
|
import { DEFAULT_MAX_LINKS } from "./defaults.js";
|
|
2
3
|
// Remove markdown link syntax so only bare URLs are considered.
|
|
3
4
|
const MARKDOWN_LINK_RE = /\[[^\]]*]\((https?:\/\/\S+?)\)/gi;
|
|
@@ -14,10 +15,12 @@ function resolveMaxLinks(value) {
|
|
|
14
15
|
function isAllowedUrl(raw) {
|
|
15
16
|
try {
|
|
16
17
|
const parsed = new URL(raw);
|
|
17
|
-
if (parsed.protocol !== "http:" && parsed.protocol !== "https:")
|
|
18
|
+
if (parsed.protocol !== "http:" && parsed.protocol !== "https:") {
|
|
18
19
|
return false;
|
|
19
|
-
|
|
20
|
+
}
|
|
21
|
+
if (isBlockedHostnameOrIp(parsed.hostname)) {
|
|
20
22
|
return false;
|
|
23
|
+
}
|
|
21
24
|
return true;
|
|
22
25
|
}
|
|
23
26
|
catch {
|
|
@@ -26,24 +29,29 @@ function isAllowedUrl(raw) {
|
|
|
26
29
|
}
|
|
27
30
|
export function extractLinksFromMessage(message, opts) {
|
|
28
31
|
const source = message?.trim();
|
|
29
|
-
if (!source)
|
|
32
|
+
if (!source) {
|
|
30
33
|
return [];
|
|
34
|
+
}
|
|
31
35
|
const maxLinks = resolveMaxLinks(opts?.maxLinks);
|
|
32
36
|
const sanitized = stripMarkdownLinks(source);
|
|
33
37
|
const seen = new Set();
|
|
34
38
|
const results = [];
|
|
35
39
|
for (const match of sanitized.matchAll(BARE_LINK_RE)) {
|
|
36
40
|
const raw = match[0]?.trim();
|
|
37
|
-
if (!raw)
|
|
41
|
+
if (!raw) {
|
|
38
42
|
continue;
|
|
39
|
-
|
|
43
|
+
}
|
|
44
|
+
if (!isAllowedUrl(raw)) {
|
|
40
45
|
continue;
|
|
41
|
-
|
|
46
|
+
}
|
|
47
|
+
if (seen.has(raw)) {
|
|
42
48
|
continue;
|
|
49
|
+
}
|
|
43
50
|
seen.add(raw);
|
|
44
51
|
results.push(raw);
|
|
45
|
-
if (results.length >= maxLinks)
|
|
52
|
+
if (results.length >= maxLinks) {
|
|
46
53
|
break;
|
|
54
|
+
}
|
|
47
55
|
}
|
|
48
56
|
return results;
|
|
49
57
|
}
|
package/dist/media/constants.js
CHANGED
|
@@ -3,18 +3,27 @@ export const MAX_AUDIO_BYTES = 16 * 1024 * 1024; // 16MB
|
|
|
3
3
|
export const MAX_VIDEO_BYTES = 16 * 1024 * 1024; // 16MB
|
|
4
4
|
export const MAX_DOCUMENT_BYTES = 100 * 1024 * 1024; // 100MB
|
|
5
5
|
export function mediaKindFromMime(mime) {
|
|
6
|
-
if (!mime)
|
|
6
|
+
if (!mime) {
|
|
7
7
|
return "unknown";
|
|
8
|
-
|
|
8
|
+
}
|
|
9
|
+
if (mime.startsWith("image/")) {
|
|
9
10
|
return "image";
|
|
10
|
-
|
|
11
|
+
}
|
|
12
|
+
if (mime.startsWith("audio/")) {
|
|
11
13
|
return "audio";
|
|
12
|
-
|
|
14
|
+
}
|
|
15
|
+
if (mime.startsWith("video/")) {
|
|
13
16
|
return "video";
|
|
14
|
-
|
|
17
|
+
}
|
|
18
|
+
if (mime === "application/pdf") {
|
|
15
19
|
return "document";
|
|
16
|
-
|
|
20
|
+
}
|
|
21
|
+
if (mime.startsWith("text/")) {
|
|
22
|
+
return "document";
|
|
23
|
+
}
|
|
24
|
+
if (mime.startsWith("application/")) {
|
|
17
25
|
return "document";
|
|
26
|
+
}
|
|
18
27
|
return "unknown";
|
|
19
28
|
}
|
|
20
29
|
export function maxBytesForKind(kind) {
|
package/dist/media/image-ops.js
CHANGED
|
@@ -2,6 +2,13 @@ import fs from "node:fs/promises";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { runExec } from "../process/exec.js";
|
|
5
|
+
export const IMAGE_REDUCE_QUALITY_STEPS = [85, 75, 65, 55, 45, 35];
|
|
6
|
+
export function buildImageResizeSideGrid(maxSide, sideStart) {
|
|
7
|
+
return [sideStart, 1800, 1600, 1400, 1200, 1000, 800]
|
|
8
|
+
.map((value) => Math.min(maxSide, value))
|
|
9
|
+
.filter((value, idx, arr) => value > 0 && arr.indexOf(value) === idx)
|
|
10
|
+
.toSorted((a, b) => b - a);
|
|
11
|
+
}
|
|
5
12
|
function isBun() {
|
|
6
13
|
return typeof process.versions.bun === "string";
|
|
7
14
|
}
|
|
@@ -1,11 +1,12 @@
|
|
|
1
|
-
import os from "node:os";
|
|
2
1
|
import path from "node:path";
|
|
2
|
+
import { resolvePreferredPoolbotTmpDir } from "../infra/tmp-poolbot-dir.js";
|
|
3
3
|
import { resolveAgentWorkspaceDir } from "../agents/agent-scope.js";
|
|
4
4
|
import { resolveStateDir } from "../config/paths.js";
|
|
5
5
|
function buildMediaLocalRoots(stateDir) {
|
|
6
6
|
const resolvedStateDir = path.resolve(stateDir);
|
|
7
|
+
const preferredTmpDir = resolvePreferredPoolbotTmpDir();
|
|
7
8
|
return [
|
|
8
|
-
|
|
9
|
+
preferredTmpDir,
|
|
9
10
|
path.join(resolvedStateDir, "media"),
|
|
10
11
|
path.join(resolvedStateDir, "agents"),
|
|
11
12
|
path.join(resolvedStateDir, "workspace"),
|
|
@@ -315,7 +315,10 @@ async function extractFileBlocks(params) {
|
|
|
315
315
|
}
|
|
316
316
|
const utf16Charset = resolveUtf16Charset(bufferResult?.buffer);
|
|
317
317
|
const textSample = decodeTextSample(bufferResult?.buffer);
|
|
318
|
-
|
|
318
|
+
// Do not coerce real PDFs into text/plain via printable-byte heuristics.
|
|
319
|
+
// PDFs have a dedicated extraction path in extractFileContentFromSource.
|
|
320
|
+
const allowTextHeuristic = normalizedRawMime !== "application/pdf";
|
|
321
|
+
const textLike = allowTextHeuristic && (Boolean(utf16Charset) || looksLikeUtf8Text(bufferResult?.buffer));
|
|
319
322
|
const guessedDelimited = textLike ? guessDelimitedMime(textSample) : undefined;
|
|
320
323
|
const textHint = forcedTextMimeResolved ?? guessedDelimited ?? (textLike ? "text/plain" : undefined);
|
|
321
324
|
const mimeType = sanitizeMimeType(textHint ?? normalizeMimeType(rawMime));
|
|
@@ -1,26 +1,14 @@
|
|
|
1
1
|
import { logVerbose, shouldLogVerbose } from "../globals.js";
|
|
2
|
+
import { runTasksWithConcurrency } from "../utils/run-with-concurrency.js";
|
|
2
3
|
export async function runWithConcurrency(tasks, limit) {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
while (true) {
|
|
10
|
-
const index = next;
|
|
11
|
-
next += 1;
|
|
12
|
-
if (index >= tasks.length)
|
|
13
|
-
return;
|
|
14
|
-
try {
|
|
15
|
-
results[index] = await tasks[index]();
|
|
4
|
+
const { results } = await runTasksWithConcurrency({
|
|
5
|
+
tasks,
|
|
6
|
+
limit,
|
|
7
|
+
onTaskError(err) {
|
|
8
|
+
if (shouldLogVerbose()) {
|
|
9
|
+
logVerbose(`Media understanding task failed: ${String(err)}`);
|
|
16
10
|
}
|
|
17
|
-
|
|
18
|
-
if (shouldLogVerbose()) {
|
|
19
|
-
logVerbose(`Media understanding task failed: ${String(err)}`);
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
}
|
|
11
|
+
},
|
|
23
12
|
});
|
|
24
|
-
await Promise.allSettled(workers);
|
|
25
13
|
return results;
|
|
26
14
|
}
|