@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.
- package/dist/auth/credential-read.d.ts +5 -0
- package/dist/auth/credential-read.js +30 -0
- package/dist/auth/resolve.js +3 -11
- package/dist/auth/types.d.ts +7 -0
- package/dist/providers/data/.manifest.json +1 -1
- package/dist/providers/data/openrouter.json +1 -1
- package/dist/utils/config-reference-error.d.ts +9 -0
- package/dist/utils/config-reference-error.js +11 -0
- package/dist/utils/config-reference.d.ts +41 -0
- package/dist/utils/config-reference.js +21 -0
- package/package.json +2 -2
|
@@ -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
|
package/dist/auth/resolve.js
CHANGED
|
@@ -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 =
|
|
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
|
package/dist/auth/types.d.ts
CHANGED
|
@@ -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-
|
|
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"}}
|