@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,14 +1,14 @@
|
|
|
1
1
|
import { WebSocketServer } from "ws";
|
|
2
2
|
import { CANVAS_HOST_PATH } from "../canvas-host/a2ui.js";
|
|
3
3
|
import { createCanvasHostHandler } from "../canvas-host/server.js";
|
|
4
|
-
import { createGatewayHooksRequestHandler } from "./server/hooks.js";
|
|
5
|
-
import { listenGatewayHttpServer } from "./server/http-listen.js";
|
|
6
4
|
import { resolveGatewayListenHosts } from "./net.js";
|
|
7
|
-
import { createGatewayPluginRequestHandler } from "./server/plugins-http.js";
|
|
8
5
|
import { createGatewayBroadcaster } from "./server-broadcast.js";
|
|
9
|
-
import { createChatRunState } from "./server-chat.js";
|
|
6
|
+
import { createChatRunState, createToolEventRecipientRegistry, } from "./server-chat.js";
|
|
10
7
|
import { MAX_PAYLOAD_BYTES } from "./server-constants.js";
|
|
11
8
|
import { attachGatewayUpgradeHandler, createGatewayHttpServer } from "./server-http.js";
|
|
9
|
+
import { createGatewayHooksRequestHandler } from "./server/hooks.js";
|
|
10
|
+
import { listenGatewayHttpServer } from "./server/http-listen.js";
|
|
11
|
+
import { createGatewayPluginRequestHandler } from "./server/plugins-http.js";
|
|
12
12
|
export async function createGatewayRuntimeState(params) {
|
|
13
13
|
let canvasHost = null;
|
|
14
14
|
if (params.canvasHostEnabled) {
|
|
@@ -29,6 +29,10 @@ export async function createGatewayRuntimeState(params) {
|
|
|
29
29
|
params.logCanvas.warn(`canvas host failed to start: ${String(err)}`);
|
|
30
30
|
}
|
|
31
31
|
}
|
|
32
|
+
// Create clients set before HTTP server so it can be passed to both
|
|
33
|
+
// createGatewayHttpServer (for canvas auth) and attachGatewayUpgradeHandler
|
|
34
|
+
const clients = new Set();
|
|
35
|
+
const { broadcast, broadcastToConnIds } = createGatewayBroadcaster({ clients });
|
|
32
36
|
const handleHooksRequest = createGatewayHooksRequestHandler({
|
|
33
37
|
deps: params.deps,
|
|
34
38
|
getHooksConfig: params.hooksConfig,
|
|
@@ -46,8 +50,10 @@ export async function createGatewayRuntimeState(params) {
|
|
|
46
50
|
for (const host of bindHosts) {
|
|
47
51
|
const httpServer = createGatewayHttpServer({
|
|
48
52
|
canvasHost,
|
|
53
|
+
clients,
|
|
49
54
|
controlUiEnabled: params.controlUiEnabled,
|
|
50
55
|
controlUiBasePath: params.controlUiBasePath,
|
|
56
|
+
controlUiRoot: params.controlUiRoot,
|
|
51
57
|
openAiChatCompletionsEnabled: params.openAiChatCompletionsEnabled,
|
|
52
58
|
openResponsesEnabled: params.openResponsesEnabled,
|
|
53
59
|
openResponsesConfig: params.openResponsesConfig,
|
|
@@ -66,8 +72,9 @@ export async function createGatewayRuntimeState(params) {
|
|
|
66
72
|
httpBindHosts.push(host);
|
|
67
73
|
}
|
|
68
74
|
catch (err) {
|
|
69
|
-
if (host === bindHosts[0])
|
|
75
|
+
if (host === bindHosts[0]) {
|
|
70
76
|
throw err;
|
|
77
|
+
}
|
|
71
78
|
params.log.warn(`gateway: failed to bind loopback alias ${host}:${params.port} (${String(err)})`);
|
|
72
79
|
}
|
|
73
80
|
}
|
|
@@ -80,10 +87,14 @@ export async function createGatewayRuntimeState(params) {
|
|
|
80
87
|
maxPayload: MAX_PAYLOAD_BYTES,
|
|
81
88
|
});
|
|
82
89
|
for (const server of httpServers) {
|
|
83
|
-
attachGatewayUpgradeHandler({
|
|
90
|
+
attachGatewayUpgradeHandler({
|
|
91
|
+
httpServer: server,
|
|
92
|
+
wss,
|
|
93
|
+
canvasHost,
|
|
94
|
+
clients,
|
|
95
|
+
resolvedAuth: params.resolvedAuth,
|
|
96
|
+
});
|
|
84
97
|
}
|
|
85
|
-
const clients = new Set();
|
|
86
|
-
const { broadcast } = createGatewayBroadcaster({ clients });
|
|
87
98
|
const agentRunSeq = new Map();
|
|
88
99
|
const dedupe = new Map();
|
|
89
100
|
const chatRunState = createChatRunState();
|
|
@@ -93,6 +104,7 @@ export async function createGatewayRuntimeState(params) {
|
|
|
93
104
|
const addChatRun = chatRunRegistry.add;
|
|
94
105
|
const removeChatRun = chatRunRegistry.remove;
|
|
95
106
|
const chatAbortControllers = new Map();
|
|
107
|
+
const toolEventRecipients = createToolEventRecipientRegistry();
|
|
96
108
|
return {
|
|
97
109
|
canvasHost,
|
|
98
110
|
httpServer,
|
|
@@ -101,6 +113,7 @@ export async function createGatewayRuntimeState(params) {
|
|
|
101
113
|
wss,
|
|
102
114
|
clients,
|
|
103
115
|
broadcast,
|
|
116
|
+
broadcastToConnIds,
|
|
104
117
|
agentRunSeq,
|
|
105
118
|
dedupe,
|
|
106
119
|
chatRunState,
|
|
@@ -109,5 +122,6 @@ export async function createGatewayRuntimeState(params) {
|
|
|
109
122
|
addChatRun,
|
|
110
123
|
removeChatRun,
|
|
111
124
|
chatAbortControllers,
|
|
125
|
+
toolEventRecipients,
|
|
112
126
|
};
|
|
113
127
|
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { resolveDefaultAgentId } from "../agents/agent-scope.js";
|
|
2
|
+
import { resolveMemoryBackendConfig } from "../memory/backend-config.js";
|
|
3
|
+
import { getMemorySearchManager } from "../memory/index.js";
|
|
4
|
+
export async function startGatewayMemoryBackend(params) {
|
|
5
|
+
const agentId = resolveDefaultAgentId(params.cfg);
|
|
6
|
+
const resolved = resolveMemoryBackendConfig({ cfg: params.cfg, agentId });
|
|
7
|
+
if (resolved.backend !== "qmd" || !resolved.qmd) {
|
|
8
|
+
return;
|
|
9
|
+
}
|
|
10
|
+
const { manager, error } = await getMemorySearchManager({ cfg: params.cfg, agentId });
|
|
11
|
+
if (!manager) {
|
|
12
|
+
params.log.warn(`qmd memory startup initialization failed for agent "${agentId}": ${error ?? "unknown error"}`);
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
params.log.info?.(`qmd memory startup initialization armed for agent "${agentId}"`);
|
|
16
|
+
}
|
|
@@ -12,7 +12,7 @@ import { clearAgentRunContext, onAgentEvent } from "../infra/agent-events.js";
|
|
|
12
12
|
import { onHeartbeatEvent } from "../infra/heartbeat-events.js";
|
|
13
13
|
import { startHeartbeatRunner } from "../infra/heartbeat-runner.js";
|
|
14
14
|
import { getMachineDisplayName } from "../infra/machine-name.js";
|
|
15
|
-
import {
|
|
15
|
+
import { ensurePoolbotCliOnPath } from "../infra/path-env.js";
|
|
16
16
|
import { primeRemoteSkillsCache, refreshRemoteBinsForConnectedNodes, setSkillsRemoteRegistry, } from "../infra/skills-remote.js";
|
|
17
17
|
import { scheduleGatewayUpdateCheck } from "../infra/update-startup.js";
|
|
18
18
|
import { setGatewaySigusr1RestartPolicy } from "../infra/restart.js";
|
|
@@ -50,7 +50,7 @@ import { loadGatewayTlsRuntime } from "./server/tls.js";
|
|
|
50
50
|
import { createWizardSessionTracker } from "./server-wizard-sessions.js";
|
|
51
51
|
import { attachGatewayWsHandlers } from "./server-ws-runtime.js";
|
|
52
52
|
export { __resetModelCatalogCacheForTest } from "./server-model-catalog.js";
|
|
53
|
-
|
|
53
|
+
ensurePoolbotCliOnPath();
|
|
54
54
|
const log = createSubsystemLogger("gateway");
|
|
55
55
|
const logCanvas = log.child("canvas");
|
|
56
56
|
const logDiscovery = log.child("discovery");
|
|
@@ -156,7 +156,7 @@ export async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
156
156
|
if (cfgAtStart.gateway?.tls?.enabled && !gatewayTls.enabled) {
|
|
157
157
|
throw new Error(gatewayTls.error ?? "gateway tls: failed to enable");
|
|
158
158
|
}
|
|
159
|
-
const { canvasHost, httpServer, httpServers, httpBindHosts, wss, clients, broadcast, agentRunSeq, dedupe, chatRunState, chatRunBuffers, chatDeltaSentAt, addChatRun, removeChatRun, chatAbortControllers, } = await createGatewayRuntimeState({
|
|
159
|
+
const { canvasHost, httpServer, httpServers, httpBindHosts, wss, clients, broadcast, agentRunSeq, dedupe, chatRunState, chatRunBuffers, chatDeltaSentAt, addChatRun, removeChatRun, chatAbortControllers, broadcastToConnIds, toolEventRecipients, } = await createGatewayRuntimeState({
|
|
160
160
|
cfg: cfgAtStart,
|
|
161
161
|
bindHost,
|
|
162
162
|
port,
|
|
@@ -257,11 +257,13 @@ export async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
257
257
|
});
|
|
258
258
|
const agentUnsub = onAgentEvent(createAgentEventHandler({
|
|
259
259
|
broadcast,
|
|
260
|
+
broadcastToConnIds,
|
|
260
261
|
nodeSendToSession,
|
|
261
262
|
agentRunSeq,
|
|
262
263
|
chatRunState,
|
|
263
264
|
resolveSessionKeyForRun,
|
|
264
265
|
clearAgentRunContext,
|
|
266
|
+
toolEventRecipients,
|
|
265
267
|
}));
|
|
266
268
|
const heartbeatUnsub = onHeartbeatEvent((evt) => {
|
|
267
269
|
broadcast("heartbeat", evt, { dropIfSlow: true });
|
|
@@ -304,6 +306,7 @@ export async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
304
306
|
incrementPresenceVersion,
|
|
305
307
|
getHealthVersion,
|
|
306
308
|
broadcast,
|
|
309
|
+
broadcastToConnIds,
|
|
307
310
|
nodeSendToSession,
|
|
308
311
|
nodeSendToAllSubscribed,
|
|
309
312
|
nodeSubscribe,
|
|
@@ -318,6 +321,7 @@ export async function startGatewayServer(port = 18789, opts = {}) {
|
|
|
318
321
|
chatDeltaSentAt: chatRunState.deltaSentAt,
|
|
319
322
|
addChatRun,
|
|
320
323
|
removeChatRun,
|
|
324
|
+
registerToolEventRecipient: toolEventRecipients.add,
|
|
321
325
|
dedupe,
|
|
322
326
|
wizardSessions,
|
|
323
327
|
findRunningWizard,
|
|
@@ -2,6 +2,8 @@ import fs from "node:fs";
|
|
|
2
2
|
import os from "node:os";
|
|
3
3
|
import path from "node:path";
|
|
4
4
|
import { resolveSessionTranscriptPath } from "../config/sessions.js";
|
|
5
|
+
import { resolveRequiredHomeDir } from "../infra/home-dir.js";
|
|
6
|
+
import { extractToolCallNames, hasToolCall } from "../utils/transcript-tools.js";
|
|
5
7
|
import { stripEnvelope } from "./chat-sanitize.js";
|
|
6
8
|
export function readSessionMessages(sessionId, storePath, sessionFile) {
|
|
7
9
|
const candidates = resolveSessionTranscriptCandidates(sessionId, storePath, sessionFile);
|
|
@@ -17,6 +19,22 @@ export function readSessionMessages(sessionId, storePath, sessionFile) {
|
|
|
17
19
|
const parsed = JSON.parse(line);
|
|
18
20
|
if (parsed?.message) {
|
|
19
21
|
messages.push(parsed.message);
|
|
22
|
+
continue;
|
|
23
|
+
}
|
|
24
|
+
// Compaction entries are not "message" records, but they're useful context for debugging.
|
|
25
|
+
// Emit a lightweight synthetic message that the Web UI can render as a divider.
|
|
26
|
+
if (parsed?.type === "compaction") {
|
|
27
|
+
const ts = typeof parsed.timestamp === "string" ? Date.parse(parsed.timestamp) : Number.NaN;
|
|
28
|
+
const timestamp = Number.isFinite(ts) ? ts : Date.now();
|
|
29
|
+
messages.push({
|
|
30
|
+
role: "system",
|
|
31
|
+
content: [{ type: "text", text: "Compaction" }],
|
|
32
|
+
timestamp,
|
|
33
|
+
__poolbot: {
|
|
34
|
+
kind: "compaction",
|
|
35
|
+
id: typeof parsed.id === "string" ? parsed.id : undefined,
|
|
36
|
+
},
|
|
37
|
+
});
|
|
20
38
|
}
|
|
21
39
|
}
|
|
22
40
|
catch {
|
|
@@ -36,7 +54,8 @@ export function resolveSessionTranscriptCandidates(sessionId, storePath, session
|
|
|
36
54
|
if (agentId) {
|
|
37
55
|
candidates.push(resolveSessionTranscriptPath(sessionId, agentId));
|
|
38
56
|
}
|
|
39
|
-
|
|
57
|
+
const home = resolveRequiredHomeDir(process.env, os.homedir);
|
|
58
|
+
candidates.push(path.join(home, ".poolbot", "sessions", `${sessionId}.jsonl`));
|
|
40
59
|
return candidates;
|
|
41
60
|
}
|
|
42
61
|
export function archiveFileOnDisk(filePath, reason) {
|
|
@@ -214,31 +233,10 @@ function extractPreviewText(message) {
|
|
|
214
233
|
return null;
|
|
215
234
|
}
|
|
216
235
|
function isToolCall(message) {
|
|
217
|
-
|
|
218
|
-
return true;
|
|
219
|
-
if (!Array.isArray(message.content))
|
|
220
|
-
return false;
|
|
221
|
-
return message.content.some((entry) => {
|
|
222
|
-
if (entry?.name)
|
|
223
|
-
return true;
|
|
224
|
-
const raw = typeof entry?.type === "string" ? entry.type.toLowerCase() : "";
|
|
225
|
-
return raw === "toolcall" || raw === "tool_call";
|
|
226
|
-
});
|
|
236
|
+
return hasToolCall(message);
|
|
227
237
|
}
|
|
228
238
|
function extractToolNames(message) {
|
|
229
|
-
|
|
230
|
-
if (Array.isArray(message.content)) {
|
|
231
|
-
for (const entry of message.content) {
|
|
232
|
-
if (typeof entry?.name === "string" && entry.name.trim()) {
|
|
233
|
-
names.push(entry.name.trim());
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
|
-
const toolName = typeof message.toolName === "string" ? message.toolName : message.tool_name;
|
|
238
|
-
if (typeof toolName === "string" && toolName.trim()) {
|
|
239
|
-
names.push(toolName.trim());
|
|
240
|
-
}
|
|
241
|
-
return names;
|
|
239
|
+
return extractToolCallNames(message);
|
|
242
240
|
}
|
|
243
241
|
function extractMediaSummary(message) {
|
|
244
242
|
if (!Array.isArray(message.content))
|
|
@@ -316,7 +314,7 @@ function readRecentMessagesFromTranscript(filePath, maxMessages, readBytes) {
|
|
|
316
314
|
// skip malformed lines
|
|
317
315
|
}
|
|
318
316
|
}
|
|
319
|
-
return collected.
|
|
317
|
+
return collected.toReversed();
|
|
320
318
|
}
|
|
321
319
|
catch {
|
|
322
320
|
return [];
|
|
@@ -3,11 +3,12 @@ import path from "node:path";
|
|
|
3
3
|
import { resolveAgentWorkspaceDir, resolveDefaultAgentId } from "../agents/agent-scope.js";
|
|
4
4
|
import { lookupContextTokens } from "../agents/context.js";
|
|
5
5
|
import { DEFAULT_CONTEXT_TOKENS, DEFAULT_MODEL, DEFAULT_PROVIDER } from "../agents/defaults.js";
|
|
6
|
-
import { resolveConfiguredModelRef } from "../agents/model-selection.js";
|
|
6
|
+
import { resolveConfiguredModelRef, resolveDefaultModelForAgent, } from "../agents/model-selection.js";
|
|
7
7
|
import { loadConfig } from "../config/config.js";
|
|
8
8
|
import { resolveStateDir } from "../config/paths.js";
|
|
9
9
|
import { buildGroupDisplayName, canonicalizeMainSessionAlias, loadSessionStore, resolveMainSessionKey, resolveStorePath, } from "../config/sessions.js";
|
|
10
10
|
import { normalizeAgentId, normalizeMainKey, parseAgentSessionKey, } from "../routing/session-key.js";
|
|
11
|
+
import { isCronRunSessionKey } from "../sessions/session-key-utils.js";
|
|
11
12
|
import { normalizeSessionDeliveryFields } from "../utils/delivery-context.js";
|
|
12
13
|
import { readFirstUserMessageFromTranscript, readLastMessagePreviewFromTranscript, } from "./session-utils.fs.js";
|
|
13
14
|
export { archiveFileOnDisk, capArrayByJsonBytes, readFirstUserMessageFromTranscript, readLastMessagePreviewFromTranscript, readSessionPreviewItemsFromTranscript, readSessionMessages, resolveSessionTranscriptCandidates, } from "./session-utils.fs.js";
|
|
@@ -374,12 +375,14 @@ export function getSessionDefaults(cfg) {
|
|
|
374
375
|
contextTokens: contextTokens ?? null,
|
|
375
376
|
};
|
|
376
377
|
}
|
|
377
|
-
export function resolveSessionModelRef(cfg, entry) {
|
|
378
|
-
const resolved =
|
|
379
|
-
cfg,
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
378
|
+
export function resolveSessionModelRef(cfg, entry, agentId) {
|
|
379
|
+
const resolved = agentId
|
|
380
|
+
? resolveDefaultModelForAgent({ cfg, agentId })
|
|
381
|
+
: resolveConfiguredModelRef({
|
|
382
|
+
cfg,
|
|
383
|
+
defaultProvider: DEFAULT_PROVIDER,
|
|
384
|
+
defaultModel: DEFAULT_MODEL,
|
|
385
|
+
});
|
|
383
386
|
let provider = resolved.provider;
|
|
384
387
|
let model = resolved.model;
|
|
385
388
|
const storedModelOverride = entry?.modelOverride?.trim();
|
|
@@ -405,6 +408,8 @@ export function listSessionsFromStore(params) {
|
|
|
405
408
|
: undefined;
|
|
406
409
|
let sessions = Object.entries(store)
|
|
407
410
|
.filter(([key]) => {
|
|
411
|
+
if (isCronRunSessionKey(key))
|
|
412
|
+
return false;
|
|
408
413
|
if (!includeGlobal && key === "global")
|
|
409
414
|
return false;
|
|
410
415
|
if (!includeUnknown && key === "unknown")
|
|
@@ -458,6 +463,11 @@ export function listSessionsFromStore(params) {
|
|
|
458
463
|
entry?.label ??
|
|
459
464
|
originLabel;
|
|
460
465
|
const deliveryFields = normalizeSessionDeliveryFields(entry);
|
|
466
|
+
const parsedAgent = parseAgentSessionKey(key);
|
|
467
|
+
const sessionAgentId = normalizeAgentId(parsedAgent?.agentId ?? resolveDefaultAgentId(cfg));
|
|
468
|
+
const resolvedModel = resolveSessionModelRef(cfg, entry, sessionAgentId);
|
|
469
|
+
const modelProvider = resolvedModel.provider ?? DEFAULT_PROVIDER;
|
|
470
|
+
const model = resolvedModel.model ?? DEFAULT_MODEL;
|
|
461
471
|
return {
|
|
462
472
|
key,
|
|
463
473
|
entry,
|
|
@@ -483,8 +493,8 @@ export function listSessionsFromStore(params) {
|
|
|
483
493
|
outputTokens: entry?.outputTokens,
|
|
484
494
|
totalTokens: total,
|
|
485
495
|
responseUsage: entry?.responseUsage,
|
|
486
|
-
modelProvider
|
|
487
|
-
model
|
|
496
|
+
modelProvider,
|
|
497
|
+
model,
|
|
488
498
|
contextTokens: entry?.contextTokens,
|
|
489
499
|
deliveryContext: deliveryFields.deliveryContext,
|
|
490
500
|
lastChannel: deliveryFields.lastChannel ?? entry?.lastChannel,
|
|
@@ -492,7 +502,7 @@ export function listSessionsFromStore(params) {
|
|
|
492
502
|
lastAccountId: deliveryFields.lastAccountId ?? entry?.lastAccountId,
|
|
493
503
|
};
|
|
494
504
|
})
|
|
495
|
-
.
|
|
505
|
+
.toSorted((a, b) => (b.updatedAt ?? 0) - (a.updatedAt ?? 0));
|
|
496
506
|
if (search) {
|
|
497
507
|
sessions = sessions.filter((s) => {
|
|
498
508
|
const fields = [s.displayName, s.label, s.subject, s.sessionId, s.key];
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { resolveAllowedModelRef, resolveDefaultModelForAgent } from "../agents/model-selection.js";
|
|
3
|
+
import { resolveDefaultAgentId } from "../agents/agent-scope.js";
|
|
4
4
|
import { normalizeGroupActivation } from "../auto-reply/group-activation.js";
|
|
5
5
|
import { formatThinkingLevels, formatXHighModelHint, normalizeElevatedLevel, normalizeReasoningLevel, normalizeThinkLevel, normalizeUsageDisplay, supportsXHighThinking, } from "../auto-reply/thinking.js";
|
|
6
|
-
import { isSubagentSessionKey } from "../routing/session-key.js";
|
|
6
|
+
import { isSubagentSessionKey, normalizeAgentId, parseAgentSessionKey, } from "../routing/session-key.js";
|
|
7
7
|
import { applyVerboseOverride, parseVerboseOverride } from "../sessions/level-overrides.js";
|
|
8
8
|
import { normalizeSendPolicy } from "../sessions/send-policy.js";
|
|
9
9
|
import { parseSessionLabel } from "../sessions/session-label.js";
|
|
@@ -36,6 +36,9 @@ function normalizeExecAsk(raw) {
|
|
|
36
36
|
export async function applySessionsPatchToStore(params) {
|
|
37
37
|
const { cfg, store, storeKey, patch } = params;
|
|
38
38
|
const now = Date.now();
|
|
39
|
+
const parsedAgent = parseAgentSessionKey(storeKey);
|
|
40
|
+
const sessionAgentId = normalizeAgentId(parsedAgent?.agentId ?? resolveDefaultAgentId(cfg));
|
|
41
|
+
const resolvedDefault = resolveDefaultModelForAgent({ cfg, agentId: sessionAgentId });
|
|
39
42
|
const existing = store[storeKey];
|
|
40
43
|
const next = existing
|
|
41
44
|
? {
|
|
@@ -89,19 +92,11 @@ export async function applySessionsPatchToStore(params) {
|
|
|
89
92
|
else if (raw !== undefined) {
|
|
90
93
|
const normalized = normalizeThinkLevel(String(raw));
|
|
91
94
|
if (!normalized) {
|
|
92
|
-
const resolvedDefault = resolveConfiguredModelRef({
|
|
93
|
-
cfg,
|
|
94
|
-
defaultProvider: DEFAULT_PROVIDER,
|
|
95
|
-
defaultModel: DEFAULT_MODEL,
|
|
96
|
-
});
|
|
97
95
|
const hintProvider = existing?.providerOverride?.trim() || resolvedDefault.provider;
|
|
98
96
|
const hintModel = existing?.modelOverride?.trim() || resolvedDefault.model;
|
|
99
97
|
return invalid(`invalid thinkingLevel (use ${formatThinkingLevels(hintProvider, hintModel, "|")})`);
|
|
100
98
|
}
|
|
101
|
-
|
|
102
|
-
delete next.thinkingLevel;
|
|
103
|
-
else
|
|
104
|
-
next.thinkingLevel = normalized;
|
|
99
|
+
next.thinkingLevel = normalized;
|
|
105
100
|
}
|
|
106
101
|
}
|
|
107
102
|
if ("verboseLevel" in patch) {
|
|
@@ -205,11 +200,6 @@ export async function applySessionsPatchToStore(params) {
|
|
|
205
200
|
}
|
|
206
201
|
if ("model" in patch) {
|
|
207
202
|
const raw = patch.model;
|
|
208
|
-
const resolvedDefault = resolveConfiguredModelRef({
|
|
209
|
-
cfg,
|
|
210
|
-
defaultProvider: DEFAULT_PROVIDER,
|
|
211
|
-
defaultModel: DEFAULT_MODEL,
|
|
212
|
-
});
|
|
213
203
|
if (raw === null) {
|
|
214
204
|
applyModelOverrideToSessionEntry({
|
|
215
205
|
entry: next,
|
|
@@ -254,11 +244,6 @@ export async function applySessionsPatchToStore(params) {
|
|
|
254
244
|
}
|
|
255
245
|
}
|
|
256
246
|
if (next.thinkingLevel === "xhigh") {
|
|
257
|
-
const resolvedDefault = resolveConfiguredModelRef({
|
|
258
|
-
cfg,
|
|
259
|
-
defaultProvider: DEFAULT_PROVIDER,
|
|
260
|
-
defaultModel: DEFAULT_MODEL,
|
|
261
|
-
});
|
|
262
247
|
const effectiveProvider = next.providerOverride ?? resolvedDefault.provider;
|
|
263
248
|
const effectiveModel = next.modelOverride ?? resolvedDefault.model;
|
|
264
249
|
if (!supportsXHighThinking(effectiveProvider, effectiveModel)) {
|
|
@@ -26,6 +26,7 @@ let previousConfigPath;
|
|
|
26
26
|
let previousSkipBrowserControl;
|
|
27
27
|
let previousSkipGmailWatcher;
|
|
28
28
|
let previousSkipCanvasHost;
|
|
29
|
+
let previousBundledPluginsDir;
|
|
29
30
|
let tempHome;
|
|
30
31
|
let tempConfigRoot;
|
|
31
32
|
export async function writeSessionStore(params) {
|
|
@@ -56,6 +57,7 @@ async function setupGatewayTestHome() {
|
|
|
56
57
|
previousSkipBrowserControl = process.env.CLAWDBOT_SKIP_BROWSER_CONTROL_SERVER;
|
|
57
58
|
previousSkipGmailWatcher = process.env.CLAWDBOT_SKIP_GMAIL_WATCHER;
|
|
58
59
|
previousSkipCanvasHost = process.env.CLAWDBOT_SKIP_CANVAS_HOST;
|
|
60
|
+
previousBundledPluginsDir = process.env.CLAWDBOT_BUNDLED_PLUGINS_DIR;
|
|
59
61
|
tempHome = await fs.mkdtemp(path.join(os.tmpdir(), "poolbot-gateway-home-"));
|
|
60
62
|
process.env.HOME = tempHome;
|
|
61
63
|
process.env.USERPROFILE = tempHome;
|
|
@@ -66,6 +68,9 @@ function applyGatewaySkipEnv() {
|
|
|
66
68
|
process.env.CLAWDBOT_SKIP_BROWSER_CONTROL_SERVER = "1";
|
|
67
69
|
process.env.CLAWDBOT_SKIP_GMAIL_WATCHER = "1";
|
|
68
70
|
process.env.CLAWDBOT_SKIP_CANVAS_HOST = "1";
|
|
71
|
+
process.env.CLAWDBOT_BUNDLED_PLUGINS_DIR = tempHome
|
|
72
|
+
? path.join(tempHome, "poolbot-test-no-bundled-extensions")
|
|
73
|
+
: "poolbot-test-no-bundled-extensions";
|
|
69
74
|
}
|
|
70
75
|
async function resetGatewayTestState(options) {
|
|
71
76
|
// Some tests intentionally use fake timers; ensure they don't leak into gateway suites.
|
|
@@ -146,6 +151,10 @@ async function cleanupGatewayTestHome(options) {
|
|
|
146
151
|
delete process.env.CLAWDBOT_SKIP_CANVAS_HOST;
|
|
147
152
|
else
|
|
148
153
|
process.env.CLAWDBOT_SKIP_CANVAS_HOST = previousSkipCanvasHost;
|
|
154
|
+
if (previousBundledPluginsDir === undefined)
|
|
155
|
+
delete process.env.CLAWDBOT_BUNDLED_PLUGINS_DIR;
|
|
156
|
+
else
|
|
157
|
+
process.env.CLAWDBOT_BUNDLED_PLUGINS_DIR = previousBundledPluginsDir;
|
|
149
158
|
}
|
|
150
159
|
if (options.restoreEnv && tempHome) {
|
|
151
160
|
await fs.rm(tempHome, {
|
|
@@ -224,7 +233,8 @@ timeoutMs = 10_000) {
|
|
|
224
233
|
}
|
|
225
234
|
export async function startGatewayServer(port, opts) {
|
|
226
235
|
const mod = await serverModulePromise;
|
|
227
|
-
|
|
236
|
+
const resolvedOpts = opts?.controlUiEnabled === undefined ? { ...opts, controlUiEnabled: false } : opts;
|
|
237
|
+
return await mod.startGatewayServer(port, resolvedOpts);
|
|
228
238
|
}
|
|
229
239
|
export async function startServerWithClient(token, opts) {
|
|
230
240
|
let port = await getFreePort();
|
|
@@ -259,7 +269,30 @@ export async function startServerWithClient(token, opts) {
|
|
|
259
269
|
throw new Error("failed to start gateway server after retries");
|
|
260
270
|
}
|
|
261
271
|
const ws = new WebSocket(`ws://127.0.0.1:${port}`);
|
|
262
|
-
await new Promise((resolve) =>
|
|
272
|
+
await new Promise((resolve, reject) => {
|
|
273
|
+
const timer = setTimeout(() => reject(new Error("timeout waiting for ws open")), 10_000);
|
|
274
|
+
const cleanup = () => {
|
|
275
|
+
clearTimeout(timer);
|
|
276
|
+
ws.off("open", onOpen);
|
|
277
|
+
ws.off("error", onError);
|
|
278
|
+
ws.off("close", onClose);
|
|
279
|
+
};
|
|
280
|
+
const onOpen = () => {
|
|
281
|
+
cleanup();
|
|
282
|
+
resolve();
|
|
283
|
+
};
|
|
284
|
+
const onError = (err) => {
|
|
285
|
+
cleanup();
|
|
286
|
+
reject(err instanceof Error ? err : new Error(String(err)));
|
|
287
|
+
};
|
|
288
|
+
const onClose = (code, reason) => {
|
|
289
|
+
cleanup();
|
|
290
|
+
reject(new Error(`closed ${code}: ${reason.toString()}`));
|
|
291
|
+
};
|
|
292
|
+
ws.once("open", onOpen);
|
|
293
|
+
ws.once("error", onError);
|
|
294
|
+
ws.once("close", onClose);
|
|
295
|
+
});
|
|
263
296
|
return { server, ws, port, prevToken: prev };
|
|
264
297
|
}
|
|
265
298
|
export async function connectReq(ws, opts) {
|
|
@@ -52,7 +52,7 @@ function parseFrontmatterBool(value, fallback) {
|
|
|
52
52
|
const parsed = parseBooleanValue(value);
|
|
53
53
|
return parsed === undefined ? fallback : parsed;
|
|
54
54
|
}
|
|
55
|
-
export function
|
|
55
|
+
export function resolvePoolbotMetadata(frontmatter) {
|
|
56
56
|
const raw = getFrontmatterValue(frontmatter, "metadata");
|
|
57
57
|
if (!raw)
|
|
58
58
|
return undefined;
|
|
@@ -16,7 +16,7 @@ function normalizeInstallOptions(entry) {
|
|
|
16
16
|
let label = (spec.label ?? "").trim();
|
|
17
17
|
if (!label) {
|
|
18
18
|
if (spec.kind === "bundled") {
|
|
19
|
-
label = "Bundled with
|
|
19
|
+
label = "Bundled with Poolbot";
|
|
20
20
|
}
|
|
21
21
|
else if (spec.kind === "npm" && spec.package) {
|
|
22
22
|
label = `Install ${spec.package} (npm)`;
|
package/dist/hooks/install.js
CHANGED
|
@@ -23,7 +23,7 @@ export function resolveHookInstallDir(hookId, hooksDir) {
|
|
|
23
23
|
const hooksBase = hooksDir ? resolveUserPath(hooksDir) : path.join(CONFIG_DIR, "hooks");
|
|
24
24
|
return path.join(hooksBase, safeDirName(hookId));
|
|
25
25
|
}
|
|
26
|
-
async function
|
|
26
|
+
async function ensurePoolbotHooks(manifest) {
|
|
27
27
|
const hooks = manifest.poolbot?.hooks ?? manifest[LEGACY_MANIFEST_KEY]?.hooks;
|
|
28
28
|
if (!Array.isArray(hooks)) {
|
|
29
29
|
throw new Error("package.json missing poolbot.hooks");
|
|
@@ -72,7 +72,7 @@ async function installHookPackageFromDir(params) {
|
|
|
72
72
|
}
|
|
73
73
|
let hookEntries;
|
|
74
74
|
try {
|
|
75
|
-
hookEntries = await
|
|
75
|
+
hookEntries = await ensurePoolbotHooks(manifest);
|
|
76
76
|
}
|
|
77
77
|
catch (err) {
|
|
78
78
|
return { ok: false, error: String(err) };
|
package/dist/hooks/loader.js
CHANGED
|
@@ -17,7 +17,7 @@ import { shouldIncludeHook } from "./config.js";
|
|
|
17
17
|
* 1. Directory-based discovery (bundled, managed, workspace)
|
|
18
18
|
* 2. Legacy config handlers (backwards compatibility)
|
|
19
19
|
*
|
|
20
|
-
* @param cfg -
|
|
20
|
+
* @param cfg - Poolbot configuration
|
|
21
21
|
* @param workspaceDir - Workspace directory for hook discovery
|
|
22
22
|
* @returns Number of handlers successfully loaded
|
|
23
23
|
*
|
package/dist/hooks/workspace.js
CHANGED
|
@@ -4,7 +4,7 @@ import { LEGACY_MANIFEST_KEY } from "../compat/legacy-names.js";
|
|
|
4
4
|
import { CONFIG_DIR, resolveUserPath } from "../utils.js";
|
|
5
5
|
import { resolveBundledHooksDir } from "./bundled-dir.js";
|
|
6
6
|
import { shouldIncludeHook } from "./config.js";
|
|
7
|
-
import { parseFrontmatter,
|
|
7
|
+
import { parseFrontmatter, resolvePoolbotMetadata, resolveHookInvocationPolicy, } from "./frontmatter.js";
|
|
8
8
|
function filterHookEntries(entries, config, eligibility) {
|
|
9
9
|
return entries.filter((entry) => shouldIncludeHook({ entry, config, eligibility }));
|
|
10
10
|
}
|
|
@@ -128,7 +128,7 @@ export function loadHookEntriesFromDir(params) {
|
|
|
128
128
|
pluginId: params.pluginId,
|
|
129
129
|
},
|
|
130
130
|
frontmatter,
|
|
131
|
-
metadata:
|
|
131
|
+
metadata: resolvePoolbotMetadata(frontmatter),
|
|
132
132
|
invocation: resolveHookInvocationPolicy(frontmatter),
|
|
133
133
|
};
|
|
134
134
|
return entry;
|
|
@@ -185,7 +185,7 @@ function loadHookEntries(workspaceDir, opts) {
|
|
|
185
185
|
return {
|
|
186
186
|
hook,
|
|
187
187
|
frontmatter,
|
|
188
|
-
metadata:
|
|
188
|
+
metadata: resolvePoolbotMetadata(frontmatter),
|
|
189
189
|
invocation: resolveHookInvocationPolicy(frontmatter),
|
|
190
190
|
};
|
|
191
191
|
});
|
|
@@ -4,7 +4,7 @@ import { resolveMarkdownTableMode } from "../../config/markdown-tables.js";
|
|
|
4
4
|
import { convertMarkdownTables } from "../../markdown/tables.js";
|
|
5
5
|
import { sendMessageIMessage } from "../send.js";
|
|
6
6
|
export async function deliverReplies(params) {
|
|
7
|
-
const { replies, target, client, runtime, maxBytes, textLimit, accountId } = params;
|
|
7
|
+
const { replies, target, client, runtime, maxBytes, textLimit, accountId, sentMessageCache } = params;
|
|
8
8
|
const cfg = loadConfig();
|
|
9
9
|
const tableMode = resolveMarkdownTableMode({
|
|
10
10
|
cfg,
|
|
@@ -25,6 +25,7 @@ export async function deliverReplies(params) {
|
|
|
25
25
|
client,
|
|
26
26
|
accountId,
|
|
27
27
|
});
|
|
28
|
+
sentMessageCache?.remember(target, chunk);
|
|
28
29
|
}
|
|
29
30
|
}
|
|
30
31
|
else {
|
|
@@ -38,6 +39,8 @@ export async function deliverReplies(params) {
|
|
|
38
39
|
client,
|
|
39
40
|
accountId,
|
|
40
41
|
});
|
|
42
|
+
if (caption)
|
|
43
|
+
sentMessageCache?.remember(target, caption);
|
|
41
44
|
}
|
|
42
45
|
}
|
|
43
46
|
runtime.log?.(`imessage: delivered reply to ${target}`);
|