@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
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Channel-agnostic status reaction controller.
|
|
3
|
+
* Provides a unified interface for displaying agent status via message reactions.
|
|
4
|
+
*/
|
|
5
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
6
|
+
// Constants
|
|
7
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
8
|
+
export const DEFAULT_EMOJIS = {
|
|
9
|
+
queued: "👀",
|
|
10
|
+
thinking: "🤔",
|
|
11
|
+
tool: "🔥",
|
|
12
|
+
coding: "👨💻",
|
|
13
|
+
web: "⚡",
|
|
14
|
+
done: "👍",
|
|
15
|
+
error: "😱",
|
|
16
|
+
stallSoft: "🥱",
|
|
17
|
+
stallHard: "😨",
|
|
18
|
+
};
|
|
19
|
+
export const DEFAULT_TIMING = {
|
|
20
|
+
debounceMs: 700,
|
|
21
|
+
stallSoftMs: 10_000,
|
|
22
|
+
stallHardMs: 30_000,
|
|
23
|
+
doneHoldMs: 1500,
|
|
24
|
+
errorHoldMs: 2500,
|
|
25
|
+
};
|
|
26
|
+
export const CODING_TOOL_TOKENS = [
|
|
27
|
+
"exec",
|
|
28
|
+
"process",
|
|
29
|
+
"read",
|
|
30
|
+
"write",
|
|
31
|
+
"edit",
|
|
32
|
+
"session_status",
|
|
33
|
+
"bash",
|
|
34
|
+
];
|
|
35
|
+
export const WEB_TOOL_TOKENS = [
|
|
36
|
+
"web_search",
|
|
37
|
+
"web-search",
|
|
38
|
+
"web_fetch",
|
|
39
|
+
"web-fetch",
|
|
40
|
+
"browser",
|
|
41
|
+
];
|
|
42
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
43
|
+
// Functions
|
|
44
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
45
|
+
/**
|
|
46
|
+
* Resolve the appropriate emoji for a tool invocation.
|
|
47
|
+
*/
|
|
48
|
+
export function resolveToolEmoji(toolName, emojis) {
|
|
49
|
+
const normalized = toolName?.trim().toLowerCase() ?? "";
|
|
50
|
+
if (!normalized) {
|
|
51
|
+
return emojis.tool;
|
|
52
|
+
}
|
|
53
|
+
if (WEB_TOOL_TOKENS.some((token) => normalized.includes(token))) {
|
|
54
|
+
return emojis.web;
|
|
55
|
+
}
|
|
56
|
+
if (CODING_TOOL_TOKENS.some((token) => normalized.includes(token))) {
|
|
57
|
+
return emojis.coding;
|
|
58
|
+
}
|
|
59
|
+
return emojis.tool;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Create a status reaction controller.
|
|
63
|
+
*
|
|
64
|
+
* Features:
|
|
65
|
+
* - Promise chain serialization (prevents concurrent API calls)
|
|
66
|
+
* - Debouncing (intermediate states debounce, terminal states are immediate)
|
|
67
|
+
* - Stall timers (soft/hard warnings on inactivity)
|
|
68
|
+
* - Terminal state protection (done/error mark finished, subsequent updates ignored)
|
|
69
|
+
*/
|
|
70
|
+
export function createStatusReactionController(params) {
|
|
71
|
+
const { enabled, adapter, initialEmoji, onError } = params;
|
|
72
|
+
// Merge user-provided overrides with defaults
|
|
73
|
+
const emojis = {
|
|
74
|
+
...DEFAULT_EMOJIS,
|
|
75
|
+
queued: params.emojis?.queued ?? initialEmoji,
|
|
76
|
+
...params.emojis,
|
|
77
|
+
};
|
|
78
|
+
const timing = {
|
|
79
|
+
...DEFAULT_TIMING,
|
|
80
|
+
...params.timing,
|
|
81
|
+
};
|
|
82
|
+
// State
|
|
83
|
+
let currentEmoji = "";
|
|
84
|
+
let pendingEmoji = "";
|
|
85
|
+
let debounceTimer = null;
|
|
86
|
+
let stallSoftTimer = null;
|
|
87
|
+
let stallHardTimer = null;
|
|
88
|
+
let finished = false;
|
|
89
|
+
let chainPromise = Promise.resolve();
|
|
90
|
+
// Known emojis for clear operation
|
|
91
|
+
const knownEmojis = new Set([
|
|
92
|
+
initialEmoji,
|
|
93
|
+
emojis.queued,
|
|
94
|
+
emojis.thinking,
|
|
95
|
+
emojis.tool,
|
|
96
|
+
emojis.coding,
|
|
97
|
+
emojis.web,
|
|
98
|
+
emojis.done,
|
|
99
|
+
emojis.error,
|
|
100
|
+
emojis.stallSoft,
|
|
101
|
+
emojis.stallHard,
|
|
102
|
+
]);
|
|
103
|
+
/**
|
|
104
|
+
* Serialize async operations to prevent race conditions.
|
|
105
|
+
*/
|
|
106
|
+
function enqueue(fn) {
|
|
107
|
+
chainPromise = chainPromise.then(fn, fn);
|
|
108
|
+
return chainPromise;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Clear all timers.
|
|
112
|
+
*/
|
|
113
|
+
function clearAllTimers() {
|
|
114
|
+
if (debounceTimer) {
|
|
115
|
+
clearTimeout(debounceTimer);
|
|
116
|
+
debounceTimer = null;
|
|
117
|
+
}
|
|
118
|
+
if (stallSoftTimer) {
|
|
119
|
+
clearTimeout(stallSoftTimer);
|
|
120
|
+
stallSoftTimer = null;
|
|
121
|
+
}
|
|
122
|
+
if (stallHardTimer) {
|
|
123
|
+
clearTimeout(stallHardTimer);
|
|
124
|
+
stallHardTimer = null;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Clear debounce timer only (used during phase transitions).
|
|
129
|
+
*/
|
|
130
|
+
function clearDebounceTimer() {
|
|
131
|
+
if (debounceTimer) {
|
|
132
|
+
clearTimeout(debounceTimer);
|
|
133
|
+
debounceTimer = null;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Reset stall timers (called on each phase change).
|
|
138
|
+
*/
|
|
139
|
+
function resetStallTimers() {
|
|
140
|
+
if (stallSoftTimer) {
|
|
141
|
+
clearTimeout(stallSoftTimer);
|
|
142
|
+
}
|
|
143
|
+
if (stallHardTimer) {
|
|
144
|
+
clearTimeout(stallHardTimer);
|
|
145
|
+
}
|
|
146
|
+
stallSoftTimer = setTimeout(() => {
|
|
147
|
+
scheduleEmoji(emojis.stallSoft, { immediate: true, skipStallReset: true });
|
|
148
|
+
}, timing.stallSoftMs);
|
|
149
|
+
stallHardTimer = setTimeout(() => {
|
|
150
|
+
scheduleEmoji(emojis.stallHard, { immediate: true, skipStallReset: true });
|
|
151
|
+
}, timing.stallHardMs);
|
|
152
|
+
}
|
|
153
|
+
/**
|
|
154
|
+
* Apply an emoji: set new reaction and optionally remove old one.
|
|
155
|
+
*/
|
|
156
|
+
async function applyEmoji(newEmoji) {
|
|
157
|
+
if (!enabled) {
|
|
158
|
+
return;
|
|
159
|
+
}
|
|
160
|
+
try {
|
|
161
|
+
const previousEmoji = currentEmoji;
|
|
162
|
+
await adapter.setReaction(newEmoji);
|
|
163
|
+
// If adapter supports removeReaction and there's a different previous emoji, remove it
|
|
164
|
+
if (adapter.removeReaction && previousEmoji && previousEmoji !== newEmoji) {
|
|
165
|
+
await adapter.removeReaction(previousEmoji);
|
|
166
|
+
}
|
|
167
|
+
currentEmoji = newEmoji;
|
|
168
|
+
}
|
|
169
|
+
catch (err) {
|
|
170
|
+
if (onError) {
|
|
171
|
+
onError(err);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Schedule an emoji change (debounced or immediate).
|
|
177
|
+
*/
|
|
178
|
+
function scheduleEmoji(emoji, options = {}) {
|
|
179
|
+
if (!enabled || finished) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
// Deduplicate: if already scheduled/current, skip send but keep stall timers fresh
|
|
183
|
+
if (emoji === currentEmoji || emoji === pendingEmoji) {
|
|
184
|
+
if (!options.skipStallReset) {
|
|
185
|
+
resetStallTimers();
|
|
186
|
+
}
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
pendingEmoji = emoji;
|
|
190
|
+
clearDebounceTimer();
|
|
191
|
+
if (options.immediate) {
|
|
192
|
+
// Immediate execution for terminal states
|
|
193
|
+
void enqueue(async () => {
|
|
194
|
+
await applyEmoji(emoji);
|
|
195
|
+
pendingEmoji = "";
|
|
196
|
+
});
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
// Debounced execution for intermediate states
|
|
200
|
+
debounceTimer = setTimeout(() => {
|
|
201
|
+
void enqueue(async () => {
|
|
202
|
+
await applyEmoji(emoji);
|
|
203
|
+
pendingEmoji = "";
|
|
204
|
+
});
|
|
205
|
+
}, timing.debounceMs);
|
|
206
|
+
}
|
|
207
|
+
// Reset stall timers on phase change (unless triggered by stall timer itself)
|
|
208
|
+
if (!options.skipStallReset) {
|
|
209
|
+
resetStallTimers();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
213
|
+
// Controller API
|
|
214
|
+
// ───────────────────────────────────────────────────────────────────────────
|
|
215
|
+
function setQueued() {
|
|
216
|
+
scheduleEmoji(emojis.queued, { immediate: true });
|
|
217
|
+
}
|
|
218
|
+
function setThinking() {
|
|
219
|
+
scheduleEmoji(emojis.thinking);
|
|
220
|
+
}
|
|
221
|
+
function setTool(toolName) {
|
|
222
|
+
const emoji = resolveToolEmoji(toolName, emojis);
|
|
223
|
+
scheduleEmoji(emoji);
|
|
224
|
+
}
|
|
225
|
+
function setDone() {
|
|
226
|
+
if (!enabled) {
|
|
227
|
+
return Promise.resolve();
|
|
228
|
+
}
|
|
229
|
+
finished = true;
|
|
230
|
+
clearAllTimers();
|
|
231
|
+
// Directly enqueue to ensure we return the updated promise
|
|
232
|
+
return enqueue(async () => {
|
|
233
|
+
await applyEmoji(emojis.done);
|
|
234
|
+
pendingEmoji = "";
|
|
235
|
+
});
|
|
236
|
+
}
|
|
237
|
+
function setError() {
|
|
238
|
+
if (!enabled) {
|
|
239
|
+
return Promise.resolve();
|
|
240
|
+
}
|
|
241
|
+
finished = true;
|
|
242
|
+
clearAllTimers();
|
|
243
|
+
// Directly enqueue to ensure we return the updated promise
|
|
244
|
+
return enqueue(async () => {
|
|
245
|
+
await applyEmoji(emojis.error);
|
|
246
|
+
pendingEmoji = "";
|
|
247
|
+
});
|
|
248
|
+
}
|
|
249
|
+
async function clear() {
|
|
250
|
+
if (!enabled) {
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
clearAllTimers();
|
|
254
|
+
finished = true;
|
|
255
|
+
await enqueue(async () => {
|
|
256
|
+
if (adapter.removeReaction) {
|
|
257
|
+
// Remove all known emojis (Discord-style)
|
|
258
|
+
const emojisToRemove = Array.from(knownEmojis);
|
|
259
|
+
for (const emoji of emojisToRemove) {
|
|
260
|
+
try {
|
|
261
|
+
await adapter.removeReaction(emoji);
|
|
262
|
+
}
|
|
263
|
+
catch (err) {
|
|
264
|
+
if (onError) {
|
|
265
|
+
onError(err);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
else {
|
|
271
|
+
// For platforms without removeReaction, set empty or just skip
|
|
272
|
+
// (Telegram handles this atomically on the next setReaction)
|
|
273
|
+
}
|
|
274
|
+
currentEmoji = "";
|
|
275
|
+
pendingEmoji = "";
|
|
276
|
+
});
|
|
277
|
+
}
|
|
278
|
+
async function restoreInitial() {
|
|
279
|
+
if (!enabled) {
|
|
280
|
+
return;
|
|
281
|
+
}
|
|
282
|
+
clearAllTimers();
|
|
283
|
+
await enqueue(async () => {
|
|
284
|
+
await applyEmoji(initialEmoji);
|
|
285
|
+
pendingEmoji = "";
|
|
286
|
+
});
|
|
287
|
+
}
|
|
288
|
+
return {
|
|
289
|
+
setQueued,
|
|
290
|
+
setThinking,
|
|
291
|
+
setTool,
|
|
292
|
+
setDone,
|
|
293
|
+
setError,
|
|
294
|
+
clear,
|
|
295
|
+
restoreInitial,
|
|
296
|
+
};
|
|
297
|
+
}
|
package/dist/cli/banner.js
CHANGED
|
@@ -25,7 +25,7 @@ export function formatCliBannerLine(version, options = {}) {
|
|
|
25
25
|
const commitLabel = commit ?? "unknown";
|
|
26
26
|
const tagline = pickTagline(options);
|
|
27
27
|
const rich = options.richTty ?? isRich();
|
|
28
|
-
const cliName = resolveCliName(options.argv ?? process.argv
|
|
28
|
+
const cliName = resolveCliName(options.argv ?? process.argv);
|
|
29
29
|
const title = cliName === "poolbot" ? "🎱 Pool Bot" : "🎱 Pool Bot";
|
|
30
30
|
const prefix = "🎱 ";
|
|
31
31
|
const columns = options.columns ?? process.stdout.columns ?? 120;
|
|
@@ -1,13 +1,55 @@
|
|
|
1
|
+
import { DEFAULT_UPLOAD_DIR, resolveExistingPathsWithinRoot } from "../../browser/paths.js";
|
|
1
2
|
import { danger } from "../../globals.js";
|
|
2
3
|
import { defaultRuntime } from "../../runtime.js";
|
|
4
|
+
import { shortenHomePath } from "../../utils.js";
|
|
3
5
|
import { callBrowserRequest } from "../browser-cli-shared.js";
|
|
4
6
|
import { resolveBrowserActionContext } from "./shared.js";
|
|
5
|
-
|
|
7
|
+
async function normalizeUploadPaths(paths) {
|
|
8
|
+
const result = await resolveExistingPathsWithinRoot({
|
|
9
|
+
rootDir: DEFAULT_UPLOAD_DIR,
|
|
10
|
+
requestedPaths: paths,
|
|
11
|
+
scopeLabel: `uploads directory (${DEFAULT_UPLOAD_DIR})`,
|
|
12
|
+
});
|
|
13
|
+
if (!result.ok) {
|
|
14
|
+
throw new Error(result.error);
|
|
15
|
+
}
|
|
16
|
+
return result.paths;
|
|
17
|
+
}
|
|
6
18
|
export function registerBrowserFilesAndDownloadsCommands(browser, parentOpts) {
|
|
19
|
+
const resolveTimeoutAndTarget = (opts) => {
|
|
20
|
+
const timeoutMs = Number.isFinite(opts.timeoutMs) ? Number(opts.timeoutMs) : undefined;
|
|
21
|
+
const targetId = typeof opts.targetId === "string" ? opts.targetId.trim() || undefined : undefined;
|
|
22
|
+
return { timeoutMs, targetId };
|
|
23
|
+
};
|
|
24
|
+
const runDownloadCommand = async (cmd, opts, request) => {
|
|
25
|
+
const { parent, profile } = resolveBrowserActionContext(cmd, parentOpts);
|
|
26
|
+
try {
|
|
27
|
+
const { timeoutMs, targetId } = resolveTimeoutAndTarget(opts);
|
|
28
|
+
const result = await callBrowserRequest(parent, {
|
|
29
|
+
method: "POST",
|
|
30
|
+
path: request.path,
|
|
31
|
+
query: profile ? { profile } : undefined,
|
|
32
|
+
body: {
|
|
33
|
+
...request.body,
|
|
34
|
+
targetId,
|
|
35
|
+
timeoutMs,
|
|
36
|
+
},
|
|
37
|
+
}, { timeoutMs: timeoutMs ?? 20000 });
|
|
38
|
+
if (parent?.json) {
|
|
39
|
+
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
defaultRuntime.log(`downloaded: ${shortenHomePath(result.download.path)}`);
|
|
43
|
+
}
|
|
44
|
+
catch (err) {
|
|
45
|
+
defaultRuntime.error(danger(String(err)));
|
|
46
|
+
defaultRuntime.exit(1);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
7
49
|
browser
|
|
8
50
|
.command("upload")
|
|
9
51
|
.description("Arm file upload for the next file chooser")
|
|
10
|
-
.argument("<paths...>", "File paths to upload")
|
|
52
|
+
.argument("<paths...>", "File paths to upload (must be within Pool Bot temp uploads dir, e.g. /tmp/poolbot/uploads/file.pdf)")
|
|
11
53
|
.option("--ref <ref>", "Ref id from snapshot to click after arming")
|
|
12
54
|
.option("--input-ref <ref>", "Ref id for <input type=file> to set directly")
|
|
13
55
|
.option("--element <selector>", "CSS selector for <input type=file>")
|
|
@@ -16,17 +58,18 @@ export function registerBrowserFilesAndDownloadsCommands(browser, parentOpts) {
|
|
|
16
58
|
.action(async (paths, opts, cmd) => {
|
|
17
59
|
const { parent, profile } = resolveBrowserActionContext(cmd, parentOpts);
|
|
18
60
|
try {
|
|
19
|
-
const
|
|
61
|
+
const normalizedPaths = await normalizeUploadPaths(paths);
|
|
62
|
+
const { timeoutMs, targetId } = resolveTimeoutAndTarget(opts);
|
|
20
63
|
const result = await callBrowserRequest(parent, {
|
|
21
64
|
method: "POST",
|
|
22
65
|
path: "/hooks/file-chooser",
|
|
23
66
|
query: profile ? { profile } : undefined,
|
|
24
67
|
body: {
|
|
25
|
-
paths,
|
|
68
|
+
paths: normalizedPaths,
|
|
26
69
|
ref: opts.ref?.trim() || undefined,
|
|
27
70
|
inputRef: opts.inputRef?.trim() || undefined,
|
|
28
71
|
element: opts.element?.trim() || undefined,
|
|
29
|
-
targetId
|
|
72
|
+
targetId,
|
|
30
73
|
timeoutMs,
|
|
31
74
|
},
|
|
32
75
|
}, { timeoutMs: timeoutMs ?? 20000 });
|
|
@@ -44,66 +87,32 @@ export function registerBrowserFilesAndDownloadsCommands(browser, parentOpts) {
|
|
|
44
87
|
browser
|
|
45
88
|
.command("waitfordownload")
|
|
46
89
|
.description("Wait for the next download (and save it)")
|
|
47
|
-
.argument("[path]", "Save path (default: /tmp/poolbot/downloads/...)")
|
|
90
|
+
.argument("[path]", "Save path within poolbot temp downloads dir (default: /tmp/poolbot/downloads/...; fallback: os.tmpdir()/poolbot/downloads/...)")
|
|
48
91
|
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
49
92
|
.option("--timeout-ms <ms>", "How long to wait for the next download (default: 120000)", (v) => Number(v))
|
|
50
93
|
.action(async (outPath, opts, cmd) => {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
query: profile ? { profile } : undefined,
|
|
58
|
-
body: {
|
|
59
|
-
path: outPath?.trim() || undefined,
|
|
60
|
-
targetId: opts.targetId?.trim() || undefined,
|
|
61
|
-
timeoutMs,
|
|
62
|
-
},
|
|
63
|
-
}, { timeoutMs: timeoutMs ?? 20000 });
|
|
64
|
-
if (parent?.json) {
|
|
65
|
-
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
66
|
-
return;
|
|
67
|
-
}
|
|
68
|
-
defaultRuntime.log(`downloaded: ${shortenHomePath(result.download.path)}`);
|
|
69
|
-
}
|
|
70
|
-
catch (err) {
|
|
71
|
-
defaultRuntime.error(danger(String(err)));
|
|
72
|
-
defaultRuntime.exit(1);
|
|
73
|
-
}
|
|
94
|
+
await runDownloadCommand(cmd, opts, {
|
|
95
|
+
path: "/wait/download",
|
|
96
|
+
body: {
|
|
97
|
+
path: outPath?.trim() || undefined,
|
|
98
|
+
},
|
|
99
|
+
});
|
|
74
100
|
});
|
|
75
101
|
browser
|
|
76
102
|
.command("download")
|
|
77
103
|
.description("Click a ref and save the resulting download")
|
|
78
104
|
.argument("<ref>", "Ref id from snapshot to click")
|
|
79
|
-
.argument("<path>", "Save path")
|
|
105
|
+
.argument("<path>", "Save path within poolbot temp downloads dir (e.g. report.pdf or /tmp/poolbot/downloads/report.pdf)")
|
|
80
106
|
.option("--target-id <id>", "CDP target id (or unique prefix)")
|
|
81
107
|
.option("--timeout-ms <ms>", "How long to wait for the download to start (default: 120000)", (v) => Number(v))
|
|
82
108
|
.action(async (ref, outPath, opts, cmd) => {
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
body: {
|
|
91
|
-
ref,
|
|
92
|
-
path: outPath,
|
|
93
|
-
targetId: opts.targetId?.trim() || undefined,
|
|
94
|
-
timeoutMs,
|
|
95
|
-
},
|
|
96
|
-
}, { timeoutMs: timeoutMs ?? 20000 });
|
|
97
|
-
if (parent?.json) {
|
|
98
|
-
defaultRuntime.log(JSON.stringify(result, null, 2));
|
|
99
|
-
return;
|
|
100
|
-
}
|
|
101
|
-
defaultRuntime.log(`downloaded: ${shortenHomePath(result.download.path)}`);
|
|
102
|
-
}
|
|
103
|
-
catch (err) {
|
|
104
|
-
defaultRuntime.error(danger(String(err)));
|
|
105
|
-
defaultRuntime.exit(1);
|
|
106
|
-
}
|
|
109
|
+
await runDownloadCommand(cmd, opts, {
|
|
110
|
+
path: "/download",
|
|
111
|
+
body: {
|
|
112
|
+
ref,
|
|
113
|
+
path: outPath,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
107
116
|
});
|
|
108
117
|
browser
|
|
109
118
|
.command("dialog")
|
|
@@ -122,7 +131,7 @@ export function registerBrowserFilesAndDownloadsCommands(browser, parentOpts) {
|
|
|
122
131
|
return;
|
|
123
132
|
}
|
|
124
133
|
try {
|
|
125
|
-
const timeoutMs =
|
|
134
|
+
const { timeoutMs, targetId } = resolveTimeoutAndTarget(opts);
|
|
126
135
|
const result = await callBrowserRequest(parent, {
|
|
127
136
|
method: "POST",
|
|
128
137
|
path: "/hooks/dialog",
|
|
@@ -130,7 +139,7 @@ export function registerBrowserFilesAndDownloadsCommands(browser, parentOpts) {
|
|
|
130
139
|
body: {
|
|
131
140
|
accept,
|
|
132
141
|
promptText: opts.prompt?.trim() || undefined,
|
|
133
|
-
targetId
|
|
142
|
+
targetId,
|
|
134
143
|
timeoutMs,
|
|
135
144
|
},
|
|
136
145
|
}, { timeoutMs: timeoutMs ?? 20000 });
|
package/dist/cli/cli-name.js
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
2
|
export const DEFAULT_CLI_NAME = "poolbot";
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
|
|
6
|
-
export function resolveCliName(argv = process.argv, env = process.env) {
|
|
7
|
-
const override = env.POOLBOT_CLI_NAME?.trim() || env.MOLTBOT_CLI_NAME?.trim() || env.CLAWDBOT_CLI_NAME?.trim();
|
|
8
|
-
if (override)
|
|
9
|
-
return override;
|
|
3
|
+
const KNOWN_CLI_NAMES = new Set([DEFAULT_CLI_NAME]);
|
|
4
|
+
const CLI_PREFIX_RE = /^(?:((?:pnpm|npm|bunx|npx)\s+))?(poolbot)\b/;
|
|
5
|
+
export function resolveCliName(argv = process.argv) {
|
|
10
6
|
const argv1 = argv[1];
|
|
11
|
-
if (!argv1)
|
|
7
|
+
if (!argv1) {
|
|
12
8
|
return DEFAULT_CLI_NAME;
|
|
9
|
+
}
|
|
13
10
|
const base = path.basename(argv1).trim();
|
|
14
|
-
if (KNOWN_CLI_NAMES.has(base))
|
|
11
|
+
if (KNOWN_CLI_NAMES.has(base)) {
|
|
15
12
|
return base;
|
|
13
|
+
}
|
|
16
14
|
return DEFAULT_CLI_NAME;
|
|
17
15
|
}
|
|
18
16
|
export function replaceCliName(command, cliName = resolveCliName()) {
|
|
19
|
-
if (!command.trim())
|
|
17
|
+
if (!command.trim()) {
|
|
20
18
|
return command;
|
|
21
|
-
|
|
19
|
+
}
|
|
20
|
+
if (!CLI_PREFIX_RE.test(command)) {
|
|
22
21
|
return command;
|
|
22
|
+
}
|
|
23
23
|
return command.replace(CLI_PREFIX_RE, (_match, runner) => {
|
|
24
24
|
return `${runner ?? ""}${cliName}`;
|
|
25
25
|
});
|
package/dist/cli/cli-utils.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
}
|
|
1
|
+
import { formatErrorMessage } from "../infra/errors.js";
|
|
2
|
+
export { formatErrorMessage };
|
|
4
3
|
export async function withManager(params) {
|
|
5
4
|
const { manager, error } = await params.getManager();
|
|
6
5
|
if (!manager) {
|
|
@@ -32,3 +31,14 @@ export async function runCommandWithRuntime(runtime, action, onError) {
|
|
|
32
31
|
runtime.exit(1);
|
|
33
32
|
}
|
|
34
33
|
}
|
|
34
|
+
export function resolveOptionFromCommand(command, key) {
|
|
35
|
+
let current = command;
|
|
36
|
+
while (current) {
|
|
37
|
+
const opts = current.opts?.() ?? {};
|
|
38
|
+
if (opts[key] !== undefined) {
|
|
39
|
+
return opts[key];
|
|
40
|
+
}
|
|
41
|
+
current = current.parent ?? undefined;
|
|
42
|
+
}
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
@@ -4,7 +4,7 @@ const CLI_PREFIX_RE = /^(?:pnpm|npm|bunx|npx)\s+(?:poolbot|poolbot)\b|^(?:poolbo
|
|
|
4
4
|
const PROFILE_FLAG_RE = /(?:^|\s)--profile(?:\s|=|$)/;
|
|
5
5
|
const DEV_FLAG_RE = /(?:^|\s)--dev(?:\s|$)/;
|
|
6
6
|
export function formatCliCommand(command, env = process.env) {
|
|
7
|
-
const cliName = resolveCliName(
|
|
7
|
+
const cliName = resolveCliName();
|
|
8
8
|
const normalizedCommand = replaceCliName(command, cliName);
|
|
9
9
|
const profile = normalizeProfileName(env.POOLBOT_PROFILE || env.CLAWDBOT_PROFILE);
|
|
10
10
|
if (!profile)
|
package/dist/cli/config-cli.js
CHANGED
|
@@ -234,7 +234,7 @@ export async function runConfigUnset(opts) {
|
|
|
234
234
|
runtime.exit(1);
|
|
235
235
|
return;
|
|
236
236
|
}
|
|
237
|
-
await writeConfigFile(next);
|
|
237
|
+
await writeConfigFile(next, { unsetPaths: [parsedPath] });
|
|
238
238
|
runtime.log(info(`Removed ${opts.path}. Restart the gateway to apply.`));
|
|
239
239
|
}
|
|
240
240
|
catch (err) {
|
|
@@ -51,6 +51,15 @@ async function handleServiceNotLoaded(params) {
|
|
|
51
51
|
}
|
|
52
52
|
}
|
|
53
53
|
}
|
|
54
|
+
async function resolveServiceLoadedOrFail(params) {
|
|
55
|
+
try {
|
|
56
|
+
return await params.service.isLoaded({ env: process.env });
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
params.fail(`${params.serviceNoun} service check failed: ${String(err)}`);
|
|
60
|
+
return null;
|
|
61
|
+
}
|
|
62
|
+
}
|
|
54
63
|
export async function runServiceUninstall(params) {
|
|
55
64
|
const json = Boolean(params.opts?.json);
|
|
56
65
|
const { stdout, emit, fail } = createActionIO({ action: "uninstall", json });
|
|
@@ -100,12 +109,12 @@ export async function runServiceUninstall(params) {
|
|
|
100
109
|
export async function runServiceStart(params) {
|
|
101
110
|
const json = Boolean(params.opts?.json);
|
|
102
111
|
const { stdout, emit, fail } = createActionIO({ action: "start", json });
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
112
|
+
const loaded = await resolveServiceLoadedOrFail({
|
|
113
|
+
serviceNoun: params.serviceNoun,
|
|
114
|
+
service: params.service,
|
|
115
|
+
fail,
|
|
116
|
+
});
|
|
117
|
+
if (loaded === null) {
|
|
109
118
|
return;
|
|
110
119
|
}
|
|
111
120
|
if (!loaded) {
|
|
@@ -143,12 +152,12 @@ export async function runServiceStart(params) {
|
|
|
143
152
|
export async function runServiceStop(params) {
|
|
144
153
|
const json = Boolean(params.opts?.json);
|
|
145
154
|
const { stdout, emit, fail } = createActionIO({ action: "stop", json });
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
155
|
+
const loaded = await resolveServiceLoadedOrFail({
|
|
156
|
+
serviceNoun: params.serviceNoun,
|
|
157
|
+
service: params.service,
|
|
158
|
+
fail,
|
|
159
|
+
});
|
|
160
|
+
if (loaded === null) {
|
|
152
161
|
return;
|
|
153
162
|
}
|
|
154
163
|
if (!loaded) {
|
|
@@ -186,12 +195,12 @@ export async function runServiceStop(params) {
|
|
|
186
195
|
export async function runServiceRestart(params) {
|
|
187
196
|
const json = Boolean(params.opts?.json);
|
|
188
197
|
const { stdout, emit, fail } = createActionIO({ action: "restart", json });
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
198
|
+
const loaded = await resolveServiceLoadedOrFail({
|
|
199
|
+
serviceNoun: params.serviceNoun,
|
|
200
|
+
service: params.service,
|
|
201
|
+
fail,
|
|
202
|
+
});
|
|
203
|
+
if (loaded === null) {
|
|
195
204
|
return false;
|
|
196
205
|
}
|
|
197
206
|
if (!loaded) {
|
|
@@ -222,7 +231,7 @@ export async function runServiceRestart(params) {
|
|
|
222
231
|
: driftIssue.message;
|
|
223
232
|
warnings.push(warning);
|
|
224
233
|
if (!json) {
|
|
225
|
-
defaultRuntime.log(`\n
|
|
234
|
+
defaultRuntime.log(`\n\u26a0\ufe0f ${driftIssue.message}`);
|
|
226
235
|
if (driftIssue.detail) {
|
|
227
236
|
defaultRuntime.log(` ${driftIssue.detail}\n`);
|
|
228
237
|
}
|
|
@@ -235,6 +244,9 @@ export async function runServiceRestart(params) {
|
|
|
235
244
|
}
|
|
236
245
|
try {
|
|
237
246
|
await params.service.restart({ env: process.env, stdout });
|
|
247
|
+
if (params.postRestartCheck) {
|
|
248
|
+
await params.postRestartCheck({ json, stdout, warnings, fail });
|
|
249
|
+
}
|
|
238
250
|
let restarted = true;
|
|
239
251
|
try {
|
|
240
252
|
restarted = await params.service.isLoaded({ env: process.env });
|