@tickernelz/paperclip-pro-server 2026.1014.2 → 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.
Files changed (36) hide show
  1. package/dist/build-info.json +1 -1
  2. package/dist/services/heartbeat/retries.d.ts.map +1 -1
  3. package/dist/services/heartbeat/retries.js +33 -20
  4. package/dist/services/heartbeat/retries.js.map +1 -1
  5. package/dist/services/heartbeat.d.ts.map +1 -1
  6. package/dist/services/heartbeat.js +2 -1
  7. package/dist/services/heartbeat.js.map +1 -1
  8. package/dist/services/model-fallback.d.ts +40 -24
  9. package/dist/services/model-fallback.d.ts.map +1 -1
  10. package/dist/services/model-fallback.js +93 -61
  11. package/dist/services/model-fallback.js.map +1 -1
  12. package/dist/services/model-fallback.test.js +42 -56
  13. package/dist/services/model-fallback.test.js.map +1 -1
  14. package/node_modules/qs/.github/THREAT_MODEL.md +4 -2
  15. package/node_modules/qs/CHANGELOG.md +38 -14
  16. package/node_modules/qs/README.md +31 -3
  17. package/node_modules/qs/dist/qs.js +20 -20
  18. package/node_modules/qs/lib/parse.js +94 -4
  19. package/node_modules/qs/lib/stringify.js +4 -4
  20. package/node_modules/qs/lib/utils.js +130 -6
  21. package/node_modules/qs/package.json +4 -4
  22. package/node_modules/qs/test/parse.js +174 -0
  23. package/node_modules/qs/test/stringify.js +263 -33
  24. package/node_modules/qs/test/utils.js +184 -0
  25. package/package.json +21 -21
  26. package/ui-dist/assets/{Agents.production-8FUtTpS_.js → Agents.production-BHWznw8y.js} +2 -2
  27. package/ui-dist/assets/{CompanyActivity.production-pI5bepy4.js → CompanyActivity.production-8aUIBuOH.js} +1 -1
  28. package/ui-dist/assets/{CompanyExport-CYMUQK5t.js → CompanyExport-wysQLLwi.js} +1 -1
  29. package/ui-dist/assets/{CompanySkills.production-Cx4u1ng7.js → CompanySkills.production-CeGKxxeo.js} +1 -1
  30. package/ui-dist/assets/{OrgChart.production-BfX2mFHX.js → OrgChart.production-Bv25raI7.js} +1 -1
  31. package/ui-dist/assets/{RoutineDetail.production-B4xHviF2.js → RoutineDetail.production-BP0s3T7M.js} +1 -1
  32. package/ui-dist/assets/{Routines.production-C-WFr4aR.js → Routines.production-BQL74XW8.js} +1 -1
  33. package/ui-dist/assets/{definition-BTyYsf5f.js → definition-CX59WzhL.js} +1 -1
  34. package/ui-dist/assets/{index-OBprYZQn.js → index-DvHeLBFO.js} +88 -88
  35. package/ui-dist/index.html +1 -1
  36. 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 ModelFallbackRetryPlan {
37
+ export interface ModelFallbackStepPlan {
24
38
  chain: string[];
25
- excluded: string[];
26
- next: {
27
- selector: string;
28
- cooling: boolean;
29
- availableAt: Date | null;
30
- } | null;
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
- /** Picks the model a run starts on and the order OMP may fall back through. */
41
- export declare function selectRunModel(input: {
42
- primary: string;
43
- fallbackModels: unknown;
44
- excluded: readonly string[];
45
- cooldowns: Map<string, ModelCooldown>;
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
- excluded: readonly string[];
52
- cooldowns: Map<string, ModelCooldown>;
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,sBAAsB;IACrC,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAC;QAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;KAAE,GAAG,IAAI,CAAC;CAC/E;AAsBD,yCAAyC;AACzC,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAE/E;AAED,gGAAgG;AAChG,wBAAgB,iCAAiC,CAAC,MAAM,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI,CAKhG;AAMD,wFAAwF;AACxF,wBAAgB,kCAAkC,CAChD,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACtC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EACtC,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC1C,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,OAAO,GAAG,MAAM,EAAE,CAMlF;AAOD,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,KAAK,EAAE;IACpC,OAAO,EAAE,MAAM,CAAC;IAChB,cAAc,EAAE,OAAO,CAAC;IACxB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,GAAG,EAAE,IAAI,CAAC;CACX,GAAG,iBAAiB,GAAG,IAAI,CAyB3B;AAED,+FAA+F;AAC/F,wBAAgB,0BAA0B,CAAC,KAAK,EAAE;IAChD,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IACzB,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACtC,GAAG,EAAE,IAAI,CAAC;CACX,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,WAAW,EAAE,IAAI,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAU1E;AAED,+DAA+D;AAC/D,wBAAsB,kBAAkB,CACtC,EAAE,EAAE,EAAE,EACN,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,GAAG,EAAE,IAAI,GACR,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,CAmBrC;AAED,+FAA+F;AAC/F,wBAAsB,mBAAmB,CACvC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,IAAI,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACtH,OAAO,CAAC,IAAI,CAAC,CAqBf;AAED,uGAAuG;AACvG,wBAAsB,uBAAuB,CAAC,KAAK,EAAE;IACnD,EAAE,EAAE,EAAE,CAAC;IACP,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,OAAO,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAChC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACjC,GAAG,EAAE,IAAI,CAAC;CACX,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,iBAAiB,CAAC;IAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAAA;CAAE,GAAG,IAAI,CAAC,CAqCxF;AAED,kGAAkG;AAClG,wBAAsB,4BAA4B,CAChD,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,MAAM,EACb,MAAM,EAAE;IAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,qBAAqB,GAAG,IAAI,CAAA;CAAE,GACvE,OAAO,CAAC,IAAI,CAAC,CASf;AAED,wFAAwF;AACxF,wBAAgB,kBAAkB,CAAC,GAAG,EAAE;IAAE,UAAU,EAAE,OAAO,CAAC;IAAC,eAAe,EAAE,OAAO,CAAA;CAAE,GAAG,MAAM,GAAG,IAAI,CAKxG;AAED,qFAAqF;AACrF,wBAAsB,sBAAsB,CAAC,KAAK,EAAE;IAClD,EAAE,EAAE,EAAE,CAAC;IACP,GAAG,EAAE;QAAE,SAAS,EAAE,MAAM,CAAC;QAAC,eAAe,EAAE,OAAO,CAAC;QAAC,UAAU,EAAE,OAAO,CAAA;KAAE,CAAC;IAC1E,kBAAkB,EAAE,OAAO,CAAC;IAC5B,GAAG,EAAE,IAAI,CAAC;CACX,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC,CAUzC;AAED,4CAA4C;AAC5C,wBAAgB,yBAAyB,CAAC,KAAK,EAAE;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,sBAAsB,CAAA;CAAE,GAAG,MAAM,CAExH"}
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
- /** Picks the model a run starts on and the order OMP may fall back through. */
87
- export function selectRunModel(input) {
88
- const primary = input.primary.trim();
89
- if (!primary)
90
- return null;
91
- const chain = buildModelChain(primary, input.fallbackModels);
92
- if (chain.length < 2)
93
- return null;
94
- const eligible = chain.filter((selector) => !input.excluded.includes(selector));
95
- if (eligible.length === 0) {
96
- return { primary, chain, start: primary, overlayChain: chain.slice(1), reason: null };
97
- }
98
- const free = eligible.filter((selector) => !isCooling(input.cooldowns, selector, input.now));
99
- const start = free[0] ?? [...eligible].sort((left, right) => (input.cooldowns.get(left)?.until.getTime() ?? 0) - (input.cooldowns.get(right)?.until.getTime() ?? 0))[0];
100
- const rest = eligible.filter((selector) => selector !== start);
101
- const overlayChain = [
102
- ...rest.filter((selector) => free.includes(selector)),
103
- ...rest.filter((selector) => !free.includes(selector)),
104
- ];
105
- const reason = start === primary
106
- ? null
107
- : input.excluded.includes(primary)
108
- ? "refusal"
109
- : input.cooldowns.get(primary)?.reason ?? "rate_limit";
110
- return { primary, chain, start, overlayChain, reason };
111
- }
112
- /** The candidate a Paperclip retry would start on after the given exclusions and cooldowns. */
113
- export function nextModelFallbackCandidate(input) {
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 excluded = stringList(input.context[MODEL_FALLBACK_EXCLUDED_KEY]);
178
- const cooldowns = await loadModelCooldowns(input.db, input.companyId, chain, input.now);
179
- const selection = selectRunModel({
180
- primary,
181
- fallbackModels: input.config.fallbackModels,
182
- excluded,
183
- cooldowns,
184
- now: input.now,
185
- });
186
- if (!selection)
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 (selection.start !== selection.primary && primaryEffort) {
194
+ if (start !== primary && primaryEffort) {
192
195
  input.config[AGENT_FALLBACK_EFFORTS_KEY] = {
193
196
  ...readAgentFallbackEfforts(input.config[AGENT_FALLBACK_EFFORTS_KEY]),
194
- [selection.primary]: primaryEffort,
197
+ [primary]: primaryEffort,
195
198
  };
196
199
  }
197
- const state = selection.reason
198
- ? {
199
- primaryModel: selection.primary,
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 refused = asRecord(input.run.resultJson).errorFamily === "model_refusal" ? readRunActiveModel(input.run) : null;
237
- const excluded = [...new Set([...stringList(context[MODEL_FALLBACK_EXCLUDED_KEY]), ...(refused ? [refused] : [])])];
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
- return { chain, excluded, next: nextModelFallbackCandidate({ chain, excluded, cooldowns, now: input.now }) };
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 { nextModelFallbackCandidate, normalizeAgentFallbackModelsConfig, selectRunModel, } from "./model-fallback.js";
3
+ import { modelFallbackAttemptBudget, modelFallbackAttemptLimit, normalizeAgentFallbackModelsConfig, planModelFallbackStep, readModelFallbackAttempts, } from "./model-fallback.js";
4
4
  const now = new Date("2026-10-11T10:00:00.000Z");
5
- function cooling(entries) {
6
- return new Map(entries.map(([selector, until]) => [selector, { selector, until: new Date(until), reason: "rate_limit" }]));
7
- }
8
- describe("run model selection", () => {
9
- it("returns nothing when the agent has no fallback models", () => {
10
- expect(selectRunModel({ primary: "a/x", fallbackModels: [], excluded: [], cooldowns: new Map(), now })).toBeNull();
11
- expect(selectRunModel({ primary: "a/x", fallbackModels: undefined, excluded: [], cooldowns: new Map(), now })).toBeNull();
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("uses a task override as the primary with the agent chain after it, minus duplicates", () => {
14
- const { config } = buildIssueRunAdapterConfig({ model: "a/agent", fallbackModels: ["b/one", "c/override", "d/two"] }, { adapterConfig: { model: "c/override" } });
15
- const selection = selectRunModel({
16
- primary: String(config.model),
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("starts on the first non-cooling candidate and keeps cooling ones last for OMP", () => {
26
- const selection = selectRunModel({
27
- primary: "a/x",
28
- fallbackModels: ["b/y", "c/z"],
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("returns to the primary once its cooldown has expired", () => {
44
- const selection = selectRunModel({
45
- primary: "a/x",
46
- fallbackModels: ["b/y"],
47
- excluded: [],
48
- cooldowns: cooling([["a/x", "2026-10-11T09:59:00.000Z"]]),
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("skips refused selectors and reports refusal when the primary was refused", () => {
54
- const selection = selectRunModel({ primary: "a/x", fallbackModels: ["b/y"], excluded: ["a/x"], cooldowns: new Map(), now });
55
- expect(selection).toMatchObject({ start: "b/y", overlayChain: [], reason: "refusal" });
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("picks the earliest-expiring candidate when all are cooling", () => {
58
- const cooldowns = cooling([["a/x", "2026-10-11T10:30:00.000Z"], ["b/y", "2026-10-11T10:10:00.000Z"]]);
59
- expect(selectRunModel({ primary: "a/x", fallbackModels: ["b/y"], excluded: [], cooldowns, now })?.start).toBe("b/y");
60
- expect(nextModelFallbackCandidate({ chain: ["a/x", "b/y"], excluded: [], cooldowns, now })).toEqual({
61
- selector: "b/y",
62
- cooling: true,
63
- availableAt: new Date("2026-10-11T10:10:00.000Z"),
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(nextModelFallbackCandidate({ chain: ["a/x", "b/y"], excluded: ["a/x", "b/y"], cooldowns, now })).toBeNull();
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":"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"}
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 a hard cap that rejects oversized untrusted input, opt in to `throwOnLimitExceeded: true` (default `false`), and always bound input size at the transport layer[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
+ | 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