@tickernelz/paperclip-pro-server 2026.1014.1 → 2026.1015.0
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/build-info.json +1 -1
- package/dist/services/heartbeat/retries.d.ts.map +1 -1
- package/dist/services/heartbeat/retries.js +33 -20
- package/dist/services/heartbeat/retries.js.map +1 -1
- package/dist/services/heartbeat/workspaces.d.ts +3 -0
- package/dist/services/heartbeat/workspaces.d.ts.map +1 -1
- package/dist/services/heartbeat/workspaces.js +49 -1
- package/dist/services/heartbeat/workspaces.js.map +1 -1
- package/dist/services/heartbeat.d.ts.map +1 -1
- package/dist/services/heartbeat.js +2 -1
- package/dist/services/heartbeat.js.map +1 -1
- package/dist/services/model-fallback.d.ts +40 -24
- package/dist/services/model-fallback.d.ts.map +1 -1
- package/dist/services/model-fallback.js +93 -61
- package/dist/services/model-fallback.js.map +1 -1
- package/dist/services/model-fallback.test.js +42 -56
- package/dist/services/model-fallback.test.js.map +1 -1
- package/node_modules/qs/.github/THREAT_MODEL.md +4 -2
- package/node_modules/qs/CHANGELOG.md +38 -14
- package/node_modules/qs/README.md +31 -3
- package/node_modules/qs/dist/qs.js +20 -20
- package/node_modules/qs/lib/parse.js +94 -4
- package/node_modules/qs/lib/stringify.js +4 -4
- package/node_modules/qs/lib/utils.js +130 -6
- package/node_modules/qs/package.json +4 -4
- package/node_modules/qs/test/parse.js +174 -0
- package/node_modules/qs/test/stringify.js +263 -33
- package/node_modules/qs/test/utils.js +184 -0
- package/package.json +21 -21
- package/ui-dist/assets/{Agents.production-B_gOaRfn.js → Agents.production-BHWznw8y.js} +2 -2
- package/ui-dist/assets/{CompanyActivity.production-CtbE4gxO.js → CompanyActivity.production-8aUIBuOH.js} +1 -1
- package/ui-dist/assets/{CompanyExport-JuOccR7C.js → CompanyExport-wysQLLwi.js} +1 -1
- package/ui-dist/assets/{CompanySkills.production-3LEUQ24r.js → CompanySkills.production-CeGKxxeo.js} +1 -1
- package/ui-dist/assets/{OrgChart.production-B41A6MKK.js → OrgChart.production-Bv25raI7.js} +1 -1
- package/ui-dist/assets/{RoutineDetail.production-rGdQgBL_.js → RoutineDetail.production-BP0s3T7M.js} +1 -1
- package/ui-dist/assets/{Routines.production-BCxCN3wv.js → Routines.production-BQL74XW8.js} +1 -1
- package/ui-dist/assets/{definition-B8BsU-S8.js → definition-CX59WzhL.js} +1 -1
- package/ui-dist/assets/{index-D6WtpzBM.js → index-DvHeLBFO.js} +88 -88
- package/ui-dist/index.html +1 -1
- package/ui-dist/sw.js +1 -1
|
@@ -4,6 +4,20 @@ export declare const MODEL_FALLBACK_DEFAULT_COOLDOWN_MS: number;
|
|
|
4
4
|
export declare const MODEL_FALLBACK_STATE_KEY = "paperclipModelFallback";
|
|
5
5
|
export declare const MODEL_FALLBACK_PRIMARY_KEY = "paperclipPrimaryModel";
|
|
6
6
|
export declare const MODEL_FALLBACK_EXCLUDED_KEY = "paperclipModelFallbackExcluded";
|
|
7
|
+
/** Per-model attempt counts carried by a retry lineage, so a fresh wake always starts over. */
|
|
8
|
+
export declare const MODEL_FALLBACK_ATTEMPTS_KEY = "paperclipModelAttempts";
|
|
9
|
+
/** The model a retry must start on, decided by the lineage that produced it. */
|
|
10
|
+
export declare const MODEL_FALLBACK_FORCED_MODEL_KEY = "paperclipForcedModel";
|
|
11
|
+
/** Why the lineage left the primary, carried so a fallback run reports it. */
|
|
12
|
+
export declare const MODEL_FALLBACK_REASON_KEY = "paperclipFallbackReason";
|
|
13
|
+
/** The primary model is tried twice before the chain moves on. */
|
|
14
|
+
export declare const MODEL_FALLBACK_PRIMARY_ATTEMPTS = 2;
|
|
15
|
+
/** The primary retry follows its failure closely so a blip does not look like an outage. */
|
|
16
|
+
export declare const MODEL_FALLBACK_PRIMARY_RETRY_DELAY_MS = 5000;
|
|
17
|
+
/** Every later step of the chain waits one bounded interval. */
|
|
18
|
+
export declare const MODEL_FALLBACK_STEP_DELAY_MS = 30000;
|
|
19
|
+
/** Attempts the lineage may consume, carried so recovery stops escalating once it is spent. */
|
|
20
|
+
export declare const MODEL_FALLBACK_BUDGET_KEY = "paperclipModelAttemptBudget";
|
|
7
21
|
export declare const MODEL_FALLBACK_EVENT = "model.fallback";
|
|
8
22
|
export declare const MODEL_FALLBACK_RESTORED_EVENT = "model.fallback_restored";
|
|
9
23
|
export declare const MODEL_FALLBACK_EXHAUSTED_EVENT = "model.fallback_exhausted";
|
|
@@ -20,15 +34,19 @@ export interface RunModelSelection {
|
|
|
20
34
|
overlayChain: string[];
|
|
21
35
|
reason: RunModelFallbackReason | null;
|
|
22
36
|
}
|
|
23
|
-
export interface
|
|
37
|
+
export interface ModelFallbackStepPlan {
|
|
24
38
|
chain: string[];
|
|
25
|
-
|
|
26
|
-
next
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
39
|
+
attempts: Record<string, number>;
|
|
40
|
+
/** The model the next attempt must start on, or null when the chain is spent. */
|
|
41
|
+
start: string | null;
|
|
42
|
+
/** True when the primary gets its immediate second try instead of the chain advancing. */
|
|
43
|
+
fastRetry: boolean;
|
|
44
|
+
/** Attempts the whole lineage may consume, primary retry included. */
|
|
45
|
+
maxAttempts: number;
|
|
46
|
+
/** When a cooled model becomes eligible again, for reporting only. */
|
|
47
|
+
availableAt: Date | null;
|
|
31
48
|
}
|
|
49
|
+
export type ModelFallbackRetryPlan = ModelFallbackStepPlan;
|
|
32
50
|
/** Human label for a fallback reason. */
|
|
33
51
|
export declare function modelFallbackReasonLabel(reason: RunModelFallbackReason): string;
|
|
34
52
|
/** The fallback reason for a run failure family, or null when the family must not fall back. */
|
|
@@ -37,25 +55,19 @@ export declare function modelFallbackReasonForErrorFamily(family: unknown): RunM
|
|
|
37
55
|
export declare function normalizeAgentFallbackModelsConfig(adapterType: string | null | undefined, adapterConfig: Record<string, unknown>, baseAdapterConfig?: Record<string, unknown>): Record<string, unknown>;
|
|
38
56
|
/** Primary first, then the agent's fallback list, without duplicates. */
|
|
39
57
|
export declare function buildModelChain(primary: string, fallbackModels: unknown): string[];
|
|
40
|
-
/**
|
|
41
|
-
export declare function
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
now: Date;
|
|
47
|
-
}): RunModelSelection | null;
|
|
48
|
-
/** The candidate a Paperclip retry would start on after the given exclusions and cooldowns. */
|
|
49
|
-
export declare function nextModelFallbackCandidate(input: {
|
|
58
|
+
/** Attempts one selector may consume inside a lineage: the primary twice, every fallback once. */
|
|
59
|
+
export declare function modelFallbackAttemptLimit(selector: string, primary: string): number;
|
|
60
|
+
/** Attempts a whole lineage may consume: every chain entry tried to its own limit. */
|
|
61
|
+
export declare function modelFallbackAttemptBudget(chain: readonly string[], primary: string): number;
|
|
62
|
+
/** Decides the model for the next attempt; null start means the chain is spent. */
|
|
63
|
+
export declare function planModelFallbackStep(input: {
|
|
50
64
|
chain: readonly string[];
|
|
51
|
-
|
|
52
|
-
|
|
65
|
+
primary: string;
|
|
66
|
+
active: string;
|
|
67
|
+
reason: RunModelFallbackReason;
|
|
68
|
+
attempts: Readonly<Record<string, number>>;
|
|
53
69
|
now: Date;
|
|
54
|
-
}):
|
|
55
|
-
selector: string;
|
|
56
|
-
cooling: boolean;
|
|
57
|
-
availableAt: Date | null;
|
|
58
|
-
} | null;
|
|
70
|
+
}): ModelFallbackStepPlan;
|
|
59
71
|
/** Active cooldowns for the given selectors in one company. */
|
|
60
72
|
export declare function loadModelCooldowns(db: Db, companyId: string, selectors: readonly string[], now: Date): Promise<Map<string, ModelCooldown>>;
|
|
61
73
|
/** Records that a selector is cooling down for the whole company, keeping the later expiry. */
|
|
@@ -100,6 +112,10 @@ export declare function planModelFallbackRetry(input: {
|
|
|
100
112
|
agentAdapterConfig: unknown;
|
|
101
113
|
now: Date;
|
|
102
114
|
}): Promise<ModelFallbackRetryPlan | null>;
|
|
115
|
+
/** Attempts a run lineage may spend: its recorded model budget, else the adapter-agnostic budget. */
|
|
116
|
+
export declare function readModelFallbackAttemptBudget(contextSnapshot: Record<string, unknown> | null | undefined, unbudgetedAttempts: number): number;
|
|
117
|
+
/** Reads a lineage attempt map leniently: non-negative integer counts per selector. */
|
|
118
|
+
export declare function readModelFallbackAttempts(value: unknown): Record<string, number>;
|
|
103
119
|
/** Run-event message for a model switch. */
|
|
104
120
|
export declare function modelFallbackEventMessage(input: {
|
|
105
121
|
to: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-fallback.d.ts","sourceRoot":"","sources":["../../src/services/model-fallback.ts"],"names":[],"mappings":"AACA,OAAO,EAAiC,KAAK,EAAE,EAAE,MAAM,8BAA8B,CAAC;AAEtF,OAAO,EAQL,KAAK,sBAAsB,EAC3B,KAAK,qBAAqB,EAC3B,MAAM,kCAAkC,CAAC;AAE1C,eAAO,MAAM,kCAAkC,QAAa,CAAC;AAC7D,eAAO,MAAM,wBAAwB,2BAA2B,CAAC;AACjE,eAAO,MAAM,0BAA0B,0BAA0B,CAAC;AAClE,eAAO,MAAM,2BAA2B,mCAAmC,CAAC;AAC5E,eAAO,MAAM,oBAAoB,mBAAmB,CAAC;AACrD,eAAO,MAAM,6BAA6B,4BAA4B,CAAC;AACvE,eAAO,MAAM,8BAA8B,6BAA6B,CAAC;AACzE,eAAO,MAAM,8BAA8B,6BAA6B,CAAC;AAEzE,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,IAAI,CAAC;IACZ,MAAM,EAAE,sBAAsB,CAAC;CAChC;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,MAAM,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,MAAM,EAAE,sBAAsB,GAAG,IAAI,CAAC;CACvC;AAED,MAAM,WAAW,
|
|
1
|
+
{"version":3,"file":"model-fallback.d.ts","sourceRoot":"","sources":["../../src/services/model-fallback.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,6 +6,20 @@ export const MODEL_FALLBACK_DEFAULT_COOLDOWN_MS = 5 * 60_000;
|
|
|
6
6
|
export const MODEL_FALLBACK_STATE_KEY = "paperclipModelFallback";
|
|
7
7
|
export const MODEL_FALLBACK_PRIMARY_KEY = "paperclipPrimaryModel";
|
|
8
8
|
export const MODEL_FALLBACK_EXCLUDED_KEY = "paperclipModelFallbackExcluded";
|
|
9
|
+
/** Per-model attempt counts carried by a retry lineage, so a fresh wake always starts over. */
|
|
10
|
+
export const MODEL_FALLBACK_ATTEMPTS_KEY = "paperclipModelAttempts";
|
|
11
|
+
/** The model a retry must start on, decided by the lineage that produced it. */
|
|
12
|
+
export const MODEL_FALLBACK_FORCED_MODEL_KEY = "paperclipForcedModel";
|
|
13
|
+
/** Why the lineage left the primary, carried so a fallback run reports it. */
|
|
14
|
+
export const MODEL_FALLBACK_REASON_KEY = "paperclipFallbackReason";
|
|
15
|
+
/** The primary model is tried twice before the chain moves on. */
|
|
16
|
+
export const MODEL_FALLBACK_PRIMARY_ATTEMPTS = 2;
|
|
17
|
+
/** The primary retry follows its failure closely so a blip does not look like an outage. */
|
|
18
|
+
export const MODEL_FALLBACK_PRIMARY_RETRY_DELAY_MS = 5_000;
|
|
19
|
+
/** Every later step of the chain waits one bounded interval. */
|
|
20
|
+
export const MODEL_FALLBACK_STEP_DELAY_MS = 30_000;
|
|
21
|
+
/** Attempts the lineage may consume, carried so recovery stops escalating once it is spent. */
|
|
22
|
+
export const MODEL_FALLBACK_BUDGET_KEY = "paperclipModelAttemptBudget";
|
|
9
23
|
export const MODEL_FALLBACK_EVENT = "model.fallback";
|
|
10
24
|
export const MODEL_FALLBACK_RESTORED_EVENT = "model.fallback_restored";
|
|
11
25
|
export const MODEL_FALLBACK_EXHAUSTED_EVENT = "model.fallback_exhausted";
|
|
@@ -83,42 +97,34 @@ function isCooling(cooldowns, selector, now) {
|
|
|
83
97
|
const cooldown = cooldowns.get(selector);
|
|
84
98
|
return Boolean(cooldown && cooldown.until.getTime() > now.getTime());
|
|
85
99
|
}
|
|
86
|
-
/**
|
|
87
|
-
export function
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
}
|
|
98
|
-
|
|
99
|
-
const
|
|
100
|
-
const
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
const eligible = input.chain.filter((selector) => !input.excluded.includes(selector));
|
|
115
|
-
if (eligible.length === 0)
|
|
116
|
-
return null;
|
|
117
|
-
const free = eligible.find((selector) => !isCooling(input.cooldowns, selector, input.now));
|
|
118
|
-
if (free)
|
|
119
|
-
return { selector: free, cooling: false, availableAt: null };
|
|
120
|
-
const earliest = [...eligible].sort((left, right) => (input.cooldowns.get(left)?.until.getTime() ?? 0) - (input.cooldowns.get(right)?.until.getTime() ?? 0))[0];
|
|
121
|
-
return { selector: earliest, cooling: true, availableAt: input.cooldowns.get(earliest)?.until ?? null };
|
|
100
|
+
/** Attempts one selector may consume inside a lineage: the primary twice, every fallback once. */
|
|
101
|
+
export function modelFallbackAttemptLimit(selector, primary) {
|
|
102
|
+
return selector === primary ? MODEL_FALLBACK_PRIMARY_ATTEMPTS : 1;
|
|
103
|
+
}
|
|
104
|
+
/** Attempts a whole lineage may consume: every chain entry tried to its own limit. */
|
|
105
|
+
export function modelFallbackAttemptBudget(chain, primary) {
|
|
106
|
+
return chain.reduce((total, selector) => total + modelFallbackAttemptLimit(selector, primary), 0);
|
|
107
|
+
}
|
|
108
|
+
/** Decides the model for the next attempt; null start means the chain is spent. */
|
|
109
|
+
export function planModelFallbackStep(input) {
|
|
110
|
+
const chain = [...input.chain];
|
|
111
|
+
const attempts = { ...input.attempts };
|
|
112
|
+
attempts[input.active] = (attempts[input.active] ?? 0) + 1;
|
|
113
|
+
const exhausted = (selector) => (attempts[selector] ?? 0) >= modelFallbackAttemptLimit(selector, input.primary);
|
|
114
|
+
const retriesPrimary = input.reason !== "refusal" &&
|
|
115
|
+
input.active === input.primary &&
|
|
116
|
+
!exhausted(input.primary);
|
|
117
|
+
const start = retriesPrimary
|
|
118
|
+
? input.primary
|
|
119
|
+
: chain.find((selector) => selector !== input.active && !exhausted(selector)) ?? null;
|
|
120
|
+
return {
|
|
121
|
+
chain,
|
|
122
|
+
attempts,
|
|
123
|
+
start,
|
|
124
|
+
fastRetry: retriesPrimary,
|
|
125
|
+
maxAttempts: modelFallbackAttemptBudget(chain, input.primary),
|
|
126
|
+
availableAt: null,
|
|
127
|
+
};
|
|
122
128
|
}
|
|
123
129
|
/** Active cooldowns for the given selectors in one company. */
|
|
124
130
|
export async function loadModelCooldowns(db, companyId, selectors, now) {
|
|
@@ -174,33 +180,26 @@ export async function prepareRunModelFallback(input) {
|
|
|
174
180
|
const chain = primary ? buildModelChain(primary, input.config.fallbackModels) : [];
|
|
175
181
|
if (chain.length < 2)
|
|
176
182
|
return null;
|
|
177
|
-
const
|
|
178
|
-
const
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
return null;
|
|
188
|
-
input.config.model = selection.start;
|
|
189
|
-
input.config.fallbackModels = selection.overlayChain;
|
|
183
|
+
const forced = text(input.context[MODEL_FALLBACK_FORCED_MODEL_KEY]);
|
|
184
|
+
const start = forced && chain.includes(forced) ? forced : primary;
|
|
185
|
+
input.config.model = start;
|
|
186
|
+
input.config.fallbackModels = chain.filter((selector) => selector !== start);
|
|
187
|
+
const overlayChain = input.config.fallbackModels;
|
|
188
|
+
const reason = start === primary
|
|
189
|
+
? null
|
|
190
|
+
: isReason(input.context[MODEL_FALLBACK_REASON_KEY])
|
|
191
|
+
? input.context[MODEL_FALLBACK_REASON_KEY]
|
|
192
|
+
: "upstream";
|
|
190
193
|
const primaryEffort = text(input.config.thinking);
|
|
191
|
-
if (
|
|
194
|
+
if (start !== primary && primaryEffort) {
|
|
192
195
|
input.config[AGENT_FALLBACK_EFFORTS_KEY] = {
|
|
193
196
|
...readAgentFallbackEfforts(input.config[AGENT_FALLBACK_EFFORTS_KEY]),
|
|
194
|
-
[
|
|
197
|
+
[primary]: primaryEffort,
|
|
195
198
|
};
|
|
196
199
|
}
|
|
197
|
-
const
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
activeModel: selection.start,
|
|
201
|
-
reason: selection.reason,
|
|
202
|
-
switchedAt: input.now.toISOString(),
|
|
203
|
-
}
|
|
200
|
+
const selection = { primary, chain, start, overlayChain, reason };
|
|
201
|
+
const state = reason
|
|
202
|
+
? { primaryModel: primary, activeModel: start, reason, switchedAt: input.now.toISOString() }
|
|
204
203
|
: null;
|
|
205
204
|
return { selection, state };
|
|
206
205
|
}
|
|
@@ -233,10 +232,43 @@ export async function planModelFallbackRetry(input) {
|
|
|
233
232
|
const chain = buildModelChain(primary, asRecord(input.agentAdapterConfig).fallbackModels);
|
|
234
233
|
if (chain.length < 2)
|
|
235
234
|
return null;
|
|
236
|
-
const
|
|
237
|
-
|
|
235
|
+
const reason = modelFallbackReasonForErrorFamily(asRecord(input.run.resultJson).errorFamily);
|
|
236
|
+
if (!reason)
|
|
237
|
+
return null;
|
|
238
|
+
const active = readRunActiveModel(input.run) ?? primary;
|
|
239
|
+
if (!chain.includes(active))
|
|
240
|
+
return null;
|
|
241
|
+
const step = planModelFallbackStep({
|
|
242
|
+
chain,
|
|
243
|
+
primary,
|
|
244
|
+
active,
|
|
245
|
+
reason,
|
|
246
|
+
attempts: readModelFallbackAttempts(context[MODEL_FALLBACK_ATTEMPTS_KEY]),
|
|
247
|
+
now: input.now,
|
|
248
|
+
});
|
|
238
249
|
const cooldowns = await loadModelCooldowns(input.db, input.run.companyId, chain, input.now);
|
|
239
|
-
|
|
250
|
+
const availableAt = step.start ? null : cooldowns.get(primary)?.until ?? null;
|
|
251
|
+
return { ...step, availableAt };
|
|
252
|
+
}
|
|
253
|
+
/** Attempts a run lineage may spend: its recorded model budget, else the adapter-agnostic budget. */
|
|
254
|
+
export function readModelFallbackAttemptBudget(contextSnapshot, unbudgetedAttempts) {
|
|
255
|
+
const recorded = contextSnapshot?.[MODEL_FALLBACK_BUDGET_KEY];
|
|
256
|
+
if (typeof recorded !== "number" || !Number.isFinite(recorded) || recorded <= 0)
|
|
257
|
+
return unbudgetedAttempts;
|
|
258
|
+
return Math.floor(recorded);
|
|
259
|
+
}
|
|
260
|
+
/** Reads a lineage attempt map leniently: non-negative integer counts per selector. */
|
|
261
|
+
export function readModelFallbackAttempts(value) {
|
|
262
|
+
const record = asRecord(value);
|
|
263
|
+
const attempts = {};
|
|
264
|
+
for (const [selector, count] of Object.entries(record)) {
|
|
265
|
+
if (typeof count !== "number" || !Number.isFinite(count) || count < 0)
|
|
266
|
+
continue;
|
|
267
|
+
const key = selector.trim();
|
|
268
|
+
if (key)
|
|
269
|
+
attempts[key] = Math.floor(count);
|
|
270
|
+
}
|
|
271
|
+
return attempts;
|
|
240
272
|
}
|
|
241
273
|
/** Run-event message for a model switch. */
|
|
242
274
|
export function modelFallbackEventMessage(input) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-fallback.js","sourceRoot":"","sources":["../../src/services/model-fallback.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model-fallback.js","sourceRoot":"","sources":["../../src/services/model-fallback.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,68 +1,54 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { buildIssueRunAdapterConfig } from "./issue-run-model-override.js";
|
|
3
|
-
import {
|
|
3
|
+
import { modelFallbackAttemptBudget, modelFallbackAttemptLimit, normalizeAgentFallbackModelsConfig, planModelFallbackStep, readModelFallbackAttempts, } from "./model-fallback.js";
|
|
4
4
|
const now = new Date("2026-10-11T10:00:00.000Z");
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
5
|
+
describe("fallback lineage", () => {
|
|
6
|
+
const step = (input) => planModelFallbackStep({
|
|
7
|
+
chain: input.chain ?? ["a/x", "b/y", "c/z"],
|
|
8
|
+
primary: "a/x",
|
|
9
|
+
active: input.active,
|
|
10
|
+
reason: input.reason ?? "upstream",
|
|
11
|
+
attempts: input.attempts ?? {},
|
|
12
|
+
now,
|
|
12
13
|
});
|
|
13
|
-
it("
|
|
14
|
-
const
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
fallbackModels: config.fallbackModels,
|
|
18
|
-
excluded: [],
|
|
19
|
-
cooldowns: new Map(),
|
|
20
|
-
now,
|
|
21
|
-
});
|
|
22
|
-
expect(selection).toMatchObject({ primary: "c/override", start: "c/override", chain: ["c/override", "b/one", "d/two"], reason: null });
|
|
23
|
-
expect(selection?.overlayChain).toEqual(["b/one", "d/two"]);
|
|
14
|
+
it("gives the primary one fast retry before the chain moves on", () => {
|
|
15
|
+
const first = step({ active: "a/x" });
|
|
16
|
+
expect(first).toMatchObject({ start: "a/x", fastRetry: true });
|
|
17
|
+
expect(first.attempts).toEqual({ "a/x": 1 });
|
|
24
18
|
});
|
|
25
|
-
it("
|
|
26
|
-
const
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
excluded: [],
|
|
30
|
-
cooldowns: cooling([["a/x", "2026-10-11T10:05:00.000Z"], ["b/y", "2026-10-11T10:03:00.000Z"]]),
|
|
31
|
-
now,
|
|
32
|
-
});
|
|
33
|
-
expect(selection).toMatchObject({ start: "c/z", overlayChain: ["a/x", "b/y"], reason: "rate_limit" });
|
|
34
|
-
const partlyFree = selectRunModel({
|
|
35
|
-
primary: "a/x",
|
|
36
|
-
fallbackModels: ["b/y", "c/z"],
|
|
37
|
-
excluded: [],
|
|
38
|
-
cooldowns: cooling([["a/x", "2026-10-11T10:05:00.000Z"]]),
|
|
39
|
-
now,
|
|
40
|
-
});
|
|
41
|
-
expect(partlyFree).toMatchObject({ start: "b/y", overlayChain: ["c/z", "a/x"] });
|
|
19
|
+
it("falls back to the first model that has not failed once the primary is spent", () => {
|
|
20
|
+
const second = step({ active: "a/x", attempts: { "a/x": 1 } });
|
|
21
|
+
expect(second).toMatchObject({ start: "b/y", fastRetry: false });
|
|
22
|
+
expect(second.attempts).toEqual({ "a/x": 2 });
|
|
42
23
|
});
|
|
43
|
-
it("
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
now,
|
|
50
|
-
});
|
|
51
|
-
expect(selection).toMatchObject({ start: "a/x", reason: null });
|
|
24
|
+
it("never retries a fallback: one failure advances to the next model", () => {
|
|
25
|
+
expect(step({ active: "b/y", attempts: { "a/x": 2 } })).toMatchObject({ start: "c/z", fastRetry: false });
|
|
26
|
+
expect(step({ active: "c/z", attempts: { "a/x": 2, "b/y": 1 } })).toMatchObject({ start: null, fastRetry: false });
|
|
27
|
+
});
|
|
28
|
+
it("moves straight past a refusal without retrying that model", () => {
|
|
29
|
+
expect(step({ active: "a/x", reason: "refusal" })).toMatchObject({ start: "b/y", fastRetry: false });
|
|
52
30
|
});
|
|
53
|
-
it("
|
|
54
|
-
|
|
55
|
-
expect(
|
|
31
|
+
it("budgets one attempt per chain entry plus the primary retry", () => {
|
|
32
|
+
expect(step({ active: "a/x" }).maxAttempts).toBe(4);
|
|
33
|
+
expect(modelFallbackAttemptBudget(["a/x", "b/y"], "a/x")).toBe(3);
|
|
34
|
+
expect(modelFallbackAttemptLimit("a/x", "a/x")).toBe(2);
|
|
35
|
+
expect(modelFallbackAttemptLimit("b/y", "a/x")).toBe(1);
|
|
56
36
|
});
|
|
57
|
-
it("
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
37
|
+
it("keeps a task override as the primary with the agent chain after it", () => {
|
|
38
|
+
const { config } = buildIssueRunAdapterConfig({ model: "a/agent", fallbackModels: ["b/one", "c/override", "d/two"] }, { adapterConfig: { model: "c/override" } });
|
|
39
|
+
const plan = planModelFallbackStep({
|
|
40
|
+
chain: ["c/override", "b/one", "d/two"],
|
|
41
|
+
primary: String(config.model),
|
|
42
|
+
active: String(config.model),
|
|
43
|
+
reason: "rate_limit",
|
|
44
|
+
attempts: {},
|
|
45
|
+
now,
|
|
64
46
|
});
|
|
65
|
-
expect(
|
|
47
|
+
expect(plan.chain).toEqual(["c/override", "b/one", "d/two"]);
|
|
48
|
+
expect(plan.start).toBe("c/override");
|
|
49
|
+
});
|
|
50
|
+
it("reads a lineage attempt map leniently", () => {
|
|
51
|
+
expect(readModelFallbackAttempts({ "a/x": 2, "b/y": "1", "": 3, "c/z": -1 })).toEqual({ "a/x": 2 });
|
|
66
52
|
});
|
|
67
53
|
});
|
|
68
54
|
describe("agent fallback model validation", () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model-fallback.test.js","sourceRoot":"","sources":["../../src/services/model-fallback.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,0BAA0B,EAAE,MAAM,+BAA+B,CAAC;AAC3E,OAAO,EACL,0BAA0B,EAC1B,kCAAkC,EAClC,
|
|
1
|
+
{"version":3,"file":"model-fallback.test.js","sourceRoot":"","sources":["../../src/services/model-fallback.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -24,7 +24,7 @@ Caller Application → qs.stringify(obj, options) → Stringifying Engine → Ou
|
|
|
24
24
|
```
|
|
25
25
|
|
|
26
26
|
**Trust Boundaries:**
|
|
27
|
-
- **Input string (parse):** May come from untrusted sources (e.g., user input, network requests)
|
|
27
|
+
- **Input string (parse):** May come from untrusted sources (e.g., user input, network requests). `qs` defines its own key grammar, where bracket groups denote nesting, so the parameter names it derives are deliberately not the flat names produced by `URLSearchParams`, `node:querystring`, or a WHATWG-conformant parser. The parsed object, not the raw string, is the only thing a caller should make trust decisions about; see "Interpretation conflict" below.
|
|
28
28
|
- **Input object (stringify):** The calling application's own data, not a direct untrusted channel. May contain cycles (handled by the cycle detector). Deeply-nested non-cyclic input surfaces as a catchable synchronous `RangeError` (stack overflow), not unbounded resource consumption; callers that serialize externally-influenced objects should bound their depth/size beforehand.
|
|
29
29
|
- **Options:** Provided by the caller
|
|
30
30
|
- **Cycle Tracking:** Used only during stringification to detect and handle circular references
|
|
@@ -51,6 +51,7 @@ Caller Application → qs.stringify(obj, options) → Stringifying Engine → Ou
|
|
|
51
51
|
- **Information Disclosure:** Error messages may expose internal details or sensitive data.
|
|
52
52
|
- **Denial of Service:** Large or malformed input can exhaust memory or CPU.
|
|
53
53
|
- **Elevation of Privilege:** Prototype pollution can lead to unintended privilege escalation in the host application[3][4][8].
|
|
54
|
+
- **Interpretation conflict (out of scope):** An application that parses the same query string with two different parsers, and makes a trust decision on one result while consuming the other, can be attacked by any input the two parsers read differently. `qs`'s bracket grammar guarantees such inputs exist, so this is a property of the deployment, not a defect `qs` can remove. It is the calling application's responsibility to parse once and validate the parsed object.
|
|
54
55
|
|
|
55
56
|
### 6. Mitigation/Countermeasures
|
|
56
57
|
|
|
@@ -58,8 +59,9 @@ Caller Application → qs.stringify(obj, options) → Stringifying Engine → Ou
|
|
|
58
59
|
|---------------------------------------------------|---------------------|
|
|
59
60
|
| Tampering (malicious input, prototype pollution) | Strict input validation; keep `allowPrototypes: false` by default; use `plainObjects` for output; ensure builtins/globals are never modified by parse[4][8]. |
|
|
60
61
|
| Information Disclosure (error messages) | Generic error messages without stack traces or internal paths. |
|
|
61
|
-
| Denial of Service (memory/CPU exhaustion) | `arrayLimit`, `parameterLimit`, and depth limiting apply with safe defaults. Note that `arrayLimit` is a representation threshold (array vs. object), and `parameterLimit` bounds only the number of `&`-delimited parameters - neither caps the elements produced by `comma: true` splitting. For
|
|
62
|
+
| Denial of Service (memory/CPU exhaustion) | `arrayLimit`, `parameterLimit`, and depth limiting apply with safe defaults. Note that `arrayLimit` is a representation threshold (array vs. object), and `parameterLimit` bounds only the number of `&`-delimited parameters - neither caps the elements produced by `comma: true` splitting. For hard caps on the number of parameters and on each array's length, opt in to `throwOnLimitExceeded: true` (default `false`), which rejects a query string with more than `parameterLimit` parameters, or one that would produce any array longer than `arrayLimit`. `arrayLimit` applies to each array separately, including each parameter's comma-split value, so the total number of values can still reach `parameterLimit` times `arrayLimit`; always bound input size at the transport layer as well[7]. On the `stringify` side, the input is the caller's own object rather than an untrusted string, so unbounded nesting manifests as a catchable `RangeError` (stack overflow) rather than exhaustion; callers serializing externally-influenced objects should bound depth/size beforehand, and may opt into `stringify`'s `depth` option (default `Infinity`) for a deterministic, catchable error. |
|
|
62
63
|
| Elevation of Privilege (prototype pollution) | Keep `allowPrototypes: false`; validate options against allowlist; use `plainObjects` to avoid prototype pollution[4][8]. |
|
|
64
|
+
| Interpretation conflict (validate-then-use across two parsers) | None available inside `qs`, by construction: `qs` and a flat parser disagree about parameter names for well-formed input, so no hardening can make the two views equal. Parse untrusted input once, with `qs`, and apply deny lists, authorization, and signature checks to the parsed object rather than to raw key text. Text that `qs` cannot place in its grammar is currently dropped, so distinct raw names can share one parsed path ([#619](https://github.com/ljharb/qs/issues/619)). |
|
|
63
65
|
|
|
64
66
|
### 7. Risk Ranking
|
|
65
67
|
|