pi-hypercharm-provider 1.3.35 → 1.3.37

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # Changelog
2
2
 
3
+ ## 1.3.36
4
+
5
+ - Pin Pi SDK development dependencies to 1.0.0 while retaining wildcard host peers.
6
+ - Verify real manifest loading, provider catalogs, startup/shutdown and native/bundled Pi hosts offline.
7
+ - Exercise real transport adapters with Unicode text, tool calls, empty responses, usage, request hooks and cancellation; no live provider calls.
8
+ - Make deprecated-catalog integration fixtures time-independent and emit shutdown before disposing test sessions.
9
+
3
10
  ## 1.3.35
4
11
 
5
12
  - Validate against Pi 0.99.0, including an offline real-host package-loading probe.
package/README.md CHANGED
@@ -11,11 +11,16 @@ _Hyperoptimized coding models — DeepSeek, GLM, Kimi, Qwen, MiniMax, Gemma, GPT
11
11
 
12
12
  </div>
13
13
 
14
+ ## Pi 1.0 compatibility
15
+
16
+ Tested with Pi **1.0.0**. Host-provided packages remain wildcard peers; development uses exact SDK pins.
17
+ Run `bun run test:pi` for offline manifest, catalog, lifecycle and streaming checks. To test an installed host, set `PI1_HOST_PACKAGE` to its package directory; add `PI1_HOST_ENTRY=bundle` for its bundled CLI runtime. The probe stubs all network requests and never uses a live provider endpoint.
18
+
14
19
  ---
15
20
 
16
21
  ## Features
17
22
 
18
- - **34+ AI Models** including DeepSeek V4 Flash/Pro, GLM 5/5.1, Kimi K2.5/K2.6, Qwen3.6/3.7, MiniMax M2.7, Gemma 4, GPT-OSS, and Llama
23
+ - **23+ AI Models** including DeepSeek V4 Flash/Pro, GLM 5/5.1, Kimi K2.5/K2.6, Qwen3.6/3.7, MiniMax M2.7, Gemma 4, GPT-OSS, and Llama
19
24
  - **DeepSeek Native Thinking** — Uses the `deepseek` thinking format for Charm Hyper requests, with native `reasoning_effort` on models that publish levels
20
25
  - **OpenAI-compatible API** via Charm Hyper's `/v1/chat/completions` endpoint
21
26
  - **OAuth Device Flow** — sign in with `/login` under the `hypercharm` provider (independent of the official provider's `hyper` registration)
@@ -31,29 +36,18 @@ _Hyperoptimized coding models — DeepSeek, GLM, Kimi, Qwen, MiniMax, Gemma, GPT
31
36
  | DeepSeek V4 Flash 0731 | Text | 1.0M | 384K | $0.44 | $1.32 |
32
37
  | DeepSeek V4 Pro | Text | 1.0M | 384K | $2.40 | $4.80 |
33
38
  | DeepSeek V4 Pro 0813 | Text | 1.0M | 262K | $1.44 | $4.31 |
34
- | DeepSeek V4.1 Flash | Text + Image | 1.0M | 33K | $0.30 | $1.20 |
39
+ | DeepSeek V4.1 Flash | Text + Image | 1.0M | 262K | $0.33 | $1.31 |
35
40
  | Gemma 4 26B A4B | Text | 256K | 26K | $0.10 | $0.33 |
36
41
  | GLM 5.3 | Text | 1.0M | 128K | $1.52 | $4.79 |
37
42
  | GLM 5.3 Flash | Text + Image | 1.0M | 131K | $0.16 | $0.54 |
38
- | GLM-5 | Text | 203K | 20K | $0.86 | $2.75 |
39
- | GLM-5.1 | Text | 203K | 3K | $1.36 | $4.27 |
40
43
  | GLM-5.2 | Text | 1.0M | 33K | $1.52 | $4.79 |
41
44
  | gpt-oss-120b | Text | 131K | 13K | $0.18 | $0.68 |
42
45
  | Inkling | Text + Image | 1.0M | 66K | $1.09 | $4.41 |
43
46
  | Kimi K2 Thinking | Text | 262K | 26K | $0.60 | $2.50 |
44
- | Kimi K2.5 | Text | 262K | 26K | $0.56 | $2.94 |
45
- | Kimi K2.6 | Text + Image | 262K | 26K | $1.03 | $4.36 |
46
47
  | Kimi K2.7 Code | Text + Image | 256K | 16K | $1.03 | $4.36 |
47
48
  | Kimi K3 | Text + Image | 1.0M | 16K | $3.27 | $16.33 |
48
- | Llama 3.3 70B Instruct | Text | 128K | 13K | $0.61 | $1.04 |
49
- | Llama 4 Maverick 17B 128E Instruct FP8 | Text | 430K | 43K | $0.25 | $0.83 |
50
49
  | MiniMax M2.7 | Text | 262K | 7K | $0.48 | $1.85 |
51
50
  | MiniMax M3 | Text + Image | 512K | 512K | $0.33 | $1.31 |
52
- | Qwen3 Coder 480B A35B Instruct INT4 Mixed AR | Text | 106K | 11K | $0.45 | $2.15 |
53
- | Qwen3 Next 80B A3B Instruct | Text | 262K | 26K | $0.12 | $1.14 |
54
- | Qwen3.6-Flash | Text + Image | 1.0M | 64K | $1.00 | $4.00 |
55
- | Qwen3.6-Max | Text | 256K | 64K | $2.00 | $12.00 |
56
- | Qwen3.6-Plus | Text + Image | 1.0M | 64K | $2.00 | $6.00 |
57
51
  | Qwen3.7-Flash | Text + Image | 1.0M | 64K | $0.20 | $0.80 |
58
52
  | Qwen3.7-Max | Text | 1.0M | 64K | $2.50 | $7.50 |
59
53
  | Qwen3.7-Plus | Text + Image | 1.0M | 64K | $1.20 | $4.80 |
package/bun.lock ADDED
@@ -0,0 +1,325 @@
1
+ {
2
+ "lockfileVersion": 2,
3
+ "configVersion": 1,
4
+ "workspaces": {
5
+ "": {
6
+ "name": "pi-hypercharm-provider",
7
+ "devDependencies": {
8
+ "@earendil-works/pi-ai": "1.0.0",
9
+ "@earendil-works/pi-coding-agent": "1.0.0",
10
+ "@earendil-works/pi-tui": "1.0.0",
11
+ "@types/node": "^24.10.1",
12
+ "jiti": "2.7.0",
13
+ "typescript": "6.0.3",
14
+ },
15
+ "peerDependencies": {
16
+ "@earendil-works/pi-ai": "*",
17
+ "@earendil-works/pi-coding-agent": "*",
18
+ "@earendil-works/pi-tui": "*",
19
+ },
20
+ },
21
+ },
22
+ "packages": {
23
+ "@anthropic-ai/sdk": ["@anthropic-ai/sdk@0.124.0", "", { "dependencies": { "json-schema-to-ts": "^3.1.1", "standardwebhooks": "^1.0.0" }, "peerDependencies": { "zod": "^3.25.0 || ^4.0.0" }, "optionalPeers": ["zod"], "bin": { "anthropic-ai-sdk": "bin/cli" } }, "sha512-cN5O8i9UVxHeOQAzj/XjshWXG8KiibJDw9OGpH2Z/eR3n/RBxdoLxDJOcfqAJWvjaMDFfHTBADU04hWRJVkDyA=="],
24
+
25
+ "@aws-sdk/client-bedrock-runtime": ["@aws-sdk/client-bedrock-runtime@3.1127.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.9", "@aws-sdk/credential-provider-node": "^3.972.82", "@aws-sdk/eventstream-handler-node": "^3.972.34", "@aws-sdk/middleware-eventstream": "^3.972.29", "@aws-sdk/middleware-websocket": "^3.972.52", "@aws-sdk/token-providers": "3.1127.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-IDl/lrPb90aH+pZFHGNDmgH9nAUQj5PlZH1sJ3w7RikctyjHSnY3oNjZhrLoaBoQn/rNK0zsP6OHEqEhj2tdLA=="],
26
+
27
+ "@aws-sdk/core": ["@aws-sdk/core@3.978.0", "", { "dependencies": { "@aws-sdk/types": "^3.974.5", "@aws-sdk/xml-builder": "^3.972.40", "@aws/lambda-invoke-store": "^0.3.0", "@smithy/core": "^3.33.3", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.17.2", "bowser": "^2.11.0", "tslib": "^2.6.2" } }, "sha512-2yX9LUmxPklVjSGTb8dfnWRJSiFQ3TeH2nn7G1mdKHTfnabzF0+gfrS8rYfLWmZrQ8A3mEcxMJjRc51dL5KWaA=="],
28
+
29
+ "@aws-sdk/credential-provider-env": ["@aws-sdk/credential-provider-env@3.972.71", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-JN+JHruYZw3GUZB8YGAlDk4wTDPOEAEEdEzj5nS0xodWR4smzHsN7PnK2j6IeOsDIj2aqua5DSbhXl9Gtf90FQ=="],
30
+
31
+ "@aws-sdk/credential-provider-http": ["@aws-sdk/credential-provider-http@3.972.73", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-uyYYnJOnlis8uQzaYGPd7N1JoioCoNpXgnkXYixsWJXHXgXyYi8WXJSDfofxJeWfQIGWLe2Nwyq60Uc7MZdVOg=="],
32
+
33
+ "@aws-sdk/credential-provider-ini": ["@aws-sdk/credential-provider-ini@3.973.16", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/credential-provider-env": "^3.972.71", "@aws-sdk/credential-provider-http": "^3.972.73", "@aws-sdk/credential-provider-login": "^3.972.78", "@aws-sdk/credential-provider-process": "^3.972.71", "@aws-sdk/credential-provider-sso": "^3.973.15", "@aws-sdk/credential-provider-web-identity": "^3.972.77", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-i++ly+0Uxa+u3ebSSyr0S/3CFhFJDxCXT3+Zj+mW2bXenEx5bKGCdTIKFu39SgXBNhWDjex/8cXUx9MUTMCrTw=="],
34
+
35
+ "@aws-sdk/credential-provider-login": ["@aws-sdk/credential-provider-login@3.972.78", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-eUtswnXu0+Ii9ieRK+0L7aPFV3Z/dnW2VntJzjBP9xs8s+8p5nBNuymIXtXwZ+5r5+XJP3e32nMkuZ/r0HozEA=="],
36
+
37
+ "@aws-sdk/credential-provider-node": ["@aws-sdk/credential-provider-node@3.972.83", "", { "dependencies": { "@aws-sdk/credential-provider-env": "^3.972.71", "@aws-sdk/credential-provider-http": "^3.972.73", "@aws-sdk/credential-provider-ini": "^3.973.16", "@aws-sdk/credential-provider-process": "^3.972.71", "@aws-sdk/credential-provider-sso": "^3.973.15", "@aws-sdk/credential-provider-web-identity": "^3.972.77", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/credential-provider-imds": "^4.4.16", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-jdso7ejzfRnatxMUZK4S/U6KbaDPCvfIV4XL+IQAPFDBt5rj5Fq595euqlK8Le4lNCMFR9oUpt+1l0aMgaayOQ=="],
38
+
39
+ "@aws-sdk/credential-provider-process": ["@aws-sdk/credential-provider-process@3.972.71", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-lYmXJa4gvq4xN1lrT5NiP5vIYYKcGWAdj8y+8o6dlcateB5eF3Dn8DtmjjHKfMBrTPAMr2pebIiX/UOj8c1/UA=="],
40
+
41
+ "@aws-sdk/credential-provider-sso": ["@aws-sdk/credential-provider-sso@3.973.15", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/token-providers": "3.1129.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-6Jhcf4v0pSFdjk1EW2kvzuEBKD+UZ2uNcHUIglKKLndD20YhvkL2kdmDOV5/j4mYuWWwe/a1FQ1aomU86/Cg5Q=="],
42
+
43
+ "@aws-sdk/credential-provider-web-identity": ["@aws-sdk/credential-provider-web-identity@3.972.77", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-uylIQSUWpfLuH2LovxEEfwzJGM/SabLOfLMg6YXu/E8jJEKUdpdILCVCQCdFvHyu/7dLJOHPMfrSwduxO56NkQ=="],
44
+
45
+ "@aws-sdk/eventstream-handler-node": ["@aws-sdk/eventstream-handler-node@3.972.34", "", { "dependencies": { "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-cTeVzpu1xEAkryTZBYhGwnQ6gOGyp8ZYZvmn0Sg/nI/ABmy/CRHHxPDJDUi9PxwxUtGGaatvfRUB3FCgT/rSWw=="],
46
+
47
+ "@aws-sdk/middleware-eventstream": ["@aws-sdk/middleware-eventstream@3.972.29", "", { "dependencies": { "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-dlRzHCgyB8W6hLuDC5pcT5q+ziPt00n4QGgGBE17ucLVU4zMa6lsbuUdQ2Pm75Z5VA8GF+R/+SgrRcaTdIzSIQ=="],
48
+
49
+ "@aws-sdk/middleware-websocket": ["@aws-sdk/middleware-websocket@3.972.53", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-bIrDaMENQmYRBHntOiOheqkiw5+fhKW4Lqb+mS1uqF0VwvdWI22fW2HFgWrng66CmYd+4k8ePlpj38sEfTuMLQ=="],
50
+
51
+ "@aws-sdk/nested-clients": ["@aws-sdk/nested-clients@3.997.45", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/signature-v4-multi-region": "^3.996.46", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/fetch-http-handler": "^5.7.2", "@smithy/node-http-handler": "^4.11.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-mooq9Q+jLa18VoM7HouczmslZU60iiB0aKc/Ztnq/luIL1ud0z4DnYprLR/ZO1gp331S9tJctM1HZr7u6YKBXQ=="],
52
+
53
+ "@aws-sdk/signature-v4-multi-region": ["@aws-sdk/signature-v4-multi-region@3.996.46", "", { "dependencies": { "@aws-sdk/types": "^3.974.5", "@smithy/signature-v4": "^5.6.12", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-L+2xZTye/2T96f3lwCws0Zw6GG2JHZW9e8FpVgGBeeExSKyeoZ6CWRpBml/7DNiK/O26jrgPM9F+Ay8VkgzUWQ=="],
54
+
55
+ "@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1127.0", "", { "dependencies": { "@aws-sdk/core": "^3.977.9", "@aws-sdk/nested-clients": "^3.997.44", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-Dv2TMWBshJ+tF6ahs2Sy5bh4Iabsd4GAQqVvE9XZmYmnoaVbpS2QKIKE/HRacc7bTtbjEEvP+laGzHvHlf1CiQ=="],
56
+
57
+ "@aws-sdk/types": ["@aws-sdk/types@3.974.5", "", { "dependencies": { "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-LkwLL2BLbC6wNNm4JaH9mbEqBMdOZCct6VAYqhdN4U1xrWM+fUJQEfbHwQgDypapOWTRtlk25akb5afM0P8CIQ=="],
58
+
59
+ "@aws-sdk/xml-builder": ["@aws-sdk/xml-builder@3.972.40", "", { "dependencies": { "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-wlFmCIGUlwF4zx/kncw+bmxTQh1HeSJq4mYV/V5cZUSJadDP3kXvGW8Rn21cimj/7y9ju+47oYWXi97vF7czaA=="],
60
+
61
+ "@aws/lambda-invoke-store": ["@aws/lambda-invoke-store@0.3.0", "", {}, "sha512-sl4Bm6yiMNYrZKkqqDFWN0UfnWhlS8ivKxrYl+6t0gCLrqr8y3B2IqZZbFRkfaVVp7C/baApyh71P+LeE1A2sQ=="],
62
+
63
+ "@babel/runtime": ["@babel/runtime@7.29.7", "", {}, "sha512-Nq8OhGWiZIZGV6hLHoyAKLLcJihP/xFeBMGJoUrxTX2psI8dCifzLhZISFb+VWS3wFMRDmCGw5R+dOySCqPLhw=="],
64
+
65
+ "@earendil-works/chord": ["@earendil-works/chord@1.0.0", "", { "dependencies": { "esbuild": "0.28.2" } }, "sha512-BIfWfrByM0pKq6tfKYXuwx0ed2CvaqIM3EDA7Dps+fP+d3CiPWdlHi1cDsJC05llqKJoRz5//G0hz0yQwwjISQ=="],
66
+
67
+ "@earendil-works/pi-agent-core": ["@earendil-works/pi-agent-core@1.0.0", "", { "dependencies": { "@earendil-works/pi-ai": "^1.0.0", "typebox": "1.3.27" } }, "sha512-bHFONjtEBDqiV+g1DmmtkSlfAaqHELr+XO+6I5Nah4gswwZrLJO4yZB/JjsnlI4AKWTayBLfgS6DCbeBBz9e2Q=="],
68
+
69
+ "@earendil-works/pi-ai": ["@earendil-works/pi-ai@1.0.0", "", { "dependencies": { "@anthropic-ai/sdk": "0.124.0", "@aws-sdk/client-bedrock-runtime": "3.1127.0", "@earendil-works/pi-telemetry": "^1.0.0", "@google/genai": "2.21.0", "@smithy/node-http-handler": "4.12.1", "http-proxy-agent": "9.1.0", "https-proxy-agent": "9.1.0", "openai": "7.19.0", "partial-json": "0.1.7", "typebox": "1.3.27" }, "bin": { "pi-ai": "dist/cli.js" } }, "sha512-3/W1vdDaVtpeMd23ElvJC12HLA5yS/BGqqcXF+0SK082dN7cbgNcCwguTBRBC258Ke8SzSvUW1B75iAf8w8IxA=="],
70
+
71
+ "@earendil-works/pi-codemode": ["@earendil-works/pi-codemode@1.0.0", "", { "dependencies": { "quickjs-wasi": "3.6.2" } }, "sha512-LPpFI4+T9NzDnhBDs15izWAolaoM8xnwqdziRd6Zx8BQeoEPvzefD2vMMzSyF0rOtq34TfQqkZ0ki16f6cGdMg=="],
72
+
73
+ "@earendil-works/pi-coding-agent": ["@earendil-works/pi-coding-agent@1.0.0", "", { "dependencies": { "@earendil-works/chord": "^1.0.0", "@earendil-works/pi-agent-core": "^1.0.0", "@earendil-works/pi-ai": "^1.0.0", "@earendil-works/pi-codemode": "^1.0.0", "@earendil-works/pi-mcp": "^1.0.0", "@earendil-works/pi-tui": "^1.0.0", "@silvia-odwyer/photon-node": "0.3.4", "chalk": "6.0.0", "cross-spawn": "7.0.6", "diff": "8.0.4", "grok-mermaid": "0.2.3", "highlight.js": "10.7.3", "hosted-git-info": "9.0.3", "ignore": "7.0.8", "jiti": "2.7.0", "minimatch": "10.2.6", "proper-lockfile": "4.1.2", "quickjs-wasi": "3.6.2", "semver": "7.8.5", "typebox": "1.3.27", "undici": "8.10.2", "yaml": "2.9.0" }, "bin": { "pi": "dist/bundle/cli.js" } }, "sha512-/FtbxoSQU/mEv1QnichJjRjqteqaIaMWxmhB4G367+MwZfX7/DI5B9YAg5lqbN7nztFskBEtUSZ+FlmMBECtMw=="],
74
+
75
+ "@earendil-works/pi-mcp": ["@earendil-works/pi-mcp@1.0.0", "", { "dependencies": { "cross-spawn": "7.0.6" } }, "sha512-rYra0aF5iPmJd+fsB+VBuqxWNABGJ3Iiyhg0CqIc/91ta2n7IvQmCp0Cac/YkUTNnvRsVZnjgAiBkRi6+ouWuw=="],
76
+
77
+ "@earendil-works/pi-telemetry": ["@earendil-works/pi-telemetry@1.0.0", "", {}, "sha512-WjNBj5TYIiPZFQEz2WlULcDwPLaKwIlmsKjVeYM+LJSbnSp38kWsHUJysIDGnu23IcLbKoPtywsvYfUJCeZePA=="],
78
+
79
+ "@earendil-works/pi-tui": ["@earendil-works/pi-tui@1.0.0", "", { "dependencies": { "get-east-asian-width": "1.6.0", "marked": "18.0.11" } }, "sha512-JsT7kXnpZA2YOtQu6RyriyxEO0eJIzPyfiH09bH+OLN5+s18HYkwaUD/tBkjhnSfMu6/50CQPRYJagzSP6HdPw=="],
80
+
81
+ "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.28.2", "", { "os": "aix", "cpu": "ppc64" }, "sha512-XExcO+dvLKvVtNTibSTBej1NCAbaGhWn9Ww1ZPx80qsahhPFe/8jgWP0IchNe0F3HwkU7n8ejhH8bjonqht8mQ=="],
82
+
83
+ "@esbuild/android-arm": ["@esbuild/android-arm@0.28.2", "", { "os": "android", "cpu": "arm" }, "sha512-kXXoiPVVGQcnIYGOeaovwOURpniDBpSq4A03qkQ+BMQqtGG6HYap3xne9C1O1yo4TR3qxlCX5IqqmX6fFo2Lqg=="],
84
+
85
+ "@esbuild/android-arm64": ["@esbuild/android-arm64@0.28.2", "", { "os": "android", "cpu": "arm64" }, "sha512-5YfKeeI8qWfBZIX+u2xZC3Zlb3Os/gLS2sbEKM+I4ZOcsWmHS2WLysCcQZDAFRslDUU5Oiq44gf6PYN1vGwG5A=="],
86
+
87
+ "@esbuild/android-x64": ["@esbuild/android-x64@0.28.2", "", { "os": "android", "cpu": "x64" }, "sha512-O387ite7SzUyCcy3JQX4P4bLtEA7bLLkx+esve5JHnyYfNTxcVpXZo9jhdB0lTKN44gztELTdU7nS8Nr16Fs1Q=="],
88
+
89
+ "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.28.2", "", { "os": "darwin", "cpu": "arm64" }, "sha512-n4KqkOQrraxHJcgjM1RvwbigfQKIKJVpM7xp+KsxiyUSrRdIXnt73VhrPAx0fV44hgfmIVKjxMN9J1t5jySVkw=="],
90
+
91
+ "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.28.2", "", { "os": "darwin", "cpu": "x64" }, "sha512-uq6suIWYP37qzGddBKPw5QEQPi6HiLGsO7UmkpfyaYNQ3D+rN6w6WfwH+nuqcGXWvawGwxOEroO4YGnFh95azw=="],
92
+
93
+ "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.28.2", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-n+I0BTSRIoy+d6RPKnEVwql5UwBJolytvY4mAOIEJorKlqgPII8ix6slVVrfZ5Tnj7glIZvloylbB/EJPMWEXw=="],
94
+
95
+ "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.28.2", "", { "os": "freebsd", "cpu": "x64" }, "sha512-78XJTJkvPs0kz2w61301PJjXl4g7q3JqiYMZ/M/yVI73EHBrCRTgkhu9oqG7vPqq+a/yadEW8aD+agKlk5xrmg=="],
96
+
97
+ "@esbuild/linux-arm": ["@esbuild/linux-arm@0.28.2", "", { "os": "linux", "cpu": "arm" }, "sha512-XlDnu2q5yoqems+xay6wSAcg9DDD7K9RLKZEBOMZm3ckNpJBvOX20tSfby8KfrrhINDyv9V2YVZKY/SpoGJI8w=="],
98
+
99
+ "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.28.2", "", { "os": "linux", "cpu": "arm64" }, "sha512-pW4AC0P3it8c7do9MVM4p51FzHzdM/TZrerurgRcHJ2WTa1VQ1CIq18xncfpBJw4ojkiZZrKW2yIBWBP92j6Ug=="],
100
+
101
+ "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.28.2", "", { "os": "linux", "cpu": "ia32" }, "sha512-CYbnj78HsIeA+DhgUKgFCfvNsTHFhMMrinUrMZpDXJXKN8T3XViTZ/+wtHeVxEWY8ewSzTFN+nRmSwO2tZaLUQ=="],
102
+
103
+ "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-buwkd8nsph4R+ajRvw0qM5Hja/TXQow3ptzWO2EbG/cqcIkHloRrdlBtQlshyYGTNFvfkfJ5tpPLVkY4DtsPfQ=="],
104
+
105
+ "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-ZVykbDyk7519VwiNb9Lcj9m8XM6v5V9uKPvrEMkkEedVewf+0itkhahp4HDpgERXhwLRpWFypsGbG/J8s0QjJA=="],
106
+
107
+ "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.28.2", "", { "os": "linux", "cpu": "ppc64" }, "sha512-CAXl+Dtd9UUuJd8pKKdwh6MLm3MUMiqMPmhZ3tTSXPqfyQ3vDl6R5hZdZ/kYojK4ofXtdfSv1tFq8XzWx3heNQ=="],
108
+
109
+ "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.28.2", "", { "os": "linux", "cpu": "none" }, "sha512-GeXCej4IQtU1B+QlDV8W/RRvbzI3O/Stss+/bCXv4lZls5WGRtu2a+3JkA3i4qIUlMXpcHebWpF8AkJhATowuA=="],
110
+
111
+ "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.28.2", "", { "os": "linux", "cpu": "s390x" }, "sha512-3H1weTYZPxt/WOhByszQZybS9w5lKzUn1FDMsgEChbHWQwHYQQRfBxgCcZvPhjHfKyJjIievvMmEUawJrdY9Dg=="],
112
+
113
+ "@esbuild/linux-x64": ["@esbuild/linux-x64@0.28.2", "", { "os": "linux", "cpu": "x64" }, "sha512-4xTZr1FUmSoQW4XIWmit3tzQrUTZM+N3P0XV8xROKYF50XfI7xeO90+1bZvNwxIufQ9hDQVRJH5YhgPVF8A/HQ=="],
114
+
115
+ "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-sSATRjPeDBg3pdgHoQfoYBob11Kk1FGa9lui5RIHZCoCkJa9QKlvl3/vKz2usCmYYjs7ymJR/2Nnsqe+Hjt5nw=="],
116
+
117
+ "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.28.2", "", { "os": "none", "cpu": "x64" }, "sha512-lqnzCV+mM0gIADaKihiCg6ifgfU2L3h5E33rNQBN1Y4MaVGnzryzmvvf7UHxprpQdE8hpqLolJ9Rl+SkIRDpyw=="],
118
+
119
+ "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.28.2", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AL2qJILH7lNjrDmCQDvdxMfAUIv8KMNZOvrwAQ8i8//ntL9FflhOyMJ8OZSMBb8/AWXe3/5v5S20y3zCoZWKoQ=="],
120
+
121
+ "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.28.2", "", { "os": "openbsd", "cpu": "x64" }, "sha512-QtiuPytchRyC4rwUKhexJdQKvDuZ6hWloi3igqPQNUJCS1/v9EiO3UTOXR6A3FoMo4fnAKbWJdqaIwhOzh8qEw=="],
122
+
123
+ "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.28.2", "", { "os": "none", "cpu": "arm64" }, "sha512-WkhYDmpTjLvGlScA1rwjRUmhl4k8oXR3cIbtqWmELgU/dFeHHlEllxDvdWcNJV9rbzCexB5vz8gtNewWLgCT7Q=="],
124
+
125
+ "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.28.2", "", { "os": "sunos", "cpu": "x64" }, "sha512-GPMSkTOtMnv2U2F8gxe4Io6qmVs+YKyp832Etqqxr0hFngmXQ3rzwytelm3GIn7T4VviRUlf3sOgBOiTdvaf7g=="],
126
+
127
+ "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.28.2", "", { "os": "win32", "cpu": "arm64" }, "sha512-PIhhEkE9uPBleRBrQEJpUn7MBnibZzbGzYWPmY3x+YoVg/95zbjB4CxPPOQ8l5tYYM4mMaCthF8/1DIfBQQyWQ=="],
128
+
129
+ "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.28.2", "", { "os": "win32", "cpu": "ia32" }, "sha512-YmJbfTlvU7Sdn9BB+4PRES4oB6pxgS37MAONj+hBr/cpXS1aBPKXxNnDbu+QCWPj0o9dgyxeq79g6c5P8KeuYA=="],
130
+
131
+ "@esbuild/win32-x64": ["@esbuild/win32-x64@0.28.2", "", { "os": "win32", "cpu": "x64" }, "sha512-5ebpxr3nWMzrL/rnUI755Jkuee0bHL/Gq0WTF9lvcpv73wAp5eu8MfBUgWK9bhWvZjj7yX8etf/8tI8Ney695g=="],
132
+
133
+ "@google/genai": ["@google/genai@2.21.0", "", { "dependencies": { "google-auth-library": "^10.3.0", "p-retry": "^4.6.2", "protobufjs": "^7.5.4", "ws": "^8.18.0" }, "peerDependencies": { "@modelcontextprotocol/sdk": "^1.25.2" }, "optionalPeers": ["@modelcontextprotocol/sdk"] }, "sha512-+PDtco2/Z0ONdzCGekCoCT+O1VJS9xJQNN4XzQpXG/t3El/SWWMkCWlFRO1KmivOHPa4Q0VjUYu1HBKCZ/v33Q=="],
134
+
135
+ "@protobufjs/aspromise": ["@protobufjs/aspromise@1.1.2", "", {}, "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="],
136
+
137
+ "@protobufjs/base64": ["@protobufjs/base64@1.1.2", "", {}, "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg=="],
138
+
139
+ "@protobufjs/codegen": ["@protobufjs/codegen@2.0.5", "", {}, "sha512-zgXFLzW3Ap33e6d0Wlj4MGIm6Ce8O89n/apUaGNB/jx+hw+ruWEp7EwGUshdLKVRCxZW12fp9r40E1mQrf/34g=="],
140
+
141
+ "@protobufjs/eventemitter": ["@protobufjs/eventemitter@1.1.1", "", {}, "sha512-vW1GmwMZNnL+gMRaovlh9yZX74kc+TTU3FObkkurpMaRtBfLP3ldjS9KQWlwZgraRE0+dheEEoAxdzcJQ8eXZg=="],
142
+
143
+ "@protobufjs/fetch": ["@protobufjs/fetch@1.1.1", "", { "dependencies": { "@protobufjs/aspromise": "1.1.2" } }, "sha512-GpptLrs57adMSuHi3VNj0mAF8dwh36LMaYF6XyJ6JMWlVsc+t42tm1HSEDmOs3A8fC9yyeisgLhsTVQokOZ0zw=="],
144
+
145
+ "@protobufjs/float": ["@protobufjs/float@1.0.2", "", {}, "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ=="],
146
+
147
+ "@protobufjs/path": ["@protobufjs/path@1.1.2", "", {}, "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA=="],
148
+
149
+ "@protobufjs/pool": ["@protobufjs/pool@1.1.0", "", {}, "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw=="],
150
+
151
+ "@protobufjs/utf8": ["@protobufjs/utf8@1.1.2", "", {}, "sha512-b1UQwcEZ4yCnMCD8DAL1VlbvBJE9/IX4FTIp7BG1xYpf29SLazLSrqUkj4w7Y5y7cCVP6E5tcqqcI0xemPkHug=="],
152
+
153
+ "@silvia-odwyer/photon-node": ["@silvia-odwyer/photon-node@0.3.4", "", {}, "sha512-bnly4BKB3KDTFxrUIcgCLbaeVVS8lrAkri1pEzskpmxu9MdfGQTy8b8EgcD83ywD3RPMsIulY8xJH5Awa+t9fA=="],
154
+
155
+ "@smithy/core": ["@smithy/core@3.34.1", "", { "dependencies": { "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-dLcOUxz8YCv1RZUMKq6GbyUf95pLbrqh34bPvpCZ1+CByFF31BEAFewZjsGCnVsZTKdThNENfGyAgk2TJqVwSw=="],
156
+
157
+ "@smithy/credential-provider-imds": ["@smithy/credential-provider-imds@4.4.16", "", { "dependencies": { "@smithy/core": "3.31.1", "@smithy/types": "4.16.1", "tslib": "2.8.1" } }, "sha512-QfuLWAkLzptffFW980AFeHZFdqds2B64rpEd3uJ6lgs3xVn9QegGMUgUcj+4d7dRrAsya3r58ZKpku97WcFb4w=="],
158
+
159
+ "@smithy/fetch-http-handler": ["@smithy/fetch-http-handler@5.8.0", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-ycSJu3tFAQ4v04CBB0agqFMVsSQ1iG3yw+SpgxRqKfaURpQD4CZ8Wn0zPMmSnOuTpTh65Vz+EA0rMrw089wvkA=="],
160
+
161
+ "@smithy/node-http-handler": ["@smithy/node-http-handler@4.12.1", "", { "dependencies": { "@smithy/core": "^3.33.3", "@smithy/types": "^4.18.0", "tslib": "^2.6.2" } }, "sha512-ThMkboGeONWXAelq9FvGsuJC4rOi+qyC4/zhUF58xYpxUg5sQKx2VXZYJmtNjr4dSuBJ1HeJXETQILCz3wOHvw=="],
162
+
163
+ "@smithy/signature-v4": ["@smithy/signature-v4@5.6.12", "", { "dependencies": { "@smithy/core": "3.31.1", "@smithy/types": "4.16.1", "tslib": "2.8.1" } }, "sha512-I6KLtq3H0qqSuV9vLglfi8puHqzygzWHOnI4z/Rdoo+q50vvo18vBRdPAvvEtcaKROz7Zn6qnPa14kRfPH6PcQ=="],
164
+
165
+ "@smithy/types": ["@smithy/types@4.18.0", "", { "dependencies": { "tslib": "^2.6.2" } }, "sha512-CgB6HHWer/vrKps24ulRIbpcpb7K4xAU7SkZ7YHzBPlwHsvsrCJFEXK421s+cJzX+ZrqtA/TuU5w1HzI7k9N8A=="],
166
+
167
+ "@stablelib/base64": ["@stablelib/base64@1.0.1", "", {}, "sha512-1bnPQqSxSuc3Ii6MhBysoWCg58j97aUjuCSZrGSmDxNqtytIi0k8utUenAwTZN4V5mXXYGsVUI9zeBqy+jBOSQ=="],
168
+
169
+ "@types/node": ["@types/node@24.13.3", "", { "dependencies": { "undici-types": "7.18.2" } }, "sha512-Dh8vAsV36ig5wa9OX4pXvMc9D3Veibfw2wix0CUwYODLD8nkj9UsLjASr49nPg+2eKzxhBV+v7L8pXvT4e639Q=="],
170
+
171
+ "@types/retry": ["@types/retry@0.12.0", "", {}, "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA=="],
172
+
173
+ "agent-base": ["agent-base@9.0.0", "", {}, "sha512-TQf59BsZnytt8GdJKLPfUZ54g/iaUL2OWDSFCCvMOhsHduDQxO8xC4PNeyIkVcA5KwL2phPSv0douC0fgWzmnA=="],
174
+
175
+ "balanced-match": ["balanced-match@4.0.4", "", {}, "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA=="],
176
+
177
+ "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="],
178
+
179
+ "bignumber.js": ["bignumber.js@9.3.1", "", {}, "sha512-Ko0uX15oIUS7wJ3Rb30Fs6SkVbLmPBAKdlm7q9+ak9bbIeFf0MwuBsQV6z7+X768/cHsfg+WlysDWJcmthjsjQ=="],
180
+
181
+ "bowser": ["bowser@2.14.1", "", {}, "sha512-tzPjzCxygAKWFOJP011oxFHs57HzIhOEracIgAePE4pqB3LikALKnSzUyU4MGs9/iCEUuHlAJTjTc5M+u7YEGg=="],
182
+
183
+ "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "4.0.4" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="],
184
+
185
+ "buffer-equal-constant-time": ["buffer-equal-constant-time@1.0.1", "", {}, "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA=="],
186
+
187
+ "chalk": ["chalk@6.0.0", "", {}, "sha512-2uNTXIuTTxk7ciZgAU1BQcgnchcG0xXnrs6jzkQfj9SsRa9M2s5zE8WT96hS6KmG4MzWHSrvH43DF1m4XRkrFg=="],
188
+
189
+ "cross-spawn": ["cross-spawn@7.0.6", "", { "dependencies": { "path-key": "3.1.1", "shebang-command": "2.0.0", "which": "2.0.2" } }, "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA=="],
190
+
191
+ "data-uri-to-buffer": ["data-uri-to-buffer@4.0.1", "", {}, "sha512-0R9ikRb668HB7QDxT1vkpuUBtqc53YyAwMwGeUFKRojY/NWKvdZ+9UYtRfGmhqNbRkTSVpMbmyhXipFFv2cb/A=="],
192
+
193
+ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "2.1.3" }, "peerDependencies": { "supports-color": "*" }, "optionalPeers": ["supports-color"] }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="],
194
+
195
+ "diff": ["diff@8.0.4", "", {}, "sha512-DPi0FmjiSU5EvQV0++GFDOJ9ASQUVFh5kD+OzOnYdi7n3Wpm9hWWGfB/O2blfHcMVTL5WkQXSnRiK9makhrcnw=="],
196
+
197
+ "ecdsa-sig-formatter": ["ecdsa-sig-formatter@1.0.11", "", { "dependencies": { "safe-buffer": "5.2.1" } }, "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ=="],
198
+
199
+ "esbuild": ["esbuild@0.28.2", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.28.2", "@esbuild/android-arm": "0.28.2", "@esbuild/android-arm64": "0.28.2", "@esbuild/android-x64": "0.28.2", "@esbuild/darwin-arm64": "0.28.2", "@esbuild/darwin-x64": "0.28.2", "@esbuild/freebsd-arm64": "0.28.2", "@esbuild/freebsd-x64": "0.28.2", "@esbuild/linux-arm": "0.28.2", "@esbuild/linux-arm64": "0.28.2", "@esbuild/linux-ia32": "0.28.2", "@esbuild/linux-loong64": "0.28.2", "@esbuild/linux-mips64el": "0.28.2", "@esbuild/linux-ppc64": "0.28.2", "@esbuild/linux-riscv64": "0.28.2", "@esbuild/linux-s390x": "0.28.2", "@esbuild/linux-x64": "0.28.2", "@esbuild/netbsd-arm64": "0.28.2", "@esbuild/netbsd-x64": "0.28.2", "@esbuild/openbsd-arm64": "0.28.2", "@esbuild/openbsd-x64": "0.28.2", "@esbuild/openharmony-arm64": "0.28.2", "@esbuild/sunos-x64": "0.28.2", "@esbuild/win32-arm64": "0.28.2", "@esbuild/win32-ia32": "0.28.2", "@esbuild/win32-x64": "0.28.2" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-HKVLS8dvII+xoKW9kmqxbRKrnWEXfJJr/FZhhJmiqIB0e053QNYFqOBouTMO/k5sID4MvCiUCvv8b9M4h32wIA=="],
200
+
201
+ "extend": ["extend@3.0.2", "", {}, "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="],
202
+
203
+ "fast-sha256": ["fast-sha256@1.3.0", "", {}, "sha512-n11RGP/lrWEFI/bWdygLxhI+pVeo1ZYIVwvvPkW7azl/rOy+F3HYRZ2K5zeE9mmkhQppyv9sQFx0JM9UabnpPQ=="],
204
+
205
+ "fetch-blob": ["fetch-blob@3.2.0", "", { "dependencies": { "node-domexception": "1.0.0", "web-streams-polyfill": "3.3.3" } }, "sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ=="],
206
+
207
+ "formdata-polyfill": ["formdata-polyfill@4.0.10", "", { "dependencies": { "fetch-blob": "3.2.0" } }, "sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g=="],
208
+
209
+ "gaxios": ["gaxios@7.3.0", "", { "dependencies": { "extend": "3.0.2", "https-proxy-agent": "7.0.6", "node-fetch": "3.3.2" } }, "sha512-RB5vLV+vvQeoFPCX4QMK6/hjVkbIamPp1QSUD0CiZcnj12qbpiL+pLbYtgD+oZkWl0tl9z+o2Utp+MpM3QRhBA=="],
210
+
211
+ "gcp-metadata": ["gcp-metadata@8.1.2", "", { "dependencies": { "gaxios": "7.3.0", "google-logging-utils": "1.1.3", "json-bigint": "1.0.0" } }, "sha512-zV/5HKTfCeKWnxG0Dmrw51hEWFGfcF2xiXqcA3+J90WDuP0SvoiSO5ORvcBsifmx/FoIjgQN3oNOGaQ5PhLFkg=="],
212
+
213
+ "get-east-asian-width": ["get-east-asian-width@1.6.0", "", {}, "sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA=="],
214
+
215
+ "google-auth-library": ["google-auth-library@10.9.1", "", { "dependencies": { "base64-js": "1.5.1", "ecdsa-sig-formatter": "1.0.11", "gaxios": "7.3.0", "gcp-metadata": "8.1.2", "google-logging-utils": "1.1.3", "jws": "4.0.1" } }, "sha512-i1ydyHrqcIxXkWh/uBmVkzCvIuq5yiK2ATndIe5XxKholrG/MTYP9xGYka4sQhrbIAgGjL2B6NOE7rFaiF3fXw=="],
216
+
217
+ "google-logging-utils": ["google-logging-utils@1.1.3", "", {}, "sha512-eAmLkjDjAFCVXg7A1unxHsLf961m6y17QFqXqAXGj/gVkKFrEICfStRfwUlGNfeCEjNRa32JEWOUTlYXPyyKvA=="],
218
+
219
+ "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
220
+
221
+ "grok-mermaid": ["grok-mermaid@0.2.3", "", {}, "sha512-/4KopAbsjvuRP9MdPtlDjOHUmUVEohOX73JNcsWpzAtFxh+bq5+Dhb6gzvRieLDwIPQIR3/vy8V1NNTuz4Zsmg=="],
222
+
223
+ "highlight.js": ["highlight.js@10.7.3", "", {}, "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A=="],
224
+
225
+ "hosted-git-info": ["hosted-git-info@9.0.3", "", { "dependencies": { "lru-cache": "11.5.2" } }, "sha512-Hc+ghLoSt6QaYZUv0WBiIvmMDZuZZ7oaDvdH8MbfOO4lOsxdXLEvuC6ePoGs9H1X9oCLyq6+NVN0MKqD+ydxyg=="],
226
+
227
+ "http-proxy-agent": ["http-proxy-agent@9.1.0", "", { "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", "proxy-agent-negotiate": "1.1.0" } }, "sha512-2NxoveTT58mjYT4n3RPTEfCZGLMbidoO8XEieXfpSYxu+PQJ1qpx4ypwH6N+uF9twBPIvRRgvkvW5HUTYWENig=="],
228
+
229
+ "https-proxy-agent": ["https-proxy-agent@9.1.0", "", { "dependencies": { "agent-base": "9.0.0", "debug": "^4.3.4", "proxy-agent-negotiate": "1.1.0" } }, "sha512-ag87y7cJJ9/3+GxFr8Oy4O5faDsGRGnBGsJj/YjOSsSx/5eadKLYTMPlzuR6obgoCDDm0abAAZitXXQkMOPSpA=="],
230
+
231
+ "ignore": ["ignore@7.0.8", "", {}, "sha512-YYNsSlXBjMk92SKnkwvB5LOVSa6OznlFUGcsvrFgNJbJCd0M1XKeFVRc8ZByeCqz32FivYNHJVooLmdqrmvp/Q=="],
232
+
233
+ "isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="],
234
+
235
+ "jiti": ["jiti@2.7.0", "", { "bin": { "jiti": "lib/jiti-cli.mjs" } }, "sha512-AC/7JofJvZGrrneWNaEnJeOLUx+JlGt7tNa0wZiRPT4MY1wmfKjt2+6O2p2uz2+skll8OZZmJMNqeke7kKbNgQ=="],
236
+
237
+ "json-bigint": ["json-bigint@1.0.0", "", { "dependencies": { "bignumber.js": "9.3.1" } }, "sha512-SiPv/8VpZuWbvLSMtTDU8hEfrZWg/mH/nV/b4o0CYbSxu1UIQPLdwKOCIyLQX+VIPO5vrLX3i8qtqFyhdPSUSQ=="],
238
+
239
+ "json-schema-to-ts": ["json-schema-to-ts@3.1.1", "", { "dependencies": { "@babel/runtime": "7.29.7", "ts-algebra": "2.0.0" } }, "sha512-+DWg8jCJG2TEnpy7kOm/7/AxaYoaRbjVB4LFZLySZlWn8exGs3A4OLJR966cVvU26N7X9TWxl+Jsw7dzAqKT6g=="],
240
+
241
+ "jwa": ["jwa@2.0.1", "", { "dependencies": { "buffer-equal-constant-time": "1.0.1", "ecdsa-sig-formatter": "1.0.11", "safe-buffer": "5.2.1" } }, "sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg=="],
242
+
243
+ "jws": ["jws@4.0.1", "", { "dependencies": { "jwa": "2.0.1", "safe-buffer": "5.2.1" } }, "sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA=="],
244
+
245
+ "long": ["long@5.3.2", "", {}, "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA=="],
246
+
247
+ "lru-cache": ["lru-cache@11.5.2", "", {}, "sha512-4pfM1Ff0x50o0tQwb5ucw/RzNyD0/YJME6IVcStalZuMWxdt3sR3huStTtxz4PUmvZfRguvDejasvQ2kifR11g=="],
248
+
249
+ "marked": ["marked@18.0.11", "", { "bin": { "marked": "bin/marked.js" } }, "sha512-HnslJfsZkRPBDJRHvVtAaWlZHEpSu7u8LgQuJCELjRKuWR+hpq4A7sLq3p8HaI9ypVoXDXxV34CsQJEe1+J5Aw=="],
250
+
251
+ "minimatch": ["minimatch@10.2.6", "", { "dependencies": { "brace-expansion": "^5.0.8" } }, "sha512-vpLQEs+VLCr1nU0BXS07maYoFwlDAH0gngQuuttxIwutDFEMHq2blX+8vpgxDdK3J1PwjCJiep77OitTZ4Ll1A=="],
252
+
253
+ "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="],
254
+
255
+ "node-domexception": ["node-domexception@1.0.0", "", {}, "sha512-/jKZoMpw0F8GRwl4/eLROPA3cfcXtLApP0QzLmUT/HuPCZWyB7IY9ZrMeKw2O/nFIqPQB3PVM9aYm0F312AXDQ=="],
256
+
257
+ "node-fetch": ["node-fetch@3.3.2", "", { "dependencies": { "data-uri-to-buffer": "4.0.1", "fetch-blob": "3.2.0", "formdata-polyfill": "4.0.10" } }, "sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA=="],
258
+
259
+ "openai": ["openai@7.19.0", "", { "peerDependencies": { "@aws-sdk/credential-provider-node": ">=3.972.0 <4", "@smithy/hash-node": ">=4.3.0 <5", "@smithy/signature-v4": ">=5.4.0 <6", "undici": ">=5 <9", "ws": "^8.21.0", "zod": "^3.25 || ^4.0" }, "optionalPeers": ["@aws-sdk/credential-provider-node", "@smithy/hash-node", "@smithy/signature-v4", "undici", "ws", "zod"] }, "sha512-MX2s3u2L5racTO0CC/SWpCOasJQBCJrqLKXK+l82cAhdeF8mPMBEe/gxMm0ZFa2xpKpOFLRjxv5afYEZbBXmbQ=="],
260
+
261
+ "p-retry": ["p-retry@4.6.2", "", { "dependencies": { "@types/retry": "0.12.0", "retry": "0.13.1" } }, "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ=="],
262
+
263
+ "partial-json": ["partial-json@0.1.7", "", {}, "sha512-Njv/59hHaokb/hRUjce3Hdv12wd60MtM9Z5Olmn+nehe0QDAsRtRbJPvJ0Z91TusF0SuZRIvnM+S4l6EIP8leA=="],
264
+
265
+ "path-key": ["path-key@3.1.1", "", {}, "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="],
266
+
267
+ "proper-lockfile": ["proper-lockfile@4.1.2", "", { "dependencies": { "graceful-fs": "4.2.11", "retry": "0.12.0", "signal-exit": "3.0.7" } }, "sha512-TjNPblN4BwAWMXU8s9AEz4JmQxnD1NNL7bNOY/AKUzyamc379FWASUhc/K1pL2noVb+XmZKLL68cjzLsiOAMaA=="],
268
+
269
+ "protobufjs": ["protobufjs@7.6.5", "", { "dependencies": { "@protobufjs/aspromise": "1.1.2", "@protobufjs/base64": "1.1.2", "@protobufjs/codegen": "2.0.5", "@protobufjs/eventemitter": "1.1.1", "@protobufjs/fetch": "1.1.1", "@protobufjs/float": "1.0.2", "@protobufjs/path": "1.1.2", "@protobufjs/pool": "1.1.0", "@protobufjs/utf8": "1.1.2", "@types/node": "24.13.3", "long": "5.3.2" } }, "sha512-/FPD0nUc9jH6rfFjji9IBqOz4pcSE3CsT1m7Ep6Mdb0LxSUMj8hgl6GomOvZzpNpAqqGaXA0P3VSrZLFzIhQrw=="],
270
+
271
+ "proxy-agent-negotiate": ["proxy-agent-negotiate@1.1.0", "", { "peerDependencies": { "kerberos": "^2.0.0" }, "optionalPeers": ["kerberos"] }, "sha512-N8IBcM3UgCVzz2L2Lqv8DVntDnnC8/hiV4nEDUPkqq72TPUgYWjQc+bdZlBPZK9LzPAvOY//gAt0S0DApoOXWQ=="],
272
+
273
+ "quickjs-wasi": ["quickjs-wasi@3.6.2", "", {}, "sha512-FCqGtGOrMgzUiIrMNMA2YnsOxCNwo31dzqXvclXUC6xeT35NJLKXQJsvbeCTjvoFAwZgEAPg8U6+KAPDGXn8Mg=="],
274
+
275
+ "retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="],
276
+
277
+ "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="],
278
+
279
+ "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="],
280
+
281
+ "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="],
282
+
283
+ "shebang-regex": ["shebang-regex@3.0.0", "", {}, "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="],
284
+
285
+ "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="],
286
+
287
+ "standardwebhooks": ["standardwebhooks@1.1.1", "", { "dependencies": { "@stablelib/base64": "^1.0.0", "fast-sha256": "^1.3.0" } }, "sha512-bCbX9ZEyFkWPsRz7Bl3NuQUJohmwGSev/yhr7vhaGPlc4AfIrspIRa6cPTBuI1ItmrTDJ4d/S2hCsfe4+vQGnQ=="],
288
+
289
+ "ts-algebra": ["ts-algebra@2.0.0", "", {}, "sha512-FPAhNPFMrkwz76P7cdjdmiShwMynZYN6SgOujD1urY4oNm80Ou9oMdmbR45LotcKOXoy7wSmHkRFE6Mxbrhefw=="],
290
+
291
+ "tslib": ["tslib@2.8.1", "", {}, "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="],
292
+
293
+ "typebox": ["typebox@1.3.27", "", {}, "sha512-zu+jc1pcy4UiNThxikUr36f0Rybk9PEeCg/NE6adeWr/SKsdNO4EzZHYRDlv2YCVAfj3Odq3dESSo/jNyoBXzA=="],
294
+
295
+ "typescript": ["typescript@6.0.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw=="],
296
+
297
+ "undici": ["undici@8.10.2", "", {}, "sha512-/y4/bH9YNU5hi9NIrpOuvGXFcxrj3CMrV+/AYpowAYTpHn8gX/XPFjNy766FPoYY0miQhdW977JFWKGNhBdwyQ=="],
298
+
299
+ "undici-types": ["undici-types@7.18.2", "", {}, "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w=="],
300
+
301
+ "web-streams-polyfill": ["web-streams-polyfill@3.3.3", "", {}, "sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw=="],
302
+
303
+ "which": ["which@2.0.2", "", { "dependencies": { "isexe": "2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="],
304
+
305
+ "ws": ["ws@8.21.3", "", { "peerDependencies": { "bufferutil": "^4.0.1", "utf-8-validate": ">=5.0.2" }, "optionalPeers": ["bufferutil", "utf-8-validate"] }, "sha512-201TZ/kPWxoPr/OKWjquZR1SWKXcvxdH+e1xrx89b3YbmzLMFCLfnaG1HFIgWzJOEWZ7MvpK++odZufgYR50Rw=="],
306
+
307
+ "yaml": ["yaml@2.9.0", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA=="],
308
+
309
+ "@aws-sdk/credential-provider-sso/@aws-sdk/token-providers": ["@aws-sdk/token-providers@3.1129.0", "", { "dependencies": { "@aws-sdk/core": "^3.978.0", "@aws-sdk/nested-clients": "^3.997.45", "@aws-sdk/types": "^3.974.5", "@smithy/core": "^3.33.3", "@smithy/types": "^4.17.2", "tslib": "^2.6.2" } }, "sha512-Sbl3rpzQdsG4ZK2zh0JWUYyZPKKorJlVOddA2T0DVbKJFrsW8J6wgnslxxUH04+WaBMr4A1HzJZvZX0xUvkniA=="],
310
+
311
+ "@smithy/credential-provider-imds/@smithy/core": ["@smithy/core@3.31.1", "", { "dependencies": { "@smithy/types": "4.16.1", "tslib": "2.8.1" } }, "sha512-CyogUINxvi7C7LDsh8Syo6hVJOT9ckz4rG8dRZfTJ8r91HkMY59PnNooaj7WcHyxEkxPfBAmbgztZU+xTo76lg=="],
312
+
313
+ "@smithy/credential-provider-imds/@smithy/types": ["@smithy/types@4.16.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-0JFs3V2y2M9tKW5na/qxe69Zv+uxLMO7QBbhxF/FHu/Gp2NFZAAL9tWl9PU02xxo07pb3G9FTyjNc6D5uZrJIg=="],
314
+
315
+ "@smithy/signature-v4/@smithy/core": ["@smithy/core@3.31.1", "", { "dependencies": { "@smithy/types": "4.16.1", "tslib": "2.8.1" } }, "sha512-CyogUINxvi7C7LDsh8Syo6hVJOT9ckz4rG8dRZfTJ8r91HkMY59PnNooaj7WcHyxEkxPfBAmbgztZU+xTo76lg=="],
316
+
317
+ "@smithy/signature-v4/@smithy/types": ["@smithy/types@4.16.1", "", { "dependencies": { "tslib": "2.8.1" } }, "sha512-0JFs3V2y2M9tKW5na/qxe69Zv+uxLMO7QBbhxF/FHu/Gp2NFZAAL9tWl9PU02xxo07pb3G9FTyjNc6D5uZrJIg=="],
318
+
319
+ "gaxios/https-proxy-agent": ["https-proxy-agent@7.0.6", "", { "dependencies": { "agent-base": "7.1.4", "debug": "4.4.3" } }, "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw=="],
320
+
321
+ "p-retry/retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="],
322
+
323
+ "gaxios/https-proxy-agent/agent-base": ["agent-base@7.1.4", "", {}, "sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ=="],
324
+ }
325
+ }
@@ -1,339 +1 @@
1
- {
2
- "glm-5": {
3
- "id": "glm-5",
4
- "name": "GLM-5",
5
- "reasoning": true,
6
- "thinkingLevelMap": {
7
- "off": "off",
8
- "minimal": null,
9
- "low": null,
10
- "medium": null,
11
- "high": null,
12
- "xhigh": null,
13
- "max": "max"
14
- },
15
- "input": [
16
- "text"
17
- ],
18
- "cost": {
19
- "input": 0.86,
20
- "output": 2.752,
21
- "cacheRead": 0.43,
22
- "cacheWrite": 0
23
- },
24
- "contextWindow": 202752,
25
- "maxTokens": 20275,
26
- "compat": {
27
- "supportsStore": false,
28
- "supportsReasoningEffort": false,
29
- "thinkingFormat": "deepseek",
30
- "maxTokensField": "max_tokens"
31
- },
32
- "deprecatedAt": "2026-09-17T02:00:12.965Z"
33
- },
34
- "glm-5.1": {
35
- "id": "glm-5.1",
36
- "name": "GLM-5.1",
37
- "reasoning": true,
38
- "thinkingLevelMap": {
39
- "off": "off",
40
- "minimal": null,
41
- "low": null,
42
- "medium": null,
43
- "high": null,
44
- "xhigh": null,
45
- "max": "max"
46
- },
47
- "input": [
48
- "text"
49
- ],
50
- "cost": {
51
- "input": 1.358,
52
- "output": 4.268,
53
- "cacheRead": 0.679,
54
- "cacheWrite": 0
55
- },
56
- "contextWindow": 202750,
57
- "maxTokens": 3276,
58
- "compat": {
59
- "supportsStore": false,
60
- "supportsReasoningEffort": false,
61
- "thinkingFormat": "deepseek",
62
- "maxTokensField": "max_tokens"
63
- },
64
- "deprecatedAt": "2026-09-17T02:00:12.965Z"
65
- },
66
- "kimi-k2.5": {
67
- "id": "kimi-k2.5",
68
- "name": "Kimi K2.5",
69
- "reasoning": true,
70
- "thinkingLevelMap": {
71
- "off": "off",
72
- "minimal": null,
73
- "low": null,
74
- "medium": null,
75
- "high": null,
76
- "xhigh": null,
77
- "max": "max"
78
- },
79
- "input": [
80
- "text"
81
- ],
82
- "cost": {
83
- "input": 0.5584,
84
- "output": 2.935,
85
- "cacheRead": 0.2792,
86
- "cacheWrite": 0
87
- },
88
- "contextWindow": 262144,
89
- "maxTokens": 26214,
90
- "compat": {
91
- "supportsStore": false,
92
- "supportsReasoningEffort": false,
93
- "thinkingFormat": "deepseek",
94
- "maxTokensField": "max_tokens"
95
- },
96
- "deprecatedAt": "2026-09-17T02:00:12.965Z"
97
- },
98
- "kimi-k2.6": {
99
- "id": "kimi-k2.6",
100
- "name": "Kimi K2.6",
101
- "reasoning": true,
102
- "thinkingLevelMap": {
103
- "off": null,
104
- "minimal": null,
105
- "low": "low",
106
- "medium": "medium",
107
- "high": "high",
108
- "xhigh": null,
109
- "max": null
110
- },
111
- "input": [
112
- "text",
113
- "image"
114
- ],
115
- "cost": {
116
- "input": 1.03436,
117
- "output": 4.3552,
118
- "cacheRead": 0.174208,
119
- "cacheWrite": 0
120
- },
121
- "contextWindow": 262000,
122
- "maxTokens": 26214,
123
- "compat": {
124
- "supportsStore": false,
125
- "supportsReasoningEffort": true,
126
- "thinkingFormat": "deepseek",
127
- "maxTokensField": "max_tokens"
128
- },
129
- "deprecatedAt": "2026-09-17T02:00:12.965Z"
130
- },
131
- "llama-3.3-70b-instruct": {
132
- "id": "llama-3.3-70b-instruct",
133
- "name": "Llama 3.3 70B Instruct",
134
- "reasoning": true,
135
- "thinkingLevelMap": {
136
- "off": "off",
137
- "minimal": null,
138
- "low": null,
139
- "medium": null,
140
- "high": null,
141
- "xhigh": null,
142
- "max": "max"
143
- },
144
- "input": [
145
- "text"
146
- ],
147
- "cost": {
148
- "input": 0.6066,
149
- "output": 1.0386,
150
- "cacheRead": 0.3033,
151
- "cacheWrite": 0
152
- },
153
- "contextWindow": 128000,
154
- "maxTokens": 12800,
155
- "compat": {
156
- "supportsStore": false,
157
- "supportsReasoningEffort": false,
158
- "thinkingFormat": "deepseek",
159
- "maxTokensField": "max_tokens"
160
- },
161
- "deprecatedAt": "2026-09-17T02:00:12.965Z"
162
- },
163
- "llama-4-maverick-17b-128e-instruct-fp8": {
164
- "id": "llama-4-maverick-17b-128e-instruct-fp8",
165
- "name": "Llama 4 Maverick 17B 128E Instruct FP8",
166
- "reasoning": true,
167
- "thinkingLevelMap": {
168
- "off": "off",
169
- "minimal": null,
170
- "low": null,
171
- "medium": null,
172
- "high": null,
173
- "xhigh": null,
174
- "max": "max"
175
- },
176
- "input": [
177
- "text"
178
- ],
179
- "cost": {
180
- "input": 0.25188,
181
- "output": 0.82563,
182
- "cacheRead": 0.12594,
183
- "cacheWrite": 0
184
- },
185
- "contextWindow": 430000,
186
- "maxTokens": 43000,
187
- "compat": {
188
- "supportsStore": false,
189
- "supportsReasoningEffort": false,
190
- "thinkingFormat": "deepseek",
191
- "maxTokensField": "max_tokens"
192
- },
193
- "deprecatedAt": "2026-09-17T02:00:12.965Z"
194
- },
195
- "qwen3-coder-480b-a35b-instruct-int4-mixed-ar": {
196
- "id": "qwen3-coder-480b-a35b-instruct-int4-mixed-ar",
197
- "name": "Qwen3 Coder 480B A35B Instruct INT4 Mixed AR",
198
- "reasoning": false,
199
- "input": [
200
- "text"
201
- ],
202
- "cost": {
203
- "input": 0.445,
204
- "output": 2.145,
205
- "cacheRead": 0.2225,
206
- "cacheWrite": 0
207
- },
208
- "contextWindow": 106000,
209
- "maxTokens": 10600,
210
- "compat": {
211
- "supportsStore": false,
212
- "supportsReasoningEffort": false,
213
- "thinkingFormat": "deepseek",
214
- "maxTokensField": "max_tokens"
215
- },
216
- "deprecatedAt": "2026-09-17T02:00:12.965Z"
217
- },
218
- "qwen3-next-80b-a3b-instruct": {
219
- "id": "qwen3-next-80b-a3b-instruct",
220
- "name": "Qwen3 Next 80B A3B Instruct",
221
- "reasoning": false,
222
- "input": [
223
- "text"
224
- ],
225
- "cost": {
226
- "input": 0.1175,
227
- "output": 1.136,
228
- "cacheRead": 0.05875,
229
- "cacheWrite": 0
230
- },
231
- "contextWindow": 262144,
232
- "maxTokens": 26214,
233
- "compat": {
234
- "supportsStore": false,
235
- "supportsReasoningEffort": false,
236
- "thinkingFormat": "deepseek",
237
- "maxTokensField": "max_tokens"
238
- },
239
- "deprecatedAt": "2026-09-17T02:00:12.965Z"
240
- },
241
- "qwen3.6-flash": {
242
- "id": "qwen3.6-flash",
243
- "name": "Qwen3.6-Flash",
244
- "reasoning": true,
245
- "thinkingLevelMap": {
246
- "off": "none",
247
- "minimal": "minimal",
248
- "low": "low",
249
- "medium": "medium",
250
- "high": "high",
251
- "xhigh": null,
252
- "max": null
253
- },
254
- "input": [
255
- "text",
256
- "image"
257
- ],
258
- "cost": {
259
- "input": 1,
260
- "output": 4,
261
- "cacheRead": 0.1,
262
- "cacheWrite": 1.25
263
- },
264
- "contextWindow": 1000000,
265
- "maxTokens": 64000,
266
- "compat": {
267
- "supportsStore": false,
268
- "supportsReasoningEffort": true,
269
- "thinkingFormat": "deepseek",
270
- "maxTokensField": "max_tokens"
271
- },
272
- "deprecatedAt": "2026-09-17T02:00:12.965Z"
273
- },
274
- "qwen3.6-max": {
275
- "id": "qwen3.6-max",
276
- "name": "Qwen3.6-Max",
277
- "reasoning": true,
278
- "thinkingLevelMap": {
279
- "off": "none",
280
- "minimal": "minimal",
281
- "low": "low",
282
- "medium": "medium",
283
- "high": "high",
284
- "xhigh": null,
285
- "max": null
286
- },
287
- "input": [
288
- "text"
289
- ],
290
- "cost": {
291
- "input": 2,
292
- "output": 12,
293
- "cacheRead": 0.2,
294
- "cacheWrite": 2.5
295
- },
296
- "contextWindow": 256000,
297
- "maxTokens": 64000,
298
- "compat": {
299
- "supportsStore": false,
300
- "supportsReasoningEffort": true,
301
- "thinkingFormat": "deepseek",
302
- "maxTokensField": "max_tokens"
303
- },
304
- "deprecatedAt": "2026-09-17T02:00:12.965Z"
305
- },
306
- "qwen3.6-plus": {
307
- "id": "qwen3.6-plus",
308
- "name": "Qwen3.6-Plus",
309
- "reasoning": true,
310
- "thinkingLevelMap": {
311
- "off": "none",
312
- "minimal": "minimal",
313
- "low": "low",
314
- "medium": "medium",
315
- "high": "high",
316
- "xhigh": null,
317
- "max": null
318
- },
319
- "input": [
320
- "text",
321
- "image"
322
- ],
323
- "cost": {
324
- "input": 2,
325
- "output": 6,
326
- "cacheRead": 0.2,
327
- "cacheWrite": 2.5
328
- },
329
- "contextWindow": 1000000,
330
- "maxTokens": 64000,
331
- "compat": {
332
- "supportsStore": false,
333
- "supportsReasoningEffort": true,
334
- "thinkingFormat": "deepseek",
335
- "maxTokensField": "max_tokens"
336
- },
337
- "deprecatedAt": "2026-09-17T02:00:12.965Z"
338
- }
339
- }
1
+ {}
package/models.json CHANGED
@@ -141,13 +141,13 @@
141
141
  "image"
142
142
  ],
143
143
  "cost": {
144
- "input": 0.3,
145
- "output": 1.2,
144
+ "input": 0.33,
145
+ "output": 1.31,
146
146
  "cacheRead": 0.03,
147
147
  "cacheWrite": 0
148
148
  },
149
149
  "contextWindow": 1048576,
150
- "maxTokens": 32768,
150
+ "maxTokens": 262144,
151
151
  "compat": {
152
152
  "supportsStore": false,
153
153
  "supportsReasoningEffort": true,
package/package.json CHANGED
@@ -1,18 +1,9 @@
1
1
  {
2
2
  "name": "pi-hypercharm-provider",
3
- "version": "1.3.35",
3
+ "version": "1.3.37",
4
4
  "description": "HyperCharm provider extension for pi - Access DeepSeek, GLM, Kimi, Qwen, MiniMax, Gemma, and GPT-OSS models through the Charm Hyper API",
5
5
  "type": "module",
6
6
  "main": "index.ts",
7
- "scripts": {
8
- "clean": "echo 'nothing to clean'",
9
- "build": "echo 'nothing to build'",
10
- "check": "tsc --noEmit && npm run smoke && npm test",
11
- "smoke": "node tests/status.smoke.ts",
12
- "test": "node --import jiti/register --test tests/identity.test.ts tests/prism.test.ts tests/notify.test.ts tests/provider.integration.test.ts",
13
- "update-models": "node scripts/update-models.js",
14
- "test:pi": "node scripts/test-pi-compat.mjs"
15
- },
16
7
  "keywords": [
17
8
  "pi",
18
9
  "extension",
@@ -36,9 +27,9 @@
36
27
  "@earendil-works/pi-coding-agent": "*"
37
28
  },
38
29
  "devDependencies": {
39
- "@earendil-works/pi-ai": "0.99.0",
40
- "@earendil-works/pi-coding-agent": "0.99.0",
41
- "@earendil-works/pi-tui": "0.99.0",
30
+ "@earendil-works/pi-ai": "1.0.0",
31
+ "@earendil-works/pi-coding-agent": "1.0.0",
32
+ "@earendil-works/pi-tui": "1.0.0",
42
33
  "@types/node": "^24.10.1",
43
34
  "jiti": "2.7.0",
44
35
  "typescript": "6.0.3"
@@ -49,5 +40,14 @@
49
40
  "extensions": [
50
41
  "./index.ts"
51
42
  ]
43
+ },
44
+ "scripts": {
45
+ "clean": "echo 'nothing to clean'",
46
+ "build": "echo 'nothing to build'",
47
+ "check": "tsc --noEmit && npm run smoke && npm test",
48
+ "smoke": "node tests/status.smoke.ts",
49
+ "test": "node --import jiti/register --test tests/identity.test.ts tests/prism.test.ts tests/notify.test.ts tests/provider.integration.test.ts",
50
+ "update-models": "node scripts/update-models.js",
51
+ "test:pi": "node scripts/test-pi-compat.mjs"
52
52
  }
53
- }
53
+ }
@@ -1,23 +1,30 @@
1
+ // Offline Pi 1.0 manifest, lifecycle, catalog and real transport regression.
1
2
  import assert from 'node:assert/strict';
2
3
  import { mkdtemp, readFile, rm } from 'node:fs/promises';
3
4
  import { tmpdir } from 'node:os';
4
5
  import { dirname, join, resolve } from 'node:path';
5
- import { fileURLToPath } from 'node:url';
6
+ import { fileURLToPath, pathToFileURL } from 'node:url';
6
7
 
7
8
  const root = resolve(dirname(fileURLToPath(import.meta.url)), '..');
8
- const home = await mkdtemp(join(tmpdir(), 'pi-extension-compat-'));
9
+ const home = await mkdtemp(join(tmpdir(), 'pi-provider-compat-'));
9
10
  const previousHome = process.env.PI_CODING_AGENT_DIR;
10
11
  const previousFetch = globalThis.fetch;
11
12
  process.env.PI_CODING_AGENT_DIR = home;
13
+ // Never allow a background catalog/account request to reach a real endpoint.
12
14
  globalThis.fetch = async () => new Response('', { status: 503 });
13
15
  let session;
14
16
  try {
15
- const { createAgentSession, DefaultResourceLoader, ModelRuntime, SessionManager, SettingsManager, VERSION } = await import('@earendil-works/pi-coding-agent');
16
- assert.equal(VERSION, '0.99.0', 'test the actual pinned Pi host, not a stale override');
17
+ const host = process.env.PI1_HOST_PACKAGE;
18
+ const hostEntry = process.env.PI1_HOST_ENTRY === 'bundle' ? 'dist/bundle/index.js' : 'dist/index.js';
19
+ const sdk = await import(host ? pathToFileURL(join(host, hostEntry)).href : '@earendil-works/pi-coding-agent');
20
+ const { createAgentSession, DefaultResourceLoader, ModelRuntime, SessionManager, SettingsManager, VERSION } = sdk;
21
+ assert.equal(VERSION, '1.0.0', 'executing host version');
22
+ assert.equal((await import('@earendil-works/pi-coding-agent')).VERSION, '1.0.0', 'development host version');
17
23
  const manifest = JSON.parse(await readFile(join(root, 'package.json'), 'utf8'));
18
24
  for (const name of ['@earendil-works/pi-ai', '@earendil-works/pi-agent-core', '@earendil-works/pi-coding-agent', '@earendil-works/pi-tui', 'typebox']) {
19
- assert.equal(manifest.dependencies?.[name], undefined, `${name}: host packages must not be runtime dependencies`);
25
+ assert.equal(manifest.dependencies?.[name], undefined, `${name}: do not bundle host packages`);
20
26
  if (manifest.peerDependencies?.[name] !== undefined) assert.equal(manifest.peerDependencies[name], '*');
27
+ if (name !== 'typebox' && manifest.devDependencies?.[name]) assert.equal(manifest.devDependencies[name], '1.0.0');
21
28
  }
22
29
  const settingsManager = SettingsManager.inMemory({ packages: [root], compaction: { enabled: false }, retry: { enabled: false } });
23
30
  const resourceLoader = new DefaultResourceLoader({ cwd: home, agentDir: home, settingsManager,
@@ -26,25 +33,83 @@ try {
26
33
  const loaded = resourceLoader.getExtensions();
27
34
  assert.deepEqual(loaded.errors, []);
28
35
  assert.deepEqual(loaded.warnings ?? [], []);
29
- assert.ok(loaded.extensions.length > 0, 'manifest entrypoints must load');
36
+ assert.equal(loaded.extensions.length, manifest.pi.extensions.length, 'all manifest entrypoints load');
37
+ // Endpoint/header-only re-registration (e.g. MCR) retains the prior catalog.
38
+ const registrations = [...loaded.runtime.pendingProviderRegistrations.reduce((byName, { name, config }) =>
39
+ byName.set(name, { name, config: { ...byName.get(name)?.config, ...config } }), new Map()).values()];
40
+ assert(registrations.length > 0, 'providers register before session startup');
30
41
  const modelRuntime = await ModelRuntime.create({ authPath: join(home, 'auth.json'), modelsPath: null, modelsStorePath: join(home, 'models-cache'), allowModelNetwork: false });
31
42
  ({ session } = await createAgentSession({ cwd: home, agentDir: home, resourceLoader, modelRuntime, settingsManager, sessionManager: SessionManager.inMemory(home) }));
32
- const names = new Set();
33
- for (const extension of loaded.extensions) {
34
- for (const [name, { definition }] of extension.tools) {
35
- assert.equal(definition.name, name);
36
- assert.equal(typeof definition.execute, 'function');
37
- assert.equal(typeof definition.parameters, 'object');
38
- assert.ok(!names.has(name), `duplicate tool ${name}`);
39
- names.add(name);
40
- assert.ok(session.getAllTools().some(tool => tool.name === name), `${name}: tool must be installed in the real session`);
43
+ const errors = [];
44
+ await session.bindExtensions({ mode: 'print', onError: error => errors.push(error) });
45
+ await new Promise(done => setImmediate(done));
46
+ const tools = new Set();
47
+ for (const extension of loaded.extensions) for (const [name, { definition }] of extension.tools) {
48
+ assert.equal(definition.name, name); assert.equal(typeof definition.execute, 'function');
49
+ assert.equal(typeof definition.parameters, 'object'); assert(!tools.has(name)); tools.add(name);
50
+ assert(session.getAllTools().some(tool => tool.name === name));
51
+ }
52
+ let modelCount = 0, streamChecks = 0;
53
+ for (const { name, config } of registrations) {
54
+ const models = modelRuntime.getAllModels(name);
55
+ assert.equal(models.length, config.models.length, `${name}: catalog survives registration`);
56
+ assert(models.length > 0);
57
+ assert.equal(new Set(models.map(m => `${m.type}/${m.id}`)).size, models.length);
58
+ for (const model of models) {
59
+ assert.equal(model.provider, name); assert(model.api && model.baseUrl && model.id && model.name);
60
+ if (model.type === 'image') assert(model.output.includes('image'));
61
+ else assert(model.contextWindow > 0);
62
+ if ((model.type ?? 'chat') === 'chat') assert(model.maxTokens > 0);
63
+ assert(model.input.includes('text'));
64
+ for (const cost of Object.values(model.cost)) assert(Number.isFinite(cost) && cost >= 0);
65
+ }
66
+ const chatModels = modelRuntime.getModels(name);
67
+ const model = chatModels.find(m => m.api === 'openai-completions') ?? chatModels[0];
68
+ assert(model, 'a chat model is available for offline transport checks');
69
+ const user = { role: 'user', content: 'hello', timestamp: 1 };
70
+ async function probe(tool = false, empty = false) {
71
+ let payloadCalls = 0, responseCalls = 0, observed = 0, wire;
72
+ const fetch = async (_url, init) => {
73
+ wire = JSON.parse(init.body);
74
+ const delta = tool ? { tool_calls: [{ index: 0, id: 'call_probe', type: 'function', function: { name: 'probe', arguments: '{"value":7}' } }] } : { content: empty ? '' : 'Hello 界' };
75
+ const chunks = [{ id: 'offline', choices: [{ index: 0, delta: { role: 'assistant', ...delta }, finish_reason: null }] }, { id: 'offline', choices: [{ index: 0, delta: {}, finish_reason: tool ? 'tool_calls' : 'stop' }], usage: { prompt_tokens: 10, completion_tokens: 2, total_tokens: 12 } }];
76
+ return new Response(chunks.map(c => `data: ${JSON.stringify(c)}\n\n`).join('') + 'data: [DONE]\n\n', { headers: { 'content-type': 'text/event-stream' } });
77
+ };
78
+ const stream = modelRuntime.streamSimple(model, { messages: [{ role: 'system', content: 'Offline probe', toolsAdded: [{ name: 'probe', description: 'Probe', parameters: { type: 'object', properties: { value: { type: 'integer' } }, required: ['value'] } }], timestamp: 0 }, user] }, {
79
+ apiKey: 'offline-placeholder', maxTokens: 32, maxRetries: 0, fetch,
80
+ onPayload: p => { payloadCalls++; return { ...p, temperature: 0.123 }; },
81
+ onResponse: () => { responseCalls++; }, onProviderStreamEvent: () => { observed++; },
82
+ });
83
+ const events = []; for await (const event of stream) events.push(event.type);
84
+ const result = await stream.result();
85
+ assert.equal(result.stopReason, tool ? 'toolUse' : 'stop', result.errorMessage);
86
+ assert.equal(events.filter(e => e === 'start').length, 1);
87
+ assert.equal(events.filter(e => e === 'done' || e === 'error').length, 1);
88
+ assert.equal(events.at(-1), 'done');
89
+ assert.equal(payloadCalls, 1); assert.equal(responseCalls, 1); assert(observed >= 2);
90
+ assert.equal(wire.temperature, 0.123); assert.equal(wire.tools[0].function.name, 'probe');
91
+ assert.equal(result.usage.totalTokens, 12);
92
+ if (tool) assert.deepEqual(result.content.find(c => c.type === 'toolCall').arguments, { value: 7 });
93
+ else if (!empty) assert.equal(result.content.find(c => c.type === 'text').text, 'Hello 界');
94
+ streamChecks++;
41
95
  }
96
+ await probe(); await probe(true); await probe(false, true);
97
+ // Abort after preflight: the SDK's lazy preflight reports an already-aborted
98
+ // auth operation as an error; this checks provider transport cancellation.
99
+ const controller = new AbortController();
100
+ const aborted = await modelRuntime.streamSimple(model, { messages: [user] }, {
101
+ apiKey: 'offline-placeholder', signal: controller.signal, maxRetries: 0,
102
+ onPayload: () => { controller.abort(); },
103
+ fetch: async () => { throw new DOMException('Aborted', 'AbortError'); },
104
+ }).result();
105
+ assert.equal(aborted.stopReason, 'aborted', aborted.errorMessage); streamChecks++;
106
+ modelCount += models.length;
42
107
  }
43
- console.log(`${manifest.name}: Pi ${VERSION} warning-free manifest load; ${loaded.extensions.length} extensions, ${names.size} tools registered`);
108
+ await session.extensionRunner.emit({ type: 'session_shutdown', reason: 'quit' });
109
+ assert.deepEqual(errors, []);
110
+ console.log(JSON.stringify({ repo: manifest.name, pi: VERSION, hostEntry, extensions: loaded.extensions.length, tools: tools.size, models: modelCount, streamChecks, lifecycle: 'passed' }));
44
111
  } finally {
45
- session?.dispose();
46
- globalThis.fetch = previousFetch;
47
- if (previousHome === undefined) delete process.env.PI_CODING_AGENT_DIR;
48
- else process.env.PI_CODING_AGENT_DIR = previousHome;
112
+ session?.dispose(); globalThis.fetch = previousFetch;
113
+ if (previousHome === undefined) delete process.env.PI_CODING_AGENT_DIR; else process.env.PI_CODING_AGENT_DIR = previousHome;
49
114
  await rm(home, { recursive: true, force: true });
50
115
  }
@@ -144,7 +144,12 @@ async function load(options = {}) {
144
144
  noThemes: true,
145
145
  noContextFiles: true,
146
146
  });
147
- await loader.reload();
147
+ // Pin only catalog loading, not timeout clocks or subsequent provider work.
148
+ const now = Date.now;
149
+ try {
150
+ if (options.catalogNow !== undefined) Date.now = () => options.catalogNow;
151
+ await loader.reload();
152
+ } finally { Date.now = now; }
148
153
  assert.deepEqual(loader.getExtensions().errors, [], "extension must load without errors");
149
154
 
150
155
  const sessionManager = options.sessionFile
@@ -163,7 +168,10 @@ async function load(options = {}) {
163
168
  // the extension session path is part of what this suite verifies.
164
169
  const runner = session.extensionRunner;
165
170
  await runner.emit({ type: "session_start", reason: "startup" });
166
- return { credentials, runtime, loader, session, sessionManager, runner };
171
+ return { credentials, runtime, loader, session, sessionManager, runner, async shutdown() {
172
+ try { await runner.emit({ type: "session_shutdown", reason: "quit" }); }
173
+ finally { session.dispose(); }
174
+ } };
167
175
  }
168
176
 
169
177
  function assistantMessage(overrides = {}) {
@@ -191,7 +199,9 @@ test("loads offline: embedded catalog, deprecated grace, namespaced registration
191
199
  const stderr = captureStderr();
192
200
  let harness;
193
201
  try {
194
- harness = await load();
202
+ const graveyard = Object.values(JSON.parse(readFileSync(deprecatedModelsPath, "utf8")));
203
+ const graceNow = Math.max(...graveyard.map(entry => Date.parse(entry.deprecatedAt))) + 24 * 60 * 60 * 1000;
204
+ harness = await load({ catalogNow: graceNow });
195
205
 
196
206
  const embedded = harness.runtime.getModel("hypercharm", "deepseek-v4-flash");
197
207
  assert.ok(embedded, "embedded catalog must register without any network");
@@ -210,8 +220,8 @@ test("loads offline: embedded catalog, deprecated grace, namespaced registration
210
220
  ).map((model) => model.id),
211
221
  );
212
222
  const deprecatedOnly = Object.values(deprecated).filter((entry) => !embeddedIds.has(entry.id));
213
- const fresh = deprecatedOnly.filter((entry) => Date.now() - Date.parse(entry.deprecatedAt) <= DEPRECATED_TTL_MS);
214
- const stale = deprecatedOnly.filter((entry) => Date.now() - Date.parse(entry.deprecatedAt) > DEPRECATED_TTL_MS);
223
+ const fresh = deprecatedOnly.filter((entry) => graceNow - Date.parse(entry.deprecatedAt) <= DEPRECATED_TTL_MS);
224
+ const stale = deprecatedOnly.filter((entry) => graceNow - Date.parse(entry.deprecatedAt) > DEPRECATED_TTL_MS);
215
225
  assert.ok(fresh.length > 0, "expected at least one model inside the deprecated grace window");
216
226
  for (const entry of fresh) {
217
227
  assert.ok(harness.runtime.getModel("hypercharm", entry.id), entry.id + " must be served during its grace period");
@@ -235,7 +245,7 @@ test("loads offline: embedded catalog, deprecated grace, namespaced registration
235
245
  assert.match(warning, /network disabled/);
236
246
  } finally {
237
247
  stderr.restore();
238
- harness?.session.dispose();
248
+ await harness?.shutdown();
239
249
  }
240
250
  });
241
251
 
@@ -268,7 +278,7 @@ test("refreshes from /v1/provider, caches the catalog, and retains it when refre
268
278
  assert.ok(Array.isArray(cached), "catalog cache written as an array");
269
279
  assert.ok(cached.some((entry) => entry.id === "fixture-model"), "cache holds the refreshed catalog");
270
280
  } finally {
271
- first.session.dispose();
281
+ await first.shutdown();
272
282
  }
273
283
 
274
284
  // A later session keeps serving the cached catalog even though Hyper is down.
@@ -280,7 +290,7 @@ test("refreshes from /v1/provider, caches the catalog, and retains it when refre
280
290
  assert.match(warning, /model catalog/);
281
291
  } finally {
282
292
  stderr.restore();
283
- second.session.dispose();
293
+ await second.shutdown();
284
294
  }
285
295
  });
286
296
 
@@ -368,7 +378,7 @@ test("records prism routing as durable session entries", async () => {
368
378
  // renderer registration both survive.
369
379
  const sessionFile = sessionManager.getSessionFile();
370
380
  assert.ok(sessionFile);
371
- harness.session.dispose();
381
+ await harness.shutdown();
372
382
  disposed = true;
373
383
 
374
384
  const restored = await load({ sessionFile });
@@ -389,10 +399,10 @@ test("records prism routing as durable session entries", async () => {
389
399
  assert.ok(restoredComponent);
390
400
  assert.ok(restoredComponent.render(80).join("\n").includes("Prism \u2192 GLM 5.3 Flash"));
391
401
  } finally {
392
- restored.session.dispose();
402
+ await restored.shutdown();
393
403
  }
394
404
  } finally {
395
- if (!disposed) harness.session.dispose();
405
+ if (!disposed) await harness.shutdown();
396
406
  }
397
407
  });
398
408
 
@@ -428,7 +438,7 @@ test("co-installs with the official identifier surface without interference", as
428
438
  }
429
439
  assert.equal(ui.statusKeys.includes("hyper") && ownKeys.includes("hyper"), false);
430
440
  } finally {
431
- harness.session.dispose();
441
+ await harness.shutdown();
432
442
  }
433
443
  });
434
444
 
@@ -480,6 +490,6 @@ test("shows the footer widget on model selection and clears it when the provider
480
490
  "no reinstall while another provider's model is active",
481
491
  );
482
492
  } finally {
483
- harness.session.dispose();
493
+ await harness.shutdown();
484
494
  }
485
495
  });