@code-yeongyu/senpi 2026.9.6 → 2026.9.7

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.
Files changed (67) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/core/agent-session.d.ts +12 -2
  3. package/dist/core/agent-session.d.ts.map +1 -1
  4. package/dist/core/agent-session.js +50 -26
  5. package/dist/core/agent-session.js.map +1 -1
  6. package/dist/core/compaction/stuck-overflow.d.ts +11 -0
  7. package/dist/core/compaction/stuck-overflow.d.ts.map +1 -0
  8. package/dist/core/compaction/stuck-overflow.js +17 -0
  9. package/dist/core/compaction/stuck-overflow.js.map +1 -0
  10. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts +1 -0
  11. package/dist/core/extensions/builtin/goal/continuation-recovery.d.ts.map +1 -1
  12. package/dist/core/extensions/builtin/goal/continuation-recovery.js +2 -0
  13. package/dist/core/extensions/builtin/goal/continuation-recovery.js.map +1 -1
  14. package/dist/core/extensions/builtin/goal/continuation.d.ts +3 -1
  15. package/dist/core/extensions/builtin/goal/continuation.d.ts.map +1 -1
  16. package/dist/core/extensions/builtin/goal/continuation.js +4 -0
  17. package/dist/core/extensions/builtin/goal/continuation.js.map +1 -1
  18. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts +3 -0
  19. package/dist/core/extensions/builtin/goal/lifecycle-helpers.d.ts.map +1 -1
  20. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js +14 -3
  21. package/dist/core/extensions/builtin/goal/lifecycle-helpers.js.map +1 -1
  22. package/dist/core/extensions/builtin/goal/monitor-continuation.d.ts.map +1 -1
  23. package/dist/core/extensions/builtin/goal/monitor-continuation.js +2 -1
  24. package/dist/core/extensions/builtin/goal/monitor-continuation.js.map +1 -1
  25. package/dist/core/extensions/builtin/permission-system/external-dir.d.ts.map +1 -1
  26. package/dist/core/extensions/builtin/permission-system/external-dir.js +42 -13
  27. package/dist/core/extensions/builtin/permission-system/external-dir.js.map +1 -1
  28. package/dist/core/package-identity.d.ts +12 -0
  29. package/dist/core/package-identity.d.ts.map +1 -0
  30. package/dist/core/package-identity.js +57 -0
  31. package/dist/core/package-identity.js.map +1 -0
  32. package/dist/core/resource-loader.d.ts +0 -2
  33. package/dist/core/resource-loader.d.ts.map +1 -1
  34. package/dist/core/resource-loader.js +8 -60
  35. package/dist/core/resource-loader.js.map +1 -1
  36. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  37. package/dist/modes/interactive/interactive-mode.js +1 -0
  38. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  39. package/docs/compaction-guide.md +2 -2
  40. package/docs/compaction.md +2 -2
  41. package/docs/rpc.md +1 -1
  42. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +12 -0
  43. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  44. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/jl/kernel.ts +2 -2
  45. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker.ts +2 -2
  46. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/worker-startup.ts +2 -2
  47. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +2 -2
  48. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/rb/kernel.ts +2 -2
  49. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/shared/runtime-asset.ts +40 -14
  50. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  51. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  52. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  53. package/node_modules/@earendil-works/pi-ai/dist/providers/data/azure-openai-responses.json +1 -1
  54. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  55. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  56. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
  57. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  58. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  59. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  60. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opengateway.json +1 -1
  61. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  62. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  63. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  64. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  65. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  66. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  67. package/package.json +7 -7
@@ -136,7 +136,7 @@ Configure compaction in `~/.senpi/agent/settings.json` (global) or `.senpi/setti
136
136
 
137
137
  | Setting | Default | Description |
138
138
  |---------|---------|-------------|
139
- | `compaction.enabled` | `true` | Enable auto-compaction. Set to `false` for manual control only. |
139
+ | `compaction.enabled` | `true` | Enable proactive auto-compaction. `false` leaves threshold compaction to you; a provider-rejected context overflow still runs the one-shot compact-and-retry recovery. |
140
140
  | `compaction.reserveTokens` | `16384` | Tokens reserved for the LLM's response. Lower values allow more context but risk truncation. |
141
141
  | `compaction.keepRecentTokens` | `20000` | How much recent conversation to keep uncompressed. Higher values preserve more context but trigger compaction sooner. |
142
142
 
@@ -221,7 +221,7 @@ For technical details, see:
221
221
 
222
222
  ### "I want to disable auto-compaction"
223
223
 
224
- Set `compaction.enabled: false` in your settings. Use `/compact` manually when you want to compact. Be aware that without auto-compaction, long sessions may hit context limits and fail.
224
+ Set `compaction.enabled: false` in your settings. Use `/compact` manually when you want to compact. Threshold compaction stays off, but a context the provider rejects as too large is still compacted once and retried so the session does not stall. The RPC `set_auto_compaction` command and OmO Desktop's per-thread toggle change only that session; they do not write this setting.
225
225
 
226
226
  ### "How do I see what was compacted?"
227
227
 
@@ -411,8 +411,8 @@ Configure compaction in `~/.senpi/agent/settings.json` or `<project-dir>/.senpi/
411
411
 
412
412
  | Setting | Default | Description |
413
413
  |---------|---------|-------------|
414
- | `enabled` | `true` | Enable auto-compaction |
414
+ | `enabled` | `true` | Enable proactive (threshold) auto-compaction; provider-overflow recovery stays armed |
415
415
  | `reserveTokens` | `16384` | Tokens to reserve for LLM response |
416
416
  | `keepRecentTokens` | `20000` | Recent tokens to keep (not summarized) |
417
417
 
418
- Disable auto-compaction with `"enabled": false`. You can still compact manually with `/compact`.
418
+ Disable proactive auto-compaction with `"enabled": false`. You can still compact manually with `/compact`, and a context the provider rejects as too large is still compacted once and retried automatically.
package/docs/rpc.md CHANGED
@@ -795,7 +795,7 @@ Response:
795
795
 
796
796
  #### set_auto_compaction
797
797
 
798
- Enable or disable automatic compaction when context is nearly full.
798
+ Enable or disable automatic compaction when context is nearly full for this session only. The persisted `compaction.enabled` setting is left untouched, and `get_state` reports the effective value. Disabling it stops proactive threshold compaction; a provider-rejected context overflow still triggers the one-shot compact-and-retry recovery.
799
799
 
800
800
  ```json
801
801
  {"type": "set_auto_compaction", "enabled": true}
@@ -12,6 +12,18 @@
12
12
 
13
13
  ### Removed
14
14
 
15
+ ## [2026.9.7] - 2026-09-07
16
+
17
+ ### Breaking Changes
18
+
19
+ ### Added
20
+
21
+ ### Changed
22
+
23
+ ### Fixed
24
+
25
+ ### Removed
26
+
15
27
  ## [2026.9.6] - 2026-09-06
16
28
 
17
29
  ### Breaking Changes
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@code-yeongyu/senpi-codemode",
3
- "version": "2026.9.6",
3
+ "version": "2026.9.7",
4
4
  "private": true,
5
5
  "description": "Source-only senpi extension package for codemode evaluation tools",
6
6
  "type": "module",
@@ -31,14 +31,14 @@
31
31
  },
32
32
  "dependencies": {
33
33
  "@babel/parser": "8.0.4",
34
- "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.9.6",
34
+ "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.9.7",
35
35
  "typebox": "1.3.18"
36
36
  },
37
37
  "peerDependencies": {
38
- "@code-yeongyu/senpi": "2026.9.6"
38
+ "@code-yeongyu/senpi": "2026.9.7"
39
39
  },
40
40
  "devDependencies": {
41
- "@code-yeongyu/senpi": "2026.9.6"
41
+ "@code-yeongyu/senpi": "2026.9.7"
42
42
  },
43
43
  "keywords": [
44
44
  "senpi",
@@ -1,6 +1,6 @@
1
1
  import { join } from "node:path";
2
2
  import type { BridgeConnectionConfig, KernelToHostMessage } from "../../bridge/protocol.ts";
3
- import { type CodemodeRuntimeAssetEnvironment, resolveCodemodeRuntimeAsset } from "../shared/runtime-asset.ts";
3
+ import { type CodemodeRuntimeAssetEnvironment, requireCodemodeRuntimeAsset } from "../shared/runtime-asset.ts";
4
4
  import { SubprocessKernel, type SubprocessSpawn } from "../shared/subprocess-kernel.ts";
5
5
 
6
6
  export interface JuliaKernelStartOptions {
@@ -17,7 +17,7 @@ export interface JuliaRunnerPathOptions extends CodemodeRuntimeAssetEnvironment
17
17
  }
18
18
 
19
19
  export function resolveJuliaRunnerPath(options: JuliaRunnerPathOptions = {}): string {
20
- return resolveCodemodeRuntimeAsset(
20
+ return requireCodemodeRuntimeAsset(
21
21
  options.localPath ?? join(import.meta.dirname, "runner.jl"),
22
22
  join("kernels", "jl", "runner.jl"),
23
23
  options,
@@ -1,7 +1,7 @@
1
1
  import { dirname, join } from "node:path";
2
2
  import { fileURLToPath, pathToFileURL } from "node:url";
3
3
  import type { HostToKernelMessage, KernelToHostMessage } from "../../bridge/protocol.ts";
4
- import { type CodemodeRuntimeAssetEnvironment, resolveCodemodeRuntimeAsset } from "../shared/runtime-asset.ts";
4
+ import { type CodemodeRuntimeAssetEnvironment, requireCodemodeRuntimeAsset } from "../shared/runtime-asset.ts";
5
5
  import type { JavaScriptKernelMode } from "./kernel-contract.ts";
6
6
  import { spawnNodeWorker } from "./worker-host.ts";
7
7
 
@@ -12,7 +12,7 @@ export interface JavaScriptInlineWorkerEntryUrlOptions extends CodemodeRuntimeAs
12
12
  export function resolveInlineWorkerEntryUrl(options: JavaScriptInlineWorkerEntryUrlOptions = {}): URL {
13
13
  const localPath = options.localPath ?? join(dirname(fileURLToPath(import.meta.url)), "inline-worker-entry.js");
14
14
  return pathToFileURL(
15
- resolveCodemodeRuntimeAsset(localPath, join("kernels", "js", "inline-worker-entry.js"), options),
15
+ requireCodemodeRuntimeAsset(localPath, join("kernels", "js", "inline-worker-entry.js"), options),
16
16
  );
17
17
  }
18
18
 
@@ -1,6 +1,6 @@
1
1
  import { dirname, join } from "node:path";
2
2
  import { fileURLToPath, pathToFileURL } from "node:url";
3
- import { type CodemodeRuntimeAssetEnvironment, resolveCodemodeRuntimeAsset } from "../shared/runtime-asset.ts";
3
+ import { type CodemodeRuntimeAssetEnvironment, requireCodemodeRuntimeAsset } from "../shared/runtime-asset.ts";
4
4
  import { createInlineWorker, type WorkerLike } from "./inline-worker.ts";
5
5
  import { type JavaScriptKernelOptions, localBridgeConnection } from "./local-module-loader.ts";
6
6
  import { spawnNodeWorker, WorkerStartupCancelledError, waitForReady } from "./worker-host.ts";
@@ -11,7 +11,7 @@ export interface JavaScriptWorkerEntryUrlOptions extends CodemodeRuntimeAssetEnv
11
11
 
12
12
  export function resolveJsWorkerEntryUrl(options: JavaScriptWorkerEntryUrlOptions = {}): URL {
13
13
  const localPath = options.localPath ?? join(dirname(fileURLToPath(import.meta.url)), "worker-entry.js");
14
- return pathToFileURL(resolveCodemodeRuntimeAsset(localPath, join("kernels", "js", "worker-entry.js"), options));
14
+ return pathToFileURL(requireCodemodeRuntimeAsset(localPath, join("kernels", "js", "worker-entry.js"), options));
15
15
  }
16
16
 
17
17
  export interface WorkerStartupHooks {
@@ -8,7 +8,7 @@ import {
8
8
  isKernelToHostMessage,
9
9
  type KernelToHostMessage,
10
10
  } from "../../bridge/protocol.ts";
11
- import { type CodemodeRuntimeAssetEnvironment, resolveCodemodeRuntimeAsset } from "../shared/runtime-asset.ts";
11
+ import { type CodemodeRuntimeAssetEnvironment, requireCodemodeRuntimeAsset } from "../shared/runtime-asset.ts";
12
12
  import {
13
13
  defaultSpawn,
14
14
  hardKill,
@@ -53,7 +53,7 @@ export interface PythonPreludePathOptions extends CodemodeRuntimeAssetEnvironmen
53
53
  }
54
54
 
55
55
  export function resolvePythonPreludePath(options: PythonPreludePathOptions = {}): string {
56
- return resolveCodemodeRuntimeAsset(
56
+ return requireCodemodeRuntimeAsset(
57
57
  options.localPath ?? join(dirname(fileURLToPath(import.meta.url)), "prelude.py"),
58
58
  join("kernels", "py", "prelude.py"),
59
59
  options,
@@ -1,6 +1,6 @@
1
1
  import { join } from "node:path";
2
2
  import type { BridgeConnectionConfig, KernelToHostMessage } from "../../bridge/protocol.ts";
3
- import { type CodemodeRuntimeAssetEnvironment, resolveCodemodeRuntimeAsset } from "../shared/runtime-asset.ts";
3
+ import { type CodemodeRuntimeAssetEnvironment, requireCodemodeRuntimeAsset } from "../shared/runtime-asset.ts";
4
4
  import { SubprocessKernel, type SubprocessSpawn } from "../shared/subprocess-kernel.ts";
5
5
 
6
6
  export interface RubyKernelStartOptions {
@@ -17,7 +17,7 @@ export interface RubyRunnerPathOptions extends CodemodeRuntimeAssetEnvironment {
17
17
  }
18
18
 
19
19
  export function resolveRubyRunnerPath(options: RubyRunnerPathOptions = {}): string {
20
- return resolveCodemodeRuntimeAsset(
20
+ return requireCodemodeRuntimeAsset(
21
21
  options.localPath ?? join(import.meta.dirname, "runner.rb"),
22
22
  join("kernels", "rb", "runner.rb"),
23
23
  options,
@@ -6,26 +6,52 @@ export interface CodemodeRuntimeAssetEnvironment {
6
6
  readonly executablePath?: string;
7
7
  }
8
8
 
9
+ export class CodemodeRuntimeAssetMissingError extends Error {
10
+ readonly packageRelativePath: string;
11
+ readonly localPath: string;
12
+ readonly sidecarPath: string;
13
+ readonly executablePath: string;
14
+
15
+ constructor(packageRelativePath: string, localPath: string, sidecarPath: string, executablePath: string) {
16
+ super(
17
+ `codemode runtime asset ${packageRelativePath} is unavailable: module-relative path ${localPath} is not readable and the codemode sidecar is missing beside the executable ${executablePath} (expected ${sidecarPath}). Ship node_modules/@code-yeongyu/senpi-codemode next to the executable.`,
18
+ );
19
+ this.name = "CodemodeRuntimeAssetMissingError";
20
+ this.packageRelativePath = packageRelativePath;
21
+ this.localPath = localPath;
22
+ this.sidecarPath = sidecarPath;
23
+ this.executablePath = executablePath;
24
+ }
25
+ }
26
+
27
+ export function isBunVirtualPath(path: string): boolean {
28
+ return path.includes("/$bunfs/") || path.includes("~BUN") || path.includes("%7EBUN");
29
+ }
30
+
31
+ function sidecarPathFor(packageRelativePath: string, executablePath: string): string {
32
+ return join(dirname(executablePath), "node_modules", "@code-yeongyu", "senpi-codemode", "src", packageRelativePath);
33
+ }
34
+
35
+ export function requireCodemodeRuntimeAsset(
36
+ localPath: string,
37
+ packageRelativePath: string,
38
+ { executablePath = process.execPath }: CodemodeRuntimeAssetEnvironment = {},
39
+ ): string {
40
+ const sidecarPath = sidecarPathFor(packageRelativePath, executablePath);
41
+ if (!isBunVirtualPath(localPath) && existsSync(localPath)) return localPath;
42
+ if (existsSync(sidecarPath)) return sidecarPath;
43
+ throw new CodemodeRuntimeAssetMissingError(packageRelativePath, localPath, sidecarPath, executablePath);
44
+ }
45
+
9
46
  export function resolveCodemodeRuntimeAsset(
10
47
  localPath: string,
11
48
  packageRelativePath: string,
12
49
  { bunVersion = process.versions.bun, executablePath = process.execPath }: CodemodeRuntimeAssetEnvironment = {},
13
50
  ): string {
14
- if (existsSync(localPath)) {
15
- return localPath;
16
- }
51
+ if (existsSync(localPath)) return localPath;
17
52
  if (bunVersion) {
18
- const sidecarPath = join(
19
- dirname(executablePath),
20
- "node_modules",
21
- "@code-yeongyu",
22
- "senpi-codemode",
23
- "src",
24
- packageRelativePath,
25
- );
26
- if (existsSync(sidecarPath)) {
27
- return sidecarPath;
28
- }
53
+ const sidecarPath = sidecarPathFor(packageRelativePath, executablePath);
54
+ if (existsSync(sidecarPath)) return sidecarPath;
29
55
  }
30
56
  return localPath;
31
57
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@earendil-works/pi-agent-core",
3
- "version": "2026.9.6",
3
+ "version": "2026.9.7",
4
4
  "description": "General-purpose agent with transport abstraction, state management, and attachment support",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -35,8 +35,8 @@
35
35
  "prepublishOnly": "npm run build"
36
36
  },
37
37
  "dependencies": {
38
- "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.9.6",
39
- "@earendil-works/pi-telemetry": "npm:@code-yeongyu/senpi-telemetry@2026.9.6",
38
+ "@earendil-works/pi-ai": "npm:@code-yeongyu/senpi-ai@2026.9.7",
39
+ "@earendil-works/pi-telemetry": "npm:@code-yeongyu/senpi-telemetry@2026.9.7",
40
40
  "diff": "9.0.0",
41
41
  "ignore": "7.0.6",
42
42
  "typebox": "1.3.18",
@@ -1 +1 @@
1
- {"schemaVersion":3,"generatedAt":"2026-09-06T17:37:01.666Z","structureHash":"0df417387a91858721a7ba94c027b8e9f68edc0e934ee8c397db4e6c72ab27a3","files":{"alibaba-token-plan.json":"9f9e8f88b1faa2e4134a0d8bcda600531d4d044d64b7ec3d2373f1db46dcf452","amazon-bedrock.json":"c86cdf3eb28122f8682415543012feee0a84dd4a30f03b784dfffde92b0d69f4","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"e9d883ee35d94dba963320b5496bd7dd368d226cbafcf134bfec66a0a24b3b7f","azure-openai-responses.json":"fda6124a327ac009e2bc990b5fdbb1cce38d25b3903a22db9fc0916a64265185","baseten.json":"8f7430af599249a01f446b5b717856dd58d484e76f5dbccf86c0ec7b6661468d","cerebras.json":"9eaa554e1b02f3665f8f63e6432d253bf81351af7c72001054dd8108aa528a52","cloudflare-ai-gateway.json":"f135f718d749355fe745823c3fc1315019ba37a6f20ae8523fafe9dd0c46d090","cloudflare-workers-ai.json":"07ef63208ff7517fd1a80962f18143e21de399640423329490b157f459ccf995","deepseek.json":"e3106724723fd82d48a3ff685da9908a3a7b7b4fd84cc3cfe97a6a23067b6029","fireworks.json":"0b480dcad5ff4072ef299d887f27ed3ed96e2246aa57ffa3bac02ecee9aee331","github-copilot.json":"54129bbff5764fed2c5da83adc00332eb95bd85377bb2442fd9f36b78a96df05","google-vertex.json":"e1631109172dc1f7d7977570420a5bb86258bdd1088427e244a2c51545c4f24d","google.json":"7619bf03edd2a7acb06a2274a14b13c3a61354288abe029a758401d4de36a8fd","groq.json":"e4728fd72e358cd8f25e9a518e9b49a521ef44523d3debe38a7db9e0663c4077","huggingface.json":"3a004b58d3f801077a81f5be5cdf40c59ce1070c9c68f279e8d6c8902d441b19","kimi-coding.json":"88150f8970f83e17968b02f3b33fac803b96ebf1474e76437689b7d0f1b69363","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"e3a109306644bf2f2fa38fece50b2d3ce1dbe3b87b1f1b9e2d70cce7eb5c0ea1","moonshotai-cn.json":"c4e1801b5dfd61bebcaa33cbfc5ed0c69df14a3bee37da218a558668d817864e","moonshotai.json":"3dab637e7e2648792c786157f85f29026b93393f7098b77593c1180928d371c9","nvidia.json":"7e5d6e027f61e36f8d806d0af311cda93a40e75920b8a0645eddf0ab9f058033","openai-codex.json":"dfe2ffc02604acf026c8e94a3b45a8d73cef3f4d7b4783ef95316c44ce1bb46d","openai.json":"3852260e9ef6e73ae7c284a105919c0df4617128aef28d9f8cc8847e679f3b57","opencode-go.json":"e5191ca2337d31c5baa3d603284a981dfaefb67693ff227cc523a3937f02a2d8","opencode.json":"9c66625f296a141a47f3c94c3299cc9ccf8e8130ffa6092d72265a79d97b3fd7","opengateway.json":"ea7baf1096fe1488ee080ece109743fe69a8ccc111908a991ca09532efc60e15","openrouter.json":"0f76c10c6d55ba340137667c357d88bfca56f653088196851a216726b92fe066","qwen-token-plan-cn.json":"e62dde34edb603376a1dc60b2a74a9c2605b9e81d81df55cc259796c45aa4793","qwen-token-plan-individual.json":"5649fd4075ada766ec65a7a162cd65f096a7ecc29960ace04b2e6a6a4a995a41","qwen-token-plan.json":"fe914313157ff41ab2f71977f0fdcfedb3a8a205d1092e3180f6799e5d7942fd","together.json":"6010980c9b0af72c60965ae325dbdb21e67c91844a7f7f6f7d71d363f1325f56","vercel-ai-gateway.json":"3a6ef6dfd89ab87eb305b4c2bb8f5bb890d2d017b79b76a9195411a53a1c360a","xai.json":"9973aae022723732b8a7ea12107e6fb8b3f1d0e087ec6bbc2ee18f0820595e19","xiaomi-token-plan-ams.json":"568b9992cf320536a65826e26a414afa5c0d17f083a01af4bd96658d9dd3e705","xiaomi-token-plan-cn.json":"c423857d0bbb0b126394eaf1ebb2a91bf2d1193cc5a4fe77843ff0f4536a0a80","xiaomi-token-plan-sgp.json":"008f1eb41037e93c5ae478f12815cd67bac1978f131ffefa602775bb60b63fea","xiaomi.json":"37acf451bb4364bdca2ecea6b7d962590d9974a87e80cfe34bb800be6a95c13b","zai-coding-cn.json":"d3c969020a7ab978497837a3301c7bca364d704082832221cfe61e6596333e56","zai.json":"f42790c77fb4681a656897a9d860b939916c0ddf979a5f16856bce9573cdf64e"}}
1
+ {"schemaVersion":3,"generatedAt":"2026-09-07T03:20:06.581Z","structureHash":"0df417387a91858721a7ba94c027b8e9f68edc0e934ee8c397db4e6c72ab27a3","files":{"alibaba-token-plan.json":"9f9e8f88b1faa2e4134a0d8bcda600531d4d044d64b7ec3d2373f1db46dcf452","amazon-bedrock.json":"7f870508a8a7afecf85037af6242762ebdc7774fe29061b9b39d7754f528ec1d","ant-ling.json":"4979fe79d99ed97382d7ce40170c6132e932e77906de1eb54464c042e7d63633","anthropic.json":"e9d883ee35d94dba963320b5496bd7dd368d226cbafcf134bfec66a0a24b3b7f","azure-openai-responses.json":"55583de57e514dd5b8de570eaf1ba86345ea2a4cb3335b47b15435df497e4dd0","baseten.json":"8f7430af599249a01f446b5b717856dd58d484e76f5dbccf86c0ec7b6661468d","cerebras.json":"9eaa554e1b02f3665f8f63e6432d253bf81351af7c72001054dd8108aa528a52","cloudflare-ai-gateway.json":"244d98311e81b5f33fa736688d135b29add6a8acee466aa3a5988ac5b022d1eb","cloudflare-workers-ai.json":"07ef63208ff7517fd1a80962f18143e21de399640423329490b157f459ccf995","deepseek.json":"e3106724723fd82d48a3ff685da9908a3a7b7b4fd84cc3cfe97a6a23067b6029","fireworks.json":"0b480dcad5ff4072ef299d887f27ed3ed96e2246aa57ffa3bac02ecee9aee331","github-copilot.json":"6a584201b123c1dcc2a0e2543c5c77af2420f46f32571ee61edffcba762cce7a","google-vertex.json":"e1631109172dc1f7d7977570420a5bb86258bdd1088427e244a2c51545c4f24d","google.json":"7619bf03edd2a7acb06a2274a14b13c3a61354288abe029a758401d4de36a8fd","groq.json":"e4728fd72e358cd8f25e9a518e9b49a521ef44523d3debe38a7db9e0663c4077","huggingface.json":"3a004b58d3f801077a81f5be5cdf40c59ce1070c9c68f279e8d6c8902d441b19","kimi-coding.json":"88150f8970f83e17968b02f3b33fac803b96ebf1474e76437689b7d0f1b69363","minimax-cn.json":"65d37e55a6d9585855f94b3fb7739308d107fe248ebd9e1001d1c5d4606ad2c4","minimax.json":"c7dc5765995ae77242916430929c7cc9a782589f7e483e13f7e01663190d028e","mistral.json":"e3a109306644bf2f2fa38fece50b2d3ce1dbe3b87b1f1b9e2d70cce7eb5c0ea1","moonshotai-cn.json":"c4e1801b5dfd61bebcaa33cbfc5ed0c69df14a3bee37da218a558668d817864e","moonshotai.json":"3dab637e7e2648792c786157f85f29026b93393f7098b77593c1180928d371c9","nvidia.json":"7e5d6e027f61e36f8d806d0af311cda93a40e75920b8a0645eddf0ab9f058033","openai-codex.json":"f99162aea3e92ede2b3885b3b38915e460ec4f0de466c908191ae9acc9998e49","openai.json":"38274fc8c53ce99b03a86f6439307118d8dee02de57b135c51dd05b11fd7cc63","opencode-go.json":"07285c7abbc2e4c8d136aa381254a0e7148ee26912ab18cf2316c9b1c10e5816","opencode.json":"0cf12754175821b33613a438a8e83aa17900dddbc35e7665836bcf4c5abdbe15","opengateway.json":"b4a6a22444054baad8c8ccffa23465e7805a292e942865385d8eef1925254fc5","openrouter.json":"77bee5f3743c7336351dcb1a1ad20960a6e5d9062bb6863aedea1087fe2d3376","qwen-token-plan-cn.json":"e62dde34edb603376a1dc60b2a74a9c2605b9e81d81df55cc259796c45aa4793","qwen-token-plan-individual.json":"5649fd4075ada766ec65a7a162cd65f096a7ecc29960ace04b2e6a6a4a995a41","qwen-token-plan.json":"fe914313157ff41ab2f71977f0fdcfedb3a8a205d1092e3180f6799e5d7942fd","together.json":"6010980c9b0af72c60965ae325dbdb21e67c91844a7f7f6f7d71d363f1325f56","vercel-ai-gateway.json":"d70b8860fbc120ef42d10c884521246b2d6d352edb3f90c9ade4c8b651f135ae","xai.json":"9973aae022723732b8a7ea12107e6fb8b3f1d0e087ec6bbc2ee18f0820595e19","xiaomi-token-plan-ams.json":"568b9992cf320536a65826e26a414afa5c0d17f083a01af4bd96658d9dd3e705","xiaomi-token-plan-cn.json":"c423857d0bbb0b126394eaf1ebb2a91bf2d1193cc5a4fe77843ff0f4536a0a80","xiaomi-token-plan-sgp.json":"008f1eb41037e93c5ae478f12815cd67bac1978f131ffefa602775bb60b63fea","xiaomi.json":"37acf451bb4364bdca2ecea6b7d962590d9974a87e80cfe34bb800be6a95c13b","zai-coding-cn.json":"d3c969020a7ab978497837a3301c7bca364d704082832221cfe61e6596333e56","zai.json":"f42790c77fb4681a656897a9d860b939916c0ddf979a5f16856bce9573cdf64e"}}