@poolzin/pool-bot 2026.2.25 → 2026.2.26
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/dist/acp/event-mapper.js +87 -22
- package/dist/acp/meta.js +12 -6
- package/dist/agents/agent-paths.js +8 -9
- package/dist/agents/agent-scope.js +7 -5
- package/dist/agents/auth-profiles/oauth.js +148 -64
- package/dist/agents/auth-profiles/session-override.js +13 -7
- package/dist/agents/bash-tools.exec-host-gateway.js +14 -4
- package/dist/agents/bash-tools.exec-runtime.js +2 -25
- package/dist/agents/bedrock-discovery.js +3 -1
- package/dist/agents/byteplus-models.js +97 -0
- package/dist/agents/chutes-oauth.js +1 -0
- package/dist/agents/cli-runner/helpers.js +4 -0
- package/dist/agents/compaction.js +41 -14
- package/dist/agents/doubao-models.js +121 -0
- package/dist/agents/failover-error.js +2 -0
- package/dist/agents/huggingface-models.js +5 -3
- package/dist/agents/live-model-filter.js +5 -0
- package/dist/agents/minimax-vlm.js +10 -8
- package/dist/agents/model-auth.js +6 -0
- package/dist/agents/model-catalog.js +3 -1
- package/dist/agents/model-selection.js +7 -1
- package/dist/agents/models-config.providers.js +93 -11
- package/dist/agents/ollama-stream.js +117 -4
- package/dist/agents/opencode-zen-models.js +22 -11
- package/dist/agents/pi-embedded-helpers/errors.js +55 -33
- package/dist/agents/pi-embedded-helpers/messaging-dedupe.js +10 -5
- package/dist/agents/pi-embedded-helpers/thinking.js +10 -5
- package/dist/agents/pi-embedded-helpers.js +1 -1
- package/dist/agents/pi-embedded-runner/compact.js +29 -7
- package/dist/agents/pi-embedded-runner/extensions.js +28 -26
- package/dist/agents/pi-embedded-runner/google.js +20 -8
- package/dist/agents/pi-embedded-runner/run/attempt.js +95 -36
- package/dist/agents/pi-embedded-runner/run.js +71 -12
- package/dist/agents/pi-embedded-runner/run.overflow-compaction.mocks.shared.js +11 -2
- package/dist/agents/pi-embedded-runner/session-manager-cache.js +11 -7
- package/dist/agents/pi-embedded-runner/system-prompt.js +2 -0
- package/dist/agents/pi-embedded-runner/thinking.js +42 -0
- package/dist/agents/pi-embedded-runner/tool-name-allowlist.js +19 -0
- package/dist/agents/pi-embedded-runner/utils.js +7 -10
- package/dist/agents/pi-embedded-subscribe.handlers.lifecycle.js +45 -56
- package/dist/agents/pi-embedded-subscribe.handlers.tools.js +2 -2
- package/dist/agents/pi-embedded-subscribe.js +9 -4
- package/dist/agents/pi-embedded-subscribe.tools.js +68 -14
- package/dist/agents/pi-embedded-utils.js +3 -0
- package/dist/agents/pi-extensions/compaction-safeguard-runtime.js +4 -20
- package/dist/agents/pi-extensions/compaction-safeguard.js +75 -33
- package/dist/agents/pi-settings.js +40 -0
- package/dist/agents/pi-tools.policy.js +2 -1
- package/dist/agents/provider/config-loader.js +1 -1
- package/dist/agents/sandbox/browser.js +170 -33
- package/dist/agents/sandbox/config-hash.js +14 -27
- package/dist/agents/sandbox/config.js +21 -2
- package/dist/agents/sandbox/constants.js +2 -0
- package/dist/agents/sandbox/docker.js +16 -2
- package/dist/agents/sandbox/novnc-auth.js +62 -0
- package/dist/agents/sandbox/sanitize-env-vars.js +1 -1
- package/dist/agents/sandbox/shared.js +10 -6
- package/dist/agents/sandbox-paths.js +24 -11
- package/dist/agents/schema/clean-for-gemini.js +132 -85
- package/dist/agents/session-slug.js +10 -5
- package/dist/agents/session-tool-result-guard-wrapper.js +1 -0
- package/dist/agents/session-tool-result-guard.js +3 -1
- package/dist/agents/session-transcript-repair.js +40 -6
- package/dist/agents/skills/bundled-dir.js +19 -5
- package/dist/agents/skills/env-overrides.js +124 -43
- package/dist/agents/skills/frontmatter.js +6 -6
- package/dist/agents/skills/plugin-skills.js +14 -7
- package/dist/agents/skills/workspace.js +1 -0
- package/dist/agents/subagent-announce.js +251 -49
- package/dist/agents/subagent-lifecycle-events.js +19 -0
- package/dist/agents/subagent-registry-cleanup.js +31 -0
- package/dist/agents/subagent-registry-completion.js +68 -0
- package/dist/agents/subagent-registry-queries.js +117 -0
- package/dist/agents/subagent-registry-state.js +46 -0
- package/dist/agents/subagent-registry.js +252 -221
- package/dist/agents/subagent-registry.store.js +1 -0
- package/dist/agents/subagent-registry.types.js +1 -0
- package/dist/agents/subagent-spawn.js +195 -7
- package/dist/agents/system-prompt.js +22 -6
- package/dist/agents/test-helpers/fast-coding-tools.js +1 -18
- package/dist/agents/test-helpers/fast-core-tools.js +1 -17
- package/dist/agents/timeout.js +18 -6
- package/dist/agents/tool-call-id.js +1 -1
- package/dist/agents/tool-display-common.js +162 -29
- package/dist/agents/tool-images.js +82 -9
- package/dist/agents/tool-policy.js +51 -26
- package/dist/agents/tools/browser-tool.js +2 -2
- package/dist/agents/tools/canvas-tool.js +27 -1
- package/dist/agents/tools/common.js +45 -0
- package/dist/agents/tools/discord-actions-guild.js +4 -1
- package/dist/agents/tools/gateway-tool.js +3 -1
- package/dist/agents/tools/nodes-utils.js +1 -10
- package/dist/agents/tools/sessions-send-helpers.js +12 -6
- package/dist/agents/tools/sessions-spawn-tool.js +8 -2
- package/dist/agents/tools/subagents-tool.js +2 -1
- package/dist/agents/tools/whatsapp-actions.js +10 -2
- package/dist/agents/tools/whatsapp-target-auth.js +18 -0
- package/dist/agents/transcript-policy.js +22 -8
- package/dist/agents/venice-models.js +11 -3
- package/dist/auto-reply/commands-registry.data.js +51 -0
- package/dist/auto-reply/commands-registry.js +4 -3
- package/dist/auto-reply/group-activation.js +10 -5
- package/dist/auto-reply/inbound-debounce.js +10 -5
- package/dist/auto-reply/reply/abort.js +1 -1
- package/dist/auto-reply/reply/agent-runner-execution.js +4 -1
- package/dist/auto-reply/reply/bash-command.js +41 -39
- package/dist/auto-reply/reply/command-gates.js +25 -0
- package/dist/auto-reply/reply/commands-allowlist.js +111 -72
- package/dist/auto-reply/reply/commands-bash.js +6 -5
- package/dist/auto-reply/reply/commands-config.js +30 -28
- package/dist/auto-reply/reply/commands-core.js +2 -1
- package/dist/auto-reply/reply/commands-info.js +1 -0
- package/dist/auto-reply/reply/commands-models.js +65 -14
- package/dist/auto-reply/reply/commands-session.js +237 -82
- package/dist/auto-reply/reply/commands-setunset.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-agents.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-focus.js +64 -0
- package/dist/auto-reply/reply/commands-subagents/action-help.js +4 -0
- package/dist/auto-reply/reply/commands-subagents/action-info.js +45 -0
- package/dist/auto-reply/reply/commands-subagents/action-kill.js +60 -0
- package/dist/auto-reply/reply/commands-subagents/action-list.js +44 -0
- package/dist/auto-reply/reply/commands-subagents/action-log.js +29 -0
- package/dist/auto-reply/reply/commands-subagents/action-send.js +119 -0
- package/dist/auto-reply/reply/commands-subagents/action-spawn.js +52 -0
- package/dist/auto-reply/reply/commands-subagents/action-unfocus.js +30 -0
- package/dist/auto-reply/reply/commands-subagents/shared.js +303 -0
- package/dist/auto-reply/reply/commands-subagents.js +51 -587
- package/dist/auto-reply/reply/commands-tts.js +10 -5
- package/dist/auto-reply/reply/config-value.js +10 -5
- package/dist/auto-reply/reply/directive-handling.model-picker.js +12 -6
- package/dist/auto-reply/reply/directive-handling.persist.js +9 -21
- package/dist/auto-reply/reply/directive-handling.shared.js +24 -4
- package/dist/auto-reply/reply/followup-runner.js +1 -0
- package/dist/auto-reply/reply/get-reply-directives-utils.js +23 -14
- package/dist/auto-reply/reply/get-reply-directives.js +17 -28
- package/dist/auto-reply/reply/get-reply-inline-actions.js +1 -0
- package/dist/auto-reply/reply/get-reply.js +71 -12
- package/dist/auto-reply/reply/model-selection.js +80 -39
- package/dist/auto-reply/reply/queue/enqueue.js +10 -5
- package/dist/auto-reply/reply/queue/state.js +13 -12
- package/dist/auto-reply/reply/reply-payloads.js +67 -36
- package/dist/auto-reply/reply/reply-reference.js +9 -8
- package/dist/auto-reply/reply/route-reply.js +15 -8
- package/dist/auto-reply/reply/session-reset-prompt.js +1 -1
- package/dist/auto-reply/reply/session.js +22 -6
- package/dist/auto-reply/reply/strip-inbound-meta.js +147 -0
- package/dist/auto-reply/reply/subagents-utils.js +56 -30
- package/dist/auto-reply/reply/typing.js +46 -21
- package/dist/auto-reply/send-policy.js +14 -7
- package/dist/auto-reply/status.js +140 -16
- package/dist/auto-reply/templating.js +10 -5
- package/dist/auto-reply/thinking.js +7 -16
- package/dist/auto-reply/tokens.js +21 -5
- package/dist/browser/bridge-server.js +36 -20
- package/dist/browser/cdp.helpers.js +7 -14
- package/dist/browser/cdp.js +35 -15
- package/dist/browser/chrome.profile-decoration.js +7 -4
- package/dist/browser/config.js +4 -0
- package/dist/browser/extension-relay-auth.js +55 -0
- package/dist/browser/extension-relay.js +74 -29
- package/dist/browser/navigation-guard.js +9 -1
- package/dist/browser/paths.js +77 -0
- package/dist/browser/profiles.js +13 -8
- package/dist/browser/pw-ai-module.js +10 -5
- package/dist/browser/pw-session.js +76 -39
- package/dist/browser/pw-tools-core.interactions.js +14 -7
- package/dist/browser/pw-tools-core.state.js +12 -6
- package/dist/browser/routes/agent.act.js +2 -2
- package/dist/browser/server-context.js +7 -0
- package/dist/build-info.json +3 -3
- package/dist/channels/allow-from.js +2 -1
- package/dist/channels/allowlists/resolve-utils.js +43 -19
- package/dist/channels/channel-config.js +14 -7
- package/dist/channels/draft-stream-loop.js +7 -0
- package/dist/channels/model-overrides.js +82 -0
- package/dist/channels/plugins/normalize/imessage.js +14 -7
- package/dist/channels/plugins/normalize/slack.js +10 -5
- package/dist/channels/plugins/normalize/telegram.js +14 -7
- package/dist/channels/plugins/outbound/discord.js +80 -8
- package/dist/channels/plugins/outbound/signal.js +11 -11
- package/dist/channels/plugins/setup-helpers.js +10 -5
- package/dist/channels/sender-label.js +14 -7
- package/dist/channels/session.js +4 -2
- package/dist/channels/status-reactions.js +297 -0
- package/dist/cli/banner.js +1 -1
- package/dist/cli/browser-cli-actions-input/register.files-downloads.js +65 -56
- package/dist/cli/cli-name.js +11 -11
- package/dist/cli/cli-utils.js +13 -3
- package/dist/cli/command-format.js +1 -1
- package/dist/cli/config-cli.js +1 -1
- package/dist/cli/daemon-cli/lifecycle-core.js +31 -19
- package/dist/cli/daemon-cli/lifecycle.js +64 -2
- package/dist/cli/daemon-cli/restart-health.js +126 -0
- package/dist/cli/daemon-cli/status.gather.js +9 -13
- package/dist/cli/daemon-cli/status.print.js +2 -10
- package/dist/cli/deps.js +27 -22
- package/dist/cli/gateway-cli/run-loop.js +23 -5
- package/dist/cli/node-cli/register.js +14 -5
- package/dist/cli/nodes-media-utils.js +7 -2
- package/dist/cli/outbound-send-deps.js +2 -9
- package/dist/cli/outbound-send-mapping.js +11 -0
- package/dist/cli/pairing-cli.js +40 -14
- package/dist/cli/plugins-cli.js +34 -41
- package/dist/cli/ports.js +11 -10
- package/dist/cli/program/command-registry.js +2 -11
- package/dist/cli/program/command-tree.js +16 -0
- package/dist/cli/program/preaction.js +13 -9
- package/dist/cli/program/register.configure.js +3 -18
- package/dist/cli/program/register.maintenance.js +2 -2
- package/dist/cli/program/register.onboard.js +2 -0
- package/dist/cli/program/register.status-health-sessions.js +16 -17
- package/dist/cli/program/register.subclis.js +93 -52
- package/dist/cli/route.js +11 -7
- package/dist/cli/system-cli.js +36 -46
- package/dist/cli/update-cli/shared.js +22 -9
- package/dist/cli/update-cli/update-command.js +89 -14
- package/dist/cli/update-cli/wizard.js +6 -12
- package/dist/commands/agent/run-context.js +18 -5
- package/dist/commands/agent/session-store.js +17 -4
- package/dist/commands/agent.js +22 -2
- package/dist/commands/agents.bindings.js +14 -7
- package/dist/commands/agents.commands.add.js +13 -9
- package/dist/commands/agents.commands.identity.js +12 -6
- package/dist/commands/agents.commands.list.js +11 -6
- package/dist/commands/agents.config.js +8 -10
- package/dist/commands/agents.providers.js +12 -6
- package/dist/commands/auth-choice-options.js +103 -75
- package/dist/commands/auth-choice.apply.byteplus.js +55 -0
- package/dist/commands/auth-choice.apply.js +4 -0
- package/dist/commands/auth-choice.apply.minimax.js +61 -13
- package/dist/commands/auth-choice.apply.openai.js +3 -1
- package/dist/commands/auth-choice.apply.volcengine.js +55 -0
- package/dist/commands/auth-choice.preferred-provider.js +2 -0
- package/dist/commands/channels/remove.js +13 -6
- package/dist/commands/channels/shared.js +4 -14
- package/dist/commands/configure.commands.js +14 -0
- package/dist/commands/configure.gateway.js +2 -4
- package/dist/commands/configure.js +1 -1
- package/dist/commands/configure.shared.js +11 -0
- package/dist/commands/daemon-install-helpers.js +2 -2
- package/dist/commands/dashboard.js +12 -10
- package/dist/commands/docs.js +14 -8
- package/dist/commands/doctor-config-flow.js +11 -9
- package/dist/commands/doctor-legacy-config.js +281 -0
- package/dist/commands/doctor-state-integrity.js +99 -23
- package/dist/commands/doctor-update.js +12 -9
- package/dist/commands/models/list.list-command.js +7 -5
- package/dist/commands/models/set-image.js +2 -21
- package/dist/commands/node-daemon-install-helpers.js +10 -8
- package/dist/commands/onboard-auth.config-minimax.js +54 -80
- package/dist/commands/onboard-auth.config-opencode.js +2 -18
- package/dist/commands/onboard-auth.credentials.js +90 -13
- package/dist/commands/onboard-auth.js +1 -1
- package/dist/commands/onboard-auth.models.js +6 -5
- package/dist/commands/onboard-hooks.js +1 -1
- package/dist/commands/onboard-non-interactive/api-keys.js +14 -7
- package/dist/commands/onboard-non-interactive/local/auth-choice.js +64 -49
- package/dist/commands/onboard-provider-auth-flags.js +14 -0
- package/dist/commands/onboard-remote.js +14 -7
- package/dist/commands/onboard.js +11 -13
- package/dist/commands/sandbox-display.js +6 -5
- package/dist/commands/status-all/diagnosis.js +14 -10
- package/dist/commands/status-all/format.js +1 -0
- package/dist/commands/status.gateway-probe.js +1 -16
- package/dist/commands/systemd-linger.js +12 -6
- package/dist/config/agent-limits.js +2 -0
- package/dist/config/commands.js +30 -16
- package/dist/config/config-paths.js +9 -11
- package/dist/config/defaults.js +22 -2
- package/dist/config/discord-preview-streaming.js +104 -0
- package/dist/config/env-vars.js +37 -8
- package/dist/config/includes.js +4 -0
- package/dist/config/io.js +97 -12
- package/dist/config/legacy.migrations.part-1.js +189 -78
- package/dist/config/legacy.shared.js +3 -1
- package/dist/config/merge-patch.js +4 -0
- package/dist/config/prototype-keys.js +4 -0
- package/dist/config/schema.help.js +44 -7
- package/dist/config/schema.labels.js +38 -6
- package/dist/config/sessions/delivery-info.js +10 -3
- package/dist/config/sessions/main-session.js +10 -5
- package/dist/config/sessions/session-file.js +33 -0
- package/dist/config/sessions/session-key.js +10 -5
- package/dist/config/sessions/store.js +1 -1
- package/dist/config/sessions.js +1 -0
- package/dist/config/zod-schema.agent-runtime.js +11 -0
- package/dist/config/zod-schema.js +148 -13
- package/dist/config/zod-schema.providers-core.js +78 -4
- package/dist/config/zod-schema.providers.js +6 -1
- package/dist/config/zod-schema.session.js +41 -2
- package/dist/cron/run-log.js +3 -0
- package/dist/cron/schedule.js +21 -10
- package/dist/cron/service/ops.js +35 -21
- package/dist/cron/service/timer.js +116 -16
- package/dist/cron/stagger.js +3 -1
- package/dist/discord/api.js +12 -6
- package/dist/discord/draft-chunking.js +22 -0
- package/dist/discord/draft-stream.js +124 -0
- package/dist/discord/monitor/agent-components.js +1 -1
- package/dist/discord/monitor/commands.js +5 -0
- package/dist/discord/monitor/gateway-plugin.js +2 -1
- package/dist/discord/monitor/listeners.js +37 -27
- package/dist/discord/monitor/message-handler.js +4 -1
- package/dist/discord/monitor/message-handler.preflight.js +65 -8
- package/dist/discord/monitor/message-handler.process.js +246 -217
- package/dist/discord/monitor/message-utils.js +143 -6
- package/dist/discord/monitor/model-picker-preferences.js +143 -0
- package/dist/discord/monitor/model-picker.js +651 -0
- package/dist/discord/monitor/native-command.js +573 -16
- package/dist/discord/monitor/provider.allowlist.js +223 -0
- package/dist/discord/monitor/provider.js +275 -347
- package/dist/discord/monitor/provider.lifecycle.js +100 -0
- package/dist/discord/monitor/reply-delivery.js +123 -16
- package/dist/discord/monitor/thread-bindings.discord-api.js +215 -0
- package/dist/discord/monitor/thread-bindings.js +4 -0
- package/dist/discord/monitor/thread-bindings.lifecycle.js +177 -0
- package/dist/discord/monitor/thread-bindings.manager.js +423 -0
- package/dist/discord/monitor/thread-bindings.messages.js +55 -0
- package/dist/discord/monitor/thread-bindings.state.js +358 -0
- package/dist/discord/monitor/thread-bindings.types.js +6 -0
- package/dist/discord/resolve-users.js +33 -21
- package/dist/discord/send.channels.js +15 -0
- package/dist/discord/send.js +3 -2
- package/dist/discord/send.outbound.js +82 -26
- package/dist/discord/send.permissions.js +83 -30
- package/dist/discord/send.reactions.js +8 -4
- package/dist/discord/token.js +10 -5
- package/dist/discord/voice/command.js +263 -0
- package/dist/discord/voice/manager.js +531 -0
- package/dist/gateway/auth.js +34 -10
- package/dist/gateway/call.js +4 -16
- package/dist/gateway/client.js +28 -4
- package/dist/gateway/config-reload.js +3 -4
- package/dist/gateway/control-ui.js +219 -96
- package/dist/gateway/hooks-mapping.js +88 -38
- package/dist/gateway/http-auth-helpers.js +3 -2
- package/dist/gateway/http-endpoint-helpers.js +1 -0
- package/dist/gateway/net.js +54 -12
- package/dist/gateway/node-invoke-system-run-approval.js +14 -35
- package/dist/gateway/node-registry.js +10 -5
- package/dist/gateway/openai-http.js +1 -0
- package/dist/gateway/openresponses-http.js +1 -0
- package/dist/gateway/origin-check.js +1 -18
- package/dist/gateway/protocol/index.js +4 -3
- package/dist/gateway/protocol/schema/cron.js +1 -0
- package/dist/gateway/protocol/schema/devices.js +1 -0
- package/dist/gateway/protocol/schema/protocol-schemas.js +2 -1
- package/dist/gateway/protocol/schema/sessions.js +6 -0
- package/dist/gateway/role-policy.js +17 -0
- package/dist/gateway/server/ws-connection/connect-policy.js +37 -0
- package/dist/gateway/server/ws-connection/message-handler.js +175 -148
- package/dist/gateway/server-chat.js +83 -25
- package/dist/gateway/server-constants.js +10 -9
- package/dist/gateway/server-cron.js +1 -0
- package/dist/gateway/server-http.js +16 -7
- package/dist/gateway/server-maintenance.js +20 -5
- package/dist/gateway/server-methods/chat.js +10 -6
- package/dist/gateway/server-methods/config.js +12 -14
- package/dist/gateway/server-methods/devices.js +17 -3
- package/dist/gateway/server-methods/models.js +11 -1
- package/dist/gateway/server-methods/sessions.js +64 -8
- package/dist/gateway/server-methods/usage.js +162 -75
- package/dist/gateway/server-node-events.js +29 -0
- package/dist/gateway/server-runtime-config.js +34 -13
- package/dist/gateway/server-startup-memory.js +17 -11
- package/dist/gateway/session-utils.fs.js +32 -34
- package/dist/gateway/sessions-resolve.js +17 -5
- package/dist/gateway/test-helpers.openai-mock.js +14 -7
- package/dist/gateway/tools-invoke-http.js +21 -10
- package/dist/hooks/bundled/bootstrap-extra-files/handler.js +3 -1
- package/dist/hooks/bundled/command-logger/handler.js +7 -2
- package/dist/hooks/bundled/session-memory/handler.js +6 -5
- package/dist/hooks/frontmatter.js +6 -6
- package/dist/hooks/gmail-watcher.js +11 -6
- package/dist/hooks/internal-hooks.js +11 -1
- package/dist/hooks/llm-slug-generator.js +4 -1
- package/dist/hooks/workspace.js +47 -17
- package/dist/imessage/accounts.js +9 -20
- package/dist/imessage/monitor/inbound-processing.js +2 -1
- package/dist/infra/archive.js +174 -73
- package/dist/infra/control-ui-assets.js +14 -6
- package/dist/infra/device-pairing.js +108 -29
- package/dist/infra/env.js +10 -5
- package/dist/infra/exec-approvals-allowlist.js +122 -0
- package/dist/infra/exec-approvals-analysis.js +34 -3
- package/dist/infra/exec-approvals.js +5 -17
- package/dist/infra/exec-safe-bin-policy.js +53 -45
- package/dist/infra/fs-safe.js +71 -39
- package/dist/infra/gateway-lock.js +6 -2
- package/dist/infra/heartbeat-wake.js +6 -12
- package/dist/infra/host-env-security-policy.json +19 -0
- package/dist/infra/host-env-security.js +66 -0
- package/dist/infra/net/ssrf.js +131 -38
- package/dist/infra/outbound/bound-delivery-router.js +88 -0
- package/dist/infra/outbound/channel-selection.js +12 -6
- package/dist/infra/outbound/envelope.js +1 -1
- package/dist/infra/outbound/format.js +12 -6
- package/dist/infra/outbound/payloads.js +14 -7
- package/dist/infra/outbound/session-binding-service.js +123 -0
- package/dist/infra/path-guards.js +25 -0
- package/dist/infra/provider-usage.fetch.codex.js +7 -15
- package/dist/infra/provider-usage.fetch.gemini.js +14 -11
- package/dist/infra/provider-usage.fetch.shared.js +30 -1
- package/dist/infra/provider-usage.fetch.zai.js +10 -9
- package/dist/infra/retry-policy.js +4 -2
- package/dist/infra/retry.js +9 -5
- package/dist/infra/session-cost-usage.js +107 -59
- package/dist/infra/session-maintenance-warning.js +3 -1
- package/dist/infra/shell-env.js +98 -34
- package/dist/infra/ssh-config.js +12 -6
- package/dist/infra/system-run-command.js +49 -4
- package/dist/infra/update-channels.js +10 -5
- package/dist/line/accounts.js +5 -7
- package/dist/line/bot-access.js +8 -20
- package/dist/line/bot-handlers.js +3 -1
- package/dist/link-understanding/detect.js +15 -7
- package/dist/media/constants.js +15 -6
- package/dist/media/image-ops.js +7 -0
- package/dist/media/local-roots.js +3 -2
- package/dist/media-understanding/apply.js +4 -1
- package/dist/media-understanding/concurrency.js +8 -20
- package/dist/memory/backend-config.js +45 -6
- package/dist/memory/embeddings.js +10 -4
- package/dist/memory/fs-utils.js +23 -0
- package/dist/memory/manager-search.js +12 -6
- package/dist/memory/manager-sync-ops.js +12 -2
- package/dist/memory/qmd-manager.js +466 -53
- package/dist/memory/query-expansion.js +167 -3
- package/dist/memory/status-format.js +10 -5
- package/dist/memory/sync-memory-files.js +1 -1
- package/dist/node-host/invoke-system-run.js +281 -0
- package/dist/node-host/invoke.js +55 -337
- package/dist/pairing/pairing-store.js +22 -0
- package/dist/plugin-sdk/allow-from.js +1 -1
- package/dist/plugin-sdk/command-auth.js +3 -1
- package/dist/plugin-sdk/index.js +6 -3
- package/dist/plugin-sdk/webhook-targets.js +32 -0
- package/dist/plugins/bundled-dir.js +9 -6
- package/dist/plugins/hooks.js +50 -0
- package/dist/plugins/install.js +28 -16
- package/dist/plugins/runtime.js +3 -17
- package/dist/plugins/update.js +78 -12
- package/dist/process/spawn-utils.js +14 -7
- package/dist/providers/github-copilot-token.js +11 -6
- package/dist/providers/qwen-portal-oauth.js +14 -6
- package/dist/routing/account-id.js +30 -0
- package/dist/routing/resolve-route.js +3 -7
- package/dist/routing/session-key.js +2 -16
- package/dist/security/audit-channel.js +93 -2
- package/dist/security/audit-extra.async.js +159 -5
- package/dist/security/audit-extra.js +1 -1
- package/dist/security/audit-extra.sync.js +85 -6
- package/dist/security/audit.js +40 -4
- package/dist/security/dm-policy-shared.js +44 -0
- package/dist/security/external-content.js +26 -6
- package/dist/shared/entry-status.js +6 -0
- package/dist/shared/frontmatter.js +5 -5
- package/dist/shared/node-match.js +11 -4
- package/dist/shared/operator-scope-compat.js +8 -3
- package/dist/signal/accounts.js +7 -20
- package/dist/signal/monitor/event-handler.js +3 -1
- package/dist/slack/accounts.js +6 -19
- package/dist/slack/actions.js +11 -3
- package/dist/slack/monitor/auth.js +1 -1
- package/dist/slack/monitor/message-handler/dispatch.js +50 -29
- package/dist/slack/monitor/replies.js +15 -7
- package/dist/slack/monitor/slash.js +22 -13
- package/dist/slack/resolve-channels.js +10 -5
- package/dist/slack/send.js +102 -12
- package/dist/slack/stream-mode.js +10 -0
- package/dist/slack/streaming.js +4 -2
- package/dist/telegram/accounts.js +19 -14
- package/dist/telegram/bot/helpers.js +3 -5
- package/dist/telegram/bot-access.js +35 -36
- package/dist/telegram/bot-handlers.js +120 -148
- package/dist/telegram/bot-message-context.js +68 -9
- package/dist/telegram/bot-message-dispatch.js +155 -90
- package/dist/telegram/bot-native-commands.js +16 -0
- package/dist/telegram/draft-stream.js +14 -1
- package/dist/telegram/inline-buttons.js +5 -15
- package/dist/telegram/monitor.js +11 -7
- package/dist/telegram/network-config.js +19 -7
- package/dist/telegram/send.js +3 -2
- package/dist/telegram/sent-message-cache.js +5 -6
- package/dist/telegram/status-reaction-variants.js +208 -0
- package/dist/telegram/sticker-cache.js +11 -9
- package/dist/terminal/theme.js +12 -12
- package/dist/tts/tts.js +80 -567
- package/dist/tui/components/chat-log.js +41 -8
- package/dist/tui/theme/theme.js +10 -12
- package/dist/tui/tui-local-shell.js +16 -6
- package/dist/tui/tui.js +58 -6
- package/dist/utils/account-id.js +2 -4
- package/dist/utils/boolean.js +10 -5
- package/dist/utils/directive-tags.js +11 -0
- package/dist/utils/queue-helpers.js +67 -12
- package/dist/web/auto-reply/deliver-reply.js +8 -4
- package/dist/web/auto-reply/mentions.js +10 -5
- package/dist/web/auto-reply/monitor/group-members.js +14 -7
- package/dist/web/auto-reply/monitor/process-message.js +45 -24
- package/dist/web/inbound/access-control.js +5 -2
- package/dist/web/login-qr.js +12 -6
- package/dist/web/media.js +123 -16
- package/extensions/bluebubbles/src/monitor-processing.ts +580 -139
- package/extensions/bluebubbles/src/monitor.ts +208 -1950
- package/package.json +1 -1
|
@@ -1,16 +1,22 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { listAgentIds } from "../agents/agent-scope.js";
|
|
2
|
+
import { resolveMemorySearchConfig } from "../agents/memory-search.js";
|
|
2
3
|
import { resolveMemoryBackendConfig } from "../memory/backend-config.js";
|
|
3
4
|
import { getMemorySearchManager } from "../memory/index.js";
|
|
4
5
|
export async function startGatewayMemoryBackend(params) {
|
|
5
|
-
const
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
6
|
+
const agentIds = listAgentIds(params.cfg);
|
|
7
|
+
for (const agentId of agentIds) {
|
|
8
|
+
if (!resolveMemorySearchConfig(params.cfg, agentId)) {
|
|
9
|
+
continue;
|
|
10
|
+
}
|
|
11
|
+
const resolved = resolveMemoryBackendConfig({ cfg: params.cfg, agentId });
|
|
12
|
+
if (resolved.backend !== "qmd" || !resolved.qmd) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
const { manager, error } = await getMemorySearchManager({ cfg: params.cfg, agentId });
|
|
16
|
+
if (!manager) {
|
|
17
|
+
params.log.warn(`qmd memory startup initialization failed for agent "${agentId}": ${error ?? "unknown error"}`);
|
|
18
|
+
continue;
|
|
19
|
+
}
|
|
20
|
+
params.log.info?.(`qmd memory startup initialization armed for agent "${agentId}"`);
|
|
9
21
|
}
|
|
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
22
|
}
|
|
@@ -4,6 +4,7 @@ import path from "node:path";
|
|
|
4
4
|
import { resolveSessionFilePath, resolveSessionTranscriptPath, resolveSessionTranscriptPathInDir, } from "../config/sessions.js";
|
|
5
5
|
import { resolveRequiredHomeDir } from "../infra/home-dir.js";
|
|
6
6
|
import { hasInterSessionUserProvenance } from "../sessions/input-provenance.js";
|
|
7
|
+
import { stripInlineDirectiveTagsForDisplay } from "../utils/directive-tags.js";
|
|
7
8
|
import { extractToolCallNames, hasToolCall } from "../utils/transcript-tools.js";
|
|
8
9
|
import { stripEnvelope } from "./chat-sanitize.js";
|
|
9
10
|
const sessionTitleFieldsCache = new Map();
|
|
@@ -284,7 +285,8 @@ export function readSessionTitleFieldsFromTranscript(sessionId, storePath, sessi
|
|
|
284
285
|
}
|
|
285
286
|
function extractTextFromContent(content) {
|
|
286
287
|
if (typeof content === "string") {
|
|
287
|
-
|
|
288
|
+
const normalized = stripInlineDirectiveTagsForDisplay(content).text.trim();
|
|
289
|
+
return normalized || null;
|
|
288
290
|
}
|
|
289
291
|
if (!Array.isArray(content)) {
|
|
290
292
|
return null;
|
|
@@ -294,9 +296,9 @@ function extractTextFromContent(content) {
|
|
|
294
296
|
continue;
|
|
295
297
|
}
|
|
296
298
|
if (part.type === "text" || part.type === "output_text" || part.type === "input_text") {
|
|
297
|
-
const
|
|
298
|
-
if (
|
|
299
|
-
return
|
|
299
|
+
const normalized = stripInlineDirectiveTagsForDisplay(part.text).text.trim();
|
|
300
|
+
if (normalized) {
|
|
301
|
+
return normalized;
|
|
300
302
|
}
|
|
301
303
|
}
|
|
302
304
|
}
|
|
@@ -336,20 +338,15 @@ function extractFirstUserMessageFromTranscriptChunk(chunk, opts) {
|
|
|
336
338
|
}
|
|
337
339
|
return null;
|
|
338
340
|
}
|
|
339
|
-
|
|
341
|
+
function findExistingTranscriptPath(sessionId, storePath, sessionFile, agentId) {
|
|
340
342
|
const candidates = resolveSessionTranscriptCandidates(sessionId, storePath, sessionFile, agentId);
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
}
|
|
343
|
+
return candidates.find((p) => fs.existsSync(p)) ?? null;
|
|
344
|
+
}
|
|
345
|
+
function withOpenTranscriptFd(filePath, read) {
|
|
345
346
|
let fd = null;
|
|
346
347
|
try {
|
|
347
348
|
fd = fs.openSync(filePath, "r");
|
|
348
|
-
|
|
349
|
-
if (!chunk) {
|
|
350
|
-
return null;
|
|
351
|
-
}
|
|
352
|
-
return extractFirstUserMessageFromTranscriptChunk(chunk, opts);
|
|
349
|
+
return read(fd);
|
|
353
350
|
}
|
|
354
351
|
catch {
|
|
355
352
|
// file read error
|
|
@@ -361,6 +358,19 @@ export function readFirstUserMessageFromTranscript(sessionId, storePath, session
|
|
|
361
358
|
}
|
|
362
359
|
return null;
|
|
363
360
|
}
|
|
361
|
+
export function readFirstUserMessageFromTranscript(sessionId, storePath, sessionFile, agentId, opts) {
|
|
362
|
+
const filePath = findExistingTranscriptPath(sessionId, storePath, sessionFile, agentId);
|
|
363
|
+
if (!filePath) {
|
|
364
|
+
return null;
|
|
365
|
+
}
|
|
366
|
+
return withOpenTranscriptFd(filePath, (fd) => {
|
|
367
|
+
const chunk = readTranscriptHeadChunk(fd);
|
|
368
|
+
if (!chunk) {
|
|
369
|
+
return null;
|
|
370
|
+
}
|
|
371
|
+
return extractFirstUserMessageFromTranscriptChunk(chunk, opts);
|
|
372
|
+
});
|
|
373
|
+
}
|
|
364
374
|
const LAST_MSG_MAX_BYTES = 16384;
|
|
365
375
|
const LAST_MSG_MAX_LINES = 20;
|
|
366
376
|
function readLastMessagePreviewFromOpenTranscript(params) {
|
|
@@ -391,30 +401,18 @@ function readLastMessagePreviewFromOpenTranscript(params) {
|
|
|
391
401
|
return null;
|
|
392
402
|
}
|
|
393
403
|
export function readLastMessagePreviewFromTranscript(sessionId, storePath, sessionFile, agentId) {
|
|
394
|
-
const
|
|
395
|
-
const filePath = candidates.find((p) => fs.existsSync(p));
|
|
404
|
+
const filePath = findExistingTranscriptPath(sessionId, storePath, sessionFile, agentId);
|
|
396
405
|
if (!filePath) {
|
|
397
406
|
return null;
|
|
398
407
|
}
|
|
399
|
-
|
|
400
|
-
try {
|
|
401
|
-
fd = fs.openSync(filePath, "r");
|
|
408
|
+
return withOpenTranscriptFd(filePath, (fd) => {
|
|
402
409
|
const stat = fs.fstatSync(fd);
|
|
403
410
|
const size = stat.size;
|
|
404
411
|
if (size === 0) {
|
|
405
412
|
return null;
|
|
406
413
|
}
|
|
407
414
|
return readLastMessagePreviewFromOpenTranscript({ fd, size });
|
|
408
|
-
}
|
|
409
|
-
catch {
|
|
410
|
-
// file error
|
|
411
|
-
}
|
|
412
|
-
finally {
|
|
413
|
-
if (fd !== null) {
|
|
414
|
-
fs.closeSync(fd);
|
|
415
|
-
}
|
|
416
|
-
}
|
|
417
|
-
return null;
|
|
415
|
+
});
|
|
418
416
|
}
|
|
419
417
|
const PREVIEW_READ_SIZES = [64 * 1024, 256 * 1024, 1024 * 1024];
|
|
420
418
|
const PREVIEW_MAX_LINES = 200;
|
|
@@ -446,20 +444,20 @@ function truncatePreviewText(text, maxChars) {
|
|
|
446
444
|
}
|
|
447
445
|
function extractPreviewText(message) {
|
|
448
446
|
if (typeof message.content === "string") {
|
|
449
|
-
const
|
|
450
|
-
return
|
|
447
|
+
const normalized = stripInlineDirectiveTagsForDisplay(message.content).text.trim();
|
|
448
|
+
return normalized ? normalized : null;
|
|
451
449
|
}
|
|
452
450
|
if (Array.isArray(message.content)) {
|
|
453
451
|
const parts = message.content
|
|
454
|
-
.map((entry) =>
|
|
452
|
+
.map((entry) => typeof entry?.text === "string" ? stripInlineDirectiveTagsForDisplay(entry.text).text : "")
|
|
455
453
|
.filter((text) => text.trim().length > 0);
|
|
456
454
|
if (parts.length > 0) {
|
|
457
455
|
return parts.join("\n").trim();
|
|
458
456
|
}
|
|
459
457
|
}
|
|
460
458
|
if (typeof message.text === "string") {
|
|
461
|
-
const
|
|
462
|
-
return
|
|
459
|
+
const normalized = stripInlineDirectiveTagsForDisplay(message.text).text.trim();
|
|
460
|
+
return normalized ? normalized : null;
|
|
463
461
|
}
|
|
464
462
|
return null;
|
|
465
463
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { loadSessionStore } from "../config/sessions.js";
|
|
1
|
+
import { loadSessionStore, updateSessionStore } from "../config/sessions.js";
|
|
2
2
|
import { parseSessionLabel } from "../sessions/session-label.js";
|
|
3
3
|
import { ErrorCodes, errorShape, } from "./protocol/index.js";
|
|
4
|
-
import { listSessionsFromStore, loadCombinedSessionStoreForGateway, resolveGatewaySessionStoreTarget, } from "./session-utils.js";
|
|
5
|
-
export function resolveSessionKeyFromResolveParams(params) {
|
|
4
|
+
import { listSessionsFromStore, loadCombinedSessionStoreForGateway, pruneLegacyStoreKeys, resolveGatewaySessionStoreTarget, } from "./session-utils.js";
|
|
5
|
+
export async function resolveSessionKeyFromResolveParams(params) {
|
|
6
6
|
const { cfg, p } = params;
|
|
7
7
|
const key = typeof p.key === "string" ? p.key.trim() : "";
|
|
8
8
|
const hasKey = key.length > 0;
|
|
@@ -25,13 +25,25 @@ export function resolveSessionKeyFromResolveParams(params) {
|
|
|
25
25
|
if (hasKey) {
|
|
26
26
|
const target = resolveGatewaySessionStoreTarget({ cfg, key });
|
|
27
27
|
const store = loadSessionStore(target.storePath);
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
if (store[target.canonicalKey]) {
|
|
29
|
+
return { ok: true, key: target.canonicalKey };
|
|
30
|
+
}
|
|
31
|
+
const legacyKey = target.storeKeys.find((candidate) => store[candidate]);
|
|
32
|
+
if (!legacyKey) {
|
|
30
33
|
return {
|
|
31
34
|
ok: false,
|
|
32
35
|
error: errorShape(ErrorCodes.INVALID_REQUEST, `No session found: ${key}`),
|
|
33
36
|
};
|
|
34
37
|
}
|
|
38
|
+
await updateSessionStore(target.storePath, (s) => {
|
|
39
|
+
const liveTarget = resolveGatewaySessionStoreTarget({ cfg, key, store: s });
|
|
40
|
+
const canonicalKey = liveTarget.canonicalKey;
|
|
41
|
+
// Migrate the first legacy entry to the canonical key.
|
|
42
|
+
if (!s[canonicalKey] && s[legacyKey]) {
|
|
43
|
+
s[canonicalKey] = s[legacyKey];
|
|
44
|
+
}
|
|
45
|
+
pruneLegacyStoreKeys({ store: s, canonicalKey, candidates: liveTarget.storeKeys });
|
|
46
|
+
});
|
|
35
47
|
return { ok: true, key: target.canonicalKey };
|
|
36
48
|
}
|
|
37
49
|
if (hasSessionId) {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
function extractLastUserText(input) {
|
|
2
2
|
for (let i = input.length - 1; i >= 0; i -= 1) {
|
|
3
3
|
const item = input[i];
|
|
4
|
-
if (!item || item.role !== "user")
|
|
4
|
+
if (!item || item.role !== "user") {
|
|
5
5
|
continue;
|
|
6
|
+
}
|
|
6
7
|
const content = item.content;
|
|
7
8
|
if (Array.isArray(content)) {
|
|
8
9
|
const text = content
|
|
@@ -13,8 +14,9 @@ function extractLastUserText(input) {
|
|
|
13
14
|
.map((c) => c.text)
|
|
14
15
|
.join("\n")
|
|
15
16
|
.trim();
|
|
16
|
-
if (text)
|
|
17
|
+
if (text) {
|
|
17
18
|
return text;
|
|
19
|
+
}
|
|
18
20
|
}
|
|
19
21
|
}
|
|
20
22
|
return "";
|
|
@@ -22,8 +24,9 @@ function extractLastUserText(input) {
|
|
|
22
24
|
function extractToolOutput(input) {
|
|
23
25
|
for (const itemRaw of input) {
|
|
24
26
|
const item = itemRaw;
|
|
25
|
-
if (!item || item.type !== "function_call_output")
|
|
27
|
+
if (!item || item.type !== "function_call_output") {
|
|
26
28
|
continue;
|
|
29
|
+
}
|
|
27
30
|
return typeof item.output === "string" ? item.output : "";
|
|
28
31
|
}
|
|
29
32
|
return "";
|
|
@@ -98,14 +101,18 @@ async function* fakeOpenAIResponsesStream(params) {
|
|
|
98
101
|
};
|
|
99
102
|
}
|
|
100
103
|
function decodeBodyText(body) {
|
|
101
|
-
if (!body)
|
|
104
|
+
if (!body) {
|
|
102
105
|
return "";
|
|
103
|
-
|
|
106
|
+
}
|
|
107
|
+
if (typeof body === "string") {
|
|
104
108
|
return body;
|
|
105
|
-
|
|
109
|
+
}
|
|
110
|
+
if (body instanceof Uint8Array) {
|
|
106
111
|
return Buffer.from(body).toString("utf8");
|
|
107
|
-
|
|
112
|
+
}
|
|
113
|
+
if (body instanceof ArrayBuffer) {
|
|
108
114
|
return Buffer.from(new Uint8Array(body)).toString("utf8");
|
|
115
|
+
}
|
|
109
116
|
return "";
|
|
110
117
|
}
|
|
111
118
|
async function buildOpenAIResponsesSse(params) {
|
|
@@ -11,7 +11,7 @@ import { getPluginToolMeta } from "../plugins/tools.js";
|
|
|
11
11
|
import { isSubagentSessionKey } from "../routing/session-key.js";
|
|
12
12
|
import { DEFAULT_GATEWAY_HTTP_TOOL_DENY } from "../security/dangerous-tools.js";
|
|
13
13
|
import { normalizeMessageChannel } from "../utils/message-channel.js";
|
|
14
|
-
import {
|
|
14
|
+
import { authorizeHttpGatewayConnect } from "./auth.js";
|
|
15
15
|
import { readJsonBodyOrError, sendGatewayAuthFailure, sendInvalidRequest, sendJson, sendMethodNotAllowed, } from "./http-common.js";
|
|
16
16
|
import { getBearerToken, getHeader } from "./http-utils.js";
|
|
17
17
|
const DEFAULT_BODY_BYTES = 2 * 1024 * 1024;
|
|
@@ -71,14 +71,23 @@ function getErrorMessage(err) {
|
|
|
71
71
|
}
|
|
72
72
|
return String(err);
|
|
73
73
|
}
|
|
74
|
-
function
|
|
74
|
+
function resolveToolInputErrorStatus(err) {
|
|
75
75
|
if (err instanceof ToolInputError) {
|
|
76
|
-
|
|
76
|
+
const status = err.status;
|
|
77
|
+
return typeof status === "number" ? status : 400;
|
|
78
|
+
}
|
|
79
|
+
if (typeof err !== "object" || err === null || !("name" in err)) {
|
|
80
|
+
return null;
|
|
81
|
+
}
|
|
82
|
+
const name = err.name;
|
|
83
|
+
if (name !== "ToolInputError" && name !== "ToolAuthorizationError") {
|
|
84
|
+
return null;
|
|
77
85
|
}
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
86
|
+
const status = err.status;
|
|
87
|
+
if (typeof status === "number") {
|
|
88
|
+
return status;
|
|
89
|
+
}
|
|
90
|
+
return name === "ToolAuthorizationError" ? 403 : 400;
|
|
82
91
|
}
|
|
83
92
|
export async function handleToolsInvokeHttpRequest(req, res, opts) {
|
|
84
93
|
const url = new URL(req.url ?? "/", `http://${req.headers.host ?? "localhost"}`);
|
|
@@ -91,11 +100,12 @@ export async function handleToolsInvokeHttpRequest(req, res, opts) {
|
|
|
91
100
|
}
|
|
92
101
|
const cfg = loadConfig();
|
|
93
102
|
const token = getBearerToken(req);
|
|
94
|
-
const authResult = await
|
|
103
|
+
const authResult = await authorizeHttpGatewayConnect({
|
|
95
104
|
auth: opts.auth,
|
|
96
105
|
connectAuth: token ? { token, password: token } : null,
|
|
97
106
|
req,
|
|
98
107
|
trustedProxies: opts.trustedProxies ?? cfg.gateway?.trustedProxies,
|
|
108
|
+
allowRealIpFallback: opts.allowRealIpFallback ?? cfg.gateway?.allowRealIpFallback,
|
|
99
109
|
rateLimiter: opts.rateLimiter,
|
|
100
110
|
});
|
|
101
111
|
if (!authResult.ok) {
|
|
@@ -216,8 +226,9 @@ export async function handleToolsInvokeHttpRequest(req, res, opts) {
|
|
|
216
226
|
sendJson(res, 200, { ok: true, result });
|
|
217
227
|
}
|
|
218
228
|
catch (err) {
|
|
219
|
-
|
|
220
|
-
|
|
229
|
+
const inputStatus = resolveToolInputErrorStatus(err);
|
|
230
|
+
if (inputStatus !== null) {
|
|
231
|
+
sendJson(res, inputStatus, {
|
|
221
232
|
ok: false,
|
|
222
233
|
error: { type: "tool_error", message: getErrorMessage(err) || "invalid tool arguments" },
|
|
223
234
|
});
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { filterBootstrapFilesForSession, loadExtraBootstrapFiles, } from "../../../agents/workspace.js";
|
|
2
|
+
import { createSubsystemLogger } from "../../../logging/subsystem.js";
|
|
2
3
|
import { resolveHookConfig } from "../../config.js";
|
|
3
4
|
import { isAgentBootstrapEvent } from "../../hooks.js";
|
|
4
5
|
const HOOK_KEY = "bootstrap-extra-files";
|
|
6
|
+
const log = createSubsystemLogger("bootstrap-extra-files");
|
|
5
7
|
function normalizeStringArray(value) {
|
|
6
8
|
if (!Array.isArray(value)) {
|
|
7
9
|
return [];
|
|
@@ -40,7 +42,7 @@ const bootstrapExtraFilesHook = async (event) => {
|
|
|
40
42
|
context.bootstrapFiles = filterBootstrapFilesForSession([...context.bootstrapFiles, ...extras], context.sessionKey);
|
|
41
43
|
}
|
|
42
44
|
catch (err) {
|
|
43
|
-
|
|
45
|
+
log.warn(`failed: ${String(err)}`);
|
|
44
46
|
}
|
|
45
47
|
};
|
|
46
48
|
export default bootstrapExtraFilesHook;
|
|
@@ -25,6 +25,9 @@
|
|
|
25
25
|
import fs from "node:fs/promises";
|
|
26
26
|
import path from "node:path";
|
|
27
27
|
import os from "node:os";
|
|
28
|
+
import { resolveStateDir } from "../../../config/paths.js";
|
|
29
|
+
import { createSubsystemLogger } from "../../../logging/subsystem.js";
|
|
30
|
+
const log = createSubsystemLogger("command-logger");
|
|
28
31
|
/**
|
|
29
32
|
* Log all command events to a file
|
|
30
33
|
*/
|
|
@@ -35,7 +38,8 @@ const logCommand = async (event) => {
|
|
|
35
38
|
}
|
|
36
39
|
try {
|
|
37
40
|
// Create log directory
|
|
38
|
-
const
|
|
41
|
+
const stateDir = resolveStateDir(process.env, os.homedir);
|
|
42
|
+
const logDir = path.join(stateDir, "logs");
|
|
39
43
|
await fs.mkdir(logDir, { recursive: true });
|
|
40
44
|
// Append to command log file
|
|
41
45
|
const logFile = path.join(logDir, "commands.log");
|
|
@@ -49,7 +53,8 @@ const logCommand = async (event) => {
|
|
|
49
53
|
await fs.appendFile(logFile, logLine, "utf-8");
|
|
50
54
|
}
|
|
51
55
|
catch (err) {
|
|
52
|
-
|
|
56
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
57
|
+
log.error(`Failed to log command: ${message}`);
|
|
53
58
|
}
|
|
54
59
|
};
|
|
55
60
|
export default logCommand;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Session memory hook handler
|
|
3
3
|
*
|
|
4
|
-
* Saves session context to memory when /new command is triggered
|
|
4
|
+
* Saves session context to memory when /new or /reset command is triggered
|
|
5
5
|
* Creates a new dated memory file with LLM-generated slug
|
|
6
6
|
*/
|
|
7
7
|
import fs from "node:fs/promises";
|
|
@@ -137,15 +137,16 @@ async function findPreviousSessionFile(params) {
|
|
|
137
137
|
return undefined;
|
|
138
138
|
}
|
|
139
139
|
/**
|
|
140
|
-
* Save session context to memory when /new command is triggered
|
|
140
|
+
* Save session context to memory when /new or /reset command is triggered
|
|
141
141
|
*/
|
|
142
142
|
const saveSessionToMemory = async (event) => {
|
|
143
|
-
// Only trigger on
|
|
144
|
-
|
|
143
|
+
// Only trigger on reset/new commands
|
|
144
|
+
const isResetCommand = event.action === "new" || event.action === "reset";
|
|
145
|
+
if (event.type !== "command" || !isResetCommand) {
|
|
145
146
|
return;
|
|
146
147
|
}
|
|
147
148
|
try {
|
|
148
|
-
log.debug("Hook triggered for /new command");
|
|
149
|
+
log.debug("Hook triggered for reset/new command", { action: event.action });
|
|
149
150
|
const context = event.context || {};
|
|
150
151
|
const cfg = context.cfg;
|
|
151
152
|
const agentId = resolveAgentIdFromSessionKey(event.sessionKey);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { parseFrontmatterBlock } from "../markdown/frontmatter.js";
|
|
2
|
-
import { getFrontmatterString, normalizeStringList,
|
|
2
|
+
import { getFrontmatterString, normalizeStringList, parsePoolBotManifestInstallBase, parseFrontmatterBool, resolvePoolBotManifestBlock, resolvePoolBotManifestInstall, resolvePoolBotManifestOs, resolvePoolBotManifestRequires, } from "../shared/frontmatter.js";
|
|
3
3
|
export function parseFrontmatter(content) {
|
|
4
4
|
return parseFrontmatterBlock(content);
|
|
5
5
|
}
|
|
6
6
|
function parseInstallSpec(input) {
|
|
7
|
-
const parsed =
|
|
7
|
+
const parsed = parsePoolBotManifestInstallBase(input, ["bundled", "npm", "git"]);
|
|
8
8
|
if (!parsed) {
|
|
9
9
|
return undefined;
|
|
10
10
|
}
|
|
@@ -30,13 +30,13 @@ function parseInstallSpec(input) {
|
|
|
30
30
|
return spec;
|
|
31
31
|
}
|
|
32
32
|
export function resolvePoolbotMetadata(frontmatter) {
|
|
33
|
-
const metadataObj =
|
|
33
|
+
const metadataObj = resolvePoolBotManifestBlock({ frontmatter });
|
|
34
34
|
if (!metadataObj) {
|
|
35
35
|
return undefined;
|
|
36
36
|
}
|
|
37
|
-
const requires =
|
|
38
|
-
const install =
|
|
39
|
-
const osRaw =
|
|
37
|
+
const requires = resolvePoolBotManifestRequires(metadataObj);
|
|
38
|
+
const install = resolvePoolBotManifestInstall(metadataObj, parseInstallSpec);
|
|
39
|
+
const osRaw = resolvePoolBotManifestOs(metadataObj);
|
|
40
40
|
const eventsRaw = normalizeStringList(metadataObj.events);
|
|
41
41
|
return {
|
|
42
42
|
always: typeof metadataObj.always === "boolean" ? metadataObj.always : undefined,
|
|
@@ -8,8 +8,8 @@ import { spawn } from "node:child_process";
|
|
|
8
8
|
import { hasBinary } from "../agents/skills.js";
|
|
9
9
|
import { createSubsystemLogger } from "../logging/subsystem.js";
|
|
10
10
|
import { runCommandWithTimeout } from "../process/exec.js";
|
|
11
|
-
import { buildGogWatchServeArgs, buildGogWatchStartArgs, resolveGmailHookRuntimeConfig, } from "./gmail.js";
|
|
12
11
|
import { ensureTailscaleEndpoint } from "./gmail-setup-utils.js";
|
|
12
|
+
import { buildGogWatchServeArgs, buildGogWatchStartArgs, resolveGmailHookRuntimeConfig, } from "./gmail.js";
|
|
13
13
|
const log = createSubsystemLogger("gmail-watcher");
|
|
14
14
|
const ADDRESS_IN_USE_RE = /address already in use|EADDRINUSE/i;
|
|
15
15
|
export function isAddressInUseError(line) {
|
|
@@ -58,13 +58,15 @@ function spawnGogServe(cfg) {
|
|
|
58
58
|
});
|
|
59
59
|
child.stdout?.on("data", (data) => {
|
|
60
60
|
const line = data.toString().trim();
|
|
61
|
-
if (line)
|
|
61
|
+
if (line) {
|
|
62
62
|
log.info(`[gog] ${line}`);
|
|
63
|
+
}
|
|
63
64
|
});
|
|
64
65
|
child.stderr?.on("data", (data) => {
|
|
65
66
|
const line = data.toString().trim();
|
|
66
|
-
if (!line)
|
|
67
|
+
if (!line) {
|
|
67
68
|
return;
|
|
69
|
+
}
|
|
68
70
|
if (isAddressInUseError(line)) {
|
|
69
71
|
addressInUse = true;
|
|
70
72
|
}
|
|
@@ -74,8 +76,9 @@ function spawnGogServe(cfg) {
|
|
|
74
76
|
log.error(`gog process error: ${String(err)}`);
|
|
75
77
|
});
|
|
76
78
|
child.on("exit", (code, signal) => {
|
|
77
|
-
if (shuttingDown)
|
|
79
|
+
if (shuttingDown) {
|
|
78
80
|
return;
|
|
81
|
+
}
|
|
79
82
|
if (addressInUse) {
|
|
80
83
|
log.warn("gog serve failed to bind (address already in use); stopping restarts. " +
|
|
81
84
|
"Another watcher is likely running. Set POOLBOT_SKIP_GMAIL_WATCHER=1 or stop the other process.");
|
|
@@ -85,8 +88,9 @@ function spawnGogServe(cfg) {
|
|
|
85
88
|
log.warn(`gog exited (code=${code}, signal=${signal}); restarting in 5s`);
|
|
86
89
|
watcherProcess = null;
|
|
87
90
|
setTimeout(() => {
|
|
88
|
-
if (shuttingDown || !currentConfig)
|
|
91
|
+
if (shuttingDown || !currentConfig) {
|
|
89
92
|
return;
|
|
93
|
+
}
|
|
90
94
|
watcherProcess = spawnGogServe(currentConfig);
|
|
91
95
|
}, 5000);
|
|
92
96
|
});
|
|
@@ -146,8 +150,9 @@ export async function startGmailWatcher(cfg) {
|
|
|
146
150
|
// Set up renewal interval
|
|
147
151
|
const renewMs = runtimeConfig.renewEveryMinutes * 60_000;
|
|
148
152
|
renewInterval = setInterval(() => {
|
|
149
|
-
if (shuttingDown)
|
|
153
|
+
if (shuttingDown) {
|
|
150
154
|
return;
|
|
155
|
+
}
|
|
151
156
|
void startGmailWatch(runtimeConfig);
|
|
152
157
|
}, renewMs);
|
|
153
158
|
log.info(`gmail watcher started for ${runtimeConfig.account} (renew every ${runtimeConfig.renewEveryMinutes}m)`);
|
|
@@ -4,8 +4,10 @@
|
|
|
4
4
|
* Provides an extensible event-driven hook system for agent events
|
|
5
5
|
* like command processing, session lifecycle, etc.
|
|
6
6
|
*/
|
|
7
|
+
import { createSubsystemLogger } from "../logging/subsystem.js";
|
|
7
8
|
/** Registry of hook handlers by event key */
|
|
8
9
|
const handlers = new Map();
|
|
10
|
+
const log = createSubsystemLogger("internal-hooks");
|
|
9
11
|
/**
|
|
10
12
|
* Register a hook handler for a specific event type or event:action combination
|
|
11
13
|
*
|
|
@@ -87,7 +89,8 @@ export async function triggerInternalHook(event) {
|
|
|
87
89
|
await handler(event);
|
|
88
90
|
}
|
|
89
91
|
catch (err) {
|
|
90
|
-
|
|
92
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
93
|
+
log.error(`Hook error [${event.type}:${event.action}]: ${message}`);
|
|
91
94
|
}
|
|
92
95
|
}
|
|
93
96
|
}
|
|
@@ -122,6 +125,13 @@ export function isAgentBootstrapEvent(event) {
|
|
|
122
125
|
}
|
|
123
126
|
return Array.isArray(context.bootstrapFiles);
|
|
124
127
|
}
|
|
128
|
+
export function isGatewayStartupEvent(event) {
|
|
129
|
+
if (event.type !== "gateway" || event.action !== "startup") {
|
|
130
|
+
return false;
|
|
131
|
+
}
|
|
132
|
+
const context = event.context;
|
|
133
|
+
return Boolean(context && typeof context === "object");
|
|
134
|
+
}
|
|
125
135
|
export function isMessageReceivedEvent(event) {
|
|
126
136
|
if (event.type !== "message" || event.action !== "received") {
|
|
127
137
|
return false;
|
|
@@ -6,6 +6,8 @@ import os from "node:os";
|
|
|
6
6
|
import path from "node:path";
|
|
7
7
|
import { runEmbeddedPiAgent } from "../agents/pi-embedded.js";
|
|
8
8
|
import { resolveDefaultAgentId, resolveAgentWorkspaceDir, resolveAgentDir, } from "../agents/agent-scope.js";
|
|
9
|
+
import { createSubsystemLogger } from "../logging/subsystem.js";
|
|
10
|
+
const log = createSubsystemLogger("llm-slug-generator");
|
|
9
11
|
/**
|
|
10
12
|
* Generate a short 1-2 word filename slug from session content using LLM
|
|
11
13
|
*/
|
|
@@ -53,7 +55,8 @@ Reply with ONLY the slug, nothing else. Examples: "vendor-pitch", "api-design",
|
|
|
53
55
|
return null;
|
|
54
56
|
}
|
|
55
57
|
catch (err) {
|
|
56
|
-
|
|
58
|
+
const message = err instanceof Error ? (err.stack ?? err.message) : String(err);
|
|
59
|
+
log.error(`Failed to generate slug: ${message}`);
|
|
57
60
|
return null;
|
|
58
61
|
}
|
|
59
62
|
finally {
|