@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
|
@@ -3,6 +3,7 @@ import path from "node:path";
|
|
|
3
3
|
import { resolveSkillKey } from "./frontmatter.js";
|
|
4
4
|
const DEFAULT_CONFIG_VALUES = {
|
|
5
5
|
"browser.enabled": true,
|
|
6
|
+
"browser.evaluateEnabled": true,
|
|
6
7
|
};
|
|
7
8
|
function isTruthy(value) {
|
|
8
9
|
if (value === undefined || value === null)
|
|
@@ -53,7 +54,7 @@ function normalizeAllowlist(input) {
|
|
|
53
54
|
return normalized.length > 0 ? normalized : undefined;
|
|
54
55
|
}
|
|
55
56
|
function isBundledSkill(entry) {
|
|
56
|
-
return entry.skill.source === "
|
|
57
|
+
return entry.skill.source === "poolbot-bundled";
|
|
57
58
|
}
|
|
58
59
|
export function resolveBundledAllowlist(config) {
|
|
59
60
|
return normalizeAllowlist(config?.skills?.allowBundled);
|
|
@@ -86,7 +87,7 @@ export function shouldIncludeSkill(params) {
|
|
|
86
87
|
const skillKey = resolveSkillKey(entry.skill, entry);
|
|
87
88
|
const skillConfig = resolveSkillConfig(config, skillKey);
|
|
88
89
|
const allowBundled = normalizeAllowlist(config?.skills?.allowBundled);
|
|
89
|
-
const osList = entry.
|
|
90
|
+
const osList = entry.metadata?.os ?? [];
|
|
90
91
|
const remotePlatforms = eligibility?.remote?.platforms ?? [];
|
|
91
92
|
if (skillConfig?.enabled === false)
|
|
92
93
|
return false;
|
|
@@ -97,10 +98,10 @@ export function shouldIncludeSkill(params) {
|
|
|
97
98
|
!remotePlatforms.some((platform) => osList.includes(platform))) {
|
|
98
99
|
return false;
|
|
99
100
|
}
|
|
100
|
-
if (entry.
|
|
101
|
+
if (entry.metadata?.always === true) {
|
|
101
102
|
return true;
|
|
102
103
|
}
|
|
103
|
-
const requiredBins = entry.
|
|
104
|
+
const requiredBins = entry.metadata?.requires?.bins ?? [];
|
|
104
105
|
if (requiredBins.length > 0) {
|
|
105
106
|
for (const bin of requiredBins) {
|
|
106
107
|
if (hasBinary(bin))
|
|
@@ -110,27 +111,27 @@ export function shouldIncludeSkill(params) {
|
|
|
110
111
|
return false;
|
|
111
112
|
}
|
|
112
113
|
}
|
|
113
|
-
const requiredAnyBins = entry.
|
|
114
|
+
const requiredAnyBins = entry.metadata?.requires?.anyBins ?? [];
|
|
114
115
|
if (requiredAnyBins.length > 0) {
|
|
115
116
|
const anyFound = requiredAnyBins.some((bin) => hasBinary(bin)) ||
|
|
116
117
|
eligibility?.remote?.hasAnyBin?.(requiredAnyBins);
|
|
117
118
|
if (!anyFound)
|
|
118
119
|
return false;
|
|
119
120
|
}
|
|
120
|
-
const requiredEnv = entry.
|
|
121
|
+
const requiredEnv = entry.metadata?.requires?.env ?? [];
|
|
121
122
|
if (requiredEnv.length > 0) {
|
|
122
123
|
for (const envName of requiredEnv) {
|
|
123
124
|
if (process.env[envName])
|
|
124
125
|
continue;
|
|
125
126
|
if (skillConfig?.env?.[envName])
|
|
126
127
|
continue;
|
|
127
|
-
if (skillConfig?.apiKey && entry.
|
|
128
|
+
if (skillConfig?.apiKey && entry.metadata?.primaryEnv === envName) {
|
|
128
129
|
continue;
|
|
129
130
|
}
|
|
130
131
|
return false;
|
|
131
132
|
}
|
|
132
133
|
}
|
|
133
|
-
const requiredConfig = entry.
|
|
134
|
+
const requiredConfig = entry.metadata?.requires?.config ?? [];
|
|
134
135
|
if (requiredConfig.length > 0) {
|
|
135
136
|
for (const configPath of requiredConfig) {
|
|
136
137
|
if (!isConfigPathTruthy(config, configPath))
|
|
@@ -16,7 +16,7 @@ export function applySkillEnvOverrides(params) {
|
|
|
16
16
|
process.env[envKey] = envValue;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
-
const primaryEnv = entry.
|
|
19
|
+
const primaryEnv = entry.metadata?.primaryEnv;
|
|
20
20
|
if (primaryEnv && skillConfig.apiKey && !process.env[primaryEnv]) {
|
|
21
21
|
updates.push({ key: primaryEnv, prev: process.env[primaryEnv] });
|
|
22
22
|
process.env[primaryEnv] = skillConfig.apiKey;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import JSON5 from "json5";
|
|
2
|
+
import { LEGACY_MANIFEST_KEY } from "../../compat/legacy-names.js";
|
|
2
3
|
import { parseFrontmatterBlock } from "../../markdown/frontmatter.js";
|
|
3
4
|
import { parseBooleanValue } from "../../utils/boolean.js";
|
|
4
5
|
export function parseFrontmatter(content) {
|
|
@@ -66,7 +67,7 @@ function parseFrontmatterBool(value, fallback) {
|
|
|
66
67
|
const parsed = parseBooleanValue(value);
|
|
67
68
|
return parsed === undefined ? fallback : parsed;
|
|
68
69
|
}
|
|
69
|
-
export function
|
|
70
|
+
export function resolveMoltbotMetadata(frontmatter) {
|
|
70
71
|
const raw = getFrontmatterValue(frontmatter, "metadata");
|
|
71
72
|
if (!raw)
|
|
72
73
|
return undefined;
|
|
@@ -74,24 +75,24 @@ export function resolveClawdbotMetadata(frontmatter) {
|
|
|
74
75
|
const parsed = JSON5.parse(raw);
|
|
75
76
|
if (!parsed || typeof parsed !== "object")
|
|
76
77
|
return undefined;
|
|
77
|
-
const
|
|
78
|
-
if (!
|
|
78
|
+
const metadataRaw = parsed.poolbot ?? parsed[LEGACY_MANIFEST_KEY];
|
|
79
|
+
if (!metadataRaw || typeof metadataRaw !== "object")
|
|
79
80
|
return undefined;
|
|
80
|
-
const
|
|
81
|
-
const requiresRaw = typeof
|
|
82
|
-
?
|
|
81
|
+
const metadataObj = metadataRaw;
|
|
82
|
+
const requiresRaw = typeof metadataObj.requires === "object" && metadataObj.requires !== null
|
|
83
|
+
? metadataObj.requires
|
|
83
84
|
: undefined;
|
|
84
|
-
const installRaw = Array.isArray(
|
|
85
|
+
const installRaw = Array.isArray(metadataObj.install) ? metadataObj.install : [];
|
|
85
86
|
const install = installRaw
|
|
86
87
|
.map((entry) => parseInstallSpec(entry))
|
|
87
88
|
.filter((entry) => Boolean(entry));
|
|
88
|
-
const osRaw = normalizeStringList(
|
|
89
|
+
const osRaw = normalizeStringList(metadataObj.os);
|
|
89
90
|
return {
|
|
90
|
-
always: typeof
|
|
91
|
-
emoji: typeof
|
|
92
|
-
homepage: typeof
|
|
93
|
-
skillKey: typeof
|
|
94
|
-
primaryEnv: typeof
|
|
91
|
+
always: typeof metadataObj.always === "boolean" ? metadataObj.always : undefined,
|
|
92
|
+
emoji: typeof metadataObj.emoji === "string" ? metadataObj.emoji : undefined,
|
|
93
|
+
homepage: typeof metadataObj.homepage === "string" ? metadataObj.homepage : undefined,
|
|
94
|
+
skillKey: typeof metadataObj.skillKey === "string" ? metadataObj.skillKey : undefined,
|
|
95
|
+
primaryEnv: typeof metadataObj.primaryEnv === "string" ? metadataObj.primaryEnv : undefined,
|
|
95
96
|
os: osRaw.length > 0 ? osRaw : undefined,
|
|
96
97
|
requires: requiresRaw
|
|
97
98
|
? {
|
|
@@ -115,5 +116,5 @@ export function resolveSkillInvocationPolicy(frontmatter) {
|
|
|
115
116
|
};
|
|
116
117
|
}
|
|
117
118
|
export function resolveSkillKey(skill, entry) {
|
|
118
|
-
return entry?.
|
|
119
|
+
return entry?.metadata?.skillKey ?? skill.name;
|
|
119
120
|
}
|
|
@@ -5,7 +5,7 @@ import { createSubsystemLogger } from "../../logging/subsystem.js";
|
|
|
5
5
|
import { CONFIG_DIR, resolveUserPath } from "../../utils.js";
|
|
6
6
|
import { resolveBundledSkillsDir } from "./bundled-dir.js";
|
|
7
7
|
import { shouldIncludeSkill } from "./config.js";
|
|
8
|
-
import { parseFrontmatter,
|
|
8
|
+
import { parseFrontmatter, resolveMoltbotMetadata, resolveSkillInvocationPolicy, } from "./frontmatter.js";
|
|
9
9
|
import { resolvePluginSkillDirs } from "./plugin-skills.js";
|
|
10
10
|
import { serializeByKey } from "./serialize.js";
|
|
11
11
|
const fsp = fs.promises;
|
|
@@ -89,23 +89,23 @@ function loadSkillEntries(workspaceDir, opts) {
|
|
|
89
89
|
const bundledSkills = bundledSkillsDir
|
|
90
90
|
? loadSkills({
|
|
91
91
|
dir: bundledSkillsDir,
|
|
92
|
-
source: "
|
|
92
|
+
source: "poolbot-bundled",
|
|
93
93
|
})
|
|
94
94
|
: [];
|
|
95
95
|
const extraSkills = mergedExtraDirs.flatMap((dir) => {
|
|
96
96
|
const resolved = resolveUserPath(dir);
|
|
97
97
|
return loadSkills({
|
|
98
98
|
dir: resolved,
|
|
99
|
-
source: "
|
|
99
|
+
source: "poolbot-extra",
|
|
100
100
|
});
|
|
101
101
|
});
|
|
102
102
|
const managedSkills = loadSkills({
|
|
103
103
|
dir: managedSkillsDir,
|
|
104
|
-
source: "
|
|
104
|
+
source: "poolbot-managed",
|
|
105
105
|
});
|
|
106
106
|
const workspaceSkills = loadSkills({
|
|
107
107
|
dir: workspaceSkillsDir,
|
|
108
|
-
source: "
|
|
108
|
+
source: "poolbot-workspace",
|
|
109
109
|
});
|
|
110
110
|
const merged = new Map();
|
|
111
111
|
// Precedence: extra < bundled < managed < workspace
|
|
@@ -129,7 +129,7 @@ function loadSkillEntries(workspaceDir, opts) {
|
|
|
129
129
|
return {
|
|
130
130
|
skill,
|
|
131
131
|
frontmatter,
|
|
132
|
-
|
|
132
|
+
metadata: resolveMoltbotMetadata(frontmatter),
|
|
133
133
|
invocation: resolveSkillInvocationPolicy(frontmatter),
|
|
134
134
|
};
|
|
135
135
|
});
|
|
@@ -146,7 +146,7 @@ export function buildWorkspaceSkillSnapshot(workspaceDir, opts) {
|
|
|
146
146
|
prompt,
|
|
147
147
|
skills: eligible.map((entry) => ({
|
|
148
148
|
name: entry.skill.name,
|
|
149
|
-
primaryEnv: entry.
|
|
149
|
+
primaryEnv: entry.metadata?.primaryEnv,
|
|
150
150
|
})),
|
|
151
151
|
resolvedSkills,
|
|
152
152
|
version: opts?.snapshotVersion,
|
|
@@ -40,7 +40,7 @@ function resolveInstallId(spec, index) {
|
|
|
40
40
|
return (spec.id ?? `${spec.kind}-${index}`).trim();
|
|
41
41
|
}
|
|
42
42
|
function findInstallSpec(entry, installId) {
|
|
43
|
-
const specs = entry.
|
|
43
|
+
const specs = entry.metadata?.install ?? [];
|
|
44
44
|
for (const [index, spec] of specs.entries()) {
|
|
45
45
|
if (resolveInstallId(spec, index) === installId)
|
|
46
46
|
return spec;
|
|
@@ -2,7 +2,7 @@ import path from "node:path";
|
|
|
2
2
|
import { CONFIG_DIR } from "../utils.js";
|
|
3
3
|
import { hasBinary, isBundledSkillAllowed, isConfigPathTruthy, loadWorkspaceSkillEntries, resolveBundledAllowlist, resolveConfigPath, resolveSkillConfig, resolveSkillsInstallPreferences, } from "./skills.js";
|
|
4
4
|
function resolveSkillKey(entry) {
|
|
5
|
-
return entry.
|
|
5
|
+
return entry.metadata?.skillKey ?? entry.skill.name;
|
|
6
6
|
}
|
|
7
7
|
function selectPreferredInstallSpec(install, prefs) {
|
|
8
8
|
if (install.length === 0)
|
|
@@ -26,7 +26,7 @@ function selectPreferredInstallSpec(install, prefs) {
|
|
|
26
26
|
return indexed[0];
|
|
27
27
|
}
|
|
28
28
|
function normalizeInstallOptions(entry, prefs) {
|
|
29
|
-
const install = entry.
|
|
29
|
+
const install = entry.metadata?.install ?? [];
|
|
30
30
|
if (install.length === 0)
|
|
31
31
|
return [];
|
|
32
32
|
const platform = process.platform;
|
|
@@ -82,18 +82,18 @@ function buildSkillStatus(entry, config, prefs, eligibility) {
|
|
|
82
82
|
const disabled = skillConfig?.enabled === false;
|
|
83
83
|
const allowBundled = resolveBundledAllowlist(config);
|
|
84
84
|
const blockedByAllowlist = !isBundledSkillAllowed(entry, allowBundled);
|
|
85
|
-
const always = entry.
|
|
86
|
-
const emoji = entry.
|
|
87
|
-
const homepageRaw = entry.
|
|
85
|
+
const always = entry.metadata?.always === true;
|
|
86
|
+
const emoji = entry.metadata?.emoji ?? entry.frontmatter.emoji;
|
|
87
|
+
const homepageRaw = entry.metadata?.homepage ??
|
|
88
88
|
entry.frontmatter.homepage ??
|
|
89
89
|
entry.frontmatter.website ??
|
|
90
90
|
entry.frontmatter.url;
|
|
91
91
|
const homepage = homepageRaw?.trim() ? homepageRaw.trim() : undefined;
|
|
92
|
-
const requiredBins = entry.
|
|
93
|
-
const requiredAnyBins = entry.
|
|
94
|
-
const requiredEnv = entry.
|
|
95
|
-
const requiredConfig = entry.
|
|
96
|
-
const requiredOs = entry.
|
|
92
|
+
const requiredBins = entry.metadata?.requires?.bins ?? [];
|
|
93
|
+
const requiredAnyBins = entry.metadata?.requires?.anyBins ?? [];
|
|
94
|
+
const requiredEnv = entry.metadata?.requires?.env ?? [];
|
|
95
|
+
const requiredConfig = entry.metadata?.requires?.config ?? [];
|
|
96
|
+
const requiredOs = entry.metadata?.os ?? [];
|
|
97
97
|
const missingBins = requiredBins.filter((bin) => {
|
|
98
98
|
if (hasBinary(bin))
|
|
99
99
|
return false;
|
|
@@ -117,7 +117,7 @@ function buildSkillStatus(entry, config, prefs, eligibility) {
|
|
|
117
117
|
continue;
|
|
118
118
|
if (skillConfig?.env?.[envName])
|
|
119
119
|
continue;
|
|
120
|
-
if (skillConfig?.apiKey && entry.
|
|
120
|
+
if (skillConfig?.apiKey && entry.metadata?.primaryEnv === envName) {
|
|
121
121
|
continue;
|
|
122
122
|
}
|
|
123
123
|
missingEnv.push(envName);
|
|
@@ -152,7 +152,7 @@ function buildSkillStatus(entry, config, prefs, eligibility) {
|
|
|
152
152
|
filePath: entry.skill.filePath,
|
|
153
153
|
baseDir: entry.skill.baseDir,
|
|
154
154
|
skillKey,
|
|
155
|
-
primaryEnv: entry.
|
|
155
|
+
primaryEnv: entry.metadata?.primaryEnv,
|
|
156
156
|
emoji,
|
|
157
157
|
homepage,
|
|
158
158
|
always,
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import {
|
|
2
|
+
import { STATE_DIR } from "../config/paths.js";
|
|
3
3
|
import { loadJsonFile, saveJsonFile } from "../infra/json-file.js";
|
|
4
4
|
import { normalizeDeliveryContext } from "../utils/delivery-context.js";
|
|
5
5
|
const REGISTRY_VERSION = 2;
|
|
6
6
|
export function resolveSubagentRegistryPath() {
|
|
7
|
-
return path.join(
|
|
7
|
+
return path.join(STATE_DIR, "subagents", "runs.json");
|
|
8
8
|
}
|
|
9
9
|
export function loadSubagentRegistryFromDisk() {
|
|
10
10
|
const pathname = resolveSubagentRegistryPath();
|
|
@@ -59,7 +59,7 @@ function buildMessagingSection(params) {
|
|
|
59
59
|
"## Messaging",
|
|
60
60
|
"- Reply in current session → automatically routes to the source channel (Signal, Telegram, etc.)",
|
|
61
61
|
"- Cross-session messaging → use sessions_send(sessionKey, message)",
|
|
62
|
-
"- Never use exec/curl for provider messaging;
|
|
62
|
+
"- Never use exec/curl for provider messaging; Moltbot handles all routing internally.",
|
|
63
63
|
params.availableTools.has("message")
|
|
64
64
|
? [
|
|
65
65
|
"",
|
|
@@ -95,13 +95,13 @@ function buildDocsSection(params) {
|
|
|
95
95
|
return [];
|
|
96
96
|
return [
|
|
97
97
|
"## Documentation",
|
|
98
|
-
`
|
|
99
|
-
"Mirror: https://docs.
|
|
100
|
-
"Source: https://github.com/
|
|
101
|
-
"Community: https://discord.com/
|
|
98
|
+
`Moltbot docs: ${docsPath}`,
|
|
99
|
+
"Mirror: https://docs.molt.bot",
|
|
100
|
+
"Source: https://github.com/poolbot/poolbot",
|
|
101
|
+
"Community: https://discord.com/discord.gg/poolbot",
|
|
102
102
|
"Find new skills: https://clawdhub.com",
|
|
103
|
-
"For
|
|
104
|
-
"When diagnosing issues, run `
|
|
103
|
+
"For Moltbot behavior, commands, config, or architecture: consult local docs first.",
|
|
104
|
+
"When diagnosing issues, run `poolbot status` yourself when possible; only ask the user if you lack access (e.g., sandboxed).",
|
|
105
105
|
"",
|
|
106
106
|
];
|
|
107
107
|
}
|
|
@@ -124,7 +124,7 @@ export function buildAgentSystemPrompt(params) {
|
|
|
124
124
|
nodes: "List/describe/notify/camera/screen on paired nodes",
|
|
125
125
|
cron: "Manage cron jobs and wake events (use for reminders; when scheduling a reminder, write the systemEvent text as something that will read like a reminder when it fires, and mention that it is a reminder depending on the time gap between setting and firing; include recent context in reminder text if appropriate)",
|
|
126
126
|
message: "Send messages and channel actions",
|
|
127
|
-
gateway: "Restart, apply config, or run updates on the running
|
|
127
|
+
gateway: "Restart, apply config, or run updates on the running Moltbot process",
|
|
128
128
|
agents_list: "List agent ids allowed for sessions_spawn",
|
|
129
129
|
sessions_list: "List other sessions (incl. sub-agents) with filters/last",
|
|
130
130
|
sessions_history: "Fetch history for another session/sub-agent",
|
|
@@ -242,10 +242,10 @@ export function buildAgentSystemPrompt(params) {
|
|
|
242
242
|
const workspaceNotes = (params.workspaceNotes ?? []).map((note) => note.trim()).filter(Boolean);
|
|
243
243
|
// For "none" mode, return just the basic identity line
|
|
244
244
|
if (promptMode === "none") {
|
|
245
|
-
return "You are a personal assistant running inside
|
|
245
|
+
return "You are a personal assistant running inside Moltbot.";
|
|
246
246
|
}
|
|
247
247
|
const lines = [
|
|
248
|
-
"You are a personal assistant running inside
|
|
248
|
+
"You are a personal assistant running inside Moltbot.",
|
|
249
249
|
"",
|
|
250
250
|
"## Tooling",
|
|
251
251
|
"Tool availability (filtered by policy):",
|
|
@@ -277,25 +277,25 @@ export function buildAgentSystemPrompt(params) {
|
|
|
277
277
|
"Keep narration brief and value-dense; avoid repeating obvious steps.",
|
|
278
278
|
"Use plain human language for narration unless in a technical context.",
|
|
279
279
|
"",
|
|
280
|
-
"##
|
|
281
|
-
"
|
|
280
|
+
"## Moltbot CLI Quick Reference",
|
|
281
|
+
"Moltbot is controlled via subcommands. Do not invent commands.",
|
|
282
282
|
"To manage the Gateway daemon service (start/stop/restart):",
|
|
283
|
-
"-
|
|
284
|
-
"-
|
|
285
|
-
"-
|
|
286
|
-
"-
|
|
287
|
-
"If unsure, ask the user to run `
|
|
283
|
+
"- poolbot gateway status",
|
|
284
|
+
"- poolbot gateway start",
|
|
285
|
+
"- poolbot gateway stop",
|
|
286
|
+
"- poolbot gateway restart",
|
|
287
|
+
"If unsure, ask the user to run `poolbot help` (or `poolbot gateway --help`) and paste the output.",
|
|
288
288
|
"",
|
|
289
289
|
...skillsSection,
|
|
290
290
|
...memorySection,
|
|
291
291
|
// Skip self-update for subagent/none modes
|
|
292
|
-
hasGateway && !isMinimal ? "##
|
|
292
|
+
hasGateway && !isMinimal ? "## Moltbot Self-Update" : "",
|
|
293
293
|
hasGateway && !isMinimal
|
|
294
294
|
? [
|
|
295
295
|
"Get Updates (self-update) is ONLY allowed when the user explicitly asks for it.",
|
|
296
296
|
"Do not run config.apply or update.run unless the user explicitly requests an update or config change; if it's not explicit, ask first.",
|
|
297
297
|
"Actions: config.get, config.schema, config.apply (validate + write full config, then restart), update.run (update deps or git, then restart).",
|
|
298
|
-
"After restart,
|
|
298
|
+
"After restart, Moltbot pings the last active session automatically.",
|
|
299
299
|
].join("\n")
|
|
300
300
|
: "",
|
|
301
301
|
hasGateway && !isMinimal ? "" : "",
|
|
@@ -331,9 +331,7 @@ export function buildAgentSystemPrompt(params) {
|
|
|
331
331
|
? ` (mounted at ${params.sandboxInfo.agentWorkspaceMount})`
|
|
332
332
|
: ""}`
|
|
333
333
|
: "",
|
|
334
|
-
params.sandboxInfo.
|
|
335
|
-
? `Sandbox browser control URL: ${params.sandboxInfo.browserControlUrl}`
|
|
336
|
-
: "",
|
|
334
|
+
params.sandboxInfo.browserBridgeUrl ? "Sandbox browser: enabled." : "",
|
|
337
335
|
params.sandboxInfo.browserNoVncUrl
|
|
338
336
|
? `Sandbox browser observer (noVNC): ${params.sandboxInfo.browserNoVncUrl}`
|
|
339
337
|
: "",
|
|
@@ -342,15 +340,6 @@ export function buildAgentSystemPrompt(params) {
|
|
|
342
340
|
: params.sandboxInfo.hostBrowserAllowed === false
|
|
343
341
|
? "Host browser control: blocked."
|
|
344
342
|
: "",
|
|
345
|
-
params.sandboxInfo.allowedControlUrls?.length
|
|
346
|
-
? `Browser control URL allowlist: ${params.sandboxInfo.allowedControlUrls.join(", ")}`
|
|
347
|
-
: "",
|
|
348
|
-
params.sandboxInfo.allowedControlHosts?.length
|
|
349
|
-
? `Browser control host allowlist: ${params.sandboxInfo.allowedControlHosts.join(", ")}`
|
|
350
|
-
: "",
|
|
351
|
-
params.sandboxInfo.allowedControlPorts?.length
|
|
352
|
-
? `Browser control port allowlist: ${params.sandboxInfo.allowedControlPorts.join(", ")}`
|
|
353
|
-
: "",
|
|
354
343
|
params.sandboxInfo.elevated?.allowed
|
|
355
344
|
? "Elevated exec is available for this session."
|
|
356
345
|
: "",
|
|
@@ -373,7 +362,7 @@ export function buildAgentSystemPrompt(params) {
|
|
|
373
362
|
userTimezone,
|
|
374
363
|
}),
|
|
375
364
|
"## Workspace Files (injected)",
|
|
376
|
-
"These user-editable files are loaded by
|
|
365
|
+
"These user-editable files are loaded by Moltbot and included below in Project Context.",
|
|
377
366
|
"",
|
|
378
367
|
...buildReplyTagsSection(isMinimal),
|
|
379
368
|
...buildMessagingSection({
|
|
@@ -438,7 +427,7 @@ export function buildAgentSystemPrompt(params) {
|
|
|
438
427
|
}
|
|
439
428
|
// Skip heartbeats for subagent/none modes
|
|
440
429
|
if (!isMinimal) {
|
|
441
|
-
lines.push("## Heartbeats", heartbeatPromptLine, "If you receive a heartbeat poll (a user message matching the heartbeat prompt above), and there is nothing that needs attention, reply exactly:", "HEARTBEAT_OK", '
|
|
430
|
+
lines.push("## Heartbeats", heartbeatPromptLine, "If you receive a heartbeat poll (a user message matching the heartbeat prompt above), and there is nothing that needs attention, reply exactly:", "HEARTBEAT_OK", 'Moltbot treats a leading/trailing "HEARTBEAT_OK" as a heartbeat ack (and may discard it).', 'If something needs attention, do NOT include "HEARTBEAT_OK"; reply with the alert text instead.', "");
|
|
442
431
|
}
|
|
443
432
|
lines.push("## Runtime", buildRuntimeLine(runtimeInfo, runtimeChannel, runtimeCapabilities, params.defaultThinkLevel), `Reasoning: ${reasoningLevel} (hidden unless on/stream). Toggle /reasoning; /status shows Reasoning when enabled.`);
|
|
444
433
|
return lines.filter(Boolean).join("\n");
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { createSubsystemLogger } from "../logging/subsystem.js";
|
|
2
2
|
import { getImageMetadata, resizeToJpeg } from "../media/image-ops.js";
|
|
3
|
-
// Anthropic Messages API limitations (observed in
|
|
3
|
+
// Anthropic Messages API limitations (observed in Moltbot sessions):
|
|
4
4
|
// - Images over ~2000px per side can fail in multi-image requests.
|
|
5
5
|
// - Images over 5MB are rejected by the API.
|
|
6
6
|
//
|
|
@@ -26,8 +26,8 @@ export const TOOL_GROUPS = {
|
|
|
26
26
|
"group:messaging": ["message"],
|
|
27
27
|
// Nodes + device tools
|
|
28
28
|
"group:nodes": ["nodes"],
|
|
29
|
-
// All
|
|
30
|
-
"group:
|
|
29
|
+
// All Moltbot native tools (excludes provider plugins).
|
|
30
|
+
"group:poolbot": [
|
|
31
31
|
"browser",
|
|
32
32
|
"canvas",
|
|
33
33
|
"nodes",
|
|
@@ -172,6 +172,12 @@ export function stripPluginOnlyAllowlist(policy, groups, coreTools) {
|
|
|
172
172
|
unknownAllowlist.push(entry);
|
|
173
173
|
}
|
|
174
174
|
const strippedAllowlist = !hasCoreEntry;
|
|
175
|
+
// When an allowlist contains only plugin tools, we strip it to avoid accidentally
|
|
176
|
+
// disabling core tools. Users who want additive behavior should prefer `tools.alsoAllow`.
|
|
177
|
+
if (strippedAllowlist) {
|
|
178
|
+
// Note: logging happens in the caller (pi-tools/tools-invoke) after this function returns.
|
|
179
|
+
// We keep this note here for future maintainers.
|
|
180
|
+
}
|
|
175
181
|
return {
|
|
176
182
|
policy: strippedAllowlist ? { ...policy, allow: undefined } : policy,
|
|
177
183
|
unknownAllowlist: Array.from(new Set(unknownAllowlist)),
|
|
@@ -25,11 +25,9 @@ async function resolveBrowserNodeTarget(params) {
|
|
|
25
25
|
}
|
|
26
26
|
return null;
|
|
27
27
|
}
|
|
28
|
-
if (params.
|
|
28
|
+
if (params.sandboxBridgeUrl?.trim() && params.target !== "node" && !params.requestedNode) {
|
|
29
29
|
return null;
|
|
30
30
|
}
|
|
31
|
-
if (params.controlUrl?.trim())
|
|
32
|
-
return null;
|
|
33
31
|
if (params.target && params.target !== "node")
|
|
34
32
|
return null;
|
|
35
33
|
if (mode === "manual" && params.target !== "node" && !params.requestedNode) {
|
|
@@ -121,125 +119,67 @@ function applyProxyPaths(result, mapping) {
|
|
|
121
119
|
}
|
|
122
120
|
function resolveBrowserBaseUrl(params) {
|
|
123
121
|
const cfg = loadConfig();
|
|
124
|
-
const resolved = resolveBrowserConfig(cfg.browser);
|
|
125
|
-
const
|
|
126
|
-
const
|
|
127
|
-
const target = params.target ?? (normalizedControlUrl ? "custom" : normalizedDefault ? "sandbox" : "host");
|
|
128
|
-
const assertAllowedControlUrl = (url) => {
|
|
129
|
-
const allowedUrls = params.allowedControlUrls?.map((entry) => entry.trim().replace(/\/$/, ""));
|
|
130
|
-
const allowedHosts = params.allowedControlHosts?.map((entry) => entry.trim().toLowerCase());
|
|
131
|
-
const allowedPorts = params.allowedControlPorts;
|
|
132
|
-
if (!allowedUrls?.length && !allowedHosts?.length && !allowedPorts?.length) {
|
|
133
|
-
return;
|
|
134
|
-
}
|
|
135
|
-
let parsed;
|
|
136
|
-
try {
|
|
137
|
-
parsed = new URL(url);
|
|
138
|
-
}
|
|
139
|
-
catch {
|
|
140
|
-
throw new Error(`Invalid browser controlUrl: ${url}`);
|
|
141
|
-
}
|
|
142
|
-
const normalizedUrl = parsed.toString().replace(/\/$/, "");
|
|
143
|
-
if (allowedUrls?.length && !allowedUrls.includes(normalizedUrl)) {
|
|
144
|
-
throw new Error("Browser controlUrl is not in the allowed URL list.");
|
|
145
|
-
}
|
|
146
|
-
if (allowedHosts?.length && !allowedHosts.includes(parsed.hostname)) {
|
|
147
|
-
throw new Error("Browser controlUrl hostname is not in the allowed host list.");
|
|
148
|
-
}
|
|
149
|
-
if (allowedPorts?.length) {
|
|
150
|
-
const port = parsed.port?.trim() !== "" ? Number(parsed.port) : parsed.protocol === "https:" ? 443 : 80;
|
|
151
|
-
if (!Number.isFinite(port) || !allowedPorts.includes(port)) {
|
|
152
|
-
throw new Error("Browser controlUrl port is not in the allowed port list.");
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
};
|
|
156
|
-
if (target !== "custom" && params.target && normalizedControlUrl) {
|
|
157
|
-
throw new Error('controlUrl is only supported with target="custom".');
|
|
158
|
-
}
|
|
159
|
-
if (target === "custom") {
|
|
160
|
-
if (!normalizedControlUrl) {
|
|
161
|
-
throw new Error("Custom browser target requires controlUrl.");
|
|
162
|
-
}
|
|
163
|
-
const normalized = normalizedControlUrl.replace(/\/$/, "");
|
|
164
|
-
assertAllowedControlUrl(normalized);
|
|
165
|
-
return normalized;
|
|
166
|
-
}
|
|
122
|
+
const resolved = resolveBrowserConfig(cfg.browser, cfg);
|
|
123
|
+
const normalizedSandbox = params.sandboxBridgeUrl?.trim() ?? "";
|
|
124
|
+
const target = params.target ?? (normalizedSandbox ? "sandbox" : "host");
|
|
167
125
|
if (target === "sandbox") {
|
|
168
|
-
if (!
|
|
126
|
+
if (!normalizedSandbox) {
|
|
169
127
|
throw new Error('Sandbox browser is unavailable. Enable agents.defaults.sandbox.browser.enabled or use target="host" if allowed.');
|
|
170
128
|
}
|
|
171
|
-
return
|
|
129
|
+
return normalizedSandbox.replace(/\/$/, "");
|
|
172
130
|
}
|
|
173
131
|
if (params.allowHostControl === false) {
|
|
174
132
|
throw new Error("Host browser control is disabled by sandbox policy.");
|
|
175
133
|
}
|
|
176
134
|
if (!resolved.enabled) {
|
|
177
|
-
throw new Error("Browser control is disabled. Set browser.enabled=true in ~/.
|
|
135
|
+
throw new Error("Browser control is disabled. Set browser.enabled=true in ~/.poolbot/poolbot.json.");
|
|
178
136
|
}
|
|
179
|
-
|
|
180
|
-
assertAllowedControlUrl(normalized);
|
|
181
|
-
return normalized;
|
|
137
|
+
return undefined;
|
|
182
138
|
}
|
|
183
139
|
export function createBrowserTool(opts) {
|
|
184
|
-
const targetDefault = opts?.
|
|
140
|
+
const targetDefault = opts?.sandboxBridgeUrl ? "sandbox" : "host";
|
|
185
141
|
const hostHint = opts?.allowHostControl === false ? "Host target blocked by policy." : "Host target allowed.";
|
|
186
|
-
const allowlistHint = opts?.allowedControlUrls?.length ||
|
|
187
|
-
opts?.allowedControlHosts?.length ||
|
|
188
|
-
opts?.allowedControlPorts?.length
|
|
189
|
-
? "Custom targets are restricted by sandbox allowlists."
|
|
190
|
-
: "Custom targets are unrestricted.";
|
|
191
142
|
return {
|
|
192
143
|
label: "Browser",
|
|
193
144
|
name: "browser",
|
|
194
145
|
description: [
|
|
195
|
-
"Control the browser via
|
|
146
|
+
"Control the browser via Moltbot's browser control server (status/start/stop/profiles/tabs/open/snapshot/screenshot/actions).",
|
|
196
147
|
'Profiles: use profile="chrome" for Chrome extension relay takeover (your existing Chrome tabs). Use profile="clawd" for the isolated clawd-managed browser.',
|
|
197
148
|
'If the user mentions the Chrome extension / Browser Relay / toolbar button / “attach tab”, ALWAYS use profile="chrome" (do not ask which profile).',
|
|
198
149
|
'When a node-hosted browser proxy is available, the tool may auto-route to it. Pin a node with node=<id|name> or target="node".',
|
|
199
|
-
"Chrome extension relay needs an attached tab: user must click the
|
|
150
|
+
"Chrome extension relay needs an attached tab: user must click the Moltbot Browser Relay toolbar icon on the tab (badge ON). If no tab is connected, ask them to attach it.",
|
|
200
151
|
"When using refs from snapshot (e.g. e12), keep the same tab: prefer passing targetId from the snapshot response into subsequent actions (act/click/type/etc).",
|
|
201
152
|
'For stable, self-resolving refs across calls, use snapshot with refs="aria" (Playwright aria-ref ids). Default refs="role" are role+name-based.',
|
|
202
153
|
"Use snapshot+act for UI automation. Avoid act:wait by default; use only in exceptional cases when no reliable UI state exists.",
|
|
203
|
-
`target selects browser location (sandbox|host|
|
|
204
|
-
"controlUrl implies target=custom (remote control server).",
|
|
154
|
+
`target selects browser location (sandbox|host|node). Default: ${targetDefault}.`,
|
|
205
155
|
hostHint,
|
|
206
|
-
allowlistHint,
|
|
207
156
|
].join(" "),
|
|
208
157
|
parameters: BrowserToolSchema,
|
|
209
158
|
execute: async (_toolCallId, args) => {
|
|
210
159
|
const params = args;
|
|
211
160
|
const action = readStringParam(params, "action", { required: true });
|
|
212
|
-
const controlUrl = readStringParam(params, "controlUrl");
|
|
213
161
|
const profile = readStringParam(params, "profile");
|
|
214
162
|
const requestedNode = readStringParam(params, "node");
|
|
215
163
|
let target = readStringParam(params, "target");
|
|
216
|
-
if (
|
|
217
|
-
throw new Error('
|
|
218
|
-
}
|
|
219
|
-
if (target === "custom" && requestedNode) {
|
|
220
|
-
throw new Error('node is not supported with target="custom".');
|
|
164
|
+
if (requestedNode && target && target !== "node") {
|
|
165
|
+
throw new Error('node is only supported with target="node".');
|
|
221
166
|
}
|
|
222
|
-
if (!target && !
|
|
167
|
+
if (!target && !requestedNode && profile === "chrome") {
|
|
223
168
|
// Chrome extension relay takeover is a host Chrome feature; prefer host unless explicitly targeting a node.
|
|
224
169
|
target = "host";
|
|
225
170
|
}
|
|
226
171
|
const nodeTarget = await resolveBrowserNodeTarget({
|
|
227
172
|
requestedNode: requestedNode ?? undefined,
|
|
228
173
|
target,
|
|
229
|
-
|
|
230
|
-
defaultControlUrl: opts?.defaultControlUrl,
|
|
174
|
+
sandboxBridgeUrl: opts?.sandboxBridgeUrl,
|
|
231
175
|
});
|
|
232
176
|
const resolvedTarget = target === "node" ? undefined : target;
|
|
233
177
|
const baseUrl = nodeTarget
|
|
234
|
-
?
|
|
178
|
+
? undefined
|
|
235
179
|
: resolveBrowserBaseUrl({
|
|
236
180
|
target: resolvedTarget,
|
|
237
|
-
|
|
238
|
-
defaultControlUrl: opts?.defaultControlUrl,
|
|
181
|
+
sandboxBridgeUrl: opts?.sandboxBridgeUrl,
|
|
239
182
|
allowHostControl: opts?.allowHostControl,
|
|
240
|
-
allowedControlUrls: opts?.allowedControlUrls,
|
|
241
|
-
allowedControlHosts: opts?.allowedControlHosts,
|
|
242
|
-
allowedControlPorts: opts?.allowedControlPorts,
|
|
243
183
|
});
|
|
244
184
|
const proxyRequest = nodeTarget
|
|
245
185
|
? async (opts) => {
|
|
@@ -641,7 +581,7 @@ export function createBrowserTool(opts) {
|
|
|
641
581
|
})).tabs ?? [])
|
|
642
582
|
: await browserTabs(baseUrl, { profile }).catch(() => []);
|
|
643
583
|
if (!tabs.length) {
|
|
644
|
-
throw new Error("No Chrome tabs are attached via the
|
|
584
|
+
throw new Error("No Chrome tabs are attached via the Moltbot Browser Relay extension. Click the toolbar icon on the tab you want to control (badge ON), then retry.");
|
|
645
585
|
}
|
|
646
586
|
throw new Error(`Chrome tab not found (stale targetId?). Run action=tabs profile="chrome" and use one of the returned targetIds.`);
|
|
647
587
|
}
|
|
@@ -31,7 +31,7 @@ const BROWSER_TOOL_ACTIONS = [
|
|
|
31
31
|
"dialog",
|
|
32
32
|
"act",
|
|
33
33
|
];
|
|
34
|
-
const BROWSER_TARGETS = ["sandbox", "host", "
|
|
34
|
+
const BROWSER_TARGETS = ["sandbox", "host", "node"];
|
|
35
35
|
const BROWSER_SNAPSHOT_FORMATS = ["aria", "ai"];
|
|
36
36
|
const BROWSER_SNAPSHOT_MODES = ["efficient"];
|
|
37
37
|
const BROWSER_SNAPSHOT_REFS = ["role", "aria"];
|
|
@@ -78,7 +78,6 @@ export const BrowserToolSchema = Type.Object({
|
|
|
78
78
|
target: optionalStringEnum(BROWSER_TARGETS),
|
|
79
79
|
node: Type.Optional(Type.String()),
|
|
80
80
|
profile: Type.Optional(Type.String()),
|
|
81
|
-
controlUrl: Type.Optional(Type.String()),
|
|
82
81
|
targetUrl: Type.Optional(Type.String()),
|
|
83
82
|
targetId: Type.Optional(Type.String()),
|
|
84
83
|
limit: Type.Optional(Type.Number()),
|