@poolzin/pool-bot 2026.2.24 → 2026.2.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/dist/acp/client.js +207 -18
- package/dist/acp/event-mapper.js +87 -22
- package/dist/acp/meta.js +12 -6
- package/dist/acp/secret-file.js +22 -0
- package/dist/agents/agent-paths.js +8 -9
- package/dist/agents/agent-scope.js +17 -5
- package/dist/agents/auth-profiles/oauth.js +148 -64
- package/dist/agents/auth-profiles/session-override.js +13 -7
- package/dist/agents/bash-process-registry.test-helpers.js +29 -0
- package/dist/agents/bash-tools.exec-approval-request.js +20 -0
- package/dist/agents/bash-tools.exec-host-gateway.js +240 -0
- package/dist/agents/bash-tools.exec-host-node.js +235 -0
- package/dist/agents/bash-tools.exec-runtime.js +2 -25
- package/dist/agents/bash-tools.exec-types.js +1 -0
- package/dist/agents/bash-tools.process.js +224 -218
- package/dist/agents/bedrock-discovery.js +3 -1
- package/dist/agents/byteplus-models.js +97 -0
- package/dist/agents/chutes-oauth.js +1 -0
- package/dist/agents/cli-runner/helpers.js +4 -0
- package/dist/agents/compaction.js +41 -14
- package/dist/agents/content-blocks.js +16 -0
- package/dist/agents/doubao-models.js +121 -0
- package/dist/agents/failover-error.js +2 -0
- package/dist/agents/huggingface-models.js +5 -3
- package/dist/agents/live-model-filter.js +5 -0
- package/dist/agents/minimax-vlm.js +10 -8
- package/dist/agents/model-auth.js +6 -0
- package/dist/agents/model-catalog.js +3 -1
- package/dist/agents/model-fallback.js +96 -101
- package/dist/agents/model-selection.js +7 -1
- package/dist/agents/models-config.providers.js +364 -165
- package/dist/agents/ollama-stream.js +117 -4
- package/dist/agents/opencode-zen-models.js +22 -11
- package/dist/agents/pi-embedded-helpers/errors.js +55 -33
- package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
- package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
- package/dist/agents/pi-embedded-helpers.js +1 -1
- package/dist/agents/pi-embedded-payloads.js +1 -0
- package/dist/agents/pi-embedded-runner/compact.js +29 -7
- package/dist/agents/pi-embedded-runner/extensions.js +28 -26
- package/dist/agents/pi-embedded-runner/google.js +20 -8
- package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
- package/dist/agents/pi-embedded-runner/run.js +71 -12
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.fixture.js +34 -0
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
- package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
- package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
- package/dist/agents/pi-embedded-runner/thinking.js +42 -0
- package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
- package/dist/agents/pi-embedded-runner/utils.js +7 -10
- package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
- package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
- package/dist/agents/pi-embedded-subscribe.js +9 -4
- package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
- package/dist/agents/pi-embedded-utils.js +3 -0
- package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
- package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
- package/dist/agents/pi-settings.js +40 -0
- package/dist/agents/pi-tools.policy.js +2 -1
- package/dist/agents/provider/config-loader.js +1 -1
- package/dist/agents/sandbox/browser.js +170 -33
- package/dist/agents/sandbox/config-hash.js +14 -27
- package/dist/agents/sandbox/config.js +21 -2
- package/dist/agents/sandbox/constants.js +2 -0
- package/dist/agents/sandbox/docker.js +16 -2
- package/dist/agents/sandbox/novnc-auth.js +62 -0
- package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
- package/dist/agents/sandbox/shared.js +10 -6
- package/dist/agents/sandbox-paths.js +24 -11
- package/dist/agents/schema/clean-for-gemini.js +132 -85
- package/dist/agents/session-slug.js +10 -5
- package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
- package/dist/agents/session-tool-result-guard.js +3 -1
- package/dist/agents/session-transcript-repair.js +40 -6
- package/dist/agents/skills/bundled-dir.js +19 -5
- package/dist/agents/skills/env-overrides.js +124 -43
- package/dist/agents/skills/frontmatter.js +6 -6
- package/dist/agents/skills/plugin-skills.js +14 -7
- package/dist/agents/skills/workspace.js +1 -0
- package/dist/agents/skills.test-helpers.js +13 -0
- package/dist/agents/stable-stringify.js +12 -0
- package/dist/agents/subagent-announce.js +251 -49
- package/dist/agents/subagent-lifecycle-events.js +19 -0
- package/dist/agents/subagent-registry-cleanup.js +31 -0
- package/dist/agents/subagent-registry-completion.js +68 -0
- package/dist/agents/subagent-registry-queries.js +117 -0
- package/dist/agents/subagent-registry-state.js +46 -0
- package/dist/agents/subagent-registry.js +252 -221
- package/dist/agents/subagent-registry.mocks.shared.js +12 -0
- package/dist/agents/subagent-registry.store.js +1 -0
- package/dist/agents/subagent-registry.types.js +1 -0
- package/dist/agents/subagent-spawn.js +195 -7
- package/dist/agents/system-prompt.js +22 -6
- package/dist/agents/test-helpers/assistant-message-fixtures.js +29 -0
- package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
- package/dist/agents/test-helpers/fast-core-tools.js +1 -17
- package/dist/agents/test-helpers/pi-tools-sandbox-context.js +27 -0
- package/dist/agents/timeout.js +18 -6
- package/dist/agents/tool-call-id.js +1 -1
- package/dist/agents/tool-display-common.js +162 -29
- package/dist/agents/tool-images.js +82 -9
- package/dist/agents/tool-policy-shared.js +108 -0
- package/dist/agents/tool-policy.js +51 -26
- package/dist/agents/tools/browser-tool.js +160 -54
- package/dist/agents/tools/canvas-tool.js +27 -1
- package/dist/agents/tools/common.js +45 -0
- package/dist/agents/tools/cron-tool.test-helpers.js +12 -0
- package/dist/agents/tools/discord-actions-guild.js +4 -1
- package/dist/agents/tools/discord-actions-moderation-shared.js +27 -0
- package/dist/agents/tools/gateway-tool.js +3 -1
- package/dist/agents/tools/image-tool.js +214 -99
- package/dist/agents/tools/nodes-utils.js +1 -10
- package/dist/agents/tools/sessions-history-tool.js +140 -108
- package/dist/agents/tools/sessions-send-helpers.js +12 -6
- package/dist/agents/tools/sessions-spawn-tool.js +8 -2
- package/dist/agents/tools/subagents-tool.js +2 -1
- package/dist/agents/tools/whatsapp-actions.js +10 -2
- package/dist/agents/tools/whatsapp-target-auth.js +18 -0
- package/dist/agents/transcript-policy.js +22 -8
- package/dist/agents/venice-models.js +11 -3
- package/dist/agents/workspace.js +222 -46
- package/dist/auto-reply/commands-registry.data.js +51 -0
- package/dist/auto-reply/commands-registry.js +19 -21
- package/dist/auto-reply/fallback-state.js +114 -0
- package/dist/auto-reply/group-activation.js +10 -5
- package/dist/auto-reply/inbound-debounce.js +10 -5
- package/dist/auto-reply/model-runtime.js +68 -0
- package/dist/auto-reply/reply/abort.js +1 -1
- package/dist/auto-reply/reply/agent-runner-execution.js +40 -5
- package/dist/auto-reply/reply/agent-runner.js +165 -39
- package/dist/auto-reply/reply/bash-command.js +41 -39
- package/dist/auto-reply/reply/command-gates.js +25 -0
- package/dist/auto-reply/reply/commands-allowlist.js +111 -72
- package/dist/auto-reply/reply/commands-bash.js +6 -5
- package/dist/auto-reply/reply/commands-config.js +30 -28
- package/dist/auto-reply/reply/commands-core.js +2 -1
- package/dist/auto-reply/reply/commands-info.js +1 -0
- package/dist/auto-reply/reply/commands-models.js +65 -14
- package/dist/auto-reply/reply/commands-session.js +237 -82
- package/dist/auto-reply/reply/commands-setunset-standard.js +13 -0
- package/dist/auto-reply/reply/commands-setunset.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
- package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
- package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
- package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
- package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
- package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
- package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
- package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
- package/dist/auto-reply/reply/commands-subagents.js +51 -587
- package/dist/auto-reply/reply/commands-tts.js +10 -5
- package/dist/auto-reply/reply/config-value.js +10 -5
- package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
- package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
- package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
- package/dist/auto-reply/reply/followup-runner.js +1 -0
- package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
- package/dist/auto-reply/reply/get-reply-directives.js +17 -28
- package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
- package/dist/auto-reply/reply/get-reply.js +71 -12
- package/dist/auto-reply/reply/model-selection.js +80 -39
- package/dist/auto-reply/reply/queue/enqueue.js +10 -5
- package/dist/auto-reply/reply/queue/state.js +13 -12
- package/dist/auto-reply/reply/reply-payloads.js +67 -36
- package/dist/auto-reply/reply/reply-reference.js +9 -8
- package/dist/auto-reply/reply/route-reply.js +15 -8
- package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
- package/dist/auto-reply/reply/session.js +22 -6
- package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
- package/dist/auto-reply/reply/subagents-utils.js +56 -30
- package/dist/auto-reply/reply/typing.js +46 -21
- package/dist/auto-reply/send-policy.js +14 -7
- package/dist/auto-reply/status.js +140 -16
- package/dist/auto-reply/templating.js +10 -5
- package/dist/auto-reply/thinking.js +7 -16
- package/dist/auto-reply/tokens.js +21 -5
- package/dist/browser/bridge-server.js +36 -20
- package/dist/browser/cdp.helpers.js +7 -14
- package/dist/browser/cdp.js +35 -15
- package/dist/browser/chrome.profile-decoration.js +7 -4
- package/dist/browser/config.js +30 -0
- package/dist/browser/extension-relay-auth.js +55 -0
- package/dist/browser/extension-relay.js +74 -29
- package/dist/browser/navigation-guard.js +39 -0
- package/dist/browser/paths.js +77 -0
- package/dist/browser/profiles.js +13 -8
- package/dist/browser/pw-ai-module.js +10 -5
- package/dist/browser/pw-session.js +76 -39
- package/dist/browser/pw-tools-core.interactions.js +14 -7
- package/dist/browser/pw-tools-core.state.js +12 -6
- package/dist/browser/routes/agent.act.js +431 -424
- package/dist/browser/routes/agent.shared.js +47 -3
- package/dist/browser/routes/agent.snapshot.js +122 -116
- package/dist/browser/routes/agent.storage.js +303 -297
- package/dist/browser/routes/tabs.js +154 -100
- package/dist/browser/server-context.js +7 -0
- package/dist/browser/server-lifecycle.js +37 -0
- package/dist/build-info.json +3 -3
- package/dist/channels/allow-from.js +26 -0
- package/dist/channels/allowlists/resolve-utils.js +43 -19
- package/dist/channels/channel-config.js +14 -7
- package/dist/channels/draft-stream-loop.js +7 -0
- package/dist/channels/model-overrides.js +82 -0
- package/dist/channels/plugins/account-action-gate.js +13 -0
- package/dist/channels/plugins/message-actions.js +10 -0
- package/dist/channels/plugins/normalize/imessage.js +14 -7
- package/dist/channels/plugins/normalize/slack.js +10 -5
- package/dist/channels/plugins/normalize/telegram.js +14 -7
- package/dist/channels/plugins/outbound/discord.js +80 -8
- package/dist/channels/plugins/outbound/signal.js +11 -11
- package/dist/channels/plugins/setup-helpers.js +10 -5
- package/dist/channels/sender-label.js +14 -7
- package/dist/channels/session.js +4 -2
- package/dist/channels/status-reactions.js +297 -0
- package/dist/channels/telegram/api.js +18 -0
- package/dist/cli/argv.js +84 -21
- package/dist/cli/banner.js +3 -2
- package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
- package/dist/cli/cli-name.js +11 -11
- package/dist/cli/cli-utils.js +13 -3
- package/dist/cli/command-format.js +1 -1
- package/dist/cli/config-cli.js +1 -1
- package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
- package/dist/cli/daemon-cli/lifecycle.js +64 -2
- package/dist/cli/daemon-cli/restart-health.js +126 -0
- package/dist/cli/daemon-cli/status.gather.js +9 -13
- package/dist/cli/daemon-cli/status.print.js +2 -10
- package/dist/cli/deps.js +27 -22
- package/dist/cli/exec-approvals-cli.js +92 -124
- package/dist/cli/gateway-cli/run-loop.js +23 -5
- package/dist/cli/memory-cli.js +158 -61
- package/dist/cli/node-cli/register.js +14 -5
- package/dist/cli/nodes-cli/register.push.js +63 -0
- package/dist/cli/nodes-media-utils.js +26 -0
- package/dist/cli/outbound-send-deps.js +2 -9
- package/dist/cli/outbound-send-mapping.js +11 -0
- package/dist/cli/pairing-cli.js +40 -14
- package/dist/cli/plugins-cli.js +250 -73
- package/dist/cli/ports.js +11 -10
- package/dist/cli/program/build-program.js +3 -1
- package/dist/cli/program/command-registry.js +214 -136
- package/dist/cli/program/command-tree.js +16 -0
- package/dist/cli/program/help.js +43 -12
- package/dist/cli/program/preaction.js +13 -9
- package/dist/cli/program/register.configure.js +3 -18
- package/dist/cli/program/register.maintenance.js +2 -2
- package/dist/cli/program/register.onboard.js +2 -0
- package/dist/cli/program/register.status-health-sessions.js +16 -17
- package/dist/cli/program/register.subclis.js +93 -52
- package/dist/cli/route.js +12 -8
- package/dist/cli/system-cli.js +36 -46
- package/dist/cli/test-runtime-capture.js +24 -0
- package/dist/cli/update-cli/shared.js +22 -9
- package/dist/cli/update-cli/update-command.js +89 -14
- package/dist/cli/update-cli/wizard.js +6 -12
- package/dist/commands/agent/run-context.js +18 -5
- package/dist/commands/agent/session-store.js +17 -4
- package/dist/commands/agent.js +185 -89
- package/dist/commands/agents.bindings.js +14 -7
- package/dist/commands/agents.commands.add.js +13 -9
- package/dist/commands/agents.commands.identity.js +12 -6
- package/dist/commands/agents.commands.list.js +11 -6
- package/dist/commands/agents.config.js +8 -10
- package/dist/commands/agents.providers.js +12 -6
- package/dist/commands/auth-choice-options.js +103 -75
- package/dist/commands/auth-choice.apply.byteplus.js +55 -0
- package/dist/commands/auth-choice.apply.js +4 -0
- package/dist/commands/auth-choice.apply.minimax.js +61 -13
- package/dist/commands/auth-choice.apply.openai.js +3 -1
- package/dist/commands/auth-choice.apply.volcengine.js +55 -0
- package/dist/commands/auth-choice.preferred-provider.js +2 -0
- package/dist/commands/channels/remove.js +13 -6
- package/dist/commands/channels/shared.js +4 -14
- package/dist/commands/channels.mock-harness.js +23 -0
- package/dist/commands/configure.commands.js +14 -0
- package/dist/commands/configure.gateway.js +2 -4
- package/dist/commands/configure.js +1 -1
- package/dist/commands/configure.shared.js +11 -0
- package/dist/commands/daemon-install-helpers.js +2 -2
- package/dist/commands/daemon-install-runtime-warning.js +11 -0
- package/dist/commands/dashboard.js +12 -10
- package/dist/commands/docs.js +14 -8
- package/dist/commands/doctor-config-flow.js +11 -9
- package/dist/commands/doctor-legacy-config.js +281 -0
- package/dist/commands/doctor-state-integrity.js +99 -23
- package/dist/commands/doctor-update.js +12 -9
- package/dist/commands/models/list.list-command.js +7 -5
- package/dist/commands/models/set-image.js +2 -21
- package/dist/commands/node-daemon-install-helpers.js +10 -8
- package/dist/commands/onboard-auth.config-minimax.js +54 -80
- package/dist/commands/onboard-auth.config-opencode.js +2 -18
- package/dist/commands/onboard-auth.credentials.js +90 -13
- package/dist/commands/onboard-auth.js +1 -1
- package/dist/commands/onboard-auth.models.js +6 -5
- package/dist/commands/onboard-hooks.js +1 -1
- package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
- package/dist/commands/onboard-provider-auth-flags.js +14 -0
- package/dist/commands/onboard-remote.js +14 -7
- package/dist/commands/onboard.js +11 -13
- package/dist/commands/sandbox-display.js +6 -5
- package/dist/commands/sessions.test-helpers.js +61 -0
- package/dist/commands/status-all/diagnosis.js +14 -10
- package/dist/commands/status-all/format.js +1 -0
- package/dist/commands/status.gateway-probe.js +1 -16
- package/dist/commands/systemd-linger.js +12 -6
- package/dist/config/agent-limits.js +2 -0
- package/dist/config/commands.js +32 -15
- package/dist/config/config-paths.js +9 -11
- package/dist/config/config.js +1 -1
- package/dist/config/defaults.js +22 -2
- package/dist/config/discord-preview-streaming.js +104 -0
- package/dist/config/env-substitution.js +62 -34
- package/dist/config/env-vars.js +45 -7
- package/dist/config/includes.js +4 -0
- package/dist/config/io.js +656 -171
- package/dist/config/legacy.migrations.part-1.js +189 -78
- package/dist/config/legacy.shared.js +3 -1
- package/dist/config/merge-patch.js +54 -4
- package/dist/config/prototype-keys.js +4 -0
- package/dist/config/redact-snapshot.js +404 -76
- package/dist/config/schema.help.js +44 -7
- package/dist/config/schema.js +58 -570
- package/dist/config/schema.labels.js +38 -6
- package/dist/config/sessions/delivery-info.js +10 -3
- package/dist/config/sessions/main-session.js +10 -5
- package/dist/config/sessions/session-file.js +33 -0
- package/dist/config/sessions/session-key.js +10 -5
- package/dist/config/sessions/store.js +1 -1
- package/dist/config/sessions.js +1 -0
- package/dist/config/validation.js +140 -85
- package/dist/config/zod-schema.agent-runtime.js +11 -0
- package/dist/config/zod-schema.hooks.js +40 -11
- package/dist/config/zod-schema.installs.js +20 -0
- package/dist/config/zod-schema.js +156 -20
- package/dist/config/zod-schema.providers-core.js +78 -4
- package/dist/config/zod-schema.providers.js +6 -1
- package/dist/config/zod-schema.session.js +41 -2
- package/dist/cron/run-log.js +3 -0
- package/dist/cron/schedule.js +21 -10
- package/dist/cron/service/ops.js +35 -21
- package/dist/cron/service/timer.js +116 -16
- package/dist/cron/stagger.js +3 -1
- package/dist/daemon/cmd-argv.js +21 -0
- package/dist/daemon/cmd-set.js +58 -0
- package/dist/daemon/service-types.js +1 -0
- package/dist/discord/api.js +12 -6
- package/dist/discord/draft-chunking.js +22 -0
- package/dist/discord/draft-stream.js +124 -0
- package/dist/discord/monitor/agent-components.js +1 -1
- package/dist/discord/monitor/commands.js +5 -0
- package/dist/discord/monitor/exec-approvals.js +357 -162
- package/dist/discord/monitor/gateway-plugin.js +2 -1
- package/dist/discord/monitor/listeners.js +37 -27
- package/dist/discord/monitor/message-handler.js +4 -1
- package/dist/discord/monitor/message-handler.preflight.js +65 -8
- package/dist/discord/monitor/message-handler.process.js +246 -217
- package/dist/discord/monitor/message-utils.js +143 -6
- package/dist/discord/monitor/model-picker-preferences.js +143 -0
- package/dist/discord/monitor/model-picker.js +651 -0
- package/dist/discord/monitor/native-command.js +573 -16
- package/dist/discord/monitor/provider.allowlist.js +223 -0
- package/dist/discord/monitor/provider.js +275 -347
- package/dist/discord/monitor/provider.lifecycle.js +100 -0
- package/dist/discord/monitor/reply-delivery.js +123 -16
- package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
- package/dist/discord/monitor/thread-bindings.js +4 -0
- package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
- package/dist/discord/monitor/thread-bindings.manager.js +423 -0
- package/dist/discord/monitor/thread-bindings.messages.js +55 -0
- package/dist/discord/monitor/thread-bindings.state.js +358 -0
- package/dist/discord/monitor/thread-bindings.types.js +6 -0
- package/dist/discord/resolve-users.js +33 -21
- package/dist/discord/send.channels.js +15 -0
- package/dist/discord/send.js +3 -2
- package/dist/discord/send.outbound.js +82 -26
- package/dist/discord/send.permissions.js +83 -30
- package/dist/discord/send.reactions.js +8 -4
- package/dist/discord/token.js +10 -5
- package/dist/discord/voice/command.js +263 -0
- package/dist/discord/voice/manager.js +531 -0
- package/dist/gateway/auth.js +72 -13
- package/dist/gateway/call.js +152 -83
- package/dist/gateway/canvas-capability.js +75 -0
- package/dist/gateway/client.js +28 -4
- package/dist/gateway/config-reload.js +3 -4
- package/dist/gateway/control-plane-audit.js +28 -0
- package/dist/gateway/control-plane-rate-limit.js +53 -0
- package/dist/gateway/control-ui.js +219 -96
- package/dist/gateway/events.js +1 -0
- package/dist/gateway/hooks-mapping.js +88 -38
- package/dist/gateway/hooks.js +109 -54
- package/dist/gateway/http-auth-helpers.js +3 -2
- package/dist/gateway/http-common.js +22 -0
- package/dist/gateway/http-endpoint-helpers.js +1 -0
- package/dist/gateway/method-scopes.js +169 -0
- package/dist/gateway/net.js +74 -9
- package/dist/gateway/node-invoke-system-run-approval.js +14 -35
- package/dist/gateway/node-registry.js +10 -5
- package/dist/gateway/openai-http.js +1 -0
- package/dist/gateway/openresponses-http.js +121 -110
- package/dist/gateway/origin-check.js +1 -18
- package/dist/gateway/probe-auth.js +2 -0
- package/dist/gateway/protocol/index.js +4 -2
- package/dist/gateway/protocol/schema/cron.js +1 -0
- package/dist/gateway/protocol/schema/devices.js +1 -0
- package/dist/gateway/protocol/schema/protocol-schemas.js +4 -1
- package/dist/gateway/protocol/schema/push.js +18 -0
- package/dist/gateway/protocol/schema/sessions.js +6 -0
- package/dist/gateway/protocol/schema.js +1 -0
- package/dist/gateway/role-policy.js +17 -0
- package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
- package/dist/gateway/server/ws-connection/message-handler.js +175 -148
- package/dist/gateway/server-chat.js +83 -25
- package/dist/gateway/server-constants.js +10 -9
- package/dist/gateway/server-cron.js +1 -0
- package/dist/gateway/server-http.js +247 -54
- package/dist/gateway/server-maintenance.js +20 -5
- package/dist/gateway/server-methods/agent.js +162 -24
- package/dist/gateway/server-methods/chat.js +465 -130
- package/dist/gateway/server-methods/config.js +193 -152
- package/dist/gateway/server-methods/devices.js +17 -3
- package/dist/gateway/server-methods/models.js +11 -1
- package/dist/gateway/server-methods/nodes.helpers.js +12 -0
- package/dist/gateway/server-methods/nodes.js +251 -69
- package/dist/gateway/server-methods/push.js +53 -0
- package/dist/gateway/server-methods/sessions.js +64 -8
- package/dist/gateway/server-methods/usage.js +162 -75
- package/dist/gateway/server-node-events.js +29 -0
- package/dist/gateway/server-reload-handlers.js +2 -3
- package/dist/gateway/server-runtime-config.js +39 -13
- package/dist/gateway/server-runtime-state.js +2 -0
- package/dist/gateway/server-startup-memory.js +17 -11
- package/dist/gateway/server-ws-runtime.js +1 -0
- package/dist/gateway/server.impl.js +296 -139
- package/dist/gateway/session-preview.test-helpers.js +11 -0
- package/dist/gateway/session-utils.fs.js +32 -34
- package/dist/gateway/sessions-resolve.js +17 -5
- package/dist/gateway/startup-auth.js +126 -0
- package/dist/gateway/test-helpers.agent-results.js +15 -0
- package/dist/gateway/test-helpers.mocks.js +37 -14
- package/dist/gateway/test-helpers.openai-mock.js +14 -7
- package/dist/gateway/test-helpers.server.js +161 -77
- package/dist/gateway/tools-invoke-http.js +21 -10
- package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
- package/dist/hooks/bundled/command-logger/handler.js +7 -2
- package/dist/hooks/bundled/session-memory/handler.js +170 -38
- package/dist/hooks/frontmatter.js +6 -6
- package/dist/hooks/gmail-watcher-lifecycle.js +23 -0
- package/dist/hooks/gmail-watcher.js +11 -6
- package/dist/hooks/internal-hooks.js +11 -1
- package/dist/hooks/llm-slug-generator.js +4 -1
- package/dist/hooks/workspace.js +47 -17
- package/dist/imessage/accounts.js +9 -20
- package/dist/imessage/monitor/inbound-processing.js +2 -1
- package/dist/infra/archive-path.js +49 -0
- package/dist/infra/archive.js +174 -73
- package/dist/infra/control-ui-assets.js +14 -6
- package/dist/infra/device-pairing.js +204 -144
- package/dist/infra/env.js +10 -5
- package/dist/infra/exec-approvals-allowlist.js +141 -70
- package/dist/infra/exec-approvals-analysis.js +78 -20
- package/dist/infra/exec-approvals.js +5 -17
- package/dist/infra/exec-safe-bin-policy.js +277 -0
- package/dist/infra/fixed-window-rate-limit.js +33 -0
- package/dist/infra/fs-safe.js +71 -39
- package/dist/infra/gateway-lock.js +6 -2
- package/dist/infra/git-root.js +61 -0
- package/dist/infra/heartbeat-active-hours.js +2 -2
- package/dist/infra/heartbeat-reason.js +40 -0
- package/dist/infra/heartbeat-runner.js +72 -32
- package/dist/infra/heartbeat-wake.js +6 -12
- package/dist/infra/host-env-security-policy.json +19 -0
- package/dist/infra/host-env-security.js +66 -0
- package/dist/infra/install-source-utils.js +91 -7
- package/dist/infra/net/ssrf.js +131 -38
- package/dist/infra/node-pairing.js +50 -105
- package/dist/infra/npm-integrity.js +45 -0
- package/dist/infra/npm-pack-install.js +40 -0
- package/dist/infra/outbound/bound-delivery-router.js +88 -0
- package/dist/infra/outbound/channel-adapters.js +20 -7
- package/dist/infra/outbound/channel-selection.js +12 -6
- package/dist/infra/outbound/envelope.js +1 -1
- package/dist/infra/outbound/format.js +12 -6
- package/dist/infra/outbound/message-action-runner.js +107 -327
- package/dist/infra/outbound/message.js +59 -36
- package/dist/infra/outbound/outbound-policy.js +52 -25
- package/dist/infra/outbound/outbound-send-service.js +58 -71
- package/dist/infra/outbound/payloads.js +14 -7
- package/dist/infra/outbound/session-binding-service.js +123 -0
- package/dist/infra/pairing-files.js +10 -0
- package/dist/infra/path-guards.js +25 -0
- package/dist/infra/plain-object.js +9 -0
- package/dist/infra/provider-usage.fetch.codex.js +7 -15
- package/dist/infra/provider-usage.fetch.gemini.js +14 -11
- package/dist/infra/provider-usage.fetch.shared.js +30 -1
- package/dist/infra/provider-usage.fetch.zai.js +10 -9
- package/dist/infra/push-apns.js +365 -0
- package/dist/infra/restart-sentinel.js +16 -1
- package/dist/infra/restart.js +229 -26
- package/dist/infra/retry-policy.js +4 -2
- package/dist/infra/retry.js +9 -5
- package/dist/infra/scp-host.js +54 -0
- package/dist/infra/session-cost-usage.js +107 -59
- package/dist/infra/session-maintenance-warning.js +3 -1
- package/dist/infra/shell-env.js +98 -34
- package/dist/infra/ssh-config.js +12 -6
- package/dist/infra/system-run-command.js +49 -4
- package/dist/infra/update-channels.js +10 -5
- package/dist/infra/update-startup.js +86 -9
- package/dist/line/accounts.js +5 -7
- package/dist/line/bot-access.js +8 -20
- package/dist/line/bot-handlers.js +3 -1
- package/dist/link-understanding/detect.js +15 -7
- package/dist/media/constants.js +15 -6
- package/dist/media/image-ops.js +7 -0
- package/dist/media/inbound-path-policy.js +114 -0
- package/dist/media/input-files.js +16 -0
- package/dist/media/local-roots.js +3 -2
- package/dist/media-understanding/apply.js +4 -1
- package/dist/media-understanding/concurrency.js +8 -20
- package/dist/memory/backend-config.js +45 -6
- package/dist/memory/embeddings.js +10 -4
- package/dist/memory/fs-utils.js +23 -0
- package/dist/memory/manager-search.js +12 -6
- package/dist/memory/manager-sync-ops.js +12 -2
- package/dist/memory/qmd-manager.js +466 -53
- package/dist/memory/query-expansion.js +167 -3
- package/dist/memory/status-format.js +10 -5
- package/dist/memory/sync-memory-files.js +1 -1
- package/dist/memory/test-manager.js +8 -0
- package/dist/node-host/invoke-system-run.js +281 -0
- package/dist/node-host/invoke.js +55 -337
- package/dist/pairing/pairing-store.js +22 -0
- package/dist/plugin-sdk/allow-from.js +1 -1
- package/dist/plugin-sdk/command-auth.js +3 -1
- package/dist/plugin-sdk/index.js +6 -3
- package/dist/plugin-sdk/temp-path.js +47 -0
- package/dist/plugin-sdk/webhook-targets.js +32 -0
- package/dist/plugins/bundled-dir.js +9 -6
- package/dist/plugins/discovery.js +217 -23
- package/dist/plugins/hook-runner-global.js +16 -0
- package/dist/plugins/hooks.js +50 -0
- package/dist/plugins/install.js +28 -16
- package/dist/plugins/loader.js +192 -26
- package/dist/plugins/logger.js +8 -0
- package/dist/plugins/manifest-registry.js +3 -0
- package/dist/plugins/path-safety.js +34 -0
- package/dist/plugins/registry.js +5 -2
- package/dist/plugins/runtime/index.js +271 -206
- package/dist/plugins/runtime.js +3 -17
- package/dist/plugins/update.js +78 -12
- package/dist/process/spawn-utils.js +14 -7
- package/dist/providers/github-copilot-models.js +4 -1
- package/dist/providers/github-copilot-token.js +11 -6
- package/dist/providers/qwen-portal-oauth.js +14 -6
- package/dist/routing/account-id.js +30 -0
- package/dist/routing/resolve-route.js +3 -7
- package/dist/routing/session-key.js +2 -16
- package/dist/security/audit-channel.js +100 -20
- package/dist/security/audit-extra.async.js +505 -179
- package/dist/security/audit-extra.js +12 -2
- package/dist/security/audit-extra.sync.js +421 -35
- package/dist/security/audit-fs.js +31 -13
- package/dist/security/audit.js +180 -370
- package/dist/security/dm-policy-shared.js +68 -0
- package/dist/security/external-content.js +46 -14
- package/dist/security/fix.js +49 -85
- package/dist/security/scan-paths.js +20 -0
- package/dist/security/secret-equal.js +3 -7
- package/dist/security/windows-acl.js +30 -15
- package/dist/shared/entry-status.js +6 -0
- package/dist/shared/frontmatter.js +5 -5
- package/dist/shared/node-list-parse.js +13 -0
- package/dist/shared/node-match.js +11 -4
- package/dist/shared/operator-scope-compat.js +42 -0
- package/dist/shared/text-chunking.js +29 -0
- package/dist/signal/accounts.js +7 -20
- package/dist/signal/monitor/event-handler.js +3 -1
- package/dist/slack/accounts.js +6 -19
- package/dist/slack/actions.js +11 -3
- package/dist/slack/blocks.test-helpers.js +31 -0
- package/dist/slack/monitor/auth.js +1 -1
- package/dist/slack/monitor/message-handler/dispatch.js +50 -29
- package/dist/slack/monitor/mrkdwn.js +8 -0
- package/dist/slack/monitor/replies.js +15 -7
- package/dist/slack/monitor/slash.js +22 -13
- package/dist/slack/resolve-channels.js +10 -5
- package/dist/slack/send.js +102 -12
- package/dist/slack/stream-mode.js +10 -0
- package/dist/slack/streaming.js +4 -2
- package/dist/telegram/accounts.js +19 -14
- package/dist/telegram/bot/helpers.js +3 -5
- package/dist/telegram/bot-access.js +35 -36
- package/dist/telegram/bot-handlers.js +120 -148
- package/dist/telegram/bot-message-context.js +68 -9
- package/dist/telegram/bot-message-dispatch.js +477 -210
- package/dist/telegram/bot-native-commands.js +16 -0
- package/dist/telegram/draft-stream.js +44 -8
- package/dist/telegram/inline-buttons.js +5 -15
- package/dist/telegram/monitor.js +11 -7
- package/dist/telegram/network-config.js +19 -7
- package/dist/telegram/reasoning-lane-coordinator.js +128 -0
- package/dist/telegram/send.js +3 -2
- package/dist/telegram/sent-message-cache.js +5 -6
- package/dist/telegram/status-reaction-variants.js +208 -0
- package/dist/telegram/sticker-cache.js +11 -9
- package/dist/terminal/prompt-select-styled.js +9 -0
- package/dist/terminal/theme.js +12 -12
- package/dist/test-utils/command-runner.js +6 -0
- package/dist/test-utils/internal-hook-event-payload.js +10 -0
- package/dist/test-utils/model-auth-mock.js +12 -0
- package/dist/test-utils/provider-usage-fetch.js +14 -0
- package/dist/test-utils/temp-home.js +33 -0
- package/dist/tts/tts.js +80 -567
- package/dist/tui/components/chat-log.js +50 -8
- package/dist/tui/theme/theme.js +10 -12
- package/dist/tui/tui-command-handlers.js +36 -27
- package/dist/tui/tui-event-handlers.js +122 -32
- package/dist/tui/tui-local-shell.js +16 -6
- package/dist/tui/tui.js +236 -48
- package/dist/utils/account-id.js +2 -4
- package/dist/utils/boolean.js +10 -5
- package/dist/utils/directive-tags.js +11 -0
- package/dist/utils/mask-api-key.js +10 -0
- package/dist/utils/queue-helpers.js +67 -12
- package/dist/utils/run-with-concurrency.js +39 -0
- package/dist/web/auto-reply/deliver-reply.js +8 -4
- package/dist/web/auto-reply/mentions.js +10 -5
- package/dist/web/auto-reply/monitor/group-members.js +14 -7
- package/dist/web/auto-reply/monitor/process-message.js +45 -24
- package/dist/web/inbound/access-control.js +5 -2
- package/dist/web/login-qr.js +12 -6
- package/dist/web/media.js +126 -15
- package/docs/tools/slash-commands.md +5 -1
- package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
- package/extensions/bluebubbles/src/monitor.ts +208 -1950
- package/extensions/feishu/src/external-keys.ts +19 -0
- package/extensions/lobster/src/windows-spawn.ts +193 -0
- package/extensions/matrix/src/matrix/actions/limits.ts +6 -0
- package/extensions/mattermost/src/mattermost/reactions.test-helpers.ts +83 -0
- package/package.json +1 -1
|
@@ -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;
|
|
@@ -13,8 +13,10 @@ export function createTelegramDraftStream(params) {
|
|
|
13
13
|
: threadParams;
|
|
14
14
|
let streamMessageId;
|
|
15
15
|
let lastSentText = "";
|
|
16
|
+
let lastSentParseMode;
|
|
16
17
|
let stopped = false;
|
|
17
18
|
let isFinal = false;
|
|
19
|
+
let generation = 0;
|
|
18
20
|
const sendOrEditStreamMessage = async (text) => {
|
|
19
21
|
// Allow final flush even if stopped (e.g., after clear()).
|
|
20
22
|
if (stopped && !isFinal) {
|
|
@@ -24,36 +26,66 @@ export function createTelegramDraftStream(params) {
|
|
|
24
26
|
if (!trimmed) {
|
|
25
27
|
return false;
|
|
26
28
|
}
|
|
27
|
-
|
|
29
|
+
const rendered = params.renderText?.(trimmed) ?? { text: trimmed };
|
|
30
|
+
const renderedText = rendered.text.trimEnd();
|
|
31
|
+
const renderedParseMode = rendered.parseMode;
|
|
32
|
+
if (!renderedText) {
|
|
33
|
+
return false;
|
|
34
|
+
}
|
|
35
|
+
if (renderedText.length > maxChars) {
|
|
28
36
|
// Telegram text messages/edits cap at 4096 chars.
|
|
29
37
|
// Stop streaming once we exceed the cap to avoid repeated API failures.
|
|
30
38
|
stopped = true;
|
|
31
|
-
params.warn?.(`telegram stream preview stopped (text length ${
|
|
39
|
+
params.warn?.(`telegram stream preview stopped (text length ${renderedText.length} > ${maxChars})`);
|
|
32
40
|
return false;
|
|
33
41
|
}
|
|
34
|
-
if (
|
|
42
|
+
if (renderedText === lastSentText && renderedParseMode === lastSentParseMode) {
|
|
35
43
|
return true;
|
|
36
44
|
}
|
|
45
|
+
const sendGeneration = generation;
|
|
37
46
|
// Debounce first preview send for better push notification quality.
|
|
38
47
|
if (typeof streamMessageId !== "number" && minInitialChars != null && !isFinal) {
|
|
39
|
-
if (
|
|
48
|
+
if (renderedText.length < minInitialChars) {
|
|
40
49
|
return false;
|
|
41
50
|
}
|
|
42
51
|
}
|
|
43
|
-
lastSentText =
|
|
52
|
+
lastSentText = renderedText;
|
|
53
|
+
lastSentParseMode = renderedParseMode;
|
|
44
54
|
try {
|
|
45
55
|
if (typeof streamMessageId === "number") {
|
|
46
|
-
|
|
56
|
+
if (renderedParseMode) {
|
|
57
|
+
await params.api.editMessageText(chatId, streamMessageId, renderedText, {
|
|
58
|
+
parse_mode: renderedParseMode,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
await params.api.editMessageText(chatId, streamMessageId, renderedText);
|
|
63
|
+
}
|
|
47
64
|
return true;
|
|
48
65
|
}
|
|
49
|
-
const
|
|
66
|
+
const sendParams = renderedParseMode
|
|
67
|
+
? {
|
|
68
|
+
...replyParams,
|
|
69
|
+
parse_mode: renderedParseMode,
|
|
70
|
+
}
|
|
71
|
+
: replyParams;
|
|
72
|
+
const sent = await params.api.sendMessage(chatId, renderedText, sendParams);
|
|
50
73
|
const sentMessageId = sent?.message_id;
|
|
51
74
|
if (typeof sentMessageId !== "number" || !Number.isFinite(sentMessageId)) {
|
|
52
75
|
stopped = true;
|
|
53
76
|
params.warn?.("telegram stream preview stopped (missing message id from sendMessage)");
|
|
54
77
|
return false;
|
|
55
78
|
}
|
|
56
|
-
|
|
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;
|
|
57
89
|
return true;
|
|
58
90
|
}
|
|
59
91
|
catch (err) {
|
|
@@ -88,15 +120,19 @@ export function createTelegramDraftStream(params) {
|
|
|
88
120
|
}
|
|
89
121
|
try {
|
|
90
122
|
await params.api.deleteMessage(chatId, messageId);
|
|
123
|
+
params.log?.(`telegram stream preview deleted (chat=${chatId}, message=${messageId})`);
|
|
91
124
|
}
|
|
92
125
|
catch (err) {
|
|
93
126
|
params.warn?.(`telegram stream preview cleanup failed: ${err instanceof Error ? err.message : String(err)}`);
|
|
94
127
|
}
|
|
95
128
|
};
|
|
96
129
|
const forceNewMessage = () => {
|
|
130
|
+
generation += 1;
|
|
97
131
|
streamMessageId = undefined;
|
|
98
132
|
lastSentText = "";
|
|
133
|
+
lastSentParseMode = undefined;
|
|
99
134
|
loop.resetPending();
|
|
135
|
+
loop.resetThrottleWindow();
|
|
100
136
|
};
|
|
101
137
|
params.log?.(`telegram stream preview ready (maxChars=${maxChars}, throttleMs=${throttleMs})`);
|
|
102
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
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { formatReasoningMessage } from "../agents/pi-embedded-utils.js";
|
|
2
|
+
import { stripReasoningTagsFromText } from "../shared/text/reasoning-tags.js";
|
|
3
|
+
const REASONING_MESSAGE_PREFIX = "Reasoning:\n";
|
|
4
|
+
const REASONING_TAG_PREFIXES = [
|
|
5
|
+
"<think",
|
|
6
|
+
"<thinking",
|
|
7
|
+
"<thought",
|
|
8
|
+
"<antthinking",
|
|
9
|
+
"</think",
|
|
10
|
+
"</thinking",
|
|
11
|
+
"</thought",
|
|
12
|
+
"</antthinking",
|
|
13
|
+
];
|
|
14
|
+
const THINKING_TAG_RE = /<\s*(\/?)\s*(?:think(?:ing)?|thought|antthinking)\b[^<>]*>/gi;
|
|
15
|
+
function findCodeRegions(text) {
|
|
16
|
+
const regions = [];
|
|
17
|
+
const fencedRe = /(^|\n)(```|~~~)[^\n]*\n[\s\S]*?(?:\n\2(?:\n|$)|$)/g;
|
|
18
|
+
for (const match of text.matchAll(fencedRe)) {
|
|
19
|
+
const start = (match.index ?? 0) + match[1].length;
|
|
20
|
+
regions.push({ start, end: start + match[0].length - match[1].length });
|
|
21
|
+
}
|
|
22
|
+
const inlineRe = /`+[^`]+`+/g;
|
|
23
|
+
for (const match of text.matchAll(inlineRe)) {
|
|
24
|
+
const start = match.index ?? 0;
|
|
25
|
+
const end = start + match[0].length;
|
|
26
|
+
const insideFenced = regions.some((r) => start >= r.start && end <= r.end);
|
|
27
|
+
if (!insideFenced) {
|
|
28
|
+
regions.push({ start, end });
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
regions.sort((a, b) => a.start - b.start);
|
|
32
|
+
return regions;
|
|
33
|
+
}
|
|
34
|
+
function isInsideCode(pos, regions) {
|
|
35
|
+
return regions.some((r) => pos >= r.start && pos < r.end);
|
|
36
|
+
}
|
|
37
|
+
function extractThinkingFromTaggedStreamOutsideCode(text) {
|
|
38
|
+
if (!text) {
|
|
39
|
+
return "";
|
|
40
|
+
}
|
|
41
|
+
const codeRegions = findCodeRegions(text);
|
|
42
|
+
let result = "";
|
|
43
|
+
let lastIndex = 0;
|
|
44
|
+
let inThinking = false;
|
|
45
|
+
THINKING_TAG_RE.lastIndex = 0;
|
|
46
|
+
for (const match of text.matchAll(THINKING_TAG_RE)) {
|
|
47
|
+
const idx = match.index ?? 0;
|
|
48
|
+
if (isInsideCode(idx, codeRegions)) {
|
|
49
|
+
continue;
|
|
50
|
+
}
|
|
51
|
+
if (inThinking) {
|
|
52
|
+
result += text.slice(lastIndex, idx);
|
|
53
|
+
}
|
|
54
|
+
const isClose = match[1] === "/";
|
|
55
|
+
inThinking = !isClose;
|
|
56
|
+
lastIndex = idx + match[0].length;
|
|
57
|
+
}
|
|
58
|
+
if (inThinking) {
|
|
59
|
+
result += text.slice(lastIndex);
|
|
60
|
+
}
|
|
61
|
+
return result.trim();
|
|
62
|
+
}
|
|
63
|
+
function isPartialReasoningTagPrefix(text) {
|
|
64
|
+
const trimmed = text.trimStart().toLowerCase();
|
|
65
|
+
if (!trimmed.startsWith("<")) {
|
|
66
|
+
return false;
|
|
67
|
+
}
|
|
68
|
+
if (trimmed.includes(">")) {
|
|
69
|
+
return false;
|
|
70
|
+
}
|
|
71
|
+
return REASONING_TAG_PREFIXES.some((prefix) => prefix.startsWith(trimmed));
|
|
72
|
+
}
|
|
73
|
+
export function splitTelegramReasoningText(text) {
|
|
74
|
+
if (typeof text !== "string") {
|
|
75
|
+
return {};
|
|
76
|
+
}
|
|
77
|
+
const trimmed = text.trim();
|
|
78
|
+
if (isPartialReasoningTagPrefix(trimmed)) {
|
|
79
|
+
return {};
|
|
80
|
+
}
|
|
81
|
+
if (trimmed.startsWith(REASONING_MESSAGE_PREFIX) &&
|
|
82
|
+
trimmed.length > REASONING_MESSAGE_PREFIX.length) {
|
|
83
|
+
return { reasoningText: trimmed };
|
|
84
|
+
}
|
|
85
|
+
const taggedReasoning = extractThinkingFromTaggedStreamOutsideCode(text);
|
|
86
|
+
const strippedAnswer = stripReasoningTagsFromText(text, { mode: "strict", trim: "both" });
|
|
87
|
+
if (!taggedReasoning && strippedAnswer === text) {
|
|
88
|
+
return { answerText: text };
|
|
89
|
+
}
|
|
90
|
+
const reasoningText = taggedReasoning ? formatReasoningMessage(taggedReasoning) : undefined;
|
|
91
|
+
const answerText = strippedAnswer || undefined;
|
|
92
|
+
return { reasoningText, answerText };
|
|
93
|
+
}
|
|
94
|
+
export function createTelegramReasoningStepState() {
|
|
95
|
+
let reasoningStatus = "none";
|
|
96
|
+
let bufferedFinalAnswer;
|
|
97
|
+
const noteReasoningHint = () => {
|
|
98
|
+
if (reasoningStatus === "none") {
|
|
99
|
+
reasoningStatus = "hinted";
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
const noteReasoningDelivered = () => {
|
|
103
|
+
reasoningStatus = "delivered";
|
|
104
|
+
};
|
|
105
|
+
const shouldBufferFinalAnswer = () => {
|
|
106
|
+
return reasoningStatus === "hinted" && !bufferedFinalAnswer;
|
|
107
|
+
};
|
|
108
|
+
const bufferFinalAnswer = (value) => {
|
|
109
|
+
bufferedFinalAnswer = value;
|
|
110
|
+
};
|
|
111
|
+
const takeBufferedFinalAnswer = () => {
|
|
112
|
+
const value = bufferedFinalAnswer;
|
|
113
|
+
bufferedFinalAnswer = undefined;
|
|
114
|
+
return value;
|
|
115
|
+
};
|
|
116
|
+
const resetForNextStep = () => {
|
|
117
|
+
reasoningStatus = "none";
|
|
118
|
+
bufferedFinalAnswer = undefined;
|
|
119
|
+
};
|
|
120
|
+
return {
|
|
121
|
+
noteReasoningHint,
|
|
122
|
+
noteReasoningDelivered,
|
|
123
|
+
shouldBufferFinalAnswer,
|
|
124
|
+
bufferFinalAnswer,
|
|
125
|
+
takeBufferedFinalAnswer,
|
|
126
|
+
resetForNextStep,
|
|
127
|
+
};
|
|
128
|
+
}
|
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`);
|
|
@@ -11,7 +11,6 @@ function cleanupExpired(entry) {
|
|
|
11
11
|
const now = Date.now();
|
|
12
12
|
for (const [msgId, timestamp] of entry.timestamps) {
|
|
13
13
|
if (now - timestamp > TTL_MS) {
|
|
14
|
-
entry.messageIds.delete(msgId);
|
|
15
14
|
entry.timestamps.delete(msgId);
|
|
16
15
|
}
|
|
17
16
|
}
|
|
@@ -23,13 +22,12 @@ export function recordSentMessage(chatId, messageId) {
|
|
|
23
22
|
const key = getChatKey(chatId);
|
|
24
23
|
let entry = sentMessages.get(key);
|
|
25
24
|
if (!entry) {
|
|
26
|
-
entry = {
|
|
25
|
+
entry = { timestamps: new Map() };
|
|
27
26
|
sentMessages.set(key, entry);
|
|
28
27
|
}
|
|
29
|
-
entry.messageIds.add(messageId);
|
|
30
28
|
entry.timestamps.set(messageId, Date.now());
|
|
31
29
|
// Periodic cleanup
|
|
32
|
-
if (entry.
|
|
30
|
+
if (entry.timestamps.size > 100) {
|
|
33
31
|
cleanupExpired(entry);
|
|
34
32
|
}
|
|
35
33
|
}
|
|
@@ -39,11 +37,12 @@ export function recordSentMessage(chatId, messageId) {
|
|
|
39
37
|
export function wasSentByBot(chatId, messageId) {
|
|
40
38
|
const key = getChatKey(chatId);
|
|
41
39
|
const entry = sentMessages.get(key);
|
|
42
|
-
if (!entry)
|
|
40
|
+
if (!entry) {
|
|
43
41
|
return false;
|
|
42
|
+
}
|
|
44
43
|
// Clean up expired entries on read
|
|
45
44
|
cleanupExpired(entry);
|
|
46
|
-
return entry.
|
|
45
|
+
return entry.timestamps.has(messageId);
|
|
47
46
|
}
|
|
48
47
|
/**
|
|
49
48
|
* Clear all cached entries (for testing).
|