@poolzin/pool-bot 2026.1.26 → 2026.1.30
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 +76 -1116
- package/LICENSE +21 -0
- package/README.md +58 -37
- package/assets/chrome-extension/README.md +2 -2
- package/assets/chrome-extension/background.js +5 -5
- package/assets/chrome-extension/manifest.json +3 -3
- package/assets/chrome-extension/options.html +5 -6
- package/assets/chrome-extension/options.js +1 -1
- package/dist/acp/client.js +5 -5
- package/dist/acp/server.js +1 -1
- package/dist/acp/types.js +2 -2
- package/dist/agents/agent-paths.js +3 -3
- package/dist/agents/auth-health.js +2 -6
- package/dist/agents/auth-profiles/doctor.js +1 -1
- package/dist/agents/auth-profiles/external-cli-sync.js +5 -150
- package/dist/agents/auth-profiles/oauth.js +26 -7
- package/dist/agents/auth-profiles/paths.js +3 -3
- package/dist/agents/auth-profiles/store.js +5 -13
- package/dist/agents/bash-tools.shared.js +8 -1
- package/dist/agents/cli-backends.js +8 -0
- package/dist/agents/cli-runner/helpers.js +3 -3
- package/dist/agents/cli-runner.js +2 -2
- package/dist/agents/compaction.js +3 -0
- package/dist/agents/context.js +4 -4
- package/dist/agents/docs-path.js +3 -3
- package/dist/agents/identity.js +1 -1
- package/dist/agents/memory-search.js +7 -2
- package/dist/agents/minimax-vlm.js +1 -1
- package/dist/agents/model-auth.js +1 -1
- package/dist/agents/model-catalog.js +4 -4
- package/dist/agents/model-fallback.js +22 -0
- package/dist/agents/model-selection.js +1 -1
- package/dist/agents/models-config.js +3 -3
- package/dist/agents/models-config.providers.js +4 -4
- package/dist/agents/pi-embedded-helpers/openai.js +1 -1
- package/dist/agents/pi-embedded-runner/cache-ttl.js +1 -1
- package/dist/agents/pi-embedded-runner/compact.js +8 -8
- package/dist/agents/pi-embedded-runner/extensions.js +5 -0
- package/dist/agents/pi-embedded-runner/model.js +2 -2
- package/dist/agents/pi-embedded-runner/run/attempt.js +10 -6
- package/dist/agents/pi-embedded-runner/run.js +4 -4
- package/dist/agents/pi-embedded-runner/sandbox-info.js +1 -4
- package/dist/agents/pi-embedded-runner/utils.js +1 -1
- package/dist/agents/pi-embedded-utils.js +7 -1
- package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +20 -0
- package/dist/agents/pi-extensions/compaction-safeguard.js +32 -3
- package/dist/agents/pi-tools.js +25 -15
- package/dist/agents/pi-tools.policy.js +34 -1
- package/dist/agents/pi-tools.read.js +2 -2
- package/dist/agents/{clawdbot-tools.js → poolbot-tools.js} +2 -5
- package/dist/agents/sandbox/browser.js +5 -7
- package/dist/agents/sandbox/config.js +0 -12
- package/dist/agents/sandbox/constants.js +8 -8
- package/dist/agents/sandbox/context.js +3 -3
- package/dist/agents/sandbox/docker.js +8 -8
- package/dist/agents/sandbox/runtime-status.js +1 -1
- package/dist/agents/session-transcript-repair.js +1 -1
- package/dist/agents/session-write-lock.js +68 -0
- package/dist/agents/skills/config.js +9 -8
- package/dist/agents/skills/env-overrides.js +1 -1
- package/dist/agents/skills/frontmatter.js +15 -14
- package/dist/agents/skills/workspace.js +7 -7
- package/dist/agents/skills-install.js +1 -1
- package/dist/agents/skills-status.js +12 -12
- package/dist/agents/subagent-registry.store.js +2 -2
- package/dist/agents/system-prompt.js +24 -35
- package/dist/agents/tool-images.js +1 -1
- package/dist/agents/tool-policy.js +8 -2
- package/dist/agents/tools/browser-tool.js +19 -79
- package/dist/agents/tools/browser-tool.schema.js +1 -2
- package/dist/agents/tools/cron-tool.js +44 -1
- package/dist/agents/tools/discord-actions-guild.js +5 -1
- package/dist/agents/tools/image-tool.js +2 -2
- package/dist/agents/tools/memory-tool.js +2 -1
- package/dist/agents/tools/message-tool.js +1 -0
- package/dist/agents/tools/sessions-send-helpers.js +17 -2
- package/dist/agents/tools/telegram-actions.js +93 -1
- package/dist/agents/tools/web-fetch.js +123 -103
- package/dist/agents/tools/web-search.js +7 -7
- package/dist/agents/workspace.js +36 -0
- package/dist/auto-reply/commands-registry.data.js +68 -3
- package/dist/auto-reply/commands-registry.js +14 -11
- package/dist/auto-reply/reply/agent-runner-execution.js +21 -3
- package/dist/auto-reply/reply/agent-runner-memory.js +5 -0
- package/dist/auto-reply/reply/bash-command.js +2 -2
- package/dist/auto-reply/reply/commands-context-report.js +2 -2
- package/dist/auto-reply/reply/commands-info.js +50 -5
- package/dist/auto-reply/reply/commands-session.js +4 -4
- package/dist/auto-reply/reply/commands-tts.js +61 -63
- package/dist/auto-reply/reply/directive-handling.shared.js +1 -1
- package/dist/auto-reply/reply/dispatch-from-config.js +65 -1
- package/dist/auto-reply/reply/followup-runner.js +5 -0
- package/dist/auto-reply/reply/get-reply-inline-actions.js +2 -2
- package/dist/auto-reply/reply/get-reply-run.js +4 -0
- package/dist/auto-reply/reply/groups.js +1 -1
- package/dist/auto-reply/reply/history.js +23 -0
- package/dist/auto-reply/reply/reply-elevated.js +1 -1
- package/dist/auto-reply/reply/session-updates.js +6 -1
- package/dist/auto-reply/reply/stage-sandbox-media.js +1 -1
- package/dist/auto-reply/status.js +142 -50
- package/dist/browser/bridge-server.js +1 -3
- package/dist/browser/client-actions-core.js +13 -7
- package/dist/browser/client-actions-observe.js +14 -8
- package/dist/browser/client-actions-state.js +21 -15
- package/dist/browser/client-fetch.js +74 -61
- package/dist/browser/client.js +19 -21
- package/dist/browser/config.js +13 -26
- package/dist/browser/constants.js +1 -1
- package/dist/browser/control-service.js +72 -0
- package/dist/browser/extension-relay.js +3 -3
- package/dist/browser/pw-session.js +41 -4
- package/dist/browser/pw-tools-core.downloads.js +1 -1
- package/dist/browser/pw-tools-core.interactions.js +5 -5
- package/dist/browser/pw-tools-core.responses.js +1 -1
- package/dist/browser/routes/agent.act.js +13 -0
- package/dist/browser/routes/agent.debug.js +1 -1
- package/dist/browser/routes/basic.js +0 -1
- package/dist/browser/routes/dispatcher.js +86 -0
- package/dist/browser/server-context.js +3 -3
- package/dist/browser/server.js +7 -9
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui/.bundle.hash +1 -1
- package/dist/canvas-host/a2ui/a2ui.bundle.js +1620 -1618
- package/dist/canvas-host/a2ui/index.html +28 -28
- package/dist/canvas-host/a2ui.js +27 -21
- package/dist/canvas-host/server.js +66 -32
- package/dist/channels/plugins/actions/discord/handle-action.guild-admin.js +5 -1
- package/dist/channels/plugins/actions/telegram.js +60 -7
- package/dist/channels/plugins/catalog.js +6 -4
- package/dist/channels/plugins/group-mentions.js +48 -1
- package/dist/channels/plugins/helpers.js +2 -2
- package/dist/channels/plugins/message-action-names.js +1 -0
- package/dist/channels/plugins/onboarding/imessage.js +1 -1
- package/dist/channels/plugins/onboarding/signal.js +2 -2
- package/dist/channels/plugins/onboarding/slack.js +4 -4
- package/dist/channels/plugins/onboarding/telegram.js +17 -9
- package/dist/channels/plugins/onboarding/whatsapp.js +4 -4
- package/dist/channels/plugins/outbound/telegram.js +38 -0
- package/dist/channels/plugins/pairing-message.js +1 -1
- package/dist/channels/plugins/status-issues/bluebubbles.js +1 -1
- package/dist/channels/plugins/status-issues/whatsapp.js +2 -2
- package/dist/channels/registry.js +1 -1
- package/dist/cli/acp-cli.js +2 -2
- package/dist/cli/argv.js +14 -7
- package/dist/cli/banner.js +3 -1
- package/dist/cli/browser-cli-actions-input/register.element.js +72 -44
- package/dist/cli/browser-cli-actions-input/register.files-downloads.js +55 -35
- package/dist/cli/browser-cli-actions-input/register.form-wait-eval.js +41 -28
- package/dist/cli/browser-cli-actions-input/register.navigation.js +23 -14
- package/dist/cli/browser-cli-actions-input/shared.js +10 -3
- package/dist/cli/browser-cli-actions-observe.js +29 -21
- package/dist/cli/browser-cli-debug.js +49 -35
- package/dist/cli/browser-cli-examples.js +29 -29
- package/dist/cli/browser-cli-extension.js +8 -8
- package/dist/cli/browser-cli-inspect.js +23 -17
- package/dist/cli/browser-cli-manage.js +106 -56
- package/dist/cli/browser-cli-shared.js +34 -1
- package/dist/cli/browser-cli-state.cookies-storage.js +53 -39
- package/dist/cli/browser-cli-state.js +90 -64
- package/dist/cli/browser-cli.js +4 -5
- package/dist/cli/channels-cli.js +1 -1
- package/dist/cli/cli-name.js +26 -0
- package/dist/cli/command-format.js +11 -7
- package/dist/cli/config-cli.js +2 -2
- package/dist/cli/cron-cli/register.js +1 -1
- package/dist/cli/daemon-cli/install.js +1 -1
- package/dist/cli/daemon-cli/register.js +1 -1
- package/dist/cli/daemon-cli/shared.js +5 -3
- package/dist/cli/daemon-cli/status.print.js +6 -6
- package/dist/cli/directory-cli.js +1 -1
- package/dist/cli/dns-cli.js +7 -7
- package/dist/cli/docs-cli.js +2 -2
- package/dist/cli/exec-approvals-cli.js +2 -2
- package/dist/cli/gateway-cli/dev.js +4 -4
- package/dist/cli/gateway-cli/register.js +1 -1
- package/dist/cli/gateway-cli/run.js +11 -8
- package/dist/cli/gateway-cli/shared.js +4 -4
- package/dist/cli/hooks-cli.js +3 -3
- package/dist/cli/logs-cli.js +3 -3
- package/dist/cli/memory-cli.js +1 -1
- package/dist/cli/models-cli.js +2 -2
- package/dist/cli/node-cli/daemon.js +2 -2
- package/dist/cli/node-cli/register.js +1 -1
- package/dist/cli/nodes-camera.js +3 -1
- package/dist/cli/nodes-canvas.js +3 -1
- package/dist/cli/nodes-cli/register.canvas.js +1 -1
- package/dist/cli/nodes-cli/register.js +1 -1
- package/dist/cli/nodes-screen.js +1 -1
- package/dist/cli/pairing-cli.js +3 -3
- package/dist/cli/plugin-registry.js +2 -2
- package/dist/cli/plugins-cli.js +3 -3
- package/dist/cli/profile.js +2 -2
- package/dist/cli/program/command-registry.js +5 -0
- package/dist/cli/program/config-guard.js +1 -1
- package/dist/cli/program/help.js +15 -16
- package/dist/cli/program/message/register.send.js +2 -1
- package/dist/cli/program/preaction.js +4 -2
- package/dist/cli/program/register.agent.js +12 -12
- package/dist/cli/program/register.completion.js +355 -0
- package/dist/cli/program/register.configure.js +1 -1
- package/dist/cli/program/register.maintenance.js +4 -4
- package/dist/cli/program/register.message.js +5 -5
- package/dist/cli/program/register.onboard.js +5 -3
- package/dist/cli/program/register.setup.js +2 -2
- package/dist/cli/program/register.status-health-sessions.js +13 -13
- package/dist/cli/run-main.js +11 -4
- package/dist/cli/sandbox-cli.js +19 -19
- package/dist/cli/security-cli.js +18 -8
- package/dist/cli/skills-cli.js +3 -3
- package/dist/cli/system-cli.js +1 -1
- package/dist/cli/tagline.js +1 -1
- package/dist/cli/tui-cli.js +1 -1
- package/dist/cli/update-cli.js +58 -42
- package/dist/cli/webhooks-cli.js +6 -6
- package/dist/commands/agent-via-gateway.js +1 -1
- package/dist/commands/agent.js +2 -1
- package/dist/commands/agents.command-shared.js +1 -1
- package/dist/commands/agents.commands.add.js +2 -3
- package/dist/commands/agents.commands.list.js +1 -1
- package/dist/commands/auth-choice-options.js +4 -54
- package/dist/commands/auth-choice.apply.anthropic.js +6 -109
- package/dist/commands/auth-choice.apply.openai.js +1 -33
- package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
- package/dist/commands/channels/list.js +2 -2
- package/dist/commands/channels/shared.js +1 -1
- package/dist/commands/channels/status.js +1 -1
- package/dist/commands/chutes-oauth.js +1 -1
- package/dist/commands/configure.channels.js +4 -4
- package/dist/commands/configure.gateway-auth.js +1 -8
- package/dist/commands/configure.gateway.js +1 -10
- package/dist/commands/configure.wizard.js +11 -11
- package/dist/commands/daemon-install-helpers.js +1 -1
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/docs.js +5 -5
- package/dist/commands/doctor-auth.js +122 -3
- package/dist/commands/doctor-config-flow.js +7 -7
- package/dist/commands/doctor-format.js +2 -2
- package/dist/commands/doctor-gateway-daemon-flow.js +1 -1
- package/dist/commands/doctor-gateway-services.js +3 -3
- package/dist/commands/doctor-platform-notes.js +1 -1
- package/dist/commands/doctor-security.js +48 -1
- package/dist/commands/doctor-state-integrity.js +3 -3
- package/dist/commands/doctor-ui.js +2 -2
- package/dist/commands/doctor-update.js +4 -4
- package/dist/commands/doctor-workspace-status.js +2 -2
- package/dist/commands/doctor-workspace.js +4 -4
- package/dist/commands/doctor.js +13 -12
- package/dist/commands/gateway-status.js +2 -2
- package/dist/commands/models/auth.js +23 -22
- package/dist/commands/models/list.probe.js +2 -2
- package/dist/commands/models/list.registry.js +4 -4
- package/dist/commands/models/list.status-command.js +8 -9
- package/dist/commands/onboard-auth.credentials.js +2 -2
- package/dist/commands/onboard-channels.js +3 -3
- package/dist/commands/onboard-helpers.js +4 -4
- package/dist/commands/onboard-hooks.js +4 -4
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +38 -34
- package/dist/commands/onboard-non-interactive/local/gateway-config.js +7 -4
- package/dist/commands/onboard-non-interactive/local.js +1 -1
- package/dist/commands/onboard-non-interactive/remote.js +1 -1
- package/dist/commands/onboard-non-interactive.js +1 -1
- package/dist/commands/onboard-remote.js +2 -2
- package/dist/commands/onboard-skills.js +2 -2
- package/dist/commands/onboard.js +25 -4
- package/dist/commands/onboarding/plugin-install.js +2 -2
- package/dist/commands/reset.js +3 -3
- package/dist/commands/sandbox-display.js +1 -1
- package/dist/commands/sandbox-explain.js +2 -2
- package/dist/commands/setup.js +2 -2
- package/dist/commands/signal-install.js +2 -2
- package/dist/commands/status-all/diagnosis.js +1 -1
- package/dist/commands/status-all/report-lines.js +1 -1
- package/dist/commands/status-all.js +3 -3
- package/dist/commands/status.command.js +9 -9
- package/dist/commands/status.update.js +3 -3
- package/dist/commands/uninstall.js +4 -4
- package/dist/compat/legacy-names.js +5 -0
- package/dist/config/config.js +1 -1
- package/dist/config/group-policy.js +69 -0
- package/dist/config/io.js +17 -5
- package/dist/config/legacy.migrations.part-3.js +3 -0
- package/dist/config/logging.js +3 -3
- package/dist/config/paths.js +44 -14
- package/dist/config/schema.js +23 -11
- package/dist/config/sessions/transcript.js +1 -1
- package/dist/config/types.js +1 -1
- package/dist/config/types.poolbot.js +1 -0
- package/dist/config/validation.js +2 -2
- package/dist/config/version.js +4 -4
- package/dist/config/zod-schema.agent-defaults.js +1 -0
- package/dist/config/zod-schema.agent-runtime.js +39 -7
- package/dist/config/zod-schema.hooks.js +2 -0
- package/dist/config/zod-schema.js +9 -3
- package/dist/config/zod-schema.providers-core.js +23 -0
- package/dist/config/zod-schema.providers-whatsapp.js +3 -0
- package/dist/control-ui/assets/index-CIRDm-Lu.css +1 -0
- package/dist/control-ui/assets/{index-Cl-Y9zqE.js → index-CmNMuoem.js} +620 -578
- package/dist/control-ui/assets/index-CmNMuoem.js.map +1 -0
- package/dist/control-ui/index.html +4 -4
- package/dist/cron/isolated-agent/run.js +38 -3
- package/dist/daemon/constants.js +16 -16
- package/dist/daemon/inspect.js +12 -12
- package/dist/daemon/paths.js +1 -1
- package/dist/daemon/program-args.js +1 -1
- package/dist/daemon/systemd-hints.js +1 -1
- package/dist/daemon/systemd-unit.js +1 -1
- package/dist/discord/monitor/listeners.js +25 -1
- package/dist/discord/monitor/native-command.js +7 -5
- package/dist/discord/monitor/presence-cache.js +38 -0
- package/dist/discord/monitor/provider.js +21 -7
- package/dist/entry.js +4 -4
- package/dist/gateway/auth.js +52 -19
- package/dist/gateway/hooks/index.js +53 -0
- package/dist/gateway/hooks/lifecycle-hooks-integration.js +256 -0
- package/dist/gateway/hooks/lifecycle-hooks.js +236 -0
- package/dist/gateway/hooks/progressive-disclosure-details.js +237 -0
- package/dist/gateway/hooks/progressive-disclosure-index.js +354 -0
- package/dist/gateway/hooks/progressive-disclosure-timeline.js +231 -0
- package/dist/gateway/hooks/progressive-disclosure-types.js +65 -0
- package/dist/gateway/hooks/progressive-disclosure.js +242 -0
- package/dist/gateway/hooks/tool-usage-capture.js +253 -0
- package/dist/gateway/hooks/tool-usage-storage.js +144 -0
- package/dist/gateway/hooks-mapping.js +18 -4
- package/dist/gateway/hooks.js +5 -7
- package/dist/gateway/http-utils.js +3 -5
- package/dist/gateway/net.js +1 -1
- package/dist/gateway/openai-http.js +3 -3
- package/dist/gateway/openresponses-http.js +4 -4
- package/dist/gateway/protocol/client-info.js +5 -5
- package/dist/gateway/protocol/schema/logs-chat.js +1 -1
- package/dist/gateway/server/health-state.js +3 -3
- package/dist/gateway/server/hooks.js +1 -0
- package/dist/gateway/server/ws-connection/message-handler.js +44 -35
- package/dist/gateway/server-browser.js +14 -3
- package/dist/gateway/server-chat.js +28 -2
- package/dist/gateway/server-discovery-runtime.js +25 -17
- package/dist/gateway/server-discovery.js +5 -5
- package/dist/gateway/server-http.js +9 -3
- package/dist/gateway/server-methods/agent.js +2 -0
- package/dist/gateway/server-methods/browser.js +204 -0
- package/dist/gateway/server-methods/chat.js +5 -0
- package/dist/gateway/server-methods/config.js +8 -8
- package/dist/gateway/server-methods/logs.js +1 -1
- package/dist/gateway/server-methods/nodes.js +2 -0
- package/dist/gateway/server-methods/skills.js +3 -3
- package/dist/gateway/server-methods/update.js +2 -2
- package/dist/gateway/server-methods-list.js +1 -0
- package/dist/gateway/server-methods.js +3 -0
- package/dist/gateway/server-plugins.js +2 -2
- package/dist/gateway/server-restart-sentinel.js +10 -5
- package/dist/gateway/server-runtime-config.js +5 -2
- package/dist/gateway/server.impl.js +11 -6
- package/dist/gateway/session-utils.fs.js +1 -1
- package/dist/gateway/session-utils.js +31 -11
- package/dist/gateway/test-helpers.mocks.js +5 -5
- package/dist/gateway/test-helpers.server.js +30 -11
- package/dist/gateway/tools-invoke-http.js +15 -8
- package/dist/hooks/bundled/boot-md/HOOK.md +3 -3
- package/dist/hooks/bundled/command-logger/HOOK.md +12 -12
- package/dist/hooks/bundled/command-logger/handler.js +1 -1
- package/dist/hooks/bundled/session-memory/HOOK.md +4 -4
- package/dist/hooks/bundled/session-memory/handler.js +2 -2
- package/dist/hooks/bundled/soul-evil/HOOK.md +5 -5
- package/dist/hooks/bundled-dir.js +1 -1
- package/dist/hooks/config.js +8 -7
- package/dist/hooks/frontmatter.js +16 -15
- package/dist/hooks/gmail-ops.js +4 -4
- package/dist/hooks/hooks-status.js +13 -13
- package/dist/hooks/install.js +8 -7
- package/dist/hooks/internal-hooks.js +1 -1
- package/dist/hooks/llm-slug-generator.js +1 -1
- package/dist/hooks/loader.js +3 -3
- package/dist/hooks/plugin-hooks.js +8 -8
- package/dist/hooks/workspace.js +10 -9
- package/dist/imessage/monitor/monitor-provider.js +16 -3
- package/dist/index.js +4 -4
- package/dist/infra/agent-events.js +3 -0
- package/dist/infra/bonjour-discovery.js +9 -9
- package/dist/infra/bonjour.js +19 -12
- package/dist/infra/device-identity.js +1 -1
- package/dist/infra/dotenv.js +1 -1
- package/dist/infra/exec-approvals.js +2 -2
- package/dist/infra/fs-safe.js +76 -0
- package/dist/infra/gateway-lock.js +1 -1
- package/dist/infra/heartbeat-visibility.js +14 -0
- package/dist/infra/heartbeat-wake.js +2 -2
- package/dist/infra/machine-name.js +1 -1
- package/dist/infra/net/ssrf.js +77 -1
- package/dist/infra/outbound/message-action-spec.js +1 -0
- package/dist/infra/outbound/targets.js +1 -1
- package/dist/infra/path-env.js +7 -7
- package/dist/infra/{clawdbot-root.js → poolbot-root.js} +3 -2
- package/dist/infra/ports-format.js +2 -2
- package/dist/infra/ports.js +2 -2
- package/dist/infra/provider-usage.auth.js +2 -4
- package/dist/infra/provider-usage.fetch.claude.js +1 -1
- package/dist/infra/provider-usage.fetch.minimax.js +1 -1
- package/dist/infra/restart-sentinel.js +1 -1
- package/dist/infra/restart.js +1 -1
- package/dist/infra/retry-policy.js +4 -1
- package/dist/infra/runtime-guard.js +2 -2
- package/dist/infra/shell-env.js +1 -1
- package/dist/infra/skills-remote.js +3 -3
- package/dist/infra/tailscale.js +63 -1
- package/dist/infra/tls/gateway.js +1 -1
- package/dist/infra/unhandled-rejections.js +89 -2
- package/dist/infra/update-check.js +2 -4
- package/dist/infra/update-global.js +5 -5
- package/dist/infra/update-runner.js +32 -8
- package/dist/infra/update-startup.js +3 -3
- package/dist/infra/warnings.js +1 -1
- package/dist/infra/widearea-dns.js +10 -10
- package/dist/line/monitor.js +1 -5
- package/dist/line/signature.js +11 -0
- package/dist/line/webhook.js +2 -6
- package/dist/logging/logger.js +4 -4
- package/dist/macos/gateway-daemon.js +2 -2
- package/dist/macos/relay.js +4 -4
- package/dist/media/host.js +1 -1
- package/dist/media/image-ops.js +1 -1
- package/dist/media/input-files.js +40 -32
- package/dist/media/server.js +39 -15
- package/dist/media/store.js +109 -53
- package/dist/media-understanding/attachments.js +1 -1
- package/dist/media-understanding/providers/image.js +2 -2
- package/dist/media-understanding/runner.js +33 -1
- package/dist/memory/batch-gemini.js +1 -1
- package/dist/memory/batch-openai.js +1 -1
- package/dist/memory/embeddings.js +1 -1
- package/dist/memory/index.js +5 -0
- package/dist/memory/manager.js +25 -2
- package/dist/node-host/runner.js +60 -56
- package/dist/pairing/pairing-messages.js +2 -2
- package/dist/plugin-sdk/index.js +1 -0
- package/dist/plugins/cli.js +2 -2
- package/dist/plugins/discovery.js +6 -5
- package/dist/plugins/install.js +8 -7
- package/dist/plugins/loader.js +10 -4
- package/dist/plugins/manifest-registry.js +2 -2
- package/dist/plugins/manifest.js +16 -1
- package/dist/plugins/providers.js +2 -2
- package/dist/plugins/registry.js +5 -5
- package/dist/plugins/runtime.js +1 -1
- package/dist/plugins/services.js +3 -3
- package/dist/plugins/status.js +2 -2
- package/dist/plugins/tools.js +2 -2
- package/dist/plugins/update.js +3 -3
- package/dist/providers/qwen-portal-oauth.js +1 -1
- package/dist/routing/session-key.js +17 -12
- package/dist/security/audit-extra.js +116 -69
- package/dist/security/audit-fs.js +78 -0
- package/dist/security/audit.js +121 -88
- package/dist/security/external-content.js +143 -0
- package/dist/security/fix.js +93 -8
- package/dist/security/windows-acl.js +162 -0
- package/dist/slack/monitor/media.js +32 -4
- package/dist/slack/monitor/message-handler/dispatch.js +2 -1
- package/dist/slack/monitor/slash.js +3 -3
- package/dist/slack/monitor.test-helpers.js +1 -1
- package/dist/telegram/api-logging.js +24 -0
- package/dist/telegram/bot/delivery.js +139 -22
- package/dist/telegram/bot-handlers.js +70 -8
- package/dist/telegram/bot-message-context.js +79 -21
- package/dist/telegram/bot-message-dispatch.js +64 -0
- package/dist/telegram/bot-native-commands.js +244 -94
- package/dist/telegram/bot.js +18 -2
- package/dist/telegram/fetch.js +25 -1
- package/dist/telegram/monitor.js +11 -3
- package/dist/telegram/network-config.js +23 -0
- package/dist/telegram/network-errors.js +103 -0
- package/dist/telegram/send.js +148 -4
- package/dist/telegram/sticker-cache.js +202 -0
- package/dist/telegram/webhook-set.js +13 -6
- package/dist/telegram/webhook.js +8 -3
- package/dist/terminal/links.js +1 -1
- package/dist/tts/tts.js +27 -22
- package/dist/tui/components/filterable-select-list.js +1 -1
- package/dist/tui/components/searchable-select-list.js +2 -1
- package/dist/tui/gateway-chat.js +1 -1
- package/dist/tui/tui.js +1 -1
- package/dist/utils.js +1 -1
- package/dist/version.js +1 -1
- package/dist/web/active-listener.js +1 -1
- package/dist/web/auth-store.js +1 -1
- package/dist/web/auto-reply/monitor/process-message.js +1 -1
- package/dist/web/auto-reply/monitor.js +1 -1
- package/dist/web/login.js +1 -1
- package/dist/web/session.js +2 -2
- package/dist/wizard/onboarding.finalize.js +24 -21
- package/dist/wizard/onboarding.gateway-config.js +1 -11
- package/dist/wizard/onboarding.js +22 -11
- package/docs/CNAME +1 -1
- package/docs/RELEASE_WORKFLOW.md +133 -0
- package/docs/RELEASE_WORKFOTS_COMPARISON.md +151 -0
- package/docs/WHATSAPP-HEARTBEAT-TROUBLESHOOTING.md +319 -0
- package/docs/WORKFOTS_OPTIMIZATION.md +138 -0
- package/docs/_config.yml +2 -2
- package/docs/_layouts/default.html +9 -9
- package/docs/adr/002-model-fallback-router.md +104 -0
- package/docs/assets/terminal.css +3 -0
- package/docs/assets/theme.js +1 -1
- package/docs/automation/auth-monitoring.md +7 -7
- package/docs/automation/cron-jobs.md +17 -17
- package/docs/automation/cron-vs-heartbeat.md +8 -8
- package/docs/automation/gmail-pubsub.md +23 -21
- package/docs/automation/poll.md +7 -7
- package/docs/automation/webhook.md +13 -8
- package/docs/bedrock.md +10 -10
- package/docs/brave-search.md +1 -1
- package/docs/broadcast-groups.md +4 -4
- package/docs/channels/bluebubbles.md +13 -12
- package/docs/channels/discord.md +21 -16
- package/docs/channels/googlechat.md +16 -16
- package/docs/channels/imessage.md +12 -12
- package/docs/channels/index.md +6 -4
- package/docs/channels/line.md +183 -0
- package/docs/channels/location.md +1 -1
- package/docs/channels/matrix.md +15 -15
- package/docs/channels/mattermost.md +8 -8
- package/docs/channels/msteams.md +30 -26
- package/docs/channels/nextcloud-talk.md +7 -7
- package/docs/channels/nostr.md +9 -9
- package/docs/channels/signal.md +9 -9
- package/docs/channels/slack.md +15 -13
- package/docs/channels/telegram.md +149 -20
- package/docs/channels/tlon.md +5 -5
- package/docs/channels/troubleshooting.md +2 -2
- package/docs/channels/twitch.md +366 -0
- package/docs/channels/whatsapp.md +25 -25
- package/docs/channels/zalo.md +8 -8
- package/docs/channels/zalouser.md +12 -12
- package/docs/cli/acp.md +24 -24
- package/docs/cli/agent.md +6 -6
- package/docs/cli/agents.md +9 -9
- package/docs/cli/approvals.md +14 -14
- package/docs/cli/browser.md +33 -35
- package/docs/cli/channels.md +21 -21
- package/docs/cli/config.md +15 -15
- package/docs/cli/configure.md +6 -6
- package/docs/cli/cron.md +5 -5
- package/docs/cli/dashboard.md +4 -4
- package/docs/cli/devices.md +13 -13
- package/docs/cli/directory.md +12 -12
- package/docs/cli/dns.md +5 -5
- package/docs/cli/docs.md +5 -5
- package/docs/cli/doctor.md +6 -6
- package/docs/cli/gateway.md +24 -24
- package/docs/cli/health.md +5 -5
- package/docs/cli/hooks.md +34 -34
- package/docs/cli/index.md +46 -52
- package/docs/cli/logs.md +6 -6
- package/docs/cli/memory.md +11 -11
- package/docs/cli/message.md +11 -11
- package/docs/cli/models.md +17 -17
- package/docs/cli/node.md +14 -14
- package/docs/cli/nodes.md +14 -14
- package/docs/cli/onboard.md +7 -6
- package/docs/cli/pairing.md +4 -4
- package/docs/cli/plugins.md +16 -16
- package/docs/cli/reset.md +5 -5
- package/docs/cli/sandbox.md +28 -28
- package/docs/cli/security.md +5 -5
- package/docs/cli/sessions.md +5 -5
- package/docs/cli/setup.md +6 -6
- package/docs/cli/skills.md +6 -6
- package/docs/cli/status.md +7 -7
- package/docs/cli/system.md +6 -6
- package/docs/cli/tui.md +5 -5
- package/docs/cli/uninstall.md +5 -5
- package/docs/cli/update.md +20 -20
- package/docs/cli/voicecall.md +9 -9
- package/docs/cli/webhooks.md +5 -5
- package/docs/concepts/agent-loop.md +5 -5
- package/docs/concepts/agent-workspace.md +20 -20
- package/docs/concepts/agent.md +12 -12
- package/docs/concepts/architecture.md +1 -1
- package/docs/concepts/channel-routing.md +4 -4
- package/docs/concepts/compaction.md +5 -5
- package/docs/concepts/context.md +6 -6
- package/docs/concepts/group-messages.md +6 -6
- package/docs/concepts/groups.md +41 -5
- package/docs/concepts/markdown-formatting.md +3 -3
- package/docs/concepts/memory.md +14 -14
- package/docs/concepts/messages.md +4 -4
- package/docs/concepts/model-failover.md +14 -14
- package/docs/concepts/model-providers.md +22 -22
- package/docs/concepts/models.md +27 -27
- package/docs/concepts/multi-agent.md +18 -18
- package/docs/concepts/oauth.md +31 -58
- package/docs/concepts/presence.md +2 -2
- package/docs/concepts/retry.md +1 -1
- package/docs/concepts/session-pruning.md +1 -1
- package/docs/concepts/session-tool.md +4 -4
- package/docs/concepts/session.md +14 -14
- package/docs/concepts/streaming.md +3 -3
- package/docs/concepts/system-prompt.md +11 -11
- package/docs/concepts/timezone.md +2 -2
- package/docs/concepts/typebox.md +2 -2
- package/docs/concepts/typing-indicators.md +2 -2
- package/docs/concepts/usage-tracking.md +3 -3
- package/docs/date-time.md +2 -2
- package/docs/debug/node-issue.md +4 -4
- package/docs/debugging.md +14 -14
- package/docs/diagnostics/flags.md +5 -5
- package/docs/docs.json +37 -7
- package/docs/environment.md +4 -4
- package/docs/experiments/plans/cron-add-hardening.md +1 -1
- package/docs/experiments/plans/openresponses-gateway.md +2 -2
- package/docs/experiments/research/memory.md +6 -6
- package/docs/gateway/authentication.md +33 -57
- package/docs/gateway/background-process.md +1 -1
- package/docs/gateway/bonjour.md +21 -21
- package/docs/gateway/bridge-protocol.md +2 -2
- package/docs/gateway/cli-backends.md +13 -12
- package/docs/gateway/configuration-examples.md +14 -14
- package/docs/gateway/configuration.md +145 -132
- package/docs/gateway/discovery.md +6 -6
- package/docs/gateway/doctor.md +26 -26
- package/docs/gateway/gateway-lock.md +1 -1
- package/docs/gateway/health.md +11 -11
- package/docs/gateway/heartbeat.md +5 -5
- package/docs/gateway/index.md +56 -56
- package/docs/gateway/local-models.md +2 -2
- package/docs/gateway/logging.md +8 -8
- package/docs/gateway/multiple-gateways.md +23 -23
- package/docs/gateway/openai-http-api.md +10 -10
- package/docs/gateway/openresponses-http-api.md +10 -10
- package/docs/gateway/pairing.md +8 -8
- package/docs/gateway/protocol.md +5 -4
- package/docs/gateway/remote-gateway-readme.md +13 -13
- package/docs/gateway/remote.md +4 -4
- package/docs/gateway/sandbox-vs-tool-policy-vs-elevated.md +10 -7
- package/docs/gateway/sandboxing.md +8 -6
- package/docs/gateway/security/formal-verification.md +107 -0
- package/docs/gateway/{security.md → security/index.md} +151 -71
- package/docs/gateway/tailscale.md +16 -35
- package/docs/gateway/tools-invoke-http-api.md +3 -3
- package/docs/gateway/troubleshooting.md +108 -113
- package/docs/help/faq.md +326 -335
- package/docs/help/troubleshooting.md +15 -15
- package/docs/hooks/soul-evil.md +2 -2
- package/docs/hooks.md +60 -60
- package/docs/index.md +35 -35
- package/docs/install/ansible.md +35 -35
- package/docs/install/development-channels.md +10 -10
- package/docs/install/docker.md +31 -31
- package/docs/install/index.md +28 -27
- package/docs/install/installer.md +21 -21
- package/docs/install/migrating.md +190 -0
- package/docs/install/nix.md +17 -17
- package/docs/install/node.md +7 -6
- package/docs/install/uninstall.md +29 -29
- package/docs/install/updating.md +50 -49
- package/docs/logging.md +58 -58
- package/docs/multi-agent-sandbox-tools.md +7 -7
- package/docs/network.md +1 -1
- package/docs/nodes/audio.md +2 -2
- package/docs/nodes/camera.md +18 -18
- package/docs/nodes/images.md +4 -4
- package/docs/nodes/index.md +55 -55
- package/docs/nodes/location-command.md +2 -2
- package/docs/nodes/media-understanding.md +5 -5
- package/docs/nodes/talk.md +1 -1
- package/docs/nodes/voicewake.md +2 -2
- package/docs/northflank.mdx +53 -0
- package/docs/perplexity.md +2 -2
- package/docs/platforms/android.md +13 -13
- package/docs/platforms/digitalocean.md +243 -0
- package/docs/platforms/exe-dev.md +23 -23
- package/docs/platforms/fly.md +129 -18
- package/docs/platforms/gcp.md +498 -0
- package/docs/platforms/hetzner.md +30 -30
- package/docs/platforms/index.md +9 -9
- package/docs/platforms/ios.md +13 -13
- package/docs/platforms/linux.md +11 -11
- package/docs/platforms/mac/bundled-gateway.md +14 -14
- package/docs/platforms/mac/canvas.md +14 -14
- package/docs/platforms/mac/child-process.md +9 -9
- package/docs/platforms/mac/dev-setup.md +11 -11
- package/docs/platforms/mac/health.md +2 -2
- package/docs/platforms/mac/icon.md +1 -1
- package/docs/platforms/mac/logging.md +7 -7
- package/docs/platforms/mac/menu-bar.md +1 -1
- package/docs/platforms/mac/peekaboo.md +9 -9
- package/docs/platforms/mac/permissions.md +3 -3
- package/docs/platforms/mac/release.md +20 -20
- package/docs/platforms/mac/remote.md +14 -14
- package/docs/platforms/mac/signing.md +7 -7
- package/docs/platforms/mac/skills.md +4 -4
- package/docs/platforms/mac/voice-overlay.md +2 -2
- package/docs/platforms/mac/webchat.md +2 -2
- package/docs/platforms/mac/xpc.md +4 -4
- package/docs/platforms/macos-vm.md +27 -27
- package/docs/platforms/macos.md +20 -20
- package/docs/platforms/oracle.md +291 -0
- package/docs/platforms/raspberry-pi.md +354 -0
- package/docs/platforms/windows.md +11 -11
- package/docs/plugin.md +64 -64
- package/docs/plugins/agent-tools.md +1 -1
- package/docs/plugins/manifest.md +4 -4
- package/docs/plugins/voice-call.md +15 -12
- package/docs/plugins/zalouser.md +9 -9
- package/docs/prose.md +9 -9
- package/docs/providers/anthropic.md +23 -27
- package/docs/providers/claude-max-api-proxy.md +145 -0
- package/docs/providers/deepgram.md +2 -2
- package/docs/providers/github-copilot.md +11 -11
- package/docs/providers/glm.md +4 -4
- package/docs/providers/index.md +7 -3
- package/docs/providers/minimax.md +9 -9
- package/docs/providers/models.md +3 -3
- package/docs/providers/moonshot.md +2 -2
- package/docs/providers/ollama.md +11 -11
- package/docs/providers/openai.md +9 -13
- package/docs/providers/opencode.md +3 -3
- package/docs/providers/openrouter.md +3 -3
- package/docs/providers/qwen.md +6 -6
- package/docs/providers/synthetic.md +4 -4
- package/docs/providers/venice.md +21 -21
- package/docs/providers/vercel-ai-gateway.md +5 -4
- package/docs/providers/zai.md +5 -5
- package/docs/railway.mdx +5 -5
- package/docs/refactor/exec-host.md +5 -5
- package/docs/refactor/plugin-sdk.md +12 -12
- package/docs/refactor/strict-config.md +11 -11
- package/docs/reference/AGENTS.default.md +10 -10
- package/docs/reference/RELEASING.md +27 -27
- package/docs/reference/api-usage-costs.md +6 -6
- package/docs/reference/device-models.md +7 -7
- package/docs/reference/rpc.md +3 -3
- package/docs/reference/session-management-compaction.md +19 -19
- package/docs/reference/templates/AGENTS.dev.md +1 -1
- package/docs/reference/templates/BOOT.md +1 -1
- package/docs/reference/templates/TOOLS.dev.md +1 -1
- package/docs/reference/templates/USER.dev.md +2 -2
- package/docs/reference/test.md +2 -2
- package/docs/reference/transcript-hygiene.md +1 -1
- package/docs/render.mdx +158 -0
- package/docs/scripts.md +1 -1
- package/docs/security/formal-verification.md +107 -0
- package/docs/start/getting-started.md +31 -25
- package/docs/start/hubs.md +2 -2
- package/docs/start/lore.md +74 -38
- package/docs/start/onboarding.md +7 -7
- package/docs/start/pairing.md +10 -10
- package/docs/start/{clawd.md → poolbot.md} +29 -29
- package/docs/start/setup.md +30 -17
- package/docs/start/showcase.md +32 -32
- package/docs/start/wizard.md +29 -26
- package/docs/testing.md +12 -12
- package/docs/token-use.md +7 -7
- package/docs/tools/agent-send.md +10 -10
- package/docs/tools/browser-linux-troubleshooting.md +10 -10
- package/docs/tools/browser-login.md +4 -4
- package/docs/tools/browser.md +135 -241
- package/docs/tools/chrome-extension.md +31 -48
- package/docs/tools/creating-skills.md +4 -4
- package/docs/tools/elevated.md +1 -0
- package/docs/tools/exec-approvals.md +8 -5
- package/docs/tools/exec.md +15 -4
- package/docs/tools/firecrawl.md +2 -2
- package/docs/tools/index.md +18 -15
- package/docs/tools/llm-task.md +1 -1
- package/docs/tools/lobster.md +23 -11
- package/docs/tools/{clawdhub.md → poolhub.md} +7 -7
- package/docs/tools/skills-config.md +2 -2
- package/docs/tools/skills.md +39 -31
- package/docs/tools/slash-commands.md +10 -8
- package/docs/tools/web.md +8 -8
- package/docs/tts.md +11 -11
- package/docs/tui.md +7 -7
- package/docs/vps.md +6 -1
- package/docs/web/control-ui.md +13 -12
- package/docs/web/dashboard.md +8 -4
- package/docs/web/index.md +6 -5
- package/docs/web/webchat.md +1 -1
- package/extensions/bluebubbles/index.ts +3 -3
- package/extensions/bluebubbles/package.json +5 -5
- package/extensions/bluebubbles/src/accounts.ts +9 -9
- package/extensions/bluebubbles/src/actions.test.ts +22 -22
- package/extensions/bluebubbles/src/actions.ts +6 -6
- package/extensions/bluebubbles/src/attachments.ts +2 -2
- package/extensions/bluebubbles/src/channel.ts +17 -17
- package/extensions/bluebubbles/src/chat.ts +2 -2
- package/extensions/bluebubbles/src/config-schema.ts +1 -1
- package/extensions/bluebubbles/src/media-send.ts +2 -2
- package/extensions/bluebubbles/src/monitor.test.ts +56 -50
- package/extensions/bluebubbles/src/monitor.ts +181 -6
- package/extensions/bluebubbles/src/onboarding.ts +9 -9
- package/extensions/bluebubbles/src/reactions.ts +2 -2
- package/extensions/bluebubbles/src/runtime.ts +1 -1
- package/extensions/bluebubbles/src/send.ts +2 -2
- package/extensions/copilot-proxy/README.md +2 -2
- package/extensions/copilot-proxy/index.ts +1 -1
- package/extensions/copilot-proxy/package.json +4 -4
- package/extensions/diagnostics-otel/index.ts +3 -3
- package/extensions/diagnostics-otel/package.json +4 -4
- package/extensions/diagnostics-otel/src/service.test.ts +15 -15
- package/extensions/diagnostics-otel/src/service.ts +85 -85
- package/extensions/discord/index.ts +3 -3
- package/extensions/discord/package.json +4 -4
- package/extensions/discord/src/channel.ts +1 -1
- package/extensions/discord/src/runtime.ts +1 -1
- package/extensions/google-antigravity-auth/README.md +2 -2
- package/extensions/google-antigravity-auth/index.ts +9 -2
- package/extensions/google-antigravity-auth/package.json +4 -4
- package/extensions/google-gemini-cli-auth/README.md +2 -2
- package/extensions/google-gemini-cli-auth/index.ts +1 -1
- package/extensions/google-gemini-cli-auth/oauth.ts +2 -2
- package/extensions/google-gemini-cli-auth/package.json +4 -4
- package/extensions/googlechat/index.ts +4 -4
- package/extensions/googlechat/node_modules/.bin/poolbot +21 -0
- package/extensions/googlechat/package.json +7 -7
- package/extensions/googlechat/src/accounts.ts +9 -9
- package/extensions/googlechat/src/actions.ts +8 -8
- package/extensions/googlechat/src/api.ts +1 -1
- package/extensions/googlechat/src/channel.ts +23 -23
- package/extensions/googlechat/src/monitor.ts +9 -9
- package/extensions/googlechat/src/onboarding.ts +11 -11
- package/extensions/googlechat/src/runtime.ts +1 -1
- package/extensions/googlechat/src/types.config.ts +1 -1
- package/extensions/imessage/index.ts +3 -3
- package/extensions/imessage/package.json +4 -4
- package/extensions/imessage/src/channel.ts +1 -1
- package/extensions/imessage/src/runtime.ts +1 -1
- package/extensions/line/index.ts +3 -3
- package/extensions/line/node_modules/.bin/poolbot +21 -0
- package/extensions/line/package.json +6 -6
- package/extensions/line/src/card-command.ts +3 -3
- package/extensions/line/src/channel.logout.test.ts +4 -4
- package/extensions/line/src/channel.sendPayload.test.ts +8 -8
- package/extensions/line/src/channel.ts +5 -5
- package/extensions/line/src/runtime.ts +1 -1
- package/extensions/llm-task/README.md +1 -1
- package/extensions/llm-task/index.ts +2 -2
- package/extensions/llm-task/package.json +4 -4
- package/extensions/llm-task/src/llm-task-tool.ts +5 -5
- package/extensions/lobster/index.ts +2 -2
- package/extensions/lobster/package.json +3 -3
- package/extensions/lobster/src/lobster-tool.test.ts +26 -6
- package/extensions/lobster/src/lobster-tool.ts +24 -6
- package/extensions/matrix/CHANGELOG.md +9 -9
- package/extensions/matrix/index.ts +3 -3
- package/extensions/matrix/node_modules/.bin/markdown-it +0 -0
- package/extensions/matrix/node_modules/.bin/poolbot +21 -0
- package/extensions/matrix/package.json +7 -7
- package/extensions/matrix/src/actions.ts +1 -1
- package/extensions/matrix/src/channel.directory.test.ts +1 -1
- package/extensions/matrix/src/channel.ts +1 -1
- package/extensions/matrix/src/config-schema.ts +1 -1
- package/extensions/matrix/src/directory-live.ts +1 -1
- package/extensions/matrix/src/group-mentions.ts +1 -1
- package/extensions/matrix/src/matrix/accounts.ts +1 -1
- package/extensions/matrix/src/matrix/actions/messages.ts +1 -1
- package/extensions/matrix/src/matrix/actions/reactions.ts +1 -1
- package/extensions/matrix/src/matrix/actions/room.ts +3 -3
- package/extensions/matrix/src/matrix/actions/summary.ts +1 -1
- package/extensions/matrix/src/matrix/actions/types.ts +1 -1
- package/extensions/matrix/src/matrix/active-client.ts +1 -1
- package/extensions/matrix/src/matrix/client/config.ts +2 -2
- package/extensions/matrix/src/matrix/client/create-client.ts +2 -2
- package/extensions/matrix/src/matrix/client/logging.ts +1 -1
- package/extensions/matrix/src/matrix/client/shared.ts +3 -3
- package/extensions/matrix/src/matrix/deps.ts +5 -5
- package/extensions/matrix/src/matrix/monitor/allowlist.ts +1 -1
- package/extensions/matrix/src/matrix/monitor/auto-join.ts +3 -3
- package/extensions/matrix/src/matrix/monitor/direct.ts +1 -1
- package/extensions/matrix/src/matrix/monitor/events.ts +2 -2
- package/extensions/matrix/src/matrix/monitor/handler.ts +8 -8
- package/extensions/matrix/src/matrix/monitor/index.ts +2 -2
- package/extensions/matrix/src/matrix/monitor/location.ts +2 -2
- package/extensions/matrix/src/matrix/monitor/media.test.ts +3 -3
- package/extensions/matrix/src/matrix/monitor/media.ts +3 -3
- package/extensions/matrix/src/matrix/monitor/replies.ts +2 -2
- package/extensions/matrix/src/matrix/monitor/room-info.ts +1 -1
- package/extensions/matrix/src/matrix/monitor/rooms.ts +1 -1
- package/extensions/matrix/src/matrix/monitor/threads.ts +1 -1
- package/extensions/matrix/src/matrix/monitor/types.ts +1 -1
- package/extensions/matrix/src/matrix/poll-types.ts +1 -1
- package/extensions/matrix/src/matrix/probe.ts +1 -1
- package/extensions/matrix/src/matrix/send/client.ts +2 -2
- package/extensions/matrix/src/matrix/send/media.ts +1 -1
- package/extensions/matrix/src/matrix/send/targets.test.ts +1 -1
- package/extensions/matrix/src/matrix/send/targets.ts +1 -1
- package/extensions/matrix/src/matrix/send/types.ts +2 -2
- package/extensions/matrix/src/matrix/send.test.ts +3 -3
- package/extensions/matrix/src/matrix/send.ts +4 -4
- package/extensions/matrix/src/onboarding.ts +3 -3
- package/extensions/matrix/src/outbound.ts +1 -1
- package/extensions/matrix/src/resolve-targets.ts +1 -1
- package/extensions/matrix/src/runtime.ts +1 -1
- package/extensions/matrix/src/tool-actions.ts +1 -1
- package/extensions/matrix/src/types.ts +1 -1
- package/extensions/mattermost/index.ts +3 -3
- package/extensions/mattermost/package.json +5 -5
- package/extensions/mattermost/src/channel.ts +1 -1
- package/extensions/mattermost/src/config-schema.ts +1 -1
- package/extensions/mattermost/src/group-mentions.ts +1 -1
- package/extensions/mattermost/src/mattermost/accounts.ts +9 -9
- package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
- package/extensions/mattermost/src/mattermost/monitor.ts +4 -4
- package/extensions/mattermost/src/onboarding-helpers.ts +4 -4
- package/extensions/mattermost/src/onboarding.ts +4 -4
- package/extensions/mattermost/src/runtime.ts +1 -1
- package/extensions/mattermost/src/types.ts +1 -1
- package/extensions/memory-core/index.ts +3 -3
- package/extensions/memory-core/node_modules/.bin/poolbot +21 -0
- package/extensions/memory-core/package.json +5 -5
- package/extensions/memory-lancedb/config.ts +2 -2
- package/extensions/memory-lancedb/index.test.ts +2 -2
- package/extensions/memory-lancedb/index.ts +4 -4
- package/extensions/memory-lancedb/node_modules/.bin/openai +0 -0
- package/extensions/memory-lancedb/package.json +4 -4
- package/extensions/memory-lancedb/{clawdbot.plugin.json → poolbot.plugin.json} +1 -1
- package/extensions/msteams/CHANGELOG.md +7 -7
- package/extensions/msteams/index.ts +3 -3
- package/extensions/msteams/node_modules/.bin/poolbot +21 -0
- package/extensions/msteams/package.json +6 -6
- package/extensions/msteams/src/attachments.test.ts +1 -1
- package/extensions/msteams/src/channel.directory.test.ts +2 -2
- package/extensions/msteams/src/channel.ts +3 -3
- package/extensions/msteams/src/conversation-store-fs.test.ts +3 -3
- package/extensions/msteams/src/directory-live.ts +1 -1
- package/extensions/msteams/src/graph-upload.ts +4 -4
- package/extensions/msteams/src/media-helpers.ts +1 -1
- package/extensions/msteams/src/messenger.test.ts +1 -1
- package/extensions/msteams/src/messenger.ts +1 -1
- package/extensions/msteams/src/monitor-handler/message-handler.ts +1 -1
- package/extensions/msteams/src/monitor-handler.ts +2 -2
- package/extensions/msteams/src/monitor.ts +3 -3
- package/extensions/msteams/src/onboarding.ts +11 -11
- package/extensions/msteams/src/outbound.ts +1 -1
- package/extensions/msteams/src/policy.test.ts +1 -1
- package/extensions/msteams/src/policy.ts +50 -5
- package/extensions/msteams/src/polls-store.test.ts +1 -1
- package/extensions/msteams/src/polls.test.ts +4 -4
- package/extensions/msteams/src/polls.ts +8 -8
- package/extensions/msteams/src/probe.test.ts +1 -1
- package/extensions/msteams/src/probe.ts +1 -1
- package/extensions/msteams/src/reply-dispatcher.ts +36 -36
- package/extensions/msteams/src/runtime.ts +1 -1
- package/extensions/msteams/src/send-context.ts +2 -2
- package/extensions/msteams/src/send.ts +5 -5
- package/extensions/msteams/src/token.ts +1 -1
- package/extensions/nextcloud-talk/index.ts +3 -3
- package/extensions/nextcloud-talk/package.json +5 -5
- package/extensions/nextcloud-talk/src/accounts.ts +1 -1
- package/extensions/nextcloud-talk/src/channel.ts +8 -8
- package/extensions/nextcloud-talk/src/config-schema.ts +1 -1
- package/extensions/nextcloud-talk/src/inbound.ts +8 -8
- package/extensions/nextcloud-talk/src/monitor.ts +1 -1
- package/extensions/nextcloud-talk/src/onboarding.ts +2 -2
- package/extensions/nextcloud-talk/src/policy.ts +2 -2
- package/extensions/nextcloud-talk/src/room-info.ts +1 -1
- package/extensions/nextcloud-talk/src/runtime.ts +1 -1
- package/extensions/nextcloud-talk/src/types.ts +1 -1
- package/extensions/nostr/CHANGELOG.md +4 -4
- package/extensions/nostr/README.md +3 -3
- package/extensions/nostr/index.ts +6 -6
- package/extensions/nostr/node_modules/.bin/poolbot +21 -0
- package/extensions/nostr/package.json +6 -6
- package/extensions/nostr/src/channel.ts +2 -2
- package/extensions/nostr/src/config-schema.ts +1 -1
- package/extensions/nostr/src/nostr-state-store.test.ts +3 -3
- package/extensions/nostr/src/runtime.ts +1 -1
- package/extensions/nostr/src/types.ts +4 -4
- package/extensions/open-prose/index.ts +2 -2
- package/extensions/open-prose/package.json +3 -3
- package/extensions/open-prose/skills/prose/SKILL.md +5 -5
- package/extensions/open-prose/skills/prose/prose.md +4 -4
- package/extensions/qwen-portal-auth/README.md +2 -2
- package/extensions/qwen-portal-auth/index.ts +1 -1
- package/extensions/signal/index.ts +3 -3
- package/extensions/signal/package.json +4 -4
- package/extensions/signal/src/channel.ts +1 -1
- package/extensions/signal/src/runtime.ts +1 -1
- package/extensions/slack/index.ts +3 -3
- package/extensions/slack/package.json +4 -4
- package/extensions/slack/src/channel.ts +1 -1
- package/extensions/slack/src/runtime.ts +1 -1
- package/extensions/telegram/index.ts +3 -3
- package/extensions/telegram/package.json +4 -4
- package/extensions/telegram/src/channel.ts +3 -3
- package/extensions/telegram/src/runtime.ts +1 -1
- package/extensions/tlon/README.md +1 -1
- package/extensions/tlon/index.ts +3 -3
- package/extensions/tlon/package.json +5 -5
- package/extensions/tlon/src/channel.ts +15 -15
- package/extensions/tlon/src/config-schema.ts +1 -1
- package/extensions/tlon/src/monitor/discovery.ts +1 -1
- package/extensions/tlon/src/monitor/history.ts +1 -1
- package/extensions/tlon/src/monitor/index.ts +3 -3
- package/extensions/tlon/src/onboarding.ts +4 -4
- package/extensions/tlon/src/runtime.ts +1 -1
- package/extensions/tlon/src/types.ts +3 -3
- package/extensions/tlon/src/urbit/send.ts +19 -6
- package/extensions/twitch/CHANGELOG.md +21 -0
- package/extensions/twitch/README.md +89 -0
- package/extensions/twitch/index.ts +20 -0
- package/extensions/twitch/node_modules/.bin/poolbot +21 -0
- package/extensions/twitch/package.json +20 -0
- package/extensions/twitch/poolbot.plugin.json +9 -0
- package/extensions/twitch/src/access-control.test.ts +489 -0
- package/extensions/twitch/src/access-control.ts +154 -0
- package/extensions/twitch/src/actions.ts +173 -0
- package/extensions/twitch/src/client-manager-registry.ts +115 -0
- package/extensions/twitch/src/config-schema.ts +82 -0
- package/extensions/twitch/src/config.test.ts +88 -0
- package/extensions/twitch/src/config.ts +116 -0
- package/extensions/twitch/src/monitor.ts +257 -0
- package/extensions/twitch/src/onboarding.test.ts +311 -0
- package/extensions/twitch/src/onboarding.ts +411 -0
- package/extensions/twitch/src/outbound.test.ts +373 -0
- package/extensions/twitch/src/outbound.ts +186 -0
- package/extensions/twitch/src/plugin.test.ts +39 -0
- package/extensions/twitch/src/plugin.ts +274 -0
- package/extensions/twitch/src/probe.test.ts +198 -0
- package/extensions/twitch/src/probe.ts +118 -0
- package/extensions/twitch/src/resolver.ts +137 -0
- package/extensions/twitch/src/runtime.ts +14 -0
- package/extensions/twitch/src/send.test.ts +289 -0
- package/extensions/twitch/src/send.ts +136 -0
- package/extensions/twitch/src/status.test.ts +270 -0
- package/extensions/twitch/src/status.ts +176 -0
- package/extensions/twitch/src/token.test.ts +171 -0
- package/extensions/twitch/src/token.ts +87 -0
- package/extensions/twitch/src/twitch-client.test.ts +574 -0
- package/extensions/twitch/src/twitch-client.ts +277 -0
- package/extensions/twitch/src/types.ts +141 -0
- package/extensions/twitch/src/utils/markdown.ts +92 -0
- package/extensions/twitch/src/utils/twitch.ts +78 -0
- package/extensions/twitch/test/setup.ts +7 -0
- package/extensions/voice-call/CHANGELOG.md +13 -12
- package/extensions/voice-call/README.md +15 -14
- package/extensions/voice-call/index.ts +11 -9
- package/extensions/voice-call/package.json +4 -4
- package/extensions/voice-call/{clawdbot.plugin.json → poolbot.plugin.json} +3 -3
- package/extensions/voice-call/src/cli.ts +1 -1
- package/extensions/voice-call/src/config.test.ts +204 -0
- package/extensions/voice-call/src/config.ts +61 -4
- package/extensions/voice-call/src/core-bridge.ts +10 -8
- package/extensions/voice-call/src/manager.test.ts +2 -2
- package/extensions/voice-call/src/providers/twilio/webhook.ts +2 -1
- package/extensions/voice-call/src/providers/twilio.ts +2 -2
- package/extensions/voice-call/src/response-generator.ts +1 -1
- package/extensions/voice-call/src/runtime.ts +26 -15
- package/extensions/voice-call/src/types.ts +1 -0
- package/extensions/voice-call/src/webhook-security.test.ts +52 -0
- package/extensions/voice-call/src/webhook-security.ts +16 -5
- package/extensions/voice-call/src/webhook.ts +1 -0
- package/extensions/whatsapp/index.ts +3 -3
- package/extensions/whatsapp/package.json +4 -4
- package/extensions/whatsapp/src/channel.ts +1 -1
- package/extensions/whatsapp/src/runtime.ts +1 -1
- package/extensions/zalo/CHANGELOG.md +9 -9
- package/extensions/zalo/README.md +3 -3
- package/extensions/zalo/index.ts +3 -3
- package/extensions/zalo/node_modules/.bin/poolbot +21 -0
- package/extensions/zalo/package.json +6 -6
- package/extensions/zalo/src/accounts.ts +9 -9
- package/extensions/zalo/src/actions.ts +6 -6
- package/extensions/zalo/src/channel.directory.test.ts +2 -2
- package/extensions/zalo/src/channel.ts +20 -20
- package/extensions/zalo/src/config-schema.ts +1 -1
- package/extensions/zalo/src/monitor.ts +9 -9
- package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
- package/extensions/zalo/src/onboarding.ts +27 -27
- package/extensions/zalo/src/runtime.ts +1 -1
- package/extensions/zalo/src/send.ts +2 -2
- package/extensions/zalo/src/status-issues.ts +1 -1
- package/extensions/zalo/src/token.ts +1 -1
- package/extensions/zalouser/CHANGELOG.md +4 -4
- package/extensions/zalouser/README.md +17 -17
- package/extensions/zalouser/index.ts +3 -3
- package/extensions/zalouser/node_modules/.bin/poolbot +21 -0
- package/extensions/zalouser/package.json +6 -6
- package/extensions/zalouser/src/accounts.ts +10 -10
- package/extensions/zalouser/src/channel.ts +27 -27
- package/extensions/zalouser/src/config-schema.ts +1 -1
- package/extensions/zalouser/src/monitor.ts +5 -5
- package/extensions/zalouser/src/onboarding.ts +32 -32
- package/extensions/zalouser/src/runtime.ts +1 -1
- package/extensions/zalouser/src/status-issues.ts +2 -2
- package/git-hooks/pre-commit +0 -0
- package/package.json +78 -89
- package/skills/1password/SKILL.md +3 -3
- package/skills/apple-notes/SKILL.md +2 -2
- package/skills/apple-reminders/SKILL.md +1 -1
- package/skills/bear-notes/SKILL.md +1 -1
- package/skills/bird/SKILL.md +1 -1
- package/skills/blogwatcher/SKILL.md +1 -1
- package/skills/blucli/SKILL.md +1 -1
- package/skills/bluebubbles/SKILL.md +2 -2
- package/skills/camsnap/SKILL.md +1 -1
- package/skills/canvas/SKILL.md +15 -15
- package/skills/coding-agent/SKILL.md +6 -6
- package/skills/discord/SKILL.md +6 -5
- package/skills/eightctl/SKILL.md +1 -1
- package/skills/food-order/SKILL.md +1 -1
- package/skills/gemini/SKILL.md +1 -1
- package/skills/gifgrep/SKILL.md +1 -1
- package/skills/github/SKILL.md +1 -0
- package/skills/gog/SKILL.md +1 -1
- package/skills/goplaces/SKILL.md +1 -1
- package/skills/himalaya/SKILL.md +1 -1
- package/skills/imsg/SKILL.md +1 -1
- package/skills/local-places/SKILL.md +1 -1
- package/skills/mcporter/SKILL.md +1 -1
- package/skills/model-usage/SKILL.md +1 -1
- package/skills/nano-banana-pro/SKILL.md +10 -5
- package/skills/nano-banana-pro/scripts/generate_image.py +42 -27
- package/skills/nano-pdf/SKILL.md +1 -1
- package/skills/notion/SKILL.md +1 -1
- package/skills/obsidian/SKILL.md +1 -1
- package/skills/openai-image-gen/SKILL.md +1 -1
- package/skills/openai-whisper/SKILL.md +1 -1
- package/skills/openai-whisper-api/SKILL.md +2 -2
- package/skills/openhue/SKILL.md +1 -1
- package/skills/oracle/SKILL.md +1 -1
- package/skills/ordercli/SKILL.md +1 -1
- package/skills/peekaboo/SKILL.md +1 -1
- package/skills/{clawdhub → poolhub}/SKILL.md +2 -2
- package/skills/sag/SKILL.md +1 -1
- package/skills/session-logs/SKILL.md +7 -7
- package/skills/sherpa-onnx-tts/SKILL.md +6 -6
- package/skills/sherpa-onnx-tts/bin/sherpa-onnx-tts +0 -0
- package/skills/slack/SKILL.md +4 -3
- package/skills/songsee/SKILL.md +1 -1
- package/skills/sonoscli/SKILL.md +1 -1
- package/skills/spotify-player/SKILL.md +1 -1
- package/skills/summarize/SKILL.md +1 -1
- package/skills/things-mac/SKILL.md +3 -3
- package/skills/tmux/SKILL.md +7 -7
- package/skills/tmux/scripts/find-sessions.sh +1 -1
- package/skills/tmux/scripts/wait-for-text.sh +0 -0
- package/skills/trello/SKILL.md +2 -2
- package/skills/video-frames/SKILL.md +1 -1
- package/skills/voice-call/SKILL.md +4 -4
- package/skills/wacli/SKILL.md +2 -2
- package/skills/weather/SKILL.md +1 -1
- package/skills/webgpu-threejs-tsl/REFERENCE.md +283 -0
- package/skills/webgpu-threejs-tsl/SKILL.md +91 -0
- package/skills/webgpu-threejs-tsl/docs/compute-shaders.md +404 -0
- package/skills/webgpu-threejs-tsl/docs/core-concepts.md +453 -0
- package/skills/webgpu-threejs-tsl/docs/materials.md +353 -0
- package/skills/webgpu-threejs-tsl/docs/post-processing.md +434 -0
- package/skills/webgpu-threejs-tsl/docs/wgsl-integration.md +324 -0
- package/skills/webgpu-threejs-tsl/examples/basic-setup.js +87 -0
- package/skills/webgpu-threejs-tsl/examples/custom-material.js +170 -0
- package/skills/webgpu-threejs-tsl/examples/earth-shader.js +292 -0
- package/skills/webgpu-threejs-tsl/examples/particle-system.js +259 -0
- package/skills/webgpu-threejs-tsl/examples/post-processing.js +199 -0
- package/skills/webgpu-threejs-tsl/templates/compute-shader.js +305 -0
- package/skills/webgpu-threejs-tsl/templates/webgpu-project.js +276 -0
- package/dist/cli/browser-cli-serve.js +0 -91
- package/dist/control-ui/assets/index-Cl-Y9zqE.js.map +0 -1
- package/dist/control-ui/assets/index-DEPfFcOb.css +0 -1
- package/docs/POOL-BOT.md +0 -119
- /package/dist/{config/types.clawdbot.js → browser/routes/types.js} +0 -0
- /package/docs/{whatsapp-clawd.jpg → whatsapp-poolbot.jpg} +0 -0
- /package/extensions/bluebubbles/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/copilot-proxy/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/diagnostics-otel/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/discord/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/google-antigravity-auth/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/google-gemini-cli-auth/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/googlechat/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/imessage/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/line/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/llm-task/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/lobster/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/matrix/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/mattermost/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/memory-core/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/msteams/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/nextcloud-talk/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/nostr/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/open-prose/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/qwen-portal-auth/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/signal/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/slack/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/telegram/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/tlon/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/whatsapp/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/zalo/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
- /package/extensions/zalouser/{clawdbot.plugin.json → poolbot.plugin.json} +0 -0
|
@@ -36,7 +36,7 @@ async function generateSelfSignedCert(params) {
|
|
|
36
36
|
"-out",
|
|
37
37
|
params.certPath,
|
|
38
38
|
"-subj",
|
|
39
|
-
"/CN=
|
|
39
|
+
"/CN=poolbot-gateway",
|
|
40
40
|
]);
|
|
41
41
|
await fs.chmod(params.keyPath, 0o600).catch(() => { });
|
|
42
42
|
await fs.chmod(params.certPath, 0o600).catch(() => { });
|
|
@@ -1,6 +1,81 @@
|
|
|
1
1
|
import process from "node:process";
|
|
2
2
|
import { formatUncaughtError } from "./errors.js";
|
|
3
3
|
const handlers = new Set();
|
|
4
|
+
/**
|
|
5
|
+
* Checks if an error is an AbortError.
|
|
6
|
+
* These are typically intentional cancellations (e.g., during shutdown) and shouldn't crash.
|
|
7
|
+
*/
|
|
8
|
+
export function isAbortError(err) {
|
|
9
|
+
if (!err || typeof err !== "object")
|
|
10
|
+
return false;
|
|
11
|
+
const name = "name" in err ? String(err.name) : "";
|
|
12
|
+
if (name === "AbortError")
|
|
13
|
+
return true;
|
|
14
|
+
// Check for "This operation was aborted" message from Node's undici
|
|
15
|
+
const message = "message" in err && typeof err.message === "string" ? err.message : "";
|
|
16
|
+
if (message === "This operation was aborted")
|
|
17
|
+
return true;
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
// Network error codes that indicate transient failures (shouldn't crash the gateway)
|
|
21
|
+
const TRANSIENT_NETWORK_CODES = new Set([
|
|
22
|
+
"ECONNRESET",
|
|
23
|
+
"ECONNREFUSED",
|
|
24
|
+
"ENOTFOUND",
|
|
25
|
+
"ETIMEDOUT",
|
|
26
|
+
"ESOCKETTIMEDOUT",
|
|
27
|
+
"ECONNABORTED",
|
|
28
|
+
"EPIPE",
|
|
29
|
+
"EHOSTUNREACH",
|
|
30
|
+
"ENETUNREACH",
|
|
31
|
+
"EAI_AGAIN",
|
|
32
|
+
"UND_ERR_CONNECT_TIMEOUT",
|
|
33
|
+
"UND_ERR_SOCKET",
|
|
34
|
+
"UND_ERR_HEADERS_TIMEOUT",
|
|
35
|
+
"UND_ERR_BODY_TIMEOUT",
|
|
36
|
+
]);
|
|
37
|
+
function getErrorCode(err) {
|
|
38
|
+
if (!err || typeof err !== "object")
|
|
39
|
+
return undefined;
|
|
40
|
+
const code = err.code;
|
|
41
|
+
return typeof code === "string" ? code : undefined;
|
|
42
|
+
}
|
|
43
|
+
function getErrorCause(err) {
|
|
44
|
+
if (!err || typeof err !== "object")
|
|
45
|
+
return undefined;
|
|
46
|
+
return err.cause;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Checks if an error is a transient network error that shouldn't crash the gateway.
|
|
50
|
+
* These are typically temporary connectivity issues that will resolve on their own.
|
|
51
|
+
*/
|
|
52
|
+
export function isTransientNetworkError(err) {
|
|
53
|
+
if (!err)
|
|
54
|
+
return false;
|
|
55
|
+
// Check the error itself
|
|
56
|
+
const code = getErrorCode(err);
|
|
57
|
+
if (code && TRANSIENT_NETWORK_CODES.has(code))
|
|
58
|
+
return true;
|
|
59
|
+
// "fetch failed" TypeError from undici (Node's native fetch)
|
|
60
|
+
if (err instanceof TypeError && err.message === "fetch failed") {
|
|
61
|
+
const cause = getErrorCause(err);
|
|
62
|
+
// The cause often contains the actual network error
|
|
63
|
+
if (cause)
|
|
64
|
+
return isTransientNetworkError(cause);
|
|
65
|
+
// Even without a cause, "fetch failed" is typically a network issue
|
|
66
|
+
return true;
|
|
67
|
+
}
|
|
68
|
+
// Check the cause chain recursively
|
|
69
|
+
const cause = getErrorCause(err);
|
|
70
|
+
if (cause && cause !== err) {
|
|
71
|
+
return isTransientNetworkError(cause);
|
|
72
|
+
}
|
|
73
|
+
// AggregateError may wrap multiple causes
|
|
74
|
+
if (err instanceof AggregateError && err.errors?.length) {
|
|
75
|
+
return err.errors.some((e) => isTransientNetworkError(e));
|
|
76
|
+
}
|
|
77
|
+
return false;
|
|
78
|
+
}
|
|
4
79
|
export function registerUnhandledRejectionHandler(handler) {
|
|
5
80
|
handlers.add(handler);
|
|
6
81
|
return () => {
|
|
@@ -14,7 +89,7 @@ export function isUnhandledRejectionHandled(reason) {
|
|
|
14
89
|
return true;
|
|
15
90
|
}
|
|
16
91
|
catch (err) {
|
|
17
|
-
console.error("[
|
|
92
|
+
console.error("[poolbot] Unhandled rejection handler failed:", err instanceof Error ? (err.stack ?? err.message) : err);
|
|
18
93
|
}
|
|
19
94
|
}
|
|
20
95
|
return false;
|
|
@@ -23,7 +98,19 @@ export function installUnhandledRejectionHandler() {
|
|
|
23
98
|
process.on("unhandledRejection", (reason, _promise) => {
|
|
24
99
|
if (isUnhandledRejectionHandled(reason))
|
|
25
100
|
return;
|
|
26
|
-
|
|
101
|
+
// AbortError is typically an intentional cancellation (e.g., during shutdown)
|
|
102
|
+
// Log it but don't crash - these are expected during graceful shutdown
|
|
103
|
+
if (isAbortError(reason)) {
|
|
104
|
+
console.warn("[poolbot] Suppressed AbortError:", formatUncaughtError(reason));
|
|
105
|
+
return;
|
|
106
|
+
}
|
|
107
|
+
// Transient network errors (fetch failed, connection reset, etc.) shouldn't crash
|
|
108
|
+
// These are temporary connectivity issues that will resolve on their own
|
|
109
|
+
if (isTransientNetworkError(reason)) {
|
|
110
|
+
console.error("[poolbot] Network error (non-fatal):", formatUncaughtError(reason));
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
console.error("[poolbot] Unhandled promise rejection:", formatUncaughtError(reason));
|
|
27
114
|
process.exit(1);
|
|
28
115
|
});
|
|
29
116
|
}
|
|
@@ -68,9 +68,7 @@ export async function checkGitUpdateStatus(params) {
|
|
|
68
68
|
const tag = tagRes && tagRes.code === 0 ? tagRes.stdout.trim() : null;
|
|
69
69
|
const upstreamRes = await runCommandWithTimeout(["git", "-C", root, "rev-parse", "--abbrev-ref", "@{upstream}"], { timeoutMs }).catch(() => null);
|
|
70
70
|
const upstream = upstreamRes && upstreamRes.code === 0 ? upstreamRes.stdout.trim() : null;
|
|
71
|
-
const dirtyRes = await runCommandWithTimeout(["git", "-C", root, "status", "--porcelain"], {
|
|
72
|
-
timeoutMs,
|
|
73
|
-
}).catch(() => null);
|
|
71
|
+
const dirtyRes = await runCommandWithTimeout(["git", "-C", root, "status", "--porcelain", "--", ":!dist/control-ui/"], { timeoutMs }).catch(() => null);
|
|
74
72
|
const dirty = dirtyRes && dirtyRes.code === 0 ? dirtyRes.stdout.trim().length > 0 : null;
|
|
75
73
|
const fetchOk = params.fetch
|
|
76
74
|
? await runCommandWithTimeout(["git", "-C", root, "fetch", "--quiet", "--prune"], { timeoutMs })
|
|
@@ -216,7 +214,7 @@ export async function fetchNpmTagVersion(params) {
|
|
|
216
214
|
const timeoutMs = params?.timeoutMs ?? 3500;
|
|
217
215
|
const tag = params.tag;
|
|
218
216
|
try {
|
|
219
|
-
const res = await fetchWithTimeout(`https://registry.npmjs.org/
|
|
217
|
+
const res = await fetchWithTimeout(`https://registry.npmjs.org/poolbot/${encodeURIComponent(tag)}`, timeoutMs);
|
|
220
218
|
if (!res.ok) {
|
|
221
219
|
return { tag, version: null, error: `HTTP ${res.status}` };
|
|
222
220
|
}
|
|
@@ -36,7 +36,7 @@ export async function resolveGlobalPackageRoot(manager, runCommand, timeoutMs) {
|
|
|
36
36
|
const root = await resolveGlobalRoot(manager, runCommand, timeoutMs);
|
|
37
37
|
if (!root)
|
|
38
38
|
return null;
|
|
39
|
-
return path.join(root, "
|
|
39
|
+
return path.join(root, "poolbot");
|
|
40
40
|
}
|
|
41
41
|
export async function detectGlobalInstallManagerForRoot(runCommand, pkgRoot, timeoutMs) {
|
|
42
42
|
const pkgReal = await tryRealpath(pkgRoot);
|
|
@@ -52,13 +52,13 @@ export async function detectGlobalInstallManagerForRoot(runCommand, pkgRoot, tim
|
|
|
52
52
|
if (!globalRoot)
|
|
53
53
|
continue;
|
|
54
54
|
const globalReal = await tryRealpath(globalRoot);
|
|
55
|
-
const expected = path.join(globalReal, "
|
|
55
|
+
const expected = path.join(globalReal, "poolbot");
|
|
56
56
|
if (path.resolve(expected) === path.resolve(pkgReal))
|
|
57
57
|
return manager;
|
|
58
58
|
}
|
|
59
59
|
const bunGlobalRoot = resolveBunGlobalRoot();
|
|
60
60
|
const bunGlobalReal = await tryRealpath(bunGlobalRoot);
|
|
61
|
-
const bunExpected = path.join(bunGlobalReal, "
|
|
61
|
+
const bunExpected = path.join(bunGlobalReal, "poolbot");
|
|
62
62
|
if (path.resolve(bunExpected) === path.resolve(pkgReal))
|
|
63
63
|
return "bun";
|
|
64
64
|
return null;
|
|
@@ -68,11 +68,11 @@ export async function detectGlobalInstallManagerByPresence(runCommand, timeoutMs
|
|
|
68
68
|
const root = await resolveGlobalRoot(manager, runCommand, timeoutMs);
|
|
69
69
|
if (!root)
|
|
70
70
|
continue;
|
|
71
|
-
if (await pathExists(path.join(root, "
|
|
71
|
+
if (await pathExists(path.join(root, "poolbot")))
|
|
72
72
|
return manager;
|
|
73
73
|
}
|
|
74
74
|
const bunRoot = resolveBunGlobalRoot();
|
|
75
|
-
if (await pathExists(path.join(bunRoot, "
|
|
75
|
+
if (await pathExists(path.join(bunRoot, "poolbot")))
|
|
76
76
|
return "bun";
|
|
77
77
|
return null;
|
|
78
78
|
}
|
|
@@ -10,6 +10,8 @@ const DEFAULT_TIMEOUT_MS = 20 * 60_000;
|
|
|
10
10
|
const MAX_LOG_CHARS = 8000;
|
|
11
11
|
const PREFLIGHT_MAX_COMMITS = 10;
|
|
12
12
|
const START_DIRS = ["cwd", "argv1", "process"];
|
|
13
|
+
const DEFAULT_PACKAGE_NAME = "poolbot";
|
|
14
|
+
const CORE_PACKAGE_NAMES = new Set([DEFAULT_PACKAGE_NAME, "poolbot"]);
|
|
13
15
|
function normalizeDir(value) {
|
|
14
16
|
if (!value)
|
|
15
17
|
return null;
|
|
@@ -57,6 +59,17 @@ async function readPackageVersion(root) {
|
|
|
57
59
|
return null;
|
|
58
60
|
}
|
|
59
61
|
}
|
|
62
|
+
async function readPackageName(root) {
|
|
63
|
+
try {
|
|
64
|
+
const raw = await fs.readFile(path.join(root, "package.json"), "utf-8");
|
|
65
|
+
const parsed = JSON.parse(raw);
|
|
66
|
+
const name = parsed?.name?.trim();
|
|
67
|
+
return name ? name : null;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
60
73
|
async function readBranchName(runCommand, root, timeoutMs) {
|
|
61
74
|
const res = await runCommand(["git", "-C", root, "rev-parse", "--abbrev-ref", "HEAD"], {
|
|
62
75
|
timeoutMs,
|
|
@@ -114,7 +127,8 @@ async function findPackageRoot(candidates) {
|
|
|
114
127
|
try {
|
|
115
128
|
const raw = await fs.readFile(pkgPath, "utf-8");
|
|
116
129
|
const parsed = JSON.parse(raw);
|
|
117
|
-
|
|
130
|
+
const name = parsed?.name?.trim();
|
|
131
|
+
if (name && CORE_PACKAGE_NAMES.has(name))
|
|
118
132
|
return current;
|
|
119
133
|
}
|
|
120
134
|
catch {
|
|
@@ -198,7 +212,12 @@ function normalizeTag(tag) {
|
|
|
198
212
|
const trimmed = tag?.trim();
|
|
199
213
|
if (!trimmed)
|
|
200
214
|
return "latest";
|
|
201
|
-
|
|
215
|
+
if (trimmed.startsWith("poolbot@"))
|
|
216
|
+
return trimmed.slice("poolbot@".length);
|
|
217
|
+
if (trimmed.startsWith(`${DEFAULT_PACKAGE_NAME}@`)) {
|
|
218
|
+
return trimmed.slice(`${DEFAULT_PACKAGE_NAME}@`.length);
|
|
219
|
+
}
|
|
220
|
+
return trimmed;
|
|
202
221
|
}
|
|
203
222
|
export async function runGatewayUpdate(opts = {}) {
|
|
204
223
|
const startedAt = Date.now();
|
|
@@ -238,7 +257,7 @@ export async function runGatewayUpdate(opts = {}) {
|
|
|
238
257
|
status: "error",
|
|
239
258
|
mode: "unknown",
|
|
240
259
|
root: gitRoot,
|
|
241
|
-
reason: "not-
|
|
260
|
+
reason: "not-poolbot-root",
|
|
242
261
|
steps: [],
|
|
243
262
|
durationMs: Date.now() - startedAt,
|
|
244
263
|
};
|
|
@@ -254,8 +273,8 @@ export async function runGatewayUpdate(opts = {}) {
|
|
|
254
273
|
const channel = opts.channel ?? "dev";
|
|
255
274
|
const branch = channel === "dev" ? await readBranchName(runCommand, gitRoot, timeoutMs) : null;
|
|
256
275
|
const needsCheckoutMain = channel === "dev" && branch !== DEV_BRANCH;
|
|
257
|
-
gitTotalSteps = channel === "dev" ? (needsCheckoutMain ?
|
|
258
|
-
const statusCheck = await runStep(step("clean check", ["git", "-C", gitRoot, "status", "--porcelain"], gitRoot));
|
|
276
|
+
gitTotalSteps = channel === "dev" ? (needsCheckoutMain ? 11 : 10) : 9;
|
|
277
|
+
const statusCheck = await runStep(step("clean check", ["git", "-C", gitRoot, "status", "--porcelain", "--", ":!dist/control-ui/"], gitRoot));
|
|
259
278
|
steps.push(statusCheck);
|
|
260
279
|
const hasUncommittedChanges = statusCheck.stdoutTail && statusCheck.stdoutTail.trim().length > 0;
|
|
261
280
|
if (hasUncommittedChanges) {
|
|
@@ -351,7 +370,7 @@ export async function runGatewayUpdate(opts = {}) {
|
|
|
351
370
|
};
|
|
352
371
|
}
|
|
353
372
|
const manager = await detectPackageManager(gitRoot);
|
|
354
|
-
const preflightRoot = await fs.mkdtemp(path.join(os.tmpdir(), "
|
|
373
|
+
const preflightRoot = await fs.mkdtemp(path.join(os.tmpdir(), "poolbot-update-preflight-"));
|
|
355
374
|
const worktreeDir = path.join(preflightRoot, "worktree");
|
|
356
375
|
const worktreeStep = await runStep(step("preflight worktree", ["git", "-C", gitRoot, "worktree", "add", "--detach", worktreeDir, upstreamSha], gitRoot));
|
|
357
376
|
steps.push(worktreeStep);
|
|
@@ -485,7 +504,11 @@ export async function runGatewayUpdate(opts = {}) {
|
|
|
485
504
|
steps.push(buildStep);
|
|
486
505
|
const uiBuildStep = await runStep(step("ui:build", managerScriptArgs(manager, "ui:build"), gitRoot));
|
|
487
506
|
steps.push(uiBuildStep);
|
|
488
|
-
|
|
507
|
+
// Restore dist/control-ui/ to committed state to prevent dirty repo after update
|
|
508
|
+
// (ui:build regenerates assets with new hashes, which would block future updates)
|
|
509
|
+
const restoreUiStep = await runStep(step("restore control-ui", ["git", "-C", gitRoot, "checkout", "--", "dist/control-ui/"], gitRoot));
|
|
510
|
+
steps.push(restoreUiStep);
|
|
511
|
+
const doctorStep = await runStep(step("poolbot doctor", managerScriptArgs(manager, "poolbot", ["doctor", "--non-interactive"]), gitRoot, { CLAWDBOT_UPDATE_IN_PROGRESS: "1" }));
|
|
489
512
|
steps.push(doctorStep);
|
|
490
513
|
const failedStep = steps.find((s) => s.exitCode !== 0);
|
|
491
514
|
const afterShaStep = await runStep(step("git rev-parse HEAD (after)", ["git", "-C", gitRoot, "rev-parse", "HEAD"], gitRoot));
|
|
@@ -517,7 +540,8 @@ export async function runGatewayUpdate(opts = {}) {
|
|
|
517
540
|
const beforeVersion = await readPackageVersion(pkgRoot);
|
|
518
541
|
const globalManager = await detectGlobalInstallManagerForRoot(runCommand, pkgRoot, timeoutMs);
|
|
519
542
|
if (globalManager) {
|
|
520
|
-
const
|
|
543
|
+
const packageName = (await readPackageName(pkgRoot)) ?? DEFAULT_PACKAGE_NAME;
|
|
544
|
+
const spec = `${packageName}@${normalizeTag(opts.tag)}`;
|
|
521
545
|
const updateStep = await runStep({
|
|
522
546
|
runCommand,
|
|
523
547
|
name: "global update",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { resolveStateDir } from "../config/paths.js";
|
|
4
|
-
import {
|
|
4
|
+
import { resolvePoolBotPackageRoot } from "./poolbot-root.js";
|
|
5
5
|
import { compareSemverStrings, resolveNpmChannelTag, checkUpdateStatus } from "./update-check.js";
|
|
6
6
|
import { normalizeUpdateChannel, DEFAULT_PACKAGE_CHANNEL } from "./update-channels.js";
|
|
7
7
|
import { VERSION } from "../version.js";
|
|
@@ -44,7 +44,7 @@ export async function runGatewayUpdateCheck(params) {
|
|
|
44
44
|
if (now - lastCheckedAt < UPDATE_CHECK_INTERVAL_MS)
|
|
45
45
|
return;
|
|
46
46
|
}
|
|
47
|
-
const root = await
|
|
47
|
+
const root = await resolvePoolBotPackageRoot({
|
|
48
48
|
moduleUrl: import.meta.url,
|
|
49
49
|
argv1: process.argv[1],
|
|
50
50
|
cwd: process.cwd(),
|
|
@@ -74,7 +74,7 @@ export async function runGatewayUpdateCheck(params) {
|
|
|
74
74
|
if (cmp != null && cmp < 0) {
|
|
75
75
|
const shouldNotify = state.lastNotifiedVersion !== resolved.version || state.lastNotifiedTag !== tag;
|
|
76
76
|
if (shouldNotify) {
|
|
77
|
-
params.log.info(`update available (${tag}): v${resolved.version} (current v${VERSION}). Run: ${formatCliCommand("
|
|
77
|
+
params.log.info(`update available (${tag}): v${resolved.version} (current v${VERSION}). Run: ${formatCliCommand("poolbot update")}`);
|
|
78
78
|
nextState.lastNotifiedVersion = resolved.version;
|
|
79
79
|
nextState.lastNotifiedTag = tag;
|
|
80
80
|
}
|
package/dist/infra/warnings.js
CHANGED
|
@@ -2,8 +2,8 @@ import fs from "node:fs";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { CONFIG_DIR, ensureDir } from "../utils.js";
|
|
5
|
-
export const WIDE_AREA_DISCOVERY_DOMAIN = "
|
|
6
|
-
export const WIDE_AREA_ZONE_FILENAME = "
|
|
5
|
+
export const WIDE_AREA_DISCOVERY_DOMAIN = "poolbot.internal.";
|
|
6
|
+
export const WIDE_AREA_ZONE_FILENAME = "poolbot.internal.db";
|
|
7
7
|
export function getWideAreaZonePath() {
|
|
8
8
|
return path.join(CONFIG_DIR, "dns", WIDE_AREA_ZONE_FILENAME);
|
|
9
9
|
}
|
|
@@ -45,7 +45,7 @@ function extractSerial(zoneText) {
|
|
|
45
45
|
return Number.isFinite(parsed) ? parsed : null;
|
|
46
46
|
}
|
|
47
47
|
function extractContentHash(zoneText) {
|
|
48
|
-
const match = zoneText.match(/^\s*;\s*
|
|
48
|
+
const match = zoneText.match(/^\s*;\s*poolbot-content-hash:\s*(\S+)\s*$/m);
|
|
49
49
|
return match?.[1] ?? null;
|
|
50
50
|
}
|
|
51
51
|
function computeContentHash(body) {
|
|
@@ -58,9 +58,9 @@ function computeContentHash(body) {
|
|
|
58
58
|
return (h >>> 0).toString(16).padStart(8, "0");
|
|
59
59
|
}
|
|
60
60
|
function renderZone(opts) {
|
|
61
|
-
const hostname = os.hostname().split(".")[0] ?? "
|
|
62
|
-
const hostLabel = dnsLabel(opts.hostLabel ?? hostname, "
|
|
63
|
-
const instanceLabel = dnsLabel(opts.instanceLabel ?? `${hostname}-gateway`, "
|
|
61
|
+
const hostname = os.hostname().split(".")[0] ?? "poolbot";
|
|
62
|
+
const hostLabel = dnsLabel(opts.hostLabel ?? hostname, "poolbot");
|
|
63
|
+
const instanceLabel = dnsLabel(opts.instanceLabel ?? `${hostname}-gateway`, "poolbot-gw");
|
|
64
64
|
const txt = [
|
|
65
65
|
`displayName=${opts.displayName.trim() || hostname}`,
|
|
66
66
|
`role=gateway`,
|
|
@@ -93,15 +93,15 @@ function renderZone(opts) {
|
|
|
93
93
|
if (opts.tailnetIPv6) {
|
|
94
94
|
records.push(`${hostLabel} IN AAAA ${opts.tailnetIPv6}`);
|
|
95
95
|
}
|
|
96
|
-
records.push(`
|
|
97
|
-
records.push(`${instanceLabel}.
|
|
98
|
-
records.push(`${instanceLabel}.
|
|
96
|
+
records.push(`_poolbot-gw._tcp IN PTR ${instanceLabel}._poolbot-gw._tcp`);
|
|
97
|
+
records.push(`${instanceLabel}._poolbot-gw._tcp IN SRV 0 0 ${opts.gatewayPort} ${hostLabel}`);
|
|
98
|
+
records.push(`${instanceLabel}._poolbot-gw._tcp IN TXT ${txt.map(txtQuote).join(" ")}`);
|
|
99
99
|
const contentBody = `${records.join("\n")}\n`;
|
|
100
100
|
const hashBody = `${records
|
|
101
101
|
.map((line) => line === soaLine ? `@ IN SOA ns1 hostmaster SERIAL 7200 3600 1209600 60` : line)
|
|
102
102
|
.join("\n")}\n`;
|
|
103
103
|
const contentHash = computeContentHash(hashBody);
|
|
104
|
-
return `;
|
|
104
|
+
return `; poolbot-content-hash: ${contentHash}\n${contentBody}`;
|
|
105
105
|
}
|
|
106
106
|
export function renderWideAreaGatewayZoneText(opts) {
|
|
107
107
|
return renderZone(opts);
|
package/dist/line/monitor.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import crypto from "node:crypto";
|
|
2
1
|
import { danger, logVerbose } from "../globals.js";
|
|
3
2
|
import { createLineBot } from "./bot.js";
|
|
3
|
+
import { validateLineSignature } from "./signature.js";
|
|
4
4
|
import { normalizePluginHttpPath } from "../plugins/http-path.js";
|
|
5
5
|
import { registerPluginHttpRoute } from "../plugins/http-registry.js";
|
|
6
6
|
import { replyMessageLine, showLoadingAnimation, getUserDisplayName, createQuickReplyItems, createTextMessageWithQuickReplies, pushTextMessageWithQuickReplies, pushMessageLine, pushMessagesLine, createFlexMessage, createImageMessage, createLocationMessage, } from "./send.js";
|
|
@@ -26,10 +26,6 @@ function recordChannelRuntimeState(params) {
|
|
|
26
26
|
export function getLineRuntimeState(accountId) {
|
|
27
27
|
return runtimeState.get(`line:${accountId}`);
|
|
28
28
|
}
|
|
29
|
-
function validateLineSignature(body, signature, channelSecret) {
|
|
30
|
-
const hash = crypto.createHmac("SHA256", channelSecret).update(body).digest("base64");
|
|
31
|
-
return hash === signature;
|
|
32
|
-
}
|
|
33
29
|
async function readRequestBody(req) {
|
|
34
30
|
return new Promise((resolve, reject) => {
|
|
35
31
|
const chunks = [];
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import crypto from "node:crypto";
|
|
2
|
+
export function validateLineSignature(body, signature, channelSecret) {
|
|
3
|
+
const hash = crypto.createHmac("SHA256", channelSecret).update(body).digest("base64");
|
|
4
|
+
const hashBuffer = Buffer.from(hash);
|
|
5
|
+
const signatureBuffer = Buffer.from(signature);
|
|
6
|
+
// Use constant-time comparison to prevent timing attacks.
|
|
7
|
+
if (hashBuffer.length !== signatureBuffer.length) {
|
|
8
|
+
return false;
|
|
9
|
+
}
|
|
10
|
+
return crypto.timingSafeEqual(hashBuffer, signatureBuffer);
|
|
11
|
+
}
|
package/dist/line/webhook.js
CHANGED
|
@@ -1,9 +1,5 @@
|
|
|
1
|
-
import crypto from "node:crypto";
|
|
2
1
|
import { logVerbose, danger } from "../globals.js";
|
|
3
|
-
|
|
4
|
-
const hash = crypto.createHmac("SHA256", channelSecret).update(body).digest("base64");
|
|
5
|
-
return hash === signature;
|
|
6
|
-
}
|
|
2
|
+
import { validateLineSignature } from "./signature.js";
|
|
7
3
|
function readRawBody(req) {
|
|
8
4
|
const rawBody = req.rawBody ??
|
|
9
5
|
(typeof req.body === "string" || Buffer.isBuffer(req.body) ? req.body : null);
|
|
@@ -36,7 +32,7 @@ export function createLineWebhookMiddleware(options) {
|
|
|
36
32
|
res.status(400).json({ error: "Missing raw request body for signature verification" });
|
|
37
33
|
return;
|
|
38
34
|
}
|
|
39
|
-
if (!
|
|
35
|
+
if (!validateLineSignature(rawBody, signature, channelSecret)) {
|
|
40
36
|
logVerbose("line: webhook signature validation failed");
|
|
41
37
|
res.status(401).json({ error: "Invalid signature" });
|
|
42
38
|
return;
|
package/dist/logging/logger.js
CHANGED
|
@@ -7,9 +7,9 @@ import { readLoggingConfig } from "./config.js";
|
|
|
7
7
|
import { loggingState } from "./state.js";
|
|
8
8
|
// Pin to /tmp so mac Debug UI and docs match; os.tmpdir() can be a per-user
|
|
9
9
|
// randomized path on macOS which made the “Open log” button a no-op.
|
|
10
|
-
export const DEFAULT_LOG_DIR = "/tmp/
|
|
11
|
-
export const DEFAULT_LOG_FILE = path.join(DEFAULT_LOG_DIR, "
|
|
12
|
-
const LOG_PREFIX = "
|
|
10
|
+
export const DEFAULT_LOG_DIR = "/tmp/poolbot";
|
|
11
|
+
export const DEFAULT_LOG_FILE = path.join(DEFAULT_LOG_DIR, "poolbot.log"); // legacy single-file path
|
|
12
|
+
const LOG_PREFIX = "poolbot";
|
|
13
13
|
const LOG_SUFFIX = ".log";
|
|
14
14
|
const MAX_LOG_AGE_MS = 24 * 60 * 60 * 1000; // 24h
|
|
15
15
|
const requireConfig = createRequire(import.meta.url);
|
|
@@ -61,7 +61,7 @@ function buildLogger(settings) {
|
|
|
61
61
|
pruneOldRollingLogs(path.dirname(settings.file));
|
|
62
62
|
}
|
|
63
63
|
const logger = new TsLogger({
|
|
64
|
-
name: "
|
|
64
|
+
name: "poolbot",
|
|
65
65
|
minLevel: levelToMinLevel(settings.level),
|
|
66
66
|
type: "hidden", // no ansi formatting
|
|
67
67
|
});
|
|
@@ -16,7 +16,7 @@ function hasFlag(args, flag) {
|
|
|
16
16
|
const args = process.argv.slice(2);
|
|
17
17
|
async function main() {
|
|
18
18
|
if (hasFlag(args, "--version") || hasFlag(args, "-v")) {
|
|
19
|
-
// Match `
|
|
19
|
+
// Match `poolbot --version` behavior for Swift env/version checks.
|
|
20
20
|
// Keep output a single line.
|
|
21
21
|
console.log(BUNDLED_VERSION);
|
|
22
22
|
process.exit(0);
|
|
@@ -173,6 +173,6 @@ async function main() {
|
|
|
173
173
|
}
|
|
174
174
|
}
|
|
175
175
|
void main().catch((err) => {
|
|
176
|
-
console.error("[
|
|
176
|
+
console.error("[poolbot] Gateway daemon failed:", err instanceof Error ? (err.stack ?? err.message) : err);
|
|
177
177
|
process.exit(1);
|
|
178
178
|
});
|
package/dist/macos/relay.js
CHANGED
|
@@ -37,8 +37,8 @@ async function main() {
|
|
|
37
37
|
await patchBunLongForProtobuf();
|
|
38
38
|
const { loadDotEnv } = await import("../infra/dotenv.js");
|
|
39
39
|
loadDotEnv({ quiet: true });
|
|
40
|
-
const {
|
|
41
|
-
|
|
40
|
+
const { ensureMoltbotCliOnPath } = await import("../infra/path-env.js");
|
|
41
|
+
ensureMoltbotCliOnPath();
|
|
42
42
|
const { enableConsoleCapture } = await import("../logging.js");
|
|
43
43
|
enableConsoleCapture();
|
|
44
44
|
const { assertSupportedRuntime } = await import("../infra/runtime-guard.js");
|
|
@@ -49,12 +49,12 @@ async function main() {
|
|
|
49
49
|
const program = buildProgram();
|
|
50
50
|
installUnhandledRejectionHandler();
|
|
51
51
|
process.on("uncaughtException", (error) => {
|
|
52
|
-
console.error("[
|
|
52
|
+
console.error("[poolbot] Uncaught exception:", formatUncaughtError(error));
|
|
53
53
|
process.exit(1);
|
|
54
54
|
});
|
|
55
55
|
await program.parseAsync(process.argv);
|
|
56
56
|
}
|
|
57
57
|
void main().catch((err) => {
|
|
58
|
-
console.error("[
|
|
58
|
+
console.error("[poolbot] Relay failed:", err instanceof Error ? (err.stack ?? err.message) : err);
|
|
59
59
|
process.exit(1);
|
|
60
60
|
});
|
package/dist/media/host.js
CHANGED
|
@@ -18,7 +18,7 @@ export async function ensureMediaHosted(source, opts = {}) {
|
|
|
18
18
|
const needsServerStart = await isPortFree(port);
|
|
19
19
|
if (needsServerStart && !opts.startServer) {
|
|
20
20
|
await fs.rm(saved.path).catch(() => { });
|
|
21
|
-
throw new Error(`Media hosting requires the webhook/Funnel server. Start \`${formatCliCommand("
|
|
21
|
+
throw new Error(`Media hosting requires the webhook/Funnel server. Start \`${formatCliCommand("poolbot webhook")}\`/\`${formatCliCommand("poolbot up")}\` or re-run with --serve-media.`);
|
|
22
22
|
}
|
|
23
23
|
if (needsServerStart && opts.startServer) {
|
|
24
24
|
if (!mediaServer) {
|
package/dist/media/image-ops.js
CHANGED
|
@@ -91,7 +91,7 @@ function readJpegExifOrientation(buffer) {
|
|
|
91
91
|
return null;
|
|
92
92
|
}
|
|
93
93
|
async function withTempDir(fn) {
|
|
94
|
-
const dir = await fs.mkdtemp(path.join(os.tmpdir(), "
|
|
94
|
+
const dir = await fs.mkdtemp(path.join(os.tmpdir(), "poolbot-img-"));
|
|
95
95
|
try {
|
|
96
96
|
return await fn(dir);
|
|
97
97
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { logWarn } from "../logger.js";
|
|
2
|
-
import {
|
|
2
|
+
import { closeDispatcher, createPinnedDispatcher, resolvePinnedHostname, } from "../infra/net/ssrf.js";
|
|
3
3
|
let canvasModulePromise = null;
|
|
4
4
|
let pdfJsModulePromise = null;
|
|
5
5
|
// Lazy-load optional PDF/image deps so non-PDF paths don't require native installs.
|
|
@@ -73,42 +73,50 @@ export async function fetchWithGuard(params) {
|
|
|
73
73
|
if (!["http:", "https:"].includes(parsedUrl.protocol)) {
|
|
74
74
|
throw new Error(`Invalid URL protocol: ${parsedUrl.protocol}. Only HTTP/HTTPS allowed.`);
|
|
75
75
|
}
|
|
76
|
-
await
|
|
77
|
-
const
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
76
|
+
const pinned = await resolvePinnedHostname(parsedUrl.hostname);
|
|
77
|
+
const dispatcher = createPinnedDispatcher(pinned);
|
|
78
|
+
try {
|
|
79
|
+
const response = await fetch(parsedUrl, {
|
|
80
|
+
signal: controller.signal,
|
|
81
|
+
headers: { "User-Agent": "Moltbot-Gateway/1.0" },
|
|
82
|
+
redirect: "manual",
|
|
83
|
+
dispatcher,
|
|
84
|
+
});
|
|
85
|
+
if (isRedirectStatus(response.status)) {
|
|
86
|
+
const location = response.headers.get("location");
|
|
87
|
+
if (!location) {
|
|
88
|
+
throw new Error(`Redirect missing location header (${response.status})`);
|
|
89
|
+
}
|
|
90
|
+
redirectCount += 1;
|
|
91
|
+
if (redirectCount > params.maxRedirects) {
|
|
92
|
+
throw new Error(`Too many redirects (limit: ${params.maxRedirects})`);
|
|
93
|
+
}
|
|
94
|
+
void response.body?.cancel();
|
|
95
|
+
currentUrl = new URL(location, parsedUrl).toString();
|
|
96
|
+
continue;
|
|
86
97
|
}
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
throw new Error(`Too many redirects (limit: ${params.maxRedirects})`);
|
|
98
|
+
if (!response.ok) {
|
|
99
|
+
throw new Error(`Failed to fetch: ${response.status} ${response.statusText}`);
|
|
90
100
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
throw new Error(`Content too large: ${size} bytes (limit: ${params.maxBytes} bytes)`);
|
|
101
|
+
const contentLength = response.headers.get("content-length");
|
|
102
|
+
if (contentLength) {
|
|
103
|
+
const size = parseInt(contentLength, 10);
|
|
104
|
+
if (size > params.maxBytes) {
|
|
105
|
+
throw new Error(`Content too large: ${size} bytes (limit: ${params.maxBytes} bytes)`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
const buffer = Buffer.from(await response.arrayBuffer());
|
|
109
|
+
if (buffer.byteLength > params.maxBytes) {
|
|
110
|
+
throw new Error(`Content too large: ${buffer.byteLength} bytes (limit: ${params.maxBytes} bytes)`);
|
|
102
111
|
}
|
|
112
|
+
const contentType = response.headers.get("content-type") || undefined;
|
|
113
|
+
const parsed = parseContentType(contentType);
|
|
114
|
+
const mimeType = parsed.mimeType ?? "application/octet-stream";
|
|
115
|
+
return { buffer, mimeType, contentType };
|
|
103
116
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
throw new Error(`Content too large: ${buffer.byteLength} bytes (limit: ${params.maxBytes} bytes)`);
|
|
117
|
+
finally {
|
|
118
|
+
await closeDispatcher(dispatcher);
|
|
107
119
|
}
|
|
108
|
-
const contentType = response.headers.get("content-type") || undefined;
|
|
109
|
-
const parsed = parseContentType(contentType);
|
|
110
|
-
const mimeType = parsed.mimeType ?? "application/octet-stream";
|
|
111
|
-
return { buffer, mimeType, contentType };
|
|
112
120
|
}
|
|
113
121
|
}
|
|
114
122
|
finally {
|