@code-yeongyu/senpi 2026.8.27 → 2026.8.28-2

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 (181) hide show
  1. package/CHANGELOG.md +83 -0
  2. package/dist/cli/args.d.ts +2 -0
  3. package/dist/cli/args.d.ts.map +1 -1
  4. package/dist/cli/args.js +4 -0
  5. package/dist/cli/args.js.map +1 -1
  6. package/dist/core/agent-session-services.d.ts.map +1 -1
  7. package/dist/core/agent-session-services.js +2 -0
  8. package/dist/core/agent-session-services.js.map +1 -1
  9. package/dist/core/agent-session.d.ts +5 -0
  10. package/dist/core/agent-session.d.ts.map +1 -1
  11. package/dist/core/agent-session.js +1 -0
  12. package/dist/core/agent-session.js.map +1 -1
  13. package/dist/core/auth-storage.d.ts +1 -0
  14. package/dist/core/auth-storage.d.ts.map +1 -1
  15. package/dist/core/auth-storage.js +3 -0
  16. package/dist/core/auth-storage.js.map +1 -1
  17. package/dist/core/credential-accounts.d.ts +31 -0
  18. package/dist/core/credential-accounts.d.ts.map +1 -0
  19. package/dist/core/credential-accounts.js +135 -0
  20. package/dist/core/credential-accounts.js.map +1 -0
  21. package/dist/core/credential-pool/classify.d.ts +6 -1
  22. package/dist/core/credential-pool/classify.d.ts.map +1 -1
  23. package/dist/core/credential-pool/classify.js +22 -5
  24. package/dist/core/credential-pool/classify.js.map +1 -1
  25. package/dist/core/credential-pool/failover.d.ts +8 -0
  26. package/dist/core/credential-pool/failover.d.ts.map +1 -1
  27. package/dist/core/credential-pool/failover.js +24 -6
  28. package/dist/core/credential-pool/failover.js.map +1 -1
  29. package/dist/core/credential-pool/rotation-stream.d.ts +13 -2
  30. package/dist/core/credential-pool/rotation-stream.d.ts.map +1 -1
  31. package/dist/core/credential-pool/rotation-stream.js +97 -10
  32. package/dist/core/credential-pool/rotation-stream.js.map +1 -1
  33. package/dist/core/extensions/builtin/account/index.d.ts +9 -0
  34. package/dist/core/extensions/builtin/account/index.d.ts.map +1 -0
  35. package/dist/core/extensions/builtin/account/index.js +69 -0
  36. package/dist/core/extensions/builtin/account/index.js.map +1 -0
  37. package/dist/core/extensions/builtin/goal/index.d.ts.map +1 -1
  38. package/dist/core/extensions/builtin/goal/index.js +7 -0
  39. package/dist/core/extensions/builtin/goal/index.js.map +1 -1
  40. package/dist/core/extensions/builtin/imagegen/index.d.ts.map +1 -1
  41. package/dist/core/extensions/builtin/imagegen/index.js +10 -3
  42. package/dist/core/extensions/builtin/imagegen/index.js.map +1 -1
  43. package/dist/core/extensions/builtin/index.d.ts.map +1 -1
  44. package/dist/core/extensions/builtin/index.js +4 -0
  45. package/dist/core/extensions/builtin/index.js.map +1 -1
  46. package/dist/core/extensions/builtin/service-tier.d.ts.map +1 -1
  47. package/dist/core/extensions/builtin/service-tier.js +13 -0
  48. package/dist/core/extensions/builtin/service-tier.js.map +1 -1
  49. package/dist/core/extensions/builtin/terminal/extension.d.ts.map +1 -1
  50. package/dist/core/extensions/builtin/terminal/extension.js +4 -2
  51. package/dist/core/extensions/builtin/terminal/extension.js.map +1 -1
  52. package/dist/core/model-config-schema.d.ts +4 -4
  53. package/dist/core/model-runtime.d.ts +2 -0
  54. package/dist/core/model-runtime.d.ts.map +1 -1
  55. package/dist/core/model-runtime.js +74 -37
  56. package/dist/core/model-runtime.js.map +1 -1
  57. package/dist/core/retry-fallback/chains.d.ts +23 -1
  58. package/dist/core/retry-fallback/chains.d.ts.map +1 -1
  59. package/dist/core/retry-fallback/chains.js +59 -3
  60. package/dist/core/retry-fallback/chains.js.map +1 -1
  61. package/dist/core/retry-fallback/controller.d.ts.map +1 -1
  62. package/dist/core/retry-fallback/controller.js +9 -2
  63. package/dist/core/retry-fallback/controller.js.map +1 -1
  64. package/dist/core/retry-fallback/settings.d.ts.map +1 -1
  65. package/dist/core/retry-fallback/settings.js +9 -0
  66. package/dist/core/retry-fallback/settings.js.map +1 -1
  67. package/dist/core/retry-fallback/validate.js +1 -1
  68. package/dist/core/retry-fallback/validate.js.map +1 -1
  69. package/dist/core/sdk.js +1 -1
  70. package/dist/core/sdk.js.map +1 -1
  71. package/dist/core/session-manager.d.ts +9 -0
  72. package/dist/core/session-manager.d.ts.map +1 -1
  73. package/dist/core/session-manager.js +31 -0
  74. package/dist/core/session-manager.js.map +1 -1
  75. package/dist/main.d.ts +7 -0
  76. package/dist/main.d.ts.map +1 -1
  77. package/dist/main.js +22 -2
  78. package/dist/main.js.map +1 -1
  79. package/dist/modes/app-server/server/account.d.ts.map +1 -1
  80. package/dist/modes/app-server/server/account.js +5 -5
  81. package/dist/modes/app-server/server/account.js.map +1 -1
  82. package/dist/modes/interactive/components/footer.d.ts +11 -3
  83. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  84. package/dist/modes/interactive/components/footer.js +31 -1
  85. package/dist/modes/interactive/components/footer.js.map +1 -1
  86. package/dist/modes/interactive/grok/chrome.d.ts +4 -4
  87. package/dist/modes/interactive/grok/chrome.d.ts.map +1 -1
  88. package/dist/modes/interactive/grok/chrome.js.map +1 -1
  89. package/dist/modes/interactive/grok/footer.d.ts +3 -3
  90. package/dist/modes/interactive/grok/footer.d.ts.map +1 -1
  91. package/dist/modes/interactive/grok/footer.js.map +1 -1
  92. package/dist/modes/interactive/interactive-host-runtime.d.ts +16 -1
  93. package/dist/modes/interactive/interactive-host-runtime.d.ts.map +1 -1
  94. package/dist/modes/interactive/interactive-host-runtime.js +321 -36
  95. package/dist/modes/interactive/interactive-host-runtime.js.map +1 -1
  96. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  97. package/dist/modes/interactive/interactive-mode.js +295 -250
  98. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  99. package/dist/modes/rpc/connection-handler.d.ts.map +1 -1
  100. package/dist/modes/rpc/connection-handler.js +144 -29
  101. package/dist/modes/rpc/connection-handler.js.map +1 -1
  102. package/dist/modes/rpc/multi-session-host.js +14 -4
  103. package/dist/modes/rpc/multi-session-host.js.map +1 -1
  104. package/dist/modes/rpc/rpc-client.d.ts +90 -8
  105. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  106. package/dist/modes/rpc/rpc-client.js +118 -23
  107. package/dist/modes/rpc/rpc-client.js.map +1 -1
  108. package/dist/modes/rpc/rpc-mode.d.ts +3 -1
  109. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  110. package/dist/modes/rpc/rpc-mode.js +3 -1
  111. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  112. package/dist/modes/rpc/rpc-types.d.ts +164 -2
  113. package/dist/modes/rpc/rpc-types.d.ts.map +1 -1
  114. package/dist/modes/rpc/rpc-types.js.map +1 -1
  115. package/dist/modes/rpc/session-command-router.d.ts +22 -0
  116. package/dist/modes/rpc/session-command-router.d.ts.map +1 -1
  117. package/dist/modes/rpc/session-command-router.js +153 -14
  118. package/dist/modes/rpc/session-command-router.js.map +1 -1
  119. package/dist/modes/rpc/session-event-writer.d.ts +2 -0
  120. package/dist/modes/rpc/session-event-writer.d.ts.map +1 -1
  121. package/dist/modes/rpc/session-event-writer.js +4 -0
  122. package/dist/modes/rpc/session-event-writer.js.map +1 -1
  123. package/dist/modes/rpc/session-registry.d.ts +16 -0
  124. package/dist/modes/rpc/session-registry.d.ts.map +1 -1
  125. package/dist/modes/rpc/session-registry.js +40 -3
  126. package/dist/modes/rpc/session-registry.js.map +1 -1
  127. package/docs/providers.md +48 -0
  128. package/docs/rpc.md +43 -4
  129. package/node_modules/@code-yeongyu/senpi-codemode/CHANGELOG.md +26 -0
  130. package/node_modules/@code-yeongyu/senpi-codemode/package.json +4 -4
  131. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/context-manager.ts +13 -1
  132. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/js/inline-worker.ts +15 -1
  133. package/node_modules/@code-yeongyu/senpi-codemode/src/kernels/py/transport.ts +14 -1
  134. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.d.ts.map +1 -1
  135. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js +20 -4
  136. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/edit.js.map +1 -1
  137. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts +1 -1
  138. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.d.ts.map +1 -1
  139. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/index.js.map +1 -1
  140. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.d.ts +21 -0
  141. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.d.ts.map +1 -0
  142. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.js +27 -0
  143. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/post-mutate.js.map +1 -0
  144. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts +24 -0
  145. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.d.ts.map +1 -1
  146. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/tool-context.js.map +1 -1
  147. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.d.ts.map +1 -1
  148. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js +7 -2
  149. package/node_modules/@earendil-works/pi-agent-core/dist/harness/tools/write.js.map +1 -1
  150. package/node_modules/@earendil-works/pi-agent-core/package.json +3 -3
  151. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts +2 -1
  152. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.d.ts.map +1 -1
  153. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js +2 -1
  154. package/node_modules/@earendil-works/pi-ai/dist/auth/credential-store.js.map +1 -1
  155. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts +3 -2
  156. package/node_modules/@earendil-works/pi-ai/dist/auth/types.d.ts.map +1 -1
  157. package/node_modules/@earendil-works/pi-ai/dist/auth/types.js.map +1 -1
  158. package/node_modules/@earendil-works/pi-ai/dist/providers/data/.manifest.json +1 -1
  159. package/node_modules/@earendil-works/pi-ai/dist/providers/data/alibaba-token-plan.json +1 -1
  160. package/node_modules/@earendil-works/pi-ai/dist/providers/data/amazon-bedrock.json +1 -1
  161. package/node_modules/@earendil-works/pi-ai/dist/providers/data/baseten.json +1 -1
  162. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-ai-gateway.json +1 -1
  163. package/node_modules/@earendil-works/pi-ai/dist/providers/data/cloudflare-workers-ai.json +1 -1
  164. package/node_modules/@earendil-works/pi-ai/dist/providers/data/fireworks.json +1 -1
  165. package/node_modules/@earendil-works/pi-ai/dist/providers/data/github-copilot.json +1 -1
  166. package/node_modules/@earendil-works/pi-ai/dist/providers/data/huggingface.json +1 -1
  167. package/node_modules/@earendil-works/pi-ai/dist/providers/data/nvidia.json +1 -1
  168. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai-codex.json +1 -1
  169. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openai.json +1 -1
  170. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode-go.json +1 -1
  171. package/node_modules/@earendil-works/pi-ai/dist/providers/data/opencode.json +1 -1
  172. package/node_modules/@earendil-works/pi-ai/dist/providers/data/openrouter.json +1 -1
  173. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan-cn.json +1 -1
  174. package/node_modules/@earendil-works/pi-ai/dist/providers/data/qwen-token-plan.json +1 -1
  175. package/node_modules/@earendil-works/pi-ai/dist/providers/data/together.json +1 -1
  176. package/node_modules/@earendil-works/pi-ai/dist/providers/data/vercel-ai-gateway.json +1 -1
  177. package/node_modules/@earendil-works/pi-ai/package.json +2 -2
  178. package/node_modules/@earendil-works/pi-pty/package.json +1 -1
  179. package/node_modules/@earendil-works/pi-telemetry/package.json +1 -1
  180. package/node_modules/@earendil-works/pi-tui/package.json +1 -1
  181. package/package.json +7 -7
@@ -1674,10 +1674,10 @@ export declare const validateModelsConfig: import("typebox/compile").Validator<{
1674
1674
  env?: string | undefined;
1675
1675
  value?: string | undefined;
1676
1676
  }> | undefined;
1677
- rotation?: boolean | undefined;
1678
- affinity?: boolean | undefined;
1679
1677
  cooldownBaseMs?: number | undefined;
1680
1678
  cooldownCapMs?: number | undefined;
1679
+ affinity?: boolean | undefined;
1680
+ rotation?: boolean | undefined;
1681
1681
  } | undefined;
1682
1682
  }>;
1683
1683
  }, {
@@ -2028,10 +2028,10 @@ export declare const validateModelsConfig: import("typebox/compile").Validator<{
2028
2028
  env?: string | undefined;
2029
2029
  value?: string | undefined;
2030
2030
  }> | undefined;
2031
- rotation?: boolean | undefined;
2032
- affinity?: boolean | undefined;
2033
2031
  cooldownBaseMs?: number | undefined;
2034
2032
  cooldownCapMs?: number | undefined;
2033
+ affinity?: boolean | undefined;
2034
+ rotation?: boolean | undefined;
2035
2035
  } | undefined;
2036
2036
  }>;
2037
2037
  }>;
@@ -4,6 +4,7 @@ export interface CreateModelRuntimeOptions {
4
4
  /** Credential storage. Defaults to the file at authPath. */
5
5
  credentials?: CredentialStore;
6
6
  authPath?: string;
7
+ agentDir?: string;
7
8
  modelsPath?: string | null;
8
9
  modelsStore?: ModelsStore;
9
10
  modelsStorePath?: string;
@@ -68,6 +69,7 @@ export declare class ModelRuntime implements Models {
68
69
  * validator - and its module-level global registry - into every consumer of
69
70
  * ModelRuntime, which the import-graph guard forbids.
70
71
  */
72
+ private readonly poolStatePath;
71
73
  private credentialPoolModules;
72
74
  private constructor();
73
75
  static create(options?: CreateModelRuntimeOptions): Promise<ModelRuntime>;
@@ -1 +1 @@
1
- {"version":3,"file":"model-runtime.d.ts","sourceRoot":"","sources":["../../src/core/model-runtime.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"model-runtime.d.ts","sourceRoot":"","sources":["../../src/core/model-runtime.ts"],"names":[],"mappings":"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"}
@@ -1,10 +1,11 @@
1
1
  import { dirname, join } from "node:path";
2
- import { createModels, getApiKeyEnvVars, lazyStream, ModelsError, setWireIdentity, wrapStreamWithModelRecovery, } from "@earendil-works/pi-ai";
2
+ import { createModels, lazyStream, ModelsError, setWireIdentity, wrapStreamWithModelRecovery, } from "@earendil-works/pi-ai";
3
3
  import * as builtinProviderCatalog from "@earendil-works/pi-ai/providers/all";
4
4
  import { APP_NAME, BRAND, getAgentDir } from "../config.js";
5
5
  import { operationSignal, raceWithAbortSignal } from "../utils/abort.js";
6
6
  import { AuthStorage as DefaultAuthStorage } from "./auth-storage.js";
7
7
  import { envValue } from "./brand.js";
8
+ import { discoverEnvSlots } from "./credential-pool/env-slots.js";
8
9
  import { ModelConfig } from "./model-config.js";
9
10
  import { FileModelsStore, InMemoryCodingAgentModelsStore } from "./models-store.js";
10
11
  import { composeModelProvider, configuredRequestAuthStatus, resolveCompatibilityRequestConfig, resolveConfiguredModelHeaders, validateExtensionProvider, } from "./provider-composer.js";
@@ -13,30 +14,12 @@ import { RuntimeCredentials } from "./runtime-credentials.js";
13
14
  // The product's identity must ride outgoing requests. This lives here because the AI package
14
15
  // is already part of this module's graph; the CLI bootstrap deliberately does not import it.
15
16
  setWireIdentity(BRAND?.userAgent ?? APP_NAME);
16
- /**
17
- * Cheap pre-check answering "could this provider hold more than one credential
18
- * at all?" without loading the credential pool. A stored entry pools only
19
- * through `accounts`; env slots participate only when nothing is stored, and a
20
- * lone primary variable is still a single credential.
21
- */
22
- function mightHoldEnvCredentialPool(providerId, env) {
23
- const envVars = getApiKeyEnvVars(providerId);
24
- const primary = envVars?.find((name) => name.endsWith("_API_KEY")) ?? envVars?.[0];
25
- if (primary === undefined)
26
- return false;
27
- let found = env(primary) ? 1 : 0;
28
- for (let index = 2; index <= 16 && found < 2; index++) {
29
- if (env(`${primary}_${index}`))
30
- found++;
31
- }
32
- return found > 1;
33
- }
34
- function mightHoldCredentialPool(providerId, credential, env) {
17
+ function mightHoldCredentialPool(providerId, credential, env, policySlots) {
35
18
  if (credential) {
36
19
  const accounts = Object.entries(credential).find(([key]) => key === "accounts")?.[1];
37
- return Array.isArray(accounts) && accounts.length > 1;
20
+ return (Array.isArray(accounts) && accounts.length > 1) || Object.keys(policySlots ?? {}).length > 0;
38
21
  }
39
- return mightHoldEnvCredentialPool(providerId, env);
22
+ return discoverEnvSlots(providerId, env).length + Object.keys(policySlots ?? {}).length > 1;
40
23
  }
41
24
  /** Credentials changed successfully, but the local model/auth snapshot could not be synchronized. */
42
25
  export class CredentialSynchronizationError extends Error {
@@ -68,12 +51,15 @@ function withPayloadRequestMetadata(options, model) {
68
51
  const onPayload = options.onPayload;
69
52
  return {
70
53
  ...options,
71
- onPayload: async (payload, providerModel) => await onPayload(payload, providerModel, { model, headers: options.headers ?? {} }),
54
+ onPayload: async (payload, providerModel) => await onPayload(payload, providerModel, {
55
+ model,
56
+ headers: options.headers ?? {},
57
+ }),
72
58
  };
73
59
  }
74
60
  /** Configured pi-ai Models collection used by coding-agent and SDK consumers. */
75
61
  export class ModelRuntime {
76
- constructor(credentials, config, modelsPath, modelsStore, providers, modelNetworkEnabled, modelRefreshTimeoutMs) {
62
+ constructor(credentials, config, modelsPath, modelsStore, providers, modelNetworkEnabled, modelRefreshTimeoutMs, poolStatePath) {
77
63
  this.builtins = new Map();
78
64
  this.nativeExtensionProviders = new Map();
79
65
  this.extensionProviders = new Map();
@@ -91,6 +77,7 @@ export class ModelRuntime {
91
77
  this.providerAvailabilitySeq = new Map();
92
78
  this.credentialOperations = new Map();
93
79
  this.credentials = credentials;
80
+ this.poolStatePath = poolStatePath;
94
81
  this.config = config;
95
82
  this.modelsPath = modelsPath;
96
83
  this.modelNetworkEnabled = modelNetworkEnabled;
@@ -115,7 +102,11 @@ export class ModelRuntime {
115
102
  .map((provider) => provider.refreshModels || !remoteCatalogServesProvider(provider.id, options.catalogBaseUrl)
116
103
  ? provider
117
104
  : withRemoteCatalog(provider, options.catalogBaseUrl, builtinModelDataGeneratedAt));
118
- const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, envValue("OFFLINE") === undefined && options.allowModelNetwork === true, options.modelRefreshTimeoutMs ?? 15_000);
105
+ const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, envValue("OFFLINE") === undefined && options.allowModelNetwork === true, options.modelRefreshTimeoutMs ?? 15_000, options.agentDir
106
+ ? join(options.agentDir, "credential-pool-state.json")
107
+ : options.authPath
108
+ ? join(dirname(options.authPath), "credential-pool-state.json")
109
+ : undefined);
119
110
  runtime.rebuildProviders();
120
111
  const refreshFromNetwork = runtime.modelNetworkEnabled && options.allowModelNetwork === true;
121
112
  const controller = refreshFromNetwork && options.modelRefreshTimeoutMs !== undefined ? new AbortController() : undefined;
@@ -150,7 +141,11 @@ export class ModelRuntime {
150
141
  .map((provider) => provider.refreshModels || !remoteCatalogServesProvider(provider.id, options.catalogBaseUrl)
151
142
  ? provider
152
143
  : withRemoteCatalog(provider, options.catalogBaseUrl));
153
- const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, options.allowModelNetwork ?? false, options.modelRefreshTimeoutMs ?? 15_000);
144
+ const runtime = new ModelRuntime(credentials, config, modelsPath, modelsStore, providers, options.allowModelNetwork ?? false, options.modelRefreshTimeoutMs ?? 15_000, options.agentDir
145
+ ? join(options.agentDir, "credential-pool-state.json")
146
+ : options.authPath
147
+ ? join(dirname(options.authPath), "credential-pool-state.json")
148
+ : undefined);
154
149
  runtime.rebuildProviders();
155
150
  return runtime;
156
151
  }
@@ -440,7 +435,11 @@ export class ModelRuntime {
440
435
  const compositionError = this.compositionErrors.get(providerId);
441
436
  if (compositionError)
442
437
  throw new Error(compositionError);
443
- const result = await this.models.refresh({ allowNetwork: false, providers: [providerId], signal });
438
+ const result = await this.models.refresh({
439
+ allowNetwork: false,
440
+ providers: [providerId],
441
+ signal,
442
+ });
444
443
  if (result.aborted)
445
444
  signal.throwIfAborted();
446
445
  const refreshError = result.errors.get(providerId);
@@ -537,7 +536,10 @@ export class ModelRuntime {
537
536
  import("./credential-pool/rotation-stream.js"),
538
537
  import("./credential-pool/state-store.js"),
539
538
  ]);
540
- return { rotation, repository: new stateStore.CredentialSlotRepository() };
539
+ return {
540
+ rotation,
541
+ repository: new stateStore.CredentialSlotRepository(this.poolStatePath),
542
+ };
541
543
  })();
542
544
  return this.credentialPoolModules;
543
545
  }
@@ -557,12 +559,16 @@ export class ModelRuntime {
557
559
  const env = (name) => options?.env?.[name] ?? process.env[name];
558
560
  if (this.snapshot.storedProviders.has(model.provider))
559
561
  return true;
560
- return mightHoldEnvCredentialPool(model.provider, env);
562
+ const policySlots = this.config.getProvider(model.provider)?.credentials?.slots;
563
+ return discoverEnvSlots(model.provider, env).length + Object.keys(policySlots ?? {}).length > 1;
561
564
  }
562
565
  async credentialRotationSources(model, options) {
563
566
  const env = (name) => options?.env?.[name] ?? process.env[name];
564
- const credential = await this.credentials.read(model.provider, { signal: options?.signal });
565
- if (!mightHoldCredentialPool(model.provider, credential, env))
567
+ const credential = await this.credentials.read(model.provider, {
568
+ signal: options?.signal,
569
+ });
570
+ const policy = this.config.getProvider(model.provider)?.credentials;
571
+ if (!mightHoldCredentialPool(model.provider, credential, env, policy?.slots))
566
572
  return undefined;
567
573
  const pool = await this.loadCredentialPool();
568
574
  const sources = {
@@ -570,8 +576,9 @@ export class ModelRuntime {
570
576
  credential,
571
577
  env,
572
578
  repository: pool.repository,
579
+ policy,
573
580
  };
574
- const slots = await pool.rotation.listRotationSlots(sources);
581
+ const slots = await pool.rotation.listRotationSlots(sources, { acquireLeases: false });
575
582
  return slots.length > 1 ? sources : undefined;
576
583
  }
577
584
  stream(model, context, options) {
@@ -584,10 +591,16 @@ export class ModelRuntime {
584
591
  const { rotation } = await this.loadCredentialPool();
585
592
  return rotation.streamWithCredentialRotation({
586
593
  sources,
587
- ...(streamOptions?.affinityKey === undefined ? {} : { affinityKey: streamOptions.affinityKey }),
594
+ ...(streamOptions?.affinityKey !== undefined
595
+ ? { affinityKey: streamOptions.affinityKey }
596
+ : streamOptions?.sessionId !== undefined
597
+ ? { affinityKey: streamOptions.sessionId }
598
+ : {}),
588
599
  runAttempt: async (slot) => {
589
600
  const prepared = await this.prepareRequest(model, streamOptions, slot.lane === "env"
590
- ? { ...(slot.envKey === undefined ? {} : { apiKey: slot.envKey }) }
601
+ ? {
602
+ ...(slot.envKey === undefined ? {} : { apiKey: slot.envKey }),
603
+ }
591
604
  : { slotName: slot.name });
592
605
  const attempt = prepared.provider.stream(prepared.model, context, withPayloadRequestMetadata(prepared.options, prepared.model));
593
606
  return wrapStreamWithModelRecovery(attempt, model, context.tools ?? []);
@@ -604,6 +617,21 @@ export class ModelRuntime {
604
617
  }
605
618
  streamSimple(model, context, options) {
606
619
  return lazyStream(model, async () => {
620
+ const streamOptions = options;
621
+ const sources = this.couldRotateCredentials(model, streamOptions)
622
+ ? await this.credentialRotationSources(model, streamOptions)
623
+ : undefined;
624
+ if (sources) {
625
+ const { rotation } = await this.loadCredentialPool();
626
+ return rotation.streamWithCredentialRotation({
627
+ sources,
628
+ ...(streamOptions?.sessionId === undefined ? {} : { affinityKey: streamOptions.sessionId }),
629
+ runAttempt: async (slot) => {
630
+ const prepared = await this.prepareRequest(model, streamOptions, slot.lane === "env" ? { apiKey: slot.envKey } : { slotName: slot.name });
631
+ return wrapStreamWithModelRecovery(prepared.provider.streamSimple(prepared.model, context, withPayloadRequestMetadata(prepared.options, prepared.model)), model, context.tools ?? []);
632
+ },
633
+ });
634
+ }
607
635
  const prepared = await this.prepareRequest(model, options);
608
636
  const inner = prepared.provider.streamSimple(prepared.model, context, withPayloadRequestMetadata(prepared.options, prepared.model));
609
637
  return wrapStreamWithModelRecovery(inner, model, context.tools ?? []);
@@ -631,7 +659,10 @@ export class ModelRuntime {
631
659
  login(providerId, type, interaction) {
632
660
  const signal = operationSignal(interaction.signal);
633
661
  return this.enqueueCredentialOperation(providerId, signal, async () => {
634
- const credential = await this.models.login(providerId, type, { ...interaction, signal });
662
+ const credential = await this.models.login(providerId, type, {
663
+ ...interaction,
664
+ signal,
665
+ });
635
666
  await this.synchronizeCredentialState(providerId, "login", credential, signal);
636
667
  return credential;
637
668
  });
@@ -688,7 +719,10 @@ export class ModelRuntime {
688
719
  // Availability errors are recorded by the latest pass; refreshed models remain usable.
689
720
  }
690
721
  }
691
- return { aborted: result.aborted || (options.signal?.aborted ?? false), errors };
722
+ return {
723
+ aborted: result.aborted || (options.signal?.aborted ?? false),
724
+ errors,
725
+ };
692
726
  }
693
727
  /**
694
728
  * Providers registered after startup missed the create() refresh. Load their catalogs
@@ -705,7 +739,10 @@ export class ModelRuntime {
705
739
  return this.refresh({ allowNetwork: false });
706
740
  const controller = new AbortController();
707
741
  const timeout = setTimeout(() => controller.abort(), this.modelRefreshTimeoutMs);
708
- return this.refresh({ allowNetwork: true, signal: controller.signal }).finally(() => clearTimeout(timeout));
742
+ return this.refresh({
743
+ allowNetwork: true,
744
+ signal: controller.signal,
745
+ }).finally(() => clearTimeout(timeout));
709
746
  }
710
747
  registerNativeProvider(provider, options) {
711
748
  if (!provider.id.trim())