diff --git a/knip.config.ts b/knip.config.ts index fc4565d..80a3083 100644 --- a/knip.config.ts +++ b/knip.config.ts @@ -38,7 +38,16 @@ const config: KnipConfig = { // (see realtime-vad-silero/silero-adapter.ts); knip can't see the indirect // specifier. "avr-vad", + // @step-cli/agent-sdk is consumed by extensions/realtime-voice (not matched by + // the root workspace's src/**/*.ts project glob), so knip flags it as unused + // from the root perspective even though it is a valid workspace dependency. + "@step-cli/agent-sdk", ], + ignoreIssues: { + // rg (ripgrep) is an external system binary spawned by shell-tools.ts; + // not a Node.js package binary declared in package.json. + "packages/core/src/tools/native-impls/shell-tools.ts": ["binaries"], + }, ignoreExportsUsedInFile: true, treatConfigHintsAsErrors: false, }; diff --git a/package.json b/package.json index 7c340ac..fe128fa 100644 --- a/package.json +++ b/package.json @@ -40,6 +40,7 @@ "dependencies": { "@opentui/core": "^0.1.90", "@opentui/react": "^0.1.90", + "@step-cli/agent-sdk": "workspace:*", "@step-cli/core": "workspace:*", "@step-cli/llm": "workspace:*", "@step-cli/mcp": "workspace:*", diff --git a/packages/core/src/agent/harness.ts b/packages/core/src/agent/harness.ts index dd64605..b963456 100644 --- a/packages/core/src/agent/harness.ts +++ b/packages/core/src/agent/harness.ts @@ -63,6 +63,7 @@ export interface AgentHarnessOptions { allowedTools?: string[]; hooks?: AgentLoopOptions["hooks"]; signal?: AbortSignal; + model?: string; } export interface AgentHarnessState { @@ -450,7 +451,7 @@ export class AgentHarnessFactory { } const agent = new AgentLoop({ - model: this.model, + model: options.model ?? this.model, client: this.client, memory, tools, diff --git a/packages/protocol/src/index.ts b/packages/protocol/src/index.ts index b121618..a8e9976 100644 --- a/packages/protocol/src/index.ts +++ b/packages/protocol/src/index.ts @@ -1065,6 +1065,22 @@ export interface StepCliSessionClarificationSubmissionResult { response: UserClarificationResponse; } +/** + * Result of executing a slash command through the gateway. + * + * - `handled`: Whether the gateway recognized and handled the command. + * - `message`: Human-readable summary of the command result (may be null when + * the gateway already displayed output via the interactive UI). + * - `taskText`: When non-null, the caller should submit this text as a regular + * prompt (e.g. `/swarm ` enters swarm mode and returns the task text + * for the caller to run through the normal turn queue). + */ +export interface StepCliSlashCommandResult { + handled: boolean; + message: string | null; + taskText: string | null; +} + export interface StepGateway { listSessions(): Promise; getSession(sessionId: string): Promise; @@ -1122,6 +1138,10 @@ export interface StepGateway { prompt: string | UserTurnInput, signal?: AbortSignal, ): Promise; + executeSlashCommand( + sessionId: string, + commandLine: string, + ): Promise; getPendingClarification( sessionId: string, ): Promise; diff --git a/packages/sdk/src/index.ts b/packages/sdk/src/index.ts index 01cedcd..184d24a 100644 --- a/packages/sdk/src/index.ts +++ b/packages/sdk/src/index.ts @@ -12,6 +12,7 @@ import type { StepCliSessionDescriptor, StepCliSessionRunResult, StepCliSessionSnapshotResult, + StepCliSlashCommandResult, StepCliSessionWakeReceipt, StepCliSessionWakeRequest, StepCliStartGoalRequest, @@ -117,6 +118,13 @@ export class StepCliSdk { return await this.gateway.runPrompt(sessionId, prompt, signal); } + async executeSlashCommand( + sessionId: string, + commandLine: string, + ): Promise { + return await this.gateway.executeSlashCommand(sessionId, commandLine); + } + async getPendingClarification( sessionId: string, ): Promise { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6844fae..3274bdf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,10 +9,13 @@ importers: dependencies: "@opentui/core": specifier: ^0.1.90 - version: 0.1.90(stage-js@1.0.1)(typescript@5.7.3)(web-tree-sitter@0.25.10) + version: 0.1.107(stage-js@1.0.2)(typescript@5.7.3)(web-tree-sitter@0.25.10) "@opentui/react": specifier: ^0.1.90 - version: 0.1.90(react-devtools-core@7.0.1)(react@19.2.4)(stage-js@1.0.1)(typescript@5.7.3)(web-tree-sitter@0.25.10)(ws@8.20.0) + version: 0.1.107(react-devtools-core@7.0.1)(react@19.2.7)(stage-js@1.0.2)(typescript@5.7.3)(web-tree-sitter@0.25.10)(ws@8.21.0) + "@step-cli/agent-sdk": + specifier: workspace:* + version: link:packages/agent-sdk "@step-cli/core": specifier: workspace:* version: link:packages/core @@ -51,10 +54,10 @@ importers: version: 16.6.1 react: specifier: ^19.2.4 - version: 19.2.4 + version: 19.2.7 yaml: specifier: ^2.8.2 - version: 2.8.3 + version: 2.9.0 devDependencies: "@opentui/core-darwin-arm64": specifier: 0.1.90 @@ -73,28 +76,28 @@ importers: version: 0.1.90 "@types/node": specifier: ^25.5.0 - version: 25.5.0 + version: 25.9.4 "@types/react": specifier: ^18.3.12 - version: 18.3.28 + version: 18.3.31 "@vitest/coverage-v8": specifier: ^3.2.6 - version: 3.2.6(vitest@3.2.6(@types/node@25.5.0)(lightningcss@1.32.0)) + version: 3.2.6(vitest@3.2.6(@types/node@25.9.4)) concurrently: specifier: ^9.2.1 - version: 9.2.1 + version: 9.2.3 dependency-cruiser: specifier: ^17.3.9 - version: 17.3.9 + version: 17.4.3 knip: specifier: ^6.0.4 - version: 6.0.4 + version: 6.20.0 oxlint: specifier: ~0.15.15 version: 0.15.15 prettier: specifier: ^3.8.1 - version: 3.8.1 + version: 3.8.4 rolldown: specifier: 1.0.0-beta.7 version: 1.0.0-beta.7(typescript@5.7.3) @@ -118,7 +121,7 @@ importers: version: 5.7.3 vitest: specifier: ^3.2.0 - version: 3.2.6(@types/node@25.5.0)(lightningcss@1.32.0) + version: 3.2.6(@types/node@25.9.4) apps/desktop: {} @@ -138,7 +141,7 @@ importers: dependencies: "@modelcontextprotocol/sdk": specifier: ^1.25.2 - version: 1.27.1(zod@4.3.6) + version: 1.29.0(zod@4.4.3) "@step-cli/core": specifier: workspace:* version: link:../../packages/core @@ -153,7 +156,7 @@ importers: version: link:../../packages/realtime ws: specifier: ^8.18.0 - version: 8.20.0 + version: 8.21.0 extensions/realtime-vad-silero: dependencies: @@ -168,7 +171,7 @@ importers: dependencies: "@opentui/react": specifier: ^0.1.90 - version: 0.1.90(react-devtools-core@7.0.1)(react@19.2.4)(stage-js@1.0.1)(typescript@5.7.3)(web-tree-sitter@0.25.10)(ws@8.20.0) + version: 0.1.107(react-devtools-core@7.0.1)(react@19.2.7)(stage-js@1.0.2)(typescript@5.7.3)(web-tree-sitter@0.25.10)(ws@8.21.0) "@step-cli/agent-sdk": specifier: workspace:* version: link:../../packages/agent-sdk @@ -180,7 +183,7 @@ importers: version: link:../../packages/realtime react: specifier: ^19.2.4 - version: 19.2.4 + version: 19.2.7 packages/agent-sdk: dependencies: @@ -212,7 +215,7 @@ importers: version: 9.14.0 ws: specifier: ^8.18.0 - version: 8.20.0 + version: 8.21.0 devDependencies: "@types/ws": specifier: ^8.5.13 @@ -246,7 +249,7 @@ importers: version: link:../../packages/utils yaml: specifier: ^2.8.2 - version: 2.8.3 + version: 2.9.0 ui: dependencies: @@ -259,16 +262,16 @@ importers: devDependencies: "@types/react": specifier: ^18.3.12 - version: 18.3.28 + version: 18.3.31 "@types/react-dom": specifier: ^18.3.1 - version: 18.3.7(@types/react@18.3.28) + version: 18.3.7(@types/react@18.3.31) "@vitejs/plugin-react": specifier: ^4.4.1 - version: 4.7.0(vite@5.4.21(@types/node@25.5.0)(lightningcss@1.32.0)) + version: 4.7.0(vite@5.4.21(@types/node@25.9.4)) vite: specifier: ^5.4.19 - version: 5.4.21(@types/node@25.5.0)(lightningcss@1.32.0) + version: 5.4.21(@types/node@25.9.4) packages: "@ampproject/remapping@2.3.0": @@ -278,75 +281,68 @@ packages: } engines: { node: ">=6.0.0" } - "@babel/code-frame@7.29.0": + "@babel/code-frame@7.29.7": resolution: { - integrity: sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==, + integrity: sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==, } engines: { node: ">=6.9.0" } - "@babel/compat-data@7.29.0": + "@babel/compat-data@7.29.7": resolution: { - integrity: sha512-T1NCJqT/j9+cn8fvkt7jtwbLBfLC/1y1c7NtCeXFRgzGTsafi68MRv8yzkYSapBnFA6L3U2VSc02ciDzoAJhJg==, + integrity: sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==, } engines: { node: ">=6.9.0" } - "@babel/core@7.29.0": + "@babel/core@7.29.7": resolution: { - integrity: sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==, + integrity: sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==, } engines: { node: ">=6.9.0" } - "@babel/generator@7.29.1": + "@babel/generator@7.29.7": resolution: { - integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==, + integrity: sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==, } engines: { node: ">=6.9.0" } - "@babel/helper-compilation-targets@7.28.6": + "@babel/helper-compilation-targets@7.29.7": resolution: { - integrity: sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==, + integrity: sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==, } engines: { node: ">=6.9.0" } - "@babel/helper-globals@7.28.0": + "@babel/helper-globals@7.29.7": resolution: { - integrity: sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==, + integrity: sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==, } engines: { node: ">=6.9.0" } - "@babel/helper-module-imports@7.28.6": + "@babel/helper-module-imports@7.29.7": resolution: { - integrity: sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==, + integrity: sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==, } engines: { node: ">=6.9.0" } - "@babel/helper-module-transforms@7.28.6": + "@babel/helper-module-transforms@7.29.7": resolution: { - integrity: sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==, + integrity: sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0 - "@babel/helper-plugin-utils@7.28.6": + "@babel/helper-plugin-utils@7.29.7": resolution: { - integrity: sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==, - } - engines: { node: ">=6.9.0" } - - "@babel/helper-string-parser@7.27.1": - resolution: - { - integrity: sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==, + integrity: sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==, } engines: { node: ">=6.9.0" } @@ -357,13 +353,6 @@ packages: } engines: { node: ">=6.9.0" } - "@babel/helper-validator-identifier@7.28.5": - resolution: - { - integrity: sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==, - } - engines: { node: ">=6.9.0" } - "@babel/helper-validator-identifier@7.29.7": resolution: { @@ -371,28 +360,20 @@ packages: } engines: { node: ">=6.9.0" } - "@babel/helper-validator-option@7.27.1": + "@babel/helper-validator-option@7.29.7": resolution: { - integrity: sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==, + integrity: sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==, } engines: { node: ">=6.9.0" } - "@babel/helpers@7.29.2": + "@babel/helpers@7.29.7": resolution: { - integrity: sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==, + integrity: sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==, } engines: { node: ">=6.9.0" } - "@babel/parser@7.29.2": - resolution: - { - integrity: sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==, - } - engines: { node: ">=6.0.0" } - hasBin: true - "@babel/parser@7.29.7": resolution: { @@ -401,42 +382,35 @@ packages: engines: { node: ">=6.0.0" } hasBin: true - "@babel/plugin-transform-react-jsx-self@7.27.1": + "@babel/plugin-transform-react-jsx-self@7.29.7": resolution: { - integrity: sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==, + integrity: sha512-TL0hMc9xzy86VD31nUiwzd5otRAcyEPcsegCxolO0PvcXuH1v0kECe/UIznYFihpkvU5wg/jk4v0TTEFfm53fw==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/plugin-transform-react-jsx-source@7.27.1": + "@babel/plugin-transform-react-jsx-source@7.29.7": resolution: { - integrity: sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==, + integrity: sha512-06IyK09H3wi4cGbhDBwp5gUGo0IKtnYa8tyTiephirPCK6fbobVGiXMMI5zLQ4aKEYP3wZ3ArU44o+8KMrSG/Q==, } engines: { node: ">=6.9.0" } peerDependencies: "@babel/core": ^7.0.0-0 - "@babel/template@7.28.6": + "@babel/template@7.29.7": resolution: { - integrity: sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==, + integrity: sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==, } engines: { node: ">=6.9.0" } - "@babel/traverse@7.29.0": + "@babel/traverse@7.29.7": resolution: { - integrity: sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==, - } - engines: { node: ">=6.9.0" } - - "@babel/types@7.29.0": - resolution: - { - integrity: sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==, + integrity: sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==, } engines: { node: ">=6.9.0" } @@ -460,22 +434,34 @@ packages: integrity: sha512-bijvwWz6NHsNj5e5i1vtd3dU2pDhthSaTUZSh14DUGGKJfw8eMnlWZsxwHBxB/a3AXVNDjL9abuHw1k9FGR+jg==, } - "@emnapi/core@1.9.1": + "@emnapi/core@1.11.0": + resolution: + { + integrity: sha512-l9Oo58x0HOP5znGzVhYW9U3e5wVuA4LAZU2AGezTmkhO1CgQRFDhDg4nneHsu/t3WniXg9QrG2nIXL/ZS8ln8Q==, + } + + "@emnapi/core@1.11.1": resolution: { - integrity: sha512-mukuNALVsoix/w1BJwFzwXBN/dHeejQtuVzcDsfOEsdpCumXb/E9j8w11h5S54tT1xhifGfbbSm/ICrObRb3KA==, + integrity: sha512-RSvbQmHzdKzNsLYa/wHrbc3KN4sYLKAdPZxqiM2HATqv/SBk2/ENSHpvXGaLOMcsAyz0poEGqkmmKYG3OWiJEQ==, } - "@emnapi/runtime@1.9.1": + "@emnapi/runtime@1.11.0": resolution: { - integrity: sha512-VYi5+ZVLhpgK4hQ0TAjiQiZ6ol0oe4mBx7mVv7IflsiEp0OWoVsp/+f9Vc1hOhE0TtkORVrI1GvzyreqpgWtkA==, + integrity: sha512-55coeOFKHv1ywEcUXJtWU5f+Jr/W5tZDvZig8DLKSwUN1JpROQ4rk/SNOQiFWmaR/VKF4zuFyW1B8JduOSv6Pg==, } - "@emnapi/wasi-threads@1.2.0": + "@emnapi/runtime@1.11.1": resolution: { - integrity: sha512-N10dEJNSsUx41Z6pZsXU8FjPjpBEplgH24sfkmITrBED1/U2Esum9F3lfLrMjKHHjmi557zQn7kR9R+XWXu5Rg==, + integrity: sha512-vgj7R3y3Wgx24IQaGPA/R6YFXLHVMOZ0uVEyIQPaWs+rd1AzfEMXlAC22FYwO1XkKR6NPsq7mUandH8oIRdZFw==, + } + + "@emnapi/wasi-threads@1.2.2": + resolution: + { + integrity: sha512-c95qOXkHdydNKhscBTebqEC1CVAZpyqOfVfBzQ1qgzyl3gfeldUjIggDbIZgDKsHLgnsM+igH7TJ/eAasaVuMA==, } "@esbuild/aix-ppc64@0.21.5": @@ -919,10 +905,10 @@ packages: cpu: [x64] os: [win32] - "@hono/node-server@1.19.11": + "@hono/node-server@1.19.14": resolution: { - integrity: sha512-dr8/3zEaB+p0D2n/IUrlPF1HZm586qgJNXK1a9fhg/PzdtkK7Ksd5l312tJX2yBuALqDYBlG20QEbayqPyxn+g==, + integrity: sha512-GwtvgtXxnWsucXvbQXkRgqksiH2Qed37H9xHZocE5sA3N8O8O8/8FA3uclQXxXVzc9XBZuEOMK7+r02FmSpHtw==, } engines: { node: ">=18.14.1" } peerDependencies: @@ -1169,10 +1155,10 @@ packages: integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==, } - "@modelcontextprotocol/sdk@1.27.1": + "@modelcontextprotocol/sdk@1.29.0": resolution: { - integrity: sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==, + integrity: sha512-zo37mZA9hJWpULgkRpowewez1y6ML5GsXJPY8FI0tBBCd77HEvza4jDqRKOXgHNn867PVGCyTdzqpz0izu5ZjQ==, } engines: { node: ">=18" } peerDependencies: @@ -1188,11 +1174,14 @@ packages: integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==, } - "@napi-rs/wasm-runtime@1.1.1": + "@napi-rs/wasm-runtime@1.1.6": resolution: { - integrity: sha512-p64ah1M1ld8xjWv3qbvFwHiFVWrq1yFvV4f7w+mzaqiR4IlSgkqhcRdHwsGgomwzBH51sRY4NEowLxnaBjcW/A==, + integrity: sha512-ZLv/JdUfkvOy9eCnnBaGfiO+XimbjebAeO+MRQqD/B+FR1tnRN0tpKSJHRbE8sFfS6aqsXZ67TQjfwfsxULVbg==, } + peerDependencies: + "@emnapi/core": ^1.7.1 + "@emnapi/runtime": ^1.7.1 "@nodelib/fs.scandir@2.1.5": resolution: @@ -1215,6 +1204,14 @@ packages: } engines: { node: ">= 8" } + "@opentui/core-darwin-arm64@0.1.107": + resolution: + { + integrity: sha512-Yqt2/9Ntw0IdtPA/qmHvXCE16y4Jq5/btCmuzN9/opzqZ5rYGYYVtiBii3LezGcTZYuJQZthjvh8MLPXXwA2EQ==, + } + cpu: [arm64] + os: [darwin] + "@opentui/core-darwin-arm64@0.1.90": resolution: { @@ -1223,6 +1220,14 @@ packages: cpu: [arm64] os: [darwin] + "@opentui/core-darwin-x64@0.1.107": + resolution: + { + integrity: sha512-p6yeHsIWRLy/J30nZTyUuwgFYEpk8NS0H0Cmh9P8a1+eHA406MMMP4FAC0YpqlF4SHb7R7LNkUSsfCx9yMtS8w==, + } + cpu: [x64] + os: [darwin] + "@opentui/core-darwin-x64@0.1.90": resolution: { @@ -1231,6 +1236,14 @@ packages: cpu: [x64] os: [darwin] + "@opentui/core-linux-arm64@0.1.107": + resolution: + { + integrity: sha512-w6MpRTd06KUH4KdgH4x7rVB2I67KE62w3W3jQVBDEMeJejdJVOSwwUdgaTY9ffoHglcZc3WA2PFH1PCpgzna4A==, + } + cpu: [arm64] + os: [linux] + "@opentui/core-linux-arm64@0.1.90": resolution: { @@ -1239,6 +1252,14 @@ packages: cpu: [arm64] os: [linux] + "@opentui/core-linux-x64@0.1.107": + resolution: + { + integrity: sha512-oxKbIpWZRgY+8KQZ9dXq8lzDEhMVpBMCiZGDiHtK8/DP1MvK5kFE/vtwgUK9YkmT4OSgZsFeojjvyePXV+PcfQ==, + } + cpu: [x64] + os: [linux] + "@opentui/core-linux-x64@0.1.90": resolution: { @@ -1247,14 +1268,22 @@ packages: cpu: [x64] os: [linux] - "@opentui/core-win32-arm64@0.1.90": + "@opentui/core-win32-arm64@0.1.107": resolution: { - integrity: sha512-+sTRaOb7gCMZ6iLuuG4y9kzyweJzBDcIJN0Xh49ikFWTwVECDXEVtXahNGlw57avm2yYUoNzmpBjK/LV7zBj9A==, + integrity: sha512-T7hbLgoTkb5eAsP5GJdTRyDl48WI/hMEtj+BGlIITzSaOBSN7ZPCeblcfUz+uXrdF6g3dF1a9uyEQSJlzeGaKA==, } cpu: [arm64] os: [win32] + "@opentui/core-win32-x64@0.1.107": + resolution: + { + integrity: sha512-e/uFLPyKK/hFDvDZtTxp6L3Zx0FWuZv5Gf2qIKf/7FAAadD0hala+K41OJAmYWxu1X3cT5XozKCT8gN/S1N08A==, + } + cpu: [x64] + os: [win32] + "@opentui/core-win32-x64@0.1.90": resolution: { @@ -1263,46 +1292,46 @@ packages: cpu: [x64] os: [win32] - "@opentui/core@0.1.90": + "@opentui/core@0.1.107": resolution: { - integrity: sha512-Os2dviqWVETU3kaK36lbSvdcI93GAWhw0xb9ng/d0DWYuM9scRmAhLHiOayp61saWv/BR8OJXeuQYHvrp5rd6A==, + integrity: sha512-gadu9EtNR+sOGyHN0buZryllavkWHRkCcX4yW/1ldp/l7HGS52hvkjYmo+74cuzUcfds/5Rbw2cgiy0Z7RxXmQ==, } peerDependencies: web-tree-sitter: 0.25.10 - "@opentui/react@0.1.90": + "@opentui/react@0.1.107": resolution: { - integrity: sha512-uYojzdqDanib5zj/fN2ikHZe+D6zZckZrTgz45ndunozeGPTSt64oRqi9GDCrt26tzTSJHqjJGGJSoIRhNvwyg==, + integrity: sha512-BiREndm6Cro9jZvBOJeKGBJwk9KLo9t0UQSUGXxmUiqVKsjItbvawDX3POhxEfjvjKkmBRQ9AQ9wsMiIQYwmhw==, } peerDependencies: react: ">=19.0.0" react-devtools-core: ^7.0.1 ws: ^8.18.0 - "@oxc-parser/binding-android-arm-eabi@0.120.0": + "@oxc-parser/binding-android-arm-eabi@0.137.0": resolution: { - integrity: sha512-WU3qtINx802wOl8RxAF1v0VvmC2O4D9M8Sv486nLeQ7iPHVmncYZrtBhB4SYyX+XZxj2PNnCcN+PW21jHgiOxg==, + integrity: sha512-KDs+0VPdEmasOkpuJHW9V5WCF+cvYdMQv2Jd+aJXt+cxIx12NToRQRbXaRwUEDsZw+/jMk81Ve8ZFbjUkJTOwA==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm] os: [android] - "@oxc-parser/binding-android-arm64@0.120.0": + "@oxc-parser/binding-android-arm64@0.137.0": resolution: { - integrity: sha512-SEf80EHdhlbjZEgzeWm0ZA/br4GKMenDW3QB/gtyeTV1gStvvZeFi40ioHDZvds2m4Z9J1bUAUL8yn1/+A6iGg==, + integrity: sha512-WhALNzfy3x/RfC6bsqX+csavuUY0yHHE7XfgPE5M542uhoBZUUoGTPG+nkMbGoG4+gcfss5s7urMyn5QBHu0sw==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [android] - "@oxc-parser/binding-darwin-arm64@0.120.0": + "@oxc-parser/binding-darwin-arm64@0.137.0": resolution: { - integrity: sha512-xVrrbCai8R8CUIBu3CjryutQnEYhZqs1maIqDvtUCFZb8vY33H7uh9mHpL3a0JBIKoBUKjPH8+rzyAeXnS2d6A==, + integrity: sha512-bFPr5hgmNMOMoyPTGtdsK4Ug21RovIPojRMgDDhSp1LtCnc/DkLwGONKjgRjszg677RlGnkYSviQ8hHaUPOVYA==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] @@ -1317,10 +1346,10 @@ packages: cpu: [arm64] os: [darwin] - "@oxc-parser/binding-darwin-x64@0.120.0": + "@oxc-parser/binding-darwin-x64@0.137.0": resolution: { - integrity: sha512-xyHBbnJ6mydnQUH7MAcafOkkrNzQC6T+LXgDH/3InEq2BWl/g424IMRiJVSpVqGjB+p2bd0h0WRR8iIwzjU7rw==, + integrity: sha512-CL5dMm1asqXIDZHg14FLxj3Mc36w8PI7xCWh1uA4is6z8g2XrIILoTcQYOxDbwzuk34RDPX5IAGUxZr6LA9KAg==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] @@ -1335,19 +1364,19 @@ packages: cpu: [x64] os: [darwin] - "@oxc-parser/binding-freebsd-x64@0.120.0": + "@oxc-parser/binding-freebsd-x64@0.137.0": resolution: { - integrity: sha512-UMnVRllquXUYTeNfFKmxTTEdZ/ix1nLl0ducDzMSREoWYGVIHnOOxoKMWlCOvRr9Wk/HZqo2rh1jeumbPGPV9A==, + integrity: sha512-79h8rYGnSlKPGWo7mHr2ixO6ea7aW8B0CT965SZ8SLbNnCOH5aOYBTeVXUY6eMvEaiLyWr8Skuiugr5pDYgLGw==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] os: [freebsd] - "@oxc-parser/binding-linux-arm-gnueabihf@0.120.0": + "@oxc-parser/binding-linux-arm-gnueabihf@0.137.0": resolution: { - integrity: sha512-tkvn2CQ7QdcsMnpfiX3fd3wA3EFsWKYlcQzq9cFw/xc89Al7W6Y4O0FgLVkVQpo0Tnq/qtE1XfkJOnRRA9S/NA==, + integrity: sha512-ASgmlSimhGyr0lksgVIo6hibz1obnDq4qJbiMX/AzltfgPnanRrzG1Q+23g8ljOHOjv6dsznkUuCYL3gg0sY1Q==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm] @@ -1362,23 +1391,24 @@ packages: cpu: [arm] os: [linux] - "@oxc-parser/binding-linux-arm-musleabihf@0.120.0": + "@oxc-parser/binding-linux-arm-musleabihf@0.137.0": resolution: { - integrity: sha512-WN5y135Ic42gQDk9grbwY9++fDhqf8knN6fnP+0WALlAUh4odY/BDK1nfTJRSfpJD9P3r1BwU0m3pW2DU89whQ==, + integrity: sha512-AU2J9aa22Sx32wRGnDjybOU9TQXXQUud5sdUi+ZB0XxwM8aToWLweV+yA0wlQm0yIUVqljquqoHCYEq9II8gJQ==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm] os: [linux] - "@oxc-parser/binding-linux-arm64-gnu@0.120.0": + "@oxc-parser/binding-linux-arm64-gnu@0.137.0": resolution: { - integrity: sha512-1GgQBCcXvFMw99EPdMy+4NZ3aYyXsxjf9kbUUg8HuAy3ZBXzOry5KfFEzT9nqmgZI1cuetvApkiJBZLAPo8uaw==, + integrity: sha512-GdEtiG89yMr7XkUGxifgodXEEm2f+xW2f9CpDjlgAnBOwhTmrpQMvhOGobLVKUyzf/qHBXW16smk5zbF3nZU6w==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [linux] + libc: [glibc] "@oxc-parser/binding-linux-arm64-gnu@0.68.1": resolution: @@ -1388,15 +1418,17 @@ packages: engines: { node: ">=14.0.0" } cpu: [arm64] os: [linux] + libc: [glibc] - "@oxc-parser/binding-linux-arm64-musl@0.120.0": + "@oxc-parser/binding-linux-arm64-musl@0.137.0": resolution: { - integrity: sha512-gmMQ70gsPdDBgpcErvJEoWNBr7bJooSLlvOBVBSGfOzlP5NvJ3bFvnUeZZ9d+dPrqSngtonf7nyzWUTUj/U+lw==, + integrity: sha512-EGJ+Bs8iXx8KBH8DQ5BLoEm5lnHaYjlh4/8j8vFhrr/6z4tqONy5BZDzLpKmmNWlN6Hlc5r8YOuBVHqZ9vRFEQ==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [linux] + libc: [musl] "@oxc-parser/binding-linux-arm64-musl@0.68.1": resolution: @@ -1406,51 +1438,57 @@ packages: engines: { node: ">=14.0.0" } cpu: [arm64] os: [linux] + libc: [musl] - "@oxc-parser/binding-linux-ppc64-gnu@0.120.0": + "@oxc-parser/binding-linux-ppc64-gnu@0.137.0": resolution: { - integrity: sha512-T/kZuU0ajop0xhzVMwH5r3srC9Nqup5HaIo+3uFjIN5uPxa0LvSxC1ZqP4aQGJVW5G0z8/nCkjIfSMS91P/wzw==, + integrity: sha512-vzFUQENy/fnbSe5DZWovq6tIBc1uhuMztanSW6rz1e9WdQE4gHwYuD7ZII6JnrJifd1R3RSoqiZbgRFlVL2tYQ==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [ppc64] os: [linux] + libc: [glibc] - "@oxc-parser/binding-linux-riscv64-gnu@0.120.0": + "@oxc-parser/binding-linux-riscv64-gnu@0.137.0": resolution: { - integrity: sha512-vn21KXLAXzaI3N5CZWlBr1iWeXLl9QFIMor7S1hUjUGTeUuWCoE6JZB040/ZNDwf+JXPX8Ao9KbmJq9FMC2iGw==, + integrity: sha512-SfVI14HBQs9gtLcUD5hTt5hsNbdrqSUNg9S8muN+LhVQ5nf1WwH3hAoK6B9NKgdYgWAQSXFXGiiBedQ4r/BKuw==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [riscv64] os: [linux] + libc: [glibc] - "@oxc-parser/binding-linux-riscv64-musl@0.120.0": + "@oxc-parser/binding-linux-riscv64-musl@0.137.0": resolution: { - integrity: sha512-SUbUxlar007LTGmSLGIC5x/WJvwhdX+PwNzFJ9f/nOzZOrCFbOT4ikt7pJIRg1tXVsEfzk5mWpGO1NFiSs4PIw==, + integrity: sha512-e7Ppy4FCIFNQxT/ikSeIWFoQ0l+N9vgtRBtLcyZXeolTzApyVoPqEXsYPrcdM/9i0Bwk8knvYd37vaEMxHyi6g==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [riscv64] os: [linux] + libc: [musl] - "@oxc-parser/binding-linux-s390x-gnu@0.120.0": + "@oxc-parser/binding-linux-s390x-gnu@0.137.0": resolution: { - integrity: sha512-hYiPJTxyfJY2+lMBFk3p2bo0R9GN+TtpPFlRqVchL1qvLG+pznstramHNvJlw9AjaoRUHwp9IKR7UZQnRPGjgQ==, + integrity: sha512-Bho5qFwdhqsIFR7gipYEUlqvi3SRrY8sugxXig380MIaakBB1PyU9+7dBiBVScfImTNWhijUxdBwqrprGdq5WA==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [s390x] os: [linux] + libc: [glibc] - "@oxc-parser/binding-linux-x64-gnu@0.120.0": + "@oxc-parser/binding-linux-x64-gnu@0.137.0": resolution: { - integrity: sha512-q+5jSVZkprJCIy3dzJpApat0InJaoxQLsJuD6DkX8hrUS61z2lHQ1Fe9L2+TYbKHXCLWbL0zXe7ovkIdopBGMQ==, + integrity: sha512-36mGWtg7PyFzjJwGDkH6/F4o2nIDEoKXLPr/X/lwqklkomQwJJt1I5GJVmGhovUEmgPK5WAeAZMqlFCehwiy9Q==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] os: [linux] + libc: [glibc] "@oxc-parser/binding-linux-x64-gnu@0.68.1": resolution: @@ -1460,15 +1498,17 @@ packages: engines: { node: ">=14.0.0" } cpu: [x64] os: [linux] + libc: [glibc] - "@oxc-parser/binding-linux-x64-musl@0.120.0": + "@oxc-parser/binding-linux-x64-musl@0.137.0": resolution: { - integrity: sha512-D9QDDZNnH24e7X4ftSa6ar/2hCavETfW3uk0zgcMIrZNy459O5deTbWrjGzZiVrSWigGtlQwzs2McBP0QsfV1w==, + integrity: sha512-/Jqx6+N7A44n2BdvUr7pXhVr2vFjs6WGH3unZRczwrfiH0H1zY0QwKQMG/dtRiTlKGDKGukznPT8lx84/oEsZg==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] os: [linux] + libc: [musl] "@oxc-parser/binding-linux-x64-musl@0.68.1": resolution: @@ -1478,22 +1518,23 @@ packages: engines: { node: ">=14.0.0" } cpu: [x64] os: [linux] + libc: [musl] - "@oxc-parser/binding-openharmony-arm64@0.120.0": + "@oxc-parser/binding-openharmony-arm64@0.137.0": resolution: { - integrity: sha512-TBU8ZwOUWAOUWVfmI16CYWbvh4uQb9zHnGBHsw5Cp2JUVG044OIY1CSHODLifqzQIMTXvDvLzcL89GGdUIqNrA==, + integrity: sha512-9Uj0qHNNl+OgT1UTGwF7ixIXU6T1u2SbMidmgPy/h1h/fl2gRS6YpAxxY1gwHofcWjoTwkoMFd8xs5Vuj6GOFA==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] os: [openharmony] - "@oxc-parser/binding-wasm32-wasi@0.120.0": + "@oxc-parser/binding-wasm32-wasi@0.137.0": resolution: { - integrity: sha512-WG/FOZgDJCpJnuF3ToG/K28rcOmSY7FmFmfBKYb2fmLyhDzPpUldFGV7/Fz4ru0Iz/v4KPmf8xVgO8N3lO4KHA==, + integrity: sha512-gW2vfkytNGgMVADiuzdvOfw0mWG9za20F/1fCJsif5aBMAvWJTSbpIXbIe0XkOe0VENk+PadpQ7cZgUy2sUJcA==, } - engines: { node: ">=14.0.0" } + engines: { node: ^20.19.0 || >=22.12.0 } cpu: [wasm32] "@oxc-parser/binding-wasm32-wasi@0.68.1": @@ -1504,10 +1545,10 @@ packages: engines: { node: ">=14.0.0" } cpu: [wasm32] - "@oxc-parser/binding-win32-arm64-msvc@0.120.0": + "@oxc-parser/binding-win32-arm64-msvc@0.137.0": resolution: { - integrity: sha512-1T0HKGcsz/BKo77t7+89L8Qvu4f9DoleKWHp3C5sJEcbCjDOLx3m9m722bWZTY+hANlUEs+yjlK+lBFsA+vrVQ==, + integrity: sha512-x+pFANF0yL5uK/6T7lu6SlR5qid6sp//eZXKLq5iNsIE+EQg6EaS8/wsW7E91nXXjpnPhSoMOHXShSVhGRdn8w==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [arm64] @@ -1522,19 +1563,19 @@ packages: cpu: [arm64] os: [win32] - "@oxc-parser/binding-win32-ia32-msvc@0.120.0": + "@oxc-parser/binding-win32-ia32-msvc@0.137.0": resolution: { - integrity: sha512-L7vfLzbOXsjBXV0rv/6Y3Jd9BRjPeCivINZAqrSyAOZN3moCopDN+Psq9ZrGNZtJzP8946MtlRFZ0Als0wBCOw==, + integrity: sha512-sQUqym80PFi6McRsIqfJrSu2JrSClEZIXXD+/FjAFoULEKzOPsldIdFBG96xdX8aVMzCNQ9792FPx3MfkEIrFA==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [ia32] os: [win32] - "@oxc-parser/binding-win32-x64-msvc@0.120.0": + "@oxc-parser/binding-win32-x64-msvc@0.137.0": resolution: { - integrity: sha512-ys+upfqNtSu58huAhJMBKl3XCkGzyVFBlMlGPzHeFKgpFF/OdgNs1MMf8oaJIbgMH8ZxgGF7qfue39eJohmKIg==, + integrity: sha512-2AsevxlvNN4WKxpEn3RtqD5zbqMaXF+T7JXblsP4gVuY+vC9dXS4ED/PwfRCliFqoeisYS3Iro4DHzxr0TEvVA==, } engines: { node: ^20.19.0 || >=22.12.0 } cpu: [x64] @@ -1549,10 +1590,10 @@ packages: cpu: [x64] os: [win32] - "@oxc-project/types@0.120.0": + "@oxc-project/types@0.137.0": resolution: { - integrity: sha512-k1YNu55DuvAip/MGE1FTsIuU3FUCn6v/ujG9V7Nq5Df/kX2CWb13hhwD0lmJGMGqE+bE1MXvv9SZVnMzEXlWcg==, + integrity: sha512-WT+Gb24i8hmvo85AIv2oEYouEXkRlKAlT9WaCa3TfLgNCN+GhrJOGZuIlMouAh38Qe4QOx26eUOVsq70qXrywA==, } "@oxc-project/types@0.61.2": @@ -1567,26 +1608,26 @@ packages: integrity: sha512-Q/H52+HXPPxuIHwQnVkEM8GebLnNcokkI4zQQdbxLIZdfxMGhAm9+gEqsMku3t95trN/1titHUmCM9NxbKaE2g==, } - "@oxc-resolver/binding-android-arm-eabi@11.19.1": + "@oxc-resolver/binding-android-arm-eabi@11.21.3": resolution: { - integrity: sha512-aUs47y+xyXHUKlbhqHUjBABjvycq6YSD7bpxSW7vplUmdzAlJ93yXY6ZR0c1o1x5A/QKbENCvs3+NlY8IpIVzg==, + integrity: sha512-eNU11A2WNizh04v3uyaJCootrHIaS0B9aHYXvAvVnPNk4xYSjMUjHnhQ6dewPN2MRYDskV85d1N0Aw0WNWhcyg==, } cpu: [arm] os: [android] - "@oxc-resolver/binding-android-arm64@11.19.1": + "@oxc-resolver/binding-android-arm64@11.21.3": resolution: { - integrity: sha512-oolbkRX+m7Pq2LNjr/kKgYeC7bRDMVTWPgxBGMjSpZi/+UskVo4jsMU3MLheZV55jL6c3rNelPl4oD60ggYmqA==, + integrity: sha512-8Q+ZjTLvn2dIcWsrmhdrEihm7q+ag/k+mkry7Z+t0QbbHaVxXQfvH9AewyVMh/WrpEKhQ3DDgx9fYbqeCpeOEw==, } cpu: [arm64] os: [android] - "@oxc-resolver/binding-darwin-arm64@11.19.1": + "@oxc-resolver/binding-darwin-arm64@11.21.3": resolution: { - integrity: sha512-nUC6d2i3R5B12sUW4O646qD5cnMXf2oBGPLIIeaRfU9doJRORAbE2SGv4eW6rMqhD+G7nf2Y8TTJTLiiO3Q/dQ==, + integrity: sha512-wkh0qKZGHXVUDxFw3oA1TXnU2BDYY/r775oJflGeIr8uDPPoN2pk8gijQIzYRT6hoql/lg3+Tx/SaTn9e2/aGg==, } cpu: [arm64] os: [darwin] @@ -1599,10 +1640,10 @@ packages: cpu: [arm64] os: [darwin] - "@oxc-resolver/binding-darwin-x64@11.19.1": + "@oxc-resolver/binding-darwin-x64@11.21.3": resolution: { - integrity: sha512-cV50vE5+uAgNcFa3QY1JOeKDSkM/9ReIcc/9wn4TavhW/itkDGrXhw9jaKnkQnGbjJ198Yh5nbX/Gr2mr4Z5jQ==, + integrity: sha512-HbNc23FAQYbuyDV2vBWMez4u4mrsm5RAkniGZAWqr6lYZ3N4beeqIb776jzwRl8qL2zRhHVXpUj97X0QgogVzg==, } cpu: [x64] os: [darwin] @@ -1615,10 +1656,10 @@ packages: cpu: [x64] os: [darwin] - "@oxc-resolver/binding-freebsd-x64@11.19.1": + "@oxc-resolver/binding-freebsd-x64@11.21.3": resolution: { - integrity: sha512-xZOQiYGFxtk48PBKff+Zwoym7ScPAIVp4c14lfLxizO2LTTTJe5sx9vQNGrBymrf/vatSPNMD4FgsaaRigPkqw==, + integrity: sha512-K6xNsTUPEUdfrn0+kbMq5nOUB5w1C5pavPQngt4TM2FpN91lP0PBe2srSpamb4d69O7h86oAi/qWX/kZNRSjkw==, } cpu: [x64] os: [freebsd] @@ -1631,10 +1672,10 @@ packages: cpu: [x64] os: [freebsd] - "@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1": + "@oxc-resolver/binding-linux-arm-gnueabihf@11.21.3": resolution: { - integrity: sha512-lXZYWAC6kaGe/ky2su94e9jN9t6M0/6c+GrSlCqL//XO1cxi5lpAhnJYdyrKfm0ZEr/c7RNyAx3P7FSBcBd5+A==, + integrity: sha512-VcFmOpcpWX1zoEy8M58tR2M9YxM+Z9RuQhqAx5q0CTmrruaP7Gveejg75hzd/5sg5nk9G3aLALEa3hE2FsmmTQ==, } cpu: [arm] os: [linux] @@ -1647,21 +1688,22 @@ packages: cpu: [arm] os: [linux] - "@oxc-resolver/binding-linux-arm-musleabihf@11.19.1": + "@oxc-resolver/binding-linux-arm-musleabihf@11.21.3": resolution: { - integrity: sha512-veG1kKsuK5+t2IsO9q0DErYVSw2azvCVvWHnfTOS73WE0STdLLB7Q1bB9WR+yHPQM76ASkFyRbogWo1GR1+WbQ==, + integrity: sha512-quVoxFLBy43hWaQbbDtQNRwAX5vX76mv7n64icAtQcJ3eNgVeblqmkupF/hAneNthdqSlnd1sTjb3aQSaDPaCQ==, } cpu: [arm] os: [linux] - "@oxc-resolver/binding-linux-arm64-gnu@11.19.1": + "@oxc-resolver/binding-linux-arm64-gnu@11.21.3": resolution: { - integrity: sha512-heV2+jmXyYnUrpUXSPugqWDRpnsQcDm2AX4wzTuvgdlZfoNYO0O3W2AVpJYaDn9AG4JdM6Kxom8+foE7/BcSig==, + integrity: sha512-X0AqNZgcD07Q4V3RDK18/vYOj/HQT/FnmEFGYS2jTWqY7JO13ryE3TEs3eAIgUJhBnNkpEaiXqz3VK8M7qQhWQ==, } cpu: [arm64] os: [linux] + libc: [glibc] "@oxc-resolver/binding-linux-arm64-gnu@5.3.0": resolution: @@ -1670,14 +1712,16 @@ packages: } cpu: [arm64] os: [linux] + libc: [glibc] - "@oxc-resolver/binding-linux-arm64-musl@11.19.1": + "@oxc-resolver/binding-linux-arm64-musl@11.21.3": resolution: { - integrity: sha512-jvo2Pjs1c9KPxMuMPIeQsgu0mOJF9rEb3y3TdpsrqwxRM+AN6/nDDwv45n5ZrUnQMsdBy5gIabioMKnQfWo9ew==, + integrity: sha512-YkaQnaKYdbuaXvRt5Qd0GpbihzVnyfR6z1SpYfIUC6RTu4NF7lDKPjVkYb+jRI2gedVO2rVpN35Y6akG6ud4Lw==, } cpu: [arm64] os: [linux] + libc: [musl] "@oxc-resolver/binding-linux-arm64-musl@5.3.0": resolution: @@ -1686,22 +1730,25 @@ packages: } cpu: [arm64] os: [linux] + libc: [musl] - "@oxc-resolver/binding-linux-ppc64-gnu@11.19.1": + "@oxc-resolver/binding-linux-ppc64-gnu@11.21.3": resolution: { - integrity: sha512-vLmdNxWCdN7Uo5suays6A/+ywBby2PWBBPXctWPg5V0+eVuzsJxgAn6MMB4mPlshskYbppjpN2Zg83ArHze9gQ==, + integrity: sha512-gB9HwhrPiFqUzDeEq+y/CgAijz1YdI6BnXz5GaH2Pa9cWdutchlkGFAiAuGb/PjVQpiK6NFKzFuztxrweoit7A==, } cpu: [ppc64] os: [linux] + libc: [glibc] - "@oxc-resolver/binding-linux-riscv64-gnu@11.19.1": + "@oxc-resolver/binding-linux-riscv64-gnu@11.21.3": resolution: { - integrity: sha512-/b+WgR+VTSBxzgOhDO7TlMXC1ufPIMR6Vj1zN+/x+MnyXGW7prTLzU9eW85Aj7Th7CCEG9ArCbTeqxCzFWdg2w==, + integrity: sha512-zjDWBlYk8QGv0H8dsPUWqkfjYIIjG2TvspGkzXL0eImbgxtZorA/klKeHyolevoT3Kvbi+1iMr9Lhrh7jf54Og==, } cpu: [riscv64] os: [linux] + libc: [glibc] "@oxc-resolver/binding-linux-riscv64-gnu@5.3.0": resolution: @@ -1710,22 +1757,25 @@ packages: } cpu: [riscv64] os: [linux] + libc: [glibc] - "@oxc-resolver/binding-linux-riscv64-musl@11.19.1": + "@oxc-resolver/binding-linux-riscv64-musl@11.21.3": resolution: { - integrity: sha512-YlRdeWb9j42p29ROh+h4eg/OQ3dTJlpHSa+84pUM9+p6i3djtPz1q55yLJhgW9XfDch7FN1pQ/Vd6YP+xfRIuw==, + integrity: sha512-4UfsQvacV388y1zpXL7C1x1FNYaV52JtuNRiuzrfQA2z1z6ElVrsidkGsrvQ5EgeSq1Pj7kaKqrgGkvFuxJ/tw==, } cpu: [riscv64] os: [linux] + libc: [musl] - "@oxc-resolver/binding-linux-s390x-gnu@11.19.1": + "@oxc-resolver/binding-linux-s390x-gnu@11.21.3": resolution: { - integrity: sha512-EDpafVOQWF8/MJynsjOGFThcqhRHy417sRyLfQmeiamJ8qVhSKAn2Dn2VVKUGCjVB9C46VGjhNo7nOPUi1x6uA==, + integrity: sha512-b5uH+HKH0MP5mNBYaK75SKsJbw52URqrx2LavYdq6wb0l3ExAG5niYRP9DWUNHdKilpaBVM2bXk9HNWrH3ew7Q==, } cpu: [s390x] os: [linux] + libc: [glibc] "@oxc-resolver/binding-linux-s390x-gnu@5.3.0": resolution: @@ -1734,14 +1784,16 @@ packages: } cpu: [s390x] os: [linux] + libc: [glibc] - "@oxc-resolver/binding-linux-x64-gnu@11.19.1": + "@oxc-resolver/binding-linux-x64-gnu@11.21.3": resolution: { - integrity: sha512-NxjZe+rqWhr+RT8/Ik+5ptA3oz7tUw361Wa5RWQXKnfqwSSHdHyrw6IdcTfYuml9dM856AlKWZIUXDmA9kkiBQ==, + integrity: sha512-PjYlmilBpNRh2ntXNYAK3Am5w/nPfEpnU/96iNx7CI8EzAn12J4JRiec63wHJTH31nLoCNxBg/829pN+3CfG3Q==, } cpu: [x64] os: [linux] + libc: [glibc] "@oxc-resolver/binding-linux-x64-gnu@5.3.0": resolution: @@ -1750,14 +1802,16 @@ packages: } cpu: [x64] os: [linux] + libc: [glibc] - "@oxc-resolver/binding-linux-x64-musl@11.19.1": + "@oxc-resolver/binding-linux-x64-musl@11.21.3": resolution: { - integrity: sha512-cM/hQwsO3ReJg5kR+SpI69DMfvNCp+A/eVR4b4YClE5bVZwz8rh2Nh05InhwI5HR/9cArbEkzMjcKgTHS6UaNw==, + integrity: sha512-QTBAb7JuHlZ7JUEyM8UiQi2f7m/L4swBhP2TNpYIDc9Wp/wRw1G/8sl6i13aIzQAXH7LKIm294LeOHd0lQR8zA==, } cpu: [x64] os: [linux] + libc: [musl] "@oxc-resolver/binding-linux-x64-musl@5.3.0": resolution: @@ -1766,19 +1820,20 @@ packages: } cpu: [x64] os: [linux] + libc: [musl] - "@oxc-resolver/binding-openharmony-arm64@11.19.1": + "@oxc-resolver/binding-openharmony-arm64@11.21.3": resolution: { - integrity: sha512-QF080IowFB0+9Rh6RcD19bdgh49BpQHUW5TajG1qvWHvmrQznTZZjYlgE2ltLXyKY+qs4F/v5xuX1XS7Is+3qA==, + integrity: sha512-4j1DFwjwv36ec9kds0jU/ucQ5Ha4ERO/H95BxR5JFf0kqUUAJ1kwII7XhTc1vZrkdJkvLGC9Q2MbpObpum8RBg==, } cpu: [arm64] os: [openharmony] - "@oxc-resolver/binding-wasm32-wasi@11.19.1": + "@oxc-resolver/binding-wasm32-wasi@11.21.3": resolution: { - integrity: sha512-w8UCKhX826cP/ZLokXDS6+milN8y4X7zidsAttEdWlVoamTNf6lhBJldaWr3ukTDiye7s4HRcuPEPOXNC432Vg==, + integrity: sha512-i8oluoel5kru/j1WNrjmQSiA3GQ7wvIYVR1IwIoZtKogAhya2iub+ZKIeSIkcJOrnzQ18Tzl/F+kL3fYOxZLvA==, } engines: { node: ">=14.0.0" } cpu: [wasm32] @@ -1791,10 +1846,10 @@ packages: engines: { node: ">=14.0.0" } cpu: [wasm32] - "@oxc-resolver/binding-win32-arm64-msvc@11.19.1": + "@oxc-resolver/binding-win32-arm64-msvc@11.21.3": resolution: { - integrity: sha512-nJ4AsUVZrVKwnU/QRdzPCCrO0TrabBqgJ8pJhXITdZGYOV28TIYystV1VFLbQ7DtAcaBHpocT5/ZJnF78YJPtQ==, + integrity: sha512-M/8dw8dD6aOs+NlPJax401CZB9I7Aut84isQLgALGGwke4Afvw+/7yYhZb94yXf6t2sPLhQLmSmtSV+2FhsOWg==, } cpu: [arm64] os: [win32] @@ -1807,18 +1862,10 @@ packages: cpu: [arm64] os: [win32] - "@oxc-resolver/binding-win32-ia32-msvc@11.19.1": + "@oxc-resolver/binding-win32-x64-msvc@11.21.3": resolution: { - integrity: sha512-EW+ND5q2Tl+a3pH81l1QbfgbF3HmqgwLfDfVithRFheac8OTcnbXt/JxqD2GbDkb7xYEqy1zNaVFRr3oeG8npA==, - } - cpu: [ia32] - os: [win32] - - "@oxc-resolver/binding-win32-x64-msvc@11.19.1": - resolution: - { - integrity: sha512-6hIU3RQu45B+VNTY4Ru8ppFwjVS/S5qwYyGhBotmjxfEKk41I2DlGtRfGJndZ5+6lneE2pwloqunlOyZuX/XAw==, + integrity: sha512-H7BCt/VnS9hnmMp42eGhZ99izSCRvlnWwy/N71K1/J8QoExwY4262Z8QiEkMDtduRJrztayDxETTckmUuAVL9Q==, } cpu: [x64] os: [win32] @@ -1866,6 +1913,7 @@ packages: engines: { node: ">=14.0.0" } cpu: [arm64] os: [linux] + libc: [glibc] "@oxc-transform/binding-linux-arm64-musl@0.68.1": resolution: @@ -1875,6 +1923,7 @@ packages: engines: { node: ">=14.0.0" } cpu: [arm64] os: [linux] + libc: [musl] "@oxc-transform/binding-linux-x64-gnu@0.68.1": resolution: @@ -1884,6 +1933,7 @@ packages: engines: { node: ">=14.0.0" } cpu: [x64] os: [linux] + libc: [glibc] "@oxc-transform/binding-linux-x64-musl@0.68.1": resolution: @@ -1893,6 +1943,7 @@ packages: engines: { node: ">=14.0.0" } cpu: [x64] os: [linux] + libc: [musl] "@oxc-transform/binding-wasm32-wasi@0.68.1": resolution: @@ -1943,6 +1994,7 @@ packages: } cpu: [arm64] os: [linux] + libc: [glibc] "@oxlint/linux-arm64-musl@0.15.15": resolution: @@ -1951,6 +2003,7 @@ packages: } cpu: [arm64] os: [linux] + libc: [musl] "@oxlint/linux-x64-gnu@0.15.15": resolution: @@ -1959,6 +2012,7 @@ packages: } cpu: [x64] os: [linux] + libc: [glibc] "@oxlint/linux-x64-musl@0.15.15": resolution: @@ -1967,6 +2021,7 @@ packages: } cpu: [x64] os: [linux] + libc: [musl] "@oxlint/win32-arm64@0.15.15": resolution: @@ -2042,6 +2097,7 @@ packages: } cpu: [arm64] os: [linux] + libc: [glibc] "@rolldown/binding-linux-arm64-musl@1.0.0-beta.7": resolution: @@ -2050,6 +2106,7 @@ packages: } cpu: [arm64] os: [linux] + libc: [musl] "@rolldown/binding-linux-x64-gnu@1.0.0-beta.7": resolution: @@ -2058,6 +2115,7 @@ packages: } cpu: [x64] os: [linux] + libc: [glibc] "@rolldown/binding-linux-x64-musl@1.0.0-beta.7": resolution: @@ -2066,6 +2124,7 @@ packages: } cpu: [x64] os: [linux] + libc: [musl] "@rolldown/binding-wasm32-wasi@1.0.0-beta.7": resolution: @@ -2105,202 +2164,215 @@ packages: integrity: sha512-+d0F4MKMCbeVUJwG96uQ4SgAznZNSq93I3V+9NHA4OpvqG8mRCpGdKmK8l/dl02h2CCDHwW2FqilnTyDcAnqjA==, } - "@rollup/rollup-android-arm-eabi@4.60.0": + "@rollup/rollup-android-arm-eabi@4.62.2": resolution: { - integrity: sha512-WOhNW9K8bR3kf4zLxbfg6Pxu2ybOUbB2AjMDHSQx86LIF4rH4Ft7vmMwNt0loO0eonglSNy4cpD3MKXXKQu0/A==, + integrity: sha512-6o7ZLZK+BeenkZCFNDXqpbjw9bD6nuWonvS/lwQJp7NoVVxm6p3qE7qQ5jGuBjiFsgvqjD8mZAU5oWxTmbOeOg==, } cpu: [arm] os: [android] - "@rollup/rollup-android-arm64@4.60.0": + "@rollup/rollup-android-arm64@4.62.2": resolution: { - integrity: sha512-u6JHLll5QKRvjciE78bQXDmqRqNs5M/3GVqZeMwvmjaNODJih/WIrJlFVEihvV0MiYFmd+ZyPr9wxOVbPAG2Iw==, + integrity: sha512-BaH7BllCACHoH1LguOU56UItGfUWjujlO65kS9LAodViaN4bwIKd7oeW/ZHJ/4ljr/7MIiENnNy3HJ0zXv8Zkw==, } cpu: [arm64] os: [android] - "@rollup/rollup-darwin-arm64@4.60.0": + "@rollup/rollup-darwin-arm64@4.62.2": resolution: { - integrity: sha512-qEF7CsKKzSRc20Ciu2Zw1wRrBz4g56F7r/vRwY430UPp/nt1x21Q/fpJ9N5l47WWvJlkNCPJz3QRVw008fi7yA==, + integrity: sha512-v39RCCvj4He82I9sFmk+M1VZ0PLM9sfsLVikjfx2hYBNALhrrOR2D3JjQA6AhlaSOgcR+RzrKY7e1+bT6SUO/A==, } cpu: [arm64] os: [darwin] - "@rollup/rollup-darwin-x64@4.60.0": + "@rollup/rollup-darwin-x64@4.62.2": resolution: { - integrity: sha512-WADYozJ4QCnXCH4wPB+3FuGmDPoFseVCUrANmA5LWwGmC6FL14BWC7pcq+FstOZv3baGX65tZ378uT6WG8ynTw==, + integrity: sha512-yl0y2vq3S3lHeuXhEdss6TWfKW8vkujImO12tn4ZkG/4oghr09LvdYm2RElVjokTQiUvDUGXLGsYeLqUMCKpGA==, } cpu: [x64] os: [darwin] - "@rollup/rollup-freebsd-arm64@4.60.0": + "@rollup/rollup-freebsd-arm64@4.62.2": resolution: { - integrity: sha512-6b8wGHJlDrGeSE3aH5mGNHBjA0TTkxdoNHik5EkvPHCt351XnigA4pS7Wsj/Eo9Y8RBU6f35cjN9SYmCFBtzxw==, + integrity: sha512-tT4pvt4qXD+vEoezupCWi+a1F0vvDiksiHc+PxRlYTOH1I6/X4id9jPxTP+Fg+545euaFT1jJVs4CEdHZAU1vw==, } cpu: [arm64] os: [freebsd] - "@rollup/rollup-freebsd-x64@4.60.0": + "@rollup/rollup-freebsd-x64@4.62.2": resolution: { - integrity: sha512-h25Ga0t4jaylMB8M/JKAyrvvfxGRjnPQIR8lnCayyzEjEOx2EJIlIiMbhpWxDRKGKF8jbNH01NnN663dH638mA==, + integrity: sha512-6nU5F2wCW+qvCBhTn1pdIU3bzsIoF7EUwsCDRxilWGprQR6yd508YnH9+OKFCwpfS8pjZqDUmnCAr7exax0XCg==, } cpu: [x64] os: [freebsd] - "@rollup/rollup-linux-arm-gnueabihf@4.60.0": + "@rollup/rollup-linux-arm-gnueabihf@4.62.2": resolution: { - integrity: sha512-RzeBwv0B3qtVBWtcuABtSuCzToo2IEAIQrcyB/b2zMvBWVbjo8bZDjACUpnaafaxhTw2W+imQbP2BD1usasK4g==, + integrity: sha512-n1GJHPOvpIfhi3TmrCeh6S6URt9BFCt0KQE3qvexyGCTAKpR4Lg+eWvNZEqu7epxwus/8ElT3hacYEucm49SZg==, } cpu: [arm] os: [linux] + libc: [glibc] - "@rollup/rollup-linux-arm-musleabihf@4.60.0": + "@rollup/rollup-linux-arm-musleabihf@4.62.2": resolution: { - integrity: sha512-Sf7zusNI2CIU1HLzuu9Tc5YGAHEZs5Lu7N1ssJG4Tkw6e0MEsN7NdjUDDfGNHy2IU+ENyWT+L2obgWiguWibWQ==, + integrity: sha512-JqgflS8wEB+UXV/vS1RpRbifGBeN4D5lz8D8oOFbFZw4vedvdOgCFAjfBmIMdW3yL10XpQQ0Ambepw6MXrhOnA==, } cpu: [arm] os: [linux] + libc: [musl] - "@rollup/rollup-linux-arm64-gnu@4.60.0": + "@rollup/rollup-linux-arm64-gnu@4.62.2": resolution: { - integrity: sha512-DX2x7CMcrJzsE91q7/O02IJQ5/aLkVtYFryqCjduJhUfGKG6yJV8hxaw8pZa93lLEpPTP/ohdN4wFz7yp/ry9A==, + integrity: sha512-wnFJkogWvN4jm/hQRF2UBaeUmk20j5+DmHvoyWii2b8HJDyvz1MF2OU/6ynXt2KR63rbZLWkFpoytpdc/yBuSA==, } cpu: [arm64] os: [linux] + libc: [glibc] - "@rollup/rollup-linux-arm64-musl@4.60.0": + "@rollup/rollup-linux-arm64-musl@4.62.2": resolution: { - integrity: sha512-09EL+yFVbJZlhcQfShpswwRZ0Rg+z/CsSELFCnPt3iK+iqwGsI4zht3secj5vLEs957QvFFXnzAT0FFPIxSrkQ==, + integrity: sha512-HVu2bp0zhvJ8xHEV9+UUs7S90VadmBSY3LcIMvozbPo4AuMGDWlz3ymHLHZPX4hR67TKTt8Qp5PJ5RBg/i+RMQ==, } cpu: [arm64] os: [linux] + libc: [musl] - "@rollup/rollup-linux-loong64-gnu@4.60.0": + "@rollup/rollup-linux-loong64-gnu@4.62.2": resolution: { - integrity: sha512-i9IcCMPr3EXm8EQg5jnja0Zyc1iFxJjZWlb4wr7U2Wx/GrddOuEafxRdMPRYVaXjgbhvqalp6np07hN1w9kAKw==, + integrity: sha512-mQqqAV8QaoSgr9I2fKDLY2BAVvmKjWoGiu/cSYQonsLvtqwEn1E4QYfnCOcp5zoEqNhsDYin1s6jx/VJmrxlZg==, } cpu: [loong64] os: [linux] + libc: [glibc] - "@rollup/rollup-linux-loong64-musl@4.60.0": + "@rollup/rollup-linux-loong64-musl@4.62.2": resolution: { - integrity: sha512-DGzdJK9kyJ+B78MCkWeGnpXJ91tK/iKA6HwHxF4TAlPIY7GXEvMe8hBFRgdrR9Ly4qebR/7gfUs9y2IoaVEyog==, + integrity: sha512-IxKLoxCQ2IWi6bT2akyDUBGsOImDKB+sPp4EsTmwFQ/fMwpCKm8uLSSgP/Kx/QYUgKis6SEZ5/Nlhup0DIA0PQ==, } cpu: [loong64] os: [linux] + libc: [musl] - "@rollup/rollup-linux-ppc64-gnu@4.60.0": + "@rollup/rollup-linux-ppc64-gnu@4.62.2": resolution: { - integrity: sha512-RwpnLsqC8qbS8z1H1AxBA1H6qknR4YpPR9w2XX0vo2Sz10miu57PkNcnHVaZkbqyw/kUWfKMI73jhmfi9BRMUQ==, + integrity: sha512-Mk5ha2RQSgyFfmYYLkBpPnUk8D8FriBxesO1u9O75X0mHgXL1UQcH5Itl2lurWL2tj0RxV9b9tJgipac0hRY9A==, } cpu: [ppc64] os: [linux] + libc: [glibc] - "@rollup/rollup-linux-ppc64-musl@4.60.0": + "@rollup/rollup-linux-ppc64-musl@4.62.2": resolution: { - integrity: sha512-Z8pPf54Ly3aqtdWC3G4rFigZgNvd+qJlOE52fmko3KST9SoGfAdSRCwyoyG05q1HrrAblLbk1/PSIV+80/pxLg==, + integrity: sha512-CjvEnqJL/0/TQ3TXX3OPIJ/kmBellrWd4heXUmHeJlTnmwjKpSJzoehLaL6Xk0ZnMHBu9dZuFADNOrtjF4v+2w==, } cpu: [ppc64] os: [linux] + libc: [musl] - "@rollup/rollup-linux-riscv64-gnu@4.60.0": + "@rollup/rollup-linux-riscv64-gnu@4.62.2": resolution: { - integrity: sha512-3a3qQustp3COCGvnP4SvrMHnPQ9d1vzCakQVRTliaz8cIp/wULGjiGpbcqrkv0WrHTEp8bQD/B3HBjzujVWLOA==, + integrity: sha512-1SiZbzwdkaDURsew/tSOrooKiYy7EQGT6m8ufavAi9NEyQb/6VuIxFXAL1fqa4iZe3g4NbNk4P7J32z2tw5Mgg==, } cpu: [riscv64] os: [linux] + libc: [glibc] - "@rollup/rollup-linux-riscv64-musl@4.60.0": + "@rollup/rollup-linux-riscv64-musl@4.62.2": resolution: { - integrity: sha512-pjZDsVH/1VsghMJ2/kAaxt6dL0psT6ZexQVrijczOf+PeP2BUqTHYejk3l6TlPRydggINOeNRhvpLa0AYpCWSQ==, + integrity: sha512-nQts12zJ3NQRoE6uYljOH89v7szzLDvG2JD/vsX+vGXU8w/At1GowTZ5/7qeFQ8m7L55rpR8Okugnuo5bgjy2Q==, } cpu: [riscv64] os: [linux] + libc: [musl] - "@rollup/rollup-linux-s390x-gnu@4.60.0": + "@rollup/rollup-linux-s390x-gnu@4.62.2": resolution: { - integrity: sha512-3ObQs0BhvPgiUVZrN7gqCSvmFuMWvWvsjG5ayJ3Lraqv+2KhOsp+pUbigqbeWqueGIsnn+09HBw27rJ+gYK4VQ==, + integrity: sha512-E9/ll019jhPIJgpzfZoIkBGhcz+kKNgVWYRY0zr9srBdPPFVpvOKW8VaJKUbeK+eZXyQF9ltME+Kk6affeaPgg==, } cpu: [s390x] os: [linux] + libc: [glibc] - "@rollup/rollup-linux-x64-gnu@4.60.0": + "@rollup/rollup-linux-x64-gnu@4.62.2": resolution: { - integrity: sha512-EtylprDtQPdS5rXvAayrNDYoJhIz1/vzN2fEubo3yLE7tfAw+948dO0g4M0vkTVFhKojnF+n6C8bDNe+gDRdTg==, + integrity: sha512-5BqxR/pshjey51iliyzTD5Xi3EN0aLmQ2lZ3lvefVV9c82BvrLo2/6OT55iifpWBufs6kdwWbuOKS841DrmK9A==, } cpu: [x64] os: [linux] + libc: [glibc] - "@rollup/rollup-linux-x64-musl@4.60.0": + "@rollup/rollup-linux-x64-musl@4.62.2": resolution: { - integrity: sha512-k09oiRCi/bHU9UVFqD17r3eJR9bn03TyKraCrlz5ULFJGdJGi7VOmm9jl44vOJvRJ6P7WuBi/s2A97LxxHGIdw==, + integrity: sha512-uNN83XxQrRAh/w0/pmAfibcwyb6YWt4gP+dpnQKPVJshAloQ785ii8CT8ZCIxkGg9opVsvAlGhFitSm6D1Jjpg==, } cpu: [x64] os: [linux] + libc: [musl] - "@rollup/rollup-openbsd-x64@4.60.0": + "@rollup/rollup-openbsd-x64@4.62.2": resolution: { - integrity: sha512-1o/0/pIhozoSaDJoDcec+IVLbnRtQmHwPV730+AOD29lHEEo4F5BEUB24H0OBdhbBBDwIOSuf7vgg0Ywxdfiiw==, + integrity: sha512-srjEIxSH3LRnJN6THczDHWQplqEMFiAJrTab0msUryh9kwNpkICf3Ea6q6MN/2cZwRFUNx5w+h6Hpi4QuHS6Zg==, } cpu: [x64] os: [openbsd] - "@rollup/rollup-openharmony-arm64@4.60.0": + "@rollup/rollup-openharmony-arm64@4.62.2": resolution: { - integrity: sha512-pESDkos/PDzYwtyzB5p/UoNU/8fJo68vcXM9ZW2V0kjYayj1KaaUfi1NmTUTUpMn4UhU4gTuK8gIaFO4UGuMbA==, + integrity: sha512-8hOJnxgbyObnCm5AlRA3A931xX19xq80RjVTKgJOvEKWqJruP/Uf12IbAOaDjjEXYRewwHLfmF0YRIdK3OwKWA==, } cpu: [arm64] os: [openharmony] - "@rollup/rollup-win32-arm64-msvc@4.60.0": + "@rollup/rollup-win32-arm64-msvc@4.62.2": resolution: { - integrity: sha512-hj1wFStD7B1YBeYmvY+lWXZ7ey73YGPcViMShYikqKT1GtstIKQAtfUI6yrzPjAy/O7pO0VLXGmUVWXQMaYgTQ==, + integrity: sha512-mmF4AY1i0hG/bLWUctUq59gtmgaSIRa3cu/A3JFRp/sCNEme2bgDEiDS22P9FbnJB8NJNF4jPJiSP5RHQpUTDg==, } cpu: [arm64] os: [win32] - "@rollup/rollup-win32-ia32-msvc@4.60.0": + "@rollup/rollup-win32-ia32-msvc@4.62.2": resolution: { - integrity: sha512-SyaIPFoxmUPlNDq5EHkTbiKzmSEmq/gOYFI/3HHJ8iS/v1mbugVa7dXUzcJGQfoytp9DJFLhHH4U3/eTy2Bq4w==, + integrity: sha512-DZgkknc6jhHrk46V25vbAM0zZkyP0nSDkJB8/dRkLTxv470dOmWDqGoEJl/9A0dFfS7yE3REOwNDxpHwSLSt0Q==, } cpu: [ia32] os: [win32] - "@rollup/rollup-win32-x64-gnu@4.60.0": + "@rollup/rollup-win32-x64-gnu@4.62.2": resolution: { - integrity: sha512-RdcryEfzZr+lAr5kRm2ucN9aVlCCa2QNq4hXelZxb8GG0NJSazq44Z3PCCc8wISRuCVnGs0lQJVX5Vp6fKA+IA==, + integrity: sha512-T6xr6ucWSFto+VGajA8YH26LdpHRuP4YLHEKAtCWvJDOlnmWcDZVCI2Jmjr+IFHDlt2zRaTAKE4tfjTaWLgJBg==, } cpu: [x64] os: [win32] - "@rollup/rollup-win32-x64-msvc@4.60.0": + "@rollup/rollup-win32-x64-msvc@4.62.2": resolution: { - integrity: sha512-PrsWNQ8BuE00O3Xsx3ALh2Df8fAj9+cvvX9AIA6o4KpATR98c9mud4XtDWVvsEuyia5U4tVSTKygawyJkjm60w==, + integrity: sha512-BfzEnDJOt9T8M989/lA37EcJgat01wLRnoi5dQf3QzOH7jzpqTAzdDbVfRljVr5r+jzKqpbHeyOfAaXxAd0PAA==, } cpu: [x64] os: [win32] @@ -2317,10 +2389,10 @@ packages: integrity: sha512-4tUmeLyXJnJWvTFOKtcNJ1yh0a3SsTLi2MUoyj8iUNznFRN1ZquaNe7Oukqrnki2FzZkm0J9adCNLDZxUzvj+w==, } - "@tybys/wasm-util@0.10.1": + "@tybys/wasm-util@0.10.3": resolution: { - integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==, + integrity: sha512-F3fo1MYrRJYL3zER0OUOmkutjr1Vp23m7OsSgp7nq4SP6OqX6C/56XFIPAl5bt3zaBRjmW7SGz3u/6LwFpYcOg==, } "@types/babel__core@7.20.5": @@ -2359,10 +2431,10 @@ packages: integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==, } - "@types/estree@1.0.8": + "@types/estree@1.0.9": resolution: { - integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==, + integrity: sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==, } "@types/json5@0.0.29": @@ -2377,10 +2449,10 @@ packages: integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==, } - "@types/node@25.5.0": + "@types/node@25.9.4": resolution: { - integrity: sha512-jp2P3tQMSxWugkCUKLRPVUpGaL5MVFwF8RDuSRztfwgN1wmqJeMSbKlnEtQqU8UrhTmzEmZdu2I6v2dpp7XIxw==, + integrity: sha512-dszCsrKb5U7ZsVZBWiHFklTloVl0mSEnWH/iZXfZUlI4rzCUnsvGmgqfuVRHL54ugE7/wRuxEIXRa2iMZ+BG6g==, } "@types/parse-json@4.0.2": @@ -2403,10 +2475,10 @@ packages: peerDependencies: "@types/react": ^18.0.0 - "@types/react@18.3.28": + "@types/react@18.3.31": resolution: { - integrity: sha512-z9VXpC7MWrhfWipitjNdgCauoMLRdIILQsAEV+ZesIzBq/oUlxk0m3ApZuMFCXdnS4U7KrI+l3WRUEGQ8K1QKw==, + integrity: sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==, } "@types/ws@8.18.1": @@ -2494,10 +2566,10 @@ packages: integrity: sha512-lI23nIs4bnT3T8NIoh+vFaz5s2/DdP0Jgt2jxwgWljvwn82cLJtyi/If+fjFyoLMGIOz0U/fKvWE0d4jsNQEfg==, } - "@webgpu/types@0.1.69": + "@webgpu/types@0.1.71": resolution: { - integrity: sha512-RPmm6kgRbI8e98zSD3RVACvnuktIja5+yLgDAkTmxLr90BEwdTXRQWNLF3ETTTyH/8mKhznZuN5AveXYFEsMGQ==, + integrity: sha512-mMy8/ODcKhab808co15eW+yN+HgXoQxRQHTiBV9Mrvl1r0ufnid7YOcI+gi4eUWSWl9ezD6TW2KXccrL8HCh2A==, } abort-controller@3.0.0: @@ -2550,6 +2622,14 @@ packages: engines: { node: ">=0.4.0" } hasBin: true + acorn@8.17.0: + resolution: + { + integrity: sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==, + } + engines: { node: ">=0.4.0" } + hasBin: true + adm-zip@0.5.17: resolution: { @@ -2568,10 +2648,10 @@ packages: ajv: optional: true - ajv@8.18.0: + ajv@8.20.0: resolution: { - integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==, + integrity: sha512-Thbli+OlOj+iMPYFBVBfJ3OmCAnaSyNn4M1vz9T6Gka5Jt9ba/HIR56joy65tY6kx/FCF5VXNB819Y7/GUrBGA==, } ansi-regex@5.0.1: @@ -2668,10 +2748,10 @@ packages: integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==, } - baseline-browser-mapping@2.10.10: + baseline-browser-mapping@2.10.38: resolution: { - integrity: sha512-sUoJ3IMxx4AyRqO4MLeHlnGDkyXRoUG0/AI9fjK+vS72ekpV0yWVY7O0BVjmBcRtkNcsAO2QDZ4tdKKGoI6YaQ==, + integrity: sha512-31/02mVB4yuQU6adKk5SlY6m+mxDwUq5KZkyYgnLrrKl7TEm1+3PyDtDBz2kOv/wxZz41GHsvV1A/u6RmiyBvw==, } engines: { node: ">=6.0.0" } hasBin: true @@ -2682,17 +2762,17 @@ packages: integrity: sha512-cTEHk2jLrPyi+12M3dhpEbnnPOsaZuq7C45ylbbQIiWgDFZq4UVYPEY5mlqjvsj/6gJv9qX5sa+ebDzLXT28Vw==, } - body-parser@2.2.2: + body-parser@2.3.0: resolution: { - integrity: sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==, + integrity: sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==, } engines: { node: ">=18" } - brace-expansion@1.1.12: + brace-expansion@1.1.15: resolution: { - integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==, + integrity: sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==, } brace-expansion@2.1.1: @@ -2715,10 +2795,10 @@ packages: } engines: { node: ">=8" } - browserslist@4.28.1: + browserslist@4.28.4: resolution: { - integrity: sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==, + integrity: sha512-MTc8i/x9jBQd1iMw2CFGS+rwMa07eYjLR0CCTLDACl9xhxy+nIs3KeML/biicXtk9JrZ6dnnTatmc7ErPXIxqw==, } engines: { node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7 } hasBin: true @@ -2737,42 +2817,42 @@ packages: peerDependencies: typescript: ^5 - bun-webgpu-darwin-arm64@0.1.6: + bun-webgpu-darwin-arm64@0.1.7: resolution: { - integrity: sha512-lIsDkPzJzPl6yrB5CUOINJFPnTRv6fF/Q8J1mAr43ogSp86WZEg9XZKaT6f3EUJ+9ETogGoMnoj1q0AwHUTbAQ==, + integrity: sha512-mRrFFyHzPWjsTRidAZBRcu808CPQBOUL0P6b4nxLhp+XHcV/mbUHERZMgW9s58tsojQfSdzschiQa8q+JCgRWA==, } cpu: [arm64] os: [darwin] - bun-webgpu-darwin-x64@0.1.6: + bun-webgpu-darwin-x64@0.1.7: resolution: { - integrity: sha512-uEddf5U7GvKIkM/BV18rUKtYHL6d0KeqBjNHwfqDH9QgEo9KVSKvJXS5I/sMefk5V5pIYE+8tQhtrREevhocng==, + integrity: sha512-g0NXGNgvaVCSH/jCWWlfdiquOHkbUN6vP4zqzSkIxWKQeLnqm3oADcok7SO3yIgI7v5mKpRc/ks7NDEKNH+jNQ==, } cpu: [x64] os: [darwin] - bun-webgpu-linux-x64@0.1.6: + bun-webgpu-linux-x64@0.1.7: resolution: { - integrity: sha512-Y/f15j9r8ba0xUz+3lATtS74OE+PPzQXO7Do/1eCluJcuOlfa77kMjvBK/ShWnem3Y9xqi59pebTPOGRB+CaJA==, + integrity: sha512-UEP7UZdEhx9otvkZczjsszL8ZVlrODANQvgl+C88/bNVmxDoFi7w1fWzGi1sZyakiETjmtFDq2/xCLhbSZxjqw==, } cpu: [x64] os: [linux] - bun-webgpu-win32-x64@0.1.6: + bun-webgpu-win32-x64@0.1.7: resolution: { - integrity: sha512-MHSFAKqizISb+C5NfDrFe3g0Al5Njnu0j/A+oO2Q+bIWX+fUYjBSowiYE1ZXJx65KuryuB+tiM7Qh6cQbVvkEg==, + integrity: sha512-KZktiFkBz6sN7PEm1NVdeaLP5Q5X/PlSHZqefY4nNuWtf0LNvh54NhZe7yVv/Plz/nGbv92b0KHMBY3ki/pp6g==, } cpu: [x64] os: [win32] - bun-webgpu@0.1.5: + bun-webgpu@0.1.7: resolution: { - integrity: sha512-91/K6S5whZKX7CWAm9AylhyKrLGRz6BUiiPiM/kXadSnD4rffljCD/q9cNFftm5YXhx4MvLqw33yEilxogJvwA==, + integrity: sha512-KUxUp+oQIf7pPBMD4Hv1TUu7DWaOZ4ciKulTk9to9+Uc8yHoYrMW7L2SJCJ4FHHkywgf/7aLRgRx0b7i6DvGIQ==, } bytes@3.1.2: @@ -2810,10 +2890,10 @@ packages: } engines: { node: ">=6" } - caniuse-lite@1.0.30001781: + caniuse-lite@1.0.30001799: resolution: { - integrity: sha512-RdwNCyMsNBftLjW6w01z8bKEvT6e/5tpPVEgtn22TiLGlstHOVecsX2KHFkD5e/vRnIE4EGzpuIODb3mtswtkw==, + integrity: sha512-hG1bReV+OUU+MOqK4t/ZWI0tZOyz3rqS9XuhOUz1cIcbwBKjOyJEJuw9ER5JuNyqxNk8u/JUVbGibBOL1yrjFw==, } chai@5.3.3: @@ -2890,10 +2970,10 @@ packages: integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==, } - concurrently@9.2.1: + concurrently@9.2.3: resolution: { - integrity: sha512-fsfrO0MxV64Znoy8/l1vVIjjHa29SZyyqPgQBwhiDcaW8wJc2W3XWVOGx4M3oJBnv/zdUZIIp1gDeS98GzP8Ng==, + integrity: sha512-ihjs0E2SxvDgq/MK418hX6YycQgKhsqxpbZuZbHo0yKfqDWdymWMjWYIpCIzqDDLLKClHlXev8whW/8WXmJ0BA==, } engines: { node: ">=18" } hasBin: true @@ -2911,10 +2991,10 @@ packages: } engines: { node: ^14.18.0 || >=16.10.0 } - content-disposition@1.0.1: + content-disposition@1.1.0: resolution: { - integrity: sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==, + integrity: sha512-5jRCH9Z/+DRP7rkvY83B+yGIGX96OYdJmzngqnw2SBSxqCFPd0w2km3s5iawpGX8krnwSGmF0FW5Nhr0Hfai3g==, } engines: { node: ">=18" } @@ -2925,6 +3005,13 @@ packages: } engines: { node: ">= 0.6" } + content-type@2.0.0: + resolution: + { + integrity: sha512-j/O/d7GcZCyNl7/hwZAb606rzqkyvaDctLmckbxLzHvFBzTJHuGEdodATcP3yIRoDrLHkIATJuvzbFlp/ki2cQ==, + } + engines: { node: ">=18" } + convert-source-map@2.0.0: resolution: { @@ -3005,10 +3092,10 @@ packages: } engines: { node: ">= 0.4" } - defu@6.1.4: + defu@6.1.7: resolution: { - integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==, + integrity: sha512-7z22QmUWiQ/2d0KkdYmANbRUVABpZ9SNYyH5vx6PZ+nE5bcC0l7uFvEfHlyld/HcGBFTL536ClDt3DEcSlEJAQ==, } depd@2.0.0: @@ -3018,21 +3105,14 @@ packages: } engines: { node: ">= 0.8" } - dependency-cruiser@17.3.9: + dependency-cruiser@17.4.3: resolution: { - integrity: sha512-LwaotlB9bZ8zhdFGGYf/g2oYkYj7YNxlqx1btL/XIYGob/aKRArsSwkLKo+ZrHiegsEArQVg4ZQ3NhAh8uk+hg==, + integrity: sha512-L4GLuAvmXevWnPCIaFfOz6eD92c+yY+pDgVqgufrLDnW3xYA799CSZQlly2r2N13nhAlnZY6VzY7Rx5pHNvk2w==, } engines: { node: ^20.12||^22||>=24 } hasBin: true - detect-libc@2.1.2: - resolution: - { - integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==, - } - engines: { node: ">=8" } - diff@7.0.0: resolution: { @@ -3073,10 +3153,16 @@ packages: integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==, } - electron-to-chromium@1.5.321: + electron-to-chromium@1.5.378: + resolution: + { + integrity: sha512-VinvOAuuPmdD1guEgGv5f2Qp7/vlfqOrUOMYNnOD4wj3pit8kRsQHzfIf6teyUGWo15Tg5+bOJaRunvyltpVWQ==, + } + + emoji-regex@10.6.0: resolution: { - integrity: sha512-L2C7Q279W2D/J4PLZLk7sebOILDSWos7bMsMNN06rK482umHUrh/3lM8G7IlHFOYip2oAg5nha1rCMxr/rs6ZQ==, + integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==, } emoji-regex@8.0.0: @@ -3098,10 +3184,10 @@ packages: } engines: { node: ">= 0.8" } - enhanced-resolve@5.20.0: + enhanced-resolve@5.22.1: resolution: { - integrity: sha512-/ce7+jQ1PQ6rVXwe+jKEg5hW5ciicHwIQUagZkp6IufBoY3YDgdTTY1azVs0qoRgVmvsNB+rbjLJxDAeHHtwsQ==, + integrity: sha512-6QEuw3zoX1SJQc7b87aBXke/no+mG2bTBgw29gWMQonLmpEkWoCAVkl+M49e48AZlWzxiDzDZzYdp6kobcyLww==, } engines: { node: ">=10.13.0" } @@ -3131,10 +3217,10 @@ packages: integrity: sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA==, } - es-object-atoms@1.1.1: + es-object-atoms@1.1.2: resolution: { - integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==, + integrity: sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==, } engines: { node: ">= 0.4" } @@ -3201,10 +3287,10 @@ packages: } engines: { node: ">=0.8.x" } - eventsource-parser@3.0.6: + eventsource-parser@3.1.0: resolution: { - integrity: sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==, + integrity: sha512-kJezFj9YFAMLeORyi7aCLxLbD5/qWMQnoMVlVPyHIll7lgRJCc3JVln9Vgl9nwQi0YkMnhdGTMNn7CkRRAptMg==, } engines: { node: ">=18.0.0" } @@ -3228,10 +3314,10 @@ packages: } engines: { node: ">=12.0.0" } - express-rate-limit@8.3.1: + express-rate-limit@8.5.2: resolution: { - integrity: sha512-D1dKN+cmyPWuvB+G2SREQDzPY1agpBIcTa9sJxOPMCNeH3gwzhqJRDWCXW3gg0y//+LQ/8j52JbMROWyrKdMdw==, + integrity: sha512-5Kb34ipNX694DH48vN9irak1Qx30nb0PLYHXfJgw4YEjiC3ZEmZJhwOp+VfiCYwFzvFTdB9QkArYS5kXa2cx2A==, } engines: { node: ">= 16" } peerDependencies: @@ -3244,10 +3330,10 @@ packages: } engines: { node: ">= 18" } - exsolve@1.0.8: + exsolve@1.1.0: resolution: { - integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==, + integrity: sha512-D+42+T12DdIlJM3uepa55qGiL3sYdLBOxIl2ifQCzCHz4c7eiolaHsi3BIqEr7JxBzxv2pYZQX9kw16ziMcEmw==, } fast-deep-equal@3.1.3: @@ -3263,10 +3349,10 @@ packages: } engines: { node: ">=8.6.0" } - fast-uri@3.1.0: + fast-uri@3.1.2: resolution: { - integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==, + integrity: sha512-rVjf7ArG3LTk+FS6Yw81V1DLuZl1bRbNrev6Tmd/9RaroeeRRJhAt7jg/6YFxbvAQXUCavSoZhPPj6oOx+5KjQ==, } fastq@1.20.1: @@ -3371,6 +3457,13 @@ packages: } engines: { node: 6.* || 8.* || >= 10.* } + get-east-asian-width@1.6.0: + resolution: + { + integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==, + } + engines: { node: ">=18" } + get-intrinsic@1.3.0: resolution: { @@ -3385,10 +3478,10 @@ packages: } engines: { node: ">= 0.4" } - get-tsconfig@4.13.7: + get-tsconfig@4.14.0: resolution: { - integrity: sha512-7tN6rFgBlMgpBML5j8typ92BKFi2sFQvIdpAqLA2beia5avZDrMs0FLZiM5etShWq5irVyGcGMEA1jcDaK7A/Q==, + integrity: sha512-yTb+8DXzDREzgvYmh6s9vHsSVCHeC0G3PI5bEXNBHtmshPnO+S5O7qgLEOn0I5QvMy6kpZN8K1NKGyilLb93wA==, } gifwrap@0.10.1: @@ -3404,12 +3497,11 @@ packages: } engines: { node: ">= 6" } - glob@10.5.0: + glob@10.4.5: resolution: { - integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==, + integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==, } - deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true global-agent@4.1.3: @@ -3466,17 +3558,17 @@ packages: } engines: { node: ">= 0.4" } - hasown@2.0.2: + hasown@2.0.4: resolution: { - integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==, + integrity: sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==, } engines: { node: ">= 0.4" } - hono@4.12.9: + hono@4.12.27: resolution: { - integrity: sha512-wy3T8Zm2bsEvxKZM5w21VdHDDcwVS1yUFFY6i8UobSsKfFceT7TOwhbhfKsDyx7tYQlmRM5FLpIuYvNFyjctiA==, + integrity: sha512-1yrb/+w6HWQJrUCLkJ2IF5jNIPvvFkblV5RNOYl6bV+OA6p9GLcMpHFFGTosSvHvcAUibuUukRqhlYI4z32C7Q==, } engines: { node: ">=16.9.0" } @@ -3546,10 +3638,10 @@ packages: } engines: { node: ">=10.13.0" } - ip-address@10.1.0: + ip-address@10.2.0: resolution: { - integrity: sha512-XXADHxXmvT9+CRxhXg56LJovE+bmWnEWB78LB83VZTprKTmaC5QfruXocxzTZ2Kl0DNwKuBdlIhjL8LeY8Sf8Q==, + integrity: sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==, } engines: { node: ">= 12" } @@ -3566,10 +3658,10 @@ packages: integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==, } - is-core-module@2.16.1: + is-core-module@2.16.2: resolution: { - integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==, + integrity: sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==, } engines: { node: ">= 0.4" } @@ -3668,17 +3760,17 @@ packages: } engines: { node: ">=18" } - jiti@2.6.1: + jiti@2.7.0: resolution: { - integrity: sha512-ekilCSN1jwRvIbgeg/57YFh8qQDNbwDb9xT/qu2DAHbFFZUicIl4ygVaAvzveMhMVr3LnpSKTNnwt8PoOfmKhQ==, + integrity: sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ==, } hasBin: true - jose@6.2.2: + jose@6.2.3: resolution: { - integrity: sha512-d7kPDd34KO/YnzaDOlikGpOurfF0ByC2sEV4cANCtdqLlTfBlw2p14O/5d/zv40gJPbIQxfES3nSx1/oYNyuZQ==, + integrity: sha512-YYVDInQKFJfR/xa3ojUTl8c2KoTwiL1R5Wg9YCydwH0x0B9grbzlg5HC7mMjCtUJjbQ/YnGEZIhI5tCgfTb4Hw==, } jpeg-js@0.4.4: @@ -3753,130 +3845,24 @@ packages: } engines: { node: ">=6" } - knip@6.0.4: + knip@6.20.0: resolution: { - integrity: sha512-r/9F7wcxiFM71WgDFQiToE2hQHwZ/UkGmr74o8eiNFPIg80f7rlQHVrZiRX46Tj2yE3s96wUVNGMnsDMylgInw==, + integrity: sha512-q+HYrS7FOERk32GM7g43IdTG7TurN7+YMLZrNpCxubZPYZyQwliBgd18yH4oYQL7YgGtOxP2fCqess3K2XaK2Q==, } engines: { node: ^20.19.0 || >=22.12.0 } hasBin: true - lightningcss-android-arm64@1.32.0: - resolution: - { - integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==, - } - engines: { node: ">= 12.0.0" } - cpu: [arm64] - os: [android] - - lightningcss-darwin-arm64@1.32.0: - resolution: - { - integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==, - } - engines: { node: ">= 12.0.0" } - cpu: [arm64] - os: [darwin] - - lightningcss-darwin-x64@1.32.0: - resolution: - { - integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==, - } - engines: { node: ">= 12.0.0" } - cpu: [x64] - os: [darwin] - - lightningcss-freebsd-x64@1.32.0: - resolution: - { - integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==, - } - engines: { node: ">= 12.0.0" } - cpu: [x64] - os: [freebsd] - - lightningcss-linux-arm-gnueabihf@1.32.0: - resolution: - { - integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==, - } - engines: { node: ">= 12.0.0" } - cpu: [arm] - os: [linux] - - lightningcss-linux-arm64-gnu@1.32.0: - resolution: - { - integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==, - } - engines: { node: ">= 12.0.0" } - cpu: [arm64] - os: [linux] - - lightningcss-linux-arm64-musl@1.32.0: - resolution: - { - integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==, - } - engines: { node: ">= 12.0.0" } - cpu: [arm64] - os: [linux] - - lightningcss-linux-x64-gnu@1.32.0: - resolution: - { - integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==, - } - engines: { node: ">= 12.0.0" } - cpu: [x64] - os: [linux] - - lightningcss-linux-x64-musl@1.32.0: - resolution: - { - integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==, - } - engines: { node: ">= 12.0.0" } - cpu: [x64] - os: [linux] - - lightningcss-win32-arm64-msvc@1.32.0: - resolution: - { - integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==, - } - engines: { node: ">= 12.0.0" } - cpu: [arm64] - os: [win32] - - lightningcss-win32-x64-msvc@1.32.0: - resolution: - { - integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==, - } - engines: { node: ">= 12.0.0" } - cpu: [x64] - os: [win32] - - lightningcss@1.32.0: - resolution: - { - integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==, - } - engines: { node: ">= 12.0.0" } - lines-and-columns@1.2.4: resolution: { integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==, } - lodash@4.17.23: + lodash@4.18.1: resolution: { - integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==, + integrity: sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==, } loose-envify@1.4.0: @@ -4042,10 +4028,10 @@ packages: integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==, } - nanoid@3.3.11: + nanoid@3.3.15: resolution: { - integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==, + integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==, } engines: { node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1 } hasBin: true @@ -4057,11 +4043,12 @@ packages: } engines: { node: ">= 0.6" } - node-releases@2.0.36: + node-releases@2.0.49: resolution: { - integrity: sha512-TdC8FSgHz8Mwtw9g5L4gR/Sh9XhSP/0DEkQxfEFXOpiul5IiHgHan2VhYYb6agDSfp4KuvltmGApc8HMgUrIkA==, + integrity: sha512-f06bl1D+8ZDkn2oOQQKAh5/otFWqVnM1Q5oerA8Pex7UfT66Tx4IPHIqVVFKqFT3FUtaDstdgkM7yT7JWhqxfw==, } + engines: { node: ">=18" } object-assign@4.1.1: resolution: @@ -4110,23 +4097,23 @@ packages: integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==, } - onnxruntime-common@1.26.0: + onnxruntime-common@1.27.0: resolution: { - integrity: sha512-qVyMR4lcWgbkc4getFV+GQijsTnbg/siteoqcDwa3sI/LxbrMSNw4ePyvCq/ymdQaRomCA7YuWmhzsswxvymdw==, + integrity: sha512-3KxL5wIVqa8Ex08jxSzncm9CMgw8CjOFyOQ7SxvG9o0cVLlhTNKXyIQuTbtX4tGPJEf73OER2xrjt4HJSBL4ow==, } - onnxruntime-node@1.26.0: + onnxruntime-node@1.27.0: resolution: { - integrity: sha512-OHl6PiOEOqxaLHL0N9eFrbzS7IGmu3BtJNH3RTEnRAheCIkfc3gjcjl4sGcjp9C22ZC9YTquDOxSdT/stBQ6BQ==, + integrity: sha512-QEzGwrvNBgv4uPVdnbHsOGG4G6T96mdlcFI8aAKPjMU8wOPpVocPXb6k3QGkaZagVTv2G9Bnnbo6Z3JdXr1fQw==, } os: [win32, darwin, linux] - oxc-parser@0.120.0: + oxc-parser@0.137.0: resolution: { - integrity: sha512-WyPWZlcIm+Fkte63FGfgFB8mAAk33aH9h5N9lphXVOHSXEBFFsmYdOBedVKly363aWABjZdaj/m9lBfEY4wt+w==, + integrity: sha512-yFImD+WLElJpLKy8llG1qe4DCmMsL18peRp8XP1JKfig/gISbJkglnpDtX2aTmAn10kZF7164HbN2H8QPsXxGg==, } engines: { node: ^20.19.0 || >=22.12.0 } @@ -4137,10 +4124,10 @@ packages: } engines: { node: ">=14.0.0" } - oxc-resolver@11.19.1: + oxc-resolver@11.21.3: resolution: { - integrity: sha512-qE/CIg/spwrTBFt5aKmwe3ifeDdLfA2NESN30E42X/lII5ClF8V7Wt6WIJhcGZjp0/Q+nQ+9vgxGk//xZNX2hg==, + integrity: sha512-2Mx3fKQz7+xgrBONjsxOgCGtMHOn38/HxMzW1I5efwXB5a4lRN0Vp40gYUJFBWJslcrvwoofTrqoTnLbwTd3pA==, } oxc-resolver@5.3.0: @@ -4241,10 +4228,10 @@ packages: } engines: { node: ">=16 || 14 >=14.18" } - path-to-regexp@8.3.0: + path-to-regexp@8.4.2: resolution: { - integrity: sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==, + integrity: sha512-qRcuIdP69NPm4qbACK+aDogI5CBDMi1jKe0ry5rSQJz8JVLsC7jV8XpiJjGRLLol3N+R5ihGYcrPLTno6pAdBA==, } path-type@4.0.0: @@ -4287,13 +4274,6 @@ packages: } engines: { node: ">=8.6" } - picomatch@4.0.3: - resolution: - { - integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==, - } - engines: { node: ">=12" } - picomatch@4.0.4: resolution: { @@ -4334,16 +4314,16 @@ packages: } engines: { node: ">=16.20.0" } - pkg-types@2.3.0: + pkg-types@2.3.1: resolution: { - integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==, + integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==, } - planck@1.4.3: + planck@1.5.0: resolution: { - integrity: sha512-B+lHKhRSeg7vZOfEyEzyQVu7nx8JHcX3QgnAcHXrPW0j04XYKX5eXSiUrxH2Z5QR8OoqvjD6zKIaPMdMYAd0uA==, + integrity: sha512-dlvqJE+FscZgrGUXJ5ybd0o5bvZ5XXyZNbm08xGsXp9WjXeAyWSFT6n9s/1PQcUBo4546fDXA5RMA4wbDyZw6g==, } engines: { node: ">=24.0" } peerDependencies: @@ -4363,17 +4343,17 @@ packages: } engines: { node: ">=14.19.0" } - postcss@8.5.8: + postcss@8.5.15: resolution: { - integrity: sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==, + integrity: sha512-FfR8sjd4em2T6fb3I2MwAJU7HWVMr9zba+enmQeeWFfCbm+UOC/0X4DS8XtpUTMwWMGbjKYP7xjfNekzyGmB3A==, } engines: { node: ^10 || ^12 || >=14 } - prettier@3.8.1: + prettier@3.8.4: resolution: { - integrity: sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==, + integrity: sha512-N2MylSdi48+5N/6S5j+maeHbUSIzzZ5uOcX5Hm4QpV8Dkb1HFjfAKTKX6yNPJQD9AhcT3ifHNB66tWTTJDi11Q==, } engines: { node: ">=14" } hasBin: true @@ -4405,10 +4385,10 @@ packages: } engines: { node: ">= 0.10" } - qs@6.15.0: + qs@6.15.2: resolution: { - integrity: sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==, + integrity: sha512-Rzq0KEyX/w/tEybncDgdkZrJgVUsUMk3xjh3t5bv3S1HTAtg+uOYt72+ZfwiQwKdysThkTBdL/rTi6HDmX9Ddw==, } engines: { node: ">=0.6" } @@ -4481,10 +4461,10 @@ packages: } engines: { node: ">=0.10.0" } - react@19.2.4: + react@19.2.7: resolution: { - integrity: sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==, + integrity: sha512-HNe9WslTbXmFK8o8cmwgAeJFSBvt1bPdHCVKtaaV+WlAN36mpT4hcRpwbf3fY56ar2oIXzsBpOAiIRHAdY0OlQ==, } engines: { node: ">=0.10.0" } @@ -4557,10 +4537,10 @@ packages: integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==, } - resolve@1.22.11: + resolve@1.22.12: resolution: { - integrity: sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==, + integrity: sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==, } engines: { node: ">= 0.4" } hasBin: true @@ -4594,10 +4574,10 @@ packages: rollup: ^3.29.4 || ^4 typescript: ^4.5 || ^5.0 || ^6.0 - rollup@4.60.0: + rollup@4.62.2: resolution: { - integrity: sha512-yqjxruMGBQJ2gG4HtjZtAfXArHomazDHoFwFFmZZl0r7Pdo7qCIXKqKHZc8yeoMgzJJ+pO6pEEHa+V7uzWlrAQ==, + integrity: sha512-RFnrW4lhXA3s3eqHDZvN654g8OTjzRfqpIRJYczCGB6HzphckVAi/Qh4tbPUbRuDi7s1Llv8g/NspLkttY3gTA==, } engines: { node: ">=18.0.0", npm: ">=8.0.0" } hasBin: true @@ -4672,10 +4652,18 @@ packages: } hasBin: true - semver@7.7.4: + semver@7.8.1: resolution: { - integrity: sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==, + integrity: sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==, + } + engines: { node: ">=10" } + hasBin: true + + semver@7.8.5: + resolution: + { + integrity: sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==, } engines: { node: ">=10" } hasBin: true @@ -4721,17 +4709,17 @@ packages: } engines: { node: ">=8" } - shell-quote@1.8.3: + shell-quote@1.8.4: resolution: { - integrity: sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==, + integrity: sha512-VsC6n6vz1ihYYyZZwX7YZSF5l5x36ca17OC+a69h94YqB7X6XLwf+5MOgynYir2SLFUbl8gIYvBo8K8RoNQ6bQ==, } engines: { node: ">= 0.4" } - side-channel-list@1.0.0: + side-channel-list@1.0.1: resolution: { - integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==, + integrity: sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==, } engines: { node: ">= 0.4" } @@ -4749,10 +4737,10 @@ packages: } engines: { node: ">= 0.4" } - side-channel@1.1.0: + side-channel@1.1.1: resolution: { - integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==, + integrity: sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==, } engines: { node: ">= 0.4" } @@ -4776,10 +4764,10 @@ packages: } hasBin: true - simple-xml-to-json@1.2.4: + simple-xml-to-json@1.2.7: resolution: { - integrity: sha512-3MY16e0ocMHL7N1ufpdObURGyX+lCo0T/A+y6VCwosLdH1HSda4QZl1Sdt/O+2qWp48WFi26XEp5rF0LoaL0Dg==, + integrity: sha512-mz9VXphOxQWX3eQ/uXCtm6upltoN0DLx8Zb5T4TFC4FHB7S9FDPGre8CfLWqPWQQH/GrQYd2AXhhVM5LDpYx6Q==, } engines: { node: ">=20.12.2" } @@ -4789,10 +4777,10 @@ packages: integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==, } - smol-toml@1.6.1: + smol-toml@1.7.0: resolution: { - integrity: sha512-dWUG8F5sIIARXih1DTaQAX4SsiTXhInKf1buxdY9DIg4ZYPZK5nGM1VRIYmEbDbsHt7USo99xSLFu5Q1IqTmsg==, + integrity: sha512-aqVvWoyO21L23mb+drl4RmMXbf6N7FdHjAhTRA9ZBL7apWBgfWC16KjrASI+1p9GAroljyMHj6fK67i0UiTNvQ==, } engines: { node: ">= 18" } @@ -4822,12 +4810,12 @@ packages: integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==, } - stage-js@1.0.1: + stage-js@1.0.2: resolution: { - integrity: sha512-cz14aPp/wY0s3bkb/B93BPP5ZAEhgBbRmAT3CCDqert8eCAqIpQ0RB2zpK8Ksxf+Pisl5oTzvPHtL4CVzzeHcw==, + integrity: sha512-EWTRBYlg7Qv9wGUao99/PfRe3KaiQqWmgSvTOXvaWnu1Jk/q/vV8yJVu6bi/3EqDZeMVnCPAjheba6OFc5k1GQ==, } - engines: { node: ">=18.0" } + engines: { node: ">=24.0" } statuses@2.0.2: resolution: @@ -4856,6 +4844,13 @@ packages: } engines: { node: ">=12" } + string-width@7.2.0: + resolution: + { + integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==, + } + engines: { node: ">=18" } + string_decoder@1.3.0: resolution: { @@ -4869,6 +4864,13 @@ packages: } engines: { node: ">=8" } + strip-ansi@7.1.2: + resolution: + { + integrity: sha512-gmBGslpoQJtgnMAvOVqGZpEz9dyoKTCzy2nfz/n8aIFhN/jCE/rCmcxabB6jOOHV+0WNnylOxaxBQPSvcWklhA==, + } + engines: { node: ">=12" } + strip-ansi@7.2.0: resolution: { @@ -4924,10 +4926,10 @@ packages: } engines: { node: ">= 0.4" } - tapable@2.3.2: + tapable@2.3.3: resolution: { - integrity: sha512-1MOpMXuhGzGL5TTCZFItxCc0AARf1EZFQkGqMm7ERKj8+Hgr5oLvJOVFcC+lRmR8hCe2S3jC4T5D7Vg/d7/fhA==, + integrity: sha512-uxc/zpqFg6x7C8vOE7lh6Lbda8eEL9zmVm/PLeTPBRhh1xCgdWaQ+J1CUieGpIfm2HdtsUpRv+HshiasBMcc6A==, } engines: { node: ">=6" } @@ -4968,10 +4970,10 @@ packages: integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==, } - tinyglobby@0.2.15: + tinyglobby@0.2.17: resolution: { - integrity: sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==, + integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==, } engines: { node: ">=12.0.0" } @@ -5110,12 +5112,12 @@ packages: } engines: { node: ">=10" } - type-is@2.0.1: + type-is@2.1.0: resolution: { - integrity: sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==, + integrity: sha512-faYHw0anBbc/kWF3zFTEnxSFOAGUX9GFbOBthvDdLsIlEoWOFOtS0zgCiQYwIskL9iGXZL3kAXD8OoZ4GmMATA==, } - engines: { node: ">= 0.6" } + engines: { node: ">= 18" } typescript@5.7.3: resolution: @@ -5125,10 +5127,10 @@ packages: engines: { node: ">=14.17" } hasBin: true - unbash@2.2.0: + unbash@4.0.1: resolution: { - integrity: sha512-X2wH19RAPZE3+ldGicOkoj/SIA83OIxcJ6Cuaw23hf8Xc6fQpvZXY0SftE2JgS0QhYLUG4uwodSI3R53keyh7w==, + integrity: sha512-1ajSo3813sDoVIHx4inJdUS4l5L2ic5cFiddemPiyjb/PZEoBAhFwHtbaEdRDFxbAKy7FCG7s5ww3/uCFawuIA==, } engines: { node: ">=14" } @@ -5144,10 +5146,10 @@ packages: integrity: sha512-oi8Qy2JV4D3UQ0PsopR28CzdQ3S/5A1zwsUwp/rosSbfhJ5z7b90bIyTwi/F7hCLD4SGcZVjDzd4XoUQcEanvA==, } - undici-types@7.18.2: + undici-types@7.24.6: resolution: { - integrity: sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==, + integrity: sha512-WRNW+sJgj5OBN4/0JpHFqtqzhpbnV0GuB+OozA9gCL7a993SmU+1JBZCzLNxYsbMfIeDL+lTsphD5jN5N+n0zg==, } unpipe@1.0.0: @@ -5360,10 +5362,10 @@ packages: integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==, } - ws@7.5.10: + ws@7.5.11: resolution: { - integrity: sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==, + integrity: sha512-zS54Oen9bITtp7kp2XM3AydrCIq1D+HwJOuH+c+e4LfpL/lotP5osijd+UoMnxwAam1GN8R4KtLAyIrIcBNpiA==, } engines: { node: ">=8.3.0" } peerDependencies: @@ -5375,10 +5377,10 @@ packages: utf-8-validate: optional: true - ws@8.20.0: + ws@8.21.0: resolution: { - integrity: sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==, + integrity: sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==, } engines: { node: ">=10.0.0" } peerDependencies: @@ -5430,10 +5432,10 @@ packages: } engines: { node: ">= 6" } - yaml@2.8.3: + yaml@2.9.0: resolution: { - integrity: sha512-AvbaCLOO2Otw/lW5bmh9d/WEdcDFdQp2Z2ZUH3pX9U2ihyUY0nvLv7J6TrWowklRGPYbB/IuIMfYgxaCPg5Bpg==, + integrity: sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==, } engines: { node: ">= 14.6" } hasBin: true @@ -5458,13 +5460,13 @@ packages: integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==, } - zod-to-json-schema@3.25.1: + zod-to-json-schema@3.25.2: resolution: { - integrity: sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==, + integrity: sha512-O/PgfnpT1xKSDeQYSCfRI5Gy3hPf91mKVDuYLUHZJMiDFptvP41MSnWofm8dnCm0256ZNfZIM7DSzuSMAFnjHA==, } peerDependencies: - zod: ^3.25 || ^4 + zod: ^3.25.28 || ^4 zod@3.25.76: resolution: @@ -5472,10 +5474,10 @@ packages: integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==, } - zod@4.3.6: + zod@4.4.3: resolution: { - integrity: sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==, + integrity: sha512-ytENFjIJFl2UwYglde2jchW2Hwm4GJFLDiSXWdTrJQBIN9Fcyp7n4DhxJEiWNAJMV1/BqWfW/kkg71UDcHJyTQ==, } snapshots: @@ -5484,25 +5486,25 @@ snapshots: "@jridgewell/gen-mapping": 0.3.13 "@jridgewell/trace-mapping": 0.3.31 - "@babel/code-frame@7.29.0": + "@babel/code-frame@7.29.7": dependencies: - "@babel/helper-validator-identifier": 7.28.5 + "@babel/helper-validator-identifier": 7.29.7 js-tokens: 4.0.0 picocolors: 1.1.1 - "@babel/compat-data@7.29.0": {} + "@babel/compat-data@7.29.7": {} - "@babel/core@7.29.0": + "@babel/core@7.29.7": dependencies: - "@babel/code-frame": 7.29.0 - "@babel/generator": 7.29.1 - "@babel/helper-compilation-targets": 7.28.6 - "@babel/helper-module-transforms": 7.28.6(@babel/core@7.29.0) - "@babel/helpers": 7.29.2 - "@babel/parser": 7.29.2 - "@babel/template": 7.28.6 - "@babel/traverse": 7.29.0 - "@babel/types": 7.29.0 + "@babel/code-frame": 7.29.7 + "@babel/generator": 7.29.7 + "@babel/helper-compilation-targets": 7.29.7 + "@babel/helper-module-transforms": 7.29.7(@babel/core@7.29.7) + "@babel/helpers": 7.29.7 + "@babel/parser": 7.29.7 + "@babel/template": 7.29.7 + "@babel/traverse": 7.29.7 + "@babel/types": 7.29.7 "@jridgewell/remapping": 2.3.5 convert-source-map: 2.0.0 debug: 4.4.3 @@ -5512,98 +5514,85 @@ snapshots: transitivePeerDependencies: - supports-color - "@babel/generator@7.29.1": + "@babel/generator@7.29.7": dependencies: - "@babel/parser": 7.29.2 - "@babel/types": 7.29.0 + "@babel/parser": 7.29.7 + "@babel/types": 7.29.7 "@jridgewell/gen-mapping": 0.3.13 "@jridgewell/trace-mapping": 0.3.31 jsesc: 3.1.0 - "@babel/helper-compilation-targets@7.28.6": + "@babel/helper-compilation-targets@7.29.7": dependencies: - "@babel/compat-data": 7.29.0 - "@babel/helper-validator-option": 7.27.1 - browserslist: 4.28.1 + "@babel/compat-data": 7.29.7 + "@babel/helper-validator-option": 7.29.7 + browserslist: 4.28.4 lru-cache: 5.1.1 semver: 6.3.1 - "@babel/helper-globals@7.28.0": {} + "@babel/helper-globals@7.29.7": {} - "@babel/helper-module-imports@7.28.6": + "@babel/helper-module-imports@7.29.7": dependencies: - "@babel/traverse": 7.29.0 - "@babel/types": 7.29.0 + "@babel/traverse": 7.29.7 + "@babel/types": 7.29.7 transitivePeerDependencies: - supports-color - "@babel/helper-module-transforms@7.28.6(@babel/core@7.29.0)": + "@babel/helper-module-transforms@7.29.7(@babel/core@7.29.7)": dependencies: - "@babel/core": 7.29.0 - "@babel/helper-module-imports": 7.28.6 - "@babel/helper-validator-identifier": 7.28.5 - "@babel/traverse": 7.29.0 + "@babel/core": 7.29.7 + "@babel/helper-module-imports": 7.29.7 + "@babel/helper-validator-identifier": 7.29.7 + "@babel/traverse": 7.29.7 transitivePeerDependencies: - supports-color - "@babel/helper-plugin-utils@7.28.6": {} - - "@babel/helper-string-parser@7.27.1": {} + "@babel/helper-plugin-utils@7.29.7": {} "@babel/helper-string-parser@7.29.7": {} - "@babel/helper-validator-identifier@7.28.5": {} - "@babel/helper-validator-identifier@7.29.7": {} - "@babel/helper-validator-option@7.27.1": {} + "@babel/helper-validator-option@7.29.7": {} - "@babel/helpers@7.29.2": + "@babel/helpers@7.29.7": dependencies: - "@babel/template": 7.28.6 - "@babel/types": 7.29.0 - - "@babel/parser@7.29.2": - dependencies: - "@babel/types": 7.29.0 + "@babel/template": 7.29.7 + "@babel/types": 7.29.7 "@babel/parser@7.29.7": dependencies: "@babel/types": 7.29.7 - "@babel/plugin-transform-react-jsx-self@7.27.1(@babel/core@7.29.0)": + "@babel/plugin-transform-react-jsx-self@7.29.7(@babel/core@7.29.7)": dependencies: - "@babel/core": 7.29.0 - "@babel/helper-plugin-utils": 7.28.6 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - "@babel/plugin-transform-react-jsx-source@7.27.1(@babel/core@7.29.0)": + "@babel/plugin-transform-react-jsx-source@7.29.7(@babel/core@7.29.7)": dependencies: - "@babel/core": 7.29.0 - "@babel/helper-plugin-utils": 7.28.6 + "@babel/core": 7.29.7 + "@babel/helper-plugin-utils": 7.29.7 - "@babel/template@7.28.6": + "@babel/template@7.29.7": dependencies: - "@babel/code-frame": 7.29.0 - "@babel/parser": 7.29.2 - "@babel/types": 7.29.0 + "@babel/code-frame": 7.29.7 + "@babel/parser": 7.29.7 + "@babel/types": 7.29.7 - "@babel/traverse@7.29.0": + "@babel/traverse@7.29.7": dependencies: - "@babel/code-frame": 7.29.0 - "@babel/generator": 7.29.1 - "@babel/helper-globals": 7.28.0 - "@babel/parser": 7.29.2 - "@babel/template": 7.28.6 - "@babel/types": 7.29.0 + "@babel/code-frame": 7.29.7 + "@babel/generator": 7.29.7 + "@babel/helper-globals": 7.29.7 + "@babel/parser": 7.29.7 + "@babel/template": 7.29.7 + "@babel/types": 7.29.7 debug: 4.4.3 transitivePeerDependencies: - supports-color - "@babel/types@7.29.0": - dependencies: - "@babel/helper-string-parser": 7.27.1 - "@babel/helper-validator-identifier": 7.28.5 - "@babel/types@7.29.7": dependencies: "@babel/helper-string-parser": 7.29.7 @@ -5614,18 +5603,29 @@ snapshots: "@dimforge/rapier2d-simd-compat@0.17.3": optional: true - "@emnapi/core@1.9.1": + "@emnapi/core@1.11.0": dependencies: - "@emnapi/wasi-threads": 1.2.0 + "@emnapi/wasi-threads": 1.2.2 tslib: 2.8.1 optional: true - "@emnapi/runtime@1.9.1": + "@emnapi/core@1.11.1": dependencies: + "@emnapi/wasi-threads": 1.2.2 tslib: 2.8.1 optional: true - "@emnapi/wasi-threads@1.2.0": + "@emnapi/runtime@1.11.0": + dependencies: + tslib: 2.8.1 + optional: true + + "@emnapi/runtime@1.11.1": + dependencies: + tslib: 2.8.1 + optional: true + + "@emnapi/wasi-threads@1.2.2": dependencies: tslib: 2.8.1 optional: true @@ -5777,9 +5777,9 @@ snapshots: "@esbuild/win32-x64@0.25.12": optional: true - "@hono/node-server@1.19.11(hono@4.12.9)": + "@hono/node-server@1.19.14(hono@4.12.27)": dependencies: - hono: 4.12.9 + hono: 4.12.27 "@isaacs/cliui@8.0.2": dependencies: @@ -5940,7 +5940,7 @@ snapshots: parse-bmfont-ascii: 1.0.6 parse-bmfont-binary: 1.0.6 parse-bmfont-xml: 1.1.6 - simple-xml-to-json: 1.2.4 + simple-xml-to-json: 1.2.7 zod: 3.25.76 "@jimp/plugin-quantize@1.6.0": @@ -6000,40 +6000,47 @@ snapshots: "@jridgewell/resolve-uri": 3.1.2 "@jridgewell/sourcemap-codec": 1.5.5 - "@modelcontextprotocol/sdk@1.27.1(zod@4.3.6)": + "@modelcontextprotocol/sdk@1.29.0(zod@4.4.3)": dependencies: - "@hono/node-server": 1.19.11(hono@4.12.9) - ajv: 8.18.0 - ajv-formats: 3.0.1(ajv@8.18.0) + "@hono/node-server": 1.19.14(hono@4.12.27) + ajv: 8.20.0 + ajv-formats: 3.0.1(ajv@8.20.0) content-type: 1.0.5 cors: 2.8.6 cross-spawn: 7.0.6 eventsource: 3.0.7 - eventsource-parser: 3.0.6 + eventsource-parser: 3.1.0 express: 5.2.1 - express-rate-limit: 8.3.1(express@5.2.1) - hono: 4.12.9 - jose: 6.2.2 + express-rate-limit: 8.5.2(express@5.2.1) + hono: 4.12.27 + jose: 6.2.3 json-schema-typed: 8.0.2 pkce-challenge: 5.0.1 raw-body: 3.0.2 - zod: 4.3.6 - zod-to-json-schema: 3.25.1(zod@4.3.6) + zod: 4.4.3 + zod-to-json-schema: 3.25.2(zod@4.4.3) transitivePeerDependencies: - supports-color "@napi-rs/wasm-runtime@0.2.12": dependencies: - "@emnapi/core": 1.9.1 - "@emnapi/runtime": 1.9.1 - "@tybys/wasm-util": 0.10.1 + "@emnapi/core": 1.11.1 + "@emnapi/runtime": 1.11.1 + "@tybys/wasm-util": 0.10.3 optional: true - "@napi-rs/wasm-runtime@1.1.1": + "@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0)": dependencies: - "@emnapi/core": 1.9.1 - "@emnapi/runtime": 1.9.1 - "@tybys/wasm-util": 0.10.1 + "@emnapi/core": 1.11.0 + "@emnapi/runtime": 1.11.0 + "@tybys/wasm-util": 0.10.3 + optional: true + + "@napi-rs/wasm-runtime@1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1)": + dependencies: + "@emnapi/core": 1.11.1 + "@emnapi/runtime": 1.11.1 + "@tybys/wasm-util": 0.10.3 optional: true "@nodelib/fs.scandir@2.1.5": @@ -6048,126 +6055,145 @@ snapshots: "@nodelib/fs.scandir": 2.1.5 fastq: 1.20.1 + "@opentui/core-darwin-arm64@0.1.107": + optional: true + "@opentui/core-darwin-arm64@0.1.90": {} + "@opentui/core-darwin-x64@0.1.107": + optional: true + "@opentui/core-darwin-x64@0.1.90": {} + "@opentui/core-linux-arm64@0.1.107": + optional: true + "@opentui/core-linux-arm64@0.1.90": {} + "@opentui/core-linux-x64@0.1.107": + optional: true + "@opentui/core-linux-x64@0.1.90": {} - "@opentui/core-win32-arm64@0.1.90": + "@opentui/core-win32-arm64@0.1.107": + optional: true + + "@opentui/core-win32-x64@0.1.107": optional: true "@opentui/core-win32-x64@0.1.90": {} - "@opentui/core@0.1.90(stage-js@1.0.1)(typescript@5.7.3)(web-tree-sitter@0.25.10)": + "@opentui/core@0.1.107(stage-js@1.0.2)(typescript@5.7.3)(web-tree-sitter@0.25.10)": dependencies: bun-ffi-structs: 0.1.2(typescript@5.7.3) diff: 8.0.2 jimp: 1.6.0 marked: 17.0.1 + string-width: 7.2.0 + strip-ansi: 7.1.2 web-tree-sitter: 0.25.10 yoga-layout: 3.2.1 optionalDependencies: "@dimforge/rapier2d-simd-compat": 0.17.3 - "@opentui/core-darwin-arm64": 0.1.90 - "@opentui/core-darwin-x64": 0.1.90 - "@opentui/core-linux-arm64": 0.1.90 - "@opentui/core-linux-x64": 0.1.90 - "@opentui/core-win32-arm64": 0.1.90 - "@opentui/core-win32-x64": 0.1.90 - bun-webgpu: 0.1.5 - planck: 1.4.3(stage-js@1.0.1) + "@opentui/core-darwin-arm64": 0.1.107 + "@opentui/core-darwin-x64": 0.1.107 + "@opentui/core-linux-arm64": 0.1.107 + "@opentui/core-linux-x64": 0.1.107 + "@opentui/core-win32-arm64": 0.1.107 + "@opentui/core-win32-x64": 0.1.107 + bun-webgpu: 0.1.7 + planck: 1.5.0(stage-js@1.0.2) three: 0.177.0 transitivePeerDependencies: - stage-js - typescript - "@opentui/react@0.1.90(react-devtools-core@7.0.1)(react@19.2.4)(stage-js@1.0.1)(typescript@5.7.3)(web-tree-sitter@0.25.10)(ws@8.20.0)": + "@opentui/react@0.1.107(react-devtools-core@7.0.1)(react@19.2.7)(stage-js@1.0.2)(typescript@5.7.3)(web-tree-sitter@0.25.10)(ws@8.21.0)": dependencies: - "@opentui/core": 0.1.90(stage-js@1.0.1)(typescript@5.7.3)(web-tree-sitter@0.25.10) - react: 19.2.4 + "@opentui/core": 0.1.107(stage-js@1.0.2)(typescript@5.7.3)(web-tree-sitter@0.25.10) + react: 19.2.7 react-devtools-core: 7.0.1 - react-reconciler: 0.32.0(react@19.2.4) - ws: 8.20.0 + react-reconciler: 0.32.0(react@19.2.7) + ws: 8.21.0 transitivePeerDependencies: - stage-js - typescript - web-tree-sitter - "@oxc-parser/binding-android-arm-eabi@0.120.0": + "@oxc-parser/binding-android-arm-eabi@0.137.0": optional: true - "@oxc-parser/binding-android-arm64@0.120.0": + "@oxc-parser/binding-android-arm64@0.137.0": optional: true - "@oxc-parser/binding-darwin-arm64@0.120.0": + "@oxc-parser/binding-darwin-arm64@0.137.0": optional: true "@oxc-parser/binding-darwin-arm64@0.68.1": optional: true - "@oxc-parser/binding-darwin-x64@0.120.0": + "@oxc-parser/binding-darwin-x64@0.137.0": optional: true "@oxc-parser/binding-darwin-x64@0.68.1": optional: true - "@oxc-parser/binding-freebsd-x64@0.120.0": + "@oxc-parser/binding-freebsd-x64@0.137.0": optional: true - "@oxc-parser/binding-linux-arm-gnueabihf@0.120.0": + "@oxc-parser/binding-linux-arm-gnueabihf@0.137.0": optional: true "@oxc-parser/binding-linux-arm-gnueabihf@0.68.1": optional: true - "@oxc-parser/binding-linux-arm-musleabihf@0.120.0": + "@oxc-parser/binding-linux-arm-musleabihf@0.137.0": optional: true - "@oxc-parser/binding-linux-arm64-gnu@0.120.0": + "@oxc-parser/binding-linux-arm64-gnu@0.137.0": optional: true "@oxc-parser/binding-linux-arm64-gnu@0.68.1": optional: true - "@oxc-parser/binding-linux-arm64-musl@0.120.0": + "@oxc-parser/binding-linux-arm64-musl@0.137.0": optional: true "@oxc-parser/binding-linux-arm64-musl@0.68.1": optional: true - "@oxc-parser/binding-linux-ppc64-gnu@0.120.0": + "@oxc-parser/binding-linux-ppc64-gnu@0.137.0": optional: true - "@oxc-parser/binding-linux-riscv64-gnu@0.120.0": + "@oxc-parser/binding-linux-riscv64-gnu@0.137.0": optional: true - "@oxc-parser/binding-linux-riscv64-musl@0.120.0": + "@oxc-parser/binding-linux-riscv64-musl@0.137.0": optional: true - "@oxc-parser/binding-linux-s390x-gnu@0.120.0": + "@oxc-parser/binding-linux-s390x-gnu@0.137.0": optional: true - "@oxc-parser/binding-linux-x64-gnu@0.120.0": + "@oxc-parser/binding-linux-x64-gnu@0.137.0": optional: true "@oxc-parser/binding-linux-x64-gnu@0.68.1": optional: true - "@oxc-parser/binding-linux-x64-musl@0.120.0": + "@oxc-parser/binding-linux-x64-musl@0.137.0": optional: true "@oxc-parser/binding-linux-x64-musl@0.68.1": optional: true - "@oxc-parser/binding-openharmony-arm64@0.120.0": + "@oxc-parser/binding-openharmony-arm64@0.137.0": optional: true - "@oxc-parser/binding-wasm32-wasi@0.120.0": + "@oxc-parser/binding-wasm32-wasi@0.137.0": dependencies: - "@napi-rs/wasm-runtime": 1.1.1 + "@emnapi/core": 1.11.1 + "@emnapi/runtime": 1.11.1 + "@napi-rs/wasm-runtime": 1.1.6(@emnapi/core@1.11.1)(@emnapi/runtime@1.11.1) optional: true "@oxc-parser/binding-wasm32-wasi@0.68.1": @@ -6175,108 +6201,110 @@ snapshots: "@napi-rs/wasm-runtime": 0.2.12 optional: true - "@oxc-parser/binding-win32-arm64-msvc@0.120.0": + "@oxc-parser/binding-win32-arm64-msvc@0.137.0": optional: true "@oxc-parser/binding-win32-arm64-msvc@0.68.1": optional: true - "@oxc-parser/binding-win32-ia32-msvc@0.120.0": + "@oxc-parser/binding-win32-ia32-msvc@0.137.0": optional: true - "@oxc-parser/binding-win32-x64-msvc@0.120.0": + "@oxc-parser/binding-win32-x64-msvc@0.137.0": optional: true "@oxc-parser/binding-win32-x64-msvc@0.68.1": optional: true - "@oxc-project/types@0.120.0": {} + "@oxc-project/types@0.137.0": {} "@oxc-project/types@0.61.2": {} "@oxc-project/types@0.68.1": {} - "@oxc-resolver/binding-android-arm-eabi@11.19.1": + "@oxc-resolver/binding-android-arm-eabi@11.21.3": optional: true - "@oxc-resolver/binding-android-arm64@11.19.1": + "@oxc-resolver/binding-android-arm64@11.21.3": optional: true - "@oxc-resolver/binding-darwin-arm64@11.19.1": + "@oxc-resolver/binding-darwin-arm64@11.21.3": optional: true "@oxc-resolver/binding-darwin-arm64@5.3.0": optional: true - "@oxc-resolver/binding-darwin-x64@11.19.1": + "@oxc-resolver/binding-darwin-x64@11.21.3": optional: true "@oxc-resolver/binding-darwin-x64@5.3.0": optional: true - "@oxc-resolver/binding-freebsd-x64@11.19.1": + "@oxc-resolver/binding-freebsd-x64@11.21.3": optional: true "@oxc-resolver/binding-freebsd-x64@5.3.0": optional: true - "@oxc-resolver/binding-linux-arm-gnueabihf@11.19.1": + "@oxc-resolver/binding-linux-arm-gnueabihf@11.21.3": optional: true "@oxc-resolver/binding-linux-arm-gnueabihf@5.3.0": optional: true - "@oxc-resolver/binding-linux-arm-musleabihf@11.19.1": + "@oxc-resolver/binding-linux-arm-musleabihf@11.21.3": optional: true - "@oxc-resolver/binding-linux-arm64-gnu@11.19.1": + "@oxc-resolver/binding-linux-arm64-gnu@11.21.3": optional: true "@oxc-resolver/binding-linux-arm64-gnu@5.3.0": optional: true - "@oxc-resolver/binding-linux-arm64-musl@11.19.1": + "@oxc-resolver/binding-linux-arm64-musl@11.21.3": optional: true "@oxc-resolver/binding-linux-arm64-musl@5.3.0": optional: true - "@oxc-resolver/binding-linux-ppc64-gnu@11.19.1": + "@oxc-resolver/binding-linux-ppc64-gnu@11.21.3": optional: true - "@oxc-resolver/binding-linux-riscv64-gnu@11.19.1": + "@oxc-resolver/binding-linux-riscv64-gnu@11.21.3": optional: true "@oxc-resolver/binding-linux-riscv64-gnu@5.3.0": optional: true - "@oxc-resolver/binding-linux-riscv64-musl@11.19.1": + "@oxc-resolver/binding-linux-riscv64-musl@11.21.3": optional: true - "@oxc-resolver/binding-linux-s390x-gnu@11.19.1": + "@oxc-resolver/binding-linux-s390x-gnu@11.21.3": optional: true "@oxc-resolver/binding-linux-s390x-gnu@5.3.0": optional: true - "@oxc-resolver/binding-linux-x64-gnu@11.19.1": + "@oxc-resolver/binding-linux-x64-gnu@11.21.3": optional: true "@oxc-resolver/binding-linux-x64-gnu@5.3.0": optional: true - "@oxc-resolver/binding-linux-x64-musl@11.19.1": + "@oxc-resolver/binding-linux-x64-musl@11.21.3": optional: true "@oxc-resolver/binding-linux-x64-musl@5.3.0": optional: true - "@oxc-resolver/binding-openharmony-arm64@11.19.1": + "@oxc-resolver/binding-openharmony-arm64@11.21.3": optional: true - "@oxc-resolver/binding-wasm32-wasi@11.19.1": + "@oxc-resolver/binding-wasm32-wasi@11.21.3": dependencies: - "@napi-rs/wasm-runtime": 1.1.1 + "@emnapi/core": 1.11.0 + "@emnapi/runtime": 1.11.0 + "@napi-rs/wasm-runtime": 1.1.6(@emnapi/core@1.11.0)(@emnapi/runtime@1.11.0) optional: true "@oxc-resolver/binding-wasm32-wasi@5.3.0": @@ -6284,16 +6312,13 @@ snapshots: "@napi-rs/wasm-runtime": 0.2.12 optional: true - "@oxc-resolver/binding-win32-arm64-msvc@11.19.1": + "@oxc-resolver/binding-win32-arm64-msvc@11.21.3": optional: true "@oxc-resolver/binding-win32-arm64-msvc@5.3.0": optional: true - "@oxc-resolver/binding-win32-ia32-msvc@11.19.1": - optional: true - - "@oxc-resolver/binding-win32-x64-msvc@11.19.1": + "@oxc-resolver/binding-win32-x64-msvc@11.21.3": optional: true "@oxc-resolver/binding-win32-x64-msvc@5.3.0": @@ -6404,79 +6429,79 @@ snapshots: "@rolldown/pluginutils@1.0.0-beta.27": {} - "@rollup/rollup-android-arm-eabi@4.60.0": + "@rollup/rollup-android-arm-eabi@4.62.2": optional: true - "@rollup/rollup-android-arm64@4.60.0": + "@rollup/rollup-android-arm64@4.62.2": optional: true - "@rollup/rollup-darwin-arm64@4.60.0": + "@rollup/rollup-darwin-arm64@4.62.2": optional: true - "@rollup/rollup-darwin-x64@4.60.0": + "@rollup/rollup-darwin-x64@4.62.2": optional: true - "@rollup/rollup-freebsd-arm64@4.60.0": + "@rollup/rollup-freebsd-arm64@4.62.2": optional: true - "@rollup/rollup-freebsd-x64@4.60.0": + "@rollup/rollup-freebsd-x64@4.62.2": optional: true - "@rollup/rollup-linux-arm-gnueabihf@4.60.0": + "@rollup/rollup-linux-arm-gnueabihf@4.62.2": optional: true - "@rollup/rollup-linux-arm-musleabihf@4.60.0": + "@rollup/rollup-linux-arm-musleabihf@4.62.2": optional: true - "@rollup/rollup-linux-arm64-gnu@4.60.0": + "@rollup/rollup-linux-arm64-gnu@4.62.2": optional: true - "@rollup/rollup-linux-arm64-musl@4.60.0": + "@rollup/rollup-linux-arm64-musl@4.62.2": optional: true - "@rollup/rollup-linux-loong64-gnu@4.60.0": + "@rollup/rollup-linux-loong64-gnu@4.62.2": optional: true - "@rollup/rollup-linux-loong64-musl@4.60.0": + "@rollup/rollup-linux-loong64-musl@4.62.2": optional: true - "@rollup/rollup-linux-ppc64-gnu@4.60.0": + "@rollup/rollup-linux-ppc64-gnu@4.62.2": optional: true - "@rollup/rollup-linux-ppc64-musl@4.60.0": + "@rollup/rollup-linux-ppc64-musl@4.62.2": optional: true - "@rollup/rollup-linux-riscv64-gnu@4.60.0": + "@rollup/rollup-linux-riscv64-gnu@4.62.2": optional: true - "@rollup/rollup-linux-riscv64-musl@4.60.0": + "@rollup/rollup-linux-riscv64-musl@4.62.2": optional: true - "@rollup/rollup-linux-s390x-gnu@4.60.0": + "@rollup/rollup-linux-s390x-gnu@4.62.2": optional: true - "@rollup/rollup-linux-x64-gnu@4.60.0": + "@rollup/rollup-linux-x64-gnu@4.62.2": optional: true - "@rollup/rollup-linux-x64-musl@4.60.0": + "@rollup/rollup-linux-x64-musl@4.62.2": optional: true - "@rollup/rollup-openbsd-x64@4.60.0": + "@rollup/rollup-openbsd-x64@4.62.2": optional: true - "@rollup/rollup-openharmony-arm64@4.60.0": + "@rollup/rollup-openharmony-arm64@4.62.2": optional: true - "@rollup/rollup-win32-arm64-msvc@4.60.0": + "@rollup/rollup-win32-arm64-msvc@4.62.2": optional: true - "@rollup/rollup-win32-ia32-msvc@4.60.0": + "@rollup/rollup-win32-ia32-msvc@4.62.2": optional: true - "@rollup/rollup-win32-x64-gnu@4.60.0": + "@rollup/rollup-win32-x64-gnu@4.62.2": optional: true - "@rollup/rollup-win32-x64-msvc@4.60.0": + "@rollup/rollup-win32-x64-msvc@4.62.2": optional: true "@tokenizer/token@0.3.0": {} @@ -6488,31 +6513,31 @@ snapshots: mkdirp: 1.0.4 path-browserify: 1.0.1 - "@tybys/wasm-util@0.10.1": + "@tybys/wasm-util@0.10.3": dependencies: tslib: 2.8.1 optional: true "@types/babel__core@7.20.5": dependencies: - "@babel/parser": 7.29.2 - "@babel/types": 7.29.0 + "@babel/parser": 7.29.7 + "@babel/types": 7.29.7 "@types/babel__generator": 7.27.0 "@types/babel__template": 7.4.4 "@types/babel__traverse": 7.28.0 "@types/babel__generator@7.27.0": dependencies: - "@babel/types": 7.29.0 + "@babel/types": 7.29.7 "@types/babel__template@7.4.4": dependencies: - "@babel/parser": 7.29.2 - "@babel/types": 7.29.0 + "@babel/parser": 7.29.7 + "@babel/types": 7.29.7 "@types/babel__traverse@7.28.0": dependencies: - "@babel/types": 7.29.0 + "@babel/types": 7.29.7 "@types/chai@5.2.3": dependencies: @@ -6521,50 +6546,50 @@ snapshots: "@types/deep-eql@4.0.2": {} - "@types/estree@1.0.8": {} + "@types/estree@1.0.9": {} "@types/json5@0.0.29": {} "@types/node@16.9.1": {} - "@types/node@25.5.0": + "@types/node@25.9.4": dependencies: - undici-types: 7.18.2 + undici-types: 7.24.6 "@types/parse-json@4.0.2": {} "@types/prop-types@15.7.15": {} - "@types/react-dom@18.3.7(@types/react@18.3.28)": + "@types/react-dom@18.3.7(@types/react@18.3.31)": dependencies: - "@types/react": 18.3.28 + "@types/react": 18.3.31 - "@types/react@18.3.28": + "@types/react@18.3.31": dependencies: "@types/prop-types": 15.7.15 csstype: 3.2.3 "@types/ws@8.18.1": dependencies: - "@types/node": 25.5.0 + "@types/node": 25.9.4 "@valibot/to-json-schema@1.0.0(valibot@1.0.0(typescript@5.7.3))": dependencies: valibot: 1.0.0(typescript@5.7.3) - "@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@25.5.0)(lightningcss@1.32.0))": + "@vitejs/plugin-react@4.7.0(vite@5.4.21(@types/node@25.9.4))": dependencies: - "@babel/core": 7.29.0 - "@babel/plugin-transform-react-jsx-self": 7.27.1(@babel/core@7.29.0) - "@babel/plugin-transform-react-jsx-source": 7.27.1(@babel/core@7.29.0) + "@babel/core": 7.29.7 + "@babel/plugin-transform-react-jsx-self": 7.29.7(@babel/core@7.29.7) + "@babel/plugin-transform-react-jsx-source": 7.29.7(@babel/core@7.29.7) "@rolldown/pluginutils": 1.0.0-beta.27 "@types/babel__core": 7.20.5 react-refresh: 0.17.0 - vite: 5.4.21(@types/node@25.5.0)(lightningcss@1.32.0) + vite: 5.4.21(@types/node@25.9.4) transitivePeerDependencies: - supports-color - "@vitest/coverage-v8@3.2.6(vitest@3.2.6(@types/node@25.5.0)(lightningcss@1.32.0))": + "@vitest/coverage-v8@3.2.6(vitest@3.2.6(@types/node@25.9.4))": dependencies: "@ampproject/remapping": 2.3.0 "@bcoe/v8-coverage": 1.0.2 @@ -6579,7 +6604,7 @@ snapshots: std-env: 3.10.0 test-exclude: 7.0.2 tinyrainbow: 2.0.0 - vitest: 3.2.6(@types/node@25.5.0)(lightningcss@1.32.0) + vitest: 3.2.6(@types/node@25.9.4) transitivePeerDependencies: - supports-color @@ -6591,13 +6616,13 @@ snapshots: chai: 5.3.3 tinyrainbow: 2.0.0 - "@vitest/mocker@3.2.6(vite@5.4.21(@types/node@25.5.0)(lightningcss@1.32.0))": + "@vitest/mocker@3.2.6(vite@5.4.21(@types/node@25.9.4))": dependencies: "@vitest/spy": 3.2.6 estree-walker: 3.0.3 magic-string: 0.30.21 optionalDependencies: - vite: 5.4.21(@types/node@25.5.0)(lightningcss@1.32.0) + vite: 5.4.21(@types/node@25.9.4) "@vitest/pretty-format@3.2.6": dependencies: @@ -6625,7 +6650,7 @@ snapshots: loupe: 3.2.1 tinyrainbow: 2.0.0 - "@webgpu/types@0.1.69": + "@webgpu/types@0.1.71": optional: true abort-controller@3.0.0: @@ -6653,16 +6678,18 @@ snapshots: acorn@8.16.0: {} + acorn@8.17.0: {} + adm-zip@0.5.17: {} - ajv-formats@3.0.1(ajv@8.18.0): + ajv-formats@3.0.1(ajv@8.20.0): optionalDependencies: - ajv: 8.18.0 + ajv: 8.20.0 - ajv@8.18.0: + ajv@8.20.0: dependencies: fast-deep-equal: 3.1.3 - fast-uri: 3.1.0 + fast-uri: 3.1.2 json-schema-traverse: 1.0.0 require-from-string: 2.0.2 @@ -6692,7 +6719,7 @@ snapshots: avr-vad@1.0.10: dependencies: - onnxruntime-node: 1.26.0 + onnxruntime-node: 1.27.0 await-to-js@3.0.0: {} @@ -6702,25 +6729,25 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.10.10: {} + baseline-browser-mapping@2.10.38: {} bmp-ts@1.0.9: {} - body-parser@2.2.2: + body-parser@2.3.0: dependencies: bytes: 3.1.2 - content-type: 1.0.5 + content-type: 2.0.0 debug: 4.4.3 http-errors: 2.0.1 iconv-lite: 0.7.2 on-finished: 2.4.1 - qs: 6.15.0 + qs: 6.15.2 raw-body: 3.0.2 - type-is: 2.0.1 + type-is: 2.1.0 transitivePeerDependencies: - supports-color - brace-expansion@1.1.12: + brace-expansion@1.1.15: dependencies: balanced-match: 1.0.2 concat-map: 0.0.1 @@ -6737,13 +6764,13 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.28.1: + browserslist@4.28.4: dependencies: - baseline-browser-mapping: 2.10.10 - caniuse-lite: 1.0.30001781 - electron-to-chromium: 1.5.321 - node-releases: 2.0.36 - update-browserslist-db: 1.2.3(browserslist@4.28.1) + baseline-browser-mapping: 2.10.38 + caniuse-lite: 1.0.30001799 + electron-to-chromium: 1.5.378 + node-releases: 2.0.49 + update-browserslist-db: 1.2.3(browserslist@4.28.4) buffer@6.0.3: dependencies: @@ -6754,26 +6781,26 @@ snapshots: dependencies: typescript: 5.7.3 - bun-webgpu-darwin-arm64@0.1.6: + bun-webgpu-darwin-arm64@0.1.7: optional: true - bun-webgpu-darwin-x64@0.1.6: + bun-webgpu-darwin-x64@0.1.7: optional: true - bun-webgpu-linux-x64@0.1.6: + bun-webgpu-linux-x64@0.1.7: optional: true - bun-webgpu-win32-x64@0.1.6: + bun-webgpu-win32-x64@0.1.7: optional: true - bun-webgpu@0.1.5: + bun-webgpu@0.1.7: dependencies: - "@webgpu/types": 0.1.69 + "@webgpu/types": 0.1.71 optionalDependencies: - bun-webgpu-darwin-arm64: 0.1.6 - bun-webgpu-darwin-x64: 0.1.6 - bun-webgpu-linux-x64: 0.1.6 - bun-webgpu-win32-x64: 0.1.6 + bun-webgpu-darwin-arm64: 0.1.7 + bun-webgpu-darwin-x64: 0.1.7 + bun-webgpu-linux-x64: 0.1.7 + bun-webgpu-win32-x64: 0.1.7 optional: true bytes@3.1.2: {} @@ -6792,7 +6819,7 @@ snapshots: callsites@3.1.0: {} - caniuse-lite@1.0.30001781: {} + caniuse-lite@1.0.30001799: {} chai@5.3.3: dependencies: @@ -6833,11 +6860,11 @@ snapshots: concat-map@0.0.1: {} - concurrently@9.2.1: + concurrently@9.2.3: dependencies: chalk: 4.1.2 rxjs: 7.8.2 - shell-quote: 1.8.3 + shell-quote: 1.8.4 supports-color: 8.1.1 tree-kill: 1.2.2 yargs: 17.7.2 @@ -6846,10 +6873,12 @@ snapshots: consola@3.4.2: {} - content-disposition@1.0.1: {} + content-disposition@1.1.0: {} content-type@1.0.5: {} + content-type@2.0.0: {} + convert-source-map@2.0.0: {} cookie-signature@1.2.2: {} @@ -6895,11 +6924,11 @@ snapshots: has-property-descriptors: 1.0.2 object-keys: 1.1.1 - defu@6.1.4: {} + defu@6.1.7: {} depd@2.0.0: {} - dependency-cruiser@17.3.9: + dependency-cruiser@17.4.3: dependencies: acorn: 8.16.0 acorn-jsx: 5.3.2(acorn@8.16.0) @@ -6907,22 +6936,19 @@ snapshots: acorn-loose: 8.5.2 acorn-walk: 8.3.5 commander: 14.0.3 - enhanced-resolve: 5.20.0 + enhanced-resolve: 5.22.1 ignore: 7.0.5 interpret: 3.1.1 is-installed-globally: 1.0.0 json5: 2.2.3 - picomatch: 4.0.3 + picomatch: 4.0.4 prompts: 2.4.2 rechoir: 0.8.0 safe-regex: 2.1.1 - semver: 7.7.4 + semver: 7.8.1 tsconfig-paths-webpack-plugin: 4.2.0 watskeburt: 5.0.3 - detect-libc@2.1.2: - optional: true - diff@7.0.0: {} diff@8.0.2: {} @@ -6939,7 +6965,9 @@ snapshots: ee-first@1.1.1: {} - electron-to-chromium@1.5.321: {} + electron-to-chromium@1.5.378: {} + + emoji-regex@10.6.0: {} emoji-regex@8.0.0: {} @@ -6947,10 +6975,10 @@ snapshots: encodeurl@2.0.0: {} - enhanced-resolve@5.20.0: + enhanced-resolve@5.22.1: dependencies: graceful-fs: 4.2.11 - tapable: 2.3.2 + tapable: 2.3.3 error-ex@1.3.4: dependencies: @@ -6962,7 +6990,7 @@ snapshots: es-module-lexer@1.7.0: {} - es-object-atoms@1.1.1: + es-object-atoms@1.1.2: dependencies: es-errors: 1.3.0 @@ -7029,7 +7057,7 @@ snapshots: estree-walker@3.0.3: dependencies: - "@types/estree": 1.0.8 + "@types/estree": 1.0.9 etag@1.8.1: {} @@ -7037,26 +7065,26 @@ snapshots: events@3.3.0: {} - eventsource-parser@3.0.6: {} + eventsource-parser@3.1.0: {} eventsource@3.0.7: dependencies: - eventsource-parser: 3.0.6 + eventsource-parser: 3.1.0 exif-parser@0.1.12: {} expect-type@1.3.0: {} - express-rate-limit@8.3.1(express@5.2.1): + express-rate-limit@8.5.2(express@5.2.1): dependencies: express: 5.2.1 - ip-address: 10.1.0 + ip-address: 10.2.0 express@5.2.1: dependencies: accepts: 2.0.0 - body-parser: 2.2.2 - content-disposition: 1.0.1 + body-parser: 2.3.0 + content-disposition: 1.1.0 content-type: 1.0.5 cookie: 0.7.2 cookie-signature: 1.2.2 @@ -7074,18 +7102,18 @@ snapshots: once: 1.4.0 parseurl: 1.3.3 proxy-addr: 2.0.7 - qs: 6.15.0 + qs: 6.15.2 range-parser: 1.2.1 router: 2.2.0 send: 1.2.1 serve-static: 2.2.1 statuses: 2.0.2 - type-is: 2.0.1 + type-is: 2.1.0 vary: 1.1.2 transitivePeerDependencies: - supports-color - exsolve@1.0.8: {} + exsolve@1.1.0: {} fast-deep-equal@3.1.3: {} @@ -7097,7 +7125,7 @@ snapshots: merge2: 1.4.1 micromatch: 4.0.8 - fast-uri@3.1.0: {} + fast-uri@3.1.2: {} fastq@1.20.1: dependencies: @@ -7154,25 +7182,27 @@ snapshots: get-caller-file@2.0.5: {} + get-east-asian-width@1.6.0: {} + get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 es-define-property: 1.0.1 es-errors: 1.3.0 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 function-bind: 1.1.2 get-proto: 1.0.1 gopd: 1.2.0 has-symbols: 1.1.0 - hasown: 2.0.2 + hasown: 2.0.4 math-intrinsics: 1.1.0 get-proto@1.0.1: dependencies: dunder-proto: 1.0.1 - es-object-atoms: 1.1.1 + es-object-atoms: 1.1.2 - get-tsconfig@4.13.7: + get-tsconfig@4.14.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -7185,7 +7215,7 @@ snapshots: dependencies: is-glob: 4.0.3 - glob@10.5.0: + glob@10.4.5: dependencies: foreground-child: 3.3.1 jackspeak: 3.4.3 @@ -7198,7 +7228,7 @@ snapshots: dependencies: globalthis: 1.0.4 matcher: 4.0.0 - semver: 7.7.4 + semver: 7.8.5 serialize-error: 8.1.0 global-directory@4.0.1: @@ -7222,11 +7252,11 @@ snapshots: has-symbols@1.1.0: {} - hasown@2.0.2: + hasown@2.0.4: dependencies: function-bind: 1.1.2 - hono@4.12.9: {} + hono@4.12.27: {} html-escaper@2.0.2: {} @@ -7261,15 +7291,15 @@ snapshots: interpret@3.1.1: {} - ip-address@10.1.0: {} + ip-address@10.2.0: {} ipaddr.js@1.9.1: {} is-arrayish@0.2.1: {} - is-core-module@2.16.1: + is-core-module@2.16.2: dependencies: - hasown: 2.0.2 + hasown: 2.0.4 is-extglob@2.1.1: {} @@ -7349,9 +7379,9 @@ snapshots: "@jimp/types": 1.6.0 "@jimp/utils": 1.6.0 - jiti@2.6.1: {} + jiti@2.7.0: {} - jose@6.2.2: {} + jose@6.2.3: {} jpeg-js@0.4.4: {} @@ -7377,77 +7407,25 @@ snapshots: kleur@3.0.3: {} - knip@6.0.4: + knip@6.20.0: dependencies: - "@nodelib/fs.walk": 1.2.8 - fast-glob: 3.3.3 + fdir: 6.5.0(picomatch@4.0.4) formatly: 0.3.0 - get-tsconfig: 4.13.7 - jiti: 2.6.1 - minimist: 1.2.8 - oxc-parser: 0.120.0 - oxc-resolver: 11.19.1 - picocolors: 1.1.1 + get-tsconfig: 4.14.0 + jiti: 2.7.0 + oxc-parser: 0.137.0 + oxc-resolver: 11.21.3 picomatch: 4.0.4 - smol-toml: 1.6.1 + smol-toml: 1.7.0 strip-json-comments: 5.0.3 - unbash: 2.2.0 - yaml: 2.8.3 - zod: 4.3.6 - - lightningcss-android-arm64@1.32.0: - optional: true - - lightningcss-darwin-arm64@1.32.0: - optional: true - - lightningcss-darwin-x64@1.32.0: - optional: true - - lightningcss-freebsd-x64@1.32.0: - optional: true - - lightningcss-linux-arm-gnueabihf@1.32.0: - optional: true - - lightningcss-linux-arm64-gnu@1.32.0: - optional: true - - lightningcss-linux-arm64-musl@1.32.0: - optional: true - - lightningcss-linux-x64-gnu@1.32.0: - optional: true - - lightningcss-linux-x64-musl@1.32.0: - optional: true - - lightningcss-win32-arm64-msvc@1.32.0: - optional: true - - lightningcss-win32-x64-msvc@1.32.0: - optional: true - - lightningcss@1.32.0: - dependencies: - detect-libc: 2.1.2 - optionalDependencies: - lightningcss-android-arm64: 1.32.0 - lightningcss-darwin-arm64: 1.32.0 - lightningcss-darwin-x64: 1.32.0 - lightningcss-freebsd-x64: 1.32.0 - lightningcss-linux-arm-gnueabihf: 1.32.0 - lightningcss-linux-arm64-gnu: 1.32.0 - lightningcss-linux-arm64-musl: 1.32.0 - lightningcss-linux-x64-gnu: 1.32.0 - lightningcss-linux-x64-musl: 1.32.0 - lightningcss-win32-arm64-msvc: 1.32.0 - lightningcss-win32-x64-msvc: 1.32.0 - optional: true + tinyglobby: 0.2.17 + unbash: 4.0.1 + yaml: 2.9.0 + zod: 4.4.3 lines-and-columns@1.2.4: {} - lodash@4.17.23: {} + lodash@4.18.1: {} loose-envify@1.4.0: dependencies: @@ -7473,7 +7451,7 @@ snapshots: make-dir@4.0.0: dependencies: - semver: 7.7.4 + semver: 7.8.5 marked@17.0.1: {} @@ -7508,7 +7486,7 @@ snapshots: minimatch@3.1.5: dependencies: - brace-expansion: 1.1.12 + brace-expansion: 1.1.15 minimatch@9.0.9: dependencies: @@ -7522,11 +7500,11 @@ snapshots: ms@2.1.3: {} - nanoid@3.3.11: {} + nanoid@3.3.15: {} negotiator@1.0.0: {} - node-releases@2.0.36: {} + node-releases@2.0.49: {} object-assign@4.1.1: {} @@ -7546,38 +7524,38 @@ snapshots: dependencies: wrappy: 1.0.2 - onnxruntime-common@1.26.0: {} + onnxruntime-common@1.27.0: {} - onnxruntime-node@1.26.0: + onnxruntime-node@1.27.0: dependencies: adm-zip: 0.5.17 global-agent: 4.1.3 - onnxruntime-common: 1.26.0 + onnxruntime-common: 1.27.0 - oxc-parser@0.120.0: + oxc-parser@0.137.0: dependencies: - "@oxc-project/types": 0.120.0 + "@oxc-project/types": 0.137.0 optionalDependencies: - "@oxc-parser/binding-android-arm-eabi": 0.120.0 - "@oxc-parser/binding-android-arm64": 0.120.0 - "@oxc-parser/binding-darwin-arm64": 0.120.0 - "@oxc-parser/binding-darwin-x64": 0.120.0 - "@oxc-parser/binding-freebsd-x64": 0.120.0 - "@oxc-parser/binding-linux-arm-gnueabihf": 0.120.0 - "@oxc-parser/binding-linux-arm-musleabihf": 0.120.0 - "@oxc-parser/binding-linux-arm64-gnu": 0.120.0 - "@oxc-parser/binding-linux-arm64-musl": 0.120.0 - "@oxc-parser/binding-linux-ppc64-gnu": 0.120.0 - "@oxc-parser/binding-linux-riscv64-gnu": 0.120.0 - "@oxc-parser/binding-linux-riscv64-musl": 0.120.0 - "@oxc-parser/binding-linux-s390x-gnu": 0.120.0 - "@oxc-parser/binding-linux-x64-gnu": 0.120.0 - "@oxc-parser/binding-linux-x64-musl": 0.120.0 - "@oxc-parser/binding-openharmony-arm64": 0.120.0 - "@oxc-parser/binding-wasm32-wasi": 0.120.0 - "@oxc-parser/binding-win32-arm64-msvc": 0.120.0 - "@oxc-parser/binding-win32-ia32-msvc": 0.120.0 - "@oxc-parser/binding-win32-x64-msvc": 0.120.0 + "@oxc-parser/binding-android-arm-eabi": 0.137.0 + "@oxc-parser/binding-android-arm64": 0.137.0 + "@oxc-parser/binding-darwin-arm64": 0.137.0 + "@oxc-parser/binding-darwin-x64": 0.137.0 + "@oxc-parser/binding-freebsd-x64": 0.137.0 + "@oxc-parser/binding-linux-arm-gnueabihf": 0.137.0 + "@oxc-parser/binding-linux-arm-musleabihf": 0.137.0 + "@oxc-parser/binding-linux-arm64-gnu": 0.137.0 + "@oxc-parser/binding-linux-arm64-musl": 0.137.0 + "@oxc-parser/binding-linux-ppc64-gnu": 0.137.0 + "@oxc-parser/binding-linux-riscv64-gnu": 0.137.0 + "@oxc-parser/binding-linux-riscv64-musl": 0.137.0 + "@oxc-parser/binding-linux-s390x-gnu": 0.137.0 + "@oxc-parser/binding-linux-x64-gnu": 0.137.0 + "@oxc-parser/binding-linux-x64-musl": 0.137.0 + "@oxc-parser/binding-openharmony-arm64": 0.137.0 + "@oxc-parser/binding-wasm32-wasi": 0.137.0 + "@oxc-parser/binding-win32-arm64-msvc": 0.137.0 + "@oxc-parser/binding-win32-ia32-msvc": 0.137.0 + "@oxc-parser/binding-win32-x64-msvc": 0.137.0 oxc-parser@0.68.1: dependencies: @@ -7594,28 +7572,27 @@ snapshots: "@oxc-parser/binding-win32-arm64-msvc": 0.68.1 "@oxc-parser/binding-win32-x64-msvc": 0.68.1 - oxc-resolver@11.19.1: + oxc-resolver@11.21.3: optionalDependencies: - "@oxc-resolver/binding-android-arm-eabi": 11.19.1 - "@oxc-resolver/binding-android-arm64": 11.19.1 - "@oxc-resolver/binding-darwin-arm64": 11.19.1 - "@oxc-resolver/binding-darwin-x64": 11.19.1 - "@oxc-resolver/binding-freebsd-x64": 11.19.1 - "@oxc-resolver/binding-linux-arm-gnueabihf": 11.19.1 - "@oxc-resolver/binding-linux-arm-musleabihf": 11.19.1 - "@oxc-resolver/binding-linux-arm64-gnu": 11.19.1 - "@oxc-resolver/binding-linux-arm64-musl": 11.19.1 - "@oxc-resolver/binding-linux-ppc64-gnu": 11.19.1 - "@oxc-resolver/binding-linux-riscv64-gnu": 11.19.1 - "@oxc-resolver/binding-linux-riscv64-musl": 11.19.1 - "@oxc-resolver/binding-linux-s390x-gnu": 11.19.1 - "@oxc-resolver/binding-linux-x64-gnu": 11.19.1 - "@oxc-resolver/binding-linux-x64-musl": 11.19.1 - "@oxc-resolver/binding-openharmony-arm64": 11.19.1 - "@oxc-resolver/binding-wasm32-wasi": 11.19.1 - "@oxc-resolver/binding-win32-arm64-msvc": 11.19.1 - "@oxc-resolver/binding-win32-ia32-msvc": 11.19.1 - "@oxc-resolver/binding-win32-x64-msvc": 11.19.1 + "@oxc-resolver/binding-android-arm-eabi": 11.21.3 + "@oxc-resolver/binding-android-arm64": 11.21.3 + "@oxc-resolver/binding-darwin-arm64": 11.21.3 + "@oxc-resolver/binding-darwin-x64": 11.21.3 + "@oxc-resolver/binding-freebsd-x64": 11.21.3 + "@oxc-resolver/binding-linux-arm-gnueabihf": 11.21.3 + "@oxc-resolver/binding-linux-arm-musleabihf": 11.21.3 + "@oxc-resolver/binding-linux-arm64-gnu": 11.21.3 + "@oxc-resolver/binding-linux-arm64-musl": 11.21.3 + "@oxc-resolver/binding-linux-ppc64-gnu": 11.21.3 + "@oxc-resolver/binding-linux-riscv64-gnu": 11.21.3 + "@oxc-resolver/binding-linux-riscv64-musl": 11.21.3 + "@oxc-resolver/binding-linux-s390x-gnu": 11.21.3 + "@oxc-resolver/binding-linux-x64-gnu": 11.21.3 + "@oxc-resolver/binding-linux-x64-musl": 11.21.3 + "@oxc-resolver/binding-openharmony-arm64": 11.21.3 + "@oxc-resolver/binding-wasm32-wasi": 11.21.3 + "@oxc-resolver/binding-win32-arm64-msvc": 11.21.3 + "@oxc-resolver/binding-win32-x64-msvc": 11.21.3 oxc-resolver@5.3.0: optionalDependencies: @@ -7676,7 +7653,7 @@ snapshots: parse-json@5.2.0: dependencies: - "@babel/code-frame": 7.29.0 + "@babel/code-frame": 7.29.7 error-ex: 1.3.4 json-parse-even-better-errors: 2.3.1 lines-and-columns: 1.2.4 @@ -7694,7 +7671,7 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.3 - path-to-regexp@8.3.0: {} + path-to-regexp@8.4.2: {} path-type@4.0.0: {} @@ -7708,8 +7685,6 @@ snapshots: picomatch@2.3.2: {} - picomatch@4.0.3: {} - picomatch@4.0.4: {} pino-abstract-transport@2.0.0: @@ -7738,28 +7713,28 @@ snapshots: pkce-challenge@5.0.1: {} - pkg-types@2.3.0: + pkg-types@2.3.1: dependencies: confbox: 0.2.4 - exsolve: 1.0.8 + exsolve: 1.1.0 pathe: 2.0.3 - planck@1.4.3(stage-js@1.0.1): + planck@1.5.0(stage-js@1.0.2): dependencies: - stage-js: 1.0.1 + stage-js: 1.0.2 optional: true pngjs@6.0.0: {} pngjs@7.0.0: {} - postcss@8.5.8: + postcss@8.5.15: dependencies: - nanoid: 3.3.11 + nanoid: 3.3.15 picocolors: 1.1.1 source-map-js: 1.2.1 - prettier@3.8.1: {} + prettier@3.8.4: {} process-warning@5.0.0: {} @@ -7775,9 +7750,9 @@ snapshots: forwarded: 0.2.0 ipaddr.js: 1.9.1 - qs@6.15.0: + qs@6.15.2: dependencies: - side-channel: 1.1.0 + side-channel: 1.1.1 quansync@1.0.0: {} @@ -7796,8 +7771,8 @@ snapshots: react-devtools-core@7.0.1: dependencies: - shell-quote: 1.8.3 - ws: 7.5.10 + shell-quote: 1.8.4 + ws: 7.5.11 transitivePeerDependencies: - bufferutil - utf-8-validate @@ -7808,9 +7783,9 @@ snapshots: react: 18.3.1 scheduler: 0.23.2 - react-reconciler@0.32.0(react@19.2.4): + react-reconciler@0.32.0(react@19.2.7): dependencies: - react: 19.2.4 + react: 19.2.7 scheduler: 0.26.0 react-refresh@0.17.0: {} @@ -7819,7 +7794,7 @@ snapshots: dependencies: loose-envify: 1.4.0 - react@19.2.4: {} + react@19.2.7: {} readable-stream@4.7.0: dependencies: @@ -7839,7 +7814,7 @@ snapshots: rechoir@0.8.0: dependencies: - resolve: 1.22.11 + resolve: 1.22.12 regexp-tree@0.1.27: {} @@ -7851,9 +7826,10 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve@1.22.11: + resolve@1.22.12: dependencies: - is-core-module: 2.16.1 + es-errors: 1.3.0 + is-core-module: 2.16.2 path-parse: 1.0.7 supports-preserve-symlinks-flag: 1.0.0 @@ -7880,46 +7856,46 @@ snapshots: transitivePeerDependencies: - typescript - rollup-plugin-dts@6.4.1(rollup@4.60.0)(typescript@5.7.3): + rollup-plugin-dts@6.4.1(rollup@4.62.2)(typescript@5.7.3): dependencies: "@jridgewell/remapping": 2.3.5 "@jridgewell/sourcemap-codec": 1.5.5 convert-source-map: 2.0.0 magic-string: 0.30.21 - rollup: 4.60.0 + rollup: 4.62.2 typescript: 5.7.3 optionalDependencies: - "@babel/code-frame": 7.29.0 + "@babel/code-frame": 7.29.7 - rollup@4.60.0: + rollup@4.62.2: dependencies: - "@types/estree": 1.0.8 + "@types/estree": 1.0.9 optionalDependencies: - "@rollup/rollup-android-arm-eabi": 4.60.0 - "@rollup/rollup-android-arm64": 4.60.0 - "@rollup/rollup-darwin-arm64": 4.60.0 - "@rollup/rollup-darwin-x64": 4.60.0 - "@rollup/rollup-freebsd-arm64": 4.60.0 - "@rollup/rollup-freebsd-x64": 4.60.0 - "@rollup/rollup-linux-arm-gnueabihf": 4.60.0 - "@rollup/rollup-linux-arm-musleabihf": 4.60.0 - "@rollup/rollup-linux-arm64-gnu": 4.60.0 - "@rollup/rollup-linux-arm64-musl": 4.60.0 - "@rollup/rollup-linux-loong64-gnu": 4.60.0 - "@rollup/rollup-linux-loong64-musl": 4.60.0 - "@rollup/rollup-linux-ppc64-gnu": 4.60.0 - "@rollup/rollup-linux-ppc64-musl": 4.60.0 - "@rollup/rollup-linux-riscv64-gnu": 4.60.0 - "@rollup/rollup-linux-riscv64-musl": 4.60.0 - "@rollup/rollup-linux-s390x-gnu": 4.60.0 - "@rollup/rollup-linux-x64-gnu": 4.60.0 - "@rollup/rollup-linux-x64-musl": 4.60.0 - "@rollup/rollup-openbsd-x64": 4.60.0 - "@rollup/rollup-openharmony-arm64": 4.60.0 - "@rollup/rollup-win32-arm64-msvc": 4.60.0 - "@rollup/rollup-win32-ia32-msvc": 4.60.0 - "@rollup/rollup-win32-x64-gnu": 4.60.0 - "@rollup/rollup-win32-x64-msvc": 4.60.0 + "@rollup/rollup-android-arm-eabi": 4.62.2 + "@rollup/rollup-android-arm64": 4.62.2 + "@rollup/rollup-darwin-arm64": 4.62.2 + "@rollup/rollup-darwin-x64": 4.62.2 + "@rollup/rollup-freebsd-arm64": 4.62.2 + "@rollup/rollup-freebsd-x64": 4.62.2 + "@rollup/rollup-linux-arm-gnueabihf": 4.62.2 + "@rollup/rollup-linux-arm-musleabihf": 4.62.2 + "@rollup/rollup-linux-arm64-gnu": 4.62.2 + "@rollup/rollup-linux-arm64-musl": 4.62.2 + "@rollup/rollup-linux-loong64-gnu": 4.62.2 + "@rollup/rollup-linux-loong64-musl": 4.62.2 + "@rollup/rollup-linux-ppc64-gnu": 4.62.2 + "@rollup/rollup-linux-ppc64-musl": 4.62.2 + "@rollup/rollup-linux-riscv64-gnu": 4.62.2 + "@rollup/rollup-linux-riscv64-musl": 4.62.2 + "@rollup/rollup-linux-s390x-gnu": 4.62.2 + "@rollup/rollup-linux-x64-gnu": 4.62.2 + "@rollup/rollup-linux-x64-musl": 4.62.2 + "@rollup/rollup-openbsd-x64": 4.62.2 + "@rollup/rollup-openharmony-arm64": 4.62.2 + "@rollup/rollup-win32-arm64-msvc": 4.62.2 + "@rollup/rollup-win32-ia32-msvc": 4.62.2 + "@rollup/rollup-win32-x64-gnu": 4.62.2 + "@rollup/rollup-win32-x64-msvc": 4.62.2 fsevents: 2.3.3 router@2.2.0: @@ -7928,7 +7904,7 @@ snapshots: depd: 2.0.0 is-promise: 4.0.0 parseurl: 1.3.3 - path-to-regexp: 8.3.0 + path-to-regexp: 8.4.2 transitivePeerDependencies: - supports-color @@ -7960,7 +7936,9 @@ snapshots: semver@6.3.1: {} - semver@7.7.4: {} + semver@7.8.1: {} + + semver@7.8.5: {} send@1.2.1: dependencies: @@ -7999,9 +7977,9 @@ snapshots: shebang-regex@3.0.0: {} - shell-quote@1.8.3: {} + shell-quote@1.8.4: {} - side-channel-list@1.0.0: + side-channel-list@1.0.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 @@ -8021,11 +7999,11 @@ snapshots: object-inspect: 1.13.4 side-channel-map: 1.0.1 - side-channel@1.1.0: + side-channel@1.1.1: dependencies: es-errors: 1.3.0 object-inspect: 1.13.4 - side-channel-list: 1.0.0 + side-channel-list: 1.0.1 side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 @@ -8035,11 +8013,11 @@ snapshots: simple-git-hooks@2.13.1: {} - simple-xml-to-json@1.2.4: {} + simple-xml-to-json@1.2.7: {} sisteransi@1.0.5: {} - smol-toml@1.6.1: {} + smol-toml@1.7.0: {} sonic-boom@4.2.1: dependencies: @@ -8051,7 +8029,7 @@ snapshots: stackback@0.0.2: {} - stage-js@1.0.1: + stage-js@1.0.2: optional: true statuses@2.0.2: {} @@ -8070,6 +8048,12 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.2.0 + string-width@7.2.0: + dependencies: + emoji-regex: 10.6.0 + get-east-asian-width: 1.6.0 + strip-ansi: 7.1.2 + string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -8078,6 +8062,10 @@ snapshots: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.2: + dependencies: + ansi-regex: 6.2.2 + strip-ansi@7.2.0: dependencies: ansi-regex: 6.2.2 @@ -8105,12 +8093,12 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - tapable@2.3.2: {} + tapable@2.3.3: {} test-exclude@7.0.2: dependencies: "@istanbuljs/schema": 0.1.6 - glob: 10.5.0 + glob: 10.4.5 minimatch: 10.2.5 thread-stream@3.2.0: @@ -8126,7 +8114,7 @@ snapshots: tinyexec@0.3.2: {} - tinyglobby@0.2.15: + tinyglobby@0.2.17: dependencies: fdir: 6.5.0(picomatch@4.0.4) picomatch: 4.0.4 @@ -8162,7 +8150,7 @@ snapshots: commander: 6.2.1 cosmiconfig: 7.1.0 json5: 2.2.3 - lodash: 4.17.23 + lodash: 4.18.1 true-myth: 4.1.1 ts-morph: 13.0.3 @@ -8175,8 +8163,8 @@ snapshots: tsconfig-paths-webpack-plugin@4.2.0: dependencies: chalk: 4.1.2 - enhanced-resolve: 5.20.0 - tapable: 2.3.2 + enhanced-resolve: 5.22.1 + tapable: 2.3.3 tsconfig-paths: 4.2.0 tsconfig-paths@3.15.0: @@ -8201,11 +8189,11 @@ snapshots: debug: 4.4.3 diff: 7.0.0 oxc-resolver: 5.3.0 - pkg-types: 2.3.0 + pkg-types: 2.3.1 rolldown: 1.0.0-beta.7(typescript@5.7.3) - rollup: 4.60.0 - rollup-plugin-dts: 6.4.1(rollup@4.60.0)(typescript@5.7.3) - tinyglobby: 0.2.15 + rollup: 4.62.2 + rollup-plugin-dts: 6.4.1(rollup@4.62.2)(typescript@5.7.3) + tinyglobby: 0.2.17 unconfig: 7.5.0 unplugin-isolated-decl: 0.13.11(typescript@5.7.3) transitivePeerDependencies: @@ -8219,21 +8207,21 @@ snapshots: tsx@4.19.4: dependencies: esbuild: 0.25.12 - get-tsconfig: 4.13.7 + get-tsconfig: 4.14.0 optionalDependencies: fsevents: 2.3.3 type-fest@0.20.2: {} - type-is@2.0.1: + type-is@2.1.0: dependencies: - content-type: 1.0.5 + content-type: 2.0.0 media-typer: 1.1.0 mime-types: 3.0.2 typescript@5.7.3: {} - unbash@2.2.0: {} + unbash@4.0.1: {} unconfig-core@7.5.0: dependencies: @@ -8243,12 +8231,12 @@ snapshots: unconfig@7.5.0: dependencies: "@quansync/fs": 1.0.0 - defu: 6.1.4 - jiti: 2.6.1 + defu: 6.1.7 + jiti: 2.7.0 quansync: 1.0.0 unconfig-core: 7.5.0 - undici-types@7.18.2: {} + undici-types@7.24.6: {} unpipe@1.0.0: {} @@ -8273,13 +8261,13 @@ snapshots: unplugin@2.3.11: dependencies: "@jridgewell/remapping": 2.3.5 - acorn: 8.16.0 + acorn: 8.17.0 picomatch: 4.0.4 webpack-virtual-modules: 0.6.2 - update-browserslist-db@1.2.3(browserslist@4.28.1): + update-browserslist-db@1.2.3(browserslist@4.28.4): dependencies: - browserslist: 4.28.1 + browserslist: 4.28.4 escalade: 3.2.0 picocolors: 1.1.1 @@ -8293,13 +8281,13 @@ snapshots: vary@1.1.2: {} - vite-node@3.2.4(@types/node@25.5.0)(lightningcss@1.32.0): + vite-node@3.2.4(@types/node@25.9.4): dependencies: cac: 6.7.14 debug: 4.4.3 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 5.4.21(@types/node@25.5.0)(lightningcss@1.32.0) + vite: 5.4.21(@types/node@25.9.4) transitivePeerDependencies: - "@types/node" - less @@ -8311,21 +8299,20 @@ snapshots: - supports-color - terser - vite@5.4.21(@types/node@25.5.0)(lightningcss@1.32.0): + vite@5.4.21(@types/node@25.9.4): dependencies: esbuild: 0.21.5 - postcss: 8.5.8 - rollup: 4.60.0 + postcss: 8.5.15 + rollup: 4.62.2 optionalDependencies: - "@types/node": 25.5.0 + "@types/node": 25.9.4 fsevents: 2.3.3 - lightningcss: 1.32.0 - vitest@3.2.6(@types/node@25.5.0)(lightningcss@1.32.0): + vitest@3.2.6(@types/node@25.9.4): dependencies: "@types/chai": 5.2.3 "@vitest/expect": 3.2.6 - "@vitest/mocker": 3.2.6(vite@5.4.21(@types/node@25.5.0)(lightningcss@1.32.0)) + "@vitest/mocker": 3.2.6(vite@5.4.21(@types/node@25.9.4)) "@vitest/pretty-format": 3.2.6 "@vitest/runner": 3.2.6 "@vitest/snapshot": 3.2.6 @@ -8340,14 +8327,14 @@ snapshots: std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 - tinyglobby: 0.2.15 + tinyglobby: 0.2.17 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 5.4.21(@types/node@25.5.0)(lightningcss@1.32.0) - vite-node: 3.2.4(@types/node@25.5.0)(lightningcss@1.32.0) + vite: 5.4.21(@types/node@25.9.4) + vite-node: 3.2.4(@types/node@25.9.4) why-is-node-running: 2.3.0 optionalDependencies: - "@types/node": 25.5.0 + "@types/node": 25.9.4 transitivePeerDependencies: - less - lightningcss @@ -8390,9 +8377,9 @@ snapshots: wrappy@1.0.2: {} - ws@7.5.10: {} + ws@7.5.11: {} - ws@8.20.0: {} + ws@8.21.0: {} xml-parse-from-string@1.0.1: {} @@ -8409,7 +8396,7 @@ snapshots: yaml@1.10.3: {} - yaml@2.8.3: {} + yaml@2.9.0: {} yargs-parser@21.1.1: {} @@ -8425,10 +8412,10 @@ snapshots: yoga-layout@3.2.1: {} - zod-to-json-schema@3.25.1(zod@4.3.6): + zod-to-json-schema@3.25.2(zod@4.4.3): dependencies: - zod: 4.3.6 + zod: 4.4.3 zod@3.25.76: {} - zod@4.3.6: {} + zod@4.4.3: {} diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 2afb927..8112310 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,7 @@ packages: - . - packages/* + - packages/agent-sdk - apps/* - extensions/* - ui diff --git a/scripts/build-binary-bundle.mjs b/scripts/build-binary-bundle.mjs index 39cd8cb..71f5f46 100644 --- a/scripts/build-binary-bundle.mjs +++ b/scripts/build-binary-bundle.mjs @@ -64,7 +64,6 @@ await build({ }, define: { "process.env.STEP_CLI_BUILD_VERSION": JSON.stringify(buildVersion), - "process.env.STEP_CLI_ENABLE_OPENTUI": JSON.stringify("0"), }, output: { file: bundlePath, diff --git a/scripts/build-packages.mjs b/scripts/build-packages.mjs index 5dc97e9..1147f0e 100644 --- a/scripts/build-packages.mjs +++ b/scripts/build-packages.mjs @@ -24,6 +24,10 @@ const buildTargets = [ name: "@step-cli/utils", dirPath: "packages/utils", }, + { + name: "@step-cli/agent-sdk", + dirPath: "packages/agent-sdk", + }, { name: "@step-cli/core", dirPath: "packages/core", diff --git a/skills/builtin/src/index.ts b/skills/builtin/src/index.ts index d3fb361..503bdcb 100644 --- a/skills/builtin/src/index.ts +++ b/skills/builtin/src/index.ts @@ -10,5 +10,6 @@ export * from "./code-mode-plugin.js"; export * from "./plan-plugin.js"; export * from "./agent-team-plugin.js"; export * from "./subagent-plugin.js"; +export * from "./swarm-plugin.js"; export * from "./skill-plugin.js"; export * from "./skill-tool.js"; diff --git a/skills/builtin/src/subagent-plugin.ts b/skills/builtin/src/subagent-plugin.ts index d5d6369..c82901d 100644 --- a/skills/builtin/src/subagent-plugin.ts +++ b/skills/builtin/src/subagent-plugin.ts @@ -38,12 +38,14 @@ import { toErrorMessage } from "@step-cli/utils/error.js"; import { clamp } from "@step-cli/utils/math.js"; import { shortenLine, truncateText } from "@step-cli/utils/text.js"; import type { MutableRef } from "@step-cli/utils/mutable-ref.js"; +import { createLogger } from "@step-cli/core/logging/logger.js"; import { isTopLevelMainHarness } from "@step-cli/core/plugins/tool-visibility.js"; import type { PluginHookContext, PluginHookResult, ToolPlugin, } from "@step-cli/core/plugins/types.js"; +import { getSwarmMode } from "./swarm-plugin.js"; import { compareBackgroundSubtaskRecords, isTaskBusy, @@ -77,6 +79,7 @@ interface TaskArgs { contextMode?: TaskContextMode; isolateWorkspace?: boolean; worktreeName?: string; + model?: string; } interface TaskReplyArgs { @@ -176,6 +179,10 @@ const MAIN_ORCHESTRATION_REMINDER = [ "- Prefer isolate_workspace=true when parallel branches may edit overlapping files.", ].join("\n"); +const SUBAGENT_PLUGIN_LOGGER = createLogger({ + baseFields: { component: "subagent-plugin" }, +}); + const DEFAULT_WAIT_MS = 5_000; const MAX_WAIT_MS = 60_000; const WAIT_POLL_MS = 200; @@ -248,6 +255,7 @@ export function createSubagentPlugin( createTaskWaitTool(backgroundManager), createTaskInterruptTool(backgroundManager), createTaskListTool(backgroundManager), + createAgentSwarmTool(backgroundManager), ] : [], hooks: { @@ -775,6 +783,307 @@ function createTaskListTool( }; } +function createAgentSwarmTool( + manager: BackgroundSubtaskManager, +): ToolSpec { + const MAX_SWARM_SUBAGENTS = 128; + const PROMPT_TEMPLATE_PLACEHOLDER = "{{item}}"; + const DEFAULT_SWARM_WAIT_MS = 60_000; + + return { + definition: { + type: "function", + function: { + name: "AgentSwarm", + description: + "Launch parallel subagents for a swarm task. Use this in swarm mode when the task can be decomposed into independent branches.", + parameters: { + type: "object", + required: ["description", "prompt_template", "items"], + properties: { + description: { + type: "string", + description: "Short description for the whole swarm.", + }, + prompt_template: { + type: "string", + description: `Prompt template for each subagent. Use ${PROMPT_TEMPLATE_PLACEHOLDER} as the item placeholder.`, + }, + items: { + type: "array", + items: { type: "string" }, + description: `Values to fill into prompt_template. Each item launches one subagent (max ${MAX_SWARM_SUBAGENTS}).`, + }, + subagent_model: { + type: "string", + description: + "Optional model override for all subagents in this swarm. Falls back to the main model when omitted.", + }, + subagent_context_mode: { + type: "string", + enum: ["inherit", "fresh"], + description: + "How much parent context to hand off to subagents. Defaults to 'inherit'; use 'fresh' to start without the parent's conversation snapshot.", + }, + subagent_preset: { + type: "string", + description: + "Optional preset applied to all swarm subagents (e.g. review, planner, explore).", + }, + isolate_workspace: { + type: "boolean", + description: + "Create or reuse dedicated git worktrees for swarm subagents. Recommended when concurrent writers may touch overlapping files.", + }, + subagent_worktree_name: { + type: "string", + description: + "Optional shared worktree lane name for all swarm subagents. Only applies when isolate_workspace is true.", + }, + wait_ms: { + type: "integer", + minimum: 0, + maximum: MAX_WAIT_MS, + description: `Maximum time to wait for all subagents in milliseconds. Defaults to ${DEFAULT_SWARM_WAIT_MS}.`, + }, + }, + }, + }, + }, + security: { + risk: "meta", + defaultMode: "allow", + }, + parseArgs: (rawArgs) => { + const payload = parseJsonObject(rawArgs); + const description = readRequiredStringField(payload, "description"); + const promptTemplate = readRequiredStringField( + payload, + "prompt_template", + ); + const rawItems = payload.items; + if ( + !Array.isArray(rawItems) || + rawItems.length === 0 || + rawItems.some((entry) => typeof entry !== "string") + ) { + throw new Error("items must be a non-empty string array"); + } + const items = rawItems + .map((entry) => entry.trim()) + .filter((entry) => entry.length > 0); + if (items.length < 2) { + throw new Error("AgentSwarm requires at least 2 items."); + } + if (items.length > 128) { + throw new Error("AgentSwarm supports at most 128 subagents."); + } + if (!promptTemplate.includes("{{item}}")) { + throw new Error( + "prompt_template must include the {{item}} placeholder.", + ); + } + + const seenPrompts = new Set(); + for (let i = 0; i < items.length; i++) { + const prompt = promptTemplate.split("{{item}}").join(items[i]); + if (seenPrompts.has(prompt)) { + throw new Error( + `Duplicate subagent prompt detected at item ${i + 1}. AgentSwarm requires distinct subagents.`, + ); + } + seenPrompts.add(prompt); + } + + return { + description, + prompt_template: promptTemplate, + items, + subagent_model: readStringField(payload.subagent_model), + subagent_context_mode: parseTaskContextMode( + payload.subagent_context_mode, + "subagent_context_mode", + ), + subagent_preset: readStringField(payload.subagent_preset), + isolate_workspace: readBooleanField( + payload.isolate_workspace, + "isolate_workspace", + ), + subagent_worktree_name: + readStringField(payload.subagent_worktree_name) ?? + readStringField(payload.subagentWorktreeName), + wait_ms: readIntegerField(payload.wait_ms ?? payload.waitMs, "wait_ms"), + }; + }, + inspect: ({ args }) => { + const text = `swarm ${args.items.length} subagent(s): ${args.description}`; + return { + inputHint: text, + }; + }, + execute: async (args, ctx): Promise => { + const access = requireTopLevelHarness("AgentSwarm"); + if (!access.ok) { + return access.result; + } + + const swarmMode = getSwarmMode(); + const alreadyActive = swarmMode.isActive; + if (!alreadyActive) { + swarmMode.enter("tool"); + } + + try { + const waitMs = clamp( + args.wait_ms ?? DEFAULT_SWARM_WAIT_MS, + 0, + MAX_WAIT_MS, + ); + + const taskIds: string[] = []; + for (let i = 0; i < args.items.length; i++) { + const item = args.items[i]; + const prompt = args.prompt_template.split("{{item}}").join(item); + const label = `${args.description} #${i + 1}`; + + const startResult = await manager.start( + { + prompt, + description: label, + model: args.subagent_model, + preset: args.subagent_preset, + contextMode: args.subagent_context_mode, + isolateWorkspace: args.isolate_workspace, + worktreeName: args.subagent_worktree_name, + }, + ctx.workspaceRoot, + access.parent, + ); + + if (!startResult.ok) { + return { + ok: true, + summary: `Swarm failed to start subagent #${i + 1}`, + content: startResult.summary ?? "Failed to start subagent", + }; + } + + const taskId = ( + startResult.data as { task?: { id?: string } } | undefined + )?.task?.id; + if (!taskId) { + return { + ok: true, + summary: "Swarm missing task id after start", + content: "Missing task id after start", + }; + } + taskIds.push(taskId); + } + + const results = await Promise.all( + taskIds.map(async (taskId, index) => { + const waitResult = await manager.wait({ + taskId, + waitFor: "all", + waitMs, + signal: ctx.signal, + }); + + const taskView = ( + waitResult.data as + | { + task?: { + status?: string; + lastSummary?: string; + lastError?: string; + }; + } + | undefined + )?.task; + let status: "completed" | "failed" | "aborted" = "completed"; + let output = `Subagent ${taskId} finished`; + + if (taskView) { + if (taskView.status === "error") { + status = "failed"; + output = taskView.lastError ?? taskView.lastSummary ?? output; + } else if (taskView.status === "interrupted") { + status = "aborted"; + output = taskView.lastSummary ?? output; + } else { + output = taskView.lastSummary ?? output; + } + } else { + output = waitResult.summary ?? output; + } + + return { + index: index + 1, + item: args.items[index], + status, + output, + }; + }), + ); + + return { + ok: true, + summary: `Swarm completed: ${results.length} subagent(s)`, + content: renderSwarmResults(results), + }; + } finally { + if (!alreadyActive) { + swarmMode.exit(); + } + } + }, + }; +} + +interface AgentSwarmArgs { + description: string; + prompt_template: string; + items: string[]; + subagent_model?: string; + subagent_context_mode?: "inherit" | "fresh"; + subagent_preset?: string; + isolate_workspace?: boolean; + subagent_worktree_name?: string; + wait_ms?: number; +} + +function renderSwarmResults( + results: Array<{ + index: number; + item: string; + status: "completed" | "failed" | "aborted"; + output: string; + }>, +): string { + const completed = results.filter((r) => r.status === "completed").length; + const lines = [ + "", + `completed: ${completed}, failed: ${results.length - completed}`, + ]; + for (const result of results) { + lines.push( + `${escapeXml(result.output)}`, + ); + } + lines.push(""); + return lines.join("\n"); +} + +function escapeXml(value: string): string { + return value + .replaceAll("&", "&") + .replaceAll('"', """) + .replaceAll("'", "'") + .replaceAll("<", "<") + .replaceAll(">", ">"); +} + class BackgroundSubtaskManager { private readonly factoryRef: MutableRef; private readonly worktreeManager: WorktreeManager; @@ -2438,6 +2747,7 @@ async function prepareSubagentHarness(input: { contextMode?: TaskContextMode; isolateWorkspace?: boolean; worktreeName?: string; + model?: string; mode: "sync" | "background"; subtaskHooksFactory?: SubtaskHooksFactory; }): Promise<{ @@ -2495,6 +2805,7 @@ async function prepareSubagentHarness(input: { preset: input.preset, presetRegistry: input.presetRegistry, memoryState, + model: input.model, hooks: input.mode === "background" ? input.subtaskHooksFactory?.(input.label) @@ -2604,8 +2915,12 @@ function readTaskWaitMode( function safeFinalize(harness: AgentHarness): void { try { harness.finalize(); - } catch { - // Best-effort cleanup only. + } catch (error) { + SUBAGENT_PLUGIN_LOGGER.warn( + "subagent_finalize_failed", + { error: toErrorMessage(error) }, + "subagent harness finalize failed; best-effort cleanup only.", + ); } } diff --git a/skills/builtin/src/swarm-plugin.test.ts b/skills/builtin/src/swarm-plugin.test.ts new file mode 100644 index 0000000..4c9976b --- /dev/null +++ b/skills/builtin/src/swarm-plugin.test.ts @@ -0,0 +1,133 @@ +import { describe, expect, it, afterEach } from "vitest"; +import { createSwarmPlugin, getSwarmMode } from "./swarm-plugin.js"; + +function resetSwarmMode(): void { + const mode = getSwarmMode(); + mode.exit(); +} + +describe("createSwarmPlugin", () => { + afterEach(resetSwarmMode); + it("starts inactive", () => { + const plugin = createSwarmPlugin(); + expect(plugin.getSwarmMode().isActive).toBe(false); + expect(plugin.getSwarmMode().trigger).toBeNull(); + }); + + it("enters mode and injects reminder for main harness", () => { + const plugin = createSwarmPlugin(); + const mode = plugin.getSwarmMode(); + mode.enter("manual", "test-enter-manual"); + expect(mode.isActive).toBe(true); + expect(mode.trigger).toBe("manual"); + + const hook = plugin.hooks.beforeModelRequest?.({ + workspaceRoot: "/tmp", + step: 1, + toolCalls: 0, + now: new Date().toISOString(), + userMessages: [], + harnessType: "main", + harnessDepth: 0, + }); + expect(hook?.messages?.length).toBe(1); + expect(hook?.messages?.[0]?.role).toBe("system"); + expect(hook?.messages?.[0]?.content).toContain("Swarm Mode"); + mode.exit(); + }); + + it("is idempotent on double enter", () => { + const plugin = createSwarmPlugin(); + const mode = plugin.getSwarmMode(); + mode.enter("manual", "test-double-enter"); + mode.enter("manual", "test-double-enter"); + expect(mode.isActive).toBe(true); + const hook = plugin.hooks.beforeModelRequest?.({ + workspaceRoot: "/tmp", + step: 1, + toolCalls: 0, + now: new Date().toISOString(), + userMessages: [], + harnessType: "main", + harnessDepth: 0, + }); + expect(hook?.messages?.length).toBe(1); + mode.exit(); + }); + + it("dedupes repeated prompt for same trigger", () => { + const plugin = createSwarmPlugin(); + const mode = plugin.getSwarmMode(); + mode.enter("task", "test-dedup-src"); + mode.exit(); + mode.enter("task", "test-dedup-src"); + expect(mode.trigger).toBeNull(); + }); + + it("allows same trigger with different prompt", () => { + const plugin = createSwarmPlugin(); + const mode = plugin.getSwarmMode(); + mode.enter("task", "test-allow-a"); + mode.exit(); + mode.enter("task", "test-allow-b"); + expect(mode.trigger).toBe("task"); + mode.exit(); + }); + + it("exits and stops injecting", () => { + const plugin = createSwarmPlugin(); + const mode = plugin.getSwarmMode(); + mode.enter("manual", "test-exit"); + mode.exit(); + expect(mode.isActive).toBe(false); + const hook = plugin.hooks.beforeModelRequest?.({ + harnessType: "main", + harnessDepth: 0, + } as never); + expect(hook?.messages?.length).toBeUndefined(); + }); + + it("does not inject for non-main harness", () => { + const plugin = createSwarmPlugin(); + plugin.getSwarmMode().enter("manual", "test-non-main"); + const hook = plugin.hooks.beforeModelRequest?.({ + workspaceRoot: "/tmp", + step: 1, + toolCalls: 0, + now: new Date().toISOString(), + userMessages: [], + harnessType: "teammate", + harnessDepth: 1, + }); + expect(hook?.messages?.length).toBeUndefined(); + plugin.getSwarmMode().exit(); + }); + + it("does not inject for deep main harness", () => { + const plugin = createSwarmPlugin(); + plugin.getSwarmMode().enter("manual", "test-deep-main"); + const hook = plugin.hooks.beforeModelRequest?.({ + workspaceRoot: "/tmp", + step: 1, + toolCalls: 0, + now: new Date().toISOString(), + userMessages: [], + harnessType: "main", + harnessDepth: 2, + }); + expect(hook?.messages?.length).toBeUndefined(); + plugin.getSwarmMode().exit(); + }); +}); + +describe("getSwarmMode", () => { + afterEach(resetSwarmMode); + + it("returns the shared swarm mode state", () => { + const mode = getSwarmMode(); + expect(mode.isActive).toBe(false); + mode.enter("manual", "shared-state-test"); + expect(mode.isActive).toBe(true); + mode.exit(); + }); +}); diff --git a/skills/builtin/src/swarm-plugin.ts b/skills/builtin/src/swarm-plugin.ts new file mode 100644 index 0000000..cef0571 --- /dev/null +++ b/skills/builtin/src/swarm-plugin.ts @@ -0,0 +1,125 @@ +import type { + PluginHookContext, + PluginHookResult, +} from "@step-cli/core/plugins/types.js"; + +export type SwarmModeTrigger = "manual" | "task" | "tool"; + +export interface SwarmModeState { + readonly isActive: boolean; + readonly trigger: SwarmModeTrigger | null; + enter(trigger: SwarmModeTrigger, prompt?: string): void; + exit(): void; +} + +const SWARM_MODE_ENTER_REMINDER = [ + "## Swarm Mode", + "", + 'You are now in "agent swarm" mode. The user may send tasks that require a large number of parallel subagents.', + "", + "## Workflow", + "", + "1. First, you may need to do a small amount of exploratory work before deciding how to divide the task across subagents. You may not need subagents during this exploratory phase.", + "", + "2. After exploring, if you are convinced no subagent is needed to complete the task, tell the user why and wait for further instructions; otherwise, continue with the appropriate delegation.", + "", + "3. Once you have enough context, do not handle the main work yourself. Use AgentSwarm with a `prompt_template` containing the `{{item}}` placeholder and an `items` array for the requested or appropriate number of subagents, partitioning the problem so each item gives one subagent a distinct part of the work. Pass `subagent_model` when the swarm should use a different model than the default.", + "", + "## Coordination", + "", + "- Give each subagent a distinct scope of work.", + "- Avoid duplicating work across subagents.", + "- Avoid assigning conflicting changes or responsibilities to different subagents.", + "- Remember that subagents have your full capabilities. Do not overload their prompts with excessive detail; only describe the necessary background and each subagent's specific task.", + "- Unless the user explicitly specifies a lower limit, do not try to conserve the number of agents. AgentSwarm supports up to 128 subagents and queues launches automatically, so decompose work as finely as possible while keeping subagent responsibilities non-conflicting; combine tasks only when they are genuinely inseparable. If the subagents only need to read, inspect, or report back without making changes, their scopes may overlap slightly.", + "- When you need to inspect progress, use `task_list` to see all active background subtasks, or `task_wait` to wait for a specific task and collect its final result. `AgentSwarm` returns an `` summary with each subagent's outcome.", +].join("\n"); + +/** 防止并发 enter 覆盖 active 状态的简单互斥锁。 */ +let _enterLock = false; +let active: SwarmModeTrigger | null = null; +const seenPrompts = new Set(); +/** 限制 seenPrompts 集合的无界增长。 */ +const MAX_SEEN_PROMPTS = 1024; + +export function getSwarmMode(): SwarmModeState { + return { + get isActive(): boolean { + return active !== null; + }, + get trigger(): SwarmModeTrigger | null { + return active; + }, + enter(trigger: SwarmModeTrigger, prompt?: string): void { + // 简易互斥锁:防止并发 enter 覆盖 active 状态。 + if (_enterLock) return; + _enterLock = true; + try { + if (active !== null) return; + const key = `${trigger}:${prompt ?? ""}`; + if (seenPrompts.has(key)) return; + seenPrompts.add(key); + // 限制集合大小,防止长运行会话中无界增长。超出时一次性裁半。 + if (seenPrompts.size > MAX_SEEN_PROMPTS) { + const toRemove: string[] = []; + let count = 0; + for (const key of seenPrompts) { + toRemove.push(key); + count += 1; + if (count >= seenPrompts.size / 2) break; + } + toRemove.forEach((key) => seenPrompts.delete(key)); + } + active = trigger; + } finally { + _enterLock = false; + } + }, + exit(): void { + if (active === null) return; + // 注意:不清理 seenPrompts —— dedup 需跨 enter/exit 周期保持。 + // 集合大小上限在 enter() 中通过 LRU 式修剪控制。 + active = null; + }, + }; +} + +export function createSwarmPlugin(): { + id: string; + description: string; + register: () => []; + hooks: { + beforeModelRequest: (context: PluginHookContext) => PluginHookResult | void; + }; + getSwarmMode: () => SwarmModeState; +} { + return { + id: "swarm-plugin", + description: "Swarm mode state machine and reminder injection", + register: () => [], + hooks: { + beforeModelRequest: ( + context: PluginHookContext, + ): PluginHookResult | void => { + if ( + context.harnessType !== "main" || + (context.harnessDepth ?? 0) !== 0 + ) { + return; + } + if (active === null) { + return; + } + return { + messages: [ + { + role: "system", + content: SWARM_MODE_ENTER_REMINDER, + }, + ], + }; + }, + }, + getSwarmMode: getSwarmMode, + }; +} diff --git a/src/bootstrap/config/loader.ts b/src/bootstrap/config/loader.ts index 95a3876..4302df4 100644 --- a/src/bootstrap/config/loader.ts +++ b/src/bootstrap/config/loader.ts @@ -242,7 +242,7 @@ export function createDefaultConfigTemplate(): string { }, clients: { tui: { - altScreen: true, + altScreen: false, }, }, voice: { diff --git a/src/commands/resume-command.ts b/src/commands/resume-command.ts index e860ffb..b4ec117 100644 --- a/src/commands/resume-command.ts +++ b/src/commands/resume-command.ts @@ -15,10 +15,9 @@ import { loadOpenTuiClientAppFactoryAtRuntime, } from "../runtime/open-tui-capability.js"; -// Keep this build flag in the command module so rolldown can fold the bundle's -// TTY startup path away before it ever reaches the OpenTUI loader. -const OPEN_TUI_COMPILE_TIME_ENABLED = - process.env.STEP_CLI_ENABLE_OPENTUI !== "0"; +// OpenTUI is always enabled; keep this compile-time constant so rolldown +// can fold the bundle's TTY startup path away before it reaches the loader. +const OPEN_TUI_COMPILE_TIME_ENABLED = true; export async function runResumeCommand(argv: string[]): Promise { const resumeProgram = configureCommanderProgram(new Command()); diff --git a/src/commands/root-command.ts b/src/commands/root-command.ts index 6abc139..9914a0f 100644 --- a/src/commands/root-command.ts +++ b/src/commands/root-command.ts @@ -1,4 +1,7 @@ import { Command } from "commander"; +import { spawn, spawnSync } from "node:child_process"; +import path from "node:path"; +import { fileURLToPath } from "node:url"; import { configureCommanderProgram, parseCommanderProgram, @@ -17,10 +20,9 @@ import { loadOpenTuiClientAppFactoryAtRuntime, } from "../runtime/open-tui-capability.js"; -// Keep this build flag in the command module so rolldown can fold the bundle's -// TTY startup path away before it ever reaches the OpenTUI loader. -const OPEN_TUI_COMPILE_TIME_ENABLED = - process.env.STEP_CLI_ENABLE_OPENTUI !== "0"; +// OpenTUI is always enabled; keep this compile-time constant so rolldown +// can fold the bundle's TTY startup path away before it reaches the loader. +const OPEN_TUI_COMPILE_TIME_ENABLED = true; export async function runRootCommand(argv: string[]): Promise { const program = configureCommanderProgram(new Command()); @@ -92,6 +94,66 @@ export async function runRootCommand(argv: string[]): Promise { interactionSurface: shouldUseTui ? "interactive" : undefined, }); if (shouldUseTui) { + // @opentui/core is a Bun-only bundle: it statically imports from + // "bun:ffi" which Node's ESM loader cannot resolve (ERR_UNSUPPORTED_ESM_URL_SCHEME). + // The TUI must therefore run under Bun. Non-TUI paths (exec/serve/help/...) + // are unaffected and continue to run under Node. When already in a Bun + // process (process.versions.bun is defined) we proceed in-process; + // otherwise we respawn ourselves under Bun, inheriting stdio so the + // child re-acquires the TTY. No config/IPC hand-off is needed — the + // child re-parses argv and re-resolves the runtime config from scratch. + if (typeof process.versions.bun === "undefined") { + const bunProbe = spawnSync("bun", ["--version"], { + stdio: "ignore", + }); + if (bunProbe.error || bunProbe.status !== 0) { + process.stderr.write( + "step-cli: TUI requires the Bun runtime (@opentui/core uses bun:ffi, unsupported by Node). " + + "Install Bun from https://bun.sh then retry.\n", + ); + process.exitCode = 1; + return; + } + + const entryScriptPath = + process.argv[1] ?? + path.join( + path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + "..", + ), + "bin", + "step-cli.js", + ); + + await new Promise((resolve) => { + const child = spawn( + "bun", + [entryScriptPath, ...process.argv.slice(2)], + { + stdio: "inherit", + env: process.env, + }, + ); + child.once("error", () => { + process.exitCode = 1; + resolve(); + }); + child.once("exit", (code, signal) => { + if (signal) { + try { + process.kill(process.pid, signal); + } catch { + /* signal forwarding best-effort */ + } + } + process.exitCode = code ?? 1; + resolve(); + }); + }); + return; + } + const createLocalTuiClientApp = await loadOpenTuiClientAppFactoryAtRuntime(); const app = await createLocalTuiClientApp(stepCliConfig); diff --git a/src/gateway/local-gateway.ts b/src/gateway/local-gateway.ts index ccfc4ed..4c859bf 100644 --- a/src/gateway/local-gateway.ts +++ b/src/gateway/local-gateway.ts @@ -11,6 +11,7 @@ import type { StepCliSessionDescriptor, StepCliSessionRunResult, StepCliSessionSnapshotResult, + StepCliSlashCommandResult, StepCliSessionWakeReceipt, StepCliSessionWakeRequest, StepCliStartGoalRequest, @@ -117,6 +118,13 @@ export class LocalStepGateway implements StepGateway { return await this.sessions.runPrompt(sessionId, prompt, signal); } + async executeSlashCommand( + sessionId: string, + commandLine: string, + ): Promise { + return await this.sessions.executeSlashCommand(sessionId, commandLine); + } + async getPendingClarification( sessionId: string, ): Promise { diff --git a/src/gateway/runtime.ts b/src/gateway/runtime.ts index 8dc4281..94794b5 100644 --- a/src/gateway/runtime.ts +++ b/src/gateway/runtime.ts @@ -72,6 +72,7 @@ import { type BackgroundSubtaskView, type SubagentToolPlugin, } from "@step-cli/skills-builtin/subagent-plugin.js"; +import { createSwarmPlugin } from "@step-cli/skills-builtin/swarm-plugin.js"; import { PluginManager } from "@step-cli/core/plugins/manager.js"; import type { ToolPluginContext } from "@step-cli/core/plugins/types.js"; import { @@ -114,6 +115,7 @@ import { import { type StepCliInteractiveUi, type StepCliInteractiveUiFactory, + type StepCliInteractiveUiTone, } from "./interactive-ui.js"; import { createFilesystemAgentRunArtifactStore } from "./artifacts/run-artifact-store.js"; import { FilesystemConversationTranscriptStore } from "./memory/filesystem-conversation-transcript-store.js"; @@ -149,6 +151,7 @@ import type { ToolSearchIndexProfile, ToolSpec, StepCliInteractionProfile, + StepCliSlashCommandResult, StepCliVerifierVerdict, UserClarificationRuntimeState, UserClarificationRequest, @@ -219,6 +222,10 @@ const REPL_COMMANDS = [ command: "/teammates", description: "Inspect persistent teammate state and pending requests", }, + { + command: "/swarm [on|off|task]", + description: "Toggle swarm mode or run a swarm task", + }, { command: "/clear", description: "Clear in-memory conversation history" }, { command: "/history", description: "Inspect memory and token usage" }, { @@ -689,6 +696,7 @@ export class StepCli { presetRegistry, (name) => teammateHooksFactory?.(name), ), + createSwarmPlugin(), ], pluginsDir, }); @@ -1710,6 +1718,56 @@ export class StepCli { this.uiState.tui = null; } + /** + * Execute a slash command from an external caller (e.g. the OpenTUI client). + * + * This wraps the private executeSlashCommand so that the TUI — which + * intercepts all "/" input locally — can forward gateway-level commands + * (such as /swarm, /clear, /history) to the runtime. For /swarm , + * the task text is returned instead of starting a turn directly, so the + * caller can submit it through the session service's turn queue. + */ + async executeSlashCommandExternal( + commandLine: string, + ): Promise { + const parsed = parseSlashCommandLine(commandLine); + if (!parsed) { + return { handled: false, message: null, taskText: null }; + } + + // For /swarm, handle specially to capture taskText without starting a + // turn directly. The caller (TUI) submits the task via sdk.runPrompt + // to ensure proper queueing through the session service. + if (parsed.normalizedCommand === "/swarm") { + const swarmResult = this.handleSwarmCommand(parsed.rest); + const tui = this.uiState.tui; + if (tui && swarmResult.tuiMessage) { + tui.addEvent( + "swarm", + swarmResult.tuiMessage, + (swarmResult.tuiTone ?? "accent") as StepCliInteractiveUiTone, + ); + } + return { + handled: true, + message: swarmResult.message, + taskText: swarmResult.taskText ?? null, + }; + } + + // For all other commands, delegate to the existing executeSlashCommand. + const tui = this.uiState.tui; + const surface: SlashCommandSurfaceInput = tui + ? { kind: "tui", tui } + : { kind: "repl", json: false }; + const result = await this.executeSlashCommand(parsed, surface); + return { + handled: result === "handled", + message: null, + taskText: null, + }; + } + async runTurn( prompt: string | UserTurnInput, signal?: AbortSignal, @@ -1767,6 +1825,11 @@ export class StepCli { verifier, }; } finally { + // Auto-exit swarm mode for task/tool triggers after the turn completes. + const swarmMode = this.getSwarmModeState(); + if (swarmMode?.isActive && swarmMode.trigger !== "manual") { + swarmMode.exit(); + } await this.turnRestore.finishTurn(); } } @@ -2725,6 +2788,87 @@ export class StepCli { } return "handled"; + case "/swarm": { + const swarmResult = this.handleSwarmCommand(parsed.rest); + if (surface.kind === "tui") { + if (swarmResult.tuiMessage) { + surface.tui.addEvent( + "swarm", + swarmResult.tuiMessage, + (swarmResult.tuiTone ?? "accent") as StepCliInteractiveUiTone, + ); + } + } else { + output.write(`${swarmResult.message}\n`); + } + + // For /swarm , submit the task as a prompt after entering task mode. + if (swarmResult.taskText) { + const taskInput: UserTurnInput = { + content: swarmResult.taskText, + }; + if (surface.kind === "tui" && surface.tui) { + const activeTeammateName = this.getActiveTeammateName(); + const controller = + this.uiState.activeRunAbortController && + !this.uiState.activeRunAbortController.signal.aborted + ? this.uiState.activeRunAbortController + : new AbortController(); + this.uiState.activeRunAbortController = controller; + surface.tui.beginRun(taskInput, activeTeammateName); + this.uiState.currentAssistantStreamActive = false; + this.uiState.currentAssistantLineOpen = false; + this.uiState.responseStreamUsed = false; + try { + const result = await this.runMainTurnNow( + taskInput, + controller.signal, + ); + if (didTurnSucceed(result)) { + if (this.provider !== "anthropic") { + await surface.tui.revealAssistantMessage( + result.output, + activeTeammateName, + ); + } + surface.tui.endRun(true, undefined, activeTeammateName); + } else { + const failureMessage = describeRunFailure(result); + surface.tui.endRun(false, failureMessage, activeTeammateName); + } + } catch (error) { + const message = toErrorMessage(error); + if (!isInterruptErrorMessage(message)) { + surface.tui.addEvent("error", message, "danger"); + } + surface.tui.endRun( + isInterruptErrorMessage(message), + isInterruptErrorMessage(message) ? message : undefined, + activeTeammateName, + ); + } finally { + if ( + this.uiState.activeRunAbortController === controller && + this.foregroundTurnQueue.length === 0 + ) { + this.uiState.activeRunAbortController = null; + } + this.uiState.currentAssistantStreamActive = false; + this.uiState.currentAssistantLineOpen = false; + this.uiState.responseStreamUsed = false; + } + } else { + try { + await this.runMainTurnNow(taskInput); + } catch { + // Non-fatal; swarm mode state is already set. + } + } + } + + return "handled"; + } + case "/clear": this.memory.clear(); await this.persistSessionIfEnabled(); @@ -3359,6 +3503,107 @@ export class StepCli { return null; } + private getSwarmModeState(): { + isActive: boolean; + trigger: string | null; + enter(trigger: string, prompt?: string): void; + exit(): void; + } | null { + for (const loaded of this.pluginManager.getPlugins()) { + const plugin = loaded.plugin as Partial<{ + id: string; + getSwarmMode: () => + | { + isActive: boolean; + trigger: string | null; + enter(trigger: string, prompt?: string): void; + exit(): void; + } + | undefined; + }>; + if ( + plugin.id === "swarm-plugin" && + typeof plugin.getSwarmMode === "function" + ) { + const mode = plugin.getSwarmMode(); + if (mode) { + return mode; + } + } + } + return null; + } + + private handleSwarmCommand(rest: string[]): { + message: string; + tuiMessage?: string; + tuiTone?: string; + taskText?: string; + } { + const mode = this.getSwarmModeState(); + if (!mode) { + return { + message: "Swarm mode is unavailable in this session.", + tuiMessage: "Swarm mode unavailable", + tuiTone: "warning", + }; + } + + const raw = rest.join(" ").trim(); + const arg = raw.toLowerCase(); + + if (arg === "" || arg === "on") { + if (mode.isActive) { + const trigger = mode.trigger ?? "unknown"; + return { + message: `Swarm mode is already active (trigger: ${trigger}). Use /swarm off to deactivate.`, + tuiMessage: `Swarm active (${trigger}). Use /swarm off.`, + tuiTone: "muted", + }; + } + mode.enter("manual"); + return { + message: + "Swarm mode activated. Use /swarm off to deactivate, or let an AgentSwarm task complete to auto-deactivate.", + tuiMessage: "Swarm mode on", + tuiTone: "success", + }; + } + + if (arg === "off") { + if (!mode.isActive) { + return { + message: "Swarm mode is not active.", + tuiMessage: "Swarm mode already off", + tuiTone: "muted", + }; + } + mode.exit(); + return { + message: "Swarm mode deactivated.", + tuiMessage: "Swarm mode off", + tuiTone: "accent", + }; + } + + // Treat everything else as a task: /swarm + if (mode.isActive && mode.trigger === "manual") { + return { + message: `Swarm mode is already manually active. Use /swarm off first, or just type the task directly.`, + tuiMessage: "Already in manual swarm mode", + tuiTone: "warning", + }; + } + + mode.enter("task", raw); + return { + message: `Swarm task submitted: "${raw}". Swarm mode will auto-deactivate after the turn.`, + tuiMessage: `Swarm task: ${raw.slice(0, 60)}${raw.length > 60 ? "..." : ""}`, + tuiTone: "success", + taskText: raw, + }; + } + private getBackgroundSubtaskViews(): BackgroundSubtaskView[] { for (const loaded of this.pluginManager.getPlugins()) { const plugin = loaded.plugin as Partial; diff --git a/src/gateway/service/session-service.ts b/src/gateway/service/session-service.ts index 347c5ed..2e5e5f6 100644 --- a/src/gateway/service/session-service.ts +++ b/src/gateway/service/session-service.ts @@ -46,6 +46,7 @@ import type { StepCliSessionSnapshot as ProtocolSessionSnapshot, StepCliSessionRunResult, StepCliSessionSnapshotResult, + StepCliSlashCommandResult, StepCliRuntimeSummary as ProtocolRuntimeSummary, StepCliTurnResult as ProtocolTurnResult, StepCliSessionWakeReceipt, @@ -759,6 +760,19 @@ export class StepCliSessionService { }; } + async executeSlashCommand( + sessionIdInput: string, + commandLine: string, + ): Promise { + const sessionId = normalizeSessionId(sessionIdInput); + await this.ensureSession(sessionId); + const entry = this.sessions.get(sessionId); + if (!entry) { + throw new Error(`Failed to load session: ${sessionId}`); + } + return await entry.app.executeSlashCommandExternal(commandLine); + } + async getPendingClarification( sessionIdInput: string, ): Promise { diff --git a/src/runtime/local-opentui-entry.tsx b/src/runtime/local-opentui-entry.tsx index c5841db..d0a2abf 100644 --- a/src/runtime/local-opentui-entry.tsx +++ b/src/runtime/local-opentui-entry.tsx @@ -35,6 +35,10 @@ import { import { loadVoiceConfigFile } from "./voice-config-loader.js"; import type { VoiceBootstrapConfig } from "./voice-bootstrap-config.js"; import type { VoiceRuntimeUnavailable } from "../tui/types.js"; +import { + ensureWindowsVirtualTerminalInput, + installWindowsVirtualTerminalInput, +} from "../tui/win-console-input.js"; export async function runLocalOpenTui(): Promise { const { stepCliConfig, voice } = await loadLocalTuiBootstrapConfig(); @@ -51,11 +55,20 @@ export async function runLocalOpenTui(): Promise { const activeTheme = resolveTuiTheme(availableThemes, activeThemeName); activeThemeName = activeTheme.name; const bootstrapFilePath = process.env[STEP_CLI_TUI_BOOTSTRAP_ENV]; + // Bun's setRawMode on Windows does not enable ENABLE_VIRTUAL_TERMINAL_INPUT, + // so special keys (PageUp/PageDown/Home/End/arrows) and mouse events are + // never delivered as VT sequences — making every TUI content area + // unscrollable. Install the wrapper (no-op on non-Windows) before the + // renderer is created so the flag is on for the initial setup and every + // subsequent raw-mode toggle (e.g. renderer resume after suspend). + installWindowsVirtualTerminalInput(); const renderer = await createCliRenderer({ stdin: process.stdin, stdout: process.stdout, exitOnCtrlC: false, - useAlternateScreen: stepCliConfig.useAlternateScreen, + screenMode: stepCliConfig.useAlternateScreen + ? "alternate-screen" + : "main-screen", backgroundColor: activeTheme.colors.canvas, useKittyKeyboard: { disambiguate: true, @@ -63,6 +76,10 @@ export async function runLocalOpenTui(): Promise { reportText: true, }, }); + // createCliRenderer runs setupTerminal (native lib) after the constructor's + // setRawMode; the native setup may reset the console input mode, so re-assert + // VT input now that the renderer is fully initialized. No-op on non-Windows. + ensureWindowsVirtualTerminalInput(); let activeSessionId = (await resolveLocalSessionTarget(stepCliConfig)) .sessionId; diff --git a/src/runtime/open-tui-capability.ts b/src/runtime/open-tui-capability.ts index 4866a9d..3dc3bb1 100644 --- a/src/runtime/open-tui-capability.ts +++ b/src/runtime/open-tui-capability.ts @@ -1,35 +1,10 @@ import type { CreateLocalTuiClientApp } from "./local-tui-app.js"; - -export function parseOpenTuiEnabledValue( - rawValue: string | undefined, -): boolean { - const configuredValue = rawValue?.trim().toLowerCase(); - return configuredValue !== "0" && configuredValue !== "false"; -} - -// Keep the process.env access inline so bundlers can replace it with a literal -// during bundle-time define folding. -const OPEN_TUI_ENABLED_IN_CURRENT_BUILD = parseOpenTuiEnabledValue( - process.env.STEP_CLI_ENABLE_OPENTUI, -); +import { createLocalTuiClientApp } from "./local-tui-app.js"; export function isOpenTuiEnabledInCurrentBuild(): boolean { - return OPEN_TUI_ENABLED_IN_CURRENT_BUILD; + return true; } -const loadOpenTuiRuntimeModule = OPEN_TUI_ENABLED_IN_CURRENT_BUILD - ? async () => await import("./local-tui-app.js") - : null; - export async function loadOpenTuiClientAppFactoryAtRuntime(): Promise { - if (!loadOpenTuiRuntimeModule) { - throw new Error("OpenTUI is disabled in this build"); - } - - const runtimeModule = await loadOpenTuiRuntimeModule(); - if (typeof runtimeModule.createLocalTuiClientApp !== "function") { - throw new Error("OpenTUI runtime did not export createLocalTuiClientApp()"); - } - - return runtimeModule.createLocalTuiClientApp; + return createLocalTuiClientApp; } diff --git a/src/runtime/runtime-config.ts b/src/runtime/runtime-config.ts index b81e45d..4f98bcd 100644 --- a/src/runtime/runtime-config.ts +++ b/src/runtime/runtime-config.ts @@ -442,10 +442,14 @@ async function resolveLocalStepCliRuntimeConfig(input: { json: Boolean(input.options.json), surfaceOverride: input.interactionSurface, }); - const useAlternateScreen = - input.useAlternateScreen ?? + const resolvedAltScreen = loadedConfig.clients?.tui?.altScreen ?? (interactionProfile.surface === "interactive" ? true : false); + const useAlternateScreen = + input.useAlternateScreen ?? + (process.platform === "win32" && !loadedConfig.clients + ? false + : resolvedAltScreen); const toolPermissionOverrides = loadedConfig.tools?.approval?.overrides || input.options.toolOverride ? { diff --git a/src/tui/app.tsx b/src/tui/app.tsx index 2d7a534..d025d78 100644 --- a/src/tui/app.tsx +++ b/src/tui/app.tsx @@ -960,6 +960,85 @@ export function StepCliTuiScreen(props: StepCliTuiScreenProps) { } } + /** + * Submit a prompt string to the agent through the SDK. Used by slash + * commands that produce a task to run (e.g. /swarm ), so the task + * goes through the normal session service turn queue. + */ + async function submitPromptContent(content: string): Promise { + const controller = new AbortController(); + const queued = activeRunCountRef.current > 0; + const turnInput = { content }; + abortControllersRef.current.add(controller); + activeRunCountRef.current += 1; + setActiveRunCount(activeRunCountRef.current); + const turnId = props.transcript.submitUserTurn(turnInput, { queued }); + setStatus({ + tone: "brand", + label: queued ? "Queued" : "Running", + detail: queued + ? "Waiting for the active turn to finish" + : "Waiting for the agent turn to finish", + }); + + try { + const runResult = await props.sdk.runPrompt( + props.sessionId, + turnInput, + controller.signal, + ); + setLastRun({ + result: runResult.result, + completedAt: new Date().toISOString(), + }); + const turnSucceeded = didTurnSucceed(runResult.result); + const nextStatusDetail = turnSucceeded + ? summarizeTurn(runResult.result) + : describeRunFailure(runResult.result); + const refreshed = await refreshAll( + turnSucceeded ? "Completed" : "Failed", + nextStatusDetail, + turnId, + ); + if (refreshed) { + if (!turnSucceeded) { + props.transcript.appendLocalEvent( + "error", + nextStatusDetail, + "danger", + ); + } + setStatus({ + tone: turnSucceeded ? "success" : "danger", + label: turnSucceeded ? "Completed" : "Failed", + detail: nextStatusDetail, + }); + } + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + const refreshed = await refreshAll("Failed", message, turnId); + props.transcript.appendLocalEvent("error", message, "danger"); + if (refreshed) { + setStatus({ + tone: "danger", + label: "Failed", + detail: message, + }); + } + } finally { + abortControllersRef.current.delete(controller); + activeRunCountRef.current = Math.max(0, activeRunCountRef.current - 1); + setActiveRunCount(activeRunCountRef.current); + if (activeRunCountRef.current > 0) { + setStatus({ + tone: "brand", + label: "Running", + detail: "Waiting for queued turns to finish", + }); + } + } + } + async function activateVoiceRuntime( cause: "autostart" | "slash", ): Promise { @@ -1239,13 +1318,40 @@ export function StepCliTuiScreen(props: StepCliTuiScreenProps) { await activateVoiceRuntime("slash"); return true; } - default: + default: { + // Forward unrecognized slash commands to the gateway runtime, + // which handles gateway-level commands like /swarm, /clear, + // /history, /compact, /policy, etc. This bridges the gap between + // the TUI's local command set and the runtime's full command set. + try { + const result = await props.sdk.executeSlashCommand( + props.sessionId, + commandLine, + ); + if (result.handled) { + if (result.taskText) { + // /swarm — submit the task as a regular prompt so it + // goes through the session service's turn queue. + await submitPromptContent(result.taskText); + } else if (result.message) { + setStatus({ + tone: "accent", + label: "Command", + detail: result.message, + }); + } + return true; + } + } catch { + // Fall through to unknown command message + } setStatus({ tone: "warning", label: "Unknown Command", detail: `${command} is not supported in the OpenTUI client`, }); return false; + } } } diff --git a/src/tui/slash-commands.ts b/src/tui/slash-commands.ts index 615254e..332bb45 100644 --- a/src/tui/slash-commands.ts +++ b/src/tui/slash-commands.ts @@ -18,6 +18,12 @@ export const TUI_SLASH_COMMAND_DEFINITIONS: readonly SlashCommandDefinition[] = insertText: "/status", description: "Show current session status", }, + { + command: "/swarm", + insertText: "/swarm ", + description: "Toggle swarm mode or run a swarm task", + argHint: "[on|off|task]", + }, { command: "/goal", insertText: "/goal ", diff --git a/src/tui/win-console-input.ts b/src/tui/win-console-input.ts new file mode 100644 index 0000000..3f24195 --- /dev/null +++ b/src/tui/win-console-input.ts @@ -0,0 +1,151 @@ +import process from "node:process"; +import { createRequire } from "node:module"; + +/** + * Windows console input fix for the OpenTUI TUI. + * + * Background: + * Bug① made the TUI run under Bun (it previously crashed under Node because + * @opentui/core is a Bun bundle that statically imports `bun:ffi`). On + * Windows, Bun's `process.stdin.setRawMode(true)` does NOT enable + * `ENABLE_VIRTUAL_TERMINAL_INPUT` on the console input handle — unlike + * Node's libuv, which does. Without that flag the legacy conhost console + * never translates special keys (PageUp/PageDown/Home/End/arrows) or mouse + * events into VT escape sequences, so @opentui/core's StdinParser simply + * never sees them. The result: every content area in the TUI is unscrollable + * (mouse wheel, scrollbar drag, and keyboard PageUp/PageDown all no-op), + * even though the ScrollBox machinery itself is fully functional. + * + * This was verified directly: feeding `\x1b[5~` (PageUp) and SGR mouse + * sequences into @opentui/core's StdinParser yields the correct `pageup` + * key / mouse events, and a ScrollBox with the exact TranscriptPane config + * scrolls correctly when those events are delivered. The only missing piece + * is the console delivering the bytes. + * + * Fix: + * Enable `ENABLE_VIRTUAL_TERMINAL_INPUT` on STD_INPUT_HANDLE. We wrap + * `process.stdin.setRawMode` so the flag is re-applied every time the + * renderer (re)enters raw mode — including the initial setup and every + * `resume()` after a `suspend()` (e.g. focus changes). This is a no-op on + * non-Windows platforms and degrades gracefully if kernel32/bun:ffi is + * unavailable. + */ + +const ENABLE_VIRTUAL_TERMINAL_INPUT = 0x0200; +const STD_INPUT_HANDLE = 0xfffffff6; // (DWORD)-10 + +interface Kernel32Symbols { + GetStdHandle: (handle: number) => bigint; + GetConsoleMode: (handle: bigint, modePtr: bigint) => number; + SetConsoleMode: (handle: bigint, mode: number) => number; +} + +interface FFILibrary { + symbols: Kernel32Symbols; + close(): void; +} + +interface FFI { + dlopen: (path: string, symbols: F) => FFILibrary; + FFIType: { u32: "u32"; i32: "i32"; ptr: "ptr" }; + ptr: (buffer: ArrayBufferLike | ArrayBufferView) => bigint; +} + +let ffiLib: FFI | null = null; +let kernel32: FFILibrary | null = null; +let modeBuffer: Uint32Array | null = null; +let modePointer: bigint | null = null; +let installed = false; + +/** + * Lazily load kernel32 via bun:ffi (only available under Bun). Returns null on + * non-Windows or if FFI is unavailable so callers can no-op safely. + */ +function loadKernel32(): FFILibrary | null { + if (kernel32) return kernel32; + if (process.platform !== "win32") return null; + try { + // `bun:ffi` is a Bun-only built-in. `createRequire` gives us a typed + // require in ESM; the bundler externalizes the call and Bun resolves + // `bun:ffi` at runtime when the TUI starts. + const require = createRequire(import.meta.url); + const ffi = require("bun:ffi") as FFI; + ffiLib = ffi; + kernel32 = ffi.dlopen("kernel32", { + GetStdHandle: { args: [ffi.FFIType.u32], returns: ffi.FFIType.ptr }, + GetConsoleMode: { + args: [ffi.FFIType.ptr, ffi.FFIType.ptr], + returns: ffi.FFIType.i32, + }, + SetConsoleMode: { + args: [ffi.FFIType.ptr, ffi.FFIType.u32], + returns: ffi.FFIType.i32, + }, + }); + modeBuffer = new Uint32Array(1); + modePointer = ffi.ptr(modeBuffer); + return kernel32; + } catch { + // Non-Bun runtime or kernel32 missing — nothing we can do. + return null; + } +} + +/** + * Ensure `ENABLE_VIRTUAL_TERMINAL_INPUT` is set on the console input handle. + * Safe to call repeatedly; reads the current mode and only writes when the + * flag is missing. + */ +export function ensureWindowsVirtualTerminalInput(): void { + const lib = loadKernel32(); + if (!lib || !modeBuffer || modePointer === null) return; + try { + const handle = lib.symbols.GetStdHandle(STD_INPUT_HANDLE); + if (!handle) return; + if (!lib.symbols.GetConsoleMode(handle, modePointer)) return; + const current = modeBuffer[0]; + if ( + (current & ENABLE_VIRTUAL_TERMINAL_INPUT) === + ENABLE_VIRTUAL_TERMINAL_INPUT + ) { + return; // already enabled + } + lib.symbols.SetConsoleMode(handle, current | ENABLE_VIRTUAL_TERMINAL_INPUT); + } catch { + // Best-effort: if the call fails (e.g. stdin is not a real console), + // silently give up so the TUI still starts. + } +} + +/** + * Install the setRawMode wrapper that keeps VT input enabled for the lifetime + * of the TUI. Call once before `createCliRenderer`. Idempotent. + */ +export function installWindowsVirtualTerminalInput(): void { + if (installed) return; + if (process.platform !== "win32") return; + if (loadKernel32() === null) return; + installed = true; + + // Apply once up front so the flag is on before the renderer's setupTerminal + // / setRawMode sequence runs (createCliRenderer calls setRawMode in its + // constructor, then setupTerminal). The wrapper below keeps it on across + // every subsequent raw-mode toggle. + ensureWindowsVirtualTerminalInput(); + + const stdin = process.stdin as NodeJS.ReadStream & { + setRawMode?: (mode: boolean) => NodeJS.ReadStream; + }; + const originalSetRawMode = stdin.setRawMode?.bind(stdin); + if (typeof originalSetRawMode !== "function") return; + + stdin.setRawMode = function patchedSetRawMode( + mode: boolean, + ): NodeJS.ReadStream { + const result = originalSetRawMode(mode); + if (mode) { + ensureWindowsVirtualTerminalInput(); + } + return result; + }; +}