From 3b7b2a2a1f2ae13aa3f75576b972c7a622a61597 Mon Sep 17 00:00:00 2001 From: Peter Steinberger Date: Thu, 23 Jul 2026 21:21:01 -0700 Subject: [PATCH] chore: update dependencies and migrate major contracts (#112963) * build(deps): complete latest dependency migrations * fix(deps): satisfy updated dependency types * fix(deps): hold incompatible build tooling * fix(deps): preserve portable tooling contracts * build(deps): allow reviewed fresh transitive releases * fix(deps): repair major upgrade validation * build(deps): regenerate current dependency graph * fix(logging): keep tslog adapter type private * fix(agents): narrow grep subprocess handle * fix(codex): prefer pinned managed binary * fix(codex): fence managed native provenance * build(deps): align codex ACP with managed harness * fix(slack): use socket-mode Undici runtime * fix(slack): detect cross-runtime responses * fix(slack): bridge package-owned fetch types * fix(deps): retain tslog v4 JSON contract * build(plugin-sdk): refresh logging API manifest --- .github/workflows/crabbox-hydrate.yml | 13 +- .github/workflows/openclaw-performance.yml | 4 +- .github/workflows/opengrep-precise-full.yml | 6 +- .github/workflows/opengrep-precise.yml | 6 +- .github/workflows/workflow-sanity.yml | 2 +- .pre-commit-config.yaml | 6 +- docs/plugins/codex-harness-reference.md | 8 +- docs/plugins/codex-harness.md | 4 +- extensions/acpx/npm-shrinkwrap.json | 75 +- extensions/acpx/package.json | 2 +- extensions/acpx/src/codex-auth-bridge.test.ts | 2 +- extensions/acpx/src/manifest.test.ts | 2 +- extensions/codex/npm-shrinkwrap.json | 56 +- extensions/codex/package.json | 2 +- .../json/v2/GetAccountResponse.json | 19 +- .../json/v2/ModelListResponse.json | 7 + .../json/v2/ThreadResumeResponse.json | 99 +- .../json/v2/ThreadStartResponse.json | 83 +- .../json/v2/TurnCompletedNotification.json | 76 +- .../json/v2/TurnStartResponse.json | 76 +- .../src/app-server/shared-client.test.ts | 2 +- extensions/codex/src/app-server/version.ts | 2 +- extensions/qa-lab/package.json | 2 +- extensions/slack/npm-shrinkwrap.json | 307 +---- extensions/slack/package.json | 8 +- extensions/slack/src/client-options.ts | 95 +- extensions/slack/src/client.test.ts | 160 +-- .../slack/src/monitor/event-scope.test.ts | 18 +- .../slack/src/monitor/provider-support.ts | 2 + .../src/monitor/provider.reconnect.test.ts | 11 +- extensions/slack/src/monitor/provider.ts | 7 +- .../slack/src/monitor/reconnect-policy.ts | 15 +- extensions/slack/src/monitor/replies.ts | 9 +- extensions/slack/src/monitor/slash.ts | 3 +- .../slack/src/native-data-blocks.test.ts | 26 + extensions/slack/src/native-data-blocks.ts | 35 + npm-shrinkwrap.json | 70 +- package.json | 14 +- pnpm-lock.yaml | 1040 +++++++++++------ pnpm-workspace.yaml | 18 + scripts/check-codex-app-server-protocol.ts | 2 +- scripts/check-workflows.mjs | 2 +- scripts/e2e/parallels/windows-git.ts | 8 +- scripts/run-opengrep.sh | 4 +- src/agents/sessions/exec.ts | 2 +- src/agents/sessions/tools/bash.ts | 2 +- src/agents/sessions/tools/find.fd.test.ts | 5 +- src/agents/sessions/tools/find.ts | 8 +- .../sessions/tools/grep.stream-errors.test.ts | 7 +- src/agents/sessions/tools/grep.ts | 16 +- src/gateway/server-methods/open-path.test.ts | 2 +- src/gateway/server-methods/open-path.ts | 2 +- src/logging/logger.ts | 1 - src/process/child-process.test.ts | 6 +- src/process/exec-runner.ts | 21 +- src/process/exec-spawn.ts | 9 +- src/process/exec.ts | 2 +- src/process/exec.windows.test.ts | 4 +- test/scripts/check-workflows.test.ts | 2 +- .../openclaw-performance-workflow.test.ts | 4 +- test/scripts/parallels-smoke-model.test.ts | 4 +- test/scripts/parallels-windows-git.test.ts | 2 +- test/scripts/run-opengrep.test.ts | 2 +- ui/package.json | 2 +- 64 files changed, 1563 insertions(+), 948 deletions(-) diff --git a/.github/workflows/crabbox-hydrate.yml b/.github/workflows/crabbox-hydrate.yml index cfac5f620154..a4ccb11c57cf 100644 --- a/.github/workflows/crabbox-hydrate.yml +++ b/.github/workflows/crabbox-hydrate.yml @@ -272,11 +272,17 @@ jobs: if ! docker buildx version >/dev/null 2>&1; then arch="$(uname -m)" case "$arch" in - aarch64|arm64) buildx_arch=arm64 ;; - x86_64|amd64) buildx_arch=amd64 ;; + aarch64|arm64) + buildx_arch=arm64 + buildx_sha256=c4248d6cbc4a619a7e0b4609c11e509ad4ac0b475e1c64817c0ac20c5d90c766 + ;; + x86_64|amd64) + buildx_arch=amd64 + buildx_sha256=d41ece72044243b4f58b343441ae37446d9c29a7d6b5e11c61847bbcf8f7dfda + ;; *) echo "unsupported buildx arch: $arch" >&2; exit 2 ;; esac - buildx_version="${DOCKER_BUILDX_VERSION:-v0.15.1}" + buildx_version="v0.35.0" mkdir -p "$HOME/.docker/cli-plugins" curl --fail --show-error --location \ --connect-timeout "${OPENCLAW_CRABBOX_HYDRATE_DOWNLOAD_CONNECT_TIMEOUT_SECONDS:-15}" \ @@ -286,6 +292,7 @@ jobs: --retry-all-errors \ "https://github.com/docker/buildx/releases/download/${buildx_version}/buildx-${buildx_version}.linux-${buildx_arch}" \ -o "$HOME/.docker/cli-plugins/docker-buildx" + echo "${buildx_sha256} $HOME/.docker/cli-plugins/docker-buildx" | sha256sum -c - chmod 0755 "$HOME/.docker/cli-plugins/docker-buildx" fi diff --git a/.github/workflows/openclaw-performance.yml b/.github/workflows/openclaw-performance.yml index 0704956e5e64..735c187d1de0 100644 --- a/.github/workflows/openclaw-performance.yml +++ b/.github/workflows/openclaw-performance.yml @@ -67,8 +67,8 @@ concurrency: env: FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: "true" - OCM_VERSION: v0.2.25 - OCM_LINUX_X64_SHA256: 57530199d21eb5bfa29695749928b40fd2869484c7edff69b7c65bfc84f2f1aa + OCM_VERSION: v0.2.29 + OCM_LINUX_X64_SHA256: d966098d6ba2bc10891be3c76e162a37b07f28c4f51da75d2eb509886eb7e1cf KOVA_REPOSITORY: openclaw/Kova PERFORMANCE_MODEL_ID: gpt-5.6-luna # Release matrices cold-build the candidate runtime before measurement. diff --git a/.github/workflows/opengrep-precise-full.yml b/.github/workflows/opengrep-precise-full.yml index 207154881fe8..19d0b81ac9c4 100644 --- a/.github/workflows/opengrep-precise-full.yml +++ b/.github/workflows/opengrep-precise-full.yml @@ -32,11 +32,11 @@ jobs: - name: Install opengrep env: # Pin both the install script (by commit SHA) and the binary version. - # The script SHA must match the v1.22.0 release tag in opengrep/opengrep + # The script SHA must match the v1.25.0 release tag in opengrep/opengrep # so a compromised or force-pushed `main` cannot RCE in our CI runner. # Bump both together when upgrading. - OPENGREP_VERSION: v1.22.0 - OPENGREP_INSTALL_SHA: f458d7f0d52cc58eae1ca3cf3d5caf101e637519 + OPENGREP_VERSION: v1.25.0 + OPENGREP_INSTALL_SHA: 27b5fba1b315fbc63d0fd474d01f5d8235cc86e2 run: | # Download first so a timed-out transfer cannot execute a partial installer. installer="$(mktemp "${RUNNER_TEMP}/opengrep-install.XXXXXX")" diff --git a/.github/workflows/opengrep-precise.yml b/.github/workflows/opengrep-precise.yml index fd48cae67d64..2079789805a2 100644 --- a/.github/workflows/opengrep-precise.yml +++ b/.github/workflows/opengrep-precise.yml @@ -58,11 +58,11 @@ jobs: - name: Install opengrep env: # Pin both the install script (by commit SHA) and the binary version. - # The script SHA must match the v1.22.0 release tag in opengrep/opengrep + # The script SHA must match the v1.25.0 release tag in opengrep/opengrep # so a compromised or force-pushed `main` cannot RCE in our CI runner. # Bump both together when upgrading. - OPENGREP_VERSION: v1.22.0 - OPENGREP_INSTALL_SHA: f458d7f0d52cc58eae1ca3cf3d5caf101e637519 + OPENGREP_VERSION: v1.25.0 + OPENGREP_INSTALL_SHA: 27b5fba1b315fbc63d0fd474d01f5d8235cc86e2 run: | # Download first so a timed-out transfer cannot execute a partial installer. installer="$(mktemp "${RUNNER_TEMP}/opengrep-install.XXXXXX")" diff --git a/.github/workflows/workflow-sanity.yml b/.github/workflows/workflow-sanity.yml index affef8ad7955..cb354b44f487 100644 --- a/.github/workflows/workflow-sanity.yml +++ b/.github/workflows/workflow-sanity.yml @@ -180,7 +180,7 @@ jobs: shell: bash run: | set -euo pipefail - ACTIONLINT_VERSION="1.7.11" + ACTIONLINT_VERSION="1.7.12" archive="actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz" base_url="https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}" # GitHub release downloads occasionally return transient 5xx responses. diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index eab288ecc948..24a3582ffc49 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -31,13 +31,13 @@ repos: # GitHub Actions linting - repo: https://github.com/rhysd/actionlint - rev: v1.7.10 + rev: v1.7.12 hooks: - id: actionlint # GitHub Actions security audit - repo: https://github.com/zizmorcore/zizmor-pre-commit - rev: v1.22.0 + rev: v1.28.0 hooks: - id: zizmor args: @@ -52,7 +52,7 @@ repos: # Python checks for skills scripts - repo: https://github.com/astral-sh/ruff-pre-commit - rev: v0.14.1 + rev: v0.15.22 hooks: - id: ruff files: "^skills/.*\\.py$" diff --git a/docs/plugins/codex-harness-reference.md b/docs/plugins/codex-harness-reference.md index 2aafc1047e44..aa75f473f2e9 100644 --- a/docs/plugins/codex-harness-reference.md +++ b/docs/plugins/codex-harness-reference.md @@ -131,7 +131,7 @@ flags, and plugin allow/deny references into this block. Explicit canonical ## App-server transport For ordinary harness turns, OpenClaw starts the managed Codex binary shipped -with the official plugin (currently `@openai/codex` `0.144.6`): +with the official plugin (currently `@openai/codex` `0.145.0`): ```bash codex app-server --listen stdio:// @@ -255,7 +255,7 @@ networking, so a full-access profile would not protect outbound traffic. The plugin blocks older, newer-unvalidated, prerelease, build-suffixed, or unversioned app-server handshakes. Codex app-server must report a stable version -from `0.143.0` through the bundled `0.144.6`. +from `0.143.0` through the bundled `0.145.0`. OpenClaw treats non-loopback WebSocket app-server URLs as remote and requires identity-bearing WebSocket auth through `appServer.authToken` or an @@ -605,7 +605,7 @@ If discovery fails or times out, OpenClaw uses a bundled fallback catalog: | `gpt-5.4-mini` | GPT-5.4-Mini | low, medium, high, xhigh | -The current bundled harness is `@openai/codex` `0.144.6`. A `model/list` probe +The current bundled harness is `@openai/codex` `0.145.0`. A `model/list` probe against that bundled app-server returned these public picker rows: | Model id | Input modalities | Reasoning efforts | @@ -614,8 +614,6 @@ against that bundled app-server returned these public picker rows: | `gpt-5.6-terra` | text, image | low, medium, high, xhigh, max, ultra | | `gpt-5.6-luna` | text, image | low, medium, high, xhigh, max | | `gpt-5.5` | text, image | low, medium, high, xhigh | -| `gpt-5.4` | text, image | low, medium, high, xhigh | -| `gpt-5.4-mini` | text, image | low, medium, high, xhigh | | `gpt-5.2` | text, image | low, medium, high, xhigh | The app-server catalog can report `ultra`; OpenClaw reasoning controls currently diff --git a/docs/plugins/codex-harness.md b/docs/plugins/codex-harness.md index 177ca3c1764a..e19273bf30ff 100644 --- a/docs/plugins/codex-harness.md +++ b/docs/plugins/codex-harness.md @@ -56,7 +56,7 @@ channel is the communication surface. - The official `@openclaw/codex` plugin installed. Include `codex` in `plugins.allow` if your config uses an allowlist. -- A stable Codex app-server from `0.143.0` through `0.144.6`. The plugin manages a compatible +- A stable Codex app-server from `0.143.0` through `0.145.0`. The plugin manages a compatible binary by default, so a `codex` command on `PATH` does not affect normal startup. - Codex auth through `openclaw models auth login --provider openai`, an @@ -1108,7 +1108,7 @@ Doctor rewrites legacy model refs to `openai/*`, removes stale session and whole-agent runtime pins, and preserves existing auth-profile overrides. **The app-server is rejected:** use a stable Codex app-server from `0.143.0` -through the bundled `0.144.6`. Prereleases, build-suffixed versions, and newer +through the bundled `0.145.0`. Prereleases, build-suffixed versions, and newer unvalidated releases are rejected because OpenClaw validates generated schemas against the bundled app-server version. diff --git a/extensions/acpx/npm-shrinkwrap.json b/extensions/acpx/npm-shrinkwrap.json index 1f905007de1f..cee72b2ff6b1 100644 --- a/extensions/acpx/npm-shrinkwrap.json +++ b/extensions/acpx/npm-shrinkwrap.json @@ -9,7 +9,7 @@ "version": "2026.7.2", "dependencies": { "@agentclientprotocol/claude-agent-acp": "0.59.0", - "@agentclientprotocol/codex-acp": "1.1.4", + "@agentclientprotocol/codex-acp": "1.1.7", "acpx": "0.12.0", "smol-toml": "1.7.0", "zod": "4.4.3" @@ -33,13 +33,13 @@ } }, "node_modules/@agentclientprotocol/codex-acp": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@agentclientprotocol/codex-acp/-/codex-acp-1.1.4.tgz", - "integrity": "sha512-DzusIpGwlQwMWuHgJhU8FWMsyQvzjenB93IEzQATkdbNulo5Rd9GKOz8+B+/C9iWWxmyXgtgmjzaL+iRFyDryQ==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/@agentclientprotocol/codex-acp/-/codex-acp-1.1.7.tgz", + "integrity": "sha512-bhFLbGtOMEw6+PAp33vNERb6dXlULOfV3mWbRdps4v7sY7PHha/C2T1dnlG0yVcvBu9W+NYPzL0CAupnVoFTiQ==", "license": "Apache-2.0", "dependencies": { - "@agentclientprotocol/sdk": "^1.2.1", - "@openai/codex": "^0.144.4", + "@agentclientprotocol/sdk": "^1.3.0", + "@openai/codex": "^0.145.0", "diff": "^9.0.0", "open": "^11.0.0", "vscode-jsonrpc": "^9.0.1", @@ -49,6 +49,15 @@ "codex-acp": "dist/index.js" } }, + "node_modules/@agentclientprotocol/codex-acp/node_modules/@agentclientprotocol/sdk": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-1.3.0.tgz", + "integrity": "sha512-i3h/efaeuMUFAO1HSfo97QZQnnvMd7wWBYtBsdL6UMZg3a78sk3Ffya5Xu7C7tYsXomXoDXJBAzQF2PcFKAhIQ==", + "license": "Apache-2.0", + "peerDependencies": { + "zod": "^3.25.0 || ^4.0.0" + } + }, "node_modules/@agentclientprotocol/sdk": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-1.2.1.tgz", @@ -713,9 +722,9 @@ } }, "node_modules/@openai/codex": { - "version": "0.144.6", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6.tgz", - "integrity": "sha512-wk+2CWiBNXiJLBoN2D08N9RceWkSBnlgk5g2K1a4CXrP/C0gdlHyRUG7RFzm9y41DCK/7tvCct233JVxyFmznw==", + "version": "0.145.0", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0.tgz", + "integrity": "sha512-/PSPSFujjjmiyVFvG2yu/grOFhsWdokTH8t2KGWhXSo/M5n/dIDsnbsnO82/7bLtIoDuzQf7ATBUMWqPWQINlQ==", "license": "Apache-2.0", "bin": { "codex": "bin/codex.js" @@ -724,19 +733,19 @@ "node": ">=16" }, "optionalDependencies": { - "@openai/codex-darwin-arm64": "npm:@openai/codex@0.144.6-darwin-arm64", - "@openai/codex-darwin-x64": "npm:@openai/codex@0.144.6-darwin-x64", - "@openai/codex-linux-arm64": "npm:@openai/codex@0.144.6-linux-arm64", - "@openai/codex-linux-x64": "npm:@openai/codex@0.144.6-linux-x64", - "@openai/codex-win32-arm64": "npm:@openai/codex@0.144.6-win32-arm64", - "@openai/codex-win32-x64": "npm:@openai/codex@0.144.6-win32-x64" + "@openai/codex-darwin-arm64": "npm:@openai/codex@0.145.0-darwin-arm64", + "@openai/codex-darwin-x64": "npm:@openai/codex@0.145.0-darwin-x64", + "@openai/codex-linux-arm64": "npm:@openai/codex@0.145.0-linux-arm64", + "@openai/codex-linux-x64": "npm:@openai/codex@0.145.0-linux-x64", + "@openai/codex-win32-arm64": "npm:@openai/codex@0.145.0-win32-arm64", + "@openai/codex-win32-x64": "npm:@openai/codex@0.145.0-win32-x64" } }, "node_modules/@openai/codex-darwin-arm64": { "name": "@openai/codex", - "version": "0.144.6-darwin-arm64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-darwin-arm64.tgz", - "integrity": "sha512-6zgvh70MzBNSeT17HEhSOrmmGGZGAKzSC7x6JAq+edkJkdPYA9P0I1tG7aJ49GlBkBxuC+MKBH1qm6+2Cghcww==", + "version": "0.145.0-darwin-arm64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-darwin-arm64.tgz", + "integrity": "sha512-h6aQ0UxnaP8mIM/9/qPAH9MNkRliJo88toq1T36IxNM2L5JSU0TFamu+MZn7YkFgDsrp0RfiI+97Tm8AVVxqtA==", "cpu": [ "arm64" ], @@ -751,9 +760,9 @@ }, "node_modules/@openai/codex-darwin-x64": { "name": "@openai/codex", - "version": "0.144.6-darwin-x64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-darwin-x64.tgz", - "integrity": "sha512-THRyPG0zSU6M8NQAge1LHEHsJDnoH4BpKsfJHB/qe3Fm+Wf6zqAmWJFlOKzBm27m0K2Hq3za4Ac2I5p5i4yp/A==", + "version": "0.145.0-darwin-x64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-darwin-x64.tgz", + "integrity": "sha512-FCYzVKCa9VoLtg9gVyzKpqylonfgZrfcWZN6HsXAZPeuo8CukdMqdgTUOhDn2V6h3MbqS0z6VqQVKUllN/yKhA==", "cpu": [ "x64" ], @@ -768,9 +777,9 @@ }, "node_modules/@openai/codex-linux-arm64": { "name": "@openai/codex", - "version": "0.144.6-linux-arm64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-linux-arm64.tgz", - "integrity": "sha512-PGiLXMN+2IQRkf7tOLi64dMInjU1pRLbz0Rwfj/yt2Y97SZQqAjFQoi2wmswmqtqMDnfwCPTC1DRXVQkvU6T6Q==", + "version": "0.145.0-linux-arm64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-linux-arm64.tgz", + "integrity": "sha512-8OLcPXaAol/FOrRoDxWhIiHIFa73KRsM41EKocjRZOwiT4TcelzJWn3dHyiuSb7teWF25rrslvSPyvhULYRRCQ==", "cpu": [ "arm64" ], @@ -785,9 +794,9 @@ }, "node_modules/@openai/codex-linux-x64": { "name": "@openai/codex", - "version": "0.144.6-linux-x64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-linux-x64.tgz", - "integrity": "sha512-4E7EnzCg0OnBxCyYnwJ+qnZwWHYe0YScr5ucKWbngE9u4+0XrpWELqq2Kn9jl5GZK8MDjU7PrJwFIwusHOHjuw==", + "version": "0.145.0-linux-x64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-linux-x64.tgz", + "integrity": "sha512-u8w8LLv3DvsfrDCoswLIemZ0SoNEXyi511WsfFsSiYUazk9qMsB/NtU8N9vhAfN7mZAxLFoMex4v66JjHuZWwA==", "cpu": [ "x64" ], @@ -802,9 +811,9 @@ }, "node_modules/@openai/codex-win32-arm64": { "name": "@openai/codex", - "version": "0.144.6-win32-arm64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-win32-arm64.tgz", - "integrity": "sha512-SpMjXJLW43JzMP0K62mVcYfmFcpk0BK4AOgYmWSfyZHs3iRtHMd0UYw7605n/9lwkT2EqbwQLT2omZFeKJFzwA==", + "version": "0.145.0-win32-arm64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-win32-arm64.tgz", + "integrity": "sha512-sub61rjEFevi1i3Zx7nAd4JM5XxoNFqMqFc5LfTo2xSI8ixHjFvEYDFDXwXOftT04n3Ht1Wh271ioUZpDiEjEg==", "cpu": [ "arm64" ], @@ -819,9 +828,9 @@ }, "node_modules/@openai/codex-win32-x64": { "name": "@openai/codex", - "version": "0.144.6-win32-x64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-win32-x64.tgz", - "integrity": "sha512-dN39VnjEthKz5io1RNWwZDtErdSn07nW3pGUgvlA6DMxgm/nuGaIAZO/sG/Hgxq/x5j9HteAENfrFgVkpZ0lFg==", + "version": "0.145.0-win32-x64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-win32-x64.tgz", + "integrity": "sha512-u0h9lk094CaXRSqE34SBW2dRaQTPa6fASXqehczWH9QdsU62mBsiAgAdp6tCG4i+YzPmmhjD8FdXNnYGNmwuMg==", "cpu": [ "x64" ], diff --git a/extensions/acpx/package.json b/extensions/acpx/package.json index 76fab7e75267..4a627e299a1c 100644 --- a/extensions/acpx/package.json +++ b/extensions/acpx/package.json @@ -9,7 +9,7 @@ "type": "module", "dependencies": { "@agentclientprotocol/claude-agent-acp": "0.59.0", - "@agentclientprotocol/codex-acp": "1.1.4", + "@agentclientprotocol/codex-acp": "1.1.7", "acpx": "0.12.0", "smol-toml": "1.7.0", "zod": "4.4.3" diff --git a/extensions/acpx/src/codex-auth-bridge.test.ts b/extensions/acpx/src/codex-auth-bridge.test.ts index fdeb9a1f6ada..ab606bda5144 100644 --- a/extensions/acpx/src/codex-auth-bridge.test.ts +++ b/extensions/acpx/src/codex-auth-bridge.test.ts @@ -220,7 +220,7 @@ describe("prepareAcpxCodexAuthConfig", () => { }); const wrapper = await fs.readFile(generated.wrapperPath, "utf8"); - expect(wrapper).toContain('"@agentclientprotocol/codex-acp@1.1.4"'); + expect(wrapper).toContain('"@agentclientprotocol/codex-acp@1.1.7"'); expect(wrapper).toContain('"--", "codex-acp"'); expect(wrapper).not.toContain("@zed-industries/codex-acp"); }); diff --git a/extensions/acpx/src/manifest.test.ts b/extensions/acpx/src/manifest.test.ts index 773e9cf5055b..01b440af8c19 100644 --- a/extensions/acpx/src/manifest.test.ts +++ b/extensions/acpx/src/manifest.test.ts @@ -20,7 +20,7 @@ describe("acpx package manifest", () => { it("keeps runtime dependencies in the package manifest", () => { expect(packageJson.dependencies?.acpx).toBeTypeOf("string"); expect(packageJson.dependencies?.acpx).not.toBe(""); - expect(packageJson.dependencies?.["@agentclientprotocol/codex-acp"]).toBe("1.1.4"); + expect(packageJson.dependencies?.["@agentclientprotocol/codex-acp"]).toBe("1.1.7"); expect(packageJson.dependencies?.["@zed-industries/codex-acp"]).toBeUndefined(); expect(packageJson.dependencies?.["@agentclientprotocol/claude-agent-acp"]).toBe("0.59.0"); expect(packageJson.devDependencies?.["@agentclientprotocol/claude-agent-acp"]).toBeUndefined(); diff --git a/extensions/codex/npm-shrinkwrap.json b/extensions/codex/npm-shrinkwrap.json index 9e638cf33541..8af85eaa0fbd 100644 --- a/extensions/codex/npm-shrinkwrap.json +++ b/extensions/codex/npm-shrinkwrap.json @@ -8,7 +8,7 @@ "name": "@openclaw/codex", "version": "2026.7.2", "dependencies": { - "@openai/codex": "0.144.6", + "@openai/codex": "0.145.0", "semver": "7.8.5", "smol-toml": "1.7.0", "typebox": "1.3.6", @@ -17,9 +17,9 @@ } }, "node_modules/@openai/codex": { - "version": "0.144.6", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6.tgz", - "integrity": "sha512-wk+2CWiBNXiJLBoN2D08N9RceWkSBnlgk5g2K1a4CXrP/C0gdlHyRUG7RFzm9y41DCK/7tvCct233JVxyFmznw==", + "version": "0.145.0", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0.tgz", + "integrity": "sha512-/PSPSFujjjmiyVFvG2yu/grOFhsWdokTH8t2KGWhXSo/M5n/dIDsnbsnO82/7bLtIoDuzQf7ATBUMWqPWQINlQ==", "license": "Apache-2.0", "bin": { "codex": "bin/codex.js" @@ -28,19 +28,19 @@ "node": ">=16" }, "optionalDependencies": { - "@openai/codex-darwin-arm64": "npm:@openai/codex@0.144.6-darwin-arm64", - "@openai/codex-darwin-x64": "npm:@openai/codex@0.144.6-darwin-x64", - "@openai/codex-linux-arm64": "npm:@openai/codex@0.144.6-linux-arm64", - "@openai/codex-linux-x64": "npm:@openai/codex@0.144.6-linux-x64", - "@openai/codex-win32-arm64": "npm:@openai/codex@0.144.6-win32-arm64", - "@openai/codex-win32-x64": "npm:@openai/codex@0.144.6-win32-x64" + "@openai/codex-darwin-arm64": "npm:@openai/codex@0.145.0-darwin-arm64", + "@openai/codex-darwin-x64": "npm:@openai/codex@0.145.0-darwin-x64", + "@openai/codex-linux-arm64": "npm:@openai/codex@0.145.0-linux-arm64", + "@openai/codex-linux-x64": "npm:@openai/codex@0.145.0-linux-x64", + "@openai/codex-win32-arm64": "npm:@openai/codex@0.145.0-win32-arm64", + "@openai/codex-win32-x64": "npm:@openai/codex@0.145.0-win32-x64" } }, "node_modules/@openai/codex-darwin-arm64": { "name": "@openai/codex", - "version": "0.144.6-darwin-arm64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-darwin-arm64.tgz", - "integrity": "sha512-6zgvh70MzBNSeT17HEhSOrmmGGZGAKzSC7x6JAq+edkJkdPYA9P0I1tG7aJ49GlBkBxuC+MKBH1qm6+2Cghcww==", + "version": "0.145.0-darwin-arm64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-darwin-arm64.tgz", + "integrity": "sha512-h6aQ0UxnaP8mIM/9/qPAH9MNkRliJo88toq1T36IxNM2L5JSU0TFamu+MZn7YkFgDsrp0RfiI+97Tm8AVVxqtA==", "cpu": [ "arm64" ], @@ -55,9 +55,9 @@ }, "node_modules/@openai/codex-darwin-x64": { "name": "@openai/codex", - "version": "0.144.6-darwin-x64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-darwin-x64.tgz", - "integrity": "sha512-THRyPG0zSU6M8NQAge1LHEHsJDnoH4BpKsfJHB/qe3Fm+Wf6zqAmWJFlOKzBm27m0K2Hq3za4Ac2I5p5i4yp/A==", + "version": "0.145.0-darwin-x64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-darwin-x64.tgz", + "integrity": "sha512-FCYzVKCa9VoLtg9gVyzKpqylonfgZrfcWZN6HsXAZPeuo8CukdMqdgTUOhDn2V6h3MbqS0z6VqQVKUllN/yKhA==", "cpu": [ "x64" ], @@ -72,9 +72,9 @@ }, "node_modules/@openai/codex-linux-arm64": { "name": "@openai/codex", - "version": "0.144.6-linux-arm64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-linux-arm64.tgz", - "integrity": "sha512-PGiLXMN+2IQRkf7tOLi64dMInjU1pRLbz0Rwfj/yt2Y97SZQqAjFQoi2wmswmqtqMDnfwCPTC1DRXVQkvU6T6Q==", + "version": "0.145.0-linux-arm64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-linux-arm64.tgz", + "integrity": "sha512-8OLcPXaAol/FOrRoDxWhIiHIFa73KRsM41EKocjRZOwiT4TcelzJWn3dHyiuSb7teWF25rrslvSPyvhULYRRCQ==", "cpu": [ "arm64" ], @@ -89,9 +89,9 @@ }, "node_modules/@openai/codex-linux-x64": { "name": "@openai/codex", - "version": "0.144.6-linux-x64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-linux-x64.tgz", - "integrity": "sha512-4E7EnzCg0OnBxCyYnwJ+qnZwWHYe0YScr5ucKWbngE9u4+0XrpWELqq2Kn9jl5GZK8MDjU7PrJwFIwusHOHjuw==", + "version": "0.145.0-linux-x64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-linux-x64.tgz", + "integrity": "sha512-u8w8LLv3DvsfrDCoswLIemZ0SoNEXyi511WsfFsSiYUazk9qMsB/NtU8N9vhAfN7mZAxLFoMex4v66JjHuZWwA==", "cpu": [ "x64" ], @@ -106,9 +106,9 @@ }, "node_modules/@openai/codex-win32-arm64": { "name": "@openai/codex", - "version": "0.144.6-win32-arm64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-win32-arm64.tgz", - "integrity": "sha512-SpMjXJLW43JzMP0K62mVcYfmFcpk0BK4AOgYmWSfyZHs3iRtHMd0UYw7605n/9lwkT2EqbwQLT2omZFeKJFzwA==", + "version": "0.145.0-win32-arm64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-win32-arm64.tgz", + "integrity": "sha512-sub61rjEFevi1i3Zx7nAd4JM5XxoNFqMqFc5LfTo2xSI8ixHjFvEYDFDXwXOftT04n3Ht1Wh271ioUZpDiEjEg==", "cpu": [ "arm64" ], @@ -123,9 +123,9 @@ }, "node_modules/@openai/codex-win32-x64": { "name": "@openai/codex", - "version": "0.144.6-win32-x64", - "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.144.6-win32-x64.tgz", - "integrity": "sha512-dN39VnjEthKz5io1RNWwZDtErdSn07nW3pGUgvlA6DMxgm/nuGaIAZO/sG/Hgxq/x5j9HteAENfrFgVkpZ0lFg==", + "version": "0.145.0-win32-x64", + "resolved": "https://registry.npmjs.org/@openai/codex/-/codex-0.145.0-win32-x64.tgz", + "integrity": "sha512-u0h9lk094CaXRSqE34SBW2dRaQTPa6fASXqehczWH9QdsU62mBsiAgAdp6tCG4i+YzPmmhjD8FdXNnYGNmwuMg==", "cpu": [ "x64" ], diff --git a/extensions/codex/package.json b/extensions/codex/package.json index de229ddd554c..33680551aa80 100644 --- a/extensions/codex/package.json +++ b/extensions/codex/package.json @@ -8,7 +8,7 @@ }, "type": "module", "dependencies": { - "@openai/codex": "0.144.6", + "@openai/codex": "0.145.0", "semver": "7.8.5", "smol-toml": "1.7.0", "typebox": "1.3.6", diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/GetAccountResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/GetAccountResponse.json index 7ac87fde0901..f6a1f8856738 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/GetAccountResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/GetAccountResponse.json @@ -48,20 +48,16 @@ }, { "properties": { - "credentialSource": { - "allOf": [ - { - "$ref": "#/definitions/AmazonBedrockCredentialSource" - } - ], - "default": "awsManaged" - }, "type": { "enum": [ "amazonBedrock" ], "title": "AmazonBedrockAccountType", "type": "string" + }, + "usesCodexManagedCredentials": { + "default": false, + "type": "boolean" } }, "required": [ @@ -72,13 +68,6 @@ } ] }, - "AmazonBedrockCredentialSource": { - "enum": [ - "codexManaged", - "awsManaged" - ], - "type": "string" - }, "PlanType": { "enum": [ "free", diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/ModelListResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/ModelListResponse.json index b6527154ae3d..992bfba02a16 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/ModelListResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/ModelListResponse.json @@ -17,6 +17,13 @@ "image" ], "type": "string" + }, + { + "description": "Audio attachments included in user turns.", + "enum": [ + "audio" + ], + "type": "string" } ] }, diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json index 8a2fe50af986..b9fd9d2556a8 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadResumeResponse.json @@ -459,6 +459,26 @@ ], "title": "InputImageDynamicToolCallOutputContentItem", "type": "object" + }, + { + "properties": { + "audioUrl": { + "type": "string" + }, + "type": { + "enum": [ + "inputAudio" + ], + "title": "InputAudioDynamicToolCallOutputContentItemType", + "type": "string" + } + }, + "required": [ + "audioUrl", + "type" + ], + "title": "InputAudioDynamicToolCallOutputContentItem", + "type": "object" } ] }, @@ -567,12 +587,6 @@ "string", "null" ] - }, - "templateId": { - "type": [ - "string", - "null" - ] } }, "required": [ @@ -1053,6 +1067,13 @@ "null" ] }, + "canAcceptDirectInput": { + "description": "Whether the app server accepts direct turn input for this loaded thread. `None` means the capability is unavailable, such as for an unloaded stored thread.", + "type": [ + "boolean", + "null" + ] + }, "cliVersion": { "description": "Version of the CLI that created the thread.", "type": "string" @@ -1795,6 +1816,15 @@ "query": { "type": "string" }, + "results": { + "default": null, + "description": "Structured search results returned out-of-band by standalone web search.\n\nThese stay as opaque JSON at the extension/app-server boundary so new result fields and result types can pass through without a Codex release.", + "items": true, + "type": [ + "array", + "null" + ] + }, "type": { "enum": [ "webSearch" @@ -1836,6 +1866,7 @@ "type": "object" }, { + "description": "Display item emitted by the interruptible `clock.sleep` tool.", "properties": { "durationMs": { "format": "uint64", @@ -2301,6 +2332,46 @@ "title": "LocalImageUserInput", "type": "object" }, + { + "properties": { + "type": { + "enum": [ + "audio" + ], + "title": "AudioUserInputType", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "type", + "url" + ], + "title": "AudioUserInput", + "type": "object" + }, + { + "properties": { + "path": { + "type": "string" + }, + "type": { + "enum": [ + "localAudio" + ], + "title": "LocalAudioUserInputType", + "type": "string" + } + }, + "required": [ + "path", + "type" + ], + "title": "LocalAudioUserInput", + "type": "object" + }, { "properties": { "name": { @@ -2500,6 +2571,14 @@ }, "type": "array" }, + "itemsBackwardsCursor": { + "default": null, + "description": "Opaque head cursor for hydrating paginated items backwards.\n\nPass this as `cursor` to `thread/items/list` with `sortDirection: \"desc\"`. The first page includes the cursor's head item.", + "type": [ + "string", + "null" + ] + }, "model": { "type": "string" }, @@ -2549,6 +2628,14 @@ }, "thread": { "$ref": "#/definitions/Thread" + }, + "turnsBackwardsCursor": { + "default": null, + "description": "Opaque head cursor for hydrating paginated turns backwards.\n\nPass this as `cursor` to `thread/turns/list` with `sortDirection: \"desc\"`. The first page includes the cursor's head turn.", + "type": [ + "string", + "null" + ] } }, "required": [ diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json index d5b07ab346b3..7fd090e2224a 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/ThreadStartResponse.json @@ -459,6 +459,26 @@ ], "title": "InputImageDynamicToolCallOutputContentItem", "type": "object" + }, + { + "properties": { + "audioUrl": { + "type": "string" + }, + "type": { + "enum": [ + "inputAudio" + ], + "title": "InputAudioDynamicToolCallOutputContentItemType", + "type": "string" + } + }, + "required": [ + "audioUrl", + "type" + ], + "title": "InputAudioDynamicToolCallOutputContentItem", + "type": "object" } ] }, @@ -567,12 +587,6 @@ "string", "null" ] - }, - "templateId": { - "type": [ - "string", - "null" - ] } }, "required": [ @@ -1053,6 +1067,13 @@ "null" ] }, + "canAcceptDirectInput": { + "description": "Whether the app server accepts direct turn input for this loaded thread. `None` means the capability is unavailable, such as for an unloaded stored thread.", + "type": [ + "boolean", + "null" + ] + }, "cliVersion": { "description": "Version of the CLI that created the thread.", "type": "string" @@ -1795,6 +1816,15 @@ "query": { "type": "string" }, + "results": { + "default": null, + "description": "Structured search results returned out-of-band by standalone web search.\n\nThese stay as opaque JSON at the extension/app-server boundary so new result fields and result types can pass through without a Codex release.", + "items": true, + "type": [ + "array", + "null" + ] + }, "type": { "enum": [ "webSearch" @@ -1836,6 +1866,7 @@ "type": "object" }, { + "description": "Display item emitted by the interruptible `clock.sleep` tool.", "properties": { "durationMs": { "format": "uint64", @@ -2275,6 +2306,46 @@ "title": "LocalImageUserInput", "type": "object" }, + { + "properties": { + "type": { + "enum": [ + "audio" + ], + "title": "AudioUserInputType", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "type", + "url" + ], + "title": "AudioUserInput", + "type": "object" + }, + { + "properties": { + "path": { + "type": "string" + }, + "type": { + "enum": [ + "localAudio" + ], + "title": "LocalAudioUserInputType", + "type": "string" + } + }, + "required": [ + "path", + "type" + ], + "title": "LocalAudioUserInput", + "type": "object" + }, { "properties": { "name": { diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json index 549589d0c37e..abea349b9416 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnCompletedNotification.json @@ -378,6 +378,26 @@ ], "title": "InputImageDynamicToolCallOutputContentItem", "type": "object" + }, + { + "properties": { + "audioUrl": { + "type": "string" + }, + "type": { + "enum": [ + "inputAudio" + ], + "title": "InputAudioDynamicToolCallOutputContentItemType", + "type": "string" + } + }, + "required": [ + "audioUrl", + "type" + ], + "title": "InputAudioDynamicToolCallOutputContentItem", + "type": "object" } ] }, @@ -463,12 +483,6 @@ "string", "null" ] - }, - "templateId": { - "type": [ - "string", - "null" - ] } }, "required": [ @@ -1247,6 +1261,15 @@ "query": { "type": "string" }, + "results": { + "default": null, + "description": "Structured search results returned out-of-band by standalone web search.\n\nThese stay as opaque JSON at the extension/app-server boundary so new result fields and result types can pass through without a Codex release.", + "items": true, + "type": [ + "array", + "null" + ] + }, "type": { "enum": [ "webSearch" @@ -1288,6 +1311,7 @@ "type": "object" }, { + "description": "Display item emitted by the interruptible `clock.sleep` tool.", "properties": { "durationMs": { "format": "uint64", @@ -1649,6 +1673,46 @@ "title": "LocalImageUserInput", "type": "object" }, + { + "properties": { + "type": { + "enum": [ + "audio" + ], + "title": "AudioUserInputType", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "type", + "url" + ], + "title": "AudioUserInput", + "type": "object" + }, + { + "properties": { + "path": { + "type": "string" + }, + "type": { + "enum": [ + "localAudio" + ], + "title": "LocalAudioUserInputType", + "type": "string" + } + }, + "required": [ + "path", + "type" + ], + "title": "LocalAudioUserInput", + "type": "object" + }, { "properties": { "name": { diff --git a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json index 4f26eb09ea6d..9735bef28522 100644 --- a/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json +++ b/extensions/codex/src/app-server/protocol-generated/json/v2/TurnStartResponse.json @@ -378,6 +378,26 @@ ], "title": "InputImageDynamicToolCallOutputContentItem", "type": "object" + }, + { + "properties": { + "audioUrl": { + "type": "string" + }, + "type": { + "enum": [ + "inputAudio" + ], + "title": "InputAudioDynamicToolCallOutputContentItemType", + "type": "string" + } + }, + "required": [ + "audioUrl", + "type" + ], + "title": "InputAudioDynamicToolCallOutputContentItem", + "type": "object" } ] }, @@ -463,12 +483,6 @@ "string", "null" ] - }, - "templateId": { - "type": [ - "string", - "null" - ] } }, "required": [ @@ -1247,6 +1261,15 @@ "query": { "type": "string" }, + "results": { + "default": null, + "description": "Structured search results returned out-of-band by standalone web search.\n\nThese stay as opaque JSON at the extension/app-server boundary so new result fields and result types can pass through without a Codex release.", + "items": true, + "type": [ + "array", + "null" + ] + }, "type": { "enum": [ "webSearch" @@ -1288,6 +1311,7 @@ "type": "object" }, { + "description": "Display item emitted by the interruptible `clock.sleep` tool.", "properties": { "durationMs": { "format": "uint64", @@ -1649,6 +1673,46 @@ "title": "LocalImageUserInput", "type": "object" }, + { + "properties": { + "type": { + "enum": [ + "audio" + ], + "title": "AudioUserInputType", + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "type", + "url" + ], + "title": "AudioUserInput", + "type": "object" + }, + { + "properties": { + "path": { + "type": "string" + }, + "type": { + "enum": [ + "localAudio" + ], + "title": "LocalAudioUserInputType", + "type": "string" + } + }, + "required": [ + "path", + "type" + ], + "title": "LocalAudioUserInput", + "type": "object" + }, { "properties": { "name": { diff --git a/extensions/codex/src/app-server/shared-client.test.ts b/extensions/codex/src/app-server/shared-client.test.ts index 326e29be2a0c..2ebb7d38e98d 100644 --- a/extensions/codex/src/app-server/shared-client.test.ts +++ b/extensions/codex/src/app-server/shared-client.test.ts @@ -257,7 +257,7 @@ describe("shared Codex app-server client", () => { await sendInitializeResult(harness, "openclaw/0.117.9 (macOS; test)"); await expect(listPromise).rejects.toThrow( - "A stable Codex app-server from 0.143.0 through 0.144.6 is required", + "A stable Codex app-server from 0.143.0 through 0.145.0 is required", ); expect(harness.process.stdin.destroyed).toBe(true); startSpy.mockRestore(); diff --git a/extensions/codex/src/app-server/version.ts b/extensions/codex/src/app-server/version.ts index bc9fa8aa55e6..b2ff67d490aa 100644 --- a/extensions/codex/src/app-server/version.ts +++ b/extensions/codex/src/app-server/version.ts @@ -6,6 +6,6 @@ /** Minimum Codex app-server version supported by the OpenClaw Codex bridge. */ export const MIN_CODEX_APP_SERVER_VERSION = "0.143.0"; /** Newest Codex app-server version validated by the OpenClaw Codex bridge. */ -export const MAX_CODEX_APP_SERVER_VERSION = "0.144.6"; +export const MAX_CODEX_APP_SERVER_VERSION = "0.145.0"; /** npm package name for the managed Codex app-server binary. */ export const MANAGED_CODEX_APP_SERVER_PACKAGE = "@openai/codex"; diff --git a/extensions/qa-lab/package.json b/extensions/qa-lab/package.json index dcea29a94ae7..1b1a763b903b 100644 --- a/extensions/qa-lab/package.json +++ b/extensions/qa-lab/package.json @@ -23,7 +23,7 @@ "@openclaw/slack": "workspace:*", "@openclaw/whatsapp": "workspace:*", "openclaw": "workspace:*", - "vite": "8.1.3" + "vite": "8.1.5" }, "peerDependencies": { "openclaw": ">=2026.7.2" diff --git a/extensions/slack/npm-shrinkwrap.json b/extensions/slack/npm-shrinkwrap.json index 8a8f76cfb2a9..646ced4f18fc 100644 --- a/extensions/slack/npm-shrinkwrap.json +++ b/extensions/slack/npm-shrinkwrap.json @@ -8,11 +8,13 @@ "name": "@openclaw/slack", "version": "2026.7.2", "dependencies": { - "@slack/bolt": "4.7.3", - "@slack/types": "2.21.1", - "@slack/web-api": "7.18.0", + "@slack/bolt": "5.0.0", + "@slack/socket-mode": "3.0.0", + "@slack/types": "3.0.0", + "@slack/web-api": "8.0.0", "p-map": "7.0.5", "typebox": "1.3.6", + "undici": "7.28.0", "ws": "8.21.1", "zod": "4.4.3" }, @@ -26,110 +28,106 @@ } }, "node_modules/@slack/bolt": { - "version": "4.7.3", - "resolved": "https://registry.npmjs.org/@slack/bolt/-/bolt-4.7.3.tgz", - "integrity": "sha512-bODs8q/yNDWUPoxmQhFrRqLMA5vhB/PDizYWqb6CkQhLWEUo5JFtfJcmeU4ElGl6qSt++OKjSYNa4MPc77CleQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@slack/bolt/-/bolt-5.0.0.tgz", + "integrity": "sha512-L0FTzidrDKTu4Ph8sdv0bB3acafBTAC02TBcD+hojPTTNSMX3hSK+rkpkUKkqbbc0vGpSjd6A/g71Rjy7EbBhw==", "license": "MIT", "dependencies": { - "@slack/logger": "^4.0.1", - "@slack/oauth": "^3.0.5", - "@slack/socket-mode": "^2.0.7", - "@slack/types": "^2.21.1", - "@slack/web-api": "^7.16.0", - "axios": "^1.12.0", + "@slack/logger": "^5.0.0", + "@slack/oauth": "^4.0.0", + "@slack/socket-mode": "^3.0.0", + "@slack/types": "^3.0.0", + "@slack/web-api": "^8.0.0", "express": "^5.0.0", "path-to-regexp": "^8.1.0", "raw-body": "^3", "tsscmp": "^1.0.6" }, "engines": { - "node": ">=18", - "npm": ">=8.6.0" + "node": ">=20", + "npm": ">=9.6.4" }, "peerDependencies": { "@types/express": "^5.0.0" } }, "node_modules/@slack/logger": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-4.0.1.tgz", - "integrity": "sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@slack/logger/-/logger-5.0.0.tgz", + "integrity": "sha512-VGXhmmgsAo9shdQYh4tFDndd+7nsgp0Y5h0UPDaUp8K359pBasI6YdkMqFW3mCOxLQkq09qj7o7cq6f3DuXcJQ==", "license": "MIT", "dependencies": { - "@types/node": ">=18" + "@types/node": ">=20" }, "engines": { - "node": ">= 18", - "npm": ">= 8.6.0" + "node": ">= 20", + "npm": ">=9.6.4" } }, "node_modules/@slack/oauth": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/@slack/oauth/-/oauth-3.0.5.tgz", - "integrity": "sha512-exqFQySKhNDptWYSWhvRUJ4/+ndu2gayIy7vg/JfmJq3wGtGdHk531P96fAZyBm5c1Le3yaPYqv92rL4COlU3A==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@slack/oauth/-/oauth-4.0.0.tgz", + "integrity": "sha512-Aqs5bGghT+VtNcdwVOQy7CcyCfDNd9YYnZsCRukIF9p1Mxuq4uL+BjqlWQB0SeS4wzrLzePPgvj8JDuQil+ezA==", "license": "MIT", "dependencies": { - "@slack/logger": "^4.0.1", - "@slack/web-api": "^7.15.0", + "@slack/logger": "^5.0.0", + "@slack/web-api": "^8.0.0", "@types/jsonwebtoken": "^9", - "@types/node": ">=18", + "@types/node": ">=20", "jsonwebtoken": "^9" }, "engines": { - "node": ">=18", - "npm": ">=8.6.0" + "node": ">=20", + "npm": ">=9.6.4" } }, "node_modules/@slack/socket-mode": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-2.0.7.tgz", - "integrity": "sha512-qYy07je71WnEHgRwmw12DlAnZLi5HXmdlI2WUzUK2LH/rYXQpP6uEg462S5CwfE8FoCKUdIigHtYnOOfzZH1lQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/socket-mode/-/socket-mode-3.0.0.tgz", + "integrity": "sha512-QShO60SB0E+HH+TbcKj3CBEQbodToRyiXnxuSB4t1kvUlqEmuGA1nOOjrRDkDJbOECAZ13PLe4ek9SrntpfoYg==", "license": "MIT", "dependencies": { - "@slack/logger": "^4.0.1", - "@slack/web-api": "^7.15.0", - "@types/node": ">=18", - "@types/ws": "^8", - "eventemitter3": "^5", - "ws": "^8" + "@slack/logger": "^5.0.0", + "@slack/web-api": "^8.0.0", + "@types/node": ">=20", + "eventemitter3": "^5" }, "engines": { - "node": ">= 18", - "npm": ">= 8.6.0" + "node": ">=20", + "npm": ">=9.6.4" + }, + "peerDependencies": { + "undici": "^7.0.0" } }, "node_modules/@slack/types": { - "version": "2.21.1", - "resolved": "https://registry.npmjs.org/@slack/types/-/types-2.21.1.tgz", - "integrity": "sha512-I8vmSjNYWsaxuWPx6dz4yeh0h7vRBWbgAMK14LEmblbZ404BtrPbXs6jDPx4cYgGf8msDGF4A9opLZBu21FViQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@slack/types/-/types-3.0.0.tgz", + "integrity": "sha512-KNOqpnNAlsFt5Jk9XBclslQ0lobRIg/0tnhpmvZJAglHJx9E8oceN8hC3gaBzkR6UzQ9Wzq4rLsJ98wUcxWPfw==", "license": "MIT", "engines": { - "node": ">= 12.13.0", - "npm": ">= 6.12.0" + "node": ">= 20", + "npm": ">=9.6.4" } }, "node_modules/@slack/web-api": { - "version": "7.18.0", - "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-7.18.0.tgz", - "integrity": "sha512-EWBsKUhOFFp87beQg/ToSC+asWB7BrGHuh7uPC1ZI9vr41GjS+3WmmyWIMqs+mF6U+mh4d6HhtFlv67TrJFsvw==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@slack/web-api/-/web-api-8.0.0.tgz", + "integrity": "sha512-ORx3XQryQPq2Jnxv5giSKXVoQRUeylrrymIR2S9fPzLjPcCts8RayMeBSZMcpfpAqp6fnBRuPW2UB6dUPUTEZA==", "license": "MIT", "dependencies": { - "@slack/logger": "^4.0.1", - "@slack/types": "^2.21.0", - "@types/node": ">=18", + "@slack/logger": "^5.0.0", + "@slack/types": "^3.0.0", + "@types/node": ">=20", "@types/retry": "0.12.0", - "axios": "^1.16.0", "eventemitter3": "^5.0.1", - "form-data": "^4.0.4", - "is-electron": "2.2.2", - "is-stream": "^2", "p-queue": "^6", "p-retry": "^4", "retry": "^0.13.1" }, "engines": { - "node": ">= 18", - "npm": ">= 8.6.0" + "node": ">= 20", + "npm": ">=9.6.4" } }, "node_modules/@types/jsonwebtoken": { @@ -163,15 +161,6 @@ "integrity": "sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==", "license": "MIT" }, - "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/accepts": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", @@ -185,36 +174,6 @@ "node": ">= 0.6" } }, - "node_modules/agent-base": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", - "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", - "license": "MIT", - "dependencies": { - "debug": "4" - }, - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "license": "MIT" - }, - "node_modules/axios": { - "version": "1.18.1", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.18.1.tgz", - "integrity": "sha512-3nTvFlvpn9Zu/RkHUqtc7/+al4UpRW5az71ap5zccp6e8RAYEzhMTecX8Dz1wWDYrPpUoB1HAQEGEAEvUr7S9g==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", - "https-proxy-agent": "^5.0.1", - "proxy-from-env": "^2.1.0" - } - }, "node_modules/body-parser": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", @@ -296,18 +255,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, "node_modules/content-disposition": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.1.0.tgz", @@ -365,15 +312,6 @@ } } }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", @@ -451,21 +389,6 @@ "node": ">= 0.4" } }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -551,64 +474,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/RubenVerborgh" - } - ], - "license": "MIT", - "engines": { - "node": ">=4.0" - }, - "peerDependenciesMeta": { - "debug": { - "optional": true - } - } - }, - "node_modules/form-data": { - "version": "2.5.6", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.5.6.tgz", - "integrity": "sha512-Ogz/E85h9tlfJzpI6TuFpGcHZFhLrb9Gw8wq9v40CxSCPnv7ahKr6Xgtkn0KYCDQJ8DNn5VoMO8EXr9V5PadyA==", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.4", - "mime-types": "^2.1.35", - "safe-buffer": "^5.2.1" - }, - "engines": { - "node": ">= 0.12" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -697,21 +562,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/hasown": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", @@ -744,19 +594,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/https-proxy-agent": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", - "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", - "license": "MIT", - "dependencies": { - "agent-base": "6", - "debug": "4" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/iconv-lite": { "version": "0.7.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.3.tgz", @@ -788,30 +625,12 @@ "node": ">= 0.10" } }, - "node_modules/is-electron": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/is-electron/-/is-electron-2.2.2.tgz", - "integrity": "sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==", - "license": "MIT" - }, "node_modules/is-promise": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/jsonwebtoken": { "version": "9.0.3", "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz", @@ -1100,15 +919,6 @@ "node": ">= 0.10" } }, - "node_modules/proxy-from-env": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", - "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, "node_modules/qs": { "version": "6.15.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.3.tgz", @@ -1403,6 +1213,15 @@ "integrity": "sha512-Sc8RA0NCMEFmApHNU9ZMzqcpQj46She44J8ffpLM/bdhLNUZKq7DJumcLcsFx1gRmDfQPgCgOmFFJ7rcnfWNyA==", "license": "MIT" }, + "node_modules/undici": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.28.0.tgz", + "integrity": "sha512-cRZYrTDwWznlnRiPjggAGxZXanty6M8RV1ff8Wm4LWXBp7/IG8v5DnOm74DtUBp9OONpK75YlPnIjQqX0dBDtA==", + "license": "MIT", + "engines": { + "node": ">=20.18.1" + } + }, "node_modules/undici-types": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-8.3.0.tgz", diff --git a/extensions/slack/package.json b/extensions/slack/package.json index 923a7e79bb4d..3b33d3132424 100644 --- a/extensions/slack/package.json +++ b/extensions/slack/package.json @@ -8,11 +8,13 @@ }, "type": "module", "dependencies": { - "@slack/bolt": "4.7.3", - "@slack/types": "2.21.1", - "@slack/web-api": "7.18.0", + "@slack/bolt": "5.0.0", + "@slack/socket-mode": "3.0.0", + "@slack/types": "3.0.0", + "@slack/web-api": "8.0.0", "p-map": "7.0.5", "typebox": "1.3.6", + "undici": "7.28.0", "ws": "8.21.1", "zod": "4.4.3" }, diff --git a/extensions/slack/src/client-options.ts b/extensions/slack/src/client-options.ts index 29a4d2091912..5f15c0ec06bf 100644 --- a/extensions/slack/src/client-options.ts +++ b/extensions/slack/src/client-options.ts @@ -1,9 +1,24 @@ // Slack plugin module implements client options behavior. -import type { Agent } from "node:http"; +import { createRequire } from "node:module"; import type { RetryOptions, WebClientOptions } from "@slack/web-api"; -import { createNodeProxyAgent } from "openclaw/plugin-sdk/fetch-runtime"; +import { + addActiveManagedProxyTlsOptions, + resolveEnvHttpProxyAgentOptions, +} from "openclaw/plugin-sdk/fetch-runtime"; +import type { EnvHttpProxyAgent } from "undici"; -export type SlackLookupClientOptions = Pick; +type SlackUndiciRuntime = Pick; +type SlackProxyDispatcher = EnvHttpProxyAgent; + +const requireFromSlackSocketMode = (() => { + const require = createRequire(import.meta.url); + return createRequire(require.resolve("@slack/socket-mode/package.json")); +})(); + +function loadSlackUndiciRuntime(): SlackUndiciRuntime { + return requireFromSlackSocketMode("undici") as SlackUndiciRuntime; +} +export type SlackLookupClientOptions = Pick; export const SLACK_DEFAULT_RETRY_OPTIONS: RetryOptions = { retries: 2, @@ -23,41 +38,46 @@ const SLACK_LOOKUP_RETRY_OPTIONS: RetryOptions = { retries: 0, }; -/** - * Build an HTTPS proxy agent from env vars (HTTPS_PROXY, HTTP_PROXY, etc.) - * for use as the `agent` option in Slack WebClient and Socket Mode connections. - * - * When set, this agent is forwarded through @slack/bolt -> @slack/socket-mode -> - * SlackWebSocket as the `httpAgent`, which the `ws` library uses to tunnel the - * WebSocket upgrade request through the proxy. This fixes Socket Mode in - * environments where outbound traffic must go through an HTTP CONNECT proxy. - * - * Respects `NO_PROXY` / `no_proxy`; if `*.slack.com` (or a matching pattern) - * appears in the exclusion list, returns `undefined` so the connection is direct. - * - * Returns `undefined` when no proxy env var is configured or when Slack hosts - * are excluded by `NO_PROXY`. - */ -function resolveSlackProxyAgent(targetUrl: string): Agent | undefined { - try { - return createNodeProxyAgent({ - mode: "env", - targetUrl, - }); - } catch { - // Malformed proxy URL; degrade gracefully to direct connection. +/** Build the dispatcher shared by Slack Web API fetches and Socket Mode. */ +export function resolveSlackProxyDispatcher(): SlackProxyDispatcher | undefined { + const options = resolveEnvHttpProxyAgentOptions(); + if (!options) { return undefined; } + try { + const { EnvHttpProxyAgent } = loadSlackUndiciRuntime(); + return new EnvHttpProxyAgent(addActiveManagedProxyTlsOptions(options)); + } catch { + // Malformed proxy URL; degrade gracefully to direct connections. + return undefined; + } +} + +function createSlackDispatcherFetch( + dispatcher: SlackProxyDispatcher, +): NonNullable { + const { fetch: slackFetch } = loadSlackUndiciRuntime(); + return ((input: RequestInfo | URL, init?: RequestInit) => { + // Slack Web API invokes this hook with URL/string inputs. The cast only bridges + // duplicate Undici Request types while the package-owned fetch and dispatcher stay paired. + const slackInput = input as Parameters[0]; + const slackInit = { ...init, dispatcher } as Parameters[1]; + return slackFetch(slackInput, slackInit); + }) as NonNullable; } function resolveSlackApiUrlFromEnv(): string | undefined { return process.env.SLACK_API_URL?.trim() || undefined; } -function applySlackApiUrlAndProxyOptions(options: WebClientOptions): void { +function applySlackApiUrlAndProxyOptions( + options: WebClientOptions, + dispatcher?: SlackProxyDispatcher, +): void { const slackApiUrl = options.slackApiUrl ?? resolveSlackApiUrlFromEnv(); - const proxyTargetUrl = slackApiUrl ?? "https://slack.com/"; - options.agent ??= resolveSlackProxyAgent(proxyTargetUrl); + if (dispatcher && !options.fetch) { + options.fetch = createSlackDispatcherFetch(dispatcher); + } if (slackApiUrl !== undefined) { options.slackApiUrl = slackApiUrl; } else { @@ -65,25 +85,32 @@ function applySlackApiUrlAndProxyOptions(options: WebClientOptions): void { } } -export function resolveSlackWebClientOptions(options: WebClientOptions = {}): WebClientOptions { +export function resolveSlackWebClientOptions( + options: WebClientOptions = {}, + dispatcher = resolveSlackProxyDispatcher(), +): WebClientOptions { const resolved: WebClientOptions = Object.assign({}, options); - applySlackApiUrlAndProxyOptions(resolved); + applySlackApiUrlAndProxyOptions(resolved, dispatcher); resolved.retryConfig ??= SLACK_DEFAULT_RETRY_OPTIONS; return resolved; } -export function resolveSlackWriteClientOptions(options: WebClientOptions = {}): WebClientOptions { +export function resolveSlackWriteClientOptions( + options: WebClientOptions = {}, + dispatcher = resolveSlackProxyDispatcher(), +): WebClientOptions { const resolved: WebClientOptions = Object.assign({}, options); - applySlackApiUrlAndProxyOptions(resolved); + applySlackApiUrlAndProxyOptions(resolved, dispatcher); resolved.retryConfig ??= SLACK_WRITE_RETRY_OPTIONS; return resolved; } export function resolveSlackLookupClientOptions( options: SlackLookupClientOptions = {}, + dispatcher = resolveSlackProxyDispatcher(), ): WebClientOptions { const resolved: WebClientOptions = Object.assign({}, options); - applySlackApiUrlAndProxyOptions(resolved); + applySlackApiUrlAndProxyOptions(resolved, dispatcher); // Slack otherwise sleeps through the full Retry-After window after receiving 429, // outside the Axios request timeout. resolved.rejectRateLimitedCalls = true; diff --git a/extensions/slack/src/client.test.ts b/extensions/slack/src/client.test.ts index 73564ab0f22f..25d1285213ad 100644 --- a/extensions/slack/src/client.test.ts +++ b/extensions/slack/src/client.test.ts @@ -24,6 +24,7 @@ let createSlackWriteClient: typeof import("./client.js").createSlackWriteClient; let createSlackTokenCacheKey: typeof import("./client.js").createSlackTokenCacheKey; let getSlackWriteClient: typeof import("./client.js").getSlackWriteClient; let clearSlackWriteClientCacheForTest: typeof import("./client.js").clearSlackWriteClientCacheForTest; +let resolveSlackProxyDispatcher: typeof import("./client-options.js").resolveSlackProxyDispatcher; let resolveSlackWebClientOptions: typeof import("./client.js").resolveSlackWebClientOptions; let resolveSlackWriteClientOptions: typeof import("./client.js").resolveSlackWriteClientOptions; let SLACK_DEFAULT_RETRY_OPTIONS: typeof import("./client.js").SLACK_DEFAULT_RETRY_OPTIONS; @@ -78,11 +79,11 @@ function restoreSlackApiUrlEnvForTest() { } } -function requireAgent(options: T): NonNullable { - if (!options.agent) { - throw new Error("expected proxy agent"); +function requireFetch(options: WebClientOptions): NonNullable { + if (!options.fetch) { + throw new Error("expected dispatcher-backed fetch"); } - return options.agent as NonNullable; + return options.fetch; } function writeTempCa(contents: string): string { @@ -95,6 +96,7 @@ function writeTempCa(contents: string): string { beforeAll(async () => { const slackWebApi = await import("@slack/web-api"); + ({ resolveSlackProxyDispatcher } = await import("./client-options.js")); ({ createSlackWebClient, createSlackStartupAuthClient, @@ -179,27 +181,27 @@ describe("slack web client config", () => { }); it("passes merged options into WebClient", () => { - const customAgent = {} as never; + const customFetch = vi.fn() as never; - createSlackWebClient("xoxb-test", { timeout: 1234, agent: customAgent }); + createSlackWebClient("xoxb-test", { timeout: 1234, fetch: customFetch }); expect(WebClient).toHaveBeenCalledWith("xoxb-test", { - agent: customAgent, + fetch: customFetch, retryConfig: SLACK_DEFAULT_RETRY_OPTIONS, timeout: 1234, }); }); it("bounds startup auth while preserving listener transport options", () => { - const customAgent = {} as never; + const customFetch = vi.fn() as never; createSlackStartupAuthClient("xoxb-startup", { - agent: customAgent, + fetch: customFetch, slackApiUrl: "https://slack.test/api/", }); expect(WebClient).toHaveBeenCalledWith("xoxb-startup", { - agent: customAgent, + fetch: customFetch, rejectRateLimitedCalls: true, retryConfig: { retries: 0 }, slackApiUrl: "https://slack.test/api/", @@ -213,7 +215,6 @@ describe("slack web client config", () => { createSlackWebClient("xoxb-test", { timeout: 1234 }); expect(WebClient).toHaveBeenCalledWith("xoxb-test", { - agent: undefined, retryConfig: SLACK_DEFAULT_RETRY_OPTIONS, timeout: 1234, }); @@ -229,12 +230,12 @@ describe("slack web client config", () => { }); it("passes the bounded lookup policy into WebClient", () => { - const customAgent = {} as never; + const customFetch = vi.fn() as never; - createSlackLookupClient("lookup-fixture", { agent: customAgent }); + createSlackLookupClient("lookup-fixture", { fetch: customFetch }); expect(WebClient).toHaveBeenCalledWith("lookup-fixture", { - agent: customAgent, + fetch: customFetch, rejectRateLimitedCalls: true, retryConfig: { retries: 0 }, timeout: 30_000, @@ -248,12 +249,12 @@ describe("slack web client config", () => { }); it("passes no-retry config into the write client by default", () => { - const customAgent = {} as never; + const customFetch = vi.fn() as never; - createSlackWriteClient("xoxb-test", { timeout: 4321, agent: customAgent }); + createSlackWriteClient("xoxb-test", { timeout: 4321, fetch: customFetch }); expect(WebClient).toHaveBeenCalledWith("xoxb-test", { - agent: customAgent, + fetch: customFetch, retryConfig: SLACK_WRITE_RETRY_OPTIONS, timeout: 4321, }); @@ -268,7 +269,6 @@ describe("slack web client config", () => { expect(second).toBe(first); expect(WebClient).toHaveBeenCalledTimes(1); expect(WebClient).toHaveBeenCalledWith("xoxb-test", { - agent: undefined, retryConfig: SLACK_WRITE_RETRY_OPTIONS, }); } finally { @@ -336,7 +336,7 @@ describe("slack web client config", () => { }); }); -describe("slack proxy agent", () => { +describe("slack proxy dispatcher", () => { beforeEach(() => { clearProxyEnvForTest(); }); @@ -348,122 +348,86 @@ describe("slack proxy agent", () => { restoreProxyEnvForTest(); }); - it("sets agent from HTTPS_PROXY env var", () => { + it("attaches one dispatcher-backed fetch for HTTPS_PROXY", async () => { process.env.HTTPS_PROXY = "http://proxy.example.com:3128"; - const options = resolveSlackWebClientOptions(); - const agent = requireAgent(options); + const dispatcher = resolveSlackProxyDispatcher(); + const options = resolveSlackWebClientOptions({}, dispatcher); - expect(agent.constructor.name).toBe("ProxylineNodeProxyAgent"); + expect(dispatcher?.constructor.name).toBe("EnvHttpProxyAgent"); + expect(requireFetch(options)).toBeTypeOf("function"); + await dispatcher?.close(); }); - it("creates Slack env proxy agents while managed proxy CA trust is active", () => { + it("creates the dispatcher while managed proxy CA trust is active", async () => { const caFile = writeTempCa("slack-managed-proxy-ca"); process.env.HTTPS_PROXY = "https://proxy.example.com:8443"; process.env.OPENCLAW_PROXY_ACTIVE = "1"; process.env.OPENCLAW_PROXY_CA_FILE = caFile; - const options = resolveSlackWebClientOptions(); - const agent = requireAgent(options); - - expect(agent.constructor.name).toBe("ProxylineNodeProxyAgent"); + const dispatcher = resolveSlackProxyDispatcher(); + expect(dispatcher?.constructor.name).toBe("EnvHttpProxyAgent"); + await dispatcher?.close(); }); - it("falls back to HTTP_PROXY when HTTPS_PROXY is not set", () => { + it("falls back to HTTP_PROXY when HTTPS_PROXY is not set", async () => { process.env.HTTP_PROXY = "http://proxy.example.com:3128"; - const options = resolveSlackWebClientOptions(); + const dispatcher = resolveSlackProxyDispatcher(); - expect(requireAgent(options).constructor.name).toBe("ProxylineNodeProxyAgent"); + expect(dispatcher?.constructor.name).toBe("EnvHttpProxyAgent"); + await dispatcher?.close(); }); - it("does not set agent when no proxy env var is configured", () => { - const options = resolveSlackWebClientOptions(); - - expect(options.agent).toBeUndefined(); + it("does not attach a fetch when no proxy env var is configured", () => { + expect(resolveSlackProxyDispatcher()).toBeUndefined(); + expect(resolveSlackWebClientOptions().fetch).toBeUndefined(); }); - it("does not override an explicitly provided agent", () => { + it("preserves an explicitly provided fetch", async () => { process.env.HTTPS_PROXY = "http://proxy.example.com:3128"; - const customAgent = {} as never; - const options = resolveSlackWebClientOptions({ agent: customAgent }); + const customFetch = vi.fn() as never; + const dispatcher = resolveSlackProxyDispatcher(); + const options = resolveSlackWebClientOptions({ fetch: customFetch }, dispatcher); - expect(options.agent).toBe(customAgent); - }); - - it("prefers lowercase https_proxy over uppercase", () => { - process.env.https_proxy = "http://lower.example.com:3128"; - process.env.HTTPS_PROXY = "http://upper.example.com:3128"; - const options = resolveSlackWebClientOptions(); - const agent = requireAgent(options); - - // Proxyline stores the effective proxy URL in its resolver. - expect( - (agent as unknown as { getProxyForUrl: (url: string) => string }).getProxyForUrl( - "https://slack.com/", - ), - ).toContain("lower.example.com"); + expect(options.fetch).toBe(customFetch); + await dispatcher?.close(); }); it("treats empty lowercase https_proxy as authoritative over uppercase", () => { process.env.https_proxy = ""; process.env.HTTPS_PROXY = "http://upper.example.com:3128"; - const options = resolveSlackWebClientOptions(); - expect(options.agent).toBeUndefined(); + expect(resolveSlackProxyDispatcher()).toBeUndefined(); }); - it("also applies proxy agent to write client options", () => { + it("also applies the dispatcher-backed fetch to write clients", async () => { process.env.HTTPS_PROXY = "http://proxy.example.com:3128"; - const options = resolveSlackWriteClientOptions(); - const agent = requireAgent(options); + const dispatcher = resolveSlackProxyDispatcher(); + const options = resolveSlackWriteClientOptions({}, dispatcher); - expect(agent.constructor.name).toBe("ProxylineNodeProxyAgent"); + expect(requireFetch(options)).toBeTypeOf("function"); + await dispatcher?.close(); }); - it("respects NO_PROXY excluding slack.com", () => { + it.each([ + "localhost,slack.com,.internal.corp", + "localhost *.slack.com", + "*", + "localhost,.internal.corp", + ])("keeps NO_PROXY matching inside the shared env dispatcher: %s", async (noProxy) => { process.env.HTTPS_PROXY = "http://proxy.example.com:3128"; - process.env.NO_PROXY = "localhost,slack.com,.internal.corp"; - const options = resolveSlackWebClientOptions(); + process.env.NO_PROXY = noProxy; + const dispatcher = resolveSlackProxyDispatcher(); + const options = resolveSlackWebClientOptions({}, dispatcher); - expect(options.agent).toBeUndefined(); - }); - - it("respects no_proxy (lowercase) excluding .slack.com", () => { - process.env.HTTPS_PROXY = "http://proxy.example.com:3128"; - process.env.no_proxy = ".slack.com"; - const options = resolveSlackWebClientOptions(); - - expect(options.agent).toBeUndefined(); - }); - - it("respects space-separated no_proxy entries", () => { - process.env.HTTPS_PROXY = "http://proxy.example.com:3128"; - process.env.no_proxy = "localhost *.slack.com"; - const options = resolveSlackWebClientOptions(); - - expect(options.agent).toBeUndefined(); - }); - - it("respects NO_PROXY wildcard", () => { - process.env.HTTPS_PROXY = "http://proxy.example.com:3128"; - process.env.NO_PROXY = "*"; - const options = resolveSlackWebClientOptions(); - - expect(options.agent).toBeUndefined(); - }); - - it("does not skip proxy when NO_PROXY excludes unrelated hosts", () => { - process.env.HTTPS_PROXY = "http://proxy.example.com:3128"; - process.env.NO_PROXY = "localhost,.internal.corp"; - const options = resolveSlackWebClientOptions(); - - expect(requireAgent(options).constructor.name).toBe("ProxylineNodeProxyAgent"); + expect(dispatcher?.constructor.name).toBe("EnvHttpProxyAgent"); + expect(requireFetch(options)).toBeTypeOf("function"); + await dispatcher?.close(); }); it("degrades gracefully on malformed proxy URL", () => { process.env.HTTPS_PROXY = "not-a-valid-url://:::bad"; - const options = resolveSlackWebClientOptions(); - // Should not throw; falls back to no agent - expect(options.agent).toBeUndefined(); + expect(resolveSlackProxyDispatcher()).toBeUndefined(); + expect(resolveSlackWebClientOptions().fetch).toBeUndefined(); }); }); diff --git a/extensions/slack/src/monitor/event-scope.test.ts b/extensions/slack/src/monitor/event-scope.test.ts index 36cfa81b31e0..bf0479af35d6 100644 --- a/extensions/slack/src/monitor/event-scope.test.ts +++ b/extensions/slack/src/monitor/event-scope.test.ts @@ -53,16 +53,14 @@ describe("resolveSlackEventScope", () => { const teamScopedClient = new WebClient("xoxb-test", { teamId: "T111", retryConfig: { retries: 0 }, - adapter: async (config) => { - encodedRequestBody = String(config.data); - return { - data: { ok: true, ts: "123.456", channel: "C123" }, - status: 200, - statusText: "OK", - headers: {}, - config, - request: {}, - }; + fetch: (_input, init) => { + encodedRequestBody = typeof init?.body === "string" ? init.body : ""; + return Promise.resolve( + new Response(JSON.stringify({ ok: true, ts: "123.456", channel: "C123" }), { + status: 200, + headers: { "content-type": "application/json" }, + }), + ); }, }); const methodPayload = { channel: "C123", text: "hello" }; diff --git a/extensions/slack/src/monitor/provider-support.ts b/extensions/slack/src/monitor/provider-support.ts index e1c6ea7be03f..479482b0b4fc 100644 --- a/extensions/slack/src/monitor/provider-support.ts +++ b/extensions/slack/src/monitor/provider-support.ts @@ -309,6 +309,7 @@ export function createSlackBoltApp(params: { signingSecret?: string; slackWebhookPath: string; clientOptions: Record; + dispatcher?: SlackSocketModeReceiverOptions["dispatcher"]; wrapReceiver?: (receiver: SlackReceiver) => SlackReceiver; }) { const socketModeLogger = createSlackSocketModeLogger(); @@ -317,6 +318,7 @@ export function createSlackBoltApp(params: { autoReconnectEnabled: true, clientPingTimeout: OPENCLAW_SLACK_CLIENT_PING_TIMEOUT_MS, logger: socketModeLogger, + ...(params.dispatcher ? { dispatcher: params.dispatcher } : {}), installerOptions: { clientOptions: params.clientOptions, }, diff --git a/extensions/slack/src/monitor/provider.reconnect.test.ts b/extensions/slack/src/monitor/provider.reconnect.test.ts index 0dd51c3df774..365fec4bb644 100644 --- a/extensions/slack/src/monitor/provider.reconnect.test.ts +++ b/extensions/slack/src/monitor/provider.reconnect.test.ts @@ -185,14 +185,11 @@ describe("slack socket reconnect helpers", () => { ); client.emit( "ws_message", - Buffer.from(JSON.stringify({ type: "hello", num_connections: 2 })), - false, - ); - client.emit( - "ws_message", - Buffer.from(JSON.stringify({ type: "hello", num_connections: 3 })), - false, + Buffer.from(JSON.stringify({ type: "hello", num_connections: 4 })), + true, ); + client.emit("ws_message", JSON.stringify({ type: "hello", num_connections: 2 }), false); + client.emit("ws_message", JSON.stringify({ type: "hello", num_connections: 3 }), false); expect(onSharedConnection).toHaveBeenCalledTimes(1); expect(onSharedConnection).toHaveBeenCalledWith(2); diff --git a/extensions/slack/src/monitor/provider.ts b/extensions/slack/src/monitor/provider.ts index a73d0d33ea0e..e18a2f1fa605 100644 --- a/extensions/slack/src/monitor/provider.ts +++ b/extensions/slack/src/monitor/provider.ts @@ -33,7 +33,7 @@ import { resolveSlackAccountDmPolicy, } from "../accounts.js"; import { isSlackAnyNativeApprovalClientEnabled } from "../approval-native-gates.js"; -import { resolveSlackWebClientOptions } from "../client-options.js"; +import { resolveSlackProxyDispatcher, resolveSlackWebClientOptions } from "../client-options.js"; import { createSlackStartupAuthClient } from "../client.js"; import { normalizeSlackWebhookPath, registerSlackHttpHandler } from "../http/index.js"; import { SLACK_TEXT_LIMIT } from "../limits.js"; @@ -341,7 +341,8 @@ export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) { const ackReactionScope = cfg.messages?.ackReactionScope ?? "group-mentions"; const typingReaction = slackCfg.typingReaction?.trim() ?? ""; const mediaMaxBytes = (opts.mediaMaxMb ?? slackCfg.mediaMaxMb ?? 20) * 1024 * 1024; - const clientOptions = resolveSlackWebClientOptions(); + const slackDispatcher = resolveSlackProxyDispatcher(); + const clientOptions = resolveSlackWebClientOptions({}, slackDispatcher); const durableIngress = createSlackDurableIngress({ accountId: account.accountId, ...(runtime.log ? { onLog: runtime.log } : {}), @@ -355,6 +356,7 @@ export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) { signingSecret: slackMode === "http" ? (signingSecret ?? undefined) : undefined, slackWebhookPath, clientOptions: clientOptions as Record, + dispatcher: slackDispatcher, wrapReceiver: durableIngress.wrapReceiver, }); @@ -853,6 +855,7 @@ export async function monitorSlackProvider(opts: MonitorSlackOpts = {}) { unregisterHttpHandler?.(); await durableIngress.stop(); await gracefulStop(); + await slackDispatcher?.close(); } } diff --git a/extensions/slack/src/monitor/reconnect-policy.ts b/extensions/slack/src/monitor/reconnect-policy.ts index 5c816eeed0ab..059241922f11 100644 --- a/extensions/slack/src/monitor/reconnect-policy.ts +++ b/extensions/slack/src/monitor/reconnect-policy.ts @@ -55,13 +55,16 @@ function isBufferArray(value: unknown): value is Buffer[] { } function resolveSlackSocketModeConnectionCount(message: unknown): number | undefined { - const buffer = Buffer.isBuffer(message) - ? message - : message instanceof ArrayBuffer + const buffer = + typeof message === "string" ? Buffer.from(message) - : isBufferArray(message) - ? Buffer.concat(message) - : undefined; + : Buffer.isBuffer(message) + ? message + : message instanceof ArrayBuffer + ? Buffer.from(message) + : isBufferArray(message) + ? Buffer.concat(message) + : undefined; if (!buffer?.includes(SLACK_SOCKET_HELLO_MARKER)) { return undefined; } diff --git a/extensions/slack/src/monitor/replies.ts b/extensions/slack/src/monitor/replies.ts index a1b33343d414..440ae54b8135 100644 --- a/extensions/slack/src/monitor/replies.ts +++ b/extensions/slack/src/monitor/replies.ts @@ -24,7 +24,8 @@ import { emitSlackMessageSentHooks } from "../message-sent-hook.js"; import { buildSlackNativeDataAccessibilityText, hasSlackNativeDataBlock, - isSlackInvalidBlocksError, + isSlackInvalidBlocksResponse, + isSlackNativeResponseUrlRejection, } from "../native-data-blocks.js"; import { buildSlackNativeDataDeliveryPlan, @@ -565,7 +566,7 @@ export async function deliverSlackSlashReplies(params: { const deliverNativeFallback = async (messages: readonly SlackFormattingDisabledMessage[]) => { for (const message of messages) { const response = await respond(message); - if (isSlackInvalidBlocksError(response)) { + if (await isSlackInvalidBlocksResponse(response)) { throw new Error("Slack rejected the native-data fallback blocks with invalid_blocks."); } } @@ -593,9 +594,9 @@ export async function deliverSlackSlashReplies(params: { let rejectedNativeBlocks = false; try { const response = await respond(planned.message); - rejectedNativeBlocks = isSlackInvalidBlocksError(response); + rejectedNativeBlocks = await isSlackInvalidBlocksResponse(response); } catch (error) { - if (!isSlackInvalidBlocksError(error)) { + if (!isSlackNativeResponseUrlRejection(error)) { throw error; } rejectedNativeBlocks = true; diff --git a/extensions/slack/src/monitor/slash.ts b/extensions/slack/src/monitor/slash.ts index 5c46178a9a12..ca9ae4efafaa 100644 --- a/extensions/slack/src/monitor/slash.ts +++ b/extensions/slack/src/monitor/slash.ts @@ -1038,7 +1038,7 @@ export async function registerSlackMonitorSlashCommands(params: { respond ?? (async (message) => { if (!body.channel?.id || !body.user?.id) { - return; + return new Response(null, { status: 204 }); } const payload = typeof message === "string" @@ -1056,6 +1056,7 @@ export async function registerSlackMonitorSlashCommands(params: { ...(payload.blocks ? { blocks: payload.blocks } : {}), ...(typeof payload.mrkdwn === "boolean" ? { mrkdwn: payload.mrkdwn } : {}), }); + return new Response(null, { status: 200 }); }); const actionValue = action?.value ?? action?.selected_option?.value; const parsed = parseSlackCommandArgValue(actionValue); diff --git a/extensions/slack/src/native-data-blocks.test.ts b/extensions/slack/src/native-data-blocks.test.ts index e210c9a36e46..a8f8a8c66898 100644 --- a/extensions/slack/src/native-data-blocks.test.ts +++ b/extensions/slack/src/native-data-blocks.test.ts @@ -1,9 +1,12 @@ +import { Response as UndiciResponse } from "undici"; import { describe, expect, it } from "vitest"; import { appendSlackNativeDataFallbackText, buildSlackNativeDataAccessibilityText, hasSlackNativeDataBlock, isSlackInvalidBlocksError, + isSlackInvalidBlocksResponse, + isSlackNativeResponseUrlRejection, } from "./native-data-blocks.js"; const chart = { @@ -52,6 +55,29 @@ describe("Slack native data blocks", () => { expect(isSlackInvalidBlocksError(new Error("invalid_blocks"))).toBe(false); }); + it("matches Bolt 5 response_url responses and contextual RespondError failures", async () => { + const response = new Response(JSON.stringify({ error: "invalid_blocks" }), { status: 200 }); + await expect(isSlackInvalidBlocksResponse(response)).resolves.toBe(true); + await expect( + isSlackInvalidBlocksResponse( + new UndiciResponse(JSON.stringify({ error: "invalid_blocks" }), { status: 200 }), + ), + ).resolves.toBe(true); + await expect(isSlackInvalidBlocksResponse(new Response("ok"))).resolves.toBe(false); + expect( + isSlackNativeResponseUrlRejection({ + code: "slack_bolt_respond_error", + statusCode: 400, + }), + ).toBe(true); + expect( + isSlackNativeResponseUrlRejection({ + code: "slack_bolt_respond_error", + statusCode: 500, + }), + ).toBe(false); + }); + it("appends mixed native data in block order without collapsing repeated blocks", () => { const chartText = "Revenue mix (pie chart)\n- Product: 60\n- Services: 40"; const tableText = "Pipeline report (table)\n- Account: Acme; ARR: $125k"; diff --git a/extensions/slack/src/native-data-blocks.ts b/extensions/slack/src/native-data-blocks.ts index 7c032e8576bb..2e7483e49c94 100644 --- a/extensions/slack/src/native-data-blocks.ts +++ b/extensions/slack/src/native-data-blocks.ts @@ -49,6 +49,41 @@ export function isSlackInvalidBlocksError(error: unknown): boolean { return typeof code === "string" && code.trim().toLowerCase() === "invalid_blocks"; } +type SlackResponseLike = { + status: number; + clone: () => { text: () => Promise }; +}; + +function isSlackResponseLike(value: unknown): value is SlackResponseLike { + const record = asRecord(value); + return typeof record?.status === "number" && typeof record.clone === "function"; +} + +/** Inspect Bolt 5's native response_url Response without consuming the caller's body. */ +export async function isSlackInvalidBlocksResponse(response: unknown): Promise { + if (!isSlackResponseLike(response)) { + return isSlackInvalidBlocksError(response); + } + try { + const body = await response.clone().text(); + if (body.trim().toLowerCase() === "invalid_blocks") { + return true; + } + return isSlackInvalidBlocksError(JSON.parse(body)); + } catch { + return false; + } +} + +/** Bolt 5 omits the response body from RespondError; 400 is contextual here. */ +export function isSlackNativeResponseUrlRejection(error: unknown): boolean { + if (isSlackInvalidBlocksError(error)) { + return true; + } + const record = asRecord(error); + return record?.code === "slack_bolt_respond_error" && record.statusCode === 400; +} + /** Extract a complete accessible summary from a supported native data block. */ function renderSlackNativeDataFallbackText(value: unknown): string | undefined { const type = asRecord(value)?.type; diff --git a/npm-shrinkwrap.json b/npm-shrinkwrap.json index 58452d9f6d9b..ee62acf8fa64 100644 --- a/npm-shrinkwrap.json +++ b/npm-shrinkwrap.json @@ -10,11 +10,11 @@ "hasInstallScript": true, "license": "MIT", "dependencies": { - "@agentclientprotocol/sdk": "1.2.1", + "@agentclientprotocol/sdk": "1.3.0", "@anthropic-ai/sdk": "0.112.3", "@clack/core": "1.4.3", "@clack/prompts": "1.7.0", - "@earendil-works/pi-tui": "0.80.10", + "@earendil-works/pi-tui": "0.81.1", "@google/genai": "2.12.0", "@grammyjs/runner": "2.0.3", "@grammyjs/transformer-throttler": "1.2.1", @@ -34,7 +34,7 @@ "diff": "9.0.0", "dotenv": "17.4.2", "entities": "8.0.0", - "execa": "9.6.1", + "execa": "10.0.0", "express": "5.2.1", "file-type": "22.0.1", "grammy": "1.45.1", @@ -63,7 +63,7 @@ "semver": "7.8.5", "tar": "7.5.20", "tree-sitter-bash": "0.25.1", - "tslog": "4.10.2", + "tslog": "4.11.0", "typebox": "1.3.6", "typescript": "6.0.3", "undici": "8.6.0", @@ -84,9 +84,9 @@ } }, "node_modules/@agentclientprotocol/sdk": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-1.2.1.tgz", - "integrity": "sha512-jwYUdOQR7tc+Zfch53VL4JJyUNK/46q03uUTYb+PjECsmnNl94XFXOfYLJ8RBpMNidXd1rpOAVgb0vqD98xImA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@agentclientprotocol/sdk/-/sdk-1.3.0.tgz", + "integrity": "sha512-i3h/efaeuMUFAO1HSfo97QZQnnvMd7wWBYtBsdL6UMZg3a78sk3Ffya5Xu7C7tYsXomXoDXJBAzQF2PcFKAhIQ==", "license": "Apache-2.0", "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" @@ -161,9 +161,9 @@ } }, "node_modules/@earendil-works/pi-tui": { - "version": "0.80.10", - "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.80.10.tgz", - "integrity": "sha512-c2JO29PbhKPEQ6fgHQKAl0WhwuFqzWfzspMmP+8B5tpDuP+0mvarRbKKg8gq4b+pQx/QX+6aVS4ko7deoyjQjg==", + "version": "0.81.1", + "resolved": "https://registry.npmjs.org/@earendil-works/pi-tui/-/pi-tui-0.81.1.tgz", + "integrity": "sha512-OMEe+Zt8oQYi/rCq3upxsTlIScWL0FPhXwQus34TbQb3EmTx88S7Uzx32JxvQiEeWOw8eDCdJf2PBUBE9r6wIg==", "license": "MIT", "dependencies": { "get-east-asian-width": "1.6.0", @@ -1369,31 +1369,44 @@ } }, "node_modules/execa": { - "version": "9.6.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-9.6.1.tgz", - "integrity": "sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-10.0.0.tgz", + "integrity": "sha512-Cxl6MKxB1dr1H0FHmiizJ+lavKF7pV+fcDZFyqMB8d5m7qUPm/OtZYcD5vPWePKxSnTQ57KuBd9mtdZ3oNCvyQ==", "license": "MIT", "dependencies": { "@sindresorhus/merge-streams": "^4.0.0", - "cross-spawn": "^7.0.6", "figures": "^6.1.0", - "get-stream": "^9.0.0", + "get-stream": "^9.0.1", "human-signals": "^8.0.1", "is-plain-obj": "^4.1.0", "is-stream": "^4.0.1", "npm-run-path": "^6.0.0", - "pretty-ms": "^9.2.0", + "path-key": "^4.0.0", + "pretty-ms": "^9.3.0", "signal-exit": "^4.1.0", "strip-final-newline": "^4.0.0", - "yoctocolors": "^2.1.1" + "which-command": "^0.1.0", + "yoctocolors": "^2.1.2" }, "engines": { - "node": "^18.19.0 || >=20.5.0" + "node": ">=22" }, "funding": { "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/express": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", @@ -3605,9 +3618,9 @@ "license": "0BSD" }, "node_modules/tslog": { - "version": "4.10.2", - "resolved": "https://registry.npmjs.org/tslog/-/tslog-4.10.2.tgz", - "integrity": "sha512-XuELoRpMR+sq8fuWwX7P0bcj+PRNiicOKDEb3fGNURhxWVyykCi9BNq7c4uVz7h7P0sj8qgBsr5SWS6yBClq3g==", + "version": "4.11.0", + "resolved": "https://registry.npmjs.org/tslog/-/tslog-4.11.0.tgz", + "integrity": "sha512-gBe0FTKkRpOv3DenGipjQWQe073jNd1cOLj3nYfVM0/NP29sQzAIx6kfyfTTsQOiWMC+B+tSr289lNXtu7HCmQ==", "license": "MIT", "engines": { "node": ">=16" @@ -3800,6 +3813,21 @@ "node": ">= 8" } }, + "node_modules/which-command": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/which-command/-/which-command-0.1.0.tgz", + "integrity": "sha512-XZyoF5/5hZtXitIwzrU4NKK+Wtbb9aB9CezUEw2Q0wlYK8NUYQxC1rRXgNueYLtBAJwXIb+/tFVk4dozciNJMA==", + "license": "MIT", + "bin": { + "which-command": "cli.js" + }, + "engines": { + "node": ">=22" + }, + "funding": { + "url": "https://github.com/sindresorhus/which-command?sponsor=1" + } + }, "node_modules/which-module": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz", diff --git a/package.json b/package.json index 6ec6aea2ec9e..4c545dc2a58a 100644 --- a/package.json +++ b/package.json @@ -1884,11 +1884,11 @@ "verify": "node scripts/verify.mjs" }, "dependencies": { - "@agentclientprotocol/sdk": "1.2.1", + "@agentclientprotocol/sdk": "1.3.0", "@anthropic-ai/sdk": "0.112.3", "@clack/core": "1.4.3", "@clack/prompts": "1.7.0", - "@earendil-works/pi-tui": "0.80.10", + "@earendil-works/pi-tui": "0.81.1", "@google/genai": "2.12.0", "@grammyjs/runner": "2.0.3", "@grammyjs/transformer-throttler": "1.2.1", @@ -1909,7 +1909,7 @@ "diff": "9.0.0", "dotenv": "17.4.2", "entities": "8.0.0", - "execa": "9.6.1", + "execa": "10.0.0", "express": "5.2.1", "file-type": "22.0.1", "grammy": "1.45.1", @@ -1938,7 +1938,7 @@ "semver": "7.8.5", "tar": "7.5.20", "tree-sitter-bash": "0.25.1", - "tslog": "4.10.2", + "tslog": "4.11.0", "typebox": "1.3.6", "typescript": "6.0.3", "undici": "8.6.0", @@ -1972,10 +1972,10 @@ "esbuild": "0.28.1", "fast-glob": "3.3.3", "ipaddr.js": "2.4.0", - "jscpd": "5.0.12", + "jscpd": "4.2.4", "jsdom": "29.1.1", "lit": "3.3.3", - "oxfmt": "0.59.0", + "oxfmt": "0.60.0", "oxlint": "1.74.0", "oxlint-tsgolint": "0.25.0", "playwright": "1.61.1", @@ -1985,7 +1985,7 @@ "tsdown": "0.22.1", "tsx": "4.23.1", "unrun": "0.3.1", - "vite": "8.1.3", + "vite": "8.1.5", "vitest": "4.1.10" }, "optionalDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 18bc78f50a1f..736f6b378c8d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -42,8 +42,8 @@ importers: .: dependencies: '@agentclientprotocol/sdk': - specifier: 1.2.1 - version: 1.2.1(zod@4.4.3) + specifier: 1.3.0 + version: 1.3.0(zod@4.4.3) '@anthropic-ai/sdk': specifier: 0.112.3 version: 0.112.3(zod@4.4.3) @@ -54,8 +54,8 @@ importers: specifier: 1.7.0 version: 1.7.0 '@earendil-works/pi-tui': - specifier: 0.80.10 - version: 0.80.10 + specifier: 0.81.1 + version: 0.81.1 '@google/genai': specifier: 2.12.0 version: 2.12.0(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@4.4.3))(supports-color@7.2.0) @@ -117,8 +117,8 @@ importers: specifier: 8.0.0 version: 8.0.0 execa: - specifier: 9.6.1 - version: 9.6.1 + specifier: 10.0.0 + version: 10.0.0 express: specifier: 5.2.1 version: 5.2.1(supports-color@7.2.0) @@ -204,8 +204,8 @@ importers: specifier: 0.25.1 version: 0.25.1 tslog: - specifier: 4.10.2 - version: 4.10.2 + specifier: 4.11.0 + version: 4.11.0 typebox: specifier: 1.3.6 version: 1.3.6 @@ -301,8 +301,8 @@ importers: specifier: 2.4.0 version: 2.4.0 jscpd: - specifier: 5.0.12 - version: 5.0.12 + specifier: 4.2.4 + version: 4.2.4 jsdom: specifier: 29.1.1 version: 29.1.1(@noble/hashes@2.2.0) @@ -310,8 +310,8 @@ importers: specifier: 3.3.3 version: 3.3.3 oxfmt: - specifier: 0.59.0 - version: 0.59.0 + specifier: 0.60.0 + version: 0.60.0 oxlint: specifier: 1.74.0 version: 1.74.0(oxlint-tsgolint@0.25.0) @@ -340,11 +340,11 @@ importers: specifier: 0.3.1 version: 0.3.1 vite: - specifier: 8.1.3 - version: 8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + specifier: 8.1.5 + version: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) vitest: specifier: 4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) optionalDependencies: sqlite-vec: specifier: 0.1.9 @@ -362,8 +362,8 @@ importers: specifier: 0.59.0 version: 0.59.0(@anthropic-ai/sdk@0.112.3(zod@4.4.3))(@modelcontextprotocol/sdk@1.29.0(supports-color@7.2.0)(zod@4.4.3)) '@agentclientprotocol/codex-acp': - specifier: 1.1.4 - version: 1.1.4 + specifier: 1.1.7 + version: 1.1.7 acpx: specifier: 0.12.0 version: 0.12.0 @@ -592,8 +592,8 @@ importers: extensions/codex: dependencies: '@openai/codex': - specifier: 0.144.6 - version: 0.144.6 + specifier: 0.145.0 + version: 0.145.0 semver: specifier: 7.8.5 version: 7.8.5 @@ -1576,8 +1576,8 @@ importers: specifier: workspace:* version: link:../.. vite: - specifier: 8.1.3 - version: 8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + specifier: 8.1.5 + version: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) extensions/qianfan: devDependencies: @@ -1700,20 +1700,26 @@ importers: extensions/slack: dependencies: '@slack/bolt': - specifier: 4.7.3 - version: 4.7.3(@types/express@5.0.6)(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) + specifier: 5.0.0 + version: 5.0.0(@types/express@5.0.6)(supports-color@7.2.0)(undici@7.28.0) + '@slack/socket-mode': + specifier: 3.0.0 + version: 3.0.0(undici@7.28.0) '@slack/types': - specifier: 2.21.1 - version: 2.21.1 + specifier: 3.0.0 + version: 3.0.0 '@slack/web-api': - specifier: 7.18.0 - version: 7.18.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) + specifier: 8.0.0 + version: 8.0.0 p-map: specifier: 7.0.5 version: 7.0.5 typebox: specifier: 1.3.6 version: 1.3.6 + undici: + specifier: 7.28.0 + version: 7.28.0 ws: specifier: 8.21.1 version: 8.21.1 @@ -2345,10 +2351,10 @@ importers: version: 14.1.2 '@vitest/browser': specifier: 4.1.10 - version: 4.1.10(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) + version: 4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) '@vitest/browser-playwright': specifier: 4.1.10 - version: 4.1.10(playwright@1.61.1)(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) + version: 4.1.10(playwright@1.61.1)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) jsdom: specifier: 29.1.1 version: 29.1.1(@noble/hashes@2.2.0) @@ -2359,11 +2365,11 @@ importers: specifier: 1.61.1 version: 1.61.1 vite: - specifier: 8.1.3 - version: 8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + specifier: 8.1.5 + version: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) vitest: specifier: 4.1.10 - version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + version: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) packages: @@ -2383,8 +2389,8 @@ packages: engines: {node: '>=22'} hasBin: true - '@agentclientprotocol/codex-acp@1.1.4': - resolution: {integrity: sha512-DzusIpGwlQwMWuHgJhU8FWMsyQvzjenB93IEzQATkdbNulo5Rd9GKOz8+B+/C9iWWxmyXgtgmjzaL+iRFyDryQ==} + '@agentclientprotocol/codex-acp@1.1.7': + resolution: {integrity: sha512-bhFLbGtOMEw6+PAp33vNERb6dXlULOfV3mWbRdps4v7sY7PHha/C2T1dnlG0yVcvBu9W+NYPzL0CAupnVoFTiQ==} hasBin: true '@agentclientprotocol/sdk@1.2.1': @@ -2392,6 +2398,11 @@ packages: peerDependencies: zod: ^3.25.0 || ^4.0.0 + '@agentclientprotocol/sdk@1.3.0': + resolution: {integrity: sha512-i3h/efaeuMUFAO1HSfo97QZQnnvMd7wWBYtBsdL6UMZg3a78sk3Ffya5Xu7C7tYsXomXoDXJBAzQF2PcFKAhIQ==} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.207': resolution: {integrity: sha512-08xSo1FDx8h0aLhL5tvcRxa2SMmcUV3aDWeZiEJVTclyiDAs61BgTjAxCg+SZcu1CndjJO8cfO0yM5dhamxz3g==} cpu: [arm64] @@ -2813,6 +2824,10 @@ packages: '@codemirror/view@6.43.6': resolution: {integrity: sha512-EVunGSYN1wz1p75WY1s3Xg7t3i8Yol0kGZGizNdX9BUFgMFILYVe8/u6EVpo7Ff5PwbZuILb4QAq7IZoKzIEQA==} + '@colors/colors@1.5.0': + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + '@copilotkit/aimock@1.37.2': resolution: {integrity: sha512-Xh76DRqSi6AGmYXYU/LOk0m+uMvxNBEeYOUwydiL94HOcAMralFdWbtx0fZ/4GzUWavZ+7PkHempJWJ33UgjXw==} engines: {node: '>=20.15.0'} @@ -2918,8 +2933,8 @@ packages: resolution: {integrity: sha512-3yJ255e4ag3wfZu/DSxeOZK1UtnqNxnspmLaQetGT0pDkThNZoHs+Zg6dgZZ19JEVomXygvfHn9lNpICZuYtEA==} engines: {node: '>=22.12.0'} - '@earendil-works/pi-tui@0.80.10': - resolution: {integrity: sha512-c2JO29PbhKPEQ6fgHQKAl0WhwuFqzWfzspMmP+8B5tpDuP+0mvarRbKKg8gq4b+pQx/QX+6aVS4ko7deoyjQjg==} + '@earendil-works/pi-tui@0.81.1': + resolution: {integrity: sha512-OMEe+Zt8oQYi/rCq3upxsTlIScWL0FPhXwQus34TbQb3EmTx88S7Uzx32JxvQiEeWOw8eDCdJf2PBUBE9r6wIg==} engines: {node: '>=22.19.0'} '@emnapi/core@1.11.1': @@ -3251,6 +3266,21 @@ packages: '@js-sdsl/ordered-map@4.4.2': resolution: {integrity: sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw==} + '@jscpd/badge-reporter@4.2.4': + resolution: {integrity: sha512-g5vu05u0lX9rcHA0k3CptLfpOiuMzxh5+mUe2iYRAznTwH3ks6JAVAf9aPi5mBFttMCRiJh2zSt3xnSadHtMGg==} + + '@jscpd/core@4.2.4': + resolution: {integrity: sha512-9V9YzmmhYg9682kFqi+n0KGOhXNSoqxHbuIP3i/l/oSd6upBOnnSeBWDZMGOenQRQnyKEtCIbnS9YFz+3B+siQ==} + + '@jscpd/finder@4.2.4': + resolution: {integrity: sha512-4LLEuAAmAraud/TAAlB5BByVdWfy7SYiPKacj5yEggpkNs0qsw2kiZ5EyU3LonB+/vntJJEDDpJMmvOeS58e0A==} + + '@jscpd/html-reporter@4.2.4': + resolution: {integrity: sha512-6UljCTVGf7O+o6D6fs1zNBG+vR1PTn47W2mSgb5hzSrvNw60rLrVoAMZMnr/TeIEdd/OEgAu+icbdvvVBfnvJw==} + + '@jscpd/tokenizer@4.2.4': + resolution: {integrity: sha512-nM4kGyDvpcevt8t0zOsMQ82ShSc65c3LIQUHClTYwraiOGOmWgUQyen+JIiFCNF8eDCGR2Qa5iI5XBfGWYQzIg==} + '@keyv/bigmap@1.3.1': resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==} engines: {node: '>= 18'} @@ -3744,43 +3774,43 @@ packages: resolution: {integrity: sha512-3zcN5Q3yEmeyxXBzqB6fXPQFzYa2ROsGFSr69W0ArXIAGJqxl/aFECOVPD2kbkYPm0U/EHxFKgclK3UA9WQg5A==} engines: {node: ^22.22.2 || ^24.15.0 || >=26.0.0} - '@openai/codex@0.144.6': - resolution: {integrity: sha512-wk+2CWiBNXiJLBoN2D08N9RceWkSBnlgk5g2K1a4CXrP/C0gdlHyRUG7RFzm9y41DCK/7tvCct233JVxyFmznw==} + '@openai/codex@0.145.0': + resolution: {integrity: sha512-/PSPSFujjjmiyVFvG2yu/grOFhsWdokTH8t2KGWhXSo/M5n/dIDsnbsnO82/7bLtIoDuzQf7ATBUMWqPWQINlQ==} engines: {node: '>=16'} hasBin: true - '@openai/codex@0.144.6-darwin-arm64': - resolution: {integrity: sha512-6zgvh70MzBNSeT17HEhSOrmmGGZGAKzSC7x6JAq+edkJkdPYA9P0I1tG7aJ49GlBkBxuC+MKBH1qm6+2Cghcww==} + '@openai/codex@0.145.0-darwin-arm64': + resolution: {integrity: sha512-h6aQ0UxnaP8mIM/9/qPAH9MNkRliJo88toq1T36IxNM2L5JSU0TFamu+MZn7YkFgDsrp0RfiI+97Tm8AVVxqtA==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@openai/codex@0.144.6-darwin-x64': - resolution: {integrity: sha512-THRyPG0zSU6M8NQAge1LHEHsJDnoH4BpKsfJHB/qe3Fm+Wf6zqAmWJFlOKzBm27m0K2Hq3za4Ac2I5p5i4yp/A==} + '@openai/codex@0.145.0-darwin-x64': + resolution: {integrity: sha512-FCYzVKCa9VoLtg9gVyzKpqylonfgZrfcWZN6HsXAZPeuo8CukdMqdgTUOhDn2V6h3MbqS0z6VqQVKUllN/yKhA==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@openai/codex@0.144.6-linux-arm64': - resolution: {integrity: sha512-PGiLXMN+2IQRkf7tOLi64dMInjU1pRLbz0Rwfj/yt2Y97SZQqAjFQoi2wmswmqtqMDnfwCPTC1DRXVQkvU6T6Q==} + '@openai/codex@0.145.0-linux-arm64': + resolution: {integrity: sha512-8OLcPXaAol/FOrRoDxWhIiHIFa73KRsM41EKocjRZOwiT4TcelzJWn3dHyiuSb7teWF25rrslvSPyvhULYRRCQ==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@openai/codex@0.144.6-linux-x64': - resolution: {integrity: sha512-4E7EnzCg0OnBxCyYnwJ+qnZwWHYe0YScr5ucKWbngE9u4+0XrpWELqq2Kn9jl5GZK8MDjU7PrJwFIwusHOHjuw==} + '@openai/codex@0.145.0-linux-x64': + resolution: {integrity: sha512-u8w8LLv3DvsfrDCoswLIemZ0SoNEXyi511WsfFsSiYUazk9qMsB/NtU8N9vhAfN7mZAxLFoMex4v66JjHuZWwA==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@openai/codex@0.144.6-win32-arm64': - resolution: {integrity: sha512-SpMjXJLW43JzMP0K62mVcYfmFcpk0BK4AOgYmWSfyZHs3iRtHMd0UYw7605n/9lwkT2EqbwQLT2omZFeKJFzwA==} + '@openai/codex@0.145.0-win32-arm64': + resolution: {integrity: sha512-sub61rjEFevi1i3Zx7nAd4JM5XxoNFqMqFc5LfTo2xSI8ixHjFvEYDFDXwXOftT04n3Ht1Wh271ioUZpDiEjEg==} engines: {node: '>=16'} cpu: [arm64] os: [win32] - '@openai/codex@0.144.6-win32-x64': - resolution: {integrity: sha512-dN39VnjEthKz5io1RNWwZDtErdSn07nW3pGUgvlA6DMxgm/nuGaIAZO/sG/Hgxq/x5j9HteAENfrFgVkpZ0lFg==} + '@openai/codex@0.145.0-win32-x64': + resolution: {integrity: sha512-u0h9lk094CaXRSqE34SBW2dRaQTPa6fASXqehczWH9QdsU62mBsiAgAdp6tCG4i+YzPmmhjD8FdXNnYGNmwuMg==} engines: {node: '>=16'} cpu: [x64] os: [win32] @@ -3993,124 +4023,124 @@ packages: '@oxc-project/types@0.140.0': resolution: {integrity: sha512-h5LUOzGArYemnW1NMz/DuuQhBi96J6JL2Bk8zE4kvqxB5Sg3jxmCiH4uyOWHDkiKSt5vWlG4FIwCR/DbstcNRQ==} - '@oxfmt/binding-android-arm-eabi@0.59.0': - resolution: {integrity: sha512-bNTnfbuG7sAwb2PakMNaDukx5kXeW9duXOBeWtTOiLz3fXz3q2DlWguufPZ+c2IHEVrRXHD+M4aUgEWm841LDA==} + '@oxfmt/binding-android-arm-eabi@0.60.0': + resolution: {integrity: sha512-1q4q4Jc8FlOMVojEisyFAVyl8h1yawNv6phjgmhGVEDeyeOdsSnSr9x0+D4mOnEKvpO5L4mxKZ/DP9X6U3A/Mw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [android] - '@oxfmt/binding-android-arm64@0.59.0': - resolution: {integrity: sha512-R/Sn7z52QtdAKNqQLLY0EK7hVMjXiz3XUlvoCFCm/60jgIzAnQtiqLKBCFaBkimCQL5rs2ezPMcicpjCsrl54Q==} + '@oxfmt/binding-android-arm64@0.60.0': + resolution: {integrity: sha512-tD41I6nCt9k8SQXft0CSjjU9jg6SwG7uMu7PxodSEHXl+GDW0868oy6tTtoJkyUze8YKFgTpz/k5LuPUnFiGLw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] - '@oxfmt/binding-darwin-arm64@0.59.0': - resolution: {integrity: sha512-vm/ynUqE4HjC0ZIEjmXv1UJu1/GngccQ+T+TJudTMxUxm6r+GQTg1TO3E5jJfI71pBaXxSzs1+vWHIwuilGHhw==} + '@oxfmt/binding-darwin-arm64@0.60.0': + resolution: {integrity: sha512-TTpzPug96Zxdyb46KvTyIUQDdsqbumXh2TKG9C23PCT0kF7JkW56Z/quPuG9rqOFKQIi1gpRNZ7DX18LwxXPnw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] - '@oxfmt/binding-darwin-x64@0.59.0': - resolution: {integrity: sha512-uTtYDpLN/obfKVWGpgEc8BqYlLZBQTPz2uYEvLRy3HPZxjZ34wiFzukUBU2bf64JuCYZI//GTV1EOMmWlPjf/w==} + '@oxfmt/binding-darwin-x64@0.60.0': + resolution: {integrity: sha512-CnOoWgQ7L+JL/YQaRJ+NyATciSfcftncm7y3kqyte1cGtFEGnStaCd1TAyrinkfQ7nRBfHrTs1/vTwUJr3WF2Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] - '@oxfmt/binding-freebsd-x64@0.59.0': - resolution: {integrity: sha512-e2UnxL/ifStSPy8ffBCDbdy595SYsGy+U1pur4G65TuMmWxAMBzYGG7atZo/3mp515p8rZdsflxVD/E1FAdPLQ==} + '@oxfmt/binding-freebsd-x64@0.60.0': + resolution: {integrity: sha512-ychJo7S3hZxdO6eDZ9zM6F2lM9fpJS3EKS5CAUSWyprdLYxTu4gbaUKV/VBPTcMJwQa2Bpo+643y3OJ537pihA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] - '@oxfmt/binding-linux-arm-gnueabihf@0.59.0': - resolution: {integrity: sha512-LtdeZ1l0urxte3VNi3g8cocZwv1xGM1NKHSgF/fJEEVhyQmlgGh7WFWKFd/pNuO7djfvPNtNO1+MS+FEWkgVSA==} + '@oxfmt/binding-linux-arm-gnueabihf@0.60.0': + resolution: {integrity: sha512-36IH5o55T2Fx7E0feDttt+mifxN6yk9pWv4KfhAIsP0dFnUq27331OwbpOsZdoXF9soOLWm7mQUz5+UUmyec4g==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm-musleabihf@0.59.0': - resolution: {integrity: sha512-dBTciSsj9GTMl7p+h2gMSI0hoPn2ijfc/dUsbnWsP0RbwgPl2r0C/5zkMb3Pb+gGj17LH7f1o4qLo9aes/pAvA==} + '@oxfmt/binding-linux-arm-musleabihf@0.60.0': + resolution: {integrity: sha512-G1Ve7lAa6sFBolVI2LWHfEAqy0YKh4vnioH8uYO9kAEdgM7mR40IksIx9/Zk4+vbYew/sGa4J9Q4tZ3n9gXDHA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] - '@oxfmt/binding-linux-arm64-gnu@0.59.0': - resolution: {integrity: sha512-tXVdJ/JINsNWdponPHN0OuKHtC+HdpyoS9sd6IDPNiiEYsRki8b7tefRZ1iMnRkdbyT4SEbguWsr6o+5awvbPQ==} + '@oxfmt/binding-linux-arm64-gnu@0.60.0': + resolution: {integrity: sha512-LTQdRBf6uzj/h7Xk6lKzbGD2hrF/fK4YI9LIN1c0509tPUn8wRa3mCmrFQpEWJPLYGFrLFFMTYW1Ljj6VqW2Hw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-arm64-musl@0.59.0': - resolution: {integrity: sha512-RRTq38i2zT5fnw6XGHjvT6w2mh6x/G3m6AZcAZ56OTDTT/lsOeYnG3SVjwmH40z5kPqF+lf+o35e6m6PpKy9Dw==} + '@oxfmt/binding-linux-arm64-musl@0.60.0': + resolution: {integrity: sha512-2JMo3XPxMPx3hiqddSZYyaH+fKJm6cz0u8n1naYjP/CdOQOZW34i8lKBUfmbWiuFvd6KoYXLmhAyBuvojsYS7Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-ppc64-gnu@0.59.0': - resolution: {integrity: sha512-lD3k7glAJSaXW0D6xzu8VOZbYbosvy+0ktOVkfLEoQF5HJlMSxTQ2KNW0JO+08ccP/1ElOKktVEMI0fqRbVB4w==} + '@oxfmt/binding-linux-ppc64-gnu@0.60.0': + resolution: {integrity: sha512-L3C+nBD13lr306tr/PjM3RMll+BVqgFrIgUyoeHuai5oueJrRLgO3j+GO5/Cbhtkf5PSlHYTI1JY7iqBd1qa6A==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ppc64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-gnu@0.59.0': - resolution: {integrity: sha512-WH5ZP1RbuHKBO/yfPRQKpNO/ijHcEDNbnmC4VPf/Bcd3+mbMAZpRiJWRa1PL5bREdIZZHo343mk3sqlc9x7Usw==} + '@oxfmt/binding-linux-riscv64-gnu@0.60.0': + resolution: {integrity: sha512-M4MsmvqlxFiPtSRGyBYQSZxchEf463AOyd+Dh4/9xDpjWBsRtDUTDMFN5EdHinjVK1/eDJQ8MLpcYjpYayaCnA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-riscv64-musl@0.59.0': - resolution: {integrity: sha512-743wOiaI9RZY4QVGkWkfGRavD5ZJUJ6gscFjVrVu1dP8AZh9jM+a6v3NhlR+OIzHdS6DhLM96w+gcVskskz7rw==} + '@oxfmt/binding-linux-riscv64-musl@0.60.0': + resolution: {integrity: sha512-OH+9UskYuxRB+GxqdGkVN8f5UpwhqG8YscNo1wl8+KJ62cd7wZdGga6iGLJIf8kibF1WBwvlfDUx3cez/VXwFg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [riscv64] os: [linux] libc: [musl] - '@oxfmt/binding-linux-s390x-gnu@0.59.0': - resolution: {integrity: sha512-xjRXQsRnrRZCcCkIEnbd2lmsQNobtwwkJxdy2bWXhZ1lIN0ouZwsBXRsoovW3yATuziAYwr9HMiQuR/Cc75NIw==} + '@oxfmt/binding-linux-s390x-gnu@0.60.0': + resolution: {integrity: sha512-y7AAFutt9wFWBFOAn6+BHaV39usZmcr3YYH2385f+NHgPNpIF9HpqKp0jgUxPaUOCyG3oaX5VhJduL1Nw164rw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [s390x] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-gnu@0.59.0': - resolution: {integrity: sha512-4hNjqq/Rbr9B+StY9zMMAfm72+mtM4v80xYL5Qkb59Qd72g2vJMI0iFlPj3kf6miMsie/yJ7rt4urJT292HBgA==} + '@oxfmt/binding-linux-x64-gnu@0.60.0': + resolution: {integrity: sha512-yKZ9+CXAI+1RO5nH/4Z/9M6DAsfOzd5bw/gtWk81KB4mpalMaRRSXfouc5/tHxazDmBek55HNPepNYBgaCew0Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [glibc] - '@oxfmt/binding-linux-x64-musl@0.59.0': - resolution: {integrity: sha512-NH579iN8EVQYsWowUB8B5vFchcylJtwPVJ7NmUAqEQHNLfhPbDT3K56KrECNAkUN4QpF4qiMgN2vsfZwVvjm7g==} + '@oxfmt/binding-linux-x64-musl@0.60.0': + resolution: {integrity: sha512-bCUGaF6hJOYnQzLJdHLZbvGsOd5oSvGAyJhPAKum2uyLYUuXmP8vqg690DWi2hqcnIoYpqSqCrjzE5aiUAgwQg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] libc: [musl] - '@oxfmt/binding-openharmony-arm64@0.59.0': - resolution: {integrity: sha512-mzZy3Z5Aj1D75Aq9FVlmoRQH5ei8Ga4o/NZmlXkKyeZ5EmPrUXRR7c6BMBteV1ZuZ/356UYDuLRLjAMxTDTiBA==} + '@oxfmt/binding-openharmony-arm64@0.60.0': + resolution: {integrity: sha512-GrUeZOvzP30ExxfCuQiyofuUGI+OmvAgFwOO5w5p9mGPlxcyuqI+6Sy9fAKFFfLQrqKYWFgc5sYA2Unj/29nPg==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] - '@oxfmt/binding-win32-arm64-msvc@0.59.0': - resolution: {integrity: sha512-0CpDJ1gE3jN1Gk6xms1Ie6LPfPcOtY4FAtoOmVLHQoAf8DvO2wd0DW2dIX2f7YTp5dxrr0ND8JeUEjm3DP3k5g==} + '@oxfmt/binding-win32-arm64-msvc@0.60.0': + resolution: {integrity: sha512-WD4Q954kUl2TDJV/6q7UnE2rlKk047kXLJsr4bJ2mXRaAqNXcmV3nwKUsGCc3mz/jYDBnXtJEaBErJEybK8iQQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] - '@oxfmt/binding-win32-ia32-msvc@0.59.0': - resolution: {integrity: sha512-zwdKBu3pt87uW0bRcywZb0oGMS7C6n87qogwRYFUgmk44T90ZzYlPjtlFYXs/DnBFrgNCvlHwCuWKfVWLeE7kw==} + '@oxfmt/binding-win32-ia32-msvc@0.60.0': + resolution: {integrity: sha512-HqDekjr8JXzVDUP1YthDZ1Y3CBEcuZT4WX3B+1kaxj8CvZA8Y2YhcEsXqoSop3tVsgjACxjnFQFDkBo0r/jq1Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [ia32] os: [win32] - '@oxfmt/binding-win32-x64-msvc@0.59.0': - resolution: {integrity: sha512-dUUbZkKgWrmAeI/puzv4bxN8lzcYaFnQVwFTFtwO2Gp8M7lZGSE2qJjC58g518+1bltJ8mizjYwD0BGHym0l/w==} + '@oxfmt/binding-win32-x64-msvc@0.60.0': + resolution: {integrity: sha512-tz78yhmGPKboTMHCHSaUqXK8JrmoSejgDcWeqAtg2s07ZGKQ3rH5Jn8NuXPGNG33CDbY2e9NoQWXIVEmKO21Rw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -4678,31 +4708,33 @@ packages: resolution: {integrity: sha512-tlqY9xq5ukxTUZBmoOp+m61cqwQD5pHJtFY3Mn8CA8ps6yghLH/Hw8UPdqg4OLmFW3IFlcXnQNmo/dh8HzXYIQ==} engines: {node: '>=18'} - '@slack/bolt@4.7.3': - resolution: {integrity: sha512-bODs8q/yNDWUPoxmQhFrRqLMA5vhB/PDizYWqb6CkQhLWEUo5JFtfJcmeU4ElGl6qSt++OKjSYNa4MPc77CleQ==} - engines: {node: '>=18', npm: '>=8.6.0'} + '@slack/bolt@5.0.0': + resolution: {integrity: sha512-L0FTzidrDKTu4Ph8sdv0bB3acafBTAC02TBcD+hojPTTNSMX3hSK+rkpkUKkqbbc0vGpSjd6A/g71Rjy7EbBhw==} + engines: {node: '>=20', npm: '>=9.6.4'} peerDependencies: '@types/express': ^5.0.0 - '@slack/logger@4.0.1': - resolution: {integrity: sha512-6cmdPrV/RYfd2U0mDGiMK8S7OJqpCTm7enMLRR3edccsPX8j7zXTLnaEF4fhxxJJTAIOil6+qZrnUPTuaLvwrQ==} - engines: {node: '>= 18', npm: '>= 8.6.0'} + '@slack/logger@5.0.0': + resolution: {integrity: sha512-VGXhmmgsAo9shdQYh4tFDndd+7nsgp0Y5h0UPDaUp8K359pBasI6YdkMqFW3mCOxLQkq09qj7o7cq6f3DuXcJQ==} + engines: {node: '>= 20', npm: '>=9.6.4'} - '@slack/oauth@3.0.5': - resolution: {integrity: sha512-exqFQySKhNDptWYSWhvRUJ4/+ndu2gayIy7vg/JfmJq3wGtGdHk531P96fAZyBm5c1Le3yaPYqv92rL4COlU3A==} - engines: {node: '>=18', npm: '>=8.6.0'} + '@slack/oauth@4.0.0': + resolution: {integrity: sha512-Aqs5bGghT+VtNcdwVOQy7CcyCfDNd9YYnZsCRukIF9p1Mxuq4uL+BjqlWQB0SeS4wzrLzePPgvj8JDuQil+ezA==} + engines: {node: '>=20', npm: '>=9.6.4'} - '@slack/socket-mode@2.0.7': - resolution: {integrity: sha512-qYy07je71WnEHgRwmw12DlAnZLi5HXmdlI2WUzUK2LH/rYXQpP6uEg462S5CwfE8FoCKUdIigHtYnOOfzZH1lQ==} - engines: {node: '>= 18', npm: '>= 8.6.0'} + '@slack/socket-mode@3.0.0': + resolution: {integrity: sha512-QShO60SB0E+HH+TbcKj3CBEQbodToRyiXnxuSB4t1kvUlqEmuGA1nOOjrRDkDJbOECAZ13PLe4ek9SrntpfoYg==} + engines: {node: '>=20', npm: '>=9.6.4'} + peerDependencies: + undici: ^7.0.0 - '@slack/types@2.21.1': - resolution: {integrity: sha512-I8vmSjNYWsaxuWPx6dz4yeh0h7vRBWbgAMK14LEmblbZ404BtrPbXs6jDPx4cYgGf8msDGF4A9opLZBu21FViQ==} - engines: {node: '>= 12.13.0', npm: '>= 6.12.0'} + '@slack/types@3.0.0': + resolution: {integrity: sha512-KNOqpnNAlsFt5Jk9XBclslQ0lobRIg/0tnhpmvZJAglHJx9E8oceN8hC3gaBzkR6UzQ9Wzq4rLsJ98wUcxWPfw==} + engines: {node: '>= 20', npm: '>=9.6.4'} - '@slack/web-api@7.18.0': - resolution: {integrity: sha512-EWBsKUhOFFp87beQg/ToSC+asWB7BrGHuh7uPC1ZI9vr41GjS+3WmmyWIMqs+mF6U+mh4d6HhtFlv67TrJFsvw==} - engines: {node: '>= 18', npm: '>= 8.6.0'} + '@slack/web-api@8.0.0': + resolution: {integrity: sha512-ORx3XQryQPq2Jnxv5giSKXVoQRUeylrrymIR2S9fPzLjPcCts8RayMeBSZMcpfpAqp6fnBRuPW2UB6dUPUTEZA==} + engines: {node: '>= 20', npm: '>=9.6.4'} '@smithy/config-resolver@4.6.11': resolution: {integrity: sha512-lN8RHfZz2X0iOTzgd0an6pui5fpiJJWfRoszJ0DRpfmzB+OljnkvPCvybPxizzDeNsIOugiMb68QBIzTu7swxQ==} @@ -5041,6 +5073,9 @@ packages: '@types/retry@0.12.5': resolution: {integrity: sha512-3xSjTp3v03X/lSQLkczaN9UIEwJMoMCA1+Nb5HfbJEQWogdeQIyVtTvxPXDQjZ5zws8rFQfVfRdz03ARihPJgw==} + '@types/sarif@2.1.7': + resolution: {integrity: sha512-kRz0VEkJqWLf1LLVN4pT1cg1Z9wAuvI6L97V3m2f5B76Tg8d413ddvLBPTEHAZJlnn4XSvu0FkZtViCQGVyrXQ==} + '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} @@ -5200,6 +5235,11 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + acorn@8.17.0: resolution: {integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==} engines: {node: '>=0.4.0'} @@ -5275,9 +5315,15 @@ packages: resolution: {integrity: sha512-SGDvmg6QTYiTxCBkYVmThcoa67uLl35pyzRHdpCGBOcqFy6BtwnphoFPk7LhJshD+Yk1Kt35WGWeZPTgwR4Fhw==} engines: {node: '>=12.17'} + asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + asn1.js@5.4.1: resolution: {integrity: sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==} + assert-never@1.4.0: + resolution: {integrity: sha512-5oJg84os6NMQNl27T9LnZkvvqzvAnHu03ShCnoj6bsJwS7L8AO4lf+C/XjK/nvzEqQB744moC6V128RucQd1jA==} + assertion-error@2.0.1: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} @@ -5328,6 +5374,13 @@ packages: react-native-b4a: optional: true + babel-walk@3.0.0-canary-5: + resolution: {integrity: sha512-GAwkz0AihzY5bkwIY5QDR+LvsRQgB/B+1foMPvi0FZPMl5fjD7ICiznUiBdLYMH1QYe6vqu4gWYytZOccLouFw==} + engines: {node: '>= 10.0.0'} + + badgen@3.3.2: + resolution: {integrity: sha512-fbQwK9norfdzbdsoPwbLIAmgBXDGEme3jeIyqPAH7o6vp9lmuLHS7uXULvOiQ6XnMLkYNG4gDjILf74hgtTAug==} + bail@2.0.2: resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} @@ -5409,6 +5462,10 @@ packages: birpc@4.0.0: resolution: {integrity: sha512-LShSxJP0KTmd101b6DRyGBj57LZxSDYWKitQNW/mi8GRMvZb078Uf9+pveax1DrVL89vm7mWe+TovdI/UDOuPw==} + blamer@1.0.7: + resolution: {integrity: sha512-GbBStl/EVlSWkiJQBZps3H1iARBrC7vt++Jb/TTmCNu/jZ04VW7tSN1nScbFXBUy1AN+jzeL7Zep9sbQxLhXKA==} + engines: {node: '>=8.9'} + bn.js@4.12.5: resolution: {integrity: sha512-3aRg6/JxfffFD+OlOjOFR3Vo79l39ooBTFucxx+MT3dhCtzn3EmiUPQo+6/OZuI2jbXi3YKgmiTFBgChQMwIRQ==} @@ -5502,6 +5559,9 @@ packages: character-entities@2.0.2: resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + character-parser@2.2.0: + resolution: {integrity: sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==} + character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} @@ -5540,6 +5600,10 @@ packages: resolution: {integrity: sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw==} engines: {node: '>=18.20'} + cli-table3@0.6.5: + resolution: {integrity: sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==} + engines: {node: 10.* || >= 12.*} + cliui@6.0.0: resolution: {integrity: sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==} @@ -5565,6 +5629,10 @@ packages: color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + colors@1.4.0: + resolution: {integrity: sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==} + engines: {node: '>=0.1.90'} + combined-stream@1.0.8: resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} engines: {node: '>= 0.8'} @@ -5588,11 +5656,18 @@ packages: resolution: {integrity: sha512-z67u4ZhzCL/Tydu1lJARtEZYWbWaN7oYLHbsuzocr6y4N6WZAagG3RQ4FW61V1/0+jImpj293XfrcYnd1qxtPg==} engines: {node: '>=22.12.0'} + commander@5.1.0: + resolution: {integrity: sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==} + engines: {node: '>= 6'} + composed-offset-position@0.0.6: resolution: {integrity: sha512-Q7dLompI6lUwd7LWyIcP66r4WcS9u7AL2h8HaeipiRfCRPLMWqRx8fYsjb4OHi6UQFifO7XtNC2IlEJ1ozIFxw==} peerDependencies: '@floating-ui/utils': ^0.2.5 + constantinople@4.0.1: + resolution: {integrity: sha512-vCrqcSIq4//Gx74TXXCGnHpulY1dskqLTFGDmhrGxzeXL8lF8kvXv6mpNWlJj1uD4DW23D4ljAqbY4RRaaUZIw==} + content-disposition@1.1.0: resolution: {integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==} engines: {node: '>=18'} @@ -5739,6 +5814,9 @@ packages: discord-api-types@0.38.50: resolution: {integrity: sha512-J2n/bpIETX3DQ6AJ7/0xbsTLmYiJQtO/LKcXKC1YDbB56OUwtDbdXOFE8Q4g8jVGHBR2VAy1+D4ngaIgkMNV9w==} + doctypes@1.1.0: + resolution: {integrity: sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==} + dom-serializer@2.0.0: resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} @@ -5808,6 +5886,9 @@ packages: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + end-of-stream@1.4.5: + resolution: {integrity: sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg==} + enhanced-resolve@5.24.3: resolution: {integrity: sha512-PwKooW9JUzh5chmYfHM3IQl5OkK2u2Nm011MgeZrss3JmFraUx/fqrf78kk8GUMYoibx/14MdwTl/1WKkG7TpQ==} engines: {node: '>=10.13.0'} @@ -5919,9 +6000,13 @@ packages: resolution: {integrity: sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==} engines: {node: '>=18.0.0'} - execa@9.6.1: - resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==} - engines: {node: ^18.19.0 || >=20.5.0} + execa@10.0.0: + resolution: {integrity: sha512-Cxl6MKxB1dr1H0FHmiizJ+lavKF7pV+fcDZFyqMB8d5m7qUPm/OtZYcD5vPWePKxSnTQ57KuBd9mtdZ3oNCvyQ==} + engines: {node: '>=22'} + + execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} expect-type@1.4.0: resolution: {integrity: sha512-KfYbmpRm0VbLjEvVa9yGwCi9GI34xvi7A/HXYWQO65CSD2u3MczUJSuwXKFIxlGsgBQizV9q5J9NHj4VG0n+pA==} @@ -6090,6 +6175,10 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} + get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + get-stream@9.0.1: resolution: {integrity: sha512-kVCxPF3vQM/N0B1PmoqVUqgHP+EeVjmZSQn+1oCRPxd2P21P2F19lIgbR3HBosbB1PUhOAoctJnfEn2GbN2eZA==} engines: {node: '>=18'} @@ -6232,6 +6321,10 @@ packages: resolution: {integrity: sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA==} engines: {node: '>= 20'} + human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + human-signals@8.0.1: resolution: {integrity: sha512-eKCa6bwnJhvxj14kZk5NCPc6Hb6BdsU9DZcOnmQKSnO1VKrfV0zCvtttPZUsBvjmNDn8rpcJfpwSYnHBjc95MQ==} engines: {node: '>=18.18.0'} @@ -6293,6 +6386,10 @@ packages: is-alphanumerical@2.0.1: resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + is-core-module@2.16.2: + resolution: {integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==} + engines: {node: '>= 0.4'} + is-decimal@2.0.1: resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} @@ -6301,8 +6398,8 @@ packages: engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} hasBin: true - is-electron@2.2.2: - resolution: {integrity: sha512-FO/Rhvz5tuw4MCWkpMzHFKWD2LsfHzIb7i6MdPYZ/KW7AlxawyLkqdy+jPZP1WubqEADE3O4FUENlJHDfQASRg==} + is-expression@4.0.0: + resolution: {integrity: sha512-zMIXX63sxzG3XrkHkrAPvm/OVZVSCPNkwMHU8oTX7/U3AL78I0QXCEICXUM13BIa8TYGZ68PiTKfQz3yaTNr4A==} is-extglob@2.1.1: resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} @@ -6351,9 +6448,16 @@ packages: is-potential-custom-element-name@1.0.1: resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + is-promise@2.2.2: + resolution: {integrity: sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==} + is-promise@4.0.0: resolution: {integrity: sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==} + is-regex@1.2.1: + resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==} + engines: {node: '>= 0.4'} + is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -6402,45 +6506,17 @@ packages: jose@6.2.3: resolution: {integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==} + js-stringify@1.0.2: + resolution: {integrity: sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==} + js-tokens@10.0.0: resolution: {integrity: sha512-lM/UBzQmfJRo9ABXbPWemivdCW8V2G8FHaHdypQaIy523snUjog0W71ayWXTjiR+ixeMyVHN2XcpnTd/liPg/Q==} - jscpd-darwin-arm64@5.0.12: - resolution: {integrity: sha512-CQCDYhQY9yOGGeauzkRGYW/QtXurPCjfDkEhUoM/M5UdmpzxfG3i9mnNsaheJ0RdFRf73mL7JaLVRP8U2l5/kA==} - cpu: [arm64] - os: [darwin] + jscpd-sarif-reporter@4.2.4: + resolution: {integrity: sha512-JtX79kFSyAhqJh5TdLUcvtYJtJd1F8UW8b4Miaga+EIgUn2/nR0N2zWL9mH5cRXgbzLuQbbsw9kReUVIECApwQ==} - jscpd-darwin-x64@5.0.12: - resolution: {integrity: sha512-7XNCDfChP9fPkIWLepd0zGnTov7/5mR7rJ5Utc1MdWFdgkN//qz6FAJ1FhQA0E/qjFedy9XTucfUCgLybSBsjw==} - cpu: [x64] - os: [darwin] - - jscpd-linux-arm64-gnu@5.0.12: - resolution: {integrity: sha512-i/usHD0/8twzb2Qo4vFWcnuAD4IDLS6K/mTXwYy1CiJZDw4gmjfH45jtjdKUyoutTAiNs+ZWZgx1gIRljUbFuA==} - cpu: [arm64] - os: [linux] - libc: [glibc] - - jscpd-linux-x64-gnu@5.0.12: - resolution: {integrity: sha512-TqaeSTaGawcqyXSrQvYJFtLRn4aQeHgphGGsq2ZtVAg+lPeuMmh81c3bl0yi2dL3gDX1RGBQKBVul1XQknOuoA==} - cpu: [x64] - os: [linux] - libc: [glibc] - - jscpd-linux-x64-musl@5.0.12: - resolution: {integrity: sha512-WelugY1/rdoo0Y0sqJ2XQOIvyIZTfRe+vP3MJe4XvEUwPF0v+9SQoS34FnfblRhsddVixyNkgl7x/sHid9UMJw==} - cpu: [x64] - os: [linux] - libc: [musl] - - jscpd-windows-x64-msvc@5.0.12: - resolution: {integrity: sha512-01x1klKjvfzI6Of5tI9u72x7TIQZQLLG6kMdsEPJKl/BXbskdknrfCepeTXRBbdFPKs25jfcd0klZ4OdDvww5w==} - cpu: [x64] - os: [win32] - - jscpd@5.0.12: - resolution: {integrity: sha512-87dC+akj2mCywlt8p3xnRlDg0B55u4GDbfE9cuwOOeIxbEuWuIoNqGoYi65A0516aJ4EzAjGwBj1Qb/Ahc8WAQ==} - engines: {node: '>=18'} + jscpd@4.2.4: + resolution: {integrity: sha512-PSo2U0G8OxULayGyQMv7T/0ZQ+c3PPltdMOz/57v9Xnmq5xSIhh4cnZ0oYZPKqejy10aFwAbMVxqAlo24+PQ3g==} hasBin: true jsdom@29.1.1: @@ -6489,6 +6565,9 @@ packages: resolution: {integrity: sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==} engines: {node: '>=12', npm: '>=6'} + jstransformer@1.0.0: + resolution: {integrity: sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==} + jszip@3.10.1: resolution: {integrity: sha512-xXDvecyTpGLrqFrvkrUSoxxfJI5AH7U8zxxtVclpsUtMCq4JQ290LY8AW5c7Ggnr/Y/oK+bQMbqK2qmtk3pN4g==} @@ -6757,6 +6836,9 @@ packages: resolution: {integrity: sha512-RCEsPjR+sr0x+AuYp601tKTkgFG4YEPLCzHST3cQ/fhlJkqAkz1L2/Qbp1j9qw5SBwQHFBoW8+hoN5xssOF0Tw==} hasBin: true + markdown-table@2.0.0: + resolution: {integrity: sha512-Ezda85ToJUBhM6WGaG6veasyym+Tbs3cMAw/ZhOPqXiYsr0jgocBV3j3nx+4lk47plLlIqjwuTm/ywVI+zjJ/A==} + markdown-table@3.0.4: resolution: {integrity: sha512-wiYz4+JrLyb/DqW2hkFJxP7Vd7JuTDm77fvbM8VfEQdmSMqcImWeeRbHwZjBjIFki/VaMK2BhFi7oUUZeM5bqw==} @@ -6837,6 +6919,9 @@ packages: resolution: {integrity: sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==} engines: {node: '>=18'} + merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -6948,6 +7033,10 @@ packages: resolution: {integrity: sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==} engines: {node: '>=18'} + mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + mimic-function@5.0.1: resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} engines: {node: '>=18'} @@ -7074,6 +7163,10 @@ packages: node-pty@1.2.0-beta.14: resolution: {integrity: sha512-XORU9BQgpxVgqr7WivjJ17mLenOHUgKKWzuZZNaw3NDYgHc/wPJQMSaoLDrpEgqV6aU1nNwil1o/OqYj6lWmUA==} + node-sarif-builder@3.4.0: + resolution: {integrity: sha512-tGnJW6OKRii9u/b2WiUViTJS+h7Apxx17qsMUjsUeNDiMMX5ZFf8F8Fcz7PAQ6omvOxHZtvDTmOYKJQwmfpjeg==} + engines: {node: '>=20'} + node-wav@0.0.2: resolution: {integrity: sha512-M6Rm/bbG6De/gKGxOpeOobx/dnGuP0dz40adqx38boqHhlWssBJZgLCPBNtb9NkrmnKYiV04xELq+R6PFOnoLA==} engines: {node: '>=4.4.0'} @@ -7089,6 +7182,10 @@ packages: nostr-wasm@0.1.0: resolution: {integrity: sha512-78BTryCLcLYv96ONU8Ws3Q1JzjlAt+43pWQhIl86xZmWeegYCNLPml7yQ+gG3vR6V5h4XGj+TxO+SS5dsThQIA==} + npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + npm-run-path@6.0.0: resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==} engines: {node: '>=18'} @@ -7127,6 +7224,10 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + onetime@7.0.0: resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} engines: {node: '>=18'} @@ -7172,8 +7273,8 @@ packages: resolution: {integrity: sha512-6VlU9MLXbjVQD04AZCMX28hVtA5bUoadvUqO76MUCVA0ilwJbMiHsITRPfyVm6p/BC0Av/BXMujx39WCe1LEqw==} engines: {node: '>=20'} - oxfmt@0.59.0: - resolution: {integrity: sha512-Xqk6cPZS1yMvVa7OAuenaDZUsgMDutvvbZ9/L5gSvAfW64+WN4HVhgipLj5rVERbYQt8fLs9TopyZ1rU1XEG/w==} + oxfmt@0.60.0: + resolution: {integrity: sha512-fViX6i+gJuZWY+jI/fnR6WRbRj70GZ9RlCd30MygJrHTUNc4DxvKHWw8vBjMjffv3PgU5qWDR0AzmojQByqaZA==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -7292,6 +7393,9 @@ packages: resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} engines: {node: '>=12'} + path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@2.0.2: resolution: {integrity: sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==} engines: {node: 18 || 20 || >=22} @@ -7392,6 +7496,9 @@ packages: process-warning@5.0.0: resolution: {integrity: sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==} + promise@7.3.1: + resolution: {integrity: sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==} + proper-lockfile@4.1.2: resolution: {integrity: sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA==} @@ -7422,6 +7529,45 @@ packages: psl@1.15.0: resolution: {integrity: sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==} + pug-attrs@3.0.0: + resolution: {integrity: sha512-azINV9dUtzPMFQktvTXciNAfAuVh/L/JCl0vtPCwvOA21uZrC08K/UnmrL+SXGEVc1FwzjW62+xw5S/uaLj6cA==} + + pug-code-gen@3.0.4: + resolution: {integrity: sha512-6okWYIKdasTyXICyEtvobmTZAVX57JkzgzIi4iRJlin8kmhG+Xry2dsus+Mun/nGCn6F2U49haHI5mkELXB14g==} + + pug-error@2.1.0: + resolution: {integrity: sha512-lv7sU9e5Jk8IeUheHata6/UThZ7RK2jnaaNztxfPYUY+VxZyk/ePVaNZ/vwmH8WqGvDz3LrNYt/+gA55NDg6Pg==} + + pug-filters@4.0.0: + resolution: {integrity: sha512-yeNFtq5Yxmfz0f9z2rMXGw/8/4i1cCFecw/Q7+D0V2DdtII5UvqE12VaZ2AY7ri6o5RNXiweGH79OCq+2RQU4A==} + + pug-lexer@5.0.1: + resolution: {integrity: sha512-0I6C62+keXlZPZkOJeVam9aBLVP2EnbeDw3An+k0/QlqdwH6rv8284nko14Na7c0TtqtogfWXcRoFE4O4Ff20w==} + + pug-linker@4.0.0: + resolution: {integrity: sha512-gjD1yzp0yxbQqnzBAdlhbgoJL5qIFJw78juN1NpTLt/mfPJ5VgC4BvkoD3G23qKzJtIIXBbcCt6FioLSFLOHdw==} + + pug-load@3.0.0: + resolution: {integrity: sha512-OCjTEnhLWZBvS4zni/WUMjH2YSUosnsmjGBB1An7CsKQarYSWQ0GCVyd4eQPMFJqZ8w9xgs01QdiZXKVjk92EQ==} + + pug-parser@6.0.0: + resolution: {integrity: sha512-ukiYM/9cH6Cml+AOl5kETtM9NR3WulyVP2y4HOU45DyMim1IeP/OOiyEWRr6qk5I5klpsBnbuHpwKmTx6WURnw==} + + pug-runtime@3.0.1: + resolution: {integrity: sha512-L50zbvrQ35TkpHwv0G6aLSuueDRwc/97XdY8kL3tOT0FmhgG7UypU3VztfV/LATAvmUfYi4wNxSajhSAeNN+Kg==} + + pug-strip-comments@2.0.0: + resolution: {integrity: sha512-zo8DsDpH7eTkPHCXFeAk1xZXJbyoTfdPlNR0bK7rpOMuhBYb0f5qUVCO1xlsitYd3w5FQTK7zpNVKb3rZoUrrQ==} + + pug-walk@2.0.0: + resolution: {integrity: sha512-yYELe9Q5q9IQhuvqsZNwA5hfPkMJ8u92bQLIMcsMxf/VADjNtEYptU+inlufAFYcWdHlwNfZOEnOOQrZrcyJCQ==} + + pug@3.0.4: + resolution: {integrity: sha512-kFfq5mMzrS7+wrl5pLJzZEzemx34OQ0w4SARfhy/3yxTlhbstsudDwJzhf1hP02yHzbjoVMSXUj/Sz6RNfMyXg==} + + pump@3.0.4: + resolution: {integrity: sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==} + punycode.js@2.3.1: resolution: {integrity: sha512-uxFIHU0YlHYhDQtV4R9J6a52SLx28BCjT+4ieh7IGbgwVJWO+km431c4yRlREUAsAmt/uMjQUyQHNEPf0M39CA==} engines: {node: '>=6'} @@ -7546,6 +7692,10 @@ packages: remend@1.3.0: resolution: {integrity: sha512-iIhggPkhW3hFImKtB10w0dz4EZbs28mV/dmbcYVonWEJ6UGHHpP+bFZnTh6GNWJONg5m+U56JrL+8IxZRdgWjw==} + repeat-string@1.6.1: + resolution: {integrity: sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==} + engines: {node: '>=0.10'} + require-directory@2.1.1: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} @@ -7567,6 +7717,11 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} + resolve@1.22.12: + resolution: {integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==} + engines: {node: '>= 0.4'} + hasBin: true + restore-cursor@5.1.0: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} @@ -7882,6 +8037,10 @@ packages: resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==} engines: {node: '>=12'} + strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + strip-final-newline@4.0.0: resolution: {integrity: sha512-aulFJcD6YK8V1G7iRB5tigAP4TsHBZZrOV8pjV++zdUwmeV8uzbY7yn6h9MswN62adStNZFuCIx4haBnRuMDaw==} engines: {node: '>=18'} @@ -7907,6 +8066,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} @@ -7961,6 +8124,9 @@ packages: resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} engines: {node: '>=0.6'} + token-stream@1.0.0: + resolution: {integrity: sha512-VSsyNPPW74RpHwR8Fc21uubwHY7wMDeJLys2IX5zJNih+OnAnaifKHo+1LHT7DAdloQ7apeaaWg8l7qnf/TnEg==} + token-types@6.1.2: resolution: {integrity: sha512-dRXchy+C0IgK8WPC6xvCHFRIWYUbqqdEIKPaKo/AcTUNzwLTK6AH7RjdLWsEZcAN/TBdtfUw3PYEgPr5VPr6ww==} engines: {node: '>=14.16'} @@ -8043,8 +8209,8 @@ packages: tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} - tslog@4.10.2: - resolution: {integrity: sha512-XuELoRpMR+sq8fuWwX7P0bcj+PRNiicOKDEb3fGNURhxWVyykCi9BNq7c4uVz7h7P0sj8qgBsr5SWS6yBClq3g==} + tslog@4.11.0: + resolution: {integrity: sha512-gBe0FTKkRpOv3DenGipjQWQe073jNd1cOLj3nYfVM0/NP29sQzAIx6kfyfTTsQOiWMC+B+tSr289lNXtu7HCmQ==} engines: {node: '>=16'} tsscmp@1.0.6: @@ -8187,8 +8353,8 @@ packages: vfile@6.0.3: resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==} - vite@8.1.3: - resolution: {integrity: sha512-Ds+gBRbj0lwRO2Y5hwnUBdxSwlAve9LeRyU4sNnAr0ewW0gWF0n5bgXgUzbgZ49MV9BVUAQUFYVcDUcilUExMA==} + vite@8.1.5: + resolution: {integrity: sha512-7ULLwsCdYx/nRyrpiEwvqb5TFHrMVZyBt+rg/OAXT7rgj/z+DtTDyKFeLAdDkubDVDKD8jOsndmy7m55XcfUsw==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true peerDependencies: @@ -8271,6 +8437,10 @@ packages: jsdom: optional: true + void-elements@3.1.0: + resolution: {integrity: sha512-Dhxzh5HZuiHQhbvTW9AMetFfBHDMYpo23Uo9btPXgdYP+3T5S+p+jgNy7spra+veYhBP2dCSgxR/i2Y02h5/6w==} + engines: {node: '>=0.10.0'} + vscode-jsonrpc@8.2.1: resolution: {integrity: sha512-kdjOSJ2lLIn7r1rtrMbbNCHjyMPfRnowdKjBQ+mGq6NAW5QY2bEZC/khaC5OR8svbbjvLEaIXkOq45e2X9BIbQ==} engines: {node: '>=14.0.0'} @@ -8319,6 +8489,11 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-command@0.1.0: + resolution: {integrity: sha512-XZyoF5/5hZtXitIwzrU4NKK+Wtbb9aB9CezUEw2Q0wlYK8NUYQxC1rRXgNueYLtBAJwXIb+/tFVk4dozciNJMA==} + engines: {node: '>=22'} + hasBin: true + which-module@2.0.1: resolution: {integrity: sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ==} @@ -8340,6 +8515,10 @@ packages: win-guid@0.2.1: resolution: {integrity: sha512-gEIQU4mkgl2OPeoNrWflcJFJ3Ae2BPd4eCsHHA/XikslkIVms/nHhvnvzIZV7VLmBvtFlDOzLt9rrZT+n6D67A==} + with@7.0.2: + resolution: {integrity: sha512-RNGKj82nUPg3g5ygxkQl0R937xLyho1J24ItRCBTr/m1YnZkzJy1hUiHUJrc/VlsDQzsCnInEGSg3bci0Lmd4w==} + engines: {node: '>= 10.0.0'} + wordwrapjs@5.1.1: resolution: {integrity: sha512-0yweIbkINJodk27gX9LBGMzyQdBDan3s/dEAiwBOj+Mf0PPyWL6/rikalkv8EeD0E8jm4o5RXEOrFTP3NXbhJg==} engines: {node: '>=12.17'} @@ -8355,18 +8534,6 @@ packages: wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} - ws@8.21.0: - resolution: {integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==} - engines: {node: '>=10.0.0'} - peerDependencies: - bufferutil: ^4.0.1 - utf-8-validate: '>=5.0.2' - peerDependenciesMeta: - bufferutil: - optional: true - utf-8-validate: - optional: true - ws@8.21.1: resolution: {integrity: sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==} engines: {node: '>=10.0.0'} @@ -8484,10 +8651,10 @@ snapshots: - '@anthropic-ai/sdk' - '@modelcontextprotocol/sdk' - '@agentclientprotocol/codex-acp@1.1.4': + '@agentclientprotocol/codex-acp@1.1.7': dependencies: - '@agentclientprotocol/sdk': 1.2.1(zod@4.4.3) - '@openai/codex': 0.144.6 + '@agentclientprotocol/sdk': 1.3.0(zod@4.4.3) + '@openai/codex': 0.145.0 diff: 9.0.0 open: 11.0.0 vscode-jsonrpc: 9.0.1 @@ -8497,6 +8664,10 @@ snapshots: dependencies: zod: 4.4.3 + '@agentclientprotocol/sdk@1.3.0(zod@4.4.3)': + dependencies: + zod: 4.4.3 + '@anthropic-ai/claude-agent-sdk-darwin-arm64@0.3.207': optional: true @@ -9286,9 +9457,12 @@ snapshots: style-mod: 4.1.3 w3c-keyname: 2.2.8 + '@colors/colors@1.5.0': + optional: true + '@copilotkit/aimock@1.37.2(vitest@4.1.10)': optionalDependencies: - vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) '@create-markdown/preview@2.0.3(shiki@4.3.1)': optionalDependencies: @@ -9398,7 +9572,7 @@ snapshots: - opusscript - utf-8-validate - '@earendil-works/pi-tui@0.80.10': + '@earendil-works/pi-tui@0.81.1': dependencies: get-east-asian-width: 1.6.0 marked: 18.0.5 @@ -9650,6 +9824,40 @@ snapshots: '@js-sdsl/ordered-map@4.4.2': {} + '@jscpd/badge-reporter@4.2.4': + dependencies: + badgen: 3.3.2 + colors: 1.4.0 + fs-extra: 11.3.6 + + '@jscpd/core@4.2.4': + dependencies: + eventemitter3: 5.0.4 + + '@jscpd/finder@4.2.4': + dependencies: + '@jscpd/core': 4.2.4 + '@jscpd/tokenizer': 4.2.4 + blamer: 1.0.7 + bytes: 3.1.2 + cli-table3: 0.6.5 + colors: 1.4.0 + fast-glob: 3.3.3 + fs-extra: 11.3.6 + markdown-table: 2.0.0 + pug: 3.0.4 + + '@jscpd/html-reporter@4.2.4': + dependencies: + colors: 1.4.0 + fs-extra: 11.3.6 + pug: 3.0.4 + + '@jscpd/tokenizer@4.2.4': + dependencies: + '@jscpd/core': 4.2.4 + spark-md5: 3.0.2 + '@keyv/bigmap@1.3.1(keyv@5.6.0)': dependencies: hashery: 1.5.1 @@ -10167,31 +10375,31 @@ snapshots: '@npmcli/redact@5.0.0': {} - '@openai/codex@0.144.6': + '@openai/codex@0.145.0': optionalDependencies: - '@openai/codex-darwin-arm64': '@openai/codex@0.144.6-darwin-arm64' - '@openai/codex-darwin-x64': '@openai/codex@0.144.6-darwin-x64' - '@openai/codex-linux-arm64': '@openai/codex@0.144.6-linux-arm64' - '@openai/codex-linux-x64': '@openai/codex@0.144.6-linux-x64' - '@openai/codex-win32-arm64': '@openai/codex@0.144.6-win32-arm64' - '@openai/codex-win32-x64': '@openai/codex@0.144.6-win32-x64' + '@openai/codex-darwin-arm64': '@openai/codex@0.145.0-darwin-arm64' + '@openai/codex-darwin-x64': '@openai/codex@0.145.0-darwin-x64' + '@openai/codex-linux-arm64': '@openai/codex@0.145.0-linux-arm64' + '@openai/codex-linux-x64': '@openai/codex@0.145.0-linux-x64' + '@openai/codex-win32-arm64': '@openai/codex@0.145.0-win32-arm64' + '@openai/codex-win32-x64': '@openai/codex@0.145.0-win32-x64' - '@openai/codex@0.144.6-darwin-arm64': + '@openai/codex@0.145.0-darwin-arm64': optional: true - '@openai/codex@0.144.6-darwin-x64': + '@openai/codex@0.145.0-darwin-x64': optional: true - '@openai/codex@0.144.6-linux-arm64': + '@openai/codex@0.145.0-linux-arm64': optional: true - '@openai/codex@0.144.6-linux-x64': + '@openai/codex@0.145.0-linux-x64': optional: true - '@openai/codex@0.144.6-win32-arm64': + '@openai/codex@0.145.0-win32-arm64': optional: true - '@openai/codex@0.144.6-win32-x64': + '@openai/codex@0.145.0-win32-x64': optional: true '@openclaw/crabline@0.1.11': @@ -10470,61 +10678,61 @@ snapshots: '@oxc-project/types@0.140.0': {} - '@oxfmt/binding-android-arm-eabi@0.59.0': + '@oxfmt/binding-android-arm-eabi@0.60.0': optional: true - '@oxfmt/binding-android-arm64@0.59.0': + '@oxfmt/binding-android-arm64@0.60.0': optional: true - '@oxfmt/binding-darwin-arm64@0.59.0': + '@oxfmt/binding-darwin-arm64@0.60.0': optional: true - '@oxfmt/binding-darwin-x64@0.59.0': + '@oxfmt/binding-darwin-x64@0.60.0': optional: true - '@oxfmt/binding-freebsd-x64@0.59.0': + '@oxfmt/binding-freebsd-x64@0.60.0': optional: true - '@oxfmt/binding-linux-arm-gnueabihf@0.59.0': + '@oxfmt/binding-linux-arm-gnueabihf@0.60.0': optional: true - '@oxfmt/binding-linux-arm-musleabihf@0.59.0': + '@oxfmt/binding-linux-arm-musleabihf@0.60.0': optional: true - '@oxfmt/binding-linux-arm64-gnu@0.59.0': + '@oxfmt/binding-linux-arm64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-arm64-musl@0.59.0': + '@oxfmt/binding-linux-arm64-musl@0.60.0': optional: true - '@oxfmt/binding-linux-ppc64-gnu@0.59.0': + '@oxfmt/binding-linux-ppc64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-riscv64-gnu@0.59.0': + '@oxfmt/binding-linux-riscv64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-riscv64-musl@0.59.0': + '@oxfmt/binding-linux-riscv64-musl@0.60.0': optional: true - '@oxfmt/binding-linux-s390x-gnu@0.59.0': + '@oxfmt/binding-linux-s390x-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-x64-gnu@0.59.0': + '@oxfmt/binding-linux-x64-gnu@0.60.0': optional: true - '@oxfmt/binding-linux-x64-musl@0.59.0': + '@oxfmt/binding-linux-x64-musl@0.60.0': optional: true - '@oxfmt/binding-openharmony-arm64@0.59.0': + '@oxfmt/binding-openharmony-arm64@0.60.0': optional: true - '@oxfmt/binding-win32-arm64-msvc@0.59.0': + '@oxfmt/binding-win32-arm64-msvc@0.60.0': optional: true - '@oxfmt/binding-win32-ia32-msvc@0.59.0': + '@oxfmt/binding-win32-ia32-msvc@0.60.0': optional: true - '@oxfmt/binding-win32-x64-msvc@0.59.0': + '@oxfmt/binding-win32-x64-msvc@0.60.0': optional: true '@oxlint-tsgolint/darwin-arm64@0.25.0': @@ -10905,73 +11113,54 @@ snapshots: '@sindresorhus/merge-streams@4.0.0': {} - '@slack/bolt@4.7.3(@types/express@5.0.6)(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)': + '@slack/bolt@5.0.0(@types/express@5.0.6)(supports-color@7.2.0)(undici@7.28.0)': dependencies: - '@slack/logger': 4.0.1 - '@slack/oauth': 3.0.5(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) - '@slack/socket-mode': 2.0.7(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) - '@slack/types': 2.21.1 - '@slack/web-api': 7.18.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) + '@slack/logger': 5.0.0 + '@slack/oauth': 4.0.0 + '@slack/socket-mode': 3.0.0(undici@7.28.0) + '@slack/types': 3.0.0 + '@slack/web-api': 8.0.0 '@types/express': 5.0.6 - axios: 1.18.1(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) express: 5.2.1(supports-color@7.2.0) path-to-regexp: 8.4.2 raw-body: 3.0.2 tsscmp: 1.0.6 transitivePeerDependencies: - - bufferutil - - debug - supports-color - - utf-8-validate + - undici - '@slack/logger@4.0.1': + '@slack/logger@5.0.0': dependencies: '@types/node': 26.1.1 - '@slack/oauth@3.0.5(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)': + '@slack/oauth@4.0.0': dependencies: - '@slack/logger': 4.0.1 - '@slack/web-api': 7.18.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) + '@slack/logger': 5.0.0 + '@slack/web-api': 8.0.0 '@types/jsonwebtoken': 9.0.10 '@types/node': 26.1.1 jsonwebtoken: 9.0.3 - transitivePeerDependencies: - - debug - - supports-color - '@slack/socket-mode@2.0.7(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)': + '@slack/socket-mode@3.0.0(undici@7.28.0)': dependencies: - '@slack/logger': 4.0.1 - '@slack/web-api': 7.18.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) + '@slack/logger': 5.0.0 + '@slack/web-api': 8.0.0 '@types/node': 26.1.1 - '@types/ws': 8.18.1 eventemitter3: 5.0.4 - ws: 8.21.1 - transitivePeerDependencies: - - bufferutil - - debug - - supports-color - - utf-8-validate + undici: 7.28.0 - '@slack/types@2.21.1': {} + '@slack/types@3.0.0': {} - '@slack/web-api@7.18.0(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0)': + '@slack/web-api@8.0.0': dependencies: - '@slack/logger': 4.0.1 - '@slack/types': 2.21.1 + '@slack/logger': 5.0.0 + '@slack/types': 3.0.0 '@types/node': 26.1.1 '@types/retry': 0.12.0 - axios: 1.18.1(debug@4.4.3(supports-color@7.2.0))(supports-color@7.2.0) eventemitter3: 5.0.4 - form-data: 2.5.6 - is-electron: 2.2.2 - is-stream: 2.0.1 p-queue: 6.6.2 p-retry: 4.6.2 retry: 0.13.1 - transitivePeerDependencies: - - debug - - supports-color '@smithy/config-resolver@4.6.11': dependencies: @@ -11323,6 +11512,8 @@ snapshots: '@types/retry@0.12.5': {} + '@types/sarif@2.1.7': {} + '@types/semver@7.7.1': {} '@types/send@1.2.1': @@ -11393,26 +11584,26 @@ snapshots: '@urbit/aura@3.0.0': {} - '@vitest/browser-playwright@4.1.10(playwright@1.61.1)(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10)': + '@vitest/browser-playwright@4.1.10(playwright@1.61.1)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10)': dependencies: - '@vitest/browser': 4.1.10(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) - '@vitest/mocker': 4.1.10(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@vitest/browser': 4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) playwright: 1.61.1 tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser-playwright@4.1.10(playwright@1.61.1)(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10)': + '@vitest/browser-playwright@4.1.10(playwright@1.61.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10)': dependencies: - '@vitest/browser': 4.1.10(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) - '@vitest/mocker': 4.1.10(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@vitest/browser': 4.1.10(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) playwright: 1.61.1 tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) transitivePeerDependencies: - bufferutil - msw @@ -11420,34 +11611,34 @@ snapshots: - vite optional: true - '@vitest/browser@4.1.10(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10)': + '@vitest/browser@4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.10(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) '@vitest/utils': 4.1.10 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) - ws: 8.21.0 + vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + ws: 8.21.1 transitivePeerDependencies: - bufferutil - msw - utf-8-validate - vite - '@vitest/browser@4.1.10(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10)': + '@vitest/browser@4.1.10(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10)': dependencies: '@blazediff/core': 1.9.1 - '@vitest/mocker': 4.1.10(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) '@vitest/utils': 4.1.10 magic-string: 0.30.21 pngjs: 7.0.0 sirv: 3.0.2 tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) - ws: 8.21.0 + vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + ws: 8.21.1 transitivePeerDependencies: - bufferutil - msw @@ -11467,9 +11658,9 @@ snapshots: obug: 2.1.4 std-env: 4.2.0 tinyrainbow: 3.1.0 - vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + vitest: 4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) optionalDependencies: - '@vitest/browser': 4.1.10(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) + '@vitest/browser': 4.1.10(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) '@vitest/expect@4.1.10': dependencies: @@ -11480,21 +11671,21 @@ snapshots: chai: 6.2.2 tinyrainbow: 3.1.0 - '@vitest/mocker@4.1.10(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))': + '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) - '@vitest/mocker@4.1.10(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))': + '@vitest/mocker@4.1.10(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))': dependencies: '@vitest/spy': 4.1.10 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) '@vitest/pretty-format@4.1.10': dependencies: @@ -11552,11 +11743,13 @@ snapshots: dependencies: acorn: 8.17.0 + acorn@7.4.1: {} + acorn@8.17.0: {} acpx@0.12.0: dependencies: - '@agentclientprotocol/sdk': 1.2.1(zod@4.4.3) + '@agentclientprotocol/sdk': 1.3.0(zod@4.4.3) commander: 15.0.0 skillflag: 0.2.0 tsx: 4.23.1 @@ -11624,6 +11817,8 @@ snapshots: array-back@6.2.3: {} + asap@2.0.6: {} + asn1.js@5.4.1: dependencies: bn.js: 4.12.5 @@ -11631,6 +11826,8 @@ snapshots: minimalistic-assert: 1.0.1 safer-buffer: 2.1.2 + assert-never@1.4.0: {} + assertion-error@2.0.1: {} ast-kit@3.0.0: @@ -11687,6 +11884,12 @@ snapshots: b4a@1.8.1: {} + babel-walk@3.0.0-canary-5: + dependencies: + '@babel/types': 7.29.7 + + badgen@3.3.2: {} + bail@2.0.2: {} baileys@7.0.0-rc13(audio-decode@2.2.3)(supports-color@7.2.0): @@ -11754,6 +11957,11 @@ snapshots: birpc@4.0.0: {} + blamer@1.0.7: + dependencies: + execa: 4.1.0 + which: 2.0.2 + bn.js@4.12.5: {} body-parser@2.3.0(supports-color@7.2.0): @@ -11854,6 +12062,10 @@ snapshots: character-entities@2.0.2: {} + character-parser@2.2.0: + dependencies: + is-regex: 1.2.1 + character-reference-invalid@2.0.1: {} chmodrp@1.0.2: @@ -11883,6 +12095,12 @@ snapshots: cli-spinners@3.4.0: optional: true + cli-table3@0.6.5: + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + cliui@6.0.0: dependencies: string-width: 4.2.3 @@ -11920,6 +12138,8 @@ snapshots: color-name@1.1.4: {} + colors@1.4.0: {} + combined-stream@1.0.8: dependencies: delayed-stream: 1.0.0 @@ -11945,10 +12165,17 @@ snapshots: commander@15.0.0: {} + commander@5.1.0: {} + composed-offset-position@0.0.6(@floating-ui/utils@0.2.12): dependencies: '@floating-ui/utils': 0.2.12 + constantinople@4.0.1: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + content-disposition@1.1.0: {} content-type@1.0.5: {} @@ -12060,6 +12287,8 @@ snapshots: discord-api-types@0.38.50: {} + doctypes@1.1.0: {} + dom-serializer@2.0.0: dependencies: domelementtype: 2.3.0 @@ -12125,6 +12354,10 @@ snapshots: encodeurl@2.0.0: {} + end-of-stream@1.4.5: + dependencies: + once: 1.4.0 + enhanced-resolve@5.24.3: dependencies: graceful-fs: 4.2.11 @@ -12260,21 +12493,34 @@ snapshots: dependencies: eventsource-parser: 3.1.0 - execa@9.6.1: + execa@10.0.0: dependencies: '@sindresorhus/merge-streams': 4.0.0 - cross-spawn: 7.0.6 figures: 6.1.0 get-stream: 9.0.1 human-signals: 8.0.1 is-plain-obj: 4.1.0 is-stream: 4.0.1 npm-run-path: 6.0.0 + path-key: 4.0.0 pretty-ms: 9.3.0 signal-exit: 4.1.0 strip-final-newline: 4.0.0 + which-command: 0.1.0 yoctocolors: 2.1.2 + execa@4.1.0: + dependencies: + cross-spawn: 7.0.6 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + expect-type@1.4.0: {} express-rate-limit@8.6.0(express@5.2.1(supports-color@7.2.0))(supports-color@7.2.0): @@ -12434,7 +12680,6 @@ snapshots: graceful-fs: 4.2.11 jsonfile: 6.2.1 universalify: 2.0.1 - optional: true fs-minipass@3.0.3: dependencies: @@ -12486,6 +12731,10 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.2 + get-stream@5.2.0: + dependencies: + pump: 3.0.4 + get-stream@9.0.1: dependencies: '@sec-ant/readable-stream': 0.4.1 @@ -12695,6 +12944,8 @@ snapshots: - kerberos - supports-color + human-signals@1.1.1: {} + human-signals@8.0.1: {} iconv-lite@0.7.3: @@ -12773,11 +13024,18 @@ snapshots: is-alphabetical: 2.0.1 is-decimal: 2.0.1 + is-core-module@2.16.2: + dependencies: + hasown: 2.0.4 + is-decimal@2.0.1: {} is-docker@3.0.0: {} - is-electron@2.2.2: {} + is-expression@4.0.0: + dependencies: + acorn: 7.4.1 + object-assign: 4.1.1 is-extglob@2.1.1: {} @@ -12811,8 +13069,17 @@ snapshots: is-potential-custom-element-name@1.0.1: {} + is-promise@2.2.2: {} + is-promise@4.0.0: {} + is-regex@1.2.1: + dependencies: + call-bound: 1.0.4 + gopd: 1.2.0 + has-tostringtag: 1.0.2 + hasown: 2.0.4 + is-stream@2.0.1: {} is-stream@4.0.1: {} @@ -12849,34 +13116,27 @@ snapshots: jose@6.2.3: {} + js-stringify@1.0.2: {} + js-tokens@10.0.0: {} - jscpd-darwin-arm64@5.0.12: - optional: true + jscpd-sarif-reporter@4.2.4: + dependencies: + colors: 1.4.0 + fs-extra: 11.3.6 + node-sarif-builder: 3.4.0 - jscpd-darwin-x64@5.0.12: - optional: true - - jscpd-linux-arm64-gnu@5.0.12: - optional: true - - jscpd-linux-x64-gnu@5.0.12: - optional: true - - jscpd-linux-x64-musl@5.0.12: - optional: true - - jscpd-windows-x64-msvc@5.0.12: - optional: true - - jscpd@5.0.12: - optionalDependencies: - jscpd-darwin-arm64: 5.0.12 - jscpd-darwin-x64: 5.0.12 - jscpd-linux-arm64-gnu: 5.0.12 - jscpd-linux-x64-gnu: 5.0.12 - jscpd-linux-x64-musl: 5.0.12 - jscpd-windows-x64-msvc: 5.0.12 + jscpd@4.2.4: + dependencies: + '@jscpd/badge-reporter': 4.2.4 + '@jscpd/core': 4.2.4 + '@jscpd/finder': 4.2.4 + '@jscpd/html-reporter': 4.2.4 + '@jscpd/tokenizer': 4.2.4 + colors: 1.4.0 + commander: 5.1.0 + fs-extra: 11.3.6 + jscpd-sarif-reporter: 4.2.4 jsdom@29.1.1(@noble/hashes@2.2.0): dependencies: @@ -12930,7 +13190,6 @@ snapshots: universalify: 2.0.1 optionalDependencies: graceful-fs: 4.2.11 - optional: true jsonwebtoken@9.0.3: dependencies: @@ -12945,6 +13204,11 @@ snapshots: ms: 2.1.3 semver: 7.8.5 + jstransformer@1.0.0: + dependencies: + is-promise: 2.2.2 + promise: 7.3.1 + jszip@3.10.1: dependencies: lie: 3.3.0 @@ -13230,6 +13494,10 @@ snapshots: punycode.js: 2.3.1 uc.micro: 2.1.0 + markdown-table@2.0.0: + dependencies: + repeat-string: 1.6.1 + markdown-table@3.0.4: {} marked@11.2.0: {} @@ -13382,6 +13650,8 @@ snapshots: merge-descriptors@2.0.0: {} + merge-stream@2.0.0: {} + merge2@1.4.1: {} micromark-core-commonmark@2.0.3: @@ -13615,6 +13885,8 @@ snapshots: dependencies: mime-db: 1.54.0 + mimic-fn@2.1.0: {} + mimic-function@5.0.1: optional: true @@ -13776,6 +14048,11 @@ snapshots: dependencies: node-addon-api: 7.1.1 + node-sarif-builder@3.4.0: + dependencies: + '@types/sarif': 2.1.7 + fs-extra: 11.3.6 + node-wav@0.0.2: {} nostr-tools@2.23.12(typescript@6.0.3): @@ -13792,6 +14069,10 @@ snapshots: nostr-wasm@0.1.0: {} + npm-run-path@4.0.1: + dependencies: + path-key: 3.1.1 + npm-run-path@6.0.0: dependencies: path-key: 4.0.0 @@ -13828,6 +14109,10 @@ snapshots: dependencies: wrappy: 1.0.2 + onetime@5.1.2: + dependencies: + mimic-fn: 2.1.0 + onetime@7.0.0: dependencies: mimic-function: 5.0.1 @@ -13881,29 +14166,29 @@ snapshots: string-width: 8.2.2 optional: true - oxfmt@0.59.0: + oxfmt@0.60.0: dependencies: tinypool: 2.1.0 optionalDependencies: - '@oxfmt/binding-android-arm-eabi': 0.59.0 - '@oxfmt/binding-android-arm64': 0.59.0 - '@oxfmt/binding-darwin-arm64': 0.59.0 - '@oxfmt/binding-darwin-x64': 0.59.0 - '@oxfmt/binding-freebsd-x64': 0.59.0 - '@oxfmt/binding-linux-arm-gnueabihf': 0.59.0 - '@oxfmt/binding-linux-arm-musleabihf': 0.59.0 - '@oxfmt/binding-linux-arm64-gnu': 0.59.0 - '@oxfmt/binding-linux-arm64-musl': 0.59.0 - '@oxfmt/binding-linux-ppc64-gnu': 0.59.0 - '@oxfmt/binding-linux-riscv64-gnu': 0.59.0 - '@oxfmt/binding-linux-riscv64-musl': 0.59.0 - '@oxfmt/binding-linux-s390x-gnu': 0.59.0 - '@oxfmt/binding-linux-x64-gnu': 0.59.0 - '@oxfmt/binding-linux-x64-musl': 0.59.0 - '@oxfmt/binding-openharmony-arm64': 0.59.0 - '@oxfmt/binding-win32-arm64-msvc': 0.59.0 - '@oxfmt/binding-win32-ia32-msvc': 0.59.0 - '@oxfmt/binding-win32-x64-msvc': 0.59.0 + '@oxfmt/binding-android-arm-eabi': 0.60.0 + '@oxfmt/binding-android-arm64': 0.60.0 + '@oxfmt/binding-darwin-arm64': 0.60.0 + '@oxfmt/binding-darwin-x64': 0.60.0 + '@oxfmt/binding-freebsd-x64': 0.60.0 + '@oxfmt/binding-linux-arm-gnueabihf': 0.60.0 + '@oxfmt/binding-linux-arm-musleabihf': 0.60.0 + '@oxfmt/binding-linux-arm64-gnu': 0.60.0 + '@oxfmt/binding-linux-arm64-musl': 0.60.0 + '@oxfmt/binding-linux-ppc64-gnu': 0.60.0 + '@oxfmt/binding-linux-riscv64-gnu': 0.60.0 + '@oxfmt/binding-linux-riscv64-musl': 0.60.0 + '@oxfmt/binding-linux-s390x-gnu': 0.60.0 + '@oxfmt/binding-linux-x64-gnu': 0.60.0 + '@oxfmt/binding-linux-x64-musl': 0.60.0 + '@oxfmt/binding-openharmony-arm64': 0.60.0 + '@oxfmt/binding-win32-arm64-msvc': 0.60.0 + '@oxfmt/binding-win32-ia32-msvc': 0.60.0 + '@oxfmt/binding-win32-x64-msvc': 0.60.0 oxlint-tsgolint@0.25.0: optionalDependencies: @@ -14017,6 +14302,8 @@ snapshots: path-key@4.0.0: {} + path-parse@1.0.7: {} + path-scurry@2.0.2: dependencies: lru-cache: 11.5.2 @@ -14094,6 +14381,10 @@ snapshots: process-warning@5.0.0: {} + promise@7.3.1: + dependencies: + asap: 2.0.6 + proper-lockfile@4.1.2: dependencies: graceful-fs: 4.2.11 @@ -14129,6 +14420,78 @@ snapshots: dependencies: punycode: 2.3.1 + pug-attrs@3.0.0: + dependencies: + constantinople: 4.0.1 + js-stringify: 1.0.2 + pug-runtime: 3.0.1 + + pug-code-gen@3.0.4: + dependencies: + constantinople: 4.0.1 + doctypes: 1.1.0 + js-stringify: 1.0.2 + pug-attrs: 3.0.0 + pug-error: 2.1.0 + pug-runtime: 3.0.1 + void-elements: 3.1.0 + with: 7.0.2 + + pug-error@2.1.0: {} + + pug-filters@4.0.0: + dependencies: + constantinople: 4.0.1 + jstransformer: 1.0.0 + pug-error: 2.1.0 + pug-walk: 2.0.0 + resolve: 1.22.12 + + pug-lexer@5.0.1: + dependencies: + character-parser: 2.2.0 + is-expression: 4.0.0 + pug-error: 2.1.0 + + pug-linker@4.0.0: + dependencies: + pug-error: 2.1.0 + pug-walk: 2.0.0 + + pug-load@3.0.0: + dependencies: + object-assign: 4.1.1 + pug-walk: 2.0.0 + + pug-parser@6.0.0: + dependencies: + pug-error: 2.1.0 + token-stream: 1.0.0 + + pug-runtime@3.0.1: {} + + pug-strip-comments@2.0.0: + dependencies: + pug-error: 2.1.0 + + pug-walk@2.0.0: {} + + pug@3.0.4: + dependencies: + pug-code-gen: 3.0.4 + pug-filters: 4.0.0 + pug-lexer: 5.0.1 + pug-linker: 4.0.0 + pug-load: 3.0.0 + pug-parser: 6.0.0 + pug-runtime: 3.0.1 + pug-strip-comments: 2.0.0 + + pump@3.0.4: + dependencies: + end-of-stream: 1.4.5 + once: 1.4.0 + punycode.js@2.3.1: {} punycode@2.3.1: {} @@ -14283,6 +14646,8 @@ snapshots: remend@1.3.0: {} + repeat-string@1.6.1: {} + require-directory@2.1.1: {} require-from-string@2.0.2: {} @@ -14300,6 +14665,13 @@ snapshots: resolve-pkg-maps@1.0.0: {} + resolve@1.22.12: + dependencies: + es-errors: 1.3.0 + is-core-module: 2.16.2 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + restore-cursor@5.1.0: dependencies: onetime: 7.0.0 @@ -14689,6 +15061,8 @@ snapshots: ansi-regex: 6.2.2 optional: true + strip-final-newline@2.0.0: {} + strip-final-newline@4.0.0: {} strip-json-comments@2.0.1: @@ -14712,6 +15086,8 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} + symbol-tree@3.2.4: {} table-layout@4.1.1: @@ -14776,6 +15152,8 @@ snapshots: toidentifier@1.0.1: {} + token-stream@1.0.0: {} + token-types@6.1.2: dependencies: '@borewit/text-codec': 0.2.2 @@ -14841,7 +15219,7 @@ snapshots: tslib@2.8.1: {} - tslog@4.10.2: {} + tslog@4.11.0: {} tsscmp@1.0.6: {} @@ -14937,8 +15315,7 @@ snapshots: universalify@0.2.0: {} - universalify@2.0.1: - optional: true + universalify@2.0.1: {} unpipe@1.0.0: {} @@ -14973,7 +15350,7 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.3 - vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0): + vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -14988,7 +15365,7 @@ snapshots: tsx: 4.23.1 yaml: 2.9.0 - vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0): + vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0): dependencies: lightningcss: 1.33.0 picomatch: 4.0.5 @@ -15003,10 +15380,10 @@ snapshots: tsx: 4.23.1 yaml: 2.9.0 - vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)): + vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@24.13.3)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -15023,21 +15400,21 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 24.13.3 - '@vitest/browser-playwright': 4.1.10(playwright@1.61.1)(vite@8.1.3(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) + '@vitest/browser-playwright': 4.1.10(playwright@1.61.1)(vite@8.1.5(@types/node@24.13.3)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) '@vitest/coverage-v8': 4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10) jsdom: 29.1.1(@noble/hashes@2.2.0) transitivePeerDependencies: - msw - vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)): + vitest@4.1.10(@opentelemetry/api@1.9.1)(@types/node@26.1.1)(@vitest/browser-playwright@4.1.10)(@vitest/coverage-v8@4.1.10)(jsdom@29.1.1(@noble/hashes@2.2.0))(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)): dependencies: '@vitest/expect': 4.1.10 - '@vitest/mocker': 4.1.10(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) + '@vitest/mocker': 4.1.10(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0)) '@vitest/pretty-format': 4.1.10 '@vitest/runner': 4.1.10 '@vitest/snapshot': 4.1.10 @@ -15054,17 +15431,19 @@ snapshots: tinyexec: 1.2.4 tinyglobby: 0.2.17 tinyrainbow: 3.1.0 - vite: 8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) + vite: 8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0) why-is-node-running: 2.3.0 optionalDependencies: '@opentelemetry/api': 1.9.1 '@types/node': 26.1.1 - '@vitest/browser-playwright': 4.1.10(playwright@1.61.1)(vite@8.1.3(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) + '@vitest/browser-playwright': 4.1.10(playwright@1.61.1)(vite@8.1.5(@types/node@26.1.1)(esbuild@0.28.1)(jiti@2.7.0)(tsx@4.23.1)(yaml@2.9.0))(vitest@4.1.10) '@vitest/coverage-v8': 4.1.10(@vitest/browser@4.1.10)(vitest@4.1.10) jsdom: 29.1.1(@noble/hashes@2.2.0) transitivePeerDependencies: - msw + void-elements@3.1.0: {} + vscode-jsonrpc@8.2.1: {} vscode-jsonrpc@9.0.1: {} @@ -15110,6 +15489,8 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + which-command@0.1.0: {} + which-module@2.0.1: {} which@2.0.2: @@ -15128,6 +15509,13 @@ snapshots: win-guid@0.2.1: {} + with@7.0.2: + dependencies: + '@babel/parser': 7.29.7 + '@babel/types': 7.29.7 + assert-never: 1.4.0 + babel-walk: 3.0.0-canary-5 + wordwrapjs@5.1.1: {} wrap-ansi@6.2.0: @@ -15144,8 +15532,6 @@ snapshots: wrappy@1.0.2: {} - ws@8.21.0: {} - ws@8.21.1: {} wsl-utils@0.1.0: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 0e9b50e88c09..b3388d491903 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -16,6 +16,7 @@ minimumReleaseAgeExclude: - "acpx" - "tokenjuice" - "@agentclientprotocol/sdk" + - "@agentclientprotocol/codex-acp@1.1.7" - "axios" - "basic-ftp" - "baileys@7.0.0-rc13" @@ -28,15 +29,27 @@ minimumReleaseAgeExclude: - "@cloudflare/workers-types" - "@hono/node-server" - "@mariozechner/*" + - "@aws-sdk/checksums@3.1000.19" - "@aws-sdk/client-bedrock-runtime@3.1053.0" - "@aws-sdk/client-bedrock@3.1053.0" - "@aws-sdk/client-cognito-identity@3.1053.0" - "@aws-sdk/client-s3@3.1053.0" - "@aws-sdk/core" + - "@aws-sdk/credential-provider-env@3.972.60" + - "@aws-sdk/credential-provider-http@3.972.62" + - "@aws-sdk/credential-provider-ini@3.973.5" + - "@aws-sdk/credential-provider-login@3.972.67" + - "@aws-sdk/credential-provider-process@3.972.60" + - "@aws-sdk/credential-provider-sso@3.973.4" + - "@aws-sdk/credential-provider-web-identity@3.972.66" - "@aws-sdk/credential-providers@3.1053.0" + - "@aws-sdk/middleware-sdk-s3@3.972.65" + - "@aws-sdk/middleware-websocket@3.972.42" + - "@aws-sdk/nested-clients@3.997.34" - "@aws-sdk/s3-request-presigner@3.1053.0" - "@aws-sdk/token-providers@3.1052.0" - "@aws-sdk/token-providers@3.1053.0" + - "@aws-sdk/token-providers@3.1092.0" - "@copilotkit/aimock@1.27.1" - "@microsoft/mxc-sdk@0.7.0" - "@earendil-works/pi-tui" @@ -50,7 +63,12 @@ minimumReleaseAgeExclude: - "@openai/codex" - "@openai/codex-*" - "@pierre/diffs@1.2.3" + - "@smithy/core@3.29.7" + - "@smithy/credential-provider-imds@4.4.12" + - "@smithy/fetch-http-handler@5.6.9" - "@smithy/shared-ini-file-loader@4.5.4" + - "@smithy/signature-v4@5.6.8" + - "postcss@8.5.22" - "@typescript/native-preview*" - "@types/node" - "@rolldown/*" diff --git a/scripts/check-codex-app-server-protocol.ts b/scripts/check-codex-app-server-protocol.ts index 57e7943cf604..e220201b8a92 100644 --- a/scripts/check-codex-app-server-protocol.ts +++ b/scripts/check-codex-app-server-protocol.ts @@ -71,7 +71,7 @@ const checks: Array<{ file: string; snippets: string[] }> = [ }, { file: "ReviewDecision.ts", - snippets: ['"approved"', '"approved_for_session"', '"denied"', '"abort"'], + snippets: ['"approved"', '"approved_for_session"', "denied: { rejection: string }", '"abort"'], }, { file: "v2/PlanDeltaNotification.ts", diff --git a/scripts/check-workflows.mjs b/scripts/check-workflows.mjs index 35f9e6f82cf8..6a6b847295e0 100644 --- a/scripts/check-workflows.mjs +++ b/scripts/check-workflows.mjs @@ -7,7 +7,7 @@ import { mkdtempSync, readdirSync, rmSync } from "node:fs"; import { tmpdir } from "node:os"; import { join } from "node:path"; -const ACTIONLINT_VERSION = "1.7.11"; +const ACTIONLINT_VERSION = "1.7.12"; const PRE_COMMIT_VERSION = "4.2.0"; const WORKFLOW_DIR = ".github/workflows"; diff --git a/scripts/e2e/parallels/windows-git.ts b/scripts/e2e/parallels/windows-git.ts index 16e0cc72cb9c..97cb820c540b 100644 --- a/scripts/e2e/parallels/windows-git.ts +++ b/scripts/e2e/parallels/windows-git.ts @@ -14,12 +14,12 @@ export async function prepareMinGitZip(tgzDir: string): Promise { import urllib.request preferred_names = [ - "MinGit-2.53.0.2-64-bit.zip", - "MinGit-2.53.0.2-arm64.zip", + "MinGit-2.55.0.3-64-bit.zip", + "MinGit-2.55.0.3-arm64.zip", ] fallback_urls = { - "MinGit-2.53.0.2-arm64.zip": "https://github.com/git-for-windows/git/releases/download/v2.53.0.windows.2/MinGit-2.53.0.2-arm64.zip", - "MinGit-2.53.0.2-64-bit.zip": "https://github.com/git-for-windows/git/releases/download/v2.53.0.windows.2/MinGit-2.53.0.2-64-bit.zip", + "MinGit-2.55.0.3-arm64.zip": "https://github.com/git-for-windows/git/releases/download/v2.55.0.windows.3/MinGit-2.55.0.3-arm64.zip", + "MinGit-2.55.0.3-64-bit.zip": "https://github.com/git-for-windows/git/releases/download/v2.55.0.windows.3/MinGit-2.55.0.3-64-bit.zip", } try: diff --git a/scripts/run-opengrep.sh b/scripts/run-opengrep.sh index 070c1ef1471b..2264351b55d4 100755 --- a/scripts/run-opengrep.sh +++ b/scripts/run-opengrep.sh @@ -46,7 +46,7 @@ if ! command -v opengrep >/dev/null 2>&1; then error: 'opengrep' not found on PATH. Install with one of: - curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/v1.22.0/install.sh | bash -s -- -v v1.22.0 + curl -fsSL https://raw.githubusercontent.com/opengrep/opengrep/v1.25.0/install.sh | bash -s -- -v v1.25.0 brew install opengrep/tap/opengrep pipx install opengrep @@ -118,7 +118,7 @@ write_empty_sarif() { "driver": { "name": "Opengrep OSS", "informationUri": "https://opengrep.dev", - "semanticVersion": "1.22.0", + "semanticVersion": "1.25.0", "rules": [] } }, diff --git a/src/agents/sessions/exec.ts b/src/agents/sessions/exec.ts index e9db6fbc2e05..fa93bda77309 100644 --- a/src/agents/sessions/exec.ts +++ b/src/agents/sessions/exec.ts @@ -96,7 +96,7 @@ export async function execCommand( reject: false, stdio: ["ignore", "pipe", "pipe"], }); - const releaseOutput = releaseChildProcessOutputAfterExit(proc); + const releaseOutput = releaseChildProcessOutputAfterExit(proc.nodeChildProcess); let stdout: OutputCapture = { text: "", truncatedChars: 0 }; let stderr: OutputCapture = { text: "", truncatedChars: 0 }; diff --git a/src/agents/sessions/tools/bash.ts b/src/agents/sessions/tools/bash.ts index 382c0d71066e..dc9a9323c466 100644 --- a/src/agents/sessions/tools/bash.ts +++ b/src/agents/sessions/tools/bash.ts @@ -81,7 +81,7 @@ export function createLocalBashOperations(options?: { shellPath?: string }): Bas reject: false, stdio: [invocation.stdin, "pipe", "pipe"], }); - const releaseOutput = releaseChildProcessOutputAfterExit(child); + const releaseOutput = releaseChildProcessOutputAfterExit(child.nodeChildProcess); let timedOut = false; let timeoutHandle: NodeJS.Timeout | undefined; const timeoutMs = resolveBashTimeoutMs(timeout); diff --git a/src/agents/sessions/tools/find.fd.test.ts b/src/agents/sessions/tools/find.fd.test.ts index 93cab4df63f8..08a6276d9d1e 100644 --- a/src/agents/sessions/tools/find.fd.test.ts +++ b/src/agents/sessions/tools/find.fd.test.ts @@ -19,6 +19,7 @@ vi.mock("../../utils/tools-manager.js", () => ({ const tempDirs = useAutoCleanupTempDirTracker(afterEach); type MockChild = ChildProcessWithoutNullStreams & { + nodeChildProcess: ChildProcessWithoutNullStreams; stdout: PassThrough; stderr: PassThrough; killMock: ReturnType; @@ -30,7 +31,7 @@ afterEach(() => { function createChild(): MockChild { const kill = vi.fn(() => true); - return Object.assign(new EventEmitter(), { + const child = Object.assign(new EventEmitter(), { stdin: new PassThrough(), stdout: new PassThrough(), stderr: new PassThrough(), @@ -38,6 +39,8 @@ function createChild(): MockChild { kill, killMock: kill, }) as unknown as MockChild; + child.nodeChildProcess = child; + return child; } it("rejects partial fd output when fd exits with an error", async () => { diff --git a/src/agents/sessions/tools/find.ts b/src/agents/sessions/tools/find.ts index 20c67f56909a..b01acb14cd3a 100644 --- a/src/agents/sessions/tools/find.ts +++ b/src/agents/sessions/tools/find.ts @@ -279,13 +279,13 @@ export function createFindToolDefinition( reject: false, stdio: ["ignore", "pipe", "pipe"], }); - releaseChildProcessOutputAfterExit(child); + releaseChildProcessOutputAfterExit(child.nodeChildProcess); const rl = createInterface({ input: child.stdout }); let stderr = ""; const lines: string[] = []; stopChild = () => { - if (!child.killed) { + if (!child.nodeChildProcess.killed) { child.kill(); } }; @@ -318,12 +318,12 @@ export function createFindToolDefinition( lines.push(line); }); - child.on("error", (error) => { + child.nodeChildProcess.on("error", (error) => { cleanup(); settle(() => reject(new Error(`Failed to run fd: ${error.message}`))); }); - child.on("close", (code) => { + child.nodeChildProcess.on("close", (code) => { cleanup(); if (signal?.aborted) { settle(() => reject(new Error("Operation aborted"))); diff --git a/src/agents/sessions/tools/grep.stream-errors.test.ts b/src/agents/sessions/tools/grep.stream-errors.test.ts index 30c813b56642..b0ce04398f98 100644 --- a/src/agents/sessions/tools/grep.stream-errors.test.ts +++ b/src/agents/sessions/tools/grep.stream-errors.test.ts @@ -20,7 +20,11 @@ afterEach(() => { vi.clearAllMocks(); }); -type MockChild = ChildProcessWithoutNullStreams & { stdout: PassThrough; stderr: PassThrough }; +type MockChild = ChildProcessWithoutNullStreams & { + nodeChildProcess: ChildProcessWithoutNullStreams; + stdout: PassThrough; + stderr: PassThrough; +}; function createChild(): MockChild { let killed = false; @@ -34,6 +38,7 @@ function createChild(): MockChild { killed = true; return true; }); + child.nodeChildProcess = child; return child; } diff --git a/src/agents/sessions/tools/grep.ts b/src/agents/sessions/tools/grep.ts index d9443f6b46d9..f1110601feab 100644 --- a/src/agents/sessions/tools/grep.ts +++ b/src/agents/sessions/tools/grep.ts @@ -3,7 +3,6 @@ * * Searches files with ripgrep/local operations, optional context, and bounded output rendering. */ -import type { ChildProcess } from "node:child_process"; import { readFileSync, statSync } from "node:fs"; import path from "node:path"; import { createInterface } from "node:readline"; @@ -160,7 +159,12 @@ export function createGrepToolDefinition( // Keep cancellation live from the first await through async result formatting. // Settlement owns listener cleanup; spawned children stop without waiting for close. let settled = false; - let child: ChildProcess | undefined; + let child: + | { + nodeChildProcess: { killed: boolean }; + kill: () => void; + } + | undefined; let childClosed = false; let rl: ReturnType | undefined; let killedDueToLimit = false; @@ -178,7 +182,7 @@ export function createGrepToolDefinition( return true; }; const stopChild = (dueToLimit = false) => { - if (child && !childClosed && !child.killed) { + if (child && !childClosed && !child.nodeChildProcess.killed) { killedDueToLimit = dueToLimit; child.kill(); } @@ -267,7 +271,7 @@ export function createGrepToolDefinition( reject: false, stdio: ["ignore", "pipe", "pipe"], }); - releaseChildProcessOutputAfterExit(spawnedChild); + releaseChildProcessOutputAfterExit(spawnedChild.nodeChildProcess); child = spawnedChild; rl = createInterface({ input: spawnedChild.stdout }); let stderr = ""; @@ -358,11 +362,11 @@ export function createGrepToolDefinition( } }); - spawnedChild.on("error", (error) => { + spawnedChild.nodeChildProcess.on("error", (error) => { childClosed = true; settle(() => reject(new Error(`Failed to run ripgrep: ${error.message}`))); }); - spawnedChild.on("close", (code) => { + spawnedChild.nodeChildProcess.on("close", (code) => { childClosed = true; void (async () => { if (settled) { diff --git a/src/gateway/server-methods/open-path.test.ts b/src/gateway/server-methods/open-path.test.ts index d532d8f52897..b97285db2417 100644 --- a/src/gateway/server-methods/open-path.test.ts +++ b/src/gateway/server-methods/open-path.test.ts @@ -18,7 +18,7 @@ function fakeChild(result: Promise) { const kill = vi.fn(); const stderr = new PassThrough(); return { - child: Object.assign(result, { kill, stderr, unref }), + child: Object.assign(result, { kill, stderr, nodeChildProcess: { unref } }), kill, stderr, unref, diff --git a/src/gateway/server-methods/open-path.ts b/src/gateway/server-methods/open-path.ts index ff3f92c5b9d2..6a8941d94a37 100644 --- a/src/gateway/server-methods/open-path.ts +++ b/src/gateway/server-methods/open-path.ts @@ -46,7 +46,7 @@ async function observeXdgOpenStartup(command: OpenPathCommand): Promise { reject: true, stdio: ["ignore", "ignore", "pipe"], }); - child.unref(); + child.nodeChildProcess.unref(); let stderrText = ""; const stderr = child.stderr; stderr?.setEncoding("utf8"); diff --git a/src/logging/logger.ts b/src/logging/logger.ts index 520aa7c2df75..242604445d82 100644 --- a/src/logging/logger.ts +++ b/src/logging/logger.ts @@ -584,7 +584,6 @@ export function isFileLogLevelEnabled(level: LogLevel): boolean { function buildLogger(settings: ResolvedRuntimeSettings): TsLogger { const logger = new TsLogger({ name: "openclaw", - // Custom structured redaction runs at each transport boundary; avoid tslog pre-masking divergent records. maskValuesOfKeys: [], minLevel: levelToMinLevel(settings.level), type: "hidden", // no ansi formatting diff --git a/src/process/child-process.test.ts b/src/process/child-process.test.ts index ced476fccbef..843a854c64ec 100644 --- a/src/process/child-process.test.ts +++ b/src/process/child-process.test.ts @@ -26,7 +26,7 @@ describe.skipIf(process.platform === "win32")("releaseChildProcessOutputAfterExi reject: false, stdio: ["ignore", "pipe", "pipe"], }); - const releaseOutput = releaseChildProcessOutputAfterExit(child); + const releaseOutput = releaseChildProcessOutputAfterExit(child.nodeChildProcess); let output = ""; child.stdout?.on("data", (chunk: Buffer) => { output += chunk.toString(); @@ -36,7 +36,7 @@ describe.skipIf(process.platform === "win32")("releaseChildProcessOutputAfterExi // writes while JS is parked, so its pipe data and the idle timer are both // ready when the event loop resumes. await new Promise((resolve) => { - child?.once("exit", () => { + child?.nodeChildProcess.once("exit", () => { Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, 250); resolve(); }); @@ -53,7 +53,7 @@ describe.skipIf(process.platform === "win32")("releaseChildProcessOutputAfterExi reject: false, stdio: ["ignore", "pipe", "pipe"], }); - const releaseOutput = releaseChildProcessOutputAfterExit(child); + const releaseOutput = releaseChildProcessOutputAfterExit(child.nodeChildProcess); let output = ""; child.stdout?.on("data", (chunk: Buffer) => { output += chunk.toString(); diff --git a/src/process/exec-runner.ts b/src/process/exec-runner.ts index f3d2e8bc3bf7..53068c51c59e 100644 --- a/src/process/exec-runner.ts +++ b/src/process/exec-runner.ts @@ -170,13 +170,14 @@ async function runCommandWithOutputEncoding( stripFinalNewline: false, windowsVerbatimArguments: options.windowsVerbatimArguments, }); - const releaseOutput = releaseChildProcessOutputAfterExit(child); - child.once("exit", (code, signalValue) => { + const nodeChild = child.nodeChildProcess; + const releaseOutput = releaseChildProcessOutputAfterExit(nodeChild); + nodeChild.once("exit", (code, signalValue) => { childExited = true; childExitState = { code, signal: signalValue }; }); const terminationController = createCommandTerminationController({ - child, + child: nodeChild, cancelController, baseEnv, env, @@ -374,7 +375,7 @@ async function runCommandWithOutputEncoding( const isCauseLessWindowsShimResult = !termination && invocation.usesWindowsExitCodeShim && - typeof child.pid === "number" && + typeof nodeChild.pid === "number" && result.code === undefined && result.cause === undefined && !result.timedOut && @@ -392,8 +393,8 @@ async function runCommandWithOutputEncoding( if ( childExitState?.code != null || childExitState?.signal != null || - child.exitCode != null || - child.signalCode != null + nodeChild.exitCode != null || + nodeChild.signalCode != null ) { break; } @@ -421,10 +422,10 @@ async function runCommandWithOutputEncoding( throw error; } - const resolvedSignal = result.signal ?? childExitState?.signal ?? child.signalCode ?? null; + const resolvedSignal = result.signal ?? childExitState?.signal ?? nodeChild.signalCode ?? null; const resolvedCode = resolveProcessExitCode({ explicitCode: result.exitCode ?? childExitState?.code, - childExitCode: child.exitCode, + childExitCode: nodeChild.exitCode, resolvedSignal, usesWindowsExitCodeShim: invocation.usesWindowsExitCodeShim, timedOut: termination === "timeout", @@ -474,7 +475,7 @@ async function runCommandWithOutputEncoding( }; return { - pid: child.pid, + pid: nodeChild.pid, stdout: decodeCapturedOutput(stdoutCapture, stdoutCaptureMode), stderr: decodeCapturedOutput(stderrCapture, stderrCaptureMode), stdoutTruncatedBytes: stdoutCapture.truncatedBytes || undefined, @@ -485,7 +486,7 @@ async function runCommandWithOutputEncoding( stderrCapture.preservedLines.length > 0 ? stderrCapture.preservedLines : undefined, code: normalizedCode, signal: resolvedSignal, - killed: child.killed, + killed: nodeChild.killed, termination: termination === "output-limit" ? "signal" : termination, noOutputTimedOut: termination === "no-output-timeout", outputLimitExceeded: termination === "output-limit" || undefined, diff --git a/src/process/exec-spawn.ts b/src/process/exec-spawn.ts index d9c373c86489..3a02025a586d 100644 --- a/src/process/exec-spawn.ts +++ b/src/process/exec-spawn.ts @@ -55,13 +55,8 @@ export function shouldSpawnWithShell(params: { return false; } -type SpawnCommandOptions = Omit< - ExecaOptions, - "env" | "extendEnv" | "shell" | "windowsHide" | "windowsVerbatimArguments" -> & { +type SpawnCommandOptions = ExecaOptions & { baseEnv?: NodeJS.ProcessEnv; - env?: NodeJS.ProcessEnv; - windowsVerbatimArguments?: boolean; }; export function spawnCommandWithInvocation< @@ -88,7 +83,7 @@ export function spawnCommandWithInvocation< shell: false, windowsHide: invocation.windowsHide, windowsVerbatimArguments: invocation.windowsVerbatimArguments, - }) as unknown as ResultPromise; + } as ExecaOptions) as unknown as ResultPromise; return { child, invocation }; } diff --git a/src/process/exec.ts b/src/process/exec.ts index 23ee6c9ebfad..76fdc1e12565 100644 --- a/src/process/exec.ts +++ b/src/process/exec.ts @@ -61,7 +61,7 @@ export async function runExec( stripFinalNewline: false, timeout, }); - const releaseOutput = releaseChildProcessOutputAfterExit(subprocess); + const releaseOutput = releaseChildProcessOutputAfterExit(subprocess.nodeChildProcess); const { stdout, stderr } = await subprocess.finally(releaseOutput); const windowsEncoding = resolveWindowsConsoleEncoding(); const decodedStdout = decodeWindowsOutputBuffer({ diff --git a/src/process/exec.windows.test.ts b/src/process/exec.windows.test.ts index 18fe86ec8b6d..a4b8e3c6064d 100644 --- a/src/process/exec.windows.test.ts +++ b/src/process/exec.windows.test.ts @@ -28,6 +28,7 @@ type MockResult = { }; type MockSubprocess = EventEmitter & { + nodeChildProcess: MockSubprocess; exitCode: number | null; finish: (result?: Partial) => void; kill: ReturnType; @@ -53,6 +54,7 @@ function createMockSubprocess(params?: { stdoutChunks?: Buffer[]; }): MockSubprocess { const child = new EventEmitter() as MockSubprocess; + child.nodeChildProcess = child; child.pid = 1234; child.exitCode = null; child.signalCode = null; @@ -67,7 +69,7 @@ function createMockSubprocess(params?: { const completion = new Promise((resolvePromise) => { resolve = resolvePromise; }); - // oxlint-disable-next-line unicorn/no-thenable -- Stub matches Execa's event-emitting promise shape. + // oxlint-disable-next-line unicorn/no-thenable -- Stub combines Execa's promise with its exposed Node child. child.then = completion.then.bind(completion); child.catch = completion.catch.bind(completion); child.finally = completion.finally.bind(completion); diff --git a/test/scripts/check-workflows.test.ts b/test/scripts/check-workflows.test.ts index 5d7710174dba..1251acde81cf 100644 --- a/test/scripts/check-workflows.test.ts +++ b/test/scripts/check-workflows.test.ts @@ -71,7 +71,7 @@ describe("check-workflows", () => { expect(result.status).toBe(0); expect(readFileSync(markerPath, "utf8")).toContain( - "github.com/rhysd/actionlint/cmd/actionlint@v1.7.11", + "github.com/rhysd/actionlint/cmd/actionlint@v1.7.12", ); const preCommitArgs = readFileSync(preCommitMarkerPath, "utf8"); expect(preCommitArgs).toContain("run --config .pre-commit-config.yaml zizmor --files"); diff --git a/test/scripts/openclaw-performance-workflow.test.ts b/test/scripts/openclaw-performance-workflow.test.ts index f1dcf64aa214..835c95b62907 100644 --- a/test/scripts/openclaw-performance-workflow.test.ts +++ b/test/scripts/openclaw-performance-workflow.test.ts @@ -112,9 +112,9 @@ describe("OpenClaw performance workflow", () => { const workflow = readFileSync(WORKFLOW, "utf8"); const installRun = findStep("Install OCM and Kova").run ?? ""; - expect(workflow).toContain("OCM_VERSION: v0.2.25"); + expect(workflow).toContain("OCM_VERSION: v0.2.29"); expect(workflow).toContain( - "OCM_LINUX_X64_SHA256: 57530199d21eb5bfa29695749928b40fd2869484c7edff69b7c65bfc84f2f1aa", + "OCM_LINUX_X64_SHA256: d966098d6ba2bc10891be3c76e162a37b07f28c4f51da75d2eb509886eb7e1cf", ); expect(installRun).toContain( '"https://github.com/shakkernerd/ocm/releases/download/${OCM_VERSION}/ocm-x86_64-unknown-linux-gnu.tar.gz"', diff --git a/test/scripts/parallels-smoke-model.test.ts b/test/scripts/parallels-smoke-model.test.ts index 302187e84754..3c7161e9f1a8 100644 --- a/test/scripts/parallels-smoke-model.test.ts +++ b/test/scripts/parallels-smoke-model.test.ts @@ -1455,8 +1455,8 @@ exit 0 expect(combined).toContain("MinGit-"); expect(combined).toContain("portable-git"); expect(combined).toContain("where.exe git.exe"); - expect(windowsGit.indexOf('"MinGit-2.53.0.2-64-bit.zip"')).toBeLessThan( - windowsGit.indexOf('"MinGit-2.53.0.2-arm64.zip"'), + expect(windowsGit.indexOf('"MinGit-2.55.0.3-64-bit.zip"')).toBeLessThan( + windowsGit.indexOf('"MinGit-2.55.0.3-arm64.zip"'), ); expect( combined.match(/curl\.exe -fsSL --connect-timeout 10 --max-time 120 --retry 2/g), diff --git a/test/scripts/parallels-windows-git.test.ts b/test/scripts/parallels-windows-git.test.ts index 1e2ba06bb7a3..fb42f6a7310d 100644 --- a/test/scripts/parallels-windows-git.test.ts +++ b/test/scripts/parallels-windows-git.test.ts @@ -20,7 +20,7 @@ import { prepareMinGitZip } from "../../scripts/e2e/parallels/windows-git.ts"; describe("Parallels Windows MinGit preparation", () => { it("bounds the host asset download across connections, transfers, and retries", async () => { - const assetName = "MinGit-2.53.0.2-64-bit.zip"; + const assetName = "MinGit-2.55.0.3-64-bit.zip"; const assetUrl = `https://example.test/${assetName}`; const targetDir = path.join("tmp", "windows-smoke"); const targetPath = path.join(targetDir, assetName); diff --git a/test/scripts/run-opengrep.test.ts b/test/scripts/run-opengrep.test.ts index f536dc004b45..5cf7bd809951 100644 --- a/test/scripts/run-opengrep.test.ts +++ b/test/scripts/run-opengrep.test.ts @@ -113,7 +113,7 @@ describe("run-opengrep.sh", () => { ); expect(sarif.version).toBe("2.1.0"); expect(sarif.runs[0].tool.driver.name).toBe("Opengrep OSS"); - expect(sarif.runs[0].tool.driver.semanticVersion).toBe("1.22.0"); + expect(sarif.runs[0].tool.driver.semanticVersion).toBe("1.25.0"); expect(sarif.runs[0].results).toEqual([]); expect(fs.existsSync(argsPath)).toBe(false); }); diff --git a/ui/package.json b/ui/package.json index d2725a521301..4fb87b651915 100644 --- a/ui/package.json +++ b/ui/package.json @@ -46,7 +46,7 @@ "jsdom": "29.1.1", "openclaw": "workspace:*", "playwright": "1.61.1", - "vite": "8.1.3", + "vite": "8.1.5", "vitest": "4.1.10" } }