@poolzin/pool-bot 2026.2.25 → 2026.2.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/acp/event-mapper.js +87 -22
- package/dist/acp/meta.js +12 -6
- package/dist/agents/agent-paths.js +8 -9
- package/dist/agents/agent-scope.js +7 -5
- package/dist/agents/auth-profiles/oauth.js +148 -64
- package/dist/agents/auth-profiles/session-override.js +13 -7
- package/dist/agents/bash-tools.exec-host-gateway.js +14 -4
- package/dist/agents/bash-tools.exec-runtime.js +2 -25
- package/dist/agents/bedrock-discovery.js +3 -1
- package/dist/agents/byteplus-models.js +97 -0
- package/dist/agents/chutes-oauth.js +1 -0
- package/dist/agents/cli-runner/helpers.js +4 -0
- package/dist/agents/compaction.js +41 -14
- package/dist/agents/doubao-models.js +121 -0
- package/dist/agents/failover-error.js +2 -0
- package/dist/agents/huggingface-models.js +5 -3
- package/dist/agents/live-model-filter.js +5 -0
- package/dist/agents/minimax-vlm.js +10 -8
- package/dist/agents/model-auth.js +6 -0
- package/dist/agents/model-catalog.js +3 -1
- package/dist/agents/model-selection.js +7 -1
- package/dist/agents/models-config.providers.js +93 -11
- package/dist/agents/ollama-stream.js +117 -4
- package/dist/agents/opencode-zen-models.js +22 -11
- package/dist/agents/pi-embedded-helpers/errors.js +55 -33
- package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
- package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
- package/dist/agents/pi-embedded-helpers.js +1 -1
- package/dist/agents/pi-embedded-runner/compact.js +29 -7
- package/dist/agents/pi-embedded-runner/extensions.js +28 -26
- package/dist/agents/pi-embedded-runner/google.js +20 -8
- package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
- package/dist/agents/pi-embedded-runner/run.js +71 -12
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
- package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
- package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
- package/dist/agents/pi-embedded-runner/thinking.js +42 -0
- package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
- package/dist/agents/pi-embedded-runner/utils.js +7 -10
- package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
- package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
- package/dist/agents/pi-embedded-subscribe.js +9 -4
- package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
- package/dist/agents/pi-embedded-utils.js +3 -0
- package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
- package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
- package/dist/agents/pi-settings.js +40 -0
- package/dist/agents/pi-tools.policy.js +2 -1
- package/dist/agents/provider/config-loader.js +1 -1
- package/dist/agents/sandbox/browser.js +170 -33
- package/dist/agents/sandbox/config-hash.js +14 -27
- package/dist/agents/sandbox/config.js +21 -2
- package/dist/agents/sandbox/constants.js +2 -0
- package/dist/agents/sandbox/docker.js +16 -2
- package/dist/agents/sandbox/novnc-auth.js +62 -0
- package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
- package/dist/agents/sandbox/shared.js +10 -6
- package/dist/agents/sandbox-paths.js +24 -11
- package/dist/agents/schema/clean-for-gemini.js +132 -85
- package/dist/agents/session-slug.js +10 -5
- package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
- package/dist/agents/session-tool-result-guard.js +3 -1
- package/dist/agents/session-transcript-repair.js +40 -6
- package/dist/agents/skills/bundled-dir.js +19 -5
- package/dist/agents/skills/env-overrides.js +124 -43
- package/dist/agents/skills/frontmatter.js +6 -6
- package/dist/agents/skills/plugin-skills.js +14 -7
- package/dist/agents/skills/workspace.js +1 -0
- package/dist/agents/subagent-announce.js +251 -49
- package/dist/agents/subagent-lifecycle-events.js +19 -0
- package/dist/agents/subagent-registry-cleanup.js +31 -0
- package/dist/agents/subagent-registry-completion.js +68 -0
- package/dist/agents/subagent-registry-queries.js +117 -0
- package/dist/agents/subagent-registry-state.js +46 -0
- package/dist/agents/subagent-registry.js +252 -221
- package/dist/agents/subagent-registry.store.js +1 -0
- package/dist/agents/subagent-registry.types.js +1 -0
- package/dist/agents/subagent-spawn.js +195 -7
- package/dist/agents/system-prompt.js +22 -6
- package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
- package/dist/agents/test-helpers/fast-core-tools.js +1 -17
- package/dist/agents/timeout.js +18 -6
- package/dist/agents/tool-call-id.js +1 -1
- package/dist/agents/tool-display-common.js +162 -29
- package/dist/agents/tool-images.js +82 -9
- package/dist/agents/tool-policy.js +51 -26
- package/dist/agents/tools/browser-tool.js +2 -2
- package/dist/agents/tools/canvas-tool.js +27 -1
- package/dist/agents/tools/common.js +45 -0
- package/dist/agents/tools/discord-actions-guild.js +4 -1
- package/dist/agents/tools/gateway-tool.js +3 -1
- package/dist/agents/tools/nodes-utils.js +1 -10
- package/dist/agents/tools/sessions-send-helpers.js +12 -6
- package/dist/agents/tools/sessions-spawn-tool.js +8 -2
- package/dist/agents/tools/subagents-tool.js +2 -1
- package/dist/agents/tools/whatsapp-actions.js +10 -2
- package/dist/agents/tools/whatsapp-target-auth.js +18 -0
- package/dist/agents/transcript-policy.js +22 -8
- package/dist/agents/venice-models.js +11 -3
- package/dist/auto-reply/commands-registry.data.js +51 -0
- package/dist/auto-reply/commands-registry.js +4 -3
- package/dist/auto-reply/group-activation.js +10 -5
- package/dist/auto-reply/inbound-debounce.js +10 -5
- package/dist/auto-reply/reply/abort.js +1 -1
- package/dist/auto-reply/reply/agent-runner-execution.js +4 -1
- package/dist/auto-reply/reply/bash-command.js +41 -39
- package/dist/auto-reply/reply/command-gates.js +25 -0
- package/dist/auto-reply/reply/commands-allowlist.js +111 -72
- package/dist/auto-reply/reply/commands-bash.js +6 -5
- package/dist/auto-reply/reply/commands-config.js +30 -28
- package/dist/auto-reply/reply/commands-core.js +2 -1
- package/dist/auto-reply/reply/commands-info.js +1 -0
- package/dist/auto-reply/reply/commands-models.js +65 -14
- package/dist/auto-reply/reply/commands-session.js +237 -82
- package/dist/auto-reply/reply/commands-setunset.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
- package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
- package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
- package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
- package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
- package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
- package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
- package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
- package/dist/auto-reply/reply/commands-subagents.js +51 -587
- package/dist/auto-reply/reply/commands-tts.js +10 -5
- package/dist/auto-reply/reply/config-value.js +10 -5
- package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
- package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
- package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
- package/dist/auto-reply/reply/followup-runner.js +1 -0
- package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
- package/dist/auto-reply/reply/get-reply-directives.js +17 -28
- package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
- package/dist/auto-reply/reply/get-reply.js +71 -12
- package/dist/auto-reply/reply/model-selection.js +80 -39
- package/dist/auto-reply/reply/queue/enqueue.js +10 -5
- package/dist/auto-reply/reply/queue/state.js +13 -12
- package/dist/auto-reply/reply/reply-payloads.js +67 -36
- package/dist/auto-reply/reply/reply-reference.js +9 -8
- package/dist/auto-reply/reply/route-reply.js +15 -8
- package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
- package/dist/auto-reply/reply/session.js +22 -6
- package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
- package/dist/auto-reply/reply/subagents-utils.js +56 -30
- package/dist/auto-reply/reply/typing.js +46 -21
- package/dist/auto-reply/send-policy.js +14 -7
- package/dist/auto-reply/status.js +140 -16
- package/dist/auto-reply/templating.js +10 -5
- package/dist/auto-reply/thinking.js +7 -16
- package/dist/auto-reply/tokens.js +21 -5
- package/dist/browser/bridge-server.js +36 -20
- package/dist/browser/cdp.helpers.js +7 -14
- package/dist/browser/cdp.js +35 -15
- package/dist/browser/chrome.profile-decoration.js +7 -4
- package/dist/browser/config.js +4 -0
- package/dist/browser/extension-relay-auth.js +55 -0
- package/dist/browser/extension-relay.js +74 -29
- package/dist/browser/navigation-guard.js +9 -1
- package/dist/browser/paths.js +77 -0
- package/dist/browser/profiles.js +13 -8
- package/dist/browser/pw-ai-module.js +10 -5
- package/dist/browser/pw-session.js +76 -39
- package/dist/browser/pw-tools-core.interactions.js +14 -7
- package/dist/browser/pw-tools-core.state.js +12 -6
- package/dist/browser/routes/agent.act.js +2 -2
- package/dist/browser/server-context.js +7 -0
- package/dist/build-info.json +3 -3
- package/dist/channels/allow-from.js +2 -1
- package/dist/channels/allowlists/resolve-utils.js +43 -19
- package/dist/channels/channel-config.js +14 -7
- package/dist/channels/draft-stream-loop.js +7 -0
- package/dist/channels/model-overrides.js +82 -0
- package/dist/channels/plugins/normalize/imessage.js +14 -7
- package/dist/channels/plugins/normalize/slack.js +10 -5
- package/dist/channels/plugins/normalize/telegram.js +14 -7
- package/dist/channels/plugins/outbound/discord.js +80 -8
- package/dist/channels/plugins/outbound/signal.js +11 -11
- package/dist/channels/plugins/setup-helpers.js +10 -5
- package/dist/channels/sender-label.js +14 -7
- package/dist/channels/session.js +4 -2
- package/dist/channels/status-reactions.js +297 -0
- package/dist/cli/banner.js +1 -1
- package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
- package/dist/cli/cli-name.js +11 -11
- package/dist/cli/cli-utils.js +13 -3
- package/dist/cli/command-format.js +1 -1
- package/dist/cli/config-cli.js +1 -1
- package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
- package/dist/cli/daemon-cli/lifecycle.js +64 -2
- package/dist/cli/daemon-cli/restart-health.js +126 -0
- package/dist/cli/daemon-cli/status.gather.js +9 -13
- package/dist/cli/daemon-cli/status.print.js +2 -10
- package/dist/cli/deps.js +27 -22
- package/dist/cli/gateway-cli/run-loop.js +23 -5
- package/dist/cli/node-cli/register.js +14 -5
- package/dist/cli/nodes-media-utils.js +7 -2
- package/dist/cli/outbound-send-deps.js +2 -9
- package/dist/cli/outbound-send-mapping.js +11 -0
- package/dist/cli/pairing-cli.js +40 -14
- package/dist/cli/plugins-cli.js +34 -41
- package/dist/cli/ports.js +11 -10
- package/dist/cli/program/command-registry.js +2 -11
- package/dist/cli/program/command-tree.js +16 -0
- package/dist/cli/program/preaction.js +13 -9
- package/dist/cli/program/register.configure.js +3 -18
- package/dist/cli/program/register.maintenance.js +2 -2
- package/dist/cli/program/register.onboard.js +2 -0
- package/dist/cli/program/register.status-health-sessions.js +16 -17
- package/dist/cli/program/register.subclis.js +93 -52
- package/dist/cli/route.js +11 -7
- package/dist/cli/system-cli.js +36 -46
- package/dist/cli/update-cli/shared.js +22 -9
- package/dist/cli/update-cli/update-command.js +89 -14
- package/dist/cli/update-cli/wizard.js +6 -12
- package/dist/commands/agent/run-context.js +18 -5
- package/dist/commands/agent/session-store.js +17 -4
- package/dist/commands/agent.js +22 -2
- package/dist/commands/agents.bindings.js +14 -7
- package/dist/commands/agents.commands.add.js +13 -9
- package/dist/commands/agents.commands.identity.js +12 -6
- package/dist/commands/agents.commands.list.js +11 -6
- package/dist/commands/agents.config.js +8 -10
- package/dist/commands/agents.providers.js +12 -6
- package/dist/commands/auth-choice-options.js +103 -75
- package/dist/commands/auth-choice.apply.byteplus.js +55 -0
- package/dist/commands/auth-choice.apply.js +4 -0
- package/dist/commands/auth-choice.apply.minimax.js +61 -13
- package/dist/commands/auth-choice.apply.openai.js +3 -1
- package/dist/commands/auth-choice.apply.volcengine.js +55 -0
- package/dist/commands/auth-choice.preferred-provider.js +2 -0
- package/dist/commands/channels/remove.js +13 -6
- package/dist/commands/channels/shared.js +4 -14
- package/dist/commands/configure.commands.js +14 -0
- package/dist/commands/configure.gateway.js +2 -4
- package/dist/commands/configure.js +1 -1
- package/dist/commands/configure.shared.js +11 -0
- package/dist/commands/daemon-install-helpers.js +2 -2
- package/dist/commands/dashboard.js +12 -10
- package/dist/commands/docs.js +14 -8
- package/dist/commands/doctor-config-flow.js +11 -9
- package/dist/commands/doctor-legacy-config.js +281 -0
- package/dist/commands/doctor-state-integrity.js +99 -23
- package/dist/commands/doctor-update.js +12 -9
- package/dist/commands/models/list.list-command.js +7 -5
- package/dist/commands/models/set-image.js +2 -21
- package/dist/commands/node-daemon-install-helpers.js +10 -8
- package/dist/commands/onboard-auth.config-minimax.js +54 -80
- package/dist/commands/onboard-auth.config-opencode.js +2 -18
- package/dist/commands/onboard-auth.credentials.js +90 -13
- package/dist/commands/onboard-auth.js +1 -1
- package/dist/commands/onboard-auth.models.js +6 -5
- package/dist/commands/onboard-hooks.js +1 -1
- package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
- package/dist/commands/onboard-provider-auth-flags.js +14 -0
- package/dist/commands/onboard-remote.js +14 -7
- package/dist/commands/onboard.js +11 -13
- package/dist/commands/sandbox-display.js +6 -5
- package/dist/commands/status-all/diagnosis.js +14 -10
- package/dist/commands/status-all/format.js +1 -0
- package/dist/commands/status.gateway-probe.js +1 -16
- package/dist/commands/systemd-linger.js +12 -6
- package/dist/config/agent-limits.js +2 -0
- package/dist/config/commands.js +30 -16
- package/dist/config/config-paths.js +9 -11
- package/dist/config/defaults.js +22 -2
- package/dist/config/discord-preview-streaming.js +104 -0
- package/dist/config/env-vars.js +37 -8
- package/dist/config/includes.js +4 -0
- package/dist/config/io.js +97 -12
- package/dist/config/legacy.migrations.part-1.js +189 -78
- package/dist/config/legacy.shared.js +3 -1
- package/dist/config/merge-patch.js +4 -0
- package/dist/config/prototype-keys.js +4 -0
- package/dist/config/schema.help.js +44 -7
- package/dist/config/schema.labels.js +38 -6
- package/dist/config/sessions/delivery-info.js +10 -3
- package/dist/config/sessions/main-session.js +10 -5
- package/dist/config/sessions/session-file.js +33 -0
- package/dist/config/sessions/session-key.js +10 -5
- package/dist/config/sessions/store.js +1 -1
- package/dist/config/sessions.js +1 -0
- package/dist/config/zod-schema.agent-runtime.js +11 -0
- package/dist/config/zod-schema.js +148 -13
- package/dist/config/zod-schema.providers-core.js +78 -4
- package/dist/config/zod-schema.providers.js +6 -1
- package/dist/config/zod-schema.session.js +41 -2
- package/dist/cron/run-log.js +3 -0
- package/dist/cron/schedule.js +21 -10
- package/dist/cron/service/ops.js +35 -21
- package/dist/cron/service/timer.js +116 -16
- package/dist/cron/stagger.js +3 -1
- package/dist/discord/api.js +12 -6
- package/dist/discord/draft-chunking.js +22 -0
- package/dist/discord/draft-stream.js +124 -0
- package/dist/discord/monitor/agent-components.js +1 -1
- package/dist/discord/monitor/commands.js +5 -0
- package/dist/discord/monitor/gateway-plugin.js +2 -1
- package/dist/discord/monitor/listeners.js +37 -27
- package/dist/discord/monitor/message-handler.js +4 -1
- package/dist/discord/monitor/message-handler.preflight.js +65 -8
- package/dist/discord/monitor/message-handler.process.js +246 -217
- package/dist/discord/monitor/message-utils.js +143 -6
- package/dist/discord/monitor/model-picker-preferences.js +143 -0
- package/dist/discord/monitor/model-picker.js +651 -0
- package/dist/discord/monitor/native-command.js +573 -16
- package/dist/discord/monitor/provider.allowlist.js +223 -0
- package/dist/discord/monitor/provider.js +275 -347
- package/dist/discord/monitor/provider.lifecycle.js +100 -0
- package/dist/discord/monitor/reply-delivery.js +123 -16
- package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
- package/dist/discord/monitor/thread-bindings.js +4 -0
- package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
- package/dist/discord/monitor/thread-bindings.manager.js +423 -0
- package/dist/discord/monitor/thread-bindings.messages.js +55 -0
- package/dist/discord/monitor/thread-bindings.state.js +358 -0
- package/dist/discord/monitor/thread-bindings.types.js +6 -0
- package/dist/discord/resolve-users.js +33 -21
- package/dist/discord/send.channels.js +15 -0
- package/dist/discord/send.js +3 -2
- package/dist/discord/send.outbound.js +82 -26
- package/dist/discord/send.permissions.js +83 -30
- package/dist/discord/send.reactions.js +8 -4
- package/dist/discord/token.js +10 -5
- package/dist/discord/voice/command.js +263 -0
- package/dist/discord/voice/manager.js +531 -0
- package/dist/gateway/auth.js +34 -10
- package/dist/gateway/call.js +4 -16
- package/dist/gateway/client.js +28 -4
- package/dist/gateway/config-reload.js +3 -4
- package/dist/gateway/control-ui.js +219 -96
- package/dist/gateway/hooks-mapping.js +88 -38
- package/dist/gateway/http-auth-helpers.js +3 -2
- package/dist/gateway/http-endpoint-helpers.js +1 -0
- package/dist/gateway/net.js +54 -12
- package/dist/gateway/node-invoke-system-run-approval.js +14 -35
- package/dist/gateway/node-registry.js +10 -5
- package/dist/gateway/openai-http.js +1 -0
- package/dist/gateway/openresponses-http.js +1 -0
- package/dist/gateway/origin-check.js +1 -18
- package/dist/gateway/protocol/index.js +4 -3
- package/dist/gateway/protocol/schema/cron.js +1 -0
- package/dist/gateway/protocol/schema/devices.js +1 -0
- package/dist/gateway/protocol/schema/protocol-schemas.js +2 -1
- package/dist/gateway/protocol/schema/sessions.js +6 -0
- package/dist/gateway/role-policy.js +17 -0
- package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
- package/dist/gateway/server/ws-connection/message-handler.js +175 -148
- package/dist/gateway/server-chat.js +83 -25
- package/dist/gateway/server-constants.js +10 -9
- package/dist/gateway/server-cron.js +1 -0
- package/dist/gateway/server-http.js +16 -7
- package/dist/gateway/server-maintenance.js +20 -5
- package/dist/gateway/server-methods/chat.js +10 -6
- package/dist/gateway/server-methods/config.js +12 -14
- package/dist/gateway/server-methods/devices.js +17 -3
- package/dist/gateway/server-methods/models.js +11 -1
- package/dist/gateway/server-methods/sessions.js +64 -8
- package/dist/gateway/server-methods/usage.js +162 -75
- package/dist/gateway/server-node-events.js +29 -0
- package/dist/gateway/server-runtime-config.js +34 -13
- package/dist/gateway/server-startup-memory.js +17 -11
- package/dist/gateway/session-utils.fs.js +32 -34
- package/dist/gateway/sessions-resolve.js +17 -5
- package/dist/gateway/test-helpers.openai-mock.js +14 -7
- package/dist/gateway/tools-invoke-http.js +21 -10
- package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
- package/dist/hooks/bundled/command-logger/handler.js +7 -2
- package/dist/hooks/bundled/session-memory/handler.js +6 -5
- package/dist/hooks/frontmatter.js +6 -6
- package/dist/hooks/gmail-watcher.js +11 -6
- package/dist/hooks/internal-hooks.js +11 -1
- package/dist/hooks/llm-slug-generator.js +4 -1
- package/dist/hooks/workspace.js +47 -17
- package/dist/imessage/accounts.js +9 -20
- package/dist/imessage/monitor/inbound-processing.js +2 -1
- package/dist/infra/archive.js +174 -73
- package/dist/infra/control-ui-assets.js +14 -6
- package/dist/infra/device-pairing.js +108 -29
- package/dist/infra/env.js +10 -5
- package/dist/infra/exec-approvals-allowlist.js +122 -0
- package/dist/infra/exec-approvals-analysis.js +34 -3
- package/dist/infra/exec-approvals.js +5 -17
- package/dist/infra/exec-safe-bin-policy.js +53 -45
- package/dist/infra/fs-safe.js +71 -39
- package/dist/infra/gateway-lock.js +6 -2
- package/dist/infra/heartbeat-wake.js +6 -12
- package/dist/infra/host-env-security-policy.json +19 -0
- package/dist/infra/host-env-security.js +66 -0
- package/dist/infra/net/ssrf.js +131 -38
- package/dist/infra/outbound/bound-delivery-router.js +88 -0
- package/dist/infra/outbound/channel-selection.js +12 -6
- package/dist/infra/outbound/envelope.js +1 -1
- package/dist/infra/outbound/format.js +12 -6
- package/dist/infra/outbound/payloads.js +14 -7
- package/dist/infra/outbound/session-binding-service.js +123 -0
- package/dist/infra/path-guards.js +25 -0
- package/dist/infra/provider-usage.fetch.codex.js +7 -15
- package/dist/infra/provider-usage.fetch.gemini.js +14 -11
- package/dist/infra/provider-usage.fetch.shared.js +30 -1
- package/dist/infra/provider-usage.fetch.zai.js +10 -9
- package/dist/infra/retry-policy.js +4 -2
- package/dist/infra/retry.js +9 -5
- package/dist/infra/session-cost-usage.js +107 -59
- package/dist/infra/session-maintenance-warning.js +3 -1
- package/dist/infra/shell-env.js +98 -34
- package/dist/infra/ssh-config.js +12 -6
- package/dist/infra/system-run-command.js +49 -4
- package/dist/infra/update-channels.js +10 -5
- package/dist/line/accounts.js +5 -7
- package/dist/line/bot-access.js +8 -20
- package/dist/line/bot-handlers.js +3 -1
- package/dist/link-understanding/detect.js +15 -7
- package/dist/media/constants.js +15 -6
- package/dist/media/image-ops.js +7 -0
- package/dist/media/local-roots.js +3 -2
- package/dist/media-understanding/apply.js +4 -1
- package/dist/media-understanding/concurrency.js +8 -20
- package/dist/memory/backend-config.js +45 -6
- package/dist/memory/embeddings.js +10 -4
- package/dist/memory/fs-utils.js +23 -0
- package/dist/memory/manager-search.js +12 -6
- package/dist/memory/manager-sync-ops.js +12 -2
- package/dist/memory/qmd-manager.js +466 -53
- package/dist/memory/query-expansion.js +167 -3
- package/dist/memory/status-format.js +10 -5
- package/dist/memory/sync-memory-files.js +1 -1
- package/dist/node-host/invoke-system-run.js +281 -0
- package/dist/node-host/invoke.js +55 -337
- package/dist/pairing/pairing-store.js +22 -0
- package/dist/plugin-sdk/allow-from.js +1 -1
- package/dist/plugin-sdk/command-auth.js +3 -1
- package/dist/plugin-sdk/index.js +6 -3
- package/dist/plugin-sdk/webhook-targets.js +32 -0
- package/dist/plugins/bundled-dir.js +9 -6
- package/dist/plugins/hooks.js +50 -0
- package/dist/plugins/install.js +28 -16
- package/dist/plugins/runtime.js +3 -17
- package/dist/plugins/update.js +78 -12
- package/dist/process/spawn-utils.js +14 -7
- package/dist/providers/github-copilot-token.js +11 -6
- package/dist/providers/qwen-portal-oauth.js +14 -6
- package/dist/routing/account-id.js +30 -0
- package/dist/routing/resolve-route.js +3 -7
- package/dist/routing/session-key.js +2 -16
- package/dist/security/audit-channel.js +93 -2
- package/dist/security/audit-extra.async.js +159 -5
- package/dist/security/audit-extra.js +1 -1
- package/dist/security/audit-extra.sync.js +85 -6
- package/dist/security/audit.js +40 -4
- package/dist/security/dm-policy-shared.js +44 -0
- package/dist/security/external-content.js +26 -6
- package/dist/shared/entry-status.js +6 -0
- package/dist/shared/frontmatter.js +5 -5
- package/dist/shared/node-match.js +11 -4
- package/dist/shared/operator-scope-compat.js +8 -3
- package/dist/signal/accounts.js +7 -20
- package/dist/signal/monitor/event-handler.js +3 -1
- package/dist/slack/accounts.js +6 -19
- package/dist/slack/actions.js +11 -3
- package/dist/slack/monitor/auth.js +1 -1
- package/dist/slack/monitor/message-handler/dispatch.js +50 -29
- package/dist/slack/monitor/replies.js +15 -7
- package/dist/slack/monitor/slash.js +22 -13
- package/dist/slack/resolve-channels.js +10 -5
- package/dist/slack/send.js +102 -12
- package/dist/slack/stream-mode.js +10 -0
- package/dist/slack/streaming.js +4 -2
- package/dist/telegram/accounts.js +19 -14
- package/dist/telegram/bot/helpers.js +3 -5
- package/dist/telegram/bot-access.js +35 -36
- package/dist/telegram/bot-handlers.js +120 -148
- package/dist/telegram/bot-message-context.js +68 -9
- package/dist/telegram/bot-message-dispatch.js +155 -90
- package/dist/telegram/bot-native-commands.js +16 -0
- package/dist/telegram/draft-stream.js +14 -1
- package/dist/telegram/inline-buttons.js +5 -15
- package/dist/telegram/monitor.js +11 -7
- package/dist/telegram/network-config.js +19 -7
- package/dist/telegram/send.js +3 -2
- package/dist/telegram/sent-message-cache.js +5 -6
- package/dist/telegram/status-reaction-variants.js +208 -0
- package/dist/telegram/sticker-cache.js +11 -9
- package/dist/terminal/theme.js +12 -12
- package/dist/tts/tts.js +80 -567
- package/dist/tui/components/chat-log.js +41 -8
- package/dist/tui/theme/theme.js +10 -12
- package/dist/tui/tui-local-shell.js +16 -6
- package/dist/tui/tui.js +58 -6
- package/dist/utils/account-id.js +2 -4
- package/dist/utils/boolean.js +10 -5
- package/dist/utils/directive-tags.js +11 -0
- package/dist/utils/queue-helpers.js +67 -12
- package/dist/web/auto-reply/deliver-reply.js +8 -4
- package/dist/web/auto-reply/mentions.js +10 -5
- package/dist/web/auto-reply/monitor/group-members.js +14 -7
- package/dist/web/auto-reply/monitor/process-message.js +45 -24
- package/dist/web/inbound/access-control.js +5 -2
- package/dist/web/login-qr.js +12 -6
- package/dist/web/media.js +123 -16
- package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
- package/extensions/bluebubbles/src/monitor.ts +208 -1950
- package/package.json +1 -1
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { resolveAgentDir } from "../agents/agent-scope.js";
|
|
2
2
|
import { findModelInCatalog, loadModelCatalog, modelSupportsVision, } from "../agents/model-catalog.js";
|
|
3
3
|
import { resolveDefaultModelForAgent } from "../agents/model-selection.js";
|
|
4
|
-
import { EmbeddedBlockChunker } from "../agents/pi-embedded-block-chunker.js";
|
|
5
4
|
import { resolveChunkMode } from "../auto-reply/chunk.js";
|
|
6
5
|
import { clearHistoryEntriesIfEnabled } from "../auto-reply/reply/history.js";
|
|
7
6
|
import { dispatchReplyWithBufferedBlockDispatcher } from "../auto-reply/reply/provider-dispatcher.js";
|
|
@@ -14,7 +13,6 @@ import { loadSessionStore, resolveStorePath } from "../config/sessions.js";
|
|
|
14
13
|
import { danger, logVerbose } from "../globals.js";
|
|
15
14
|
import { getAgentScopedMediaLocalRoots } from "../media/local-roots.js";
|
|
16
15
|
import { deliverReplies } from "./bot/delivery.js";
|
|
17
|
-
import { resolveTelegramDraftStreamingChunking } from "./draft-chunking.js";
|
|
18
16
|
import { createTelegramDraftStream } from "./draft-stream.js";
|
|
19
17
|
import { renderTelegramHtmlText } from "./format.js";
|
|
20
18
|
import { createTelegramReasoningStepState, splitTelegramReasoningText, } from "./reasoning-lane-coordinator.js";
|
|
@@ -57,7 +55,7 @@ function resolveTelegramReasoningLevel(params) {
|
|
|
57
55
|
return "off";
|
|
58
56
|
}
|
|
59
57
|
export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, replyToMode, streamMode, textLimit, telegramCfg, opts, }) => {
|
|
60
|
-
const { ctxPayload, msg, chatId, isGroup, threadSpec, historyKey, historyLimit, groupHistories, route, skillFilter, sendTyping, sendRecordVoice, ackReactionPromise, reactionApi, removeAckAfterReply, } = context;
|
|
58
|
+
const { ctxPayload, msg, chatId, isGroup, threadSpec, historyKey, historyLimit, groupHistories, route, skillFilter, sendTyping, sendRecordVoice, ackReactionPromise, reactionApi, removeAckAfterReply, statusReactionController, } = context;
|
|
61
59
|
const draftMaxChars = Math.min(textLimit, 4096);
|
|
62
60
|
const tableMode = resolveMarkdownTableMode({
|
|
63
61
|
cfg,
|
|
@@ -78,12 +76,15 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
78
76
|
});
|
|
79
77
|
const forceBlockStreamingForReasoning = resolvedReasoningLevel === "on";
|
|
80
78
|
const streamReasoningDraft = resolvedReasoningLevel === "stream";
|
|
81
|
-
const
|
|
79
|
+
const previewStreamingEnabled = streamMode !== "off";
|
|
80
|
+
const canStreamAnswerDraft = previewStreamingEnabled && !accountBlockStreamingEnabled && !forceBlockStreamingForReasoning;
|
|
82
81
|
const canStreamReasoningDraft = canStreamAnswerDraft || streamReasoningDraft;
|
|
83
82
|
const draftReplyToMessageId = replyToMode !== "off" && typeof msg.message_id === "number" ? msg.message_id : undefined;
|
|
84
|
-
const draftMinInitialChars =
|
|
83
|
+
const draftMinInitialChars = DRAFT_MIN_INITIAL_CHARS;
|
|
85
84
|
const mediaLocalRoots = getAgentScopedMediaLocalRoots(cfg, route.agentId);
|
|
86
|
-
const
|
|
85
|
+
const archivedAnswerPreviews = [];
|
|
86
|
+
const archivedReasoningPreviewIds = [];
|
|
87
|
+
const createDraftLane = (laneName, enabled) => {
|
|
87
88
|
const stream = enabled
|
|
88
89
|
? createTelegramDraftStream({
|
|
89
90
|
api: bot.api,
|
|
@@ -93,24 +94,33 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
93
94
|
replyToMessageId: draftReplyToMessageId,
|
|
94
95
|
minInitialChars: draftMinInitialChars,
|
|
95
96
|
renderText: renderDraftPreview,
|
|
97
|
+
onSupersededPreview: laneName === "answer" || laneName === "reasoning"
|
|
98
|
+
? (preview) => {
|
|
99
|
+
if (laneName === "reasoning") {
|
|
100
|
+
if (!archivedReasoningPreviewIds.includes(preview.messageId)) {
|
|
101
|
+
archivedReasoningPreviewIds.push(preview.messageId);
|
|
102
|
+
}
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
archivedAnswerPreviews.push({
|
|
106
|
+
messageId: preview.messageId,
|
|
107
|
+
textSnapshot: preview.textSnapshot,
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
: undefined,
|
|
96
111
|
log: logVerbose,
|
|
97
112
|
warn: logVerbose,
|
|
98
113
|
})
|
|
99
114
|
: undefined;
|
|
100
|
-
const chunker = stream && streamMode === "block"
|
|
101
|
-
? new EmbeddedBlockChunker(resolveTelegramDraftStreamingChunking(cfg, route.accountId))
|
|
102
|
-
: undefined;
|
|
103
115
|
return {
|
|
104
116
|
stream,
|
|
105
117
|
lastPartialText: "",
|
|
106
|
-
draftText: "",
|
|
107
118
|
hasStreamedMessage: false,
|
|
108
|
-
chunker,
|
|
109
119
|
};
|
|
110
120
|
};
|
|
111
121
|
const lanes = {
|
|
112
|
-
answer: createDraftLane(canStreamAnswerDraft),
|
|
113
|
-
reasoning: createDraftLane(canStreamReasoningDraft),
|
|
122
|
+
answer: createDraftLane("answer", canStreamAnswerDraft),
|
|
123
|
+
reasoning: createDraftLane("reasoning", canStreamReasoningDraft),
|
|
114
124
|
};
|
|
115
125
|
const answerLane = lanes.answer;
|
|
116
126
|
const reasoningLane = lanes.reasoning;
|
|
@@ -129,9 +139,7 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
129
139
|
};
|
|
130
140
|
const resetDraftLaneState = (lane) => {
|
|
131
141
|
lane.lastPartialText = "";
|
|
132
|
-
lane.draftText = "";
|
|
133
142
|
lane.hasStreamedMessage = false;
|
|
134
|
-
lane.chunker?.reset();
|
|
135
143
|
};
|
|
136
144
|
const updateDraftFromPartial = (lane, text) => {
|
|
137
145
|
const laneStream = lane.stream;
|
|
@@ -143,45 +151,16 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
143
151
|
}
|
|
144
152
|
// Mark that we've received streaming content (for forceNewMessage decision).
|
|
145
153
|
lane.hasStreamedMessage = true;
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
text.length < lane.lastPartialText.length) {
|
|
153
|
-
return;
|
|
154
|
-
}
|
|
155
|
-
lane.lastPartialText = text;
|
|
156
|
-
laneStream.update(text);
|
|
154
|
+
// Some providers briefly emit a shorter prefix snapshot (for example
|
|
155
|
+
// "Sure." -> "Sure" -> "Sure."). Keep the longer preview to avoid
|
|
156
|
+
// visible punctuation flicker.
|
|
157
|
+
if (lane.lastPartialText &&
|
|
158
|
+
lane.lastPartialText.startsWith(text) &&
|
|
159
|
+
text.length < lane.lastPartialText.length) {
|
|
157
160
|
return;
|
|
158
161
|
}
|
|
159
|
-
let delta = text;
|
|
160
|
-
if (text.startsWith(lane.lastPartialText)) {
|
|
161
|
-
delta = text.slice(lane.lastPartialText.length);
|
|
162
|
-
}
|
|
163
|
-
else {
|
|
164
|
-
// Streaming buffer reset (or non-monotonic stream). Start fresh.
|
|
165
|
-
lane.chunker?.reset();
|
|
166
|
-
lane.draftText = "";
|
|
167
|
-
}
|
|
168
162
|
lane.lastPartialText = text;
|
|
169
|
-
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
if (!lane.chunker) {
|
|
173
|
-
lane.draftText = text;
|
|
174
|
-
laneStream.update(lane.draftText);
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
lane.chunker.append(delta);
|
|
178
|
-
lane.chunker.drain({
|
|
179
|
-
force: false,
|
|
180
|
-
emit: (chunk) => {
|
|
181
|
-
lane.draftText += chunk;
|
|
182
|
-
laneStream.update(lane.draftText);
|
|
183
|
-
},
|
|
184
|
-
});
|
|
163
|
+
laneStream.update(text);
|
|
185
164
|
};
|
|
186
165
|
const ingestDraftLaneSegments = (text) => {
|
|
187
166
|
for (const segment of splitTextIntoLaneSegments(text)) {
|
|
@@ -196,21 +175,9 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
196
175
|
if (!lane.stream) {
|
|
197
176
|
return;
|
|
198
177
|
}
|
|
199
|
-
if (lane.chunker?.hasBuffered()) {
|
|
200
|
-
lane.chunker.drain({
|
|
201
|
-
force: true,
|
|
202
|
-
emit: (chunk) => {
|
|
203
|
-
lane.draftText += chunk;
|
|
204
|
-
},
|
|
205
|
-
});
|
|
206
|
-
lane.chunker.reset();
|
|
207
|
-
if (lane.draftText) {
|
|
208
|
-
lane.stream.update(lane.draftText);
|
|
209
|
-
}
|
|
210
|
-
}
|
|
211
178
|
await lane.stream.flush();
|
|
212
179
|
};
|
|
213
|
-
const disableBlockStreaming =
|
|
180
|
+
const disableBlockStreaming = !previewStreamingEnabled
|
|
214
181
|
? true
|
|
215
182
|
: forceBlockStreamingForReasoning
|
|
216
183
|
? false
|
|
@@ -309,21 +276,24 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
309
276
|
linkPreview: telegramCfg.linkPreview,
|
|
310
277
|
replyQuoteText,
|
|
311
278
|
};
|
|
312
|
-
const getLanePreviewText = (lane) =>
|
|
279
|
+
const getLanePreviewText = (lane) => lane.lastPartialText;
|
|
313
280
|
const tryUpdatePreviewForLane = async (params) => {
|
|
314
|
-
const { lane, laneName, text, previewButtons, stopBeforeEdit = false, updateLaneSnapshot = false, skipRegressive, context, } = params;
|
|
281
|
+
const { lane, laneName, text, previewButtons, stopBeforeEdit = false, updateLaneSnapshot = false, skipRegressive, context, previewMessageId: previewMessageIdOverride, previewTextSnapshot, } = params;
|
|
315
282
|
if (!lane.stream) {
|
|
316
283
|
return false;
|
|
317
284
|
}
|
|
318
|
-
const
|
|
285
|
+
const lanePreviewMessageId = lane.stream.messageId();
|
|
286
|
+
const hadPreviewMessage = typeof previewMessageIdOverride === "number" || typeof lanePreviewMessageId === "number";
|
|
319
287
|
if (stopBeforeEdit) {
|
|
320
288
|
await lane.stream.stop();
|
|
321
289
|
}
|
|
322
|
-
const previewMessageId =
|
|
290
|
+
const previewMessageId = typeof previewMessageIdOverride === "number"
|
|
291
|
+
? previewMessageIdOverride
|
|
292
|
+
: lane.stream.messageId();
|
|
323
293
|
if (typeof previewMessageId !== "number") {
|
|
324
294
|
return false;
|
|
325
295
|
}
|
|
326
|
-
const currentPreviewText = getLanePreviewText(lane);
|
|
296
|
+
const currentPreviewText = previewTextSnapshot ?? getLanePreviewText(lane);
|
|
327
297
|
const shouldSkipRegressive = Boolean(currentPreviewText) &&
|
|
328
298
|
currentPreviewText.startsWith(text) &&
|
|
329
299
|
text.length < currentPreviewText.length &&
|
|
@@ -343,7 +313,6 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
343
313
|
});
|
|
344
314
|
if (updateLaneSnapshot) {
|
|
345
315
|
lane.lastPartialText = text;
|
|
346
|
-
lane.draftText = text;
|
|
347
316
|
}
|
|
348
317
|
deliveryState.delivered = true;
|
|
349
318
|
return true;
|
|
@@ -370,14 +339,68 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
370
339
|
}
|
|
371
340
|
return result.delivered;
|
|
372
341
|
};
|
|
342
|
+
const consumeArchivedAnswerPreviewForFinal = async (params) => {
|
|
343
|
+
const archivedPreview = archivedAnswerPreviews.shift();
|
|
344
|
+
if (!archivedPreview) {
|
|
345
|
+
return undefined;
|
|
346
|
+
}
|
|
347
|
+
if (params.canEditViaPreview) {
|
|
348
|
+
const finalized = await tryUpdatePreviewForLane({
|
|
349
|
+
lane: params.lane,
|
|
350
|
+
laneName: "answer",
|
|
351
|
+
text: params.text,
|
|
352
|
+
previewButtons: params.previewButtons,
|
|
353
|
+
stopBeforeEdit: false,
|
|
354
|
+
skipRegressive: "existingOnly",
|
|
355
|
+
context: "final",
|
|
356
|
+
previewMessageId: archivedPreview.messageId,
|
|
357
|
+
previewTextSnapshot: archivedPreview.textSnapshot,
|
|
358
|
+
});
|
|
359
|
+
if (finalized) {
|
|
360
|
+
return "preview-finalized";
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
try {
|
|
364
|
+
await bot.api.deleteMessage(chatId, archivedPreview.messageId);
|
|
365
|
+
}
|
|
366
|
+
catch (err) {
|
|
367
|
+
logVerbose(`telegram: archived answer preview cleanup failed (${archivedPreview.messageId}): ${String(err)}`);
|
|
368
|
+
}
|
|
369
|
+
const delivered = await sendPayload(applyTextToPayload(params.payload, params.text));
|
|
370
|
+
return delivered ? "sent" : "skipped";
|
|
371
|
+
};
|
|
373
372
|
const deliverLaneText = async (params) => {
|
|
374
373
|
const { laneName, text, payload, infoKind, previewButtons, allowPreviewUpdateForNonFinal = false, } = params;
|
|
375
374
|
const lane = lanes[laneName];
|
|
376
375
|
const hasMedia = Boolean(payload.mediaUrl) || (payload.mediaUrls?.length ?? 0) > 0;
|
|
377
376
|
const canEditViaPreview = !hasMedia && text.length > 0 && text.length <= draftMaxChars && !payload.isError;
|
|
378
377
|
if (infoKind === "final") {
|
|
378
|
+
if (laneName === "answer") {
|
|
379
|
+
const archivedResult = await consumeArchivedAnswerPreviewForFinal({
|
|
380
|
+
lane,
|
|
381
|
+
text,
|
|
382
|
+
payload,
|
|
383
|
+
previewButtons,
|
|
384
|
+
canEditViaPreview,
|
|
385
|
+
});
|
|
386
|
+
if (archivedResult) {
|
|
387
|
+
return archivedResult;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
379
390
|
if (canEditViaPreview && !finalizedPreviewByLane[laneName]) {
|
|
380
391
|
await flushDraftLane(lane);
|
|
392
|
+
if (laneName === "answer") {
|
|
393
|
+
const archivedResultAfterFlush = await consumeArchivedAnswerPreviewForFinal({
|
|
394
|
+
lane,
|
|
395
|
+
text,
|
|
396
|
+
payload,
|
|
397
|
+
previewButtons,
|
|
398
|
+
canEditViaPreview,
|
|
399
|
+
});
|
|
400
|
+
if (archivedResultAfterFlush) {
|
|
401
|
+
return archivedResultAfterFlush;
|
|
402
|
+
}
|
|
403
|
+
}
|
|
381
404
|
const finalized = await tryUpdatePreviewForLane({
|
|
382
405
|
lane,
|
|
383
406
|
laneName,
|
|
@@ -418,6 +441,9 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
418
441
|
return delivered ? "sent" : "skipped";
|
|
419
442
|
};
|
|
420
443
|
let queuedFinal = false;
|
|
444
|
+
if (statusReactionController) {
|
|
445
|
+
void statusReactionController.setThinking();
|
|
446
|
+
}
|
|
421
447
|
try {
|
|
422
448
|
({ queuedFinal } = await dispatchReplyWithBufferedBlockDispatcher({
|
|
423
449
|
ctx: ctxPayload,
|
|
@@ -536,10 +562,16 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
536
562
|
}
|
|
537
563
|
: undefined,
|
|
538
564
|
onAssistantMessageStart: answerLane.stream
|
|
539
|
-
? () => {
|
|
565
|
+
? async () => {
|
|
540
566
|
reasoningStepState.resetForNextStep();
|
|
541
|
-
|
|
542
|
-
|
|
567
|
+
if (answerLane.hasStreamedMessage) {
|
|
568
|
+
const previewMessageId = answerLane.stream?.messageId();
|
|
569
|
+
if (typeof previewMessageId === "number") {
|
|
570
|
+
archivedAnswerPreviews.push({
|
|
571
|
+
messageId: previewMessageId,
|
|
572
|
+
textSnapshot: answerLane.lastPartialText,
|
|
573
|
+
});
|
|
574
|
+
}
|
|
543
575
|
answerLane.stream?.forceNewMessage();
|
|
544
576
|
}
|
|
545
577
|
resetDraftLaneState(answerLane);
|
|
@@ -551,6 +583,11 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
551
583
|
splitReasoningOnNextStream = reasoningLane.hasStreamedMessage;
|
|
552
584
|
}
|
|
553
585
|
: undefined,
|
|
586
|
+
onToolStart: statusReactionController
|
|
587
|
+
? async (payload) => {
|
|
588
|
+
await statusReactionController.setTool(payload.name);
|
|
589
|
+
}
|
|
590
|
+
: undefined,
|
|
554
591
|
onModelSelected,
|
|
555
592
|
},
|
|
556
593
|
}));
|
|
@@ -581,6 +618,22 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
581
618
|
await stream.clear();
|
|
582
619
|
}
|
|
583
620
|
}
|
|
621
|
+
for (const archivedPreview of archivedAnswerPreviews) {
|
|
622
|
+
try {
|
|
623
|
+
await bot.api.deleteMessage(chatId, archivedPreview.messageId);
|
|
624
|
+
}
|
|
625
|
+
catch (err) {
|
|
626
|
+
logVerbose(`telegram: archived answer preview cleanup failed (${archivedPreview.messageId}): ${String(err)}`);
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
for (const messageId of archivedReasoningPreviewIds) {
|
|
630
|
+
try {
|
|
631
|
+
await bot.api.deleteMessage(chatId, messageId);
|
|
632
|
+
}
|
|
633
|
+
catch (err) {
|
|
634
|
+
logVerbose(`telegram: archived reasoning preview cleanup failed (${messageId}): ${String(err)}`);
|
|
635
|
+
}
|
|
636
|
+
}
|
|
584
637
|
}
|
|
585
638
|
let sentFallback = false;
|
|
586
639
|
if (!deliveryState.delivered &&
|
|
@@ -592,26 +645,38 @@ export const dispatchTelegramMessage = async ({ context, bot, cfg, runtime, repl
|
|
|
592
645
|
sentFallback = result.delivered;
|
|
593
646
|
}
|
|
594
647
|
const hasFinalResponse = queuedFinal || sentFallback;
|
|
648
|
+
if (statusReactionController && !hasFinalResponse) {
|
|
649
|
+
void statusReactionController.setError().catch((err) => {
|
|
650
|
+
logVerbose(`telegram: status reaction error finalize failed: ${String(err)}`);
|
|
651
|
+
});
|
|
652
|
+
}
|
|
595
653
|
if (!hasFinalResponse) {
|
|
596
654
|
clearGroupHistory();
|
|
597
655
|
return;
|
|
598
656
|
}
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
657
|
+
if (statusReactionController) {
|
|
658
|
+
void statusReactionController.setDone().catch((err) => {
|
|
659
|
+
logVerbose(`telegram: status reaction finalize failed: ${String(err)}`);
|
|
660
|
+
});
|
|
661
|
+
}
|
|
662
|
+
else {
|
|
663
|
+
removeAckReactionAfterReply({
|
|
664
|
+
removeAfterReply: removeAckAfterReply,
|
|
665
|
+
ackReactionPromise,
|
|
666
|
+
ackReactionValue: ackReactionPromise ? "ack" : null,
|
|
667
|
+
remove: () => reactionApi?.(chatId, msg.message_id ?? 0, []) ?? Promise.resolve(),
|
|
668
|
+
onError: (err) => {
|
|
669
|
+
if (!msg.message_id) {
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
logAckFailure({
|
|
673
|
+
log: logVerbose,
|
|
674
|
+
channel: "telegram",
|
|
675
|
+
target: `${chatId}/${msg.message_id}`,
|
|
676
|
+
error: err,
|
|
677
|
+
});
|
|
678
|
+
},
|
|
679
|
+
});
|
|
680
|
+
}
|
|
616
681
|
clearGroupHistory();
|
|
617
682
|
};
|
|
@@ -6,6 +6,7 @@ import { listSkillCommandsForAgents } from "../auto-reply/skill-commands.js";
|
|
|
6
6
|
import { resolveCommandAuthorizedFromAuthorizers } from "../channels/command-gating.js";
|
|
7
7
|
import { createReplyPrefixOptions } from "../channels/reply-prefix.js";
|
|
8
8
|
import { resolveMarkdownTableMode } from "../config/markdown-tables.js";
|
|
9
|
+
import { recordSessionMetaFromInbound, resolveStorePath } from "../config/sessions.js";
|
|
9
10
|
import { normalizeTelegramCommandName, resolveTelegramCustomCommands, TELEGRAM_COMMAND_NAME_PATTERN, } from "../config/telegram-custom-commands.js";
|
|
10
11
|
import { danger, logVerbose } from "../globals.js";
|
|
11
12
|
import { getAgentScopedMediaLocalRoots } from "../media/local-roots.js";
|
|
@@ -29,6 +30,7 @@ async function resolveTelegramCommandAuth(params) {
|
|
|
29
30
|
const groupAllowContext = await resolveTelegramGroupAllowFromContext({
|
|
30
31
|
chatId,
|
|
31
32
|
accountId,
|
|
33
|
+
dmPolicy: telegramCfg.dmPolicy ?? "pairing",
|
|
32
34
|
isForum,
|
|
33
35
|
messageThreadId,
|
|
34
36
|
groupAllowFrom,
|
|
@@ -100,6 +102,7 @@ async function resolveTelegramCommandAuth(params) {
|
|
|
100
102
|
const dmAllow = normalizeAllowFromWithStore({
|
|
101
103
|
allowFrom: allowFrom,
|
|
102
104
|
storeAllowFrom,
|
|
105
|
+
dmPolicy: telegramCfg.dmPolicy ?? "pairing",
|
|
103
106
|
});
|
|
104
107
|
const senderAllowed = isSenderAllowed({
|
|
105
108
|
allow: dmAllow,
|
|
@@ -377,6 +380,19 @@ export const registerTelegramNativeCommands = ({ bot, cfg, runtime, accountId, t
|
|
|
377
380
|
OriginatingChannel: "telegram",
|
|
378
381
|
OriginatingTo: `telegram:${chatId}`,
|
|
379
382
|
});
|
|
383
|
+
const storePath = resolveStorePath(cfg.session?.store, {
|
|
384
|
+
agentId: route.agentId,
|
|
385
|
+
});
|
|
386
|
+
try {
|
|
387
|
+
await recordSessionMetaFromInbound({
|
|
388
|
+
storePath,
|
|
389
|
+
sessionKey: ctxPayload.SessionKey ?? route.sessionKey,
|
|
390
|
+
ctx: ctxPayload,
|
|
391
|
+
});
|
|
392
|
+
}
|
|
393
|
+
catch (err) {
|
|
394
|
+
runtime.error?.(danger(`telegram slash: failed updating session meta: ${String(err)}`));
|
|
395
|
+
}
|
|
380
396
|
const disableBlockStreaming = typeof telegramCfg.blockStreaming === "boolean"
|
|
381
397
|
? !telegramCfg.blockStreaming
|
|
382
398
|
: undefined;
|
|
@@ -16,6 +16,7 @@ export function createTelegramDraftStream(params) {
|
|
|
16
16
|
let lastSentParseMode;
|
|
17
17
|
let stopped = false;
|
|
18
18
|
let isFinal = false;
|
|
19
|
+
let generation = 0;
|
|
19
20
|
const sendOrEditStreamMessage = async (text) => {
|
|
20
21
|
// Allow final flush even if stopped (e.g., after clear()).
|
|
21
22
|
if (stopped && !isFinal) {
|
|
@@ -41,6 +42,7 @@ export function createTelegramDraftStream(params) {
|
|
|
41
42
|
if (renderedText === lastSentText && renderedParseMode === lastSentParseMode) {
|
|
42
43
|
return true;
|
|
43
44
|
}
|
|
45
|
+
const sendGeneration = generation;
|
|
44
46
|
// Debounce first preview send for better push notification quality.
|
|
45
47
|
if (typeof streamMessageId !== "number" && minInitialChars != null && !isFinal) {
|
|
46
48
|
if (renderedText.length < minInitialChars) {
|
|
@@ -74,7 +76,16 @@ export function createTelegramDraftStream(params) {
|
|
|
74
76
|
params.warn?.("telegram stream preview stopped (missing message id from sendMessage)");
|
|
75
77
|
return false;
|
|
76
78
|
}
|
|
77
|
-
|
|
79
|
+
const normalizedMessageId = Math.trunc(sentMessageId);
|
|
80
|
+
if (sendGeneration !== generation) {
|
|
81
|
+
params.onSupersededPreview?.({
|
|
82
|
+
messageId: normalizedMessageId,
|
|
83
|
+
textSnapshot: renderedText,
|
|
84
|
+
parseMode: renderedParseMode,
|
|
85
|
+
});
|
|
86
|
+
return true;
|
|
87
|
+
}
|
|
88
|
+
streamMessageId = normalizedMessageId;
|
|
78
89
|
return true;
|
|
79
90
|
}
|
|
80
91
|
catch (err) {
|
|
@@ -116,10 +127,12 @@ export function createTelegramDraftStream(params) {
|
|
|
116
127
|
}
|
|
117
128
|
};
|
|
118
129
|
const forceNewMessage = () => {
|
|
130
|
+
generation += 1;
|
|
119
131
|
streamMessageId = undefined;
|
|
120
132
|
lastSentText = "";
|
|
121
133
|
lastSentParseMode = undefined;
|
|
122
134
|
loop.resetPending();
|
|
135
|
+
loop.resetThrottleWindow();
|
|
123
136
|
};
|
|
124
137
|
params.log?.(`telegram stream preview ready (maxChars=${maxChars}, throttleMs=${throttleMs})`);
|
|
125
138
|
return {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { listTelegramAccountIds, resolveTelegramAccount } from "./accounts.js";
|
|
2
|
-
import { parseTelegramTarget } from "./targets.js";
|
|
3
2
|
const DEFAULT_INLINE_BUTTONS_SCOPE = "allowlist";
|
|
4
3
|
function normalizeInlineButtonsScope(value) {
|
|
5
|
-
if (typeof value !== "string")
|
|
4
|
+
if (typeof value !== "string") {
|
|
6
5
|
return undefined;
|
|
6
|
+
}
|
|
7
7
|
const trimmed = value.trim().toLowerCase();
|
|
8
8
|
if (trimmed === "off" ||
|
|
9
9
|
trimmed === "dm" ||
|
|
@@ -15,8 +15,9 @@ function normalizeInlineButtonsScope(value) {
|
|
|
15
15
|
return undefined;
|
|
16
16
|
}
|
|
17
17
|
function resolveInlineButtonsScopeFromCapabilities(capabilities) {
|
|
18
|
-
if (!capabilities)
|
|
18
|
+
if (!capabilities) {
|
|
19
19
|
return DEFAULT_INLINE_BUTTONS_SCOPE;
|
|
20
|
+
}
|
|
20
21
|
if (Array.isArray(capabilities)) {
|
|
21
22
|
const enabled = capabilities.some((entry) => String(entry).trim().toLowerCase() === "inlinebuttons");
|
|
22
23
|
return enabled ? "all" : "off";
|
|
@@ -41,15 +42,4 @@ export function isTelegramInlineButtonsEnabled(params) {
|
|
|
41
42
|
}
|
|
42
43
|
return accountIds.some((accountId) => resolveTelegramInlineButtonsScope({ cfg: params.cfg, accountId }) !== "off");
|
|
43
44
|
}
|
|
44
|
-
export
|
|
45
|
-
if (!target.trim())
|
|
46
|
-
return "unknown";
|
|
47
|
-
const parsed = parseTelegramTarget(target);
|
|
48
|
-
const chatId = parsed.chatId.trim();
|
|
49
|
-
if (!chatId)
|
|
50
|
-
return "unknown";
|
|
51
|
-
if (/^-?\d+$/.test(chatId)) {
|
|
52
|
-
return chatId.startsWith("-") ? "group" : "direct";
|
|
53
|
-
}
|
|
54
|
-
return "unknown";
|
|
55
|
-
}
|
|
45
|
+
export { resolveTelegramTargetChatType } from "./targets.js";
|
package/dist/telegram/monitor.js
CHANGED
|
@@ -39,12 +39,14 @@ const TELEGRAM_POLL_RESTART_POLICY = {
|
|
|
39
39
|
jitter: 0.25,
|
|
40
40
|
};
|
|
41
41
|
const isGetUpdatesConflict = (err) => {
|
|
42
|
-
if (!err || typeof err !== "object")
|
|
42
|
+
if (!err || typeof err !== "object") {
|
|
43
43
|
return false;
|
|
44
|
+
}
|
|
44
45
|
const typed = err;
|
|
45
46
|
const errorCode = typed.error_code ?? typed.errorCode;
|
|
46
|
-
if (errorCode !== 409)
|
|
47
|
+
if (errorCode !== 409) {
|
|
47
48
|
return false;
|
|
49
|
+
}
|
|
48
50
|
const haystack = [typed.method, typed.description, typed.message]
|
|
49
51
|
.filter((value) => typeof value === "string")
|
|
50
52
|
.join(" ")
|
|
@@ -81,14 +83,14 @@ export async function monitorTelegramProvider(opts = {}) {
|
|
|
81
83
|
if (!token) {
|
|
82
84
|
throw new Error(`Telegram bot token missing for account "${account.accountId}" (set channels.telegram.accounts.${account.accountId}.botToken/tokenFile or TELEGRAM_BOT_TOKEN for default).`);
|
|
83
85
|
}
|
|
84
|
-
const proxyFetch = opts.proxyFetch ??
|
|
85
|
-
(account.config.proxy ? makeProxyFetch(account.config.proxy) : undefined);
|
|
86
|
+
const proxyFetch = opts.proxyFetch ?? (account.config.proxy ? makeProxyFetch(account.config.proxy) : undefined);
|
|
86
87
|
let lastUpdateId = await readTelegramUpdateOffset({
|
|
87
88
|
accountId: account.accountId,
|
|
88
89
|
});
|
|
89
90
|
const persistUpdateId = async (updateId) => {
|
|
90
|
-
if (lastUpdateId !== null && updateId <= lastUpdateId)
|
|
91
|
+
if (lastUpdateId !== null && updateId <= lastUpdateId) {
|
|
91
92
|
return;
|
|
93
|
+
}
|
|
92
94
|
lastUpdateId = updateId;
|
|
93
95
|
try {
|
|
94
96
|
await writeTelegramUpdateOffset({
|
|
@@ -118,7 +120,8 @@ export async function monitorTelegramProvider(opts = {}) {
|
|
|
118
120
|
config: cfg,
|
|
119
121
|
path: opts.webhookPath,
|
|
120
122
|
port: opts.webhookPort,
|
|
121
|
-
secret: opts.webhookSecret,
|
|
123
|
+
secret: opts.webhookSecret ?? account.config.webhookSecret,
|
|
124
|
+
host: opts.webhookHost ?? account.config.webhookHost,
|
|
122
125
|
runtime: opts.runtime,
|
|
123
126
|
fetch: proxyFetch,
|
|
124
127
|
abortSignal: opts.abortSignal,
|
|
@@ -159,8 +162,9 @@ export async function monitorTelegramProvider(opts = {}) {
|
|
|
159
162
|
await sleepWithAbort(delayMs, opts.abortSignal);
|
|
160
163
|
}
|
|
161
164
|
catch (sleepErr) {
|
|
162
|
-
if (opts.abortSignal?.aborted)
|
|
165
|
+
if (opts.abortSignal?.aborted) {
|
|
163
166
|
return;
|
|
167
|
+
}
|
|
164
168
|
throw sleepErr;
|
|
165
169
|
}
|
|
166
170
|
}
|
|
@@ -1,27 +1,39 @@
|
|
|
1
1
|
import process from "node:process";
|
|
2
2
|
import { isTruthyEnvValue } from "../infra/env.js";
|
|
3
|
+
import { isWSL2Sync } from "../infra/wsl.js";
|
|
3
4
|
export const TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV = "POOLBOT_TELEGRAM_DISABLE_AUTO_SELECT_FAMILY";
|
|
4
5
|
export const TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV = "POOLBOT_TELEGRAM_ENABLE_AUTO_SELECT_FAMILY";
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
let wsl2SyncCache;
|
|
7
|
+
function isWSL2SyncCached() {
|
|
8
|
+
if (typeof wsl2SyncCache === "boolean") {
|
|
9
|
+
return wsl2SyncCache;
|
|
10
|
+
}
|
|
11
|
+
wsl2SyncCache = isWSL2Sync();
|
|
12
|
+
return wsl2SyncCache;
|
|
13
|
+
}
|
|
7
14
|
export function resolveTelegramAutoSelectFamilyDecision(params) {
|
|
8
15
|
const env = params?.env ?? process.env;
|
|
9
16
|
const nodeMajor = typeof params?.nodeMajor === "number"
|
|
10
17
|
? params.nodeMajor
|
|
11
18
|
: Number(process.versions.node.split(".")[0]);
|
|
12
|
-
if (isTruthyEnvValue(env[TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV])
|
|
13
|
-
isTruthyEnvValue(env[TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV_LEGACY])) {
|
|
19
|
+
if (isTruthyEnvValue(env[TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV])) {
|
|
14
20
|
return { value: true, source: `env:${TELEGRAM_ENABLE_AUTO_SELECT_FAMILY_ENV}` };
|
|
15
21
|
}
|
|
16
|
-
if (isTruthyEnvValue(env[TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV])
|
|
17
|
-
isTruthyEnvValue(env[TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV_LEGACY])) {
|
|
22
|
+
if (isTruthyEnvValue(env[TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV])) {
|
|
18
23
|
return { value: false, source: `env:${TELEGRAM_DISABLE_AUTO_SELECT_FAMILY_ENV}` };
|
|
19
24
|
}
|
|
20
25
|
if (typeof params?.network?.autoSelectFamily === "boolean") {
|
|
21
26
|
return { value: params.network.autoSelectFamily, source: "config" };
|
|
22
27
|
}
|
|
28
|
+
// WSL2 has unstable IPv6 connectivity; disable autoSelectFamily to use IPv4 directly
|
|
29
|
+
if (isWSL2SyncCached()) {
|
|
30
|
+
return { value: false, source: "default-wsl2" };
|
|
31
|
+
}
|
|
23
32
|
if (Number.isFinite(nodeMajor) && nodeMajor >= 22) {
|
|
24
|
-
return { value:
|
|
33
|
+
return { value: true, source: "default-node22" };
|
|
25
34
|
}
|
|
26
35
|
return { value: null };
|
|
27
36
|
}
|
|
37
|
+
export function resetTelegramNetworkConfigStateForTests() {
|
|
38
|
+
wsl2SyncCache = undefined;
|
|
39
|
+
}
|
package/dist/telegram/send.js
CHANGED
|
@@ -27,6 +27,7 @@ const PARSE_ERR_RE = /can't parse entities|parse entities|find end of the entity
|
|
|
27
27
|
const THREAD_NOT_FOUND_RE = /400:\s*Bad Request:\s*message thread not found/i;
|
|
28
28
|
const MESSAGE_NOT_MODIFIED_RE = /400:\s*Bad Request:\s*message is not modified|MESSAGE_NOT_MODIFIED/i;
|
|
29
29
|
const CHAT_NOT_FOUND_RE = /400: Bad Request: chat not found/i;
|
|
30
|
+
const sendLogger = createSubsystemLogger("telegram/send");
|
|
30
31
|
const diagLogger = createSubsystemLogger("telegram/diagnostic");
|
|
31
32
|
function createTelegramHttpLogger(cfg) {
|
|
32
33
|
const enabled = isDiagnosticFlagEnabled("telegram.http", cfg);
|
|
@@ -176,7 +177,7 @@ async function withTelegramHtmlParseFallback(params) {
|
|
|
176
177
|
throw err;
|
|
177
178
|
}
|
|
178
179
|
if (params.verbose) {
|
|
179
|
-
|
|
180
|
+
sendLogger.warn(`telegram ${params.label} failed with HTML parse error, retrying as plain text: ${formatErrorMessage(err)}`);
|
|
180
181
|
}
|
|
181
182
|
return await params.requestPlain(`${params.label}-plain`);
|
|
182
183
|
}
|
|
@@ -236,7 +237,7 @@ async function withTelegramThreadFallback(params, label, verbose, attempt) {
|
|
|
236
237
|
throw err;
|
|
237
238
|
}
|
|
238
239
|
if (verbose) {
|
|
239
|
-
|
|
240
|
+
sendLogger.warn(`telegram ${label} failed with message_thread_id, retrying without thread: ${formatErrorMessage(err)}`);
|
|
240
241
|
}
|
|
241
242
|
const retriedParams = removeMessageThreadIdParam(params);
|
|
242
243
|
return await attempt(retriedParams, `${label}-threadless`);
|