@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
|
@@ -23,3 +23,9 @@ export function evaluateEntryMetadataRequirements(params) {
|
|
|
23
23
|
configChecks,
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
|
+
export function evaluateEntryMetadataRequirementsForCurrentPlatform(params) {
|
|
27
|
+
return evaluateEntryMetadataRequirements({
|
|
28
|
+
...params,
|
|
29
|
+
localPlatform: process.platform,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
@@ -24,7 +24,7 @@ export function parseFrontmatterBool(value, fallback) {
|
|
|
24
24
|
const parsed = parseBooleanValue(value);
|
|
25
25
|
return parsed === undefined ? fallback : parsed;
|
|
26
26
|
}
|
|
27
|
-
export function
|
|
27
|
+
export function resolvePoolBotManifestBlock(params) {
|
|
28
28
|
const raw = getFrontmatterString(params.frontmatter, params.key ?? "metadata");
|
|
29
29
|
if (!raw) {
|
|
30
30
|
return undefined;
|
|
@@ -47,7 +47,7 @@ export function resolvePoolbotManifestBlock(params) {
|
|
|
47
47
|
return undefined;
|
|
48
48
|
}
|
|
49
49
|
}
|
|
50
|
-
export function
|
|
50
|
+
export function resolvePoolBotManifestRequires(metadataObj) {
|
|
51
51
|
const requiresRaw = typeof metadataObj.requires === "object" && metadataObj.requires !== null
|
|
52
52
|
? metadataObj.requires
|
|
53
53
|
: undefined;
|
|
@@ -61,16 +61,16 @@ export function resolvePoolbotManifestRequires(metadataObj) {
|
|
|
61
61
|
config: normalizeStringList(requiresRaw.config),
|
|
62
62
|
};
|
|
63
63
|
}
|
|
64
|
-
export function
|
|
64
|
+
export function resolvePoolBotManifestInstall(metadataObj, parseInstallSpec) {
|
|
65
65
|
const installRaw = Array.isArray(metadataObj.install) ? metadataObj.install : [];
|
|
66
66
|
return installRaw
|
|
67
67
|
.map((entry) => parseInstallSpec(entry))
|
|
68
68
|
.filter((entry) => Boolean(entry));
|
|
69
69
|
}
|
|
70
|
-
export function
|
|
70
|
+
export function resolvePoolBotManifestOs(metadataObj) {
|
|
71
71
|
return normalizeStringList(metadataObj.os);
|
|
72
72
|
}
|
|
73
|
-
export function
|
|
73
|
+
export function parsePoolBotManifestInstallBase(input, allowedKinds) {
|
|
74
74
|
if (!input || typeof input !== "object") {
|
|
75
75
|
return undefined;
|
|
76
76
|
}
|
|
@@ -39,14 +39,21 @@ export function resolveNodeIdFromCandidates(nodes, query) {
|
|
|
39
39
|
if (!q) {
|
|
40
40
|
throw new Error("node required");
|
|
41
41
|
}
|
|
42
|
-
const
|
|
43
|
-
if (
|
|
44
|
-
return
|
|
42
|
+
const rawMatches = resolveNodeMatches(nodes, q);
|
|
43
|
+
if (rawMatches.length === 1) {
|
|
44
|
+
return rawMatches[0]?.nodeId ?? "";
|
|
45
45
|
}
|
|
46
|
-
if (
|
|
46
|
+
if (rawMatches.length === 0) {
|
|
47
47
|
const known = listKnownNodes(nodes);
|
|
48
48
|
throw new Error(`unknown node: ${q}${known ? ` (known: ${known})` : ""}`);
|
|
49
49
|
}
|
|
50
|
+
// Re-pair/reinstall flows can leave multiple nodes with the same display name.
|
|
51
|
+
// Prefer a unique connected match when available.
|
|
52
|
+
const connectedMatches = rawMatches.filter((match) => match.connected === true);
|
|
53
|
+
const matches = connectedMatches.length > 0 ? connectedMatches : rawMatches;
|
|
54
|
+
if (matches.length === 1) {
|
|
55
|
+
return matches[0]?.nodeId ?? "";
|
|
56
|
+
}
|
|
50
57
|
throw new Error(`ambiguous node: ${q} (matches: ${matches
|
|
51
58
|
.map((n) => n.displayName || n.remoteIp || n.nodeId)
|
|
52
59
|
.join(", ")})`);
|
|
@@ -2,6 +2,7 @@ const OPERATOR_ROLE = "operator";
|
|
|
2
2
|
const OPERATOR_ADMIN_SCOPE = "operator.admin";
|
|
3
3
|
const OPERATOR_READ_SCOPE = "operator.read";
|
|
4
4
|
const OPERATOR_WRITE_SCOPE = "operator.write";
|
|
5
|
+
const OPERATOR_SCOPE_PREFIX = "operator.";
|
|
5
6
|
function normalizeScopeList(scopes) {
|
|
6
7
|
const out = new Set();
|
|
7
8
|
for (const scope of scopes) {
|
|
@@ -13,10 +14,14 @@ function normalizeScopeList(scopes) {
|
|
|
13
14
|
return [...out];
|
|
14
15
|
}
|
|
15
16
|
function operatorScopeSatisfied(requestedScope, granted) {
|
|
17
|
+
if (granted.has(OPERATOR_ADMIN_SCOPE) && requestedScope.startsWith(OPERATOR_SCOPE_PREFIX)) {
|
|
18
|
+
return true;
|
|
19
|
+
}
|
|
16
20
|
if (requestedScope === OPERATOR_READ_SCOPE) {
|
|
17
|
-
return
|
|
18
|
-
|
|
19
|
-
|
|
21
|
+
return granted.has(OPERATOR_READ_SCOPE) || granted.has(OPERATOR_WRITE_SCOPE);
|
|
22
|
+
}
|
|
23
|
+
if (requestedScope === OPERATOR_WRITE_SCOPE) {
|
|
24
|
+
return granted.has(OPERATOR_WRITE_SCOPE);
|
|
20
25
|
}
|
|
21
26
|
return granted.has(requestedScope);
|
|
22
27
|
}
|
package/dist/signal/accounts.js
CHANGED
|
@@ -1,26 +1,13 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
return Object.keys(accounts).filter(Boolean);
|
|
7
|
-
}
|
|
8
|
-
export function listSignalAccountIds(cfg) {
|
|
9
|
-
const ids = listConfiguredAccountIds(cfg);
|
|
10
|
-
if (ids.length === 0)
|
|
11
|
-
return [DEFAULT_ACCOUNT_ID];
|
|
12
|
-
return ids.sort((a, b) => a.localeCompare(b));
|
|
13
|
-
}
|
|
14
|
-
export function resolveDefaultSignalAccountId(cfg) {
|
|
15
|
-
const ids = listSignalAccountIds(cfg);
|
|
16
|
-
if (ids.includes(DEFAULT_ACCOUNT_ID))
|
|
17
|
-
return DEFAULT_ACCOUNT_ID;
|
|
18
|
-
return ids[0] ?? DEFAULT_ACCOUNT_ID;
|
|
19
|
-
}
|
|
1
|
+
import { createAccountListHelpers } from "../channels/plugins/account-helpers.js";
|
|
2
|
+
import { normalizeAccountId } from "../routing/session-key.js";
|
|
3
|
+
const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("signal");
|
|
4
|
+
export const listSignalAccountIds = listAccountIds;
|
|
5
|
+
export const resolveDefaultSignalAccountId = resolveDefaultAccountId;
|
|
20
6
|
function resolveAccountConfig(cfg, accountId) {
|
|
21
7
|
const accounts = cfg.channels?.signal?.accounts;
|
|
22
|
-
if (!accounts || typeof accounts !== "object")
|
|
8
|
+
if (!accounts || typeof accounts !== "object") {
|
|
23
9
|
return undefined;
|
|
10
|
+
}
|
|
24
11
|
return accounts[accountId];
|
|
25
12
|
}
|
|
26
13
|
function mergeSignalAccountConfig(cfg, accountId) {
|
|
@@ -379,7 +379,9 @@ export function createSignalEventHandler(deps) {
|
|
|
379
379
|
const groupId = dataMessage.groupInfo?.groupId ?? undefined;
|
|
380
380
|
const groupName = dataMessage.groupInfo?.groupName ?? undefined;
|
|
381
381
|
const isGroup = Boolean(groupId);
|
|
382
|
-
const storeAllowFrom =
|
|
382
|
+
const storeAllowFrom = deps.dmPolicy === "allowlist"
|
|
383
|
+
? []
|
|
384
|
+
: await readChannelAllowFromStore("signal").catch(() => []);
|
|
383
385
|
const effectiveDmAllow = [...deps.allowFrom, ...storeAllowFrom];
|
|
384
386
|
const effectiveGroupAllow = [...deps.groupAllowFrom, ...storeAllowFrom];
|
|
385
387
|
const dmAllowed = deps.dmPolicy === "open" ? true : isSignalSenderAllowed(sender, effectiveDmAllow);
|
package/dist/slack/accounts.js
CHANGED
|
@@ -1,28 +1,15 @@
|
|
|
1
1
|
import { normalizeChatType } from "../channels/chat-type.js";
|
|
2
|
+
import { createAccountListHelpers } from "../channels/plugins/account-helpers.js";
|
|
2
3
|
import { DEFAULT_ACCOUNT_ID, normalizeAccountId } from "../routing/session-key.js";
|
|
3
4
|
import { resolveSlackAppToken, resolveSlackBotToken } from "./token.js";
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
return [];
|
|
8
|
-
return Object.keys(accounts).filter(Boolean);
|
|
9
|
-
}
|
|
10
|
-
export function listSlackAccountIds(cfg) {
|
|
11
|
-
const ids = listConfiguredAccountIds(cfg);
|
|
12
|
-
if (ids.length === 0)
|
|
13
|
-
return [DEFAULT_ACCOUNT_ID];
|
|
14
|
-
return ids.sort((a, b) => a.localeCompare(b));
|
|
15
|
-
}
|
|
16
|
-
export function resolveDefaultSlackAccountId(cfg) {
|
|
17
|
-
const ids = listSlackAccountIds(cfg);
|
|
18
|
-
if (ids.includes(DEFAULT_ACCOUNT_ID))
|
|
19
|
-
return DEFAULT_ACCOUNT_ID;
|
|
20
|
-
return ids[0] ?? DEFAULT_ACCOUNT_ID;
|
|
21
|
-
}
|
|
5
|
+
const { listAccountIds, resolveDefaultAccountId } = createAccountListHelpers("slack");
|
|
6
|
+
export const listSlackAccountIds = listAccountIds;
|
|
7
|
+
export const resolveDefaultSlackAccountId = resolveDefaultAccountId;
|
|
22
8
|
function resolveAccountConfig(cfg, accountId) {
|
|
23
9
|
const accounts = cfg.channels?.slack?.accounts;
|
|
24
|
-
if (!accounts || typeof accounts !== "object")
|
|
10
|
+
if (!accounts || typeof accounts !== "object") {
|
|
25
11
|
return undefined;
|
|
12
|
+
}
|
|
26
13
|
return accounts[accountId];
|
|
27
14
|
}
|
|
28
15
|
function mergeSlackAccountConfig(cfg, accountId) {
|
package/dist/slack/actions.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
import { loadConfig } from "../config/config.js";
|
|
2
2
|
import { logVerbose } from "../globals.js";
|
|
3
3
|
import { resolveSlackAccount } from "./accounts.js";
|
|
4
|
+
import { buildSlackBlocksFallbackText } from "./blocks-fallback.js";
|
|
5
|
+
import { validateSlackBlocksArray } from "./blocks-input.js";
|
|
4
6
|
import { createSlackWebClient } from "./client.js";
|
|
5
7
|
import { sendMessageSlack } from "./send.js";
|
|
6
8
|
import { resolveSlackBotToken } from "./token.js";
|
|
@@ -55,15 +57,17 @@ export async function removeOwnSlackReactions(channelId, messageId, opts = {}) {
|
|
|
55
57
|
const toRemove = new Set();
|
|
56
58
|
for (const reaction of reactions ?? []) {
|
|
57
59
|
const name = reaction?.name;
|
|
58
|
-
if (!name)
|
|
60
|
+
if (!name) {
|
|
59
61
|
continue;
|
|
62
|
+
}
|
|
60
63
|
const users = reaction?.users ?? [];
|
|
61
64
|
if (users.includes(userId)) {
|
|
62
65
|
toRemove.add(name);
|
|
63
66
|
}
|
|
64
67
|
}
|
|
65
|
-
if (toRemove.size === 0)
|
|
68
|
+
if (toRemove.size === 0) {
|
|
66
69
|
return [];
|
|
70
|
+
}
|
|
67
71
|
await Promise.all(Array.from(toRemove, (name) => client.reactions.remove({
|
|
68
72
|
channel: channelId,
|
|
69
73
|
timestamp: messageId,
|
|
@@ -88,14 +92,18 @@ export async function sendSlackMessage(to, content, opts = {}) {
|
|
|
88
92
|
mediaUrl: opts.mediaUrl,
|
|
89
93
|
client: opts.client,
|
|
90
94
|
threadTs: opts.threadTs,
|
|
95
|
+
blocks: opts.blocks,
|
|
91
96
|
});
|
|
92
97
|
}
|
|
93
98
|
export async function editSlackMessage(channelId, messageId, content, opts = {}) {
|
|
94
99
|
const client = await getClient(opts);
|
|
100
|
+
const blocks = opts.blocks == null ? undefined : validateSlackBlocksArray(opts.blocks);
|
|
101
|
+
const trimmedContent = content.trim();
|
|
95
102
|
await client.chat.update({
|
|
96
103
|
channel: channelId,
|
|
97
104
|
ts: messageId,
|
|
98
|
-
text:
|
|
105
|
+
text: trimmedContent || (blocks ? buildSlackBlocksFallbackText(blocks) : " "),
|
|
106
|
+
...(blocks ? { blocks } : {}),
|
|
99
107
|
});
|
|
100
108
|
}
|
|
101
109
|
export async function deleteSlackMessage(channelId, messageId, opts = {}) {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { readChannelAllowFromStore } from "../../pairing/pairing-store.js";
|
|
2
2
|
import { allowListMatches, normalizeAllowList, normalizeAllowListLower } from "./allow-list.js";
|
|
3
3
|
export async function resolveSlackEffectiveAllowFrom(ctx) {
|
|
4
|
-
const storeAllowFrom = await readChannelAllowFromStore("slack").catch(() => []);
|
|
4
|
+
const storeAllowFrom = ctx.dmPolicy === "allowlist" ? [] : await readChannelAllowFromStore("slack").catch(() => []);
|
|
5
5
|
const allowFrom = normalizeAllowList([...ctx.allowFrom, ...storeAllowFrom]);
|
|
6
6
|
const allowFromLower = normalizeAllowListLower(allowFrom);
|
|
7
7
|
return { allowFrom, allowFromLower };
|
|
@@ -10,15 +10,18 @@ import { resolveStorePath, updateLastRoute } from "../../../config/sessions.js";
|
|
|
10
10
|
import { danger, logVerbose, shouldLogVerbose } from "../../../globals.js";
|
|
11
11
|
import { removeSlackReaction } from "../../actions.js";
|
|
12
12
|
import { createSlackDraftStream } from "../../draft-stream.js";
|
|
13
|
-
import { applyAppendOnlyStreamUpdate, buildStatusFinalPreviewText,
|
|
13
|
+
import { applyAppendOnlyStreamUpdate, buildStatusFinalPreviewText, resolveSlackStreamingConfig, } from "../../stream-mode.js";
|
|
14
14
|
import { appendSlackStream, startSlackStream, stopSlackStream } from "../../streaming.js";
|
|
15
15
|
import { resolveSlackThreadTargets } from "../../threading.js";
|
|
16
16
|
import { createSlackReplyDeliveryPlan, deliverReplies, resolveSlackThreadTs } from "../replies.js";
|
|
17
17
|
function hasMedia(payload) {
|
|
18
18
|
return Boolean(payload.mediaUrl) || (payload.mediaUrls?.length ?? 0) > 0;
|
|
19
19
|
}
|
|
20
|
-
export function isSlackStreamingEnabled(
|
|
21
|
-
|
|
20
|
+
export function isSlackStreamingEnabled(params) {
|
|
21
|
+
if (params.mode !== "partial") {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
return params.nativeStreaming;
|
|
22
25
|
}
|
|
23
26
|
export function resolveSlackStreamingThreadHint(params) {
|
|
24
27
|
return resolveSlackThreadTs({
|
|
@@ -120,7 +123,16 @@ export async function dispatchPreparedSlackMessage(prepared) {
|
|
|
120
123
|
channel: "slack",
|
|
121
124
|
accountId: route.accountId,
|
|
122
125
|
});
|
|
123
|
-
const
|
|
126
|
+
const slackStreaming = resolveSlackStreamingConfig({
|
|
127
|
+
streaming: account.config.streaming,
|
|
128
|
+
streamMode: account.config.streamMode,
|
|
129
|
+
nativeStreaming: account.config.nativeStreaming,
|
|
130
|
+
});
|
|
131
|
+
const previewStreamingEnabled = slackStreaming.mode !== "off";
|
|
132
|
+
const streamingEnabled = isSlackStreamingEnabled({
|
|
133
|
+
mode: slackStreaming.mode,
|
|
134
|
+
nativeStreaming: slackStreaming.nativeStreaming,
|
|
135
|
+
});
|
|
124
136
|
const streamThreadHint = resolveSlackStreamingThreadHint({
|
|
125
137
|
replyToMode: ctx.replyToMode,
|
|
126
138
|
incomingThreadTs,
|
|
@@ -167,6 +179,8 @@ export async function dispatchPreparedSlackMessage(prepared) {
|
|
|
167
179
|
channel: message.channel,
|
|
168
180
|
threadTs: streamThreadTs,
|
|
169
181
|
text,
|
|
182
|
+
teamId: ctx.teamId,
|
|
183
|
+
userId: message.user,
|
|
170
184
|
});
|
|
171
185
|
replyPlan.markSent();
|
|
172
186
|
return;
|
|
@@ -194,7 +208,8 @@ export async function dispatchPreparedSlackMessage(prepared) {
|
|
|
194
208
|
const draftMessageId = draftStream?.messageId();
|
|
195
209
|
const draftChannelId = draftStream?.channelId();
|
|
196
210
|
const finalText = payload.text;
|
|
197
|
-
const canFinalizeViaPreviewEdit =
|
|
211
|
+
const canFinalizeViaPreviewEdit = previewStreamingEnabled &&
|
|
212
|
+
streamMode !== "status_final" &&
|
|
198
213
|
mediaCount === 0 &&
|
|
199
214
|
!payload.isError &&
|
|
200
215
|
typeof finalText === "string" &&
|
|
@@ -216,7 +231,7 @@ export async function dispatchPreparedSlackMessage(prepared) {
|
|
|
216
231
|
logVerbose(`slack: preview final edit failed; falling back to standard send (${String(err)})`);
|
|
217
232
|
}
|
|
218
233
|
}
|
|
219
|
-
else if (streamMode === "status_final" && hasStreamedMessage) {
|
|
234
|
+
else if (previewStreamingEnabled && streamMode === "status_final" && hasStreamedMessage) {
|
|
220
235
|
try {
|
|
221
236
|
const statusChannelId = draftStream?.channelId();
|
|
222
237
|
const statusMessageId = draftStream?.messageId();
|
|
@@ -267,7 +282,7 @@ export async function dispatchPreparedSlackMessage(prepared) {
|
|
|
267
282
|
warn: logVerbose,
|
|
268
283
|
});
|
|
269
284
|
let hasStreamedMessage = false;
|
|
270
|
-
const streamMode =
|
|
285
|
+
const streamMode = slackStreaming.draftMode;
|
|
271
286
|
let appendRenderedText = "";
|
|
272
287
|
let appendSourceText = "";
|
|
273
288
|
let statusUpdateCount = 0;
|
|
@@ -312,38 +327,44 @@ export async function dispatchPreparedSlackMessage(prepared) {
|
|
|
312
327
|
skillFilter: prepared.channelConfig?.skills,
|
|
313
328
|
hasRepliedRef,
|
|
314
329
|
disableBlockStreaming: useStreaming
|
|
315
|
-
?
|
|
330
|
+
? true
|
|
316
331
|
: typeof account.config.blockStreaming === "boolean"
|
|
317
332
|
? !account.config.blockStreaming
|
|
318
333
|
: undefined,
|
|
319
334
|
onModelSelected,
|
|
320
335
|
onPartialReply: useStreaming
|
|
321
336
|
? undefined
|
|
322
|
-
:
|
|
323
|
-
|
|
324
|
-
|
|
337
|
+
: !previewStreamingEnabled
|
|
338
|
+
? undefined
|
|
339
|
+
: async (payload) => {
|
|
340
|
+
updateDraftFromPartial(payload.text);
|
|
341
|
+
},
|
|
325
342
|
onAssistantMessageStart: useStreaming
|
|
326
343
|
? undefined
|
|
327
|
-
:
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
hasStreamedMessage
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
344
|
+
: !previewStreamingEnabled
|
|
345
|
+
? undefined
|
|
346
|
+
: async () => {
|
|
347
|
+
if (hasStreamedMessage) {
|
|
348
|
+
draftStream.forceNewMessage();
|
|
349
|
+
hasStreamedMessage = false;
|
|
350
|
+
appendRenderedText = "";
|
|
351
|
+
appendSourceText = "";
|
|
352
|
+
statusUpdateCount = 0;
|
|
353
|
+
}
|
|
354
|
+
},
|
|
336
355
|
onReasoningEnd: useStreaming
|
|
337
356
|
? undefined
|
|
338
|
-
:
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
hasStreamedMessage
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
357
|
+
: !previewStreamingEnabled
|
|
358
|
+
? undefined
|
|
359
|
+
: async () => {
|
|
360
|
+
if (hasStreamedMessage) {
|
|
361
|
+
draftStream.forceNewMessage();
|
|
362
|
+
hasStreamedMessage = false;
|
|
363
|
+
appendRenderedText = "";
|
|
364
|
+
appendSourceText = "";
|
|
365
|
+
statusUpdateCount = 0;
|
|
366
|
+
}
|
|
367
|
+
},
|
|
347
368
|
},
|
|
348
369
|
});
|
|
349
370
|
await draftStream.flush();
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
+
import { chunkMarkdownTextWithMode } from "../../auto-reply/chunk.js";
|
|
1
2
|
import { createReplyReferencePlanner } from "../../auto-reply/reply/reply-reference.js";
|
|
2
3
|
import { isSilentReplyText, SILENT_REPLY_TOKEN } from "../../auto-reply/tokens.js";
|
|
3
|
-
import { chunkMarkdownTextWithMode } from "../../auto-reply/chunk.js";
|
|
4
4
|
import { markdownToSlackMrkdwnChunks } from "../format.js";
|
|
5
5
|
import { sendMessageSlack } from "../send.js";
|
|
6
6
|
export async function deliverReplies(params) {
|
|
@@ -8,12 +8,14 @@ export async function deliverReplies(params) {
|
|
|
8
8
|
const threadTs = payload.replyToId ?? params.replyThreadTs;
|
|
9
9
|
const mediaList = payload.mediaUrls ?? (payload.mediaUrl ? [payload.mediaUrl] : []);
|
|
10
10
|
const text = payload.text ?? "";
|
|
11
|
-
if (!text && mediaList.length === 0)
|
|
11
|
+
if (!text && mediaList.length === 0) {
|
|
12
12
|
continue;
|
|
13
|
+
}
|
|
13
14
|
if (mediaList.length === 0) {
|
|
14
15
|
const trimmed = text.trim();
|
|
15
|
-
if (!trimmed || isSilentReplyText(trimmed, SILENT_REPLY_TOKEN))
|
|
16
|
+
if (!trimmed || isSilentReplyText(trimmed, SILENT_REPLY_TOKEN)) {
|
|
16
17
|
continue;
|
|
18
|
+
}
|
|
17
19
|
await sendMessageSlack(params.target, trimmed, {
|
|
18
20
|
token: params.token,
|
|
19
21
|
threadTs,
|
|
@@ -52,8 +54,11 @@ export function resolveSlackThreadTs(params) {
|
|
|
52
54
|
return planner.use();
|
|
53
55
|
}
|
|
54
56
|
function createSlackReplyReferencePlanner(params) {
|
|
57
|
+
// When already inside a Slack thread, always stay in it regardless of
|
|
58
|
+
// replyToMode — thread_ts is required to keep messages in the thread.
|
|
59
|
+
const effectiveMode = params.incomingThreadTs ? "all" : params.replyToMode;
|
|
55
60
|
return createReplyReferencePlanner({
|
|
56
|
-
replyToMode:
|
|
61
|
+
replyToMode: effectiveMode,
|
|
57
62
|
existingId: params.incomingThreadTs,
|
|
58
63
|
startId: params.messageTs,
|
|
59
64
|
hasReplied: params.hasReplied,
|
|
@@ -84,21 +89,24 @@ export async function deliverSlackSlashReplies(params) {
|
|
|
84
89
|
const combined = [text ?? "", ...mediaList.map((url) => url.trim()).filter(Boolean)]
|
|
85
90
|
.filter(Boolean)
|
|
86
91
|
.join("\n");
|
|
87
|
-
if (!combined)
|
|
92
|
+
if (!combined) {
|
|
88
93
|
continue;
|
|
94
|
+
}
|
|
89
95
|
const chunkMode = params.chunkMode ?? "length";
|
|
90
96
|
const markdownChunks = chunkMode === "newline"
|
|
91
97
|
? chunkMarkdownTextWithMode(combined, chunkLimit, chunkMode)
|
|
92
98
|
: [combined];
|
|
93
99
|
const chunks = markdownChunks.flatMap((markdown) => markdownToSlackMrkdwnChunks(markdown, chunkLimit, { tableMode: params.tableMode }));
|
|
94
|
-
if (!chunks.length && combined)
|
|
100
|
+
if (!chunks.length && combined) {
|
|
95
101
|
chunks.push(combined);
|
|
102
|
+
}
|
|
96
103
|
for (const chunk of chunks) {
|
|
97
104
|
messages.push(chunk);
|
|
98
105
|
}
|
|
99
106
|
}
|
|
100
|
-
if (messages.length === 0)
|
|
107
|
+
if (messages.length === 0) {
|
|
101
108
|
return;
|
|
109
|
+
}
|
|
102
110
|
// Slack slash command responses can be multi-part by sending follow-ups via response_url.
|
|
103
111
|
const responseType = params.ephemeral ? "ephemeral" : "in_channel";
|
|
104
112
|
for (const text of messages) {
|
|
@@ -9,6 +9,7 @@ import { normalizeAllowList, normalizeAllowListLower, resolveSlackAllowListMatch
|
|
|
9
9
|
import { resolveSlackChannelConfig } from "./channel-config.js";
|
|
10
10
|
import { buildSlackSlashCommandMatcher, resolveSlackSlashCommandConfig } from "./commands.js";
|
|
11
11
|
import { normalizeSlackChannelType } from "./context.js";
|
|
12
|
+
import { escapeSlackMrkdwn } from "./mrkdwn.js";
|
|
12
13
|
import { isSlackChannelAllowedByPolicy } from "./policy.js";
|
|
13
14
|
import { resolveSlackRoomContextHints } from "./room-context.js";
|
|
14
15
|
const SLACK_COMMAND_ARG_ACTION_ID = "poolbot_cmdarg";
|
|
@@ -32,14 +33,6 @@ function truncatePlainText(value, max) {
|
|
|
32
33
|
}
|
|
33
34
|
return `${trimmed.slice(0, max - 1)}…`;
|
|
34
35
|
}
|
|
35
|
-
function escapeSlackMrkdwn(value) {
|
|
36
|
-
return value
|
|
37
|
-
.replaceAll("\\", "\\\\")
|
|
38
|
-
.replaceAll("&", "&")
|
|
39
|
-
.replaceAll("<", "<")
|
|
40
|
-
.replaceAll(">", ">")
|
|
41
|
-
.replace(/([*_`~])/g, "\\$1");
|
|
42
|
-
}
|
|
43
36
|
function buildSlackArgMenuConfirm(params) {
|
|
44
37
|
const command = escapeSlackMrkdwn(params.command);
|
|
45
38
|
const arg = escapeSlackMrkdwn(params.arg);
|
|
@@ -267,7 +260,9 @@ export async function registerSlackMonitorSlashCommands(params) {
|
|
|
267
260
|
});
|
|
268
261
|
return;
|
|
269
262
|
}
|
|
270
|
-
const storeAllowFrom =
|
|
263
|
+
const storeAllowFrom = ctx.dmPolicy === "allowlist"
|
|
264
|
+
? []
|
|
265
|
+
: await readChannelAllowFromStore("slack").catch(() => []);
|
|
271
266
|
const effectiveAllowFrom = normalizeAllowList([...ctx.allowFrom, ...storeAllowFrom]);
|
|
272
267
|
const effectiveAllowFromLower = normalizeAllowListLower(effectiveAllowFrom);
|
|
273
268
|
// Privileged command surface: compute CommandAuthorized, don't assume true.
|
|
@@ -435,9 +430,10 @@ export async function registerSlackMonitorSlashCommands(params) {
|
|
|
435
430
|
import("../../auto-reply/reply/inbound-context.js"),
|
|
436
431
|
import("../../auto-reply/reply/provider-dispatcher.js"),
|
|
437
432
|
]);
|
|
438
|
-
const [{ resolveConversationLabel }, { createReplyPrefixOptions }] = await Promise.all([
|
|
433
|
+
const [{ resolveConversationLabel }, { createReplyPrefixOptions }, { recordSessionMetaFromInbound, resolveStorePath },] = await Promise.all([
|
|
439
434
|
import("../../channels/conversation-label.js"),
|
|
440
435
|
import("../../channels/reply-prefix.js"),
|
|
436
|
+
import("../../config/sessions.js"),
|
|
441
437
|
]);
|
|
442
438
|
const route = resolveAgentRoute({
|
|
443
439
|
cfg,
|
|
@@ -495,6 +491,19 @@ export async function registerSlackMonitorSlashCommands(params) {
|
|
|
495
491
|
OriginatingChannel: "slack",
|
|
496
492
|
OriginatingTo: `user:${command.user_id}`,
|
|
497
493
|
});
|
|
494
|
+
const storePath = resolveStorePath(cfg.session?.store, {
|
|
495
|
+
agentId: route.agentId,
|
|
496
|
+
});
|
|
497
|
+
try {
|
|
498
|
+
await recordSessionMetaFromInbound({
|
|
499
|
+
storePath,
|
|
500
|
+
sessionKey: ctxPayload.SessionKey ?? route.sessionKey,
|
|
501
|
+
ctx: ctxPayload,
|
|
502
|
+
});
|
|
503
|
+
}
|
|
504
|
+
catch (err) {
|
|
505
|
+
runtime.error?.(danger(`slack slash: failed updating session meta: ${String(err)}`));
|
|
506
|
+
}
|
|
498
507
|
const { onModelSelected, ...prefixOptions } = createReplyPrefixOptions({
|
|
499
508
|
cfg,
|
|
500
509
|
agentId: route.agentId,
|
|
@@ -613,11 +622,11 @@ export async function registerSlackMonitorSlashCommands(params) {
|
|
|
613
622
|
return;
|
|
614
623
|
}
|
|
615
624
|
const registerArgOptions = () => {
|
|
616
|
-
const
|
|
617
|
-
if (typeof
|
|
625
|
+
const appWithOptions = ctx.app;
|
|
626
|
+
if (typeof appWithOptions.options !== "function") {
|
|
618
627
|
return;
|
|
619
628
|
}
|
|
620
|
-
|
|
629
|
+
appWithOptions.options(SLACK_COMMAND_ARG_ACTION_ID, async ({ ack, body }) => {
|
|
621
630
|
const typedBody = body;
|
|
622
631
|
pruneSlackExternalArgMenuStore();
|
|
623
632
|
const blockId = typedBody.actions?.[0]?.block_id ?? typedBody.block_id;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { createSlackWebClient } from "./client.js";
|
|
2
2
|
function parseSlackChannelMention(raw) {
|
|
3
3
|
const trimmed = raw.trim();
|
|
4
|
-
if (!trimmed)
|
|
4
|
+
if (!trimmed) {
|
|
5
5
|
return {};
|
|
6
|
+
}
|
|
6
7
|
const mention = trimmed.match(/^<#([A-Z0-9]+)(?:\|([^>]+))?>$/i);
|
|
7
8
|
if (mention) {
|
|
8
9
|
const id = mention[1]?.toUpperCase();
|
|
@@ -10,8 +11,9 @@ function parseSlackChannelMention(raw) {
|
|
|
10
11
|
return { id, name };
|
|
11
12
|
}
|
|
12
13
|
const prefixed = trimmed.replace(/^(slack:|channel:)/i, "");
|
|
13
|
-
if (/^[CG][A-Z0-9]+$/i.test(prefixed))
|
|
14
|
+
if (/^[CG][A-Z0-9]+$/i.test(prefixed)) {
|
|
14
15
|
return { id: prefixed.toUpperCase() };
|
|
16
|
+
}
|
|
15
17
|
const name = prefixed.replace(/^#/, "").trim();
|
|
16
18
|
return name ? { name } : {};
|
|
17
19
|
}
|
|
@@ -28,8 +30,9 @@ async function listSlackChannels(client) {
|
|
|
28
30
|
for (const channel of res.channels ?? []) {
|
|
29
31
|
const id = channel.id?.trim();
|
|
30
32
|
const name = channel.name?.trim();
|
|
31
|
-
if (!id || !name)
|
|
33
|
+
if (!id || !name) {
|
|
32
34
|
continue;
|
|
35
|
+
}
|
|
33
36
|
channels.push({
|
|
34
37
|
id,
|
|
35
38
|
name,
|
|
@@ -44,11 +47,13 @@ async function listSlackChannels(client) {
|
|
|
44
47
|
}
|
|
45
48
|
function resolveByName(name, channels) {
|
|
46
49
|
const target = name.trim().toLowerCase();
|
|
47
|
-
if (!target)
|
|
50
|
+
if (!target) {
|
|
48
51
|
return undefined;
|
|
52
|
+
}
|
|
49
53
|
const matches = channels.filter((channel) => channel.name.toLowerCase() === target);
|
|
50
|
-
if (matches.length === 0)
|
|
54
|
+
if (matches.length === 0) {
|
|
51
55
|
return undefined;
|
|
56
|
+
}
|
|
52
57
|
const active = matches.find((channel) => !channel.archived);
|
|
53
58
|
return active ?? matches[0];
|
|
54
59
|
}
|