Skip to content

Commit 287ab97

Browse files
committed
fix(secrets): reject provider limit violations
1 parent ce7d5b8 commit 287ab97

2 files changed

Lines changed: 38 additions & 0 deletions

File tree

src/secrets/resolve.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,7 @@ async function resolveExecRefs(params: {
511511
const ids = uniqueStrings(params.refs.map((ref) => ref.id));
512512
if (ids.length > params.limits.maxRefsPerProvider) {
513513
throw providerResolutionError({
514+
code: "SECRET_PROVIDER_INVALID",
514515
source: "exec",
515516
provider: params.providerName,
516517
message: `Exec provider "${params.providerName}" exceeded maxRefsPerProvider (${params.limits.maxRefsPerProvider}).`,
@@ -544,6 +545,7 @@ async function resolveExecRefs(params: {
544545
const input = JSON.stringify(requestPayload);
545546
if (Buffer.byteLength(input, "utf8") > params.limits.maxBatchBytes) {
546547
throw providerResolutionError({
548+
code: "SECRET_PROVIDER_INVALID",
547549
source: "exec",
548550
provider: params.providerName,
549551
message: `Exec provider "${params.providerName}" request exceeded maxBatchBytes (${params.limits.maxBatchBytes}).`,
@@ -763,6 +765,7 @@ function createProviderResolutionTasks(params: {
763765
(group) => async (): Promise<{ group: ProviderRefGroup; values: ProviderResolutionOutput }> => {
764766
if (group.refs.length > params.limits.maxRefsPerProvider) {
765767
throw providerResolutionError({
768+
code: "SECRET_PROVIDER_INVALID",
766769
source: group.source,
767770
provider: group.providerName,
768771
message: `Secret provider "${group.providerName}" exceeded maxRefsPerProvider (${params.limits.maxRefsPerProvider}).`,

src/secrets/runtime.test.ts

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,41 @@ describe("secrets runtime snapshot", () => {
439439
).rejects.toThrow("Env secret reference id must match");
440440
});
441441

442+
it("keeps provider resolution limit violations fail-closed", async () => {
443+
await expect(
444+
prepareSecretsRuntimeSnapshot({
445+
config: asConfig({
446+
secrets: {
447+
resolution: { maxRefsPerProvider: 1 },
448+
},
449+
models: {
450+
providers: {
451+
openai: {
452+
apiKey: { source: "env", provider: "default", id: "OPENAI_API_KEY" },
453+
baseUrl: "https://api.openai.com/v1",
454+
models: [],
455+
},
456+
},
457+
},
458+
messages: {
459+
tts: {
460+
providers: {
461+
elevenlabs: { apiKey: TTS_REF },
462+
},
463+
},
464+
},
465+
}),
466+
env: {
467+
OPENAI_API_KEY: "test-openai-api-key",
468+
ELEVENLABS_API_KEY: "test-elevenlabs-api-key",
469+
},
470+
includeAuthStoreRefs: false,
471+
allowUnavailableSecretOwners: true,
472+
loadablePluginOrigins: EMPTY_LOADABLE_PLUGIN_ORIGINS,
473+
}),
474+
).rejects.toThrow('Secret provider "default" exceeded maxRefsPerProvider (1).');
475+
});
476+
442477
it("keeps unconfigured SecretRef provider aliases fail-closed", async () => {
443478
await expect(
444479
prepareSecretsRuntimeSnapshot({

0 commit comments

Comments
 (0)