@poolzin/pool-bot 2026.1.39 → 2026.2.1
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/assets/chrome-extension/README.md +3 -3
- package/assets/chrome-extension/background.js +5 -5
- package/assets/chrome-extension/manifest.json +3 -3
- package/assets/chrome-extension/options.html +4 -4
- package/assets/chrome-extension/options.js +1 -1
- package/dist/acp/client.js +3 -3
- package/dist/acp/types.js +1 -1
- package/dist/agents/agent-paths.js +3 -3
- package/dist/agents/auth-profiles/paths.js +3 -3
- package/dist/agents/bash-tools.exec.js +76 -25
- package/dist/agents/cli-runner/helpers.js +10 -12
- package/dist/agents/cli-runner.js +2 -2
- package/dist/agents/cloudflare-ai-gateway.js +31 -0
- package/dist/agents/compaction.js +16 -2
- package/dist/agents/context-window-guard.js +13 -10
- package/dist/agents/context.js +4 -4
- package/dist/agents/docs-path.js +1 -1
- package/dist/agents/identity.js +47 -7
- package/dist/agents/memory-search.js +25 -8
- package/dist/agents/minimax-vlm.js +1 -1
- package/dist/agents/model-auth.js +12 -1
- package/dist/agents/model-catalog.js +4 -4
- package/dist/agents/model-selection.js +31 -4
- package/dist/agents/models-config.js +3 -3
- package/dist/agents/models-config.providers.js +147 -39
- package/dist/agents/pi-embedded-block-chunker.js +117 -42
- package/dist/agents/pi-embedded-helpers/errors.js +183 -78
- package/dist/agents/pi-embedded-helpers/openai.js +1 -1
- package/dist/agents/pi-embedded-helpers.js +1 -1
- package/dist/agents/pi-embedded-runner/compact.js +9 -8
- package/dist/agents/pi-embedded-runner/model.js +63 -4
- package/dist/agents/pi-embedded-runner/run/attempt.js +27 -17
- package/dist/agents/pi-embedded-runner/run.js +203 -50
- package/dist/agents/pi-embedded-runner/system-prompt.js +10 -2
- package/dist/agents/pi-embedded-runner/tool-result-truncation.js +275 -0
- package/dist/agents/pi-embedded-runner/utils.js +1 -1
- package/dist/agents/pi-embedded-subscribe.js +118 -29
- package/dist/agents/pi-model-discovery.js +10 -0
- package/dist/agents/pi-tool-definition-adapter.js +50 -9
- package/dist/agents/pi-tools.before-tool-call.js +67 -0
- package/dist/agents/pi-tools.js +20 -10
- package/dist/agents/pi-tools.read.js +2 -2
- package/dist/agents/poolbot-tools.js +15 -10
- package/dist/agents/sandbox-paths.js +31 -0
- package/dist/agents/session-file-repair.js +83 -0
- package/dist/agents/session-tool-result-guard.js +94 -15
- package/dist/agents/session-transcript-repair.js +68 -0
- package/dist/agents/shell-utils.js +51 -0
- package/dist/agents/skills/bundled-context.js +23 -0
- package/dist/agents/skills/bundled-dir.js +41 -7
- package/dist/agents/skills/frontmatter.js +1 -1
- package/dist/agents/skills/workspace.js +2 -2
- package/dist/agents/skills-install.js +60 -23
- package/dist/agents/subagent-announce.js +79 -34
- package/dist/agents/system-prompt.js +28 -4
- package/dist/agents/together-models.js +127 -0
- package/dist/agents/tool-images.js +1 -1
- package/dist/agents/tool-policy.conformance.js +14 -0
- package/dist/agents/tool-policy.js +25 -1
- package/dist/agents/tools/browser-tool.js +3 -3
- package/dist/agents/tools/cron-tool.js +166 -19
- package/dist/agents/tools/discord-actions-presence.js +78 -0
- package/dist/agents/tools/image-tool.js +2 -2
- package/dist/agents/tools/memory-tool.js +93 -5
- package/dist/agents/tools/message-tool.js +56 -2
- package/dist/agents/tools/sessions-history-tool.js +69 -1
- package/dist/agents/tools/web-search.js +211 -42
- package/dist/agents/usage.js +23 -1
- package/dist/agents/workspace-run.js +67 -0
- package/dist/agents/workspace-templates.js +44 -0
- package/dist/auto-reply/command-auth.js +121 -6
- package/dist/auto-reply/commands-registry.data.js +1 -1
- package/dist/auto-reply/envelope.js +50 -72
- package/dist/auto-reply/reply/commands-compact.js +1 -0
- package/dist/auto-reply/reply/commands-context-report.js +3 -2
- package/dist/auto-reply/reply/commands-context.js +1 -0
- package/dist/auto-reply/reply/commands-models.js +107 -60
- package/dist/auto-reply/reply/commands-ptt.js +171 -0
- package/dist/auto-reply/reply/commands-session.js +2 -2
- package/dist/auto-reply/reply/get-reply-run.js +16 -5
- package/dist/auto-reply/reply/groups.js +1 -1
- package/dist/auto-reply/reply/inbound-context.js +9 -1
- package/dist/auto-reply/reply/inbound-meta.js +130 -0
- package/dist/auto-reply/reply/model-selection.js +3 -3
- package/dist/auto-reply/reply/untrusted-context.js +15 -0
- package/dist/auto-reply/status.js +1 -1
- package/dist/auto-reply/thinking.js +88 -43
- package/dist/browser/bridge-server.js +13 -0
- package/dist/browser/cdp.helpers.js +38 -24
- package/dist/browser/client-fetch.js +51 -8
- package/dist/browser/config.js +2 -11
- package/dist/browser/extension-relay.js +104 -43
- package/dist/browser/pw-ai.js +1 -1
- package/dist/browser/pw-session.js +143 -8
- package/dist/browser/pw-tools-core.interactions.js +125 -27
- package/dist/browser/pw-tools-core.responses.js +1 -1
- package/dist/browser/pw-tools-core.state.js +1 -1
- package/dist/browser/routes/agent.act.js +86 -41
- package/dist/browser/routes/dispatcher.js +4 -4
- package/dist/browser/screenshot.js +1 -1
- package/dist/browser/server-context.js +2 -2
- package/dist/browser/server.js +13 -0
- package/dist/build-info.json +3 -3
- package/dist/canvas-host/a2ui.js +3 -3
- package/dist/channels/plugins/catalog.js +2 -2
- package/dist/channels/plugins/onboarding/imessage.js +1 -1
- package/dist/channels/plugins/onboarding/signal.js +1 -1
- package/dist/channels/plugins/onboarding/slack.js +4 -4
- package/dist/channels/plugins/onboarding/whatsapp.js +3 -3
- package/dist/channels/plugins/pairing-message.js +1 -1
- package/dist/channels/reply-prefix.js +8 -1
- package/dist/cli/browser-cli-extension.js +2 -2
- package/dist/cli/cron-cli/register.cron-add.js +61 -40
- package/dist/cli/cron-cli/register.cron-edit.js +60 -34
- package/dist/cli/cron-cli/shared.js +56 -41
- package/dist/cli/dns-cli.js +26 -14
- package/dist/cli/docs-cli.js +1 -1
- package/dist/cli/gateway-cli/dev.js +1 -1
- package/dist/cli/gateway-cli/register.js +37 -19
- package/dist/cli/memory-cli.js +30 -20
- package/dist/cli/nodes-cli/register.canvas.js +1 -1
- package/dist/cli/parse-bytes.js +37 -0
- package/dist/cli/plugins-cli.js +1 -1
- package/dist/cli/run-main.js +2 -2
- package/dist/cli/security-cli.js +1 -1
- package/dist/cli/tagline.js +1 -1
- package/dist/cli/update-cli.js +173 -52
- package/dist/cli/webhooks-cli.js +5 -5
- package/dist/commands/agent.js +1 -0
- package/dist/commands/agents.commands.add.js +1 -1
- package/dist/commands/auth-choice.apply.api-providers.js +305 -17
- package/dist/commands/auth-choice.apply.js +4 -1
- package/dist/commands/auth-choice.apply.plugin-provider.js +2 -2
- package/dist/commands/auth-choice.apply.xai.js +63 -0
- package/dist/commands/auth-choice.preferred-provider.js +7 -1
- package/dist/commands/configure.wizard.js +1 -1
- package/dist/commands/dashboard.js +1 -1
- package/dist/commands/docs.js +1 -1
- package/dist/commands/doctor-config-flow.js +61 -5
- package/dist/commands/doctor-gateway-services.js +3 -3
- package/dist/commands/doctor-state-migrations.js +1 -1
- package/dist/commands/doctor-update.js +3 -3
- package/dist/commands/doctor.js +1 -1
- package/dist/commands/health.js +1 -1
- package/dist/commands/model-allowlist.js +29 -0
- package/dist/commands/model-picker.js +2 -1
- 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 +44 -24
- package/dist/commands/models/shared.js +15 -0
- package/dist/commands/onboard-auth.config-core.js +366 -28
- package/dist/commands/onboard-auth.credentials.js +71 -9
- package/dist/commands/onboard-auth.js +3 -3
- package/dist/commands/onboard-auth.models.js +26 -24
- package/dist/commands/onboard-custom.js +384 -0
- package/dist/commands/onboard-non-interactive/local/auth-choice-inference.js +35 -0
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +146 -9
- package/dist/commands/onboard-skills.js +63 -38
- package/dist/commands/openai-model-default.js +41 -0
- package/dist/commands/status-all/report-lines.js +1 -1
- package/dist/commands/status.command.js +1 -1
- package/dist/commands/uninstall.js +3 -3
- package/dist/compat/legacy-names.js +1 -1
- package/dist/config/defaults.js +3 -2
- package/dist/config/io.js +3 -3
- package/dist/config/paths.js +136 -35
- package/dist/config/plugin-auto-enable.js +21 -5
- package/dist/config/redact-snapshot.js +153 -0
- package/dist/config/schema.field-metadata.js +590 -0
- package/dist/config/schema.js +3 -3
- package/dist/config/sessions/store.js +291 -23
- package/dist/config/types.memory.js +1 -0
- package/dist/config/version.js +4 -4
- package/dist/config/zod-schema.agent-defaults.js +3 -0
- package/dist/config/zod-schema.agent-runtime.js +13 -2
- package/dist/config/zod-schema.providers-core.js +142 -0
- package/dist/config/zod-schema.session.js +3 -0
- package/dist/cron/delivery.js +57 -0
- package/dist/cron/isolated-agent/delivery-target.js +18 -3
- package/dist/cron/isolated-agent/helpers.js +22 -5
- package/dist/cron/isolated-agent/run.js +171 -63
- package/dist/cron/isolated-agent/session.js +2 -0
- package/dist/cron/normalize.js +356 -28
- package/dist/cron/parse.js +10 -5
- package/dist/cron/run-log.js +35 -10
- package/dist/cron/schedule.js +41 -6
- package/dist/cron/service/jobs.js +208 -35
- package/dist/cron/service/ops.js +72 -16
- package/dist/cron/service/state.js +2 -0
- package/dist/cron/service/store.js +386 -14
- package/dist/cron/service/timer.js +390 -147
- package/dist/cron/session-reaper.js +86 -0
- package/dist/cron/store.js +23 -8
- package/dist/cron/validate-timestamp.js +43 -0
- package/dist/daemon/constants.js +7 -7
- package/dist/daemon/inspect.js +6 -6
- package/dist/daemon/systemd-unit.js +1 -1
- package/dist/discord/monitor/agent-components.js +438 -0
- package/dist/discord/monitor/allow-list.js +28 -5
- package/dist/discord/monitor/gateway-registry.js +29 -0
- package/dist/discord/monitor/native-command.js +44 -23
- package/dist/discord/monitor/sender-identity.js +45 -0
- package/dist/discord/pluralkit.js +27 -0
- package/dist/discord/send.outbound.js +92 -5
- package/dist/discord/send.shared.js +60 -23
- package/dist/discord/targets.js +84 -1
- package/dist/entry.js +15 -9
- package/dist/extensionAPI.js +8 -0
- package/dist/gateway/control-ui.js +8 -1
- package/dist/gateway/hooks-mapping.js +3 -0
- package/dist/gateway/hooks.js +65 -0
- package/dist/gateway/live-image-probe.js +1 -66
- package/dist/gateway/net.js +96 -31
- package/dist/gateway/node-command-policy.js +50 -15
- package/dist/gateway/openai-http.js +2 -2
- package/dist/gateway/openresponses-http.js +4 -4
- package/dist/gateway/origin-check.js +56 -0
- package/dist/gateway/protocol/client-info.js +9 -0
- package/dist/gateway/protocol/index.js +9 -2
- package/dist/gateway/protocol/schema/agents-models-skills.js +71 -1
- package/dist/gateway/protocol/schema/cron.js +22 -10
- package/dist/gateway/protocol/schema/protocol-schemas.js +16 -2
- package/dist/gateway/protocol/schema/sessions.js +12 -0
- package/dist/gateway/server/hooks.js +1 -1
- package/dist/gateway/server-broadcast.js +26 -9
- package/dist/gateway/server-chat.js +112 -23
- package/dist/gateway/server-discovery-runtime.js +10 -2
- package/dist/gateway/server-discovery.js +2 -2
- package/dist/gateway/server-http.js +110 -12
- package/dist/gateway/server-methods/agent-timestamp.js +60 -0
- package/dist/gateway/server-methods/agents.js +321 -2
- package/dist/gateway/server-methods/usage.js +559 -16
- package/dist/gateway/server-runtime-state.js +22 -8
- package/dist/gateway/server-startup-memory.js +16 -0
- package/dist/gateway/server.impl.js +7 -3
- package/dist/gateway/session-utils.fs.js +23 -25
- package/dist/gateway/session-utils.js +20 -10
- package/dist/gateway/sessions-patch.js +7 -22
- package/dist/gateway/test-helpers.server.js +35 -2
- package/dist/hooks/frontmatter.js +1 -1
- package/dist/hooks/hooks-status.js +1 -1
- package/dist/hooks/install.js +2 -2
- package/dist/hooks/loader.js +1 -1
- package/dist/hooks/workspace.js +3 -3
- package/dist/imessage/constants.js +2 -0
- package/dist/imessage/monitor/deliver.js +4 -1
- package/dist/imessage/monitor/monitor-provider.js +51 -1
- package/dist/index.js +2 -2
- package/dist/infra/bonjour-discovery.js +131 -70
- package/dist/infra/bonjour.js +3 -3
- package/dist/infra/control-ui-assets.js +134 -12
- package/dist/infra/errors.js +12 -0
- package/dist/infra/exec-approvals.js +266 -57
- package/dist/infra/format-time/format-datetime.js +79 -0
- package/dist/infra/format-time/format-duration.js +81 -0
- package/dist/infra/format-time/format-relative.js +80 -0
- package/dist/infra/heartbeat-runner.js +140 -49
- package/dist/infra/home-dir.js +54 -0
- package/dist/infra/net/fetch-guard.js +122 -0
- package/dist/infra/net/ssrf.js +65 -29
- package/dist/infra/outbound/abort.js +14 -0
- package/dist/infra/outbound/message-action-runner.js +77 -13
- package/dist/infra/outbound/outbound-session.js +143 -37
- package/dist/infra/path-env.js +3 -3
- package/dist/infra/poolbot-root.js +43 -1
- package/dist/infra/provider-usage.fetch.minimax.js +1 -1
- package/dist/infra/restart.js +1 -1
- package/dist/infra/session-cost-usage.js +631 -41
- package/dist/infra/state-migrations.js +317 -47
- package/dist/infra/tailscale.js +1 -1
- package/dist/infra/update-global.js +35 -0
- package/dist/infra/update-runner.js +149 -43
- package/dist/infra/warning-filter.js +65 -0
- package/dist/infra/widearea-dns.js +30 -9
- package/dist/logging/redact-identifier.js +12 -0
- package/dist/macos/relay.js +2 -2
- package/dist/media/fetch.js +81 -58
- package/dist/media/input-files.js +1 -1
- package/dist/media/mime.js +4 -0
- package/dist/media/png-encode.js +74 -0
- package/dist/media-understanding/apply.js +403 -3
- package/dist/media-understanding/attachments.js +38 -27
- package/dist/media-understanding/defaults.js +16 -0
- package/dist/media-understanding/providers/deepgram/audio.js +22 -14
- package/dist/media-understanding/providers/google/audio.js +24 -17
- package/dist/media-understanding/providers/google/video.js +24 -17
- package/dist/media-understanding/providers/image.js +4 -4
- package/dist/media-understanding/providers/index.js +4 -1
- package/dist/media-understanding/providers/openai/audio.js +22 -14
- package/dist/media-understanding/providers/shared.js +16 -11
- package/dist/media-understanding/providers/zai/index.js +6 -0
- package/dist/media-understanding/runner.js +158 -90
- package/dist/memory/backend-config.js +207 -0
- package/dist/memory/batch-voyage.js +277 -0
- package/dist/memory/embeddings-voyage.js +75 -0
- package/dist/memory/embeddings.js +29 -17
- package/dist/memory/internal.js +101 -18
- package/dist/memory/manager.js +155 -48
- package/dist/memory/search-manager.js +173 -0
- package/dist/memory/session-files.js +9 -3
- package/dist/memory/types.js +1 -0
- package/dist/node-host/runner.js +36 -26
- package/dist/node-host/with-timeout.js +27 -0
- package/dist/pairing/pairing-messages.js +1 -1
- package/dist/plugins/commands.js +5 -1
- package/dist/plugins/config-state.js +86 -7
- package/dist/plugins/discovery.js +1 -1
- package/dist/plugins/install.js +2 -2
- package/dist/plugins/source-display.js +51 -0
- package/dist/plugins/update.js +1 -1
- package/dist/process/exec.js +20 -2
- package/dist/routing/resolve-route.js +12 -0
- package/dist/routing/session-key.js +15 -0
- package/dist/runtime.js +2 -0
- package/dist/security/audit-extra.async.js +601 -0
- package/dist/security/audit-extra.js +2 -830
- package/dist/security/audit-extra.sync.js +505 -0
- package/dist/security/audit.js +2 -2
- package/dist/security/channel-metadata.js +34 -0
- package/dist/security/external-content.js +88 -6
- package/dist/security/skill-scanner.js +330 -0
- package/dist/sessions/session-key-utils.js +7 -0
- package/dist/shared/text/reasoning-tags.js +52 -7
- package/dist/signal/monitor/event-handler.js +80 -1
- package/dist/slack/monitor/media.js +85 -15
- package/dist/tailscale/detect.js +145 -0
- package/dist/telegram/bot/helpers.js +109 -28
- package/dist/telegram/bot-handlers.js +144 -3
- package/dist/telegram/bot-message-context.js +38 -11
- package/dist/telegram/bot-message-dispatch.js +48 -15
- package/dist/telegram/bot-native-commands.js +86 -29
- package/dist/telegram/bot.js +30 -29
- package/dist/telegram/model-buttons.js +163 -0
- package/dist/telegram/monitor.js +110 -85
- package/dist/telegram/send.js +129 -47
- package/dist/terminal/restore.js +45 -0
- package/dist/test-helpers/state-dir-env.js +16 -0
- package/dist/test-helpers/workspace.js +11 -0
- package/dist/test-utils/channel-plugins.js +82 -0
- package/dist/test-utils/ports.js +73 -0
- package/dist/tts/tts.js +12 -6
- package/dist/tui/tui-session-actions.js +166 -54
- package/dist/utils/fetch-timeout.js +20 -0
- package/dist/utils/normalize-secret-input.js +19 -0
- package/dist/utils/shell-argv.js +61 -0
- package/dist/utils/transcript-tools.js +58 -0
- package/dist/utils.js +55 -14
- package/dist/version.js +42 -5
- package/dist/web/qr-image.js +1 -61
- package/dist/wizard/onboarding.finalize.js +7 -7
- package/dist/wizard/onboarding.js +3 -3
- package/docs/RELEASE_WORKFOTS_COMPARISON.md +3 -3
- package/docs/_config.yml +2 -2
- package/docs/_layouts/default.html +9 -9
- package/docs/concepts/typebox.md +1 -1
- package/docs/docs.json +1 -1
- package/docs/northflank.mdx +7 -7
- package/docs/railway.mdx +3 -3
- package/docs/render.mdx +5 -5
- package/docs/start/lore.md +2 -2
- package/extensions/bluebubbles/index.ts +2 -2
- package/extensions/bluebubbles/package.json +1 -1
- package/extensions/bluebubbles/src/accounts.ts +8 -8
- package/extensions/bluebubbles/src/actions.test.ts +22 -22
- package/extensions/bluebubbles/src/actions.ts +5 -5
- package/extensions/bluebubbles/src/attachments.ts +2 -2
- package/extensions/bluebubbles/src/channel.ts +16 -16
- package/extensions/bluebubbles/src/chat.ts +2 -2
- package/extensions/bluebubbles/src/media-send.ts +2 -2
- package/extensions/bluebubbles/src/monitor.test.ts +46 -46
- package/extensions/bluebubbles/src/monitor.ts +5 -5
- package/extensions/bluebubbles/src/onboarding.ts +7 -7
- package/extensions/bluebubbles/src/reactions.ts +2 -2
- package/extensions/bluebubbles/src/send.ts +2 -2
- package/extensions/copilot-proxy/README.md +1 -1
- package/extensions/copilot-proxy/package.json +1 -1
- package/extensions/diagnostics-otel/index.ts +2 -2
- package/extensions/diagnostics-otel/package.json +1 -1
- package/extensions/diagnostics-otel/src/service.ts +3 -3
- package/extensions/discord/index.ts +2 -2
- package/extensions/discord/package.json +1 -1
- package/extensions/google-antigravity-auth/README.md +1 -1
- package/extensions/google-antigravity-auth/index.ts +1 -1
- package/extensions/google-antigravity-auth/package.json +1 -1
- package/extensions/google-gemini-cli-auth/README.md +1 -1
- package/extensions/google-gemini-cli-auth/oauth.ts +1 -1
- package/extensions/google-gemini-cli-auth/package.json +1 -1
- package/extensions/googlechat/index.ts +3 -3
- package/extensions/googlechat/package.json +1 -1
- package/extensions/googlechat/src/accounts.ts +8 -8
- package/extensions/googlechat/src/actions.ts +6 -6
- package/extensions/googlechat/src/channel.ts +21 -21
- package/extensions/googlechat/src/monitor.ts +8 -8
- package/extensions/googlechat/src/onboarding.ts +10 -10
- package/extensions/imessage/index.ts +2 -2
- package/extensions/imessage/package.json +1 -1
- package/extensions/line/index.ts +2 -2
- package/extensions/line/package.json +1 -1
- package/extensions/line/src/card-command.ts +2 -2
- 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 +3 -3
- package/extensions/llm-task/README.md +3 -3
- package/extensions/llm-task/index.ts +2 -2
- package/extensions/llm-task/package.json +1 -1
- package/extensions/llm-task/src/llm-task-tool.ts +4 -4
- package/extensions/lobster/README.md +6 -6
- package/extensions/lobster/index.ts +2 -2
- package/extensions/lobster/src/lobster-tool.test.ts +4 -4
- package/extensions/lobster/src/lobster-tool.ts +2 -2
- package/extensions/matrix/index.ts +2 -2
- package/extensions/matrix/package.json +1 -1
- package/extensions/matrix/src/matrix/client/config.ts +1 -1
- package/extensions/matrix/src/matrix/monitor/handler.ts +1 -1
- package/extensions/matrix/src/onboarding.ts +1 -1
- package/extensions/mattermost/index.ts +2 -2
- package/extensions/mattermost/package.json +1 -1
- package/extensions/mattermost/src/mattermost/accounts.ts +8 -8
- package/extensions/mattermost/src/mattermost/monitor-helpers.ts +5 -5
- package/extensions/mattermost/src/mattermost/monitor.ts +2 -2
- package/extensions/mattermost/src/onboarding-helpers.ts +3 -3
- package/extensions/mattermost/src/onboarding.ts +2 -2
- package/extensions/memory-core/index.ts +2 -2
- package/extensions/memory-core/package.json +1 -1
- package/extensions/memory-lancedb/index.ts +3 -3
- package/extensions/memory-lancedb/package.json +1 -1
- package/extensions/msteams/index.ts +2 -2
- package/extensions/msteams/package.json +1 -1
- package/extensions/msteams/src/channel.directory.test.ts +2 -2
- package/extensions/msteams/src/channel.ts +2 -2
- package/extensions/msteams/src/graph-upload.ts +4 -4
- package/extensions/msteams/src/monitor-handler.ts +2 -2
- package/extensions/msteams/src/monitor.ts +2 -2
- package/extensions/msteams/src/onboarding.ts +9 -9
- package/extensions/msteams/src/reply-dispatcher.ts +2 -2
- package/extensions/msteams/src/send-context.ts +2 -2
- package/extensions/msteams/src/send.ts +4 -4
- package/extensions/nextcloud-talk/index.ts +2 -2
- package/extensions/nextcloud-talk/package.json +1 -1
- package/extensions/nextcloud-talk/src/channel.ts +7 -7
- package/extensions/nextcloud-talk/src/inbound.ts +7 -7
- package/extensions/nextcloud-talk/src/onboarding.ts +1 -1
- package/extensions/nostr/README.md +2 -2
- package/extensions/nostr/index.ts +5 -5
- package/extensions/nostr/package.json +1 -1
- package/extensions/nostr/src/types.ts +4 -4
- package/extensions/open-prose/index.ts +2 -2
- package/extensions/qwen-portal-auth/README.md +1 -1
- package/extensions/signal/index.ts +2 -2
- package/extensions/signal/package.json +1 -1
- package/extensions/slack/index.ts +2 -2
- package/extensions/slack/package.json +1 -1
- package/extensions/telegram/index.ts +2 -2
- package/extensions/telegram/package.json +1 -1
- package/extensions/telegram/src/channel.ts +2 -2
- package/extensions/tlon/README.md +2 -2
- package/extensions/tlon/index.ts +2 -2
- package/extensions/tlon/package.json +1 -1
- package/extensions/tlon/src/channel.ts +13 -13
- package/extensions/tlon/src/monitor/index.ts +3 -3
- package/extensions/tlon/src/onboarding.ts +3 -3
- package/extensions/tlon/src/types.ts +3 -3
- package/extensions/twitch/README.md +1 -1
- package/extensions/twitch/index.ts +2 -2
- package/extensions/twitch/package.json +1 -1
- package/extensions/twitch/src/config.ts +3 -3
- package/extensions/twitch/src/monitor.ts +3 -3
- package/extensions/twitch/src/onboarding.ts +9 -9
- package/extensions/twitch/src/outbound.test.ts +2 -2
- package/extensions/twitch/src/plugin.test.ts +2 -2
- package/extensions/twitch/src/plugin.ts +8 -8
- package/extensions/twitch/src/send.test.ts +2 -2
- package/extensions/twitch/src/send.ts +4 -4
- package/extensions/twitch/src/token.test.ts +8 -8
- package/extensions/twitch/src/token.ts +3 -3
- package/extensions/twitch/src/twitch-client.ts +3 -3
- package/extensions/twitch/src/types.ts +3 -3
- package/extensions/twitch/src/utils/markdown.ts +1 -1
- package/extensions/voice-call/README.md +3 -3
- package/extensions/voice-call/package.json +1 -1
- package/extensions/voice-call/src/core-bridge.ts +2 -2
- package/extensions/voice-call/src/response-generator.ts +1 -1
- package/extensions/whatsapp/index.ts +2 -2
- package/extensions/whatsapp/package.json +1 -1
- package/extensions/zalo/README.md +1 -1
- package/extensions/zalo/index.ts +2 -2
- package/extensions/zalo/package.json +1 -1
- package/extensions/zalo/src/accounts.ts +8 -8
- package/extensions/zalo/src/actions.ts +4 -4
- package/extensions/zalo/src/channel.directory.test.ts +2 -2
- package/extensions/zalo/src/channel.ts +18 -18
- package/extensions/zalo/src/monitor.ts +9 -9
- package/extensions/zalo/src/monitor.webhook.test.ts +2 -2
- package/extensions/zalo/src/onboarding.ts +24 -24
- package/extensions/zalo/src/send.ts +2 -2
- package/extensions/zalouser/README.md +2 -2
- package/extensions/zalouser/index.ts +2 -2
- package/extensions/zalouser/package.json +1 -1
- package/extensions/zalouser/src/accounts.ts +9 -9
- package/extensions/zalouser/src/channel.ts +24 -24
- package/extensions/zalouser/src/monitor.ts +4 -4
- package/extensions/zalouser/src/onboarding.ts +28 -28
- package/package.json +13 -251
- package/skills/nano-banana-pro/scripts/generate_image.py +1 -1
- package/skills/tmux/scripts/find-sessions.sh +1 -1
- package/CHANGELOG.md +0 -102
- package/README-header.png +0 -0
- package/git-hooks/pre-commit +0 -4
- package/scripts/format-staged.js +0 -148
- package/scripts/postinstall.js +0 -300
- package/scripts/setup-git-hooks.js +0 -96
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Pool-Bot Chrome Extension (Browser Relay)
|
|
2
2
|
|
|
3
|
-
Purpose: attach
|
|
3
|
+
Purpose: attach Pool-Bot to an existing Chrome tab so the Gateway can automate it (via the local CDP relay server).
|
|
4
4
|
|
|
5
5
|
## Dev / load unpacked
|
|
6
6
|
|
|
7
|
-
1. Build/run
|
|
7
|
+
1. Build/run Pool-Bot Gateway with browser control enabled.
|
|
8
8
|
2. Ensure the relay server is reachable at `http://127.0.0.1:18792/` (default).
|
|
9
9
|
3. Install the extension to a stable path:
|
|
10
10
|
|
|
@@ -114,7 +114,7 @@ function onRelayClosed(reason) {
|
|
|
114
114
|
setBadge(tabId, 'connecting')
|
|
115
115
|
void chrome.action.setTitle({
|
|
116
116
|
tabId,
|
|
117
|
-
title: '
|
|
117
|
+
title: 'Poolbot Browser Relay: disconnected (click to re-attach)',
|
|
118
118
|
})
|
|
119
119
|
}
|
|
120
120
|
tabs.clear()
|
|
@@ -225,7 +225,7 @@ async function attachTab(tabId, opts = {}) {
|
|
|
225
225
|
tabBySession.set(sessionId, tabId)
|
|
226
226
|
void chrome.action.setTitle({
|
|
227
227
|
tabId,
|
|
228
|
-
title: '
|
|
228
|
+
title: 'Poolbot Browser Relay: attached (click to detach)',
|
|
229
229
|
})
|
|
230
230
|
|
|
231
231
|
if (!opts.skipAttachedEvent) {
|
|
@@ -278,7 +278,7 @@ async function detachTab(tabId, reason) {
|
|
|
278
278
|
setBadge(tabId, 'off')
|
|
279
279
|
void chrome.action.setTitle({
|
|
280
280
|
tabId,
|
|
281
|
-
title: '
|
|
281
|
+
title: 'Poolbot Browser Relay (click to attach/detach)',
|
|
282
282
|
})
|
|
283
283
|
}
|
|
284
284
|
|
|
@@ -297,7 +297,7 @@ async function connectOrToggleForActiveTab() {
|
|
|
297
297
|
setBadge(tabId, 'connecting')
|
|
298
298
|
void chrome.action.setTitle({
|
|
299
299
|
tabId,
|
|
300
|
-
title: '
|
|
300
|
+
title: 'Poolbot Browser Relay: connecting to local relay…',
|
|
301
301
|
})
|
|
302
302
|
|
|
303
303
|
try {
|
|
@@ -308,7 +308,7 @@ async function connectOrToggleForActiveTab() {
|
|
|
308
308
|
setBadge(tabId, 'error')
|
|
309
309
|
void chrome.action.setTitle({
|
|
310
310
|
tabId,
|
|
311
|
-
title: '
|
|
311
|
+
title: 'Poolbot Browser Relay: relay not running (open options for setup)',
|
|
312
312
|
})
|
|
313
313
|
void maybeOpenHelpOnce()
|
|
314
314
|
// Extra breadcrumbs in chrome://extensions service worker logs.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"manifest_version": 3,
|
|
3
|
-
"name": "
|
|
3
|
+
"name": "Poolbot Browser Relay",
|
|
4
4
|
"version": "0.1.0",
|
|
5
|
-
"description": "Attach
|
|
5
|
+
"description": "Attach Poolbot to your existing Chrome tab via a local CDP relay server.",
|
|
6
6
|
"icons": {
|
|
7
7
|
"16": "icons/icon16.png",
|
|
8
8
|
"32": "icons/icon32.png",
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
"host_permissions": ["http://127.0.0.1/*", "http://localhost/*"],
|
|
14
14
|
"background": { "service_worker": "background.js", "type": "module" },
|
|
15
15
|
"action": {
|
|
16
|
-
"default_title": "
|
|
16
|
+
"default_title": "Poolbot Browser Relay (click to attach/detach)",
|
|
17
17
|
"default_icon": {
|
|
18
18
|
"16": "icons/icon16.png",
|
|
19
19
|
"32": "icons/icon32.png",
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="utf-8" />
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1" />
|
|
6
|
-
<title>
|
|
6
|
+
<title>Poolbot Browser Relay</title>
|
|
7
7
|
<style>
|
|
8
8
|
:root {
|
|
9
9
|
color-scheme: light dark;
|
|
@@ -158,7 +158,7 @@
|
|
|
158
158
|
<img src="icons/icon128.png" alt="" />
|
|
159
159
|
</div>
|
|
160
160
|
<div>
|
|
161
|
-
<h1>
|
|
161
|
+
<h1>Poolbot Browser Relay</h1>
|
|
162
162
|
<p class="subtitle">Click the toolbar button on a tab to attach / detach.</p>
|
|
163
163
|
</div>
|
|
164
164
|
</header>
|
|
@@ -168,7 +168,7 @@
|
|
|
168
168
|
<h2>Getting started</h2>
|
|
169
169
|
<p>
|
|
170
170
|
If you see a red <code>!</code> badge on the extension icon, the relay server is not reachable.
|
|
171
|
-
Start
|
|
171
|
+
Start Poolbot’s browser relay on this machine (Gateway or node host), then click the toolbar button again.
|
|
172
172
|
</p>
|
|
173
173
|
<p>
|
|
174
174
|
Full guide (install, remote Gateway, security): <a href="https://docs.molt.bot/tools/chrome-extension" target="_blank" rel="noreferrer">docs.molt.bot/tools/chrome-extension</a>
|
|
@@ -184,7 +184,7 @@
|
|
|
184
184
|
</div>
|
|
185
185
|
<div class="hint">
|
|
186
186
|
Default: <code>18792</code>. Extension connects to: <code id="relay-url">http://127.0.0.1:<port>/</code>.
|
|
187
|
-
Only change this if your
|
|
187
|
+
Only change this if your Poolbot profile uses a different <code>cdpUrl</code> port.
|
|
188
188
|
</div>
|
|
189
189
|
<div class="status" id="status"></div>
|
|
190
190
|
</div>
|
|
@@ -31,7 +31,7 @@ async function checkRelayReachable(port) {
|
|
|
31
31
|
} catch {
|
|
32
32
|
setStatus(
|
|
33
33
|
'error',
|
|
34
|
-
`Relay not reachable at ${url}. Start
|
|
34
|
+
`Relay not reachable at ${url}. Start Poolbot’s browser relay on this machine, then click the toolbar button again.`,
|
|
35
35
|
)
|
|
36
36
|
} finally {
|
|
37
37
|
clearTimeout(t)
|
package/dist/acp/client.js
CHANGED
|
@@ -2,7 +2,7 @@ import { spawn } from "node:child_process";
|
|
|
2
2
|
import * as readline from "node:readline";
|
|
3
3
|
import { Readable, Writable } from "node:stream";
|
|
4
4
|
import { ClientSideConnection, PROTOCOL_VERSION, ndJsonStream, } from "@agentclientprotocol/sdk";
|
|
5
|
-
import {
|
|
5
|
+
import { ensurePoolbotCliOnPath } from "../infra/path-env.js";
|
|
6
6
|
function toArgs(value) {
|
|
7
7
|
if (!value)
|
|
8
8
|
return [];
|
|
@@ -50,7 +50,7 @@ export async function createAcpClient(opts = {}) {
|
|
|
50
50
|
const cwd = opts.cwd ?? process.cwd();
|
|
51
51
|
const verbose = Boolean(opts.verbose);
|
|
52
52
|
const log = verbose ? (msg) => console.error(`[acp-client] ${msg}`) : () => { };
|
|
53
|
-
|
|
53
|
+
ensurePoolbotCliOnPath({ cwd });
|
|
54
54
|
const serverCommand = opts.serverCommand ?? "poolbot";
|
|
55
55
|
const serverArgs = buildServerArgs(opts);
|
|
56
56
|
log(`spawning: ${serverCommand} ${serverArgs.join(" ")}`);
|
|
@@ -107,7 +107,7 @@ export async function runAcpClientInteractive(opts = {}) {
|
|
|
107
107
|
input: process.stdin,
|
|
108
108
|
output: process.stdout,
|
|
109
109
|
});
|
|
110
|
-
console.log("
|
|
110
|
+
console.log("Poolbot ACP client");
|
|
111
111
|
console.log(`Session: ${sessionId}`);
|
|
112
112
|
console.log('Type a prompt, or "exit" to quit.\n');
|
|
113
113
|
const prompt = () => {
|
package/dist/acp/types.js
CHANGED
|
@@ -2,15 +2,15 @@ import path from "node:path";
|
|
|
2
2
|
import { resolveStateDir } from "../config/paths.js";
|
|
3
3
|
import { DEFAULT_AGENT_ID } from "../routing/session-key.js";
|
|
4
4
|
import { resolveUserPath } from "../utils.js";
|
|
5
|
-
export function
|
|
5
|
+
export function resolvePoolbotAgentDir() {
|
|
6
6
|
const override = process.env.CLAWDBOT_AGENT_DIR?.trim() || process.env.PI_CODING_AGENT_DIR?.trim();
|
|
7
7
|
if (override)
|
|
8
8
|
return resolveUserPath(override);
|
|
9
9
|
const defaultAgentDir = path.join(resolveStateDir(), "agents", DEFAULT_AGENT_ID, "agent");
|
|
10
10
|
return resolveUserPath(defaultAgentDir);
|
|
11
11
|
}
|
|
12
|
-
export function
|
|
13
|
-
const dir =
|
|
12
|
+
export function ensurePoolbotAgentEnv() {
|
|
13
|
+
const dir = resolvePoolbotAgentDir();
|
|
14
14
|
if (!process.env.CLAWDBOT_AGENT_DIR)
|
|
15
15
|
process.env.CLAWDBOT_AGENT_DIR = dir;
|
|
16
16
|
if (!process.env.PI_CODING_AGENT_DIR)
|
|
@@ -2,14 +2,14 @@ import fs from "node:fs";
|
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { saveJsonFile } from "../../infra/json-file.js";
|
|
4
4
|
import { resolveUserPath } from "../../utils.js";
|
|
5
|
-
import {
|
|
5
|
+
import { resolvePoolbotAgentDir } from "../agent-paths.js";
|
|
6
6
|
import { AUTH_PROFILE_FILENAME, AUTH_STORE_VERSION, LEGACY_AUTH_FILENAME } from "./constants.js";
|
|
7
7
|
export function resolveAuthStorePath(agentDir) {
|
|
8
|
-
const resolved = resolveUserPath(agentDir ??
|
|
8
|
+
const resolved = resolveUserPath(agentDir ?? resolvePoolbotAgentDir());
|
|
9
9
|
return path.join(resolved, AUTH_PROFILE_FILENAME);
|
|
10
10
|
}
|
|
11
11
|
export function resolveLegacyAuthStorePath(agentDir) {
|
|
12
|
-
const resolved = resolveUserPath(agentDir ??
|
|
12
|
+
const resolved = resolveUserPath(agentDir ?? resolvePoolbotAgentDir());
|
|
13
13
|
return path.join(resolved, LEGACY_AUTH_FILENAME);
|
|
14
14
|
}
|
|
15
15
|
export function resolveAuthStorePathForDisplay(agentDir) {
|
|
@@ -15,6 +15,46 @@ import { listNodes, resolveNodeIdFromList } from "./tools/nodes-utils.js";
|
|
|
15
15
|
import { getShellConfig, sanitizeBinaryOutput } from "./shell-utils.js";
|
|
16
16
|
import { buildCursorPositionResponse, stripDsrRequests } from "./pty-dsr.js";
|
|
17
17
|
import { parseAgentSessionKey, resolveAgentIdFromSessionKey } from "../routing/session-key.js";
|
|
18
|
+
// Security: Blocklist of environment variables that could alter execution flow
|
|
19
|
+
// or inject code when running on non-sandboxed hosts (Gateway/Node).
|
|
20
|
+
const DANGEROUS_HOST_ENV_VARS = new Set([
|
|
21
|
+
"LD_PRELOAD",
|
|
22
|
+
"LD_LIBRARY_PATH",
|
|
23
|
+
"LD_AUDIT",
|
|
24
|
+
"DYLD_INSERT_LIBRARIES",
|
|
25
|
+
"DYLD_LIBRARY_PATH",
|
|
26
|
+
"NODE_OPTIONS",
|
|
27
|
+
"NODE_PATH",
|
|
28
|
+
"PYTHONPATH",
|
|
29
|
+
"PYTHONHOME",
|
|
30
|
+
"RUBYLIB",
|
|
31
|
+
"PERL5LIB",
|
|
32
|
+
"BASH_ENV",
|
|
33
|
+
"ENV",
|
|
34
|
+
"GCONV_PATH",
|
|
35
|
+
"IFS",
|
|
36
|
+
"SSLKEYLOGFILE",
|
|
37
|
+
]);
|
|
38
|
+
const DANGEROUS_HOST_ENV_PREFIXES = ["DYLD_", "LD_"];
|
|
39
|
+
// Centralized sanitization helper.
|
|
40
|
+
// Throws an error if dangerous variables or PATH modifications are detected on the host.
|
|
41
|
+
function validateHostEnv(env) {
|
|
42
|
+
for (const key of Object.keys(env)) {
|
|
43
|
+
const upperKey = key.toUpperCase();
|
|
44
|
+
// 1. Block known dangerous variables (Fail Closed)
|
|
45
|
+
if (DANGEROUS_HOST_ENV_PREFIXES.some((prefix) => upperKey.startsWith(prefix))) {
|
|
46
|
+
throw new Error(`Security Violation: Environment variable '${key}' is forbidden during host execution.`);
|
|
47
|
+
}
|
|
48
|
+
if (DANGEROUS_HOST_ENV_VARS.has(upperKey)) {
|
|
49
|
+
throw new Error(`Security Violation: Environment variable '${key}' is forbidden during host execution.`);
|
|
50
|
+
}
|
|
51
|
+
// 2. Strictly block PATH modification on host
|
|
52
|
+
// Allowing custom PATH on the gateway/node can lead to binary hijacking.
|
|
53
|
+
if (upperKey === "PATH") {
|
|
54
|
+
throw new Error("Security Violation: Custom 'PATH' variable is forbidden during host execution.");
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
18
58
|
const DEFAULT_MAX_OUTPUT = clampNumber(readEnvInt("PI_BASH_MAX_OUTPUT_CHARS"), 200_000, 1_000, 200_000);
|
|
19
59
|
const DEFAULT_PENDING_MAX_OUTPUT = clampNumber(readEnvInt("CLAWDBOT_BASH_PENDING_MAX_OUTPUT_CHARS"), 200_000, 1_000, 200_000);
|
|
20
60
|
const DEFAULT_PATH = process.env.PATH ?? "/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin";
|
|
@@ -643,6 +683,11 @@ export function createExecTool(defaults) {
|
|
|
643
683
|
workdir = resolveWorkdir(rawWorkdir, warnings);
|
|
644
684
|
}
|
|
645
685
|
const baseEnv = coerceEnv(process.env);
|
|
686
|
+
// Logic: Sandbox gets raw env. Host (gateway/node) must pass validation.
|
|
687
|
+
// We validate BEFORE merging to prevent any dangerous vars from entering the stream.
|
|
688
|
+
if (host !== "sandbox" && params.env) {
|
|
689
|
+
validateHostEnv(params.env);
|
|
690
|
+
}
|
|
646
691
|
const mergedEnv = params.env ? { ...baseEnv, ...params.env } : baseEnv;
|
|
647
692
|
const env = sandbox
|
|
648
693
|
? buildSandboxEnv({
|
|
@@ -684,7 +729,7 @@ export function createExecTool(defaults) {
|
|
|
684
729
|
}
|
|
685
730
|
catch (err) {
|
|
686
731
|
if (!nodeQuery && String(err).includes("node required")) {
|
|
687
|
-
throw new Error("exec host=node requires a node id when multiple nodes are available (set tools.exec.node or exec.node).");
|
|
732
|
+
throw new Error("exec host=node requires a node id when multiple nodes are available (set tools.exec.node or exec.node).", { cause: err });
|
|
688
733
|
}
|
|
689
734
|
throw err;
|
|
690
735
|
}
|
|
@@ -706,12 +751,13 @@ export function createExecTool(defaults) {
|
|
|
706
751
|
safeBins: new Set(),
|
|
707
752
|
cwd: workdir,
|
|
708
753
|
env,
|
|
754
|
+
platform: nodeInfo?.platform,
|
|
709
755
|
});
|
|
710
756
|
let analysisOk = baseAllowlistEval.analysisOk;
|
|
711
757
|
let allowlistSatisfied = false;
|
|
712
758
|
if (hostAsk === "on-miss" && hostSecurity === "allowlist" && analysisOk) {
|
|
713
759
|
try {
|
|
714
|
-
const approvalsSnapshot =
|
|
760
|
+
const approvalsSnapshot = await callGatewayTool("exec.approvals.node.get", { timeoutMs: 10_000 }, { nodeId });
|
|
715
761
|
const approvalsFile = approvalsSnapshot && typeof approvalsSnapshot === "object"
|
|
716
762
|
? approvalsSnapshot.file
|
|
717
763
|
: undefined;
|
|
@@ -728,6 +774,7 @@ export function createExecTool(defaults) {
|
|
|
728
774
|
safeBins: new Set(),
|
|
729
775
|
cwd: workdir,
|
|
730
776
|
env,
|
|
777
|
+
platform: nodeInfo?.platform,
|
|
731
778
|
});
|
|
732
779
|
allowlistSatisfied = allowlistEval.allowlistSatisfied;
|
|
733
780
|
analysisOk = allowlistEval.analysisOk;
|
|
@@ -772,7 +819,7 @@ export function createExecTool(defaults) {
|
|
|
772
819
|
void (async () => {
|
|
773
820
|
let decision = null;
|
|
774
821
|
try {
|
|
775
|
-
const decisionResult =
|
|
822
|
+
const decisionResult = await callGatewayTool("exec.approval.request", { timeoutMs: DEFAULT_APPROVAL_REQUEST_TIMEOUT_MS }, {
|
|
776
823
|
id: approvalId,
|
|
777
824
|
command: commandText,
|
|
778
825
|
cwd: workdir,
|
|
@@ -783,11 +830,11 @@ export function createExecTool(defaults) {
|
|
|
783
830
|
resolvedPath: undefined,
|
|
784
831
|
sessionKey: defaults?.sessionKey,
|
|
785
832
|
timeoutMs: DEFAULT_APPROVAL_TIMEOUT_MS,
|
|
786
|
-
})
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
833
|
+
});
|
|
834
|
+
const decisionValue = decisionResult && typeof decisionResult === "object"
|
|
835
|
+
? decisionResult.decision
|
|
836
|
+
: undefined;
|
|
837
|
+
decision = typeof decisionValue === "string" ? decisionValue : null;
|
|
791
838
|
}
|
|
792
839
|
catch {
|
|
793
840
|
emitExecSystemEvent(`Exec denied (node=${nodeId} id=${approvalId}, approval-request-failed): ${commandText}`, { sessionKey: notifySessionKey, contextKey });
|
|
@@ -861,20 +908,26 @@ export function createExecTool(defaults) {
|
|
|
861
908
|
};
|
|
862
909
|
}
|
|
863
910
|
const startedAt = Date.now();
|
|
864
|
-
const raw =
|
|
865
|
-
const payload = raw
|
|
911
|
+
const raw = await callGatewayTool("node.invoke", { timeoutMs: invokeTimeoutMs }, buildInvokeParams(false, null));
|
|
912
|
+
const payload = raw && typeof raw === "object" ? raw.payload : undefined;
|
|
913
|
+
const payloadObj = payload && typeof payload === "object" ? payload : {};
|
|
914
|
+
const stdout = typeof payloadObj.stdout === "string" ? payloadObj.stdout : "";
|
|
915
|
+
const stderr = typeof payloadObj.stderr === "string" ? payloadObj.stderr : "";
|
|
916
|
+
const errorText = typeof payloadObj.error === "string" ? payloadObj.error : "";
|
|
917
|
+
const success = typeof payloadObj.success === "boolean" ? payloadObj.success : false;
|
|
918
|
+
const exitCode = typeof payloadObj.exitCode === "number" ? payloadObj.exitCode : null;
|
|
866
919
|
return {
|
|
867
920
|
content: [
|
|
868
921
|
{
|
|
869
922
|
type: "text",
|
|
870
|
-
text:
|
|
923
|
+
text: stdout || stderr || errorText || "",
|
|
871
924
|
},
|
|
872
925
|
],
|
|
873
926
|
details: {
|
|
874
|
-
status:
|
|
875
|
-
exitCode
|
|
927
|
+
status: success ? "completed" : "failed",
|
|
928
|
+
exitCode,
|
|
876
929
|
durationMs: Date.now() - startedAt,
|
|
877
|
-
aggregated: [
|
|
930
|
+
aggregated: [stdout, stderr, errorText].filter(Boolean).join("\n"),
|
|
878
931
|
cwd: workdir,
|
|
879
932
|
},
|
|
880
933
|
};
|
|
@@ -893,6 +946,7 @@ export function createExecTool(defaults) {
|
|
|
893
946
|
safeBins,
|
|
894
947
|
cwd: workdir,
|
|
895
948
|
env,
|
|
949
|
+
platform: process.platform,
|
|
896
950
|
});
|
|
897
951
|
const allowlistMatches = allowlistEval.allowlistMatches;
|
|
898
952
|
const analysisOk = allowlistEval.analysisOk;
|
|
@@ -916,7 +970,7 @@ export function createExecTool(defaults) {
|
|
|
916
970
|
void (async () => {
|
|
917
971
|
let decision = null;
|
|
918
972
|
try {
|
|
919
|
-
const decisionResult =
|
|
973
|
+
const decisionResult = await callGatewayTool("exec.approval.request", { timeoutMs: DEFAULT_APPROVAL_REQUEST_TIMEOUT_MS }, {
|
|
920
974
|
id: approvalId,
|
|
921
975
|
command: commandText,
|
|
922
976
|
cwd: workdir,
|
|
@@ -927,11 +981,11 @@ export function createExecTool(defaults) {
|
|
|
927
981
|
resolvedPath,
|
|
928
982
|
sessionKey: defaults?.sessionKey,
|
|
929
983
|
timeoutMs: DEFAULT_APPROVAL_TIMEOUT_MS,
|
|
930
|
-
})
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
984
|
+
});
|
|
985
|
+
const decisionValue = decisionResult && typeof decisionResult === "object"
|
|
986
|
+
? decisionResult.decision
|
|
987
|
+
: undefined;
|
|
988
|
+
decision = typeof decisionValue === "string" ? decisionValue : null;
|
|
935
989
|
}
|
|
936
990
|
catch {
|
|
937
991
|
emitExecSystemEvent(`Exec denied (gateway id=${approvalId}, approval-request-failed): ${commandText}`, { sessionKey: notifySessionKey, contextKey });
|
|
@@ -1033,8 +1087,7 @@ export function createExecTool(defaults) {
|
|
|
1033
1087
|
content: [
|
|
1034
1088
|
{
|
|
1035
1089
|
type: "text",
|
|
1036
|
-
text: `${warningText}` +
|
|
1037
|
-
`Approval required (id ${approvalSlug}). ` +
|
|
1090
|
+
text: `${warningText}Approval required (id ${approvalSlug}). ` +
|
|
1038
1091
|
"Approve to run; updates will arrive after completion.",
|
|
1039
1092
|
},
|
|
1040
1093
|
],
|
|
@@ -1099,9 +1152,7 @@ export function createExecTool(defaults) {
|
|
|
1099
1152
|
content: [
|
|
1100
1153
|
{
|
|
1101
1154
|
type: "text",
|
|
1102
|
-
text: `${getWarningText()}
|
|
1103
|
-
`Command still running (session ${run.session.id}, pid ${run.session.pid ?? "n/a"}). ` +
|
|
1104
|
-
"Use process (list/poll/log/write/kill/clear/remove) for follow-up.",
|
|
1155
|
+
text: `${getWarningText()}Command still running (session ${run.session.id}, pid ${run.session.pid ?? "n/a"}). Use process (list/poll/log/write/kill/clear/remove) for follow-up.`,
|
|
1105
1156
|
},
|
|
1106
1157
|
],
|
|
1107
1158
|
details: {
|
|
@@ -3,14 +3,13 @@ import fs from "node:fs/promises";
|
|
|
3
3
|
import os from "node:os";
|
|
4
4
|
import path from "node:path";
|
|
5
5
|
import { runExec } from "../../process/exec.js";
|
|
6
|
-
import {
|
|
6
|
+
import { buildTtsSystemPromptHint } from "../../tts/tts.js";
|
|
7
|
+
import { escapeRegExp, isRecord } from "../../utils.js";
|
|
7
8
|
import { resolveDefaultModelForAgent } from "../model-selection.js";
|
|
9
|
+
import { detectRuntimeShell } from "../shell-utils.js";
|
|
10
|
+
import { buildSystemPromptParams } from "../system-prompt-params.js";
|
|
8
11
|
import { buildAgentSystemPrompt } from "../system-prompt.js";
|
|
9
|
-
import { buildTtsSystemPromptHint } from "../../tts/tts.js";
|
|
10
12
|
const CLI_RUN_QUEUE = new Map();
|
|
11
|
-
function escapeRegex(value) {
|
|
12
|
-
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
13
|
-
}
|
|
14
13
|
export async function cleanupResumeProcesses(backend, sessionId) {
|
|
15
14
|
if (process.platform === "win32")
|
|
16
15
|
return;
|
|
@@ -25,7 +24,7 @@ export async function cleanupResumeProcesses(backend, sessionId) {
|
|
|
25
24
|
const resumeTokens = resumeArgs.map((arg) => arg.replaceAll("{sessionId}", sessionId));
|
|
26
25
|
const pattern = [commandToken, ...resumeTokens]
|
|
27
26
|
.filter(Boolean)
|
|
28
|
-
.map((token) =>
|
|
27
|
+
.map((token) => escapeRegExp(token))
|
|
29
28
|
.join(".*");
|
|
30
29
|
if (!pattern)
|
|
31
30
|
return;
|
|
@@ -69,12 +68,12 @@ function buildSessionMatchers(backend) {
|
|
|
69
68
|
}
|
|
70
69
|
function tokenToRegex(token) {
|
|
71
70
|
if (!token.includes("{sessionId}"))
|
|
72
|
-
return
|
|
73
|
-
const parts = token.split("{sessionId}").map((part) =>
|
|
71
|
+
return escapeRegExp(token);
|
|
72
|
+
const parts = token.split("{sessionId}").map((part) => escapeRegExp(part));
|
|
74
73
|
return parts.join("\\S+");
|
|
75
74
|
}
|
|
76
75
|
/**
|
|
77
|
-
* Cleanup suspended
|
|
76
|
+
* Cleanup suspended Poolbot CLI processes that have accumulated.
|
|
78
77
|
* Only cleans up if there are more than the threshold (default: 10).
|
|
79
78
|
*/
|
|
80
79
|
export async function cleanupSuspendedCliProcesses(backend, threshold = 10) {
|
|
@@ -158,6 +157,7 @@ export function buildSystemPrompt(params) {
|
|
|
158
157
|
node: process.version,
|
|
159
158
|
model: params.modelDisplay,
|
|
160
159
|
defaultModel: defaultModelLabel,
|
|
160
|
+
shell: detectRuntimeShell(),
|
|
161
161
|
},
|
|
162
162
|
});
|
|
163
163
|
const ttsHint = params.config ? buildTtsSystemPromptHint(params.config) : undefined;
|
|
@@ -177,6 +177,7 @@ export function buildSystemPrompt(params) {
|
|
|
177
177
|
userTimeFormat,
|
|
178
178
|
contextFiles: params.contextFiles,
|
|
179
179
|
ttsHint,
|
|
180
|
+
memoryCitationsMode: params.config?.memory?.citations,
|
|
180
181
|
});
|
|
181
182
|
}
|
|
182
183
|
export function normalizeCliModel(modelId, backend) {
|
|
@@ -203,9 +204,6 @@ function toUsage(raw) {
|
|
|
203
204
|
return undefined;
|
|
204
205
|
return { input, output, cacheRead, cacheWrite, total };
|
|
205
206
|
}
|
|
206
|
-
function isRecord(value) {
|
|
207
|
-
return Boolean(value && typeof value === "object" && !Array.isArray(value));
|
|
208
|
-
}
|
|
209
207
|
function collectText(value) {
|
|
210
208
|
if (!value)
|
|
211
209
|
return "";
|
|
@@ -4,7 +4,7 @@ import { shouldLogVerbose } from "../globals.js";
|
|
|
4
4
|
import { createSubsystemLogger } from "../logging/subsystem.js";
|
|
5
5
|
import { runCommandWithTimeout } from "../process/exec.js";
|
|
6
6
|
import { resolveUserPath } from "../utils.js";
|
|
7
|
-
import {
|
|
7
|
+
import { resolvePoolbotDocsPath } from "./docs-path.js";
|
|
8
8
|
import { resolveSessionAgentIds } from "./agent-scope.js";
|
|
9
9
|
import { makeBootstrapWarn, resolveBootstrapContextForRun } from "./bootstrap-files.js";
|
|
10
10
|
import { resolveCliBackendConfig } from "./cli-backends.js";
|
|
@@ -45,7 +45,7 @@ export async function runCliAgent(params) {
|
|
|
45
45
|
const heartbeatPrompt = sessionAgentId === defaultAgentId
|
|
46
46
|
? resolveHeartbeatPrompt(params.config?.agents?.defaults?.heartbeat?.prompt)
|
|
47
47
|
: undefined;
|
|
48
|
-
const docsPath = await
|
|
48
|
+
const docsPath = await resolvePoolbotDocsPath({
|
|
49
49
|
workspaceDir,
|
|
50
50
|
argv1: process.argv[1],
|
|
51
51
|
cwd: process.cwd(),
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export const CLOUDFLARE_AI_GATEWAY_PROVIDER_ID = "cloudflare-ai-gateway";
|
|
2
|
+
export const CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_ID = "claude-sonnet-4-5";
|
|
3
|
+
export const CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_REF = `${CLOUDFLARE_AI_GATEWAY_PROVIDER_ID}/${CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_ID}`;
|
|
4
|
+
export const CLOUDFLARE_AI_GATEWAY_DEFAULT_CONTEXT_WINDOW = 200_000;
|
|
5
|
+
export const CLOUDFLARE_AI_GATEWAY_DEFAULT_MAX_TOKENS = 64_000;
|
|
6
|
+
export const CLOUDFLARE_AI_GATEWAY_DEFAULT_COST = {
|
|
7
|
+
input: 3,
|
|
8
|
+
output: 15,
|
|
9
|
+
cacheRead: 0.3,
|
|
10
|
+
cacheWrite: 3.75,
|
|
11
|
+
};
|
|
12
|
+
export function buildCloudflareAiGatewayModelDefinition(params) {
|
|
13
|
+
const id = params?.id?.trim() || CLOUDFLARE_AI_GATEWAY_DEFAULT_MODEL_ID;
|
|
14
|
+
return {
|
|
15
|
+
id,
|
|
16
|
+
name: params?.name ?? "Claude Sonnet 4.5",
|
|
17
|
+
reasoning: params?.reasoning ?? true,
|
|
18
|
+
input: params?.input ?? ["text", "image"],
|
|
19
|
+
cost: CLOUDFLARE_AI_GATEWAY_DEFAULT_COST,
|
|
20
|
+
contextWindow: CLOUDFLARE_AI_GATEWAY_DEFAULT_CONTEXT_WINDOW,
|
|
21
|
+
maxTokens: CLOUDFLARE_AI_GATEWAY_DEFAULT_MAX_TOKENS,
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
export function resolveCloudflareAiGatewayBaseUrl(params) {
|
|
25
|
+
const accountId = params.accountId.trim();
|
|
26
|
+
const gatewayId = params.gatewayId.trim();
|
|
27
|
+
if (!accountId || !gatewayId) {
|
|
28
|
+
return "";
|
|
29
|
+
}
|
|
30
|
+
return `https://gateway.ai.cloudflare.com/v1/${accountId}/${gatewayId}/anthropic`;
|
|
31
|
+
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { estimateTokens, generateSummary } from "@mariozechner/pi-coding-agent";
|
|
2
2
|
import { DEFAULT_CONTEXT_TOKENS } from "./defaults.js";
|
|
3
|
+
import { repairToolUseResultPairing } from "./session-transcript-repair.js";
|
|
3
4
|
export const BASE_CHUNK_RATIO = 0.4;
|
|
4
5
|
export const MIN_CHUNK_RATIO = 0.15;
|
|
5
6
|
export const SAFETY_MARGIN = 1.2; // 20% buffer for estimateTokens() inaccuracy
|
|
@@ -208,11 +209,24 @@ export function pruneHistoryForContextShare(params) {
|
|
|
208
209
|
if (chunks.length <= 1)
|
|
209
210
|
break;
|
|
210
211
|
const [dropped, ...rest] = chunks;
|
|
212
|
+
const flatRest = rest.flat();
|
|
213
|
+
// After dropping a chunk, repair tool_use/tool_result pairing to handle
|
|
214
|
+
// orphaned tool_results (whose tool_use was in the dropped chunk).
|
|
215
|
+
// repairToolUseResultPairing drops orphaned tool_results, preventing
|
|
216
|
+
// "unexpected tool_use_id" errors from Anthropic's API.
|
|
217
|
+
const repairReport = repairToolUseResultPairing(flatRest);
|
|
218
|
+
const repairedKept = repairReport.messages;
|
|
219
|
+
// Track orphaned tool_results as dropped (they were in kept but their tool_use was dropped)
|
|
220
|
+
const orphanedCount = repairReport.droppedOrphanCount;
|
|
211
221
|
droppedChunks += 1;
|
|
212
|
-
droppedMessages += dropped.length;
|
|
222
|
+
droppedMessages += dropped.length + orphanedCount;
|
|
213
223
|
droppedTokens += estimateMessagesTokens(dropped);
|
|
224
|
+
// Note: We don't have the actual orphaned messages to add to droppedMessagesList
|
|
225
|
+
// since repairToolUseResultPairing doesn't return them. This is acceptable since
|
|
226
|
+
// the dropped messages are used for summarization, and orphaned tool_results
|
|
227
|
+
// without their tool_use context aren't useful for summarization anyway.
|
|
214
228
|
allDroppedMessages.push(...dropped);
|
|
215
|
-
keptMessages =
|
|
229
|
+
keptMessages = repairedKept;
|
|
216
230
|
}
|
|
217
231
|
return {
|
|
218
232
|
messages: keptMessages,
|
|
@@ -1,15 +1,13 @@
|
|
|
1
1
|
export const CONTEXT_WINDOW_HARD_MIN_TOKENS = 16_000;
|
|
2
2
|
export const CONTEXT_WINDOW_WARN_BELOW_TOKENS = 32_000;
|
|
3
3
|
function normalizePositiveInt(value) {
|
|
4
|
-
if (typeof value !== "number" || !Number.isFinite(value))
|
|
4
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
5
5
|
return null;
|
|
6
|
+
}
|
|
6
7
|
const int = Math.floor(value);
|
|
7
8
|
return int > 0 ? int : null;
|
|
8
9
|
}
|
|
9
10
|
export function resolveContextWindowInfo(params) {
|
|
10
|
-
const fromModel = normalizePositiveInt(params.modelContextWindow);
|
|
11
|
-
if (fromModel)
|
|
12
|
-
return { tokens: fromModel, source: "model" };
|
|
13
11
|
const fromModelsConfig = (() => {
|
|
14
12
|
const providers = params.cfg?.models?.providers;
|
|
15
13
|
const providerEntry = providers?.[params.provider];
|
|
@@ -17,12 +15,17 @@ export function resolveContextWindowInfo(params) {
|
|
|
17
15
|
const match = models.find((m) => m?.id === params.modelId);
|
|
18
16
|
return normalizePositiveInt(match?.contextWindow);
|
|
19
17
|
})();
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
18
|
+
const fromModel = normalizePositiveInt(params.modelContextWindow);
|
|
19
|
+
const baseInfo = fromModelsConfig
|
|
20
|
+
? { tokens: fromModelsConfig, source: "modelsConfig" }
|
|
21
|
+
: fromModel
|
|
22
|
+
? { tokens: fromModel, source: "model" }
|
|
23
|
+
: { tokens: Math.floor(params.defaultTokens), source: "default" };
|
|
24
|
+
const capTokens = normalizePositiveInt(params.cfg?.agents?.defaults?.contextTokens);
|
|
25
|
+
if (capTokens && capTokens < baseInfo.tokens) {
|
|
26
|
+
return { tokens: capTokens, source: "agentContextTokens" };
|
|
27
|
+
}
|
|
28
|
+
return baseInfo;
|
|
26
29
|
}
|
|
27
30
|
export function evaluateContextWindowGuard(params) {
|
|
28
31
|
const warnBelow = Math.max(1, Math.floor(params.warnBelowTokens ?? CONTEXT_WINDOW_WARN_BELOW_TOKENS));
|
package/dist/agents/context.js
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
// Lazy-load pi-coding-agent model metadata so we can infer context windows when
|
|
2
2
|
// the agent reports a model id. This includes custom models.json entries.
|
|
3
3
|
import { loadConfig } from "../config/config.js";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { resolvePoolbotAgentDir } from "./agent-paths.js";
|
|
5
|
+
import { ensurePoolbotModelsJson } from "./models-config.js";
|
|
6
6
|
const MODEL_CACHE = new Map();
|
|
7
7
|
const loadPromise = (async () => {
|
|
8
8
|
try {
|
|
9
9
|
const { discoverAuthStorage, discoverModels } = await import("@mariozechner/pi-coding-agent");
|
|
10
10
|
const cfg = loadConfig();
|
|
11
|
-
await
|
|
12
|
-
const agentDir =
|
|
11
|
+
await ensurePoolbotModelsJson(cfg);
|
|
12
|
+
const agentDir = resolvePoolbotAgentDir();
|
|
13
13
|
const authStorage = discoverAuthStorage(agentDir);
|
|
14
14
|
const modelRegistry = discoverModels(authStorage, agentDir);
|
|
15
15
|
const models = modelRegistry.getAll();
|
package/dist/agents/docs-path.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import fs from "node:fs";
|
|
2
2
|
import path from "node:path";
|
|
3
3
|
import { resolvePoolBotPackageRoot } from "../infra/poolbot-root.js";
|
|
4
|
-
export async function
|
|
4
|
+
export async function resolvePoolbotDocsPath(params) {
|
|
5
5
|
const workspaceDir = params.workspaceDir?.trim();
|
|
6
6
|
if (workspaceDir) {
|
|
7
7
|
const workspaceDocs = path.join(workspaceDir, "docs");
|