@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
|
@@ -15,16 +15,18 @@ const hookPresetMappings = {
|
|
|
15
15
|
],
|
|
16
16
|
};
|
|
17
17
|
const transformCache = new Map();
|
|
18
|
-
export function resolveHookMappings(hooks) {
|
|
18
|
+
export function resolveHookMappings(hooks, opts) {
|
|
19
19
|
const presets = hooks?.presets ?? [];
|
|
20
20
|
const gmailAllowUnsafe = hooks?.gmail?.allowUnsafeExternalContent;
|
|
21
21
|
const mappings = [];
|
|
22
|
-
if (hooks?.mappings)
|
|
22
|
+
if (hooks?.mappings) {
|
|
23
23
|
mappings.push(...hooks.mappings);
|
|
24
|
+
}
|
|
24
25
|
for (const preset of presets) {
|
|
25
26
|
const presetMappings = hookPresetMappings[preset];
|
|
26
|
-
if (!presetMappings)
|
|
27
|
+
if (!presetMappings) {
|
|
27
28
|
continue;
|
|
29
|
+
}
|
|
28
30
|
if (preset === "gmail" && typeof gmailAllowUnsafe === "boolean") {
|
|
29
31
|
mappings.push(...presetMappings.map((mapping) => ({
|
|
30
32
|
...mapping,
|
|
@@ -34,23 +36,26 @@ export function resolveHookMappings(hooks) {
|
|
|
34
36
|
}
|
|
35
37
|
mappings.push(...presetMappings);
|
|
36
38
|
}
|
|
37
|
-
if (mappings.length === 0)
|
|
39
|
+
if (mappings.length === 0) {
|
|
38
40
|
return [];
|
|
39
|
-
|
|
40
|
-
const
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
}
|
|
42
|
+
const configDir = path.resolve(opts?.configDir ?? path.dirname(CONFIG_PATH));
|
|
43
|
+
const transformsRootDir = path.join(configDir, "hooks", "transforms");
|
|
44
|
+
const transformsDir = resolveOptionalContainedPath(transformsRootDir, hooks?.transformsDir, "Hook transformsDir");
|
|
43
45
|
return mappings.map((mapping, index) => normalizeHookMapping(mapping, index, transformsDir));
|
|
44
46
|
}
|
|
45
47
|
export async function applyHookMappings(mappings, ctx) {
|
|
46
|
-
if (mappings.length === 0)
|
|
48
|
+
if (mappings.length === 0) {
|
|
47
49
|
return null;
|
|
50
|
+
}
|
|
48
51
|
for (const mapping of mappings) {
|
|
49
|
-
if (!mappingMatches(mapping, ctx))
|
|
52
|
+
if (!mappingMatches(mapping, ctx)) {
|
|
50
53
|
continue;
|
|
54
|
+
}
|
|
51
55
|
const base = buildActionFromMapping(mapping, ctx);
|
|
52
|
-
if (!base.ok)
|
|
56
|
+
if (!base.ok) {
|
|
53
57
|
return base;
|
|
58
|
+
}
|
|
54
59
|
let override = null;
|
|
55
60
|
if (mapping.transform) {
|
|
56
61
|
const transform = await loadTransform(mapping.transform);
|
|
@@ -59,11 +64,13 @@ export async function applyHookMappings(mappings, ctx) {
|
|
|
59
64
|
return { ok: true, action: null, skipped: true };
|
|
60
65
|
}
|
|
61
66
|
}
|
|
62
|
-
if (!base.action)
|
|
67
|
+
if (!base.action) {
|
|
63
68
|
return { ok: true, action: null, skipped: true };
|
|
69
|
+
}
|
|
64
70
|
const merged = mergeAction(base.action, override, mapping.action);
|
|
65
|
-
if (!merged.ok)
|
|
71
|
+
if (!merged.ok) {
|
|
66
72
|
return merged;
|
|
73
|
+
}
|
|
67
74
|
return merged;
|
|
68
75
|
}
|
|
69
76
|
return null;
|
|
@@ -76,7 +83,7 @@ function normalizeHookMapping(mapping, index, transformsDir) {
|
|
|
76
83
|
const wakeMode = mapping.wakeMode ?? "now";
|
|
77
84
|
const transform = mapping.transform
|
|
78
85
|
? {
|
|
79
|
-
modulePath:
|
|
86
|
+
modulePath: resolveContainedPath(transformsDir, mapping.transform.module, "Hook transform"),
|
|
80
87
|
exportName: mapping.transform.export?.trim() || undefined,
|
|
81
88
|
}
|
|
82
89
|
: undefined;
|
|
@@ -103,13 +110,15 @@ function normalizeHookMapping(mapping, index, transformsDir) {
|
|
|
103
110
|
}
|
|
104
111
|
function mappingMatches(mapping, ctx) {
|
|
105
112
|
if (mapping.matchPath) {
|
|
106
|
-
if (mapping.matchPath !== normalizeMatchPath(ctx.path))
|
|
113
|
+
if (mapping.matchPath !== normalizeMatchPath(ctx.path)) {
|
|
107
114
|
return false;
|
|
115
|
+
}
|
|
108
116
|
}
|
|
109
117
|
if (mapping.matchSource) {
|
|
110
118
|
const source = typeof ctx.payload.source === "string" ? ctx.payload.source : undefined;
|
|
111
|
-
if (!source || source !== mapping.matchSource)
|
|
119
|
+
if (!source || source !== mapping.matchSource) {
|
|
112
120
|
return false;
|
|
121
|
+
}
|
|
113
122
|
}
|
|
114
123
|
return true;
|
|
115
124
|
}
|
|
@@ -149,7 +158,7 @@ function mergeAction(base, override, defaultAction) {
|
|
|
149
158
|
if (!override) {
|
|
150
159
|
return validateAction(base);
|
|
151
160
|
}
|
|
152
|
-
const kind =
|
|
161
|
+
const kind = override.kind ?? base.kind ?? defaultAction;
|
|
153
162
|
if (kind === "wake") {
|
|
154
163
|
const baseWake = base.kind === "wake" ? base : undefined;
|
|
155
164
|
const text = typeof override.text === "string" ? override.text : (baseWake?.text ?? "");
|
|
@@ -190,13 +199,15 @@ function validateAction(action) {
|
|
|
190
199
|
return { ok: true, action };
|
|
191
200
|
}
|
|
192
201
|
async function loadTransform(transform) {
|
|
193
|
-
const
|
|
194
|
-
|
|
202
|
+
const cacheKey = `${transform.modulePath}::${transform.exportName ?? "default"}`;
|
|
203
|
+
const cached = transformCache.get(cacheKey);
|
|
204
|
+
if (cached) {
|
|
195
205
|
return cached;
|
|
206
|
+
}
|
|
196
207
|
const url = pathToFileURL(transform.modulePath).href;
|
|
197
208
|
const mod = (await import(url));
|
|
198
209
|
const fn = resolveTransformFn(mod, transform.exportName);
|
|
199
|
-
transformCache.set(
|
|
210
|
+
transformCache.set(cacheKey, fn);
|
|
200
211
|
return fn;
|
|
201
212
|
}
|
|
202
213
|
function resolveTransformFn(mod, exportName) {
|
|
@@ -207,45 +218,73 @@ function resolveTransformFn(mod, exportName) {
|
|
|
207
218
|
return candidate;
|
|
208
219
|
}
|
|
209
220
|
function resolvePath(baseDir, target) {
|
|
210
|
-
if (!target)
|
|
211
|
-
return baseDir;
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
221
|
+
if (!target) {
|
|
222
|
+
return path.resolve(baseDir);
|
|
223
|
+
}
|
|
224
|
+
return path.isAbsolute(target) ? path.resolve(target) : path.resolve(baseDir, target);
|
|
225
|
+
}
|
|
226
|
+
function resolveContainedPath(baseDir, target, label) {
|
|
227
|
+
const base = path.resolve(baseDir);
|
|
228
|
+
const trimmed = target?.trim();
|
|
229
|
+
if (!trimmed) {
|
|
230
|
+
throw new Error(`${label} module path is required`);
|
|
231
|
+
}
|
|
232
|
+
const resolved = resolvePath(base, trimmed);
|
|
233
|
+
const relative = path.relative(base, resolved);
|
|
234
|
+
if (relative === ".." || relative.startsWith(`..${path.sep}`) || path.isAbsolute(relative)) {
|
|
235
|
+
throw new Error(`${label} module path must be within ${base}: ${target}`);
|
|
236
|
+
}
|
|
237
|
+
return resolved;
|
|
238
|
+
}
|
|
239
|
+
function resolveOptionalContainedPath(baseDir, target, label) {
|
|
240
|
+
const trimmed = target?.trim();
|
|
241
|
+
if (!trimmed) {
|
|
242
|
+
return path.resolve(baseDir);
|
|
243
|
+
}
|
|
244
|
+
return resolveContainedPath(baseDir, trimmed, label);
|
|
215
245
|
}
|
|
216
246
|
function normalizeMatchPath(raw) {
|
|
217
|
-
if (!raw)
|
|
247
|
+
if (!raw) {
|
|
218
248
|
return undefined;
|
|
249
|
+
}
|
|
219
250
|
const trimmed = raw.trim();
|
|
220
|
-
if (!trimmed)
|
|
251
|
+
if (!trimmed) {
|
|
221
252
|
return undefined;
|
|
253
|
+
}
|
|
222
254
|
return trimmed.replace(/^\/+/, "").replace(/\/+$/, "");
|
|
223
255
|
}
|
|
224
256
|
function renderOptional(value, ctx) {
|
|
225
|
-
if (!value)
|
|
257
|
+
if (!value) {
|
|
226
258
|
return undefined;
|
|
259
|
+
}
|
|
227
260
|
const rendered = renderTemplate(value, ctx).trim();
|
|
228
261
|
return rendered ? rendered : undefined;
|
|
229
262
|
}
|
|
230
263
|
function renderTemplate(template, ctx) {
|
|
231
|
-
if (!template)
|
|
264
|
+
if (!template) {
|
|
232
265
|
return "";
|
|
266
|
+
}
|
|
233
267
|
return template.replace(/\{\{\s*([^}]+)\s*\}\}/g, (_, expr) => {
|
|
234
268
|
const value = resolveTemplateExpr(expr.trim(), ctx);
|
|
235
|
-
if (value === undefined || value === null)
|
|
269
|
+
if (value === undefined || value === null) {
|
|
236
270
|
return "";
|
|
237
|
-
|
|
271
|
+
}
|
|
272
|
+
if (typeof value === "string") {
|
|
238
273
|
return value;
|
|
239
|
-
|
|
274
|
+
}
|
|
275
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
240
276
|
return String(value);
|
|
277
|
+
}
|
|
241
278
|
return JSON.stringify(value);
|
|
242
279
|
});
|
|
243
280
|
}
|
|
244
281
|
function resolveTemplateExpr(expr, ctx) {
|
|
245
|
-
if (expr === "path")
|
|
282
|
+
if (expr === "path") {
|
|
246
283
|
return ctx.path;
|
|
247
|
-
|
|
284
|
+
}
|
|
285
|
+
if (expr === "now") {
|
|
248
286
|
return new Date().toISOString();
|
|
287
|
+
}
|
|
249
288
|
if (expr.startsWith("headers.")) {
|
|
250
289
|
return getByPath(ctx.headers, expr.slice("headers.".length));
|
|
251
290
|
}
|
|
@@ -257,9 +296,14 @@ function resolveTemplateExpr(expr, ctx) {
|
|
|
257
296
|
}
|
|
258
297
|
return getByPath(ctx.payload, expr);
|
|
259
298
|
}
|
|
299
|
+
// Block traversal into prototype-chain properties on attacker-controlled
|
|
300
|
+
// webhook payloads. Mirrors the same blocklist used by config-paths.ts
|
|
301
|
+
// for config path traversal.
|
|
302
|
+
const BLOCKED_PATH_KEYS = new Set(["__proto__", "prototype", "constructor"]);
|
|
260
303
|
function getByPath(input, pathExpr) {
|
|
261
|
-
if (!pathExpr)
|
|
304
|
+
if (!pathExpr) {
|
|
262
305
|
return undefined;
|
|
306
|
+
}
|
|
263
307
|
const parts = [];
|
|
264
308
|
const re = /([^.[\]]+)|(\[(\d+)\])/g;
|
|
265
309
|
let match = re.exec(pathExpr);
|
|
@@ -274,16 +318,22 @@ function getByPath(input, pathExpr) {
|
|
|
274
318
|
}
|
|
275
319
|
let current = input;
|
|
276
320
|
for (const part of parts) {
|
|
277
|
-
if (current === null || current === undefined)
|
|
321
|
+
if (current === null || current === undefined) {
|
|
278
322
|
return undefined;
|
|
323
|
+
}
|
|
279
324
|
if (typeof part === "number") {
|
|
280
|
-
if (!Array.isArray(current))
|
|
325
|
+
if (!Array.isArray(current)) {
|
|
281
326
|
return undefined;
|
|
327
|
+
}
|
|
282
328
|
current = current[part];
|
|
283
329
|
continue;
|
|
284
330
|
}
|
|
285
|
-
if (
|
|
331
|
+
if (BLOCKED_PATH_KEYS.has(part)) {
|
|
332
|
+
return undefined;
|
|
333
|
+
}
|
|
334
|
+
if (typeof current !== "object") {
|
|
286
335
|
return undefined;
|
|
336
|
+
}
|
|
287
337
|
current = current[part];
|
|
288
338
|
}
|
|
289
339
|
return current;
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { authorizeHttpGatewayConnect } from "./auth.js";
|
|
2
2
|
import { sendGatewayAuthFailure } from "./http-common.js";
|
|
3
3
|
import { getBearerToken } from "./http-utils.js";
|
|
4
4
|
export async function authorizeGatewayBearerRequestOrReply(params) {
|
|
5
5
|
const token = getBearerToken(params.req);
|
|
6
|
-
const authResult = await
|
|
6
|
+
const authResult = await authorizeHttpGatewayConnect({
|
|
7
7
|
auth: params.auth,
|
|
8
8
|
connectAuth: token ? { token, password: token } : null,
|
|
9
9
|
req: params.req,
|
|
10
10
|
trustedProxies: params.trustedProxies,
|
|
11
|
+
allowRealIpFallback: params.allowRealIpFallback,
|
|
11
12
|
rateLimiter: params.rateLimiter,
|
|
12
13
|
});
|
|
13
14
|
if (!authResult.ok) {
|
package/dist/gateway/net.js
CHANGED
|
@@ -135,19 +135,44 @@ function stripOptionalPort(ip) {
|
|
|
135
135
|
}
|
|
136
136
|
return ip;
|
|
137
137
|
}
|
|
138
|
-
|
|
139
|
-
const
|
|
140
|
-
if (!
|
|
138
|
+
function parseIpLiteral(raw) {
|
|
139
|
+
const trimmed = raw?.trim();
|
|
140
|
+
if (!trimmed) {
|
|
141
|
+
return undefined;
|
|
142
|
+
}
|
|
143
|
+
const stripped = stripOptionalPort(trimmed);
|
|
144
|
+
const normalized = normalizeIp(stripped);
|
|
145
|
+
if (!normalized || net.isIP(normalized) === 0) {
|
|
141
146
|
return undefined;
|
|
142
147
|
}
|
|
143
|
-
return
|
|
148
|
+
return normalized;
|
|
144
149
|
}
|
|
145
150
|
function parseRealIp(realIp) {
|
|
146
|
-
|
|
147
|
-
|
|
151
|
+
return parseIpLiteral(realIp);
|
|
152
|
+
}
|
|
153
|
+
function resolveForwardedClientIp(params) {
|
|
154
|
+
const { forwardedFor, trustedProxies } = params;
|
|
155
|
+
if (!trustedProxies?.length) {
|
|
148
156
|
return undefined;
|
|
149
157
|
}
|
|
150
|
-
|
|
158
|
+
const forwardedChain = [];
|
|
159
|
+
for (const entry of forwardedFor?.split(",") ?? []) {
|
|
160
|
+
const normalized = parseIpLiteral(entry);
|
|
161
|
+
if (normalized) {
|
|
162
|
+
forwardedChain.push(normalized);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
if (forwardedChain.length === 0) {
|
|
166
|
+
return undefined;
|
|
167
|
+
}
|
|
168
|
+
// Walk right-to-left and return the first untrusted hop.
|
|
169
|
+
for (let index = forwardedChain.length - 1; index >= 0; index -= 1) {
|
|
170
|
+
const hop = forwardedChain[index];
|
|
171
|
+
if (!isTrustedProxyAddress(hop, trustedProxies)) {
|
|
172
|
+
return hop;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return undefined;
|
|
151
176
|
}
|
|
152
177
|
/**
|
|
153
178
|
* Check if an IP address matches a CIDR block.
|
|
@@ -202,7 +227,7 @@ export function isTrustedProxyAddress(ip, trustedProxies) {
|
|
|
202
227
|
return normalizeIp(candidate) === normalized;
|
|
203
228
|
});
|
|
204
229
|
}
|
|
205
|
-
export function
|
|
230
|
+
export function resolveClientIp(params) {
|
|
206
231
|
const remote = normalizeIp(params.remoteAddr);
|
|
207
232
|
if (!remote) {
|
|
208
233
|
return undefined;
|
|
@@ -210,7 +235,20 @@ export function resolveGatewayClientIp(params) {
|
|
|
210
235
|
if (!isTrustedProxyAddress(remote, params.trustedProxies)) {
|
|
211
236
|
return remote;
|
|
212
237
|
}
|
|
213
|
-
|
|
238
|
+
// Fail closed when traffic comes from a trusted proxy but client-origin headers
|
|
239
|
+
// are missing or invalid. Falling back to the proxy's own IP can accidentally
|
|
240
|
+
// treat unrelated requests as local/trusted.
|
|
241
|
+
const forwardedIp = resolveForwardedClientIp({
|
|
242
|
+
forwardedFor: params.forwardedFor,
|
|
243
|
+
trustedProxies: params.trustedProxies,
|
|
244
|
+
});
|
|
245
|
+
if (forwardedIp) {
|
|
246
|
+
return forwardedIp;
|
|
247
|
+
}
|
|
248
|
+
if (params.allowRealIpFallback) {
|
|
249
|
+
return parseRealIp(params.realIp);
|
|
250
|
+
}
|
|
251
|
+
return undefined;
|
|
214
252
|
}
|
|
215
253
|
export function isLocalGatewayAddress(ip) {
|
|
216
254
|
if (isLoopbackAddress(ip)) {
|
|
@@ -348,9 +386,13 @@ export function isLoopbackHost(host) {
|
|
|
348
386
|
return isLoopbackAddress(unbracket);
|
|
349
387
|
}
|
|
350
388
|
/**
|
|
351
|
-
*
|
|
352
|
-
*
|
|
353
|
-
*
|
|
389
|
+
* Security check for WebSocket URLs (CWE-319: Cleartext Transmission of Sensitive Information).
|
|
390
|
+
*
|
|
391
|
+
* Returns true if the URL is secure for transmitting data:
|
|
392
|
+
* - wss:// (TLS) is always secure
|
|
393
|
+
* - ws:// is only secure for loopback addresses (localhost, 127.x.x.x, ::1)
|
|
394
|
+
*
|
|
395
|
+
* All other ws:// URLs are considered insecure because both credentials
|
|
354
396
|
* AND chat/conversation data would be exposed to network interception.
|
|
355
397
|
*/
|
|
356
398
|
export function isSecureWebSocketUrl(url) {
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveSystemRunCommand } from "../infra/system-run-command.js";
|
|
2
2
|
function asRecord(value) {
|
|
3
3
|
if (!value || typeof value !== "object" || Array.isArray(value)) {
|
|
4
4
|
return null;
|
|
@@ -20,24 +20,10 @@ function clientHasApprovals(client) {
|
|
|
20
20
|
const scopes = Array.isArray(client?.connect?.scopes) ? client?.connect?.scopes : [];
|
|
21
21
|
return scopes.includes("operator.admin") || scopes.includes("operator.approvals");
|
|
22
22
|
}
|
|
23
|
-
function
|
|
24
|
-
const raw = normalizeString(params.rawCommand);
|
|
25
|
-
if (raw) {
|
|
26
|
-
return raw;
|
|
27
|
-
}
|
|
28
|
-
if (Array.isArray(params.command)) {
|
|
29
|
-
const parts = params.command.map((v) => String(v));
|
|
30
|
-
if (parts.length > 0) {
|
|
31
|
-
return formatExecCommand(parts);
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return "";
|
|
35
|
-
}
|
|
36
|
-
function approvalMatchesRequest(params, record) {
|
|
23
|
+
function approvalMatchesRequest(cmdText, params, record) {
|
|
37
24
|
if (record.request.host !== "node") {
|
|
38
25
|
return false;
|
|
39
26
|
}
|
|
40
|
-
const cmdText = getCmdText(params);
|
|
41
27
|
if (!cmdText || record.request.command !== cmdText) {
|
|
42
28
|
return false;
|
|
43
29
|
}
|
|
@@ -90,25 +76,18 @@ export function sanitizeSystemRunParamsForForwarding(opts) {
|
|
|
90
76
|
return { ok: true, params: opts.rawParams };
|
|
91
77
|
}
|
|
92
78
|
const p = obj;
|
|
93
|
-
const
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
}
|
|
103
|
-
const validation = validateSystemRunCommandConsistency({ argv, rawCommand: raw });
|
|
104
|
-
if (!validation.ok) {
|
|
105
|
-
return {
|
|
106
|
-
ok: false,
|
|
107
|
-
message: validation.message,
|
|
108
|
-
details: validation.details ?? { code: "RAW_COMMAND_MISMATCH" },
|
|
109
|
-
};
|
|
110
|
-
}
|
|
79
|
+
const cmdTextResolution = resolveSystemRunCommand({
|
|
80
|
+
command: p.command,
|
|
81
|
+
rawCommand: p.rawCommand,
|
|
82
|
+
});
|
|
83
|
+
if (!cmdTextResolution.ok) {
|
|
84
|
+
return {
|
|
85
|
+
ok: false,
|
|
86
|
+
message: cmdTextResolution.message,
|
|
87
|
+
details: cmdTextResolution.details,
|
|
88
|
+
};
|
|
111
89
|
}
|
|
90
|
+
const cmdText = cmdTextResolution.cmdText;
|
|
112
91
|
const approved = p.approved === true;
|
|
113
92
|
const requestedDecision = normalizeApprovalDecision(p.approvalDecision);
|
|
114
93
|
const wantsApprovalOverride = approved || requestedDecision !== null;
|
|
@@ -171,7 +150,7 @@ export function sanitizeSystemRunParamsForForwarding(opts) {
|
|
|
171
150
|
details: { code: "APPROVAL_CLIENT_MISMATCH", runId },
|
|
172
151
|
};
|
|
173
152
|
}
|
|
174
|
-
if (!approvalMatchesRequest(p, snapshot)) {
|
|
153
|
+
if (!approvalMatchesRequest(cmdText, p, snapshot)) {
|
|
175
154
|
return {
|
|
176
155
|
ok: false,
|
|
177
156
|
message: "approval id does not match request",
|
|
@@ -40,13 +40,15 @@ export class NodeRegistry {
|
|
|
40
40
|
}
|
|
41
41
|
unregister(connId) {
|
|
42
42
|
const nodeId = this.nodesByConn.get(connId);
|
|
43
|
-
if (!nodeId)
|
|
43
|
+
if (!nodeId) {
|
|
44
44
|
return null;
|
|
45
|
+
}
|
|
45
46
|
this.nodesByConn.delete(connId);
|
|
46
47
|
this.nodesById.delete(nodeId);
|
|
47
48
|
for (const [id, pending] of this.pendingInvokes.entries()) {
|
|
48
|
-
if (pending.nodeId !== nodeId)
|
|
49
|
+
if (pending.nodeId !== nodeId) {
|
|
49
50
|
continue;
|
|
51
|
+
}
|
|
50
52
|
clearTimeout(pending.timer);
|
|
51
53
|
pending.reject(new Error(`node disconnected (${pending.command})`));
|
|
52
54
|
this.pendingInvokes.delete(id);
|
|
@@ -103,10 +105,12 @@ export class NodeRegistry {
|
|
|
103
105
|
}
|
|
104
106
|
handleInvokeResult(params) {
|
|
105
107
|
const pending = this.pendingInvokes.get(params.id);
|
|
106
|
-
if (!pending)
|
|
108
|
+
if (!pending) {
|
|
107
109
|
return false;
|
|
108
|
-
|
|
110
|
+
}
|
|
111
|
+
if (pending.nodeId !== params.nodeId) {
|
|
109
112
|
return false;
|
|
113
|
+
}
|
|
110
114
|
clearTimeout(pending.timer);
|
|
111
115
|
this.pendingInvokes.delete(params.id);
|
|
112
116
|
pending.resolve({
|
|
@@ -119,8 +123,9 @@ export class NodeRegistry {
|
|
|
119
123
|
}
|
|
120
124
|
sendEvent(nodeId, event, payload) {
|
|
121
125
|
const node = this.nodesById.get(nodeId);
|
|
122
|
-
if (!node)
|
|
126
|
+
if (!node) {
|
|
123
127
|
return false;
|
|
128
|
+
}
|
|
124
129
|
return this.sendEventToSession(node, event, payload);
|
|
125
130
|
}
|
|
126
131
|
sendEventInternal(node, event, payload) {
|
|
@@ -124,6 +124,7 @@ export async function handleOpenAiHttpRequest(req, res, opts) {
|
|
|
124
124
|
connectAuth: { token, password: token },
|
|
125
125
|
req,
|
|
126
126
|
trustedProxies: opts.trustedProxies,
|
|
127
|
+
allowRealIpFallback: opts.allowRealIpFallback,
|
|
127
128
|
});
|
|
128
129
|
if (!authResult.ok) {
|
|
129
130
|
sendUnauthorized(res);
|
|
@@ -215,6 +215,7 @@ export async function handleOpenResponsesHttpRequest(req, res, opts) {
|
|
|
215
215
|
pathname: "/v1/responses",
|
|
216
216
|
auth: opts.auth,
|
|
217
217
|
trustedProxies: opts.trustedProxies,
|
|
218
|
+
allowRealIpFallback: opts.allowRealIpFallback,
|
|
218
219
|
rateLimiter: opts.rateLimiter,
|
|
219
220
|
maxBodyBytes,
|
|
220
221
|
});
|
|
@@ -1,21 +1,4 @@
|
|
|
1
|
-
import { isLoopbackHost } from "./net.js";
|
|
2
|
-
function normalizeHostHeader(hostHeader) {
|
|
3
|
-
return (hostHeader ?? "").trim().toLowerCase();
|
|
4
|
-
}
|
|
5
|
-
function resolveHostName(hostHeader) {
|
|
6
|
-
const host = normalizeHostHeader(hostHeader);
|
|
7
|
-
if (!host) {
|
|
8
|
-
return "";
|
|
9
|
-
}
|
|
10
|
-
if (host.startsWith("[")) {
|
|
11
|
-
const end = host.indexOf("]");
|
|
12
|
-
if (end !== -1) {
|
|
13
|
-
return host.slice(1, end);
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
const [name] = host.split(":");
|
|
17
|
-
return name ?? "";
|
|
18
|
-
}
|
|
1
|
+
import { isLoopbackHost, normalizeHostHeader, resolveHostName } from "./net.js";
|
|
19
2
|
function parseOrigin(originRaw) {
|
|
20
3
|
const trimmed = (originRaw ?? "").trim();
|
|
21
4
|
if (!trimmed || trimmed === "null") {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import AjvPkg from "ajv";
|
|
2
|
-
import { AgentEventSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, AgentParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, AgentWaitParamsSchema, ChannelsLogoutParamsSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRejectParamsSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, ErrorCodes, ErrorShapeSchema, EventFrameSchema, errorShape, GatewayFrameSchema, HelloOkSchema, LogsTailParamsSchema, LogsTailResultSchema, ModelsListParamsSchema, NodeDescribeParamsSchema, NodeEventParamsSchema, NodeInvokeParamsSchema, NodeInvokeResultParamsSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, PollParamsSchema, PROTOCOL_VERSION, PresenceEntrySchema, ProtocolSchemas,
|
|
2
|
+
import { AgentEventSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, AgentParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, AgentWaitParamsSchema, ChannelsLogoutParamsSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, ConnectParamsSchema, CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRemoveParamsSchema, DevicePairRejectParamsSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, ErrorCodes, ErrorShapeSchema, EventFrameSchema, errorShape, GatewayFrameSchema, HelloOkSchema, LogsTailParamsSchema, LogsTailResultSchema, ModelsListParamsSchema, NodeDescribeParamsSchema, NodeEventParamsSchema, NodeInvokeParamsSchema, NodeInvokeResultParamsSchema, NodeListParamsSchema, NodePairApproveParamsSchema, NodePairListParamsSchema, NodePairRejectParamsSchema, NodePairRequestParamsSchema, NodePairVerifyParamsSchema, NodeRenameParamsSchema, PollParamsSchema, PROTOCOL_VERSION, PushTestParamsSchema, PushTestResultSchema, PresenceEntrySchema, ProtocolSchemas, RequestFrameSchema, ResponseFrameSchema, SendParamsSchema, SessionsCompactParamsSchema, SessionsDeleteParamsSchema, SessionsListParamsSchema, SessionsPatchParamsSchema, SessionsPreviewParamsSchema, SessionsResetParamsSchema, SessionsResolveParamsSchema, SessionsUsageParamsSchema, ShutdownEventSchema, SkillsBinsParamsSchema, SkillsInstallParamsSchema, SkillsStatusParamsSchema, SkillsUpdateParamsSchema, SnapshotSchema, StateVersionSchema, TalkModeParamsSchema, TickEventSchema, UpdateRunParamsSchema, WakeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, WizardCancelParamsSchema, WizardNextParamsSchema, WizardNextResultSchema, WizardStartParamsSchema, WizardStartResultSchema, WizardStatusParamsSchema, WizardStatusResultSchema, WizardStepSchema, } from "./schema.js";
|
|
3
3
|
const ajv = new AjvPkg({
|
|
4
4
|
allErrors: true,
|
|
5
5
|
strict: false,
|
|
@@ -33,6 +33,7 @@ export const validateNodeDescribeParams = ajv.compile(NodeDescribeParamsSchema);
|
|
|
33
33
|
export const validateNodeInvokeParams = ajv.compile(NodeInvokeParamsSchema);
|
|
34
34
|
export const validateNodeInvokeResultParams = ajv.compile(NodeInvokeResultParamsSchema);
|
|
35
35
|
export const validateNodeEventParams = ajv.compile(NodeEventParamsSchema);
|
|
36
|
+
export const validatePushTestParams = ajv.compile(PushTestParamsSchema);
|
|
36
37
|
export const validateSessionsListParams = ajv.compile(SessionsListParamsSchema);
|
|
37
38
|
export const validateSessionsPreviewParams = ajv.compile(SessionsPreviewParamsSchema);
|
|
38
39
|
export const validateSessionsResolveParams = ajv.compile(SessionsResolveParamsSchema);
|
|
@@ -69,6 +70,7 @@ export const validateCronRunsParams = ajv.compile(CronRunsParamsSchema);
|
|
|
69
70
|
export const validateDevicePairListParams = ajv.compile(DevicePairListParamsSchema);
|
|
70
71
|
export const validateDevicePairApproveParams = ajv.compile(DevicePairApproveParamsSchema);
|
|
71
72
|
export const validateDevicePairRejectParams = ajv.compile(DevicePairRejectParamsSchema);
|
|
73
|
+
export const validateDevicePairRemoveParams = ajv.compile(DevicePairRemoveParamsSchema);
|
|
72
74
|
export const validateDeviceTokenRotateParams = ajv.compile(DeviceTokenRotateParamsSchema);
|
|
73
75
|
export const validateDeviceTokenRevokeParams = ajv.compile(DeviceTokenRevokeParamsSchema);
|
|
74
76
|
export const validateExecApprovalsGetParams = ajv.compile(ExecApprovalsGetParamsSchema);
|
|
@@ -84,7 +86,6 @@ export const validateChatAbortParams = ajv.compile(ChatAbortParamsSchema);
|
|
|
84
86
|
export const validateChatInjectParams = ajv.compile(ChatInjectParamsSchema);
|
|
85
87
|
export const validateChatEvent = ajv.compile(ChatEventSchema);
|
|
86
88
|
export const validateUpdateRunParams = ajv.compile(UpdateRunParamsSchema);
|
|
87
|
-
export const validatePushTestParams = ajv.compile(PushTestParamsSchema);
|
|
88
89
|
export const validateWebLoginStartParams = ajv.compile(WebLoginStartParamsSchema);
|
|
89
90
|
export const validateWebLoginWaitParams = ajv.compile(WebLoginWaitParamsSchema);
|
|
90
91
|
export function formatValidationErrors(errors) {
|
|
@@ -116,4 +117,4 @@ export function formatValidationErrors(errors) {
|
|
|
116
117
|
}
|
|
117
118
|
return unique.join("; ");
|
|
118
119
|
}
|
|
119
|
-
export { ConnectParamsSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, GatewayFrameSchema, PresenceEntrySchema, SnapshotSchema, ErrorShapeSchema, StateVersionSchema, AgentEventSchema, ChatEventSchema, SendParamsSchema, PollParamsSchema, AgentParamsSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, WakeParamsSchema, NodePairRequestParamsSchema, NodePairListParamsSchema, NodePairApproveParamsSchema, NodePairRejectParamsSchema, NodePairVerifyParamsSchema, NodeListParamsSchema, NodeInvokeParamsSchema, SessionsListParamsSchema, SessionsPreviewParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, SessionsDeleteParamsSchema, SessionsCompactParamsSchema, SessionsUsageParamsSchema, ConfigGetParamsSchema, ConfigSetParamsSchema, ConfigApplyParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, WizardStartParamsSchema, WizardNextParamsSchema, WizardCancelParamsSchema, WizardStatusParamsSchema, WizardStepSchema, WizardNextResultSchema, WizardStartResultSchema, WizardStatusResultSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChannelsLogoutParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, ModelsListParamsSchema, SkillsStatusParamsSchema, SkillsInstallParamsSchema, SkillsUpdateParamsSchema, CronJobSchema, CronListParamsSchema, CronStatusParamsSchema, CronAddParamsSchema, CronUpdateParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, ChatInjectParamsSchema, UpdateRunParamsSchema,
|
|
120
|
+
export { ConnectParamsSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, EventFrameSchema, GatewayFrameSchema, PresenceEntrySchema, SnapshotSchema, ErrorShapeSchema, StateVersionSchema, AgentEventSchema, ChatEventSchema, SendParamsSchema, PollParamsSchema, AgentParamsSchema, AgentIdentityParamsSchema, AgentIdentityResultSchema, WakeParamsSchema, PushTestParamsSchema, PushTestResultSchema, NodePairRequestParamsSchema, NodePairListParamsSchema, NodePairApproveParamsSchema, NodePairRejectParamsSchema, NodePairVerifyParamsSchema, NodeListParamsSchema, NodeInvokeParamsSchema, SessionsListParamsSchema, SessionsPreviewParamsSchema, SessionsPatchParamsSchema, SessionsResetParamsSchema, SessionsDeleteParamsSchema, SessionsCompactParamsSchema, SessionsUsageParamsSchema, ConfigGetParamsSchema, ConfigSetParamsSchema, ConfigApplyParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, WizardStartParamsSchema, WizardNextParamsSchema, WizardCancelParamsSchema, WizardStatusParamsSchema, WizardStepSchema, WizardNextResultSchema, WizardStartResultSchema, WizardStatusResultSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, ChannelsLogoutParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, AgentSummarySchema, AgentsFileEntrySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema, AgentsUpdateParamsSchema, AgentsUpdateResultSchema, AgentsDeleteParamsSchema, AgentsDeleteResultSchema, AgentsFilesListParamsSchema, AgentsFilesListResultSchema, AgentsFilesGetParamsSchema, AgentsFilesGetResultSchema, AgentsFilesSetParamsSchema, AgentsFilesSetResultSchema, AgentsListParamsSchema, AgentsListResultSchema, ModelsListParamsSchema, SkillsStatusParamsSchema, SkillsInstallParamsSchema, SkillsUpdateParamsSchema, CronJobSchema, CronListParamsSchema, CronStatusParamsSchema, CronAddParamsSchema, CronUpdateParamsSchema, CronRemoveParamsSchema, CronRunParamsSchema, CronRunsParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, ChatHistoryParamsSchema, ChatSendParamsSchema, ChatInjectParamsSchema, UpdateRunParamsSchema, TickEventSchema, ShutdownEventSchema, ProtocolSchemas, PROTOCOL_VERSION, ErrorCodes, errorShape, };
|
|
@@ -82,6 +82,7 @@ export const CronJobStateSchema = Type.Object({
|
|
|
82
82
|
lastError: Type.Optional(Type.String()),
|
|
83
83
|
lastDurationMs: Type.Optional(Type.Integer({ minimum: 0 })),
|
|
84
84
|
consecutiveErrors: Type.Optional(Type.Integer({ minimum: 0 })),
|
|
85
|
+
lastDelivered: Type.Optional(Type.Boolean()),
|
|
85
86
|
}, { additionalProperties: false });
|
|
86
87
|
export const CronJobSchema = Type.Object({
|
|
87
88
|
id: NonEmptyString,
|
|
@@ -3,6 +3,7 @@ import { NonEmptyString } from "./primitives.js";
|
|
|
3
3
|
export const DevicePairListParamsSchema = Type.Object({}, { additionalProperties: false });
|
|
4
4
|
export const DevicePairApproveParamsSchema = Type.Object({ requestId: NonEmptyString }, { additionalProperties: false });
|
|
5
5
|
export const DevicePairRejectParamsSchema = Type.Object({ requestId: NonEmptyString }, { additionalProperties: false });
|
|
6
|
+
export const DevicePairRemoveParamsSchema = Type.Object({ deviceId: NonEmptyString }, { additionalProperties: false });
|
|
6
7
|
export const DeviceTokenRotateParamsSchema = Type.Object({
|
|
7
8
|
deviceId: NonEmptyString,
|
|
8
9
|
role: NonEmptyString,
|
|
@@ -3,7 +3,7 @@ import { AgentSummarySchema, AgentsCreateParamsSchema, AgentsCreateResultSchema,
|
|
|
3
3
|
import { ChannelsLogoutParamsSchema, TalkConfigParamsSchema, TalkConfigResultSchema, ChannelsStatusParamsSchema, ChannelsStatusResultSchema, TalkModeParamsSchema, WebLoginStartParamsSchema, WebLoginWaitParamsSchema, } from "./channels.js";
|
|
4
4
|
import { ConfigApplyParamsSchema, ConfigGetParamsSchema, ConfigPatchParamsSchema, ConfigSchemaParamsSchema, ConfigSchemaResponseSchema, ConfigSetParamsSchema, UpdateRunParamsSchema, } from "./config.js";
|
|
5
5
|
import { CronAddParamsSchema, CronJobSchema, CronListParamsSchema, CronRemoveParamsSchema, CronRunLogEntrySchema, CronRunParamsSchema, CronRunsParamsSchema, CronStatusParamsSchema, CronUpdateParamsSchema, } from "./cron.js";
|
|
6
|
-
import { DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRejectParamsSchema, DevicePairRequestedEventSchema, DevicePairResolvedEventSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, } from "./devices.js";
|
|
6
|
+
import { DevicePairApproveParamsSchema, DevicePairListParamsSchema, DevicePairRejectParamsSchema, DevicePairRemoveParamsSchema, DevicePairRequestedEventSchema, DevicePairResolvedEventSchema, DeviceTokenRevokeParamsSchema, DeviceTokenRotateParamsSchema, } from "./devices.js";
|
|
7
7
|
import { ExecApprovalsGetParamsSchema, ExecApprovalsNodeGetParamsSchema, ExecApprovalsNodeSetParamsSchema, ExecApprovalsSetParamsSchema, ExecApprovalsSnapshotSchema, ExecApprovalRequestParamsSchema, ExecApprovalResolveParamsSchema, } from "./exec-approvals.js";
|
|
8
8
|
import { ConnectParamsSchema, ErrorShapeSchema, EventFrameSchema, GatewayFrameSchema, HelloOkSchema, RequestFrameSchema, ResponseFrameSchema, ShutdownEventSchema, TickEventSchema, } from "./frames.js";
|
|
9
9
|
import { ChatAbortParamsSchema, ChatEventSchema, ChatHistoryParamsSchema, ChatInjectParamsSchema, ChatSendParamsSchema, LogsTailParamsSchema, LogsTailResultSchema, } from "./logs-chat.js";
|
|
@@ -118,6 +118,7 @@ export const ProtocolSchemas = {
|
|
|
118
118
|
DevicePairListParams: DevicePairListParamsSchema,
|
|
119
119
|
DevicePairApproveParams: DevicePairApproveParamsSchema,
|
|
120
120
|
DevicePairRejectParams: DevicePairRejectParamsSchema,
|
|
121
|
+
DevicePairRemoveParams: DevicePairRemoveParamsSchema,
|
|
121
122
|
DeviceTokenRotateParams: DeviceTokenRotateParamsSchema,
|
|
122
123
|
DeviceTokenRevokeParams: DeviceTokenRevokeParamsSchema,
|
|
123
124
|
DevicePairRequestedEvent: DevicePairRequestedEventSchema,
|
|
@@ -66,6 +66,8 @@ export const SessionsResetParamsSchema = Type.Object({
|
|
|
66
66
|
export const SessionsDeleteParamsSchema = Type.Object({
|
|
67
67
|
key: NonEmptyString,
|
|
68
68
|
deleteTranscript: Type.Optional(Type.Boolean()),
|
|
69
|
+
// Internal control: when false, still unbind thread bindings but skip hook emission.
|
|
70
|
+
emitLifecycleHooks: Type.Optional(Type.Boolean()),
|
|
69
71
|
}, { additionalProperties: false });
|
|
70
72
|
export const SessionsCompactParamsSchema = Type.Object({
|
|
71
73
|
key: NonEmptyString,
|
|
@@ -78,6 +80,10 @@ export const SessionsUsageParamsSchema = Type.Object({
|
|
|
78
80
|
startDate: Type.Optional(Type.String({ pattern: "^\\d{4}-\\d{2}-\\d{2}$" })),
|
|
79
81
|
/** End date for range filter (YYYY-MM-DD). */
|
|
80
82
|
endDate: Type.Optional(Type.String({ pattern: "^\\d{4}-\\d{2}-\\d{2}$" })),
|
|
83
|
+
/** How start/end dates should be interpreted. Defaults to UTC when omitted. */
|
|
84
|
+
mode: Type.Optional(Type.Union([Type.Literal("utc"), Type.Literal("gateway"), Type.Literal("specific")])),
|
|
85
|
+
/** UTC offset to use when mode is `specific` (for example, UTC-4 or UTC+5:30). */
|
|
86
|
+
utcOffset: Type.Optional(Type.String({ pattern: "^UTC[+-]\\d{1,2}(?::[0-5]\\d)?$" })),
|
|
81
87
|
/** Maximum sessions to return (default 50). */
|
|
82
88
|
limit: Type.Optional(Type.Integer({ minimum: 1 })),
|
|
83
89
|
/** Include context weight breakdown (systemPromptReport). */
|