@code-yeongyu/senpi-ai 2026.10.24-1 → 2026.10.24-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.
@@ -0,0 +1,5 @@
1
+ import type { Credential, CredentialStore } from "./types.ts";
2
+ export declare function readCredential(credentials: CredentialStore, providerId: string, signal: AbortSignal): Promise<Credential | undefined>;
3
+ /** A key still holding an object was never resolved by its declaring store, so it never reaches a provider. */
4
+ export declare function readSlotCredential(credentials: CredentialStore, providerId: string, slotName: string, signal: AbortSignal): Promise<Credential | undefined>;
5
+ //# sourceMappingURL=credential-read.d.ts.map
@@ -0,0 +1,30 @@
1
+ import { ConfigReferenceError } from "../utils/config-reference-error.js";
2
+ import { ModelsError } from "../utils/models-error.js";
3
+ import { projectSlot } from "./pool/slots.js";
4
+ export async function readCredential(credentials, providerId, signal) {
5
+ try {
6
+ return await credentials.read(providerId, { signal });
7
+ }
8
+ catch (error) {
9
+ throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause: error });
10
+ }
11
+ }
12
+ /** A key still holding an object was never resolved by its declaring store, so it never reaches a provider. */
13
+ export async function readSlotCredential(credentials, providerId, slotName, signal) {
14
+ let projected;
15
+ try {
16
+ projected = credentials.readSlot
17
+ ? await credentials.readSlot(providerId, slotName, { signal })
18
+ : projectSlot(await credentials.read(providerId, { signal }), slotName);
19
+ }
20
+ catch (error) {
21
+ throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause: error });
22
+ }
23
+ const key = projected?.type === "api_key" ? projected.key : undefined;
24
+ if (typeof key === "object" && key !== null) {
25
+ const cause = new ConfigReferenceError(`${providerId}.accounts.${slotName}.key`, key, "forbidden");
26
+ throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause });
27
+ }
28
+ return projected;
29
+ }
30
+ //# sourceMappingURL=credential-read.js.map
@@ -1,8 +1,8 @@
1
1
  import { operationSignal, raceWithAbortSignal } from "../utils/abort.js";
2
2
  import { ModelsError } from "../utils/models-error.js";
3
3
  import { classifyOAuthRefreshFailure, OAuthRefreshUnavailableError } from "../utils/oauth-refresh-error.js";
4
+ import { readCredential, readSlotCredential } from "./credential-read.js";
4
5
  import { OAuthRefreshExchangeError, OAuthRefreshStoreError, projectOAuthSlot, refreshOAuthCredential, } from "./oauth-refresh.js";
5
- import { projectSlot } from "./pool/slots.js";
6
6
  export { ModelsError } from "../utils/models-error.js";
7
7
  /**
8
8
  * Prefix of the auth-miss every resolution site raises when a provider has no
@@ -35,10 +35,9 @@ async function resolveProviderAuthWithSignal(provider, credentials, authContext,
35
35
  env: overrides.env,
36
36
  }, signal);
37
37
  }
38
- const stored = await readCredential(credentials, provider.id, signal);
39
38
  const slotName = overrides?.slotName;
40
39
  if (slotName !== undefined) {
41
- const projected = stored === undefined ? undefined : projectSlot(stored, slotName);
40
+ const projected = await readSlotCredential(credentials, provider.id, slotName, signal);
42
41
  if (!projected)
43
42
  return undefined;
44
43
  if (projected.type === "oauth" && provider.auth.oauth) {
@@ -50,6 +49,7 @@ async function resolveProviderAuthWithSignal(provider, credentials, authContext,
50
49
  }
51
50
  return undefined;
52
51
  }
52
+ const stored = await readCredential(credentials, provider.id, signal);
53
53
  if (stored) {
54
54
  if (stored.type === "oauth" && provider.auth.oauth) {
55
55
  return resolveStoredOAuth(credentials, provider.id, provider.auth.oauth, stored, requestAuthContext, overrides?.env, signal, overrides?.minOAuthValidityMs, undefined, overrides?.rejectedAccess);
@@ -175,12 +175,4 @@ async function resolveApiKey(authContext, apiKey, providerId, credential, signal
175
175
  throw new ModelsError("auth", `API key auth failed for provider ${providerId}`, { cause: error });
176
176
  }
177
177
  }
178
- async function readCredential(credentials, providerId, signal) {
179
- try {
180
- return await credentials.read(providerId, { signal });
181
- }
182
- catch (error) {
183
- throw new ModelsError("auth", `Credential store read failed for ${providerId}`, { cause: error });
184
- }
185
- }
186
178
  //# sourceMappingURL=resolve.js.map
@@ -61,6 +61,13 @@ export interface CredentialStore {
61
61
  * resolved request auth comes from `Models.getAuth()`.
62
62
  */
63
63
  read(providerId: string, options?: AuthOperationOptions): Promise<Credential | undefined>;
64
+ /**
65
+ * Read one pooled slot already projected onto the flat credential shape, as
66
+ * `projectSlot(await read(...), slotName)` would. Optional: a store that keeps
67
+ * configuration references in pooled keys implements it so a slot-scoped request
68
+ * resolves only the selected slot, never the flat key or a sibling.
69
+ */
70
+ readSlot?(providerId: string, slotName: string, options?: AuthOperationOptions): Promise<Credential | undefined>;
64
71
  /**
65
72
  * List stored credential metadata without resolving or exposing secrets.
66
73
  * Implementations must not execute configured API-key commands while listing.
@@ -1 +1 @@
1
- {"schemaVersion":6,"generatedAt":"2026-10-24T04:48:44.624Z","structureHash":"8fb5666d95bd0237e37d071a61b572ae5b334d3969eeb64787b4821f88268a4c","files":{"alibaba-token-plan.json":"9f4d42cc765b2a875bcdcaa392bfdc1323c88968309baf9db9f611a26c595c73","amazon-bedrock.json":"ef21ed069f5b3aedec7b60c9effc1add5629244d1d475a3a6c9576cb5576e1fe","ant-ling.json":"628feab3ef6c7d80ce96f75999804e1d9f05fec3851e5302e30fff3b69db90f6","anthropic.json":"111384e9f5845e0247bd34edf2400ef7720fcbdac140b944cf8878192d8bd6ab","azure-openai-responses.json":"11aa93686d6b8585f947287c83c3407c9de346380a32b2c058fc6cab138ce024","bai.json":"7e6861aaf27d8af34e1771c6092602194fcec0a0046e6adfab9c3ee54d32b99f","baseten.json":"5bd3c98c61769388b3724368ef964d16b7a58e41a6edcf4ebceb9d4ac0a21d3b","cerebras.json":"2eb969b2956844f9a641d3de52c19f1791293c58f607282fb3b0ebfe85ff66f8","chatgpt-subscription.json":"42b88c93d717b2a7469b71da7da5adf87347d0d9cc0f264b39117f0f940b51c0","cloudflare-ai-gateway.json":"4d821d1d0d6873240a6a7f4ba9feaade4f182ceaa0b1493f38e4973c4d05f375","cloudflare-workers-ai.json":"5e4d71ddbb66e903d98076f6de66e5627f19621e969f822a505e9d13eaf729ff","deepseek.json":"10a296fb3e898f7715c80890c8af0af4f5fd58f22dbcd6612fdc5d762157ccdc","fireworks.json":"78994dee5b97c276906ae6d182329871f2ffa86da7cf8470785b6110e1c50218","github-copilot.json":"99fc4062784d0707e7c48ed71280e2f31b133b64a2f9411d940661969d76edfe","google-vertex.json":"8f986b4aca8c685b0f3481bd252bda21e4858bf9015ad37fc5bcc44b7f01d076","google.json":"d25613a7377e81d785d571be514d67b35436511ce6946247dc66f8674e2a5035","groq.json":"087df37206e9eed8b10f1e558e4c496289bef60074b7e8afba4f20fb102b4ec2","huggingface.json":"2c78f762f4aa8d0e351f53d4c3fa971557175f315f1c6e3c63ddb45dd764151b","meta.json":"563f5ec07973f52ab8c3eb26ef91a36ad8a79e950b37174935666cdcb624bf35","minimax-cn.json":"70df757e95e9ea2275bf451956b58a746020835f6cbcbd1a644d7fad5b9941d3","minimax.json":"747038b05f4fc24e41405e8bc810f893d7d5121e214e35e6f812f775769a3806","mistral.json":"8b6dbb21d6794d3ef606147ac7b05c355748a640224da9072f1081a908fe444f","moonshotai-cn.json":"c7a21d7e70dcdf9d787690aafd99d189134fbc49342aac9dfc74c375a10252ae","moonshotai.json":"bc0754829e55c2006a933e595af0049f0a1ca743a7b288a897062a0f93f54e33","nvidia.json":"6f66192c21788b4555f7e77bd7c14201172edf355be8d318f96ff8d0d6921054","openai.json":"1f6c767cd7c46254a96c5d6a3407b2881305e9674c7defd115c37bf6cac9da60","opencode-go.json":"4a9998d6e5064a3951d8cbd53db44461d0caae72043edcc1c1e38bde77137a78","opencode.json":"24edf4269bbd6199e7fbfb15e1f4641fec103e03e3b1026d4748449c186bb4da","opengateway.json":"e7f24360205eebc967956e7a971a4c39494a20f462422c22b2581030c66b9627","openrouter.json":"321b90ac88696279664a7fec7b1795da996d30b4d3609b886106e4b71f59d34a","qwen-token-plan-cn.json":"751b18bd443fceb16659ea33013fed90fbf3bbdb4e0ffd7607c93cee2b4cf40d","qwen-token-plan-individual.json":"35ffb0ba1a1ce3f68fc73262dd5e07fbcb5bf5911ad1e6e17bc0621e2894676a","qwen-token-plan.json":"e59b0a45e238578f80d0eea937a093b9cec7cb93751ae20a9e88b16c09eb5cdd","radius.json":"59836f6b5d07f92be8b053d4eb6545d7bb958e2199c8328823cf1e5608237c60","together.json":"a68b8386a2f28f9e1570d296223fdbdc0ebcca8a322ade5b999212c0e60b772c","typesafe.json":"83409437dbf4c353ac413c0db4e7cf29902fc35e0e0197bdb4eeda2d7f3b07cd","venice.json":"efeefaa7e2919278ff01875df388aea66d280fcea26276d932ac99b1cf29418b","vercel-ai-gateway.json":"4c63039feca92d2f882944739a7c1008337d1f89232bb363d12bfc22671a5b73","xai.json":"cf3f475fe5a13625f858171900ba3456c4d95ebb0bac5060cc25e29bb31d3457","xiaomi-token-plan-ams.json":"7fa339ba5675460b1ff4e5bca9e8ad0aa60b0277d75a989b1c196aa6ca2af34d","xiaomi-token-plan-cn.json":"ef7917c6ea0d3edc655c8a52082ee5f1330658aa6f10199d8f164eb4605ef0a0","xiaomi-token-plan-sgp.json":"addda93f6b70ba879db97e3cfd2e4f2efc7cda47d7daa78c23c5b0e51162de5c","xiaomi.json":"5a42caf49d3e4d7946d60386e9899c2146bf8e3cbaff4c576ee4f49b398cc11c","zai-coding-cn.json":"2b6f85e04b5c568e320b1bde25b1c1614af9342e4c1ba0e1d5bb248aaf50cfe9","zai.json":"e9cc408e1756de8abc70148d63d89d11a63c65b7ef06ad0661cd1328e4209ba3"}}
1
+ {"schemaVersion":6,"generatedAt":"2026-10-24T13:00:52.051Z","structureHash":"8fb5666d95bd0237e37d071a61b572ae5b334d3969eeb64787b4821f88268a4c","files":{"alibaba-token-plan.json":"9f4d42cc765b2a875bcdcaa392bfdc1323c88968309baf9db9f611a26c595c73","amazon-bedrock.json":"ef21ed069f5b3aedec7b60c9effc1add5629244d1d475a3a6c9576cb5576e1fe","ant-ling.json":"628feab3ef6c7d80ce96f75999804e1d9f05fec3851e5302e30fff3b69db90f6","anthropic.json":"111384e9f5845e0247bd34edf2400ef7720fcbdac140b944cf8878192d8bd6ab","azure-openai-responses.json":"11aa93686d6b8585f947287c83c3407c9de346380a32b2c058fc6cab138ce024","bai.json":"7e6861aaf27d8af34e1771c6092602194fcec0a0046e6adfab9c3ee54d32b99f","baseten.json":"5bd3c98c61769388b3724368ef964d16b7a58e41a6edcf4ebceb9d4ac0a21d3b","cerebras.json":"2eb969b2956844f9a641d3de52c19f1791293c58f607282fb3b0ebfe85ff66f8","chatgpt-subscription.json":"42b88c93d717b2a7469b71da7da5adf87347d0d9cc0f264b39117f0f940b51c0","cloudflare-ai-gateway.json":"4d821d1d0d6873240a6a7f4ba9feaade4f182ceaa0b1493f38e4973c4d05f375","cloudflare-workers-ai.json":"5e4d71ddbb66e903d98076f6de66e5627f19621e969f822a505e9d13eaf729ff","deepseek.json":"10a296fb3e898f7715c80890c8af0af4f5fd58f22dbcd6612fdc5d762157ccdc","fireworks.json":"78994dee5b97c276906ae6d182329871f2ffa86da7cf8470785b6110e1c50218","github-copilot.json":"99fc4062784d0707e7c48ed71280e2f31b133b64a2f9411d940661969d76edfe","google-vertex.json":"8f986b4aca8c685b0f3481bd252bda21e4858bf9015ad37fc5bcc44b7f01d076","google.json":"d25613a7377e81d785d571be514d67b35436511ce6946247dc66f8674e2a5035","groq.json":"087df37206e9eed8b10f1e558e4c496289bef60074b7e8afba4f20fb102b4ec2","huggingface.json":"2c78f762f4aa8d0e351f53d4c3fa971557175f315f1c6e3c63ddb45dd764151b","meta.json":"563f5ec07973f52ab8c3eb26ef91a36ad8a79e950b37174935666cdcb624bf35","minimax-cn.json":"70df757e95e9ea2275bf451956b58a746020835f6cbcbd1a644d7fad5b9941d3","minimax.json":"747038b05f4fc24e41405e8bc810f893d7d5121e214e35e6f812f775769a3806","mistral.json":"8b6dbb21d6794d3ef606147ac7b05c355748a640224da9072f1081a908fe444f","moonshotai-cn.json":"c7a21d7e70dcdf9d787690aafd99d189134fbc49342aac9dfc74c375a10252ae","moonshotai.json":"bc0754829e55c2006a933e595af0049f0a1ca743a7b288a897062a0f93f54e33","nvidia.json":"6f66192c21788b4555f7e77bd7c14201172edf355be8d318f96ff8d0d6921054","openai.json":"1f6c767cd7c46254a96c5d6a3407b2881305e9674c7defd115c37bf6cac9da60","opencode-go.json":"4a9998d6e5064a3951d8cbd53db44461d0caae72043edcc1c1e38bde77137a78","opencode.json":"24edf4269bbd6199e7fbfb15e1f4641fec103e03e3b1026d4748449c186bb4da","opengateway.json":"e7f24360205eebc967956e7a971a4c39494a20f462422c22b2581030c66b9627","openrouter.json":"be5cd212803ef19fe3ec0cbb76c78fee4d6342d7599bacf7dc9a437e9adf8a7a","qwen-token-plan-cn.json":"751b18bd443fceb16659ea33013fed90fbf3bbdb4e0ffd7607c93cee2b4cf40d","qwen-token-plan-individual.json":"35ffb0ba1a1ce3f68fc73262dd5e07fbcb5bf5911ad1e6e17bc0621e2894676a","qwen-token-plan.json":"e59b0a45e238578f80d0eea937a093b9cec7cb93751ae20a9e88b16c09eb5cdd","radius.json":"59836f6b5d07f92be8b053d4eb6545d7bb958e2199c8328823cf1e5608237c60","together.json":"a68b8386a2f28f9e1570d296223fdbdc0ebcca8a322ade5b999212c0e60b772c","typesafe.json":"83409437dbf4c353ac413c0db4e7cf29902fc35e0e0197bdb4eeda2d7f3b07cd","venice.json":"efeefaa7e2919278ff01875df388aea66d280fcea26276d932ac99b1cf29418b","vercel-ai-gateway.json":"4c63039feca92d2f882944739a7c1008337d1f89232bb363d12bfc22671a5b73","xai.json":"cf3f475fe5a13625f858171900ba3456c4d95ebb0bac5060cc25e29bb31d3457","xiaomi-token-plan-ams.json":"7fa339ba5675460b1ff4e5bca9e8ad0aa60b0277d75a989b1c196aa6ca2af34d","xiaomi-token-plan-cn.json":"ef7917c6ea0d3edc655c8a52082ee5f1330658aa6f10199d8f164eb4605ef0a0","xiaomi-token-plan-sgp.json":"addda93f6b70ba879db97e3cfd2e4f2efc7cda47d7daa78c23c5b0e51162de5c","xiaomi.json":"5a42caf49d3e4d7946d60386e9899c2146bf8e3cbaff4c576ee4f49b398cc11c","zai-coding-cn.json":"2b6f85e04b5c568e320b1bde25b1c1614af9342e4c1ba0e1d5bb248aaf50cfe9","zai.json":"e9cc408e1756de8abc70148d63d89d11a63c65b7ef06ad0661cd1328e4209ba3"}}