@poolzin/pool-bot 2026.1.26 → 2026.1.29
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 +50 -1118
- package/LICENSE +21 -0
- package/README.md +47 -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 +22 -33
- 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/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/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.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-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/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 +7 -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 +2 -2
- 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 +72 -52
- 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/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/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/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
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs/promises";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { fileURLToPath } from "node:url";
|
|
4
|
+
const CORE_PACKAGE_NAMES = new Set(["poolbot", "poolbot"]);
|
|
4
5
|
async function readPackageName(dir) {
|
|
5
6
|
try {
|
|
6
7
|
const raw = await fs.readFile(path.join(dir, "package.json"), "utf-8");
|
|
@@ -15,7 +16,7 @@ async function findPackageRoot(startDir, maxDepth = 12) {
|
|
|
15
16
|
let current = path.resolve(startDir);
|
|
16
17
|
for (let i = 0; i < maxDepth; i += 1) {
|
|
17
18
|
const name = await readPackageName(current);
|
|
18
|
-
if (name
|
|
19
|
+
if (name && CORE_PACKAGE_NAMES.has(name))
|
|
19
20
|
return current;
|
|
20
21
|
const parent = path.dirname(current);
|
|
21
22
|
if (parent === current)
|
|
@@ -36,7 +37,7 @@ function candidateDirsFromArgv1(argv1) {
|
|
|
36
37
|
}
|
|
37
38
|
return candidates;
|
|
38
39
|
}
|
|
39
|
-
export async function
|
|
40
|
+
export async function resolvePoolBotPackageRoot(opts) {
|
|
40
41
|
const candidates = [];
|
|
41
42
|
if (opts.moduleUrl) {
|
|
42
43
|
candidates.push(path.dirname(fileURLToPath(opts.moduleUrl)));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { formatCliCommand } from "../cli/command-format.js";
|
|
2
2
|
export function classifyPortListener(listener, port) {
|
|
3
3
|
const raw = `${listener.commandLine ?? ""} ${listener.command ?? ""}`.trim().toLowerCase();
|
|
4
|
-
if (raw.includes("
|
|
4
|
+
if (raw.includes("poolbot"))
|
|
5
5
|
return "gateway";
|
|
6
6
|
if (raw.includes("ssh")) {
|
|
7
7
|
const portToken = String(port);
|
|
@@ -18,7 +18,7 @@ export function buildPortHints(listeners, port) {
|
|
|
18
18
|
const kinds = new Set(listeners.map((listener) => classifyPortListener(listener, port)));
|
|
19
19
|
const hints = [];
|
|
20
20
|
if (kinds.has("gateway")) {
|
|
21
|
-
hints.push(`Gateway already running locally. Stop it (${formatCliCommand("
|
|
21
|
+
hints.push(`Gateway already running locally. Stop it (${formatCliCommand("poolbot gateway stop")}) or use a different port.`);
|
|
22
22
|
}
|
|
23
23
|
if (kinds.has("ssh")) {
|
|
24
24
|
hints.push("SSH tunnel already bound to this port. Close the tunnel or use a different local port in -L.");
|
package/dist/infra/ports.js
CHANGED
|
@@ -52,8 +52,8 @@ export async function handlePortError(err, port, context, runtime = defaultRunti
|
|
|
52
52
|
if (details) {
|
|
53
53
|
runtime.error(info("Port listener details:"));
|
|
54
54
|
runtime.error(details);
|
|
55
|
-
if (/
|
|
56
|
-
runtime.error(warn("It looks like another
|
|
55
|
+
if (/poolbot|src\/index\.ts|dist\/index\.js/.test(details)) {
|
|
56
|
+
runtime.error(warn("It looks like another poolbot instance is already running. Stop it or pick a different port."));
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
runtime.error(info("Resolve by stopping the process using the port or passing --port <free-port>."));
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
|
-
import {
|
|
4
|
+
import { ensureAuthProfileStore, listProfilesForProvider, resolveApiKeyForProfile, resolveAuthProfileOrder, } from "../agents/auth-profiles.js";
|
|
5
5
|
import { getCustomProviderApiKey, resolveEnvApiKey } from "../agents/model-auth.js";
|
|
6
6
|
import { normalizeProviderId } from "../agents/model-selection.js";
|
|
7
7
|
import { loadConfig } from "../config/config.js";
|
|
@@ -89,9 +89,7 @@ async function resolveOAuthToken(params) {
|
|
|
89
89
|
store,
|
|
90
90
|
provider: params.provider,
|
|
91
91
|
});
|
|
92
|
-
|
|
93
|
-
// `user:profile` scope required for the OAuth usage endpoint.
|
|
94
|
-
const candidates = params.provider === "anthropic" ? [CLAUDE_CLI_PROFILE_ID, ...order] : order;
|
|
92
|
+
const candidates = order;
|
|
95
93
|
const deduped = [];
|
|
96
94
|
for (const entry of candidates) {
|
|
97
95
|
if (!deduped.includes(entry))
|
|
@@ -62,7 +62,7 @@ export async function fetchClaudeUsage(token, timeoutMs, fetchFn) {
|
|
|
62
62
|
const res = await fetchJson("https://api.anthropic.com/api/oauth/usage", {
|
|
63
63
|
headers: {
|
|
64
64
|
Authorization: `Bearer ${token}`,
|
|
65
|
-
"User-Agent": "
|
|
65
|
+
"User-Agent": "poolbot",
|
|
66
66
|
Accept: "application/json",
|
|
67
67
|
"anthropic-version": "2023-06-01",
|
|
68
68
|
"anthropic-beta": "oauth-2025-04-20",
|
|
@@ -260,7 +260,7 @@ export async function fetchMinimaxUsage(apiKey, timeoutMs, fetchFn) {
|
|
|
260
260
|
headers: {
|
|
261
261
|
Authorization: `Bearer ${apiKey}`,
|
|
262
262
|
"Content-Type": "application/json",
|
|
263
|
-
"MM-API-Source": "
|
|
263
|
+
"MM-API-Source": "Moltbot",
|
|
264
264
|
},
|
|
265
265
|
}, timeoutMs, fetchFn);
|
|
266
266
|
if (!res.ok) {
|
|
@@ -4,7 +4,7 @@ import { formatCliCommand } from "../cli/command-format.js";
|
|
|
4
4
|
import { resolveStateDir } from "../config/paths.js";
|
|
5
5
|
const SENTINEL_FILENAME = "restart-sentinel.json";
|
|
6
6
|
export function formatDoctorNonInteractiveHint(env = process.env) {
|
|
7
|
-
return `Run: ${formatCliCommand("
|
|
7
|
+
return `Run: ${formatCliCommand("poolbot doctor --non-interactive", env)}`;
|
|
8
8
|
}
|
|
9
9
|
export function resolveRestartSentinelPath(env = process.env) {
|
|
10
10
|
return path.join(resolveStateDir(env), SENTINEL_FILENAME);
|
package/dist/infra/restart.js
CHANGED
|
@@ -71,7 +71,7 @@ function normalizeSystemdUnit(raw, profile) {
|
|
|
71
71
|
}
|
|
72
72
|
return unit.endsWith(".service") ? unit : `${unit}.service`;
|
|
73
73
|
}
|
|
74
|
-
export function
|
|
74
|
+
export function triggerMoltbotRestart() {
|
|
75
75
|
if (process.env.VITEST || process.env.NODE_ENV === "test") {
|
|
76
76
|
return { ok: true, method: "supervisor", detail: "test mode" };
|
|
77
77
|
}
|
|
@@ -53,10 +53,13 @@ export function createTelegramRetryRunner(params) {
|
|
|
53
53
|
...params.configRetry,
|
|
54
54
|
...params.retry,
|
|
55
55
|
});
|
|
56
|
+
const shouldRetry = params.shouldRetry
|
|
57
|
+
? (err) => params.shouldRetry?.(err) || TELEGRAM_RETRY_RE.test(formatErrorMessage(err))
|
|
58
|
+
: (err) => TELEGRAM_RETRY_RE.test(formatErrorMessage(err));
|
|
56
59
|
return (fn, label) => retryAsync(fn, {
|
|
57
60
|
...retryConfig,
|
|
58
61
|
label,
|
|
59
|
-
shouldRetry
|
|
62
|
+
shouldRetry,
|
|
60
63
|
retryAfterMs: getTelegramRetryAfterMs,
|
|
61
64
|
onRetry: params.verbose
|
|
62
65
|
? (info) => {
|
|
@@ -50,11 +50,11 @@ export function assertSupportedRuntime(runtime = defaultRuntime, details = detec
|
|
|
50
50
|
const runtimeLabel = details.kind === "unknown" ? "unknown runtime" : `${details.kind} ${versionLabel}`;
|
|
51
51
|
const execLabel = details.execPath ?? "unknown";
|
|
52
52
|
runtime.error([
|
|
53
|
-
"
|
|
53
|
+
"poolbot requires Node >=22.0.0.",
|
|
54
54
|
`Detected: ${runtimeLabel} (exec: ${execLabel}).`,
|
|
55
55
|
`PATH searched: ${details.pathEnv}`,
|
|
56
56
|
"Install Node: https://nodejs.org/en/download",
|
|
57
|
-
"Upgrade Node and re-run
|
|
57
|
+
"Upgrade Node and re-run poolbot.",
|
|
58
58
|
].join("\n"));
|
|
59
59
|
runtime.exit(1);
|
|
60
60
|
}
|
package/dist/infra/shell-env.js
CHANGED
|
@@ -53,7 +53,7 @@ export function loadShellEnvFallback(opts) {
|
|
|
53
53
|
}
|
|
54
54
|
catch (err) {
|
|
55
55
|
const msg = err instanceof Error ? err.message : String(err);
|
|
56
|
-
logger.warn(`[
|
|
56
|
+
logger.warn(`[poolbot] shell env fallback failed: ${msg}`);
|
|
57
57
|
lastAppliedKeys = [];
|
|
58
58
|
return { ok: false, error: msg, applied: [] };
|
|
59
59
|
}
|
|
@@ -139,11 +139,11 @@ function listWorkspaceDirs(cfg) {
|
|
|
139
139
|
function collectRequiredBins(entries, targetPlatform) {
|
|
140
140
|
const bins = new Set();
|
|
141
141
|
for (const entry of entries) {
|
|
142
|
-
const os = entry.
|
|
142
|
+
const os = entry.metadata?.os ?? [];
|
|
143
143
|
if (os.length > 0 && !os.includes(targetPlatform))
|
|
144
144
|
continue;
|
|
145
|
-
const required = entry.
|
|
146
|
-
const anyBins = entry.
|
|
145
|
+
const required = entry.metadata?.requires?.bins ?? [];
|
|
146
|
+
const anyBins = entry.metadata?.requires?.anyBins ?? [];
|
|
147
147
|
for (const bin of required) {
|
|
148
148
|
if (bin.trim())
|
|
149
149
|
bins.add(bin.trim());
|
package/dist/infra/tailscale.js
CHANGED
|
@@ -173,6 +173,7 @@ export async function ensureTailscaledInstalled(exec = runExec, prompt = promptY
|
|
|
173
173
|
logVerbose("Installing tailscaled via Homebrew…");
|
|
174
174
|
await exec("brew", ["install", "tailscale"]);
|
|
175
175
|
}
|
|
176
|
+
const whoisCache = new Map();
|
|
176
177
|
function extractExecErrorText(err) {
|
|
177
178
|
const errOutput = err;
|
|
178
179
|
const stdout = typeof errOutput.stdout === "string" ? errOutput.stdout : "";
|
|
@@ -262,7 +263,7 @@ export async function ensureFunnel(port, exec = runExec, runtime = defaultRuntim
|
|
|
262
263
|
console.error(warn("Tailscale client/server version mismatch detected; try updating tailscale/tailscaled."));
|
|
263
264
|
}
|
|
264
265
|
runtime.error("Failed to enable Tailscale Funnel. Is it allowed on your tailnet?");
|
|
265
|
-
runtime.error(info(`Tip: Funnel is optional for
|
|
266
|
+
runtime.error(info(`Tip: Funnel is optional for Moltbot. You can keep running the web gateway without it: \`${formatCliCommand("poolbot gateway")}\``));
|
|
266
267
|
if (shouldLogVerbose()) {
|
|
267
268
|
const rich = isRich();
|
|
268
269
|
if (stdout.trim()) {
|
|
@@ -304,3 +305,64 @@ export async function disableTailscaleFunnel(exec = runExec) {
|
|
|
304
305
|
timeoutMs: 15_000,
|
|
305
306
|
});
|
|
306
307
|
}
|
|
308
|
+
function getString(value) {
|
|
309
|
+
return typeof value === "string" && value.trim() ? value.trim() : undefined;
|
|
310
|
+
}
|
|
311
|
+
function readRecord(value) {
|
|
312
|
+
return value && typeof value === "object" ? value : null;
|
|
313
|
+
}
|
|
314
|
+
function parseWhoisIdentity(payload) {
|
|
315
|
+
const userProfile = readRecord(payload.UserProfile) ?? readRecord(payload.userProfile) ?? readRecord(payload.User);
|
|
316
|
+
const login = getString(userProfile?.LoginName) ??
|
|
317
|
+
getString(userProfile?.Login) ??
|
|
318
|
+
getString(userProfile?.login) ??
|
|
319
|
+
getString(payload.LoginName) ??
|
|
320
|
+
getString(payload.login);
|
|
321
|
+
if (!login)
|
|
322
|
+
return null;
|
|
323
|
+
const name = getString(userProfile?.DisplayName) ??
|
|
324
|
+
getString(userProfile?.Name) ??
|
|
325
|
+
getString(userProfile?.displayName) ??
|
|
326
|
+
getString(payload.DisplayName) ??
|
|
327
|
+
getString(payload.name);
|
|
328
|
+
return { login, name };
|
|
329
|
+
}
|
|
330
|
+
function readCachedWhois(ip, now) {
|
|
331
|
+
const cached = whoisCache.get(ip);
|
|
332
|
+
if (!cached)
|
|
333
|
+
return undefined;
|
|
334
|
+
if (cached.expiresAt <= now) {
|
|
335
|
+
whoisCache.delete(ip);
|
|
336
|
+
return undefined;
|
|
337
|
+
}
|
|
338
|
+
return cached.value;
|
|
339
|
+
}
|
|
340
|
+
function writeCachedWhois(ip, value, ttlMs) {
|
|
341
|
+
whoisCache.set(ip, { value, expiresAt: Date.now() + ttlMs });
|
|
342
|
+
}
|
|
343
|
+
export async function readTailscaleWhoisIdentity(ip, exec = runExec, opts) {
|
|
344
|
+
const normalized = ip.trim();
|
|
345
|
+
if (!normalized)
|
|
346
|
+
return null;
|
|
347
|
+
const now = Date.now();
|
|
348
|
+
const cached = readCachedWhois(normalized, now);
|
|
349
|
+
if (cached !== undefined)
|
|
350
|
+
return cached;
|
|
351
|
+
const cacheTtlMs = opts?.cacheTtlMs ?? 60_000;
|
|
352
|
+
const errorTtlMs = opts?.errorTtlMs ?? 5_000;
|
|
353
|
+
try {
|
|
354
|
+
const tailscaleBin = await getTailscaleBinary();
|
|
355
|
+
const { stdout } = await exec(tailscaleBin, ["whois", "--json", normalized], {
|
|
356
|
+
timeoutMs: opts?.timeoutMs ?? 5_000,
|
|
357
|
+
maxBuffer: 200_000,
|
|
358
|
+
});
|
|
359
|
+
const parsed = stdout ? parsePossiblyNoisyJsonObject(stdout) : {};
|
|
360
|
+
const identity = parseWhoisIdentity(parsed);
|
|
361
|
+
writeCachedWhois(normalized, identity, cacheTtlMs);
|
|
362
|
+
return identity;
|
|
363
|
+
}
|
|
364
|
+
catch {
|
|
365
|
+
writeCachedWhois(normalized, null, errorTtlMs);
|
|
366
|
+
return null;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
@@ -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 = [];
|