@poolzin/pool-bot 2026.2.24 → 2026.2.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +21 -0
- package/dist/acp/client.js +207 -18
- package/dist/acp/event-mapper.js +87 -22
- package/dist/acp/meta.js +12 -6
- package/dist/acp/secret-file.js +22 -0
- package/dist/agents/agent-paths.js +8 -9
- package/dist/agents/agent-scope.js +17 -5
- package/dist/agents/auth-profiles/oauth.js +148 -64
- package/dist/agents/auth-profiles/session-override.js +13 -7
- package/dist/agents/bash-process-registry.test-helpers.js +29 -0
- package/dist/agents/bash-tools.exec-approval-request.js +20 -0
- package/dist/agents/bash-tools.exec-host-gateway.js +240 -0
- package/dist/agents/bash-tools.exec-host-node.js +235 -0
- package/dist/agents/bash-tools.exec-runtime.js +2 -25
- package/dist/agents/bash-tools.exec-types.js +1 -0
- package/dist/agents/bash-tools.process.js +224 -218
- package/dist/agents/bedrock-discovery.js +3 -1
- package/dist/agents/byteplus-models.js +97 -0
- package/dist/agents/chutes-oauth.js +1 -0
- package/dist/agents/cli-runner/helpers.js +4 -0
- package/dist/agents/compaction.js +41 -14
- package/dist/agents/content-blocks.js +16 -0
- package/dist/agents/doubao-models.js +121 -0
- package/dist/agents/failover-error.js +2 -0
- package/dist/agents/huggingface-models.js +5 -3
- package/dist/agents/live-model-filter.js +5 -0
- package/dist/agents/minimax-vlm.js +10 -8
- package/dist/agents/model-auth.js +6 -0
- package/dist/agents/model-catalog.js +3 -1
- package/dist/agents/model-fallback.js +96 -101
- package/dist/agents/model-selection.js +7 -1
- package/dist/agents/models-config.providers.js +364 -165
- package/dist/agents/ollama-stream.js +117 -4
- package/dist/agents/opencode-zen-models.js +22 -11
- package/dist/agents/pi-embedded-helpers/errors.js +55 -33
- package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
- package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
- package/dist/agents/pi-embedded-helpers.js +1 -1
- package/dist/agents/pi-embedded-payloads.js +1 -0
- package/dist/agents/pi-embedded-runner/compact.js +29 -7
- package/dist/agents/pi-embedded-runner/extensions.js +28 -26
- package/dist/agents/pi-embedded-runner/google.js +20 -8
- package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
- package/dist/agents/pi-embedded-runner/run.js +71 -12
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.fixture.js +34 -0
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
- package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
- package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
- package/dist/agents/pi-embedded-runner/thinking.js +42 -0
- package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
- package/dist/agents/pi-embedded-runner/utils.js +7 -10
- package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
- package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
- package/dist/agents/pi-embedded-subscribe.js +9 -4
- package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
- package/dist/agents/pi-embedded-utils.js +3 -0
- package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
- package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
- package/dist/agents/pi-settings.js +40 -0
- package/dist/agents/pi-tools.policy.js +2 -1
- package/dist/agents/provider/config-loader.js +1 -1
- package/dist/agents/sandbox/browser.js +170 -33
- package/dist/agents/sandbox/config-hash.js +14 -27
- package/dist/agents/sandbox/config.js +21 -2
- package/dist/agents/sandbox/constants.js +2 -0
- package/dist/agents/sandbox/docker.js +16 -2
- package/dist/agents/sandbox/novnc-auth.js +62 -0
- package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
- package/dist/agents/sandbox/shared.js +10 -6
- package/dist/agents/sandbox-paths.js +24 -11
- package/dist/agents/schema/clean-for-gemini.js +132 -85
- package/dist/agents/session-slug.js +10 -5
- package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
- package/dist/agents/session-tool-result-guard.js +3 -1
- package/dist/agents/session-transcript-repair.js +40 -6
- package/dist/agents/skills/bundled-dir.js +19 -5
- package/dist/agents/skills/env-overrides.js +124 -43
- package/dist/agents/skills/frontmatter.js +6 -6
- package/dist/agents/skills/plugin-skills.js +14 -7
- package/dist/agents/skills/workspace.js +1 -0
- package/dist/agents/skills.test-helpers.js +13 -0
- package/dist/agents/stable-stringify.js +12 -0
- package/dist/agents/subagent-announce.js +251 -49
- package/dist/agents/subagent-lifecycle-events.js +19 -0
- package/dist/agents/subagent-registry-cleanup.js +31 -0
- package/dist/agents/subagent-registry-completion.js +68 -0
- package/dist/agents/subagent-registry-queries.js +117 -0
- package/dist/agents/subagent-registry-state.js +46 -0
- package/dist/agents/subagent-registry.js +252 -221
- package/dist/agents/subagent-registry.mocks.shared.js +12 -0
- package/dist/agents/subagent-registry.store.js +1 -0
- package/dist/agents/subagent-registry.types.js +1 -0
- package/dist/agents/subagent-spawn.js +195 -7
- package/dist/agents/system-prompt.js +22 -6
- package/dist/agents/test-helpers/assistant-message-fixtures.js +29 -0
- package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
- package/dist/agents/test-helpers/fast-core-tools.js +1 -17
- package/dist/agents/test-helpers/pi-tools-sandbox-context.js +27 -0
- package/dist/agents/timeout.js +18 -6
- package/dist/agents/tool-call-id.js +1 -1
- package/dist/agents/tool-display-common.js +162 -29
- package/dist/agents/tool-images.js +82 -9
- package/dist/agents/tool-policy-shared.js +108 -0
- package/dist/agents/tool-policy.js +51 -26
- package/dist/agents/tools/browser-tool.js +160 -54
- package/dist/agents/tools/canvas-tool.js +27 -1
- package/dist/agents/tools/common.js +45 -0
- package/dist/agents/tools/cron-tool.test-helpers.js +12 -0
- package/dist/agents/tools/discord-actions-guild.js +4 -1
- package/dist/agents/tools/discord-actions-moderation-shared.js +27 -0
- package/dist/agents/tools/gateway-tool.js +3 -1
- package/dist/agents/tools/image-tool.js +214 -99
- package/dist/agents/tools/nodes-utils.js +1 -10
- package/dist/agents/tools/sessions-history-tool.js +140 -108
- package/dist/agents/tools/sessions-send-helpers.js +12 -6
- package/dist/agents/tools/sessions-spawn-tool.js +8 -2
- package/dist/agents/tools/subagents-tool.js +2 -1
- package/dist/agents/tools/whatsapp-actions.js +10 -2
- package/dist/agents/tools/whatsapp-target-auth.js +18 -0
- package/dist/agents/transcript-policy.js +22 -8
- package/dist/agents/venice-models.js +11 -3
- package/dist/agents/workspace.js +222 -46
- package/dist/auto-reply/commands-registry.data.js +51 -0
- package/dist/auto-reply/commands-registry.js +19 -21
- package/dist/auto-reply/fallback-state.js +114 -0
- package/dist/auto-reply/group-activation.js +10 -5
- package/dist/auto-reply/inbound-debounce.js +10 -5
- package/dist/auto-reply/model-runtime.js +68 -0
- package/dist/auto-reply/reply/abort.js +1 -1
- package/dist/auto-reply/reply/agent-runner-execution.js +40 -5
- package/dist/auto-reply/reply/agent-runner.js +165 -39
- package/dist/auto-reply/reply/bash-command.js +41 -39
- package/dist/auto-reply/reply/command-gates.js +25 -0
- package/dist/auto-reply/reply/commands-allowlist.js +111 -72
- package/dist/auto-reply/reply/commands-bash.js +6 -5
- package/dist/auto-reply/reply/commands-config.js +30 -28
- package/dist/auto-reply/reply/commands-core.js +2 -1
- package/dist/auto-reply/reply/commands-info.js +1 -0
- package/dist/auto-reply/reply/commands-models.js +65 -14
- package/dist/auto-reply/reply/commands-session.js +237 -82
- package/dist/auto-reply/reply/commands-setunset-standard.js +13 -0
- package/dist/auto-reply/reply/commands-setunset.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
- package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
- package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
- package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
- package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
- package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
- package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
- package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
- package/dist/auto-reply/reply/commands-subagents.js +51 -587
- package/dist/auto-reply/reply/commands-tts.js +10 -5
- package/dist/auto-reply/reply/config-value.js +10 -5
- package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
- package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
- package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
- package/dist/auto-reply/reply/followup-runner.js +1 -0
- package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
- package/dist/auto-reply/reply/get-reply-directives.js +17 -28
- package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
- package/dist/auto-reply/reply/get-reply.js +71 -12
- package/dist/auto-reply/reply/model-selection.js +80 -39
- package/dist/auto-reply/reply/queue/enqueue.js +10 -5
- package/dist/auto-reply/reply/queue/state.js +13 -12
- package/dist/auto-reply/reply/reply-payloads.js +67 -36
- package/dist/auto-reply/reply/reply-reference.js +9 -8
- package/dist/auto-reply/reply/route-reply.js +15 -8
- package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
- package/dist/auto-reply/reply/session.js +22 -6
- package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
- package/dist/auto-reply/reply/subagents-utils.js +56 -30
- package/dist/auto-reply/reply/typing.js +46 -21
- package/dist/auto-reply/send-policy.js +14 -7
- package/dist/auto-reply/status.js +140 -16
- package/dist/auto-reply/templating.js +10 -5
- package/dist/auto-reply/thinking.js +7 -16
- package/dist/auto-reply/tokens.js +21 -5
- package/dist/browser/bridge-server.js +36 -20
- package/dist/browser/cdp.helpers.js +7 -14
- package/dist/browser/cdp.js +35 -15
- package/dist/browser/chrome.profile-decoration.js +7 -4
- package/dist/browser/config.js +30 -0
- package/dist/browser/extension-relay-auth.js +55 -0
- package/dist/browser/extension-relay.js +74 -29
- package/dist/browser/navigation-guard.js +39 -0
- package/dist/browser/paths.js +77 -0
- package/dist/browser/profiles.js +13 -8
- package/dist/browser/pw-ai-module.js +10 -5
- package/dist/browser/pw-session.js +76 -39
- package/dist/browser/pw-tools-core.interactions.js +14 -7
- package/dist/browser/pw-tools-core.state.js +12 -6
- package/dist/browser/routes/agent.act.js +431 -424
- package/dist/browser/routes/agent.shared.js +47 -3
- package/dist/browser/routes/agent.snapshot.js +122 -116
- package/dist/browser/routes/agent.storage.js +303 -297
- package/dist/browser/routes/tabs.js +154 -100
- package/dist/browser/server-context.js +7 -0
- package/dist/browser/server-lifecycle.js +37 -0
- package/dist/build-info.json +3 -3
- package/dist/channels/allow-from.js +26 -0
- package/dist/channels/allowlists/resolve-utils.js +43 -19
- package/dist/channels/channel-config.js +14 -7
- package/dist/channels/draft-stream-loop.js +7 -0
- package/dist/channels/model-overrides.js +82 -0
- package/dist/channels/plugins/account-action-gate.js +13 -0
- package/dist/channels/plugins/message-actions.js +10 -0
- package/dist/channels/plugins/normalize/imessage.js +14 -7
- package/dist/channels/plugins/normalize/slack.js +10 -5
- package/dist/channels/plugins/normalize/telegram.js +14 -7
- package/dist/channels/plugins/outbound/discord.js +80 -8
- package/dist/channels/plugins/outbound/signal.js +11 -11
- package/dist/channels/plugins/setup-helpers.js +10 -5
- package/dist/channels/sender-label.js +14 -7
- package/dist/channels/session.js +4 -2
- package/dist/channels/status-reactions.js +297 -0
- package/dist/channels/telegram/api.js +18 -0
- package/dist/cli/argv.js +84 -21
- package/dist/cli/banner.js +3 -2
- package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
- package/dist/cli/cli-name.js +11 -11
- package/dist/cli/cli-utils.js +13 -3
- package/dist/cli/command-format.js +1 -1
- package/dist/cli/config-cli.js +1 -1
- package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
- package/dist/cli/daemon-cli/lifecycle.js +64 -2
- package/dist/cli/daemon-cli/restart-health.js +126 -0
- package/dist/cli/daemon-cli/status.gather.js +9 -13
- package/dist/cli/daemon-cli/status.print.js +2 -10
- package/dist/cli/deps.js +27 -22
- package/dist/cli/exec-approvals-cli.js +92 -124
- package/dist/cli/gateway-cli/run-loop.js +23 -5
- package/dist/cli/memory-cli.js +158 -61
- package/dist/cli/node-cli/register.js +14 -5
- package/dist/cli/nodes-cli/register.push.js +63 -0
- package/dist/cli/nodes-media-utils.js +26 -0
- package/dist/cli/outbound-send-deps.js +2 -9
- package/dist/cli/outbound-send-mapping.js +11 -0
- package/dist/cli/pairing-cli.js +40 -14
- package/dist/cli/plugins-cli.js +250 -73
- package/dist/cli/ports.js +11 -10
- package/dist/cli/program/build-program.js +3 -1
- package/dist/cli/program/command-registry.js +214 -136
- package/dist/cli/program/command-tree.js +16 -0
- package/dist/cli/program/help.js +43 -12
- package/dist/cli/program/preaction.js +13 -9
- package/dist/cli/program/register.configure.js +3 -18
- package/dist/cli/program/register.maintenance.js +2 -2
- package/dist/cli/program/register.onboard.js +2 -0
- package/dist/cli/program/register.status-health-sessions.js +16 -17
- package/dist/cli/program/register.subclis.js +93 -52
- package/dist/cli/route.js +12 -8
- package/dist/cli/system-cli.js +36 -46
- package/dist/cli/test-runtime-capture.js +24 -0
- package/dist/cli/update-cli/shared.js +22 -9
- package/dist/cli/update-cli/update-command.js +89 -14
- package/dist/cli/update-cli/wizard.js +6 -12
- package/dist/commands/agent/run-context.js +18 -5
- package/dist/commands/agent/session-store.js +17 -4
- package/dist/commands/agent.js +185 -89
- package/dist/commands/agents.bindings.js +14 -7
- package/dist/commands/agents.commands.add.js +13 -9
- package/dist/commands/agents.commands.identity.js +12 -6
- package/dist/commands/agents.commands.list.js +11 -6
- package/dist/commands/agents.config.js +8 -10
- package/dist/commands/agents.providers.js +12 -6
- package/dist/commands/auth-choice-options.js +103 -75
- package/dist/commands/auth-choice.apply.byteplus.js +55 -0
- package/dist/commands/auth-choice.apply.js +4 -0
- package/dist/commands/auth-choice.apply.minimax.js +61 -13
- package/dist/commands/auth-choice.apply.openai.js +3 -1
- package/dist/commands/auth-choice.apply.volcengine.js +55 -0
- package/dist/commands/auth-choice.preferred-provider.js +2 -0
- package/dist/commands/channels/remove.js +13 -6
- package/dist/commands/channels/shared.js +4 -14
- package/dist/commands/channels.mock-harness.js +23 -0
- package/dist/commands/configure.commands.js +14 -0
- package/dist/commands/configure.gateway.js +2 -4
- package/dist/commands/configure.js +1 -1
- package/dist/commands/configure.shared.js +11 -0
- package/dist/commands/daemon-install-helpers.js +2 -2
- package/dist/commands/daemon-install-runtime-warning.js +11 -0
- package/dist/commands/dashboard.js +12 -10
- package/dist/commands/docs.js +14 -8
- package/dist/commands/doctor-config-flow.js +11 -9
- package/dist/commands/doctor-legacy-config.js +281 -0
- package/dist/commands/doctor-state-integrity.js +99 -23
- package/dist/commands/doctor-update.js +12 -9
- package/dist/commands/models/list.list-command.js +7 -5
- package/dist/commands/models/set-image.js +2 -21
- package/dist/commands/node-daemon-install-helpers.js +10 -8
- package/dist/commands/onboard-auth.config-minimax.js +54 -80
- package/dist/commands/onboard-auth.config-opencode.js +2 -18
- package/dist/commands/onboard-auth.credentials.js +90 -13
- package/dist/commands/onboard-auth.js +1 -1
- package/dist/commands/onboard-auth.models.js +6 -5
- package/dist/commands/onboard-hooks.js +1 -1
- package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
- package/dist/commands/onboard-provider-auth-flags.js +14 -0
- package/dist/commands/onboard-remote.js +14 -7
- package/dist/commands/onboard.js +11 -13
- package/dist/commands/sandbox-display.js +6 -5
- package/dist/commands/sessions.test-helpers.js +61 -0
- package/dist/commands/status-all/diagnosis.js +14 -10
- package/dist/commands/status-all/format.js +1 -0
- package/dist/commands/status.gateway-probe.js +1 -16
- package/dist/commands/systemd-linger.js +12 -6
- package/dist/config/agent-limits.js +2 -0
- package/dist/config/commands.js +32 -15
- package/dist/config/config-paths.js +9 -11
- package/dist/config/config.js +1 -1
- package/dist/config/defaults.js +22 -2
- package/dist/config/discord-preview-streaming.js +104 -0
- package/dist/config/env-substitution.js +62 -34
- package/dist/config/env-vars.js +45 -7
- package/dist/config/includes.js +4 -0
- package/dist/config/io.js +656 -171
- package/dist/config/legacy.migrations.part-1.js +189 -78
- package/dist/config/legacy.shared.js +3 -1
- package/dist/config/merge-patch.js +54 -4
- package/dist/config/prototype-keys.js +4 -0
- package/dist/config/redact-snapshot.js +404 -76
- package/dist/config/schema.help.js +44 -7
- package/dist/config/schema.js +58 -570
- package/dist/config/schema.labels.js +38 -6
- package/dist/config/sessions/delivery-info.js +10 -3
- package/dist/config/sessions/main-session.js +10 -5
- package/dist/config/sessions/session-file.js +33 -0
- package/dist/config/sessions/session-key.js +10 -5
- package/dist/config/sessions/store.js +1 -1
- package/dist/config/sessions.js +1 -0
- package/dist/config/validation.js +140 -85
- package/dist/config/zod-schema.agent-runtime.js +11 -0
- package/dist/config/zod-schema.hooks.js +40 -11
- package/dist/config/zod-schema.installs.js +20 -0
- package/dist/config/zod-schema.js +156 -20
- package/dist/config/zod-schema.providers-core.js +78 -4
- package/dist/config/zod-schema.providers.js +6 -1
- package/dist/config/zod-schema.session.js +41 -2
- package/dist/cron/run-log.js +3 -0
- package/dist/cron/schedule.js +21 -10
- package/dist/cron/service/ops.js +35 -21
- package/dist/cron/service/timer.js +116 -16
- package/dist/cron/stagger.js +3 -1
- package/dist/daemon/cmd-argv.js +21 -0
- package/dist/daemon/cmd-set.js +58 -0
- package/dist/daemon/service-types.js +1 -0
- package/dist/discord/api.js +12 -6
- package/dist/discord/draft-chunking.js +22 -0
- package/dist/discord/draft-stream.js +124 -0
- package/dist/discord/monitor/agent-components.js +1 -1
- package/dist/discord/monitor/commands.js +5 -0
- package/dist/discord/monitor/exec-approvals.js +357 -162
- package/dist/discord/monitor/gateway-plugin.js +2 -1
- package/dist/discord/monitor/listeners.js +37 -27
- package/dist/discord/monitor/message-handler.js +4 -1
- package/dist/discord/monitor/message-handler.preflight.js +65 -8
- package/dist/discord/monitor/message-handler.process.js +246 -217
- package/dist/discord/monitor/message-utils.js +143 -6
- package/dist/discord/monitor/model-picker-preferences.js +143 -0
- package/dist/discord/monitor/model-picker.js +651 -0
- package/dist/discord/monitor/native-command.js +573 -16
- package/dist/discord/monitor/provider.allowlist.js +223 -0
- package/dist/discord/monitor/provider.js +275 -347
- package/dist/discord/monitor/provider.lifecycle.js +100 -0
- package/dist/discord/monitor/reply-delivery.js +123 -16
- package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
- package/dist/discord/monitor/thread-bindings.js +4 -0
- package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
- package/dist/discord/monitor/thread-bindings.manager.js +423 -0
- package/dist/discord/monitor/thread-bindings.messages.js +55 -0
- package/dist/discord/monitor/thread-bindings.state.js +358 -0
- package/dist/discord/monitor/thread-bindings.types.js +6 -0
- package/dist/discord/resolve-users.js +33 -21
- package/dist/discord/send.channels.js +15 -0
- package/dist/discord/send.js +3 -2
- package/dist/discord/send.outbound.js +82 -26
- package/dist/discord/send.permissions.js +83 -30
- package/dist/discord/send.reactions.js +8 -4
- package/dist/discord/token.js +10 -5
- package/dist/discord/voice/command.js +263 -0
- package/dist/discord/voice/manager.js +531 -0
- package/dist/gateway/auth.js +72 -13
- package/dist/gateway/call.js +152 -83
- package/dist/gateway/canvas-capability.js +75 -0
- package/dist/gateway/client.js +28 -4
- package/dist/gateway/config-reload.js +3 -4
- package/dist/gateway/control-plane-audit.js +28 -0
- package/dist/gateway/control-plane-rate-limit.js +53 -0
- package/dist/gateway/control-ui.js +219 -96
- package/dist/gateway/events.js +1 -0
- package/dist/gateway/hooks-mapping.js +88 -38
- package/dist/gateway/hooks.js +109 -54
- package/dist/gateway/http-auth-helpers.js +3 -2
- package/dist/gateway/http-common.js +22 -0
- package/dist/gateway/http-endpoint-helpers.js +1 -0
- package/dist/gateway/method-scopes.js +169 -0
- package/dist/gateway/net.js +74 -9
- package/dist/gateway/node-invoke-system-run-approval.js +14 -35
- package/dist/gateway/node-registry.js +10 -5
- package/dist/gateway/openai-http.js +1 -0
- package/dist/gateway/openresponses-http.js +121 -110
- package/dist/gateway/origin-check.js +1 -18
- package/dist/gateway/probe-auth.js +2 -0
- package/dist/gateway/protocol/index.js +4 -2
- package/dist/gateway/protocol/schema/cron.js +1 -0
- package/dist/gateway/protocol/schema/devices.js +1 -0
- package/dist/gateway/protocol/schema/protocol-schemas.js +4 -1
- package/dist/gateway/protocol/schema/push.js +18 -0
- package/dist/gateway/protocol/schema/sessions.js +6 -0
- package/dist/gateway/protocol/schema.js +1 -0
- package/dist/gateway/role-policy.js +17 -0
- package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
- package/dist/gateway/server/ws-connection/message-handler.js +175 -148
- package/dist/gateway/server-chat.js +83 -25
- package/dist/gateway/server-constants.js +10 -9
- package/dist/gateway/server-cron.js +1 -0
- package/dist/gateway/server-http.js +247 -54
- package/dist/gateway/server-maintenance.js +20 -5
- package/dist/gateway/server-methods/agent.js +162 -24
- package/dist/gateway/server-methods/chat.js +465 -130
- package/dist/gateway/server-methods/config.js +193 -152
- package/dist/gateway/server-methods/devices.js +17 -3
- package/dist/gateway/server-methods/models.js +11 -1
- package/dist/gateway/server-methods/nodes.helpers.js +12 -0
- package/dist/gateway/server-methods/nodes.js +251 -69
- package/dist/gateway/server-methods/push.js +53 -0
- package/dist/gateway/server-methods/sessions.js +64 -8
- package/dist/gateway/server-methods/usage.js +162 -75
- package/dist/gateway/server-node-events.js +29 -0
- package/dist/gateway/server-reload-handlers.js +2 -3
- package/dist/gateway/server-runtime-config.js +39 -13
- package/dist/gateway/server-runtime-state.js +2 -0
- package/dist/gateway/server-startup-memory.js +17 -11
- package/dist/gateway/server-ws-runtime.js +1 -0
- package/dist/gateway/server.impl.js +296 -139
- package/dist/gateway/session-preview.test-helpers.js +11 -0
- package/dist/gateway/session-utils.fs.js +32 -34
- package/dist/gateway/sessions-resolve.js +17 -5
- package/dist/gateway/startup-auth.js +126 -0
- package/dist/gateway/test-helpers.agent-results.js +15 -0
- package/dist/gateway/test-helpers.mocks.js +37 -14
- package/dist/gateway/test-helpers.openai-mock.js +14 -7
- package/dist/gateway/test-helpers.server.js +161 -77
- package/dist/gateway/tools-invoke-http.js +21 -10
- package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
- package/dist/hooks/bundled/command-logger/handler.js +7 -2
- package/dist/hooks/bundled/session-memory/handler.js +170 -38
- package/dist/hooks/frontmatter.js +6 -6
- package/dist/hooks/gmail-watcher-lifecycle.js +23 -0
- package/dist/hooks/gmail-watcher.js +11 -6
- package/dist/hooks/internal-hooks.js +11 -1
- package/dist/hooks/llm-slug-generator.js +4 -1
- package/dist/hooks/workspace.js +47 -17
- package/dist/imessage/accounts.js +9 -20
- package/dist/imessage/monitor/inbound-processing.js +2 -1
- package/dist/infra/archive-path.js +49 -0
- package/dist/infra/archive.js +174 -73
- package/dist/infra/control-ui-assets.js +14 -6
- package/dist/infra/device-pairing.js +204 -144
- package/dist/infra/env.js +10 -5
- package/dist/infra/exec-approvals-allowlist.js +141 -70
- package/dist/infra/exec-approvals-analysis.js +78 -20
- package/dist/infra/exec-approvals.js +5 -17
- package/dist/infra/exec-safe-bin-policy.js +277 -0
- package/dist/infra/fixed-window-rate-limit.js +33 -0
- package/dist/infra/fs-safe.js +71 -39
- package/dist/infra/gateway-lock.js +6 -2
- package/dist/infra/git-root.js +61 -0
- package/dist/infra/heartbeat-active-hours.js +2 -2
- package/dist/infra/heartbeat-reason.js +40 -0
- package/dist/infra/heartbeat-runner.js +72 -32
- package/dist/infra/heartbeat-wake.js +6 -12
- package/dist/infra/host-env-security-policy.json +19 -0
- package/dist/infra/host-env-security.js +66 -0
- package/dist/infra/install-source-utils.js +91 -7
- package/dist/infra/net/ssrf.js +131 -38
- package/dist/infra/node-pairing.js +50 -105
- package/dist/infra/npm-integrity.js +45 -0
- package/dist/infra/npm-pack-install.js +40 -0
- package/dist/infra/outbound/bound-delivery-router.js +88 -0
- package/dist/infra/outbound/channel-adapters.js +20 -7
- package/dist/infra/outbound/channel-selection.js +12 -6
- package/dist/infra/outbound/envelope.js +1 -1
- package/dist/infra/outbound/format.js +12 -6
- package/dist/infra/outbound/message-action-runner.js +107 -327
- package/dist/infra/outbound/message.js +59 -36
- package/dist/infra/outbound/outbound-policy.js +52 -25
- package/dist/infra/outbound/outbound-send-service.js +58 -71
- package/dist/infra/outbound/payloads.js +14 -7
- package/dist/infra/outbound/session-binding-service.js +123 -0
- package/dist/infra/pairing-files.js +10 -0
- package/dist/infra/path-guards.js +25 -0
- package/dist/infra/plain-object.js +9 -0
- package/dist/infra/provider-usage.fetch.codex.js +7 -15
- package/dist/infra/provider-usage.fetch.gemini.js +14 -11
- package/dist/infra/provider-usage.fetch.shared.js +30 -1
- package/dist/infra/provider-usage.fetch.zai.js +10 -9
- package/dist/infra/push-apns.js +365 -0
- package/dist/infra/restart-sentinel.js +16 -1
- package/dist/infra/restart.js +229 -26
- package/dist/infra/retry-policy.js +4 -2
- package/dist/infra/retry.js +9 -5
- package/dist/infra/scp-host.js +54 -0
- package/dist/infra/session-cost-usage.js +107 -59
- package/dist/infra/session-maintenance-warning.js +3 -1
- package/dist/infra/shell-env.js +98 -34
- package/dist/infra/ssh-config.js +12 -6
- package/dist/infra/system-run-command.js +49 -4
- package/dist/infra/update-channels.js +10 -5
- package/dist/infra/update-startup.js +86 -9
- package/dist/line/accounts.js +5 -7
- package/dist/line/bot-access.js +8 -20
- package/dist/line/bot-handlers.js +3 -1
- package/dist/link-understanding/detect.js +15 -7
- package/dist/media/constants.js +15 -6
- package/dist/media/image-ops.js +7 -0
- package/dist/media/inbound-path-policy.js +114 -0
- package/dist/media/input-files.js +16 -0
- package/dist/media/local-roots.js +3 -2
- package/dist/media-understanding/apply.js +4 -1
- package/dist/media-understanding/concurrency.js +8 -20
- package/dist/memory/backend-config.js +45 -6
- package/dist/memory/embeddings.js +10 -4
- package/dist/memory/fs-utils.js +23 -0
- package/dist/memory/manager-search.js +12 -6
- package/dist/memory/manager-sync-ops.js +12 -2
- package/dist/memory/qmd-manager.js +466 -53
- package/dist/memory/query-expansion.js +167 -3
- package/dist/memory/status-format.js +10 -5
- package/dist/memory/sync-memory-files.js +1 -1
- package/dist/memory/test-manager.js +8 -0
- package/dist/node-host/invoke-system-run.js +281 -0
- package/dist/node-host/invoke.js +55 -337
- package/dist/pairing/pairing-store.js +22 -0
- package/dist/plugin-sdk/allow-from.js +1 -1
- package/dist/plugin-sdk/command-auth.js +3 -1
- package/dist/plugin-sdk/index.js +6 -3
- package/dist/plugin-sdk/temp-path.js +47 -0
- package/dist/plugin-sdk/webhook-targets.js +32 -0
- package/dist/plugins/bundled-dir.js +9 -6
- package/dist/plugins/discovery.js +217 -23
- package/dist/plugins/hook-runner-global.js +16 -0
- package/dist/plugins/hooks.js +50 -0
- package/dist/plugins/install.js +28 -16
- package/dist/plugins/loader.js +192 -26
- package/dist/plugins/logger.js +8 -0
- package/dist/plugins/manifest-registry.js +3 -0
- package/dist/plugins/path-safety.js +34 -0
- package/dist/plugins/registry.js +5 -2
- package/dist/plugins/runtime/index.js +271 -206
- package/dist/plugins/runtime.js +3 -17
- package/dist/plugins/update.js +78 -12
- package/dist/process/spawn-utils.js +14 -7
- package/dist/providers/github-copilot-models.js +4 -1
- package/dist/providers/github-copilot-token.js +11 -6
- package/dist/providers/qwen-portal-oauth.js +14 -6
- package/dist/routing/account-id.js +30 -0
- package/dist/routing/resolve-route.js +3 -7
- package/dist/routing/session-key.js +2 -16
- package/dist/security/audit-channel.js +100 -20
- package/dist/security/audit-extra.async.js +505 -179
- package/dist/security/audit-extra.js +12 -2
- package/dist/security/audit-extra.sync.js +421 -35
- package/dist/security/audit-fs.js +31 -13
- package/dist/security/audit.js +180 -370
- package/dist/security/dm-policy-shared.js +68 -0
- package/dist/security/external-content.js +46 -14
- package/dist/security/fix.js +49 -85
- package/dist/security/scan-paths.js +20 -0
- package/dist/security/secret-equal.js +3 -7
- package/dist/security/windows-acl.js +30 -15
- package/dist/shared/entry-status.js +6 -0
- package/dist/shared/frontmatter.js +5 -5
- package/dist/shared/node-list-parse.js +13 -0
- package/dist/shared/node-match.js +11 -4
- package/dist/shared/operator-scope-compat.js +42 -0
- package/dist/shared/text-chunking.js +29 -0
- package/dist/signal/accounts.js +7 -20
- package/dist/signal/monitor/event-handler.js +3 -1
- package/dist/slack/accounts.js +6 -19
- package/dist/slack/actions.js +11 -3
- package/dist/slack/blocks.test-helpers.js +31 -0
- package/dist/slack/monitor/auth.js +1 -1
- package/dist/slack/monitor/message-handler/dispatch.js +50 -29
- package/dist/slack/monitor/mrkdwn.js +8 -0
- package/dist/slack/monitor/replies.js +15 -7
- package/dist/slack/monitor/slash.js +22 -13
- package/dist/slack/resolve-channels.js +10 -5
- package/dist/slack/send.js +102 -12
- package/dist/slack/stream-mode.js +10 -0
- package/dist/slack/streaming.js +4 -2
- package/dist/telegram/accounts.js +19 -14
- package/dist/telegram/bot/helpers.js +3 -5
- package/dist/telegram/bot-access.js +35 -36
- package/dist/telegram/bot-handlers.js +120 -148
- package/dist/telegram/bot-message-context.js +68 -9
- package/dist/telegram/bot-message-dispatch.js +477 -210
- package/dist/telegram/bot-native-commands.js +16 -0
- package/dist/telegram/draft-stream.js +44 -8
- package/dist/telegram/inline-buttons.js +5 -15
- package/dist/telegram/monitor.js +11 -7
- package/dist/telegram/network-config.js +19 -7
- package/dist/telegram/reasoning-lane-coordinator.js +128 -0
- package/dist/telegram/send.js +3 -2
- package/dist/telegram/sent-message-cache.js +5 -6
- package/dist/telegram/status-reaction-variants.js +208 -0
- package/dist/telegram/sticker-cache.js +11 -9
- package/dist/terminal/prompt-select-styled.js +9 -0
- package/dist/terminal/theme.js +12 -12
- package/dist/test-utils/command-runner.js +6 -0
- package/dist/test-utils/internal-hook-event-payload.js +10 -0
- package/dist/test-utils/model-auth-mock.js +12 -0
- package/dist/test-utils/provider-usage-fetch.js +14 -0
- package/dist/test-utils/temp-home.js +33 -0
- package/dist/tts/tts.js +80 -567
- package/dist/tui/components/chat-log.js +50 -8
- package/dist/tui/theme/theme.js +10 -12
- package/dist/tui/tui-command-handlers.js +36 -27
- package/dist/tui/tui-event-handlers.js +122 -32
- package/dist/tui/tui-local-shell.js +16 -6
- package/dist/tui/tui.js +236 -48
- package/dist/utils/account-id.js +2 -4
- package/dist/utils/boolean.js +10 -5
- package/dist/utils/directive-tags.js +11 -0
- package/dist/utils/mask-api-key.js +10 -0
- package/dist/utils/queue-helpers.js +67 -12
- package/dist/utils/run-with-concurrency.js +39 -0
- package/dist/web/auto-reply/deliver-reply.js +8 -4
- package/dist/web/auto-reply/mentions.js +10 -5
- package/dist/web/auto-reply/monitor/group-members.js +14 -7
- package/dist/web/auto-reply/monitor/process-message.js +45 -24
- package/dist/web/inbound/access-control.js +5 -2
- package/dist/web/login-qr.js +12 -6
- package/dist/web/media.js +126 -15
- package/docs/tools/slash-commands.md +5 -1
- package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
- package/extensions/bluebubbles/src/monitor.ts +208 -1950
- package/extensions/feishu/src/external-keys.ts +19 -0
- package/extensions/lobster/src/windows-spawn.ts +193 -0
- package/extensions/matrix/src/matrix/actions/limits.ts +6 -0
- package/extensions/mattermost/src/mattermost/reactions.test-helpers.ts +83 -0
- package/package.json +1 -1
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export async function fetchTelegramChatId(params) {
|
|
2
|
+
const url = `https://api.telegram.org/bot${params.token}/getChat?chat_id=${encodeURIComponent(params.chatId)}`;
|
|
3
|
+
try {
|
|
4
|
+
const res = await fetch(url, params.signal ? { signal: params.signal } : undefined);
|
|
5
|
+
if (!res.ok) {
|
|
6
|
+
return null;
|
|
7
|
+
}
|
|
8
|
+
const data = (await res.json().catch(() => null));
|
|
9
|
+
const id = data?.ok ? data?.result?.id : undefined;
|
|
10
|
+
if (typeof id === "number" || typeof id === "string") {
|
|
11
|
+
return String(id);
|
|
12
|
+
}
|
|
13
|
+
return null;
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
}
|
package/dist/cli/argv.js
CHANGED
|
@@ -1,40 +1,85 @@
|
|
|
1
1
|
const HELP_FLAGS = new Set(["-h", "--help"]);
|
|
2
|
-
const VERSION_FLAGS = new Set(["-
|
|
2
|
+
const VERSION_FLAGS = new Set(["-V", "--version"]);
|
|
3
|
+
const ROOT_VERSION_ALIAS_FLAG = "-v";
|
|
4
|
+
const ROOT_BOOLEAN_FLAGS = new Set(["--dev", "--no-color"]);
|
|
5
|
+
const ROOT_VALUE_FLAGS = new Set(["--profile"]);
|
|
3
6
|
const FLAG_TERMINATOR = "--";
|
|
4
7
|
export function hasHelpOrVersion(argv) {
|
|
5
|
-
return argv.some((arg) => HELP_FLAGS.has(arg) || VERSION_FLAGS.has(arg));
|
|
8
|
+
return (argv.some((arg) => HELP_FLAGS.has(arg) || VERSION_FLAGS.has(arg)) || hasRootVersionAlias(argv));
|
|
6
9
|
}
|
|
7
10
|
function isValueToken(arg) {
|
|
8
|
-
if (!arg)
|
|
11
|
+
if (!arg) {
|
|
9
12
|
return false;
|
|
10
|
-
|
|
13
|
+
}
|
|
14
|
+
if (arg === FLAG_TERMINATOR) {
|
|
11
15
|
return false;
|
|
12
|
-
|
|
16
|
+
}
|
|
17
|
+
if (!arg.startsWith("-")) {
|
|
13
18
|
return true;
|
|
19
|
+
}
|
|
14
20
|
return /^-\d+(?:\.\d+)?$/.test(arg);
|
|
15
21
|
}
|
|
16
22
|
function parsePositiveInt(value) {
|
|
17
23
|
const parsed = Number.parseInt(value, 10);
|
|
18
|
-
if (Number.isNaN(parsed) || parsed <= 0)
|
|
24
|
+
if (Number.isNaN(parsed) || parsed <= 0) {
|
|
19
25
|
return undefined;
|
|
26
|
+
}
|
|
20
27
|
return parsed;
|
|
21
28
|
}
|
|
22
29
|
export function hasFlag(argv, name) {
|
|
23
30
|
const args = argv.slice(2);
|
|
24
31
|
for (const arg of args) {
|
|
25
|
-
if (arg === FLAG_TERMINATOR)
|
|
32
|
+
if (arg === FLAG_TERMINATOR) {
|
|
26
33
|
break;
|
|
27
|
-
|
|
34
|
+
}
|
|
35
|
+
if (arg === name) {
|
|
28
36
|
return true;
|
|
37
|
+
}
|
|
29
38
|
}
|
|
30
39
|
return false;
|
|
31
40
|
}
|
|
41
|
+
export function hasRootVersionAlias(argv) {
|
|
42
|
+
const args = argv.slice(2);
|
|
43
|
+
let hasAlias = false;
|
|
44
|
+
for (let i = 0; i < args.length; i += 1) {
|
|
45
|
+
const arg = args[i];
|
|
46
|
+
if (!arg) {
|
|
47
|
+
continue;
|
|
48
|
+
}
|
|
49
|
+
if (arg === FLAG_TERMINATOR) {
|
|
50
|
+
break;
|
|
51
|
+
}
|
|
52
|
+
if (arg === ROOT_VERSION_ALIAS_FLAG) {
|
|
53
|
+
hasAlias = true;
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
if (ROOT_BOOLEAN_FLAGS.has(arg)) {
|
|
57
|
+
continue;
|
|
58
|
+
}
|
|
59
|
+
if (arg.startsWith("--profile=")) {
|
|
60
|
+
continue;
|
|
61
|
+
}
|
|
62
|
+
if (ROOT_VALUE_FLAGS.has(arg)) {
|
|
63
|
+
const next = args[i + 1];
|
|
64
|
+
if (isValueToken(next)) {
|
|
65
|
+
i += 1;
|
|
66
|
+
}
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
if (arg.startsWith("-")) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
return false;
|
|
73
|
+
}
|
|
74
|
+
return hasAlias;
|
|
75
|
+
}
|
|
32
76
|
export function getFlagValue(argv, name) {
|
|
33
77
|
const args = argv.slice(2);
|
|
34
78
|
for (let i = 0; i < args.length; i += 1) {
|
|
35
79
|
const arg = args[i];
|
|
36
|
-
if (arg === FLAG_TERMINATOR)
|
|
80
|
+
if (arg === FLAG_TERMINATOR) {
|
|
37
81
|
break;
|
|
82
|
+
}
|
|
38
83
|
if (arg === name) {
|
|
39
84
|
const next = args[i + 1];
|
|
40
85
|
return isValueToken(next) ? next : null;
|
|
@@ -47,16 +92,19 @@ export function getFlagValue(argv, name) {
|
|
|
47
92
|
return undefined;
|
|
48
93
|
}
|
|
49
94
|
export function getVerboseFlag(argv, options) {
|
|
50
|
-
if (hasFlag(argv, "--verbose"))
|
|
95
|
+
if (hasFlag(argv, "--verbose")) {
|
|
51
96
|
return true;
|
|
52
|
-
|
|
97
|
+
}
|
|
98
|
+
if (options?.includeDebug && hasFlag(argv, "--debug")) {
|
|
53
99
|
return true;
|
|
100
|
+
}
|
|
54
101
|
return false;
|
|
55
102
|
}
|
|
56
103
|
export function getPositiveIntFlagValue(argv, name) {
|
|
57
104
|
const raw = getFlagValue(argv, name);
|
|
58
|
-
if (raw === null || raw === undefined)
|
|
105
|
+
if (raw === null || raw === undefined) {
|
|
59
106
|
return raw;
|
|
107
|
+
}
|
|
60
108
|
return parsePositiveInt(raw);
|
|
61
109
|
}
|
|
62
110
|
export function getCommandPath(argv, depth = 2) {
|
|
@@ -64,15 +112,19 @@ export function getCommandPath(argv, depth = 2) {
|
|
|
64
112
|
const path = [];
|
|
65
113
|
for (let i = 0; i < args.length; i += 1) {
|
|
66
114
|
const arg = args[i];
|
|
67
|
-
if (!arg)
|
|
115
|
+
if (!arg) {
|
|
68
116
|
continue;
|
|
69
|
-
|
|
117
|
+
}
|
|
118
|
+
if (arg === "--") {
|
|
70
119
|
break;
|
|
71
|
-
|
|
120
|
+
}
|
|
121
|
+
if (arg.startsWith("-")) {
|
|
72
122
|
continue;
|
|
123
|
+
}
|
|
73
124
|
path.push(arg);
|
|
74
|
-
if (path.length >= depth)
|
|
125
|
+
if (path.length >= depth) {
|
|
75
126
|
break;
|
|
127
|
+
}
|
|
76
128
|
}
|
|
77
129
|
return path;
|
|
78
130
|
}
|
|
@@ -94,8 +146,9 @@ export function buildParseArgv(params) {
|
|
|
94
146
|
: baseArgv;
|
|
95
147
|
const executable = (normalizedArgv[0]?.split(/[/\\]/).pop() ?? "").toLowerCase();
|
|
96
148
|
const looksLikeNode = normalizedArgv.length >= 2 && (isNodeExecutable(executable) || isBunExecutable(executable));
|
|
97
|
-
if (looksLikeNode)
|
|
149
|
+
if (looksLikeNode) {
|
|
98
150
|
return normalizedArgv;
|
|
151
|
+
}
|
|
99
152
|
return ["node", programName || "poolbot", ...normalizedArgv];
|
|
100
153
|
}
|
|
101
154
|
const nodeExecutablePattern = /^node-\d+(?:\.\d+)*(?:\.exe)?$/;
|
|
@@ -110,15 +163,25 @@ function isBunExecutable(executable) {
|
|
|
110
163
|
return executable === "bun" || executable === "bun.exe";
|
|
111
164
|
}
|
|
112
165
|
export function shouldMigrateStateFromPath(path) {
|
|
113
|
-
if (path.length === 0)
|
|
166
|
+
if (path.length === 0) {
|
|
114
167
|
return true;
|
|
168
|
+
}
|
|
115
169
|
const [primary, secondary] = path;
|
|
116
|
-
if (primary === "health" || primary === "status" || primary === "sessions")
|
|
170
|
+
if (primary === "health" || primary === "status" || primary === "sessions") {
|
|
117
171
|
return false;
|
|
118
|
-
|
|
172
|
+
}
|
|
173
|
+
if (primary === "config" && (secondary === "get" || secondary === "unset")) {
|
|
119
174
|
return false;
|
|
120
|
-
|
|
175
|
+
}
|
|
176
|
+
if (primary === "models" && (secondary === "list" || secondary === "status")) {
|
|
121
177
|
return false;
|
|
178
|
+
}
|
|
179
|
+
if (primary === "memory" && secondary === "status") {
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
if (primary === "agent") {
|
|
183
|
+
return false;
|
|
184
|
+
}
|
|
122
185
|
return true;
|
|
123
186
|
}
|
|
124
187
|
export function shouldMigrateState(argv) {
|
package/dist/cli/banner.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { resolveCommitHash } from "../infra/git-commit.js";
|
|
2
2
|
import { visibleWidth } from "../terminal/ansi.js";
|
|
3
3
|
import { isRich, theme } from "../terminal/theme.js";
|
|
4
|
+
import { hasRootVersionAlias } from "./argv.js";
|
|
4
5
|
import { pickTagline } from "./tagline.js";
|
|
5
6
|
import { resolveCliName } from "./cli-name.js";
|
|
6
7
|
let bannerEmitted = false;
|
|
@@ -18,13 +19,13 @@ function splitGraphemes(value) {
|
|
|
18
19
|
}
|
|
19
20
|
}
|
|
20
21
|
const hasJsonFlag = (argv) => argv.some((arg) => arg === "--json" || arg.startsWith("--json="));
|
|
21
|
-
const hasVersionFlag = (argv) => argv.some((arg) => arg === "--version" || arg === "-V" ||
|
|
22
|
+
const hasVersionFlag = (argv) => argv.some((arg) => arg === "--version" || arg === "-V") || hasRootVersionAlias(argv);
|
|
22
23
|
export function formatCliBannerLine(version, options = {}) {
|
|
23
24
|
const commit = options.commit ?? resolveCommitHash({ env: options.env });
|
|
24
25
|
const commitLabel = commit ?? "unknown";
|
|
25
26
|
const tagline = pickTagline(options);
|
|
26
27
|
const rich = options.richTty ?? isRich();
|
|
27
|
-
const cliName = resolveCliName(options.argv ?? process.argv
|
|
28
|
+
const cliName = resolveCliName(options.argv ?? process.argv);
|
|
28
29
|
const title = cliName === "poolbot" ? "🎱 Pool Bot" : "🎱 Pool Bot";
|
|
29
30
|
const prefix = "🎱 ";
|
|
30
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 });
|
|
@@ -1,6 +1,24 @@
|
|
|
1
|
+
import { loadConfig, resolveGatewayPort } from "../../config/config.js";
|
|
1
2
|
import { resolveGatewayService } from "../../daemon/service.js";
|
|
3
|
+
import { defaultRuntime } from "../../runtime.js";
|
|
4
|
+
import { theme } from "../../terminal/theme.js";
|
|
5
|
+
import { formatCliCommand } from "../command-format.js";
|
|
2
6
|
import { runServiceRestart, runServiceStart, runServiceStop, runServiceUninstall, } from "./lifecycle-core.js";
|
|
3
|
-
import {
|
|
7
|
+
import { renderRestartDiagnostics, terminateStaleGatewayPids, waitForGatewayHealthyRestart, } from "./restart-health.js";
|
|
8
|
+
import { parsePortFromArgs, renderGatewayServiceStartHints } from "./shared.js";
|
|
9
|
+
const POST_RESTART_HEALTH_ATTEMPTS = 8;
|
|
10
|
+
const POST_RESTART_HEALTH_DELAY_MS = 450;
|
|
11
|
+
async function resolveGatewayRestartPort() {
|
|
12
|
+
const service = resolveGatewayService();
|
|
13
|
+
const command = await service.readCommand(process.env).catch(() => null);
|
|
14
|
+
const serviceEnv = command?.environment ?? undefined;
|
|
15
|
+
const mergedEnv = {
|
|
16
|
+
...process.env,
|
|
17
|
+
...(serviceEnv ?? undefined),
|
|
18
|
+
};
|
|
19
|
+
const portFromArgs = parsePortFromArgs(command?.programArguments);
|
|
20
|
+
return portFromArgs ?? resolveGatewayPort(loadConfig(), mergedEnv);
|
|
21
|
+
}
|
|
4
22
|
export async function runDaemonUninstall(opts = {}) {
|
|
5
23
|
return await runServiceUninstall({
|
|
6
24
|
serviceNoun: "Gateway",
|
|
@@ -31,11 +49,55 @@ export async function runDaemonStop(opts = {}) {
|
|
|
31
49
|
* Throws/exits on check or restart failures.
|
|
32
50
|
*/
|
|
33
51
|
export async function runDaemonRestart(opts = {}) {
|
|
52
|
+
const json = Boolean(opts.json);
|
|
53
|
+
const service = resolveGatewayService();
|
|
54
|
+
const restartPort = await resolveGatewayRestartPort().catch(() => resolveGatewayPort(loadConfig(), process.env));
|
|
34
55
|
return await runServiceRestart({
|
|
35
56
|
serviceNoun: "Gateway",
|
|
36
|
-
service
|
|
57
|
+
service,
|
|
37
58
|
renderStartHints: renderGatewayServiceStartHints,
|
|
38
59
|
opts,
|
|
39
60
|
checkTokenDrift: true,
|
|
61
|
+
postRestartCheck: async ({ warnings, fail, stdout }) => {
|
|
62
|
+
let health = await waitForGatewayHealthyRestart({
|
|
63
|
+
service,
|
|
64
|
+
port: restartPort,
|
|
65
|
+
attempts: POST_RESTART_HEALTH_ATTEMPTS,
|
|
66
|
+
delayMs: POST_RESTART_HEALTH_DELAY_MS,
|
|
67
|
+
});
|
|
68
|
+
if (!health.healthy && health.staleGatewayPids.length > 0) {
|
|
69
|
+
const staleMsg = `Found stale gateway process(es): ${health.staleGatewayPids.join(", ")}.`;
|
|
70
|
+
warnings.push(staleMsg);
|
|
71
|
+
if (!json) {
|
|
72
|
+
defaultRuntime.log(theme.warn(staleMsg));
|
|
73
|
+
defaultRuntime.log(theme.muted("Stopping stale process(es) and retrying restart..."));
|
|
74
|
+
}
|
|
75
|
+
await terminateStaleGatewayPids(health.staleGatewayPids);
|
|
76
|
+
await service.restart({ env: process.env, stdout });
|
|
77
|
+
health = await waitForGatewayHealthyRestart({
|
|
78
|
+
service,
|
|
79
|
+
port: restartPort,
|
|
80
|
+
attempts: POST_RESTART_HEALTH_ATTEMPTS,
|
|
81
|
+
delayMs: POST_RESTART_HEALTH_DELAY_MS,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
if (health.healthy) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const diagnostics = renderRestartDiagnostics(health);
|
|
88
|
+
if (!json) {
|
|
89
|
+
defaultRuntime.log(theme.warn("Gateway did not become healthy after restart."));
|
|
90
|
+
for (const line of diagnostics) {
|
|
91
|
+
defaultRuntime.log(theme.muted(line));
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
else {
|
|
95
|
+
warnings.push(...diagnostics);
|
|
96
|
+
}
|
|
97
|
+
fail("Gateway restart failed health checks.", [
|
|
98
|
+
formatCliCommand("poolbot gateway status --probe --deep"),
|
|
99
|
+
formatCliCommand("poolbot doctor"),
|
|
100
|
+
]);
|
|
101
|
+
},
|
|
40
102
|
});
|
|
41
103
|
}
|