@zhixuan92/multi-model-agent-core 0.4.0 → 1.1.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 (128) hide show
  1. package/README.md +33 -93
  2. package/dist/config/load.js +9 -9
  3. package/dist/config/load.js.map +1 -1
  4. package/dist/config/schema.d.ts +169 -275
  5. package/dist/config/schema.d.ts.map +1 -1
  6. package/dist/config/schema.js +31 -40
  7. package/dist/config/schema.js.map +1 -1
  8. package/dist/cost/cost-meter.d.ts +13 -0
  9. package/dist/cost/cost-meter.d.ts.map +1 -0
  10. package/dist/cost/cost-meter.js +20 -0
  11. package/dist/cost/cost-meter.js.map +1 -0
  12. package/dist/delegate-with-escalation.d.ts +1 -28
  13. package/dist/delegate-with-escalation.d.ts.map +1 -1
  14. package/dist/delegate-with-escalation.js +9 -89
  15. package/dist/delegate-with-escalation.js.map +1 -1
  16. package/dist/error-codes.d.ts +4 -0
  17. package/dist/error-codes.d.ts.map +1 -0
  18. package/dist/error-codes.js +16 -0
  19. package/dist/error-codes.js.map +1 -0
  20. package/dist/index.d.ts +5 -5
  21. package/dist/index.d.ts.map +1 -1
  22. package/dist/index.js +4 -5
  23. package/dist/index.js.map +1 -1
  24. package/dist/model-profiles.json +10 -5
  25. package/dist/provider.d.ts +2 -2
  26. package/dist/provider.d.ts.map +1 -1
  27. package/dist/provider.js +10 -13
  28. package/dist/provider.js.map +1 -1
  29. package/dist/readiness/normalization-budget.d.ts +2 -0
  30. package/dist/readiness/normalization-budget.d.ts.map +1 -0
  31. package/dist/readiness/normalization-budget.js +9 -0
  32. package/dist/readiness/normalization-budget.js.map +1 -0
  33. package/dist/readiness/normalize-brief.d.ts +17 -0
  34. package/dist/readiness/normalize-brief.d.ts.map +1 -0
  35. package/dist/readiness/normalize-brief.js +124 -0
  36. package/dist/readiness/normalize-brief.js.map +1 -0
  37. package/dist/readiness/readiness.d.ts +16 -0
  38. package/dist/readiness/readiness.d.ts.map +1 -0
  39. package/dist/readiness/readiness.js +160 -0
  40. package/dist/readiness/readiness.js.map +1 -0
  41. package/dist/reporting/structured-report.d.ts +18 -0
  42. package/dist/reporting/structured-report.d.ts.map +1 -0
  43. package/dist/reporting/structured-report.js +100 -0
  44. package/dist/reporting/structured-report.js.map +1 -0
  45. package/dist/review/aggregate-result.d.ts +3 -0
  46. package/dist/review/aggregate-result.d.ts.map +1 -0
  47. package/dist/review/aggregate-result.js +31 -0
  48. package/dist/review/aggregate-result.js.map +1 -0
  49. package/dist/review/quality-reviewer.d.ts +13 -0
  50. package/dist/review/quality-reviewer.d.ts.map +1 -0
  51. package/dist/review/quality-reviewer.js +39 -0
  52. package/dist/review/quality-reviewer.js.map +1 -0
  53. package/dist/review/reviewer-prompt.d.ts +10 -0
  54. package/dist/review/reviewer-prompt.d.ts.map +1 -0
  55. package/dist/review/reviewer-prompt.js +58 -0
  56. package/dist/review/reviewer-prompt.js.map +1 -0
  57. package/dist/review/spec-reviewer.d.ts +13 -0
  58. package/dist/review/spec-reviewer.d.ts.map +1 -0
  59. package/dist/review/spec-reviewer.js +37 -0
  60. package/dist/review/spec-reviewer.js.map +1 -0
  61. package/dist/routing/model-profiles.d.ts +5 -0
  62. package/dist/routing/model-profiles.d.ts.map +1 -1
  63. package/dist/routing/model-profiles.js +5 -0
  64. package/dist/routing/model-profiles.js.map +1 -1
  65. package/dist/routing/resolve-agent.d.ts +8 -0
  66. package/dist/routing/resolve-agent.d.ts.map +1 -0
  67. package/dist/routing/resolve-agent.js +45 -0
  68. package/dist/routing/resolve-agent.js.map +1 -0
  69. package/dist/run-tasks.d.ts +0 -23
  70. package/dist/run-tasks.d.ts.map +1 -1
  71. package/dist/run-tasks.js +241 -72
  72. package/dist/run-tasks.js.map +1 -1
  73. package/dist/runners/claude-runner.d.ts +2 -2
  74. package/dist/runners/claude-runner.d.ts.map +1 -1
  75. package/dist/runners/claude-runner.js +76 -28
  76. package/dist/runners/claude-runner.js.map +1 -1
  77. package/dist/runners/codex-runner.d.ts +2 -2
  78. package/dist/runners/codex-runner.d.ts.map +1 -1
  79. package/dist/runners/codex-runner.js +77 -24
  80. package/dist/runners/codex-runner.js.map +1 -1
  81. package/dist/runners/openai-runner.d.ts +2 -2
  82. package/dist/runners/openai-runner.d.ts.map +1 -1
  83. package/dist/runners/openai-runner.js +141 -22
  84. package/dist/runners/openai-runner.js.map +1 -1
  85. package/dist/runners/prevention.d.ts +2 -0
  86. package/dist/runners/prevention.d.ts.map +1 -1
  87. package/dist/runners/prevention.js +12 -0
  88. package/dist/runners/prevention.js.map +1 -1
  89. package/dist/runners/supervision.d.ts +1 -5
  90. package/dist/runners/supervision.d.ts.map +1 -1
  91. package/dist/runners/supervision.js +0 -68
  92. package/dist/runners/supervision.js.map +1 -1
  93. package/dist/tools/call-cache.d.ts +16 -0
  94. package/dist/tools/call-cache.d.ts.map +1 -0
  95. package/dist/tools/call-cache.js +28 -0
  96. package/dist/tools/call-cache.js.map +1 -0
  97. package/dist/tools/claude-adapter.d.ts +2 -2
  98. package/dist/tools/claude-adapter.d.ts.map +1 -1
  99. package/dist/tools/claude-adapter.js +12 -5
  100. package/dist/tools/claude-adapter.js.map +1 -1
  101. package/dist/tools/definitions.d.ts +4 -0
  102. package/dist/tools/definitions.d.ts.map +1 -1
  103. package/dist/tools/definitions.js +4 -0
  104. package/dist/tools/definitions.js.map +1 -1
  105. package/dist/tools/openai-adapter.d.ts +4 -4
  106. package/dist/tools/openai-adapter.d.ts.map +1 -1
  107. package/dist/tools/openai-adapter.js +9 -2
  108. package/dist/tools/openai-adapter.js.map +1 -1
  109. package/dist/types.d.ts +79 -31
  110. package/dist/types.d.ts.map +1 -1
  111. package/dist/types.js.map +1 -1
  112. package/package.json +48 -16
  113. package/dist/routing/capabilities.d.ts +0 -3
  114. package/dist/routing/capabilities.d.ts.map +0 -1
  115. package/dist/routing/capabilities.js +0 -26
  116. package/dist/routing/capabilities.js.map +0 -1
  117. package/dist/routing/get-provider-eligibility.d.ts +0 -8
  118. package/dist/routing/get-provider-eligibility.d.ts.map +0 -1
  119. package/dist/routing/get-provider-eligibility.js +0 -53
  120. package/dist/routing/get-provider-eligibility.js.map +0 -1
  121. package/dist/routing/resolve-task-capabilities.d.ts +0 -7
  122. package/dist/routing/resolve-task-capabilities.d.ts.map +0 -1
  123. package/dist/routing/resolve-task-capabilities.js +0 -19
  124. package/dist/routing/resolve-task-capabilities.js.map +0 -1
  125. package/dist/routing/select-provider-for-task.d.ts +0 -18
  126. package/dist/routing/select-provider-for-task.d.ts.map +0 -1
  127. package/dist/routing/select-provider-for-task.js +0 -50
  128. package/dist/routing/select-provider-for-task.js.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../../src/routing/capabilities.ts"],"names":[],"mappings":"AAEA,MAAM,iBAAiB,GAAiB,CAAC,WAAW,EAAE,YAAY,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAEpF,MAAM,UAAU,mBAAmB,CAAC,MAAsB;IACxD,MAAM,IAAI,GAAiB,CAAC,GAAG,iBAAiB,CAAC,CAAC;IAElD,IAAI,MAAM,CAAC,aAAa,KAAK,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACrB,CAAC;IAED,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,OAAO,CAAC,CAAC,CAAC;YACb,MAAM,MAAM,GAAG,MAAM,CAAC,WAAW,IAAI,CAAC,YAAY,CAAC,CAAC;YACpD,IAAI,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC3D,MAAM;QACR,CAAC;QACD,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,WAAW,CAAC,CAAC;YACrC,MAAM;QACR,CAAC;QACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;YACzB,IAAI,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC;gBAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAC/E,MAAM;QACR,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC;AACnC,CAAC"}
@@ -1,8 +0,0 @@
1
- import type { MultiModelConfig, ProviderEligibility, TaskSpec } from '../types.js';
2
- /**
3
- * Returns structured eligibility report for every configured provider.
4
- * Each entry states whether the provider is eligible and, if not, which
5
- * specific checks failed and why.
6
- */
7
- export declare function getProviderEligibility(task: TaskSpec, config: MultiModelConfig): ProviderEligibility[];
8
- //# sourceMappingURL=get-provider-eligibility.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-provider-eligibility.d.ts","sourceRoot":"","sources":["../../src/routing/get-provider-eligibility.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAEV,gBAAgB,EAEhB,mBAAmB,EACnB,QAAQ,EAET,MAAM,aAAa,CAAC;AAMrB;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,GACvB,mBAAmB,EAAE,CA+CvB"}
@@ -1,53 +0,0 @@
1
- import { resolveTaskCapabilities } from './resolve-task-capabilities.js';
2
- import { findModelProfile } from './model-profiles.js';
3
- const TIER_ORDER = { trivial: 0, standard: 1, reasoning: 2 };
4
- /**
5
- * Returns structured eligibility report for every configured provider.
6
- * Each entry states whether the provider is eligible and, if not, which
7
- * specific checks failed and why.
8
- */
9
- export function getProviderEligibility(task, config) {
10
- return Object.entries(config.providers).map(([name, providerConfig]) => {
11
- const reasons = [];
12
- // Capability check
13
- const caps = resolveTaskCapabilities(providerConfig, {
14
- tools: task.tools ?? 'full',
15
- sandboxPolicy: task.sandboxPolicy ?? providerConfig.sandboxPolicy,
16
- });
17
- const missing = task.requiredCapabilities.filter((c) => !caps.includes(c));
18
- if (missing.length > 0) {
19
- reasons.push({
20
- check: 'capability',
21
- detail: `missing: ${missing.join(', ')}`,
22
- message: `Provider "${name}" cannot satisfy requiredCapabilities: ${missing.join(', ')}.`,
23
- });
24
- }
25
- // Tier check
26
- const profile = findModelProfile(providerConfig.model);
27
- const requiredTierOrder = TIER_ORDER[task.tier];
28
- const providerTierOrder = TIER_ORDER[profile.tier];
29
- if (providerTierOrder < requiredTierOrder) {
30
- reasons.push({
31
- check: 'tier',
32
- detail: `provider tier: ${profile.tier}, required: ${task.tier}`,
33
- message: `Provider "${name}" (${profile.tier}) is below required tier ${task.tier}.`,
34
- });
35
- }
36
- // OpenAI-compatible requires baseUrl (but this is caught by schema at parse time,
37
- // so we surface it here as a sanity check)
38
- if (providerConfig.type === 'openai-compatible' && !providerConfig.baseUrl) {
39
- reasons.push({
40
- check: 'missing_required_field',
41
- detail: 'baseUrl is missing',
42
- message: `Provider "${name}" (openai-compatible) is missing required field: baseUrl.`,
43
- });
44
- }
45
- return {
46
- name,
47
- config: providerConfig,
48
- eligible: reasons.length === 0,
49
- reasons,
50
- };
51
- });
52
- }
53
- //# sourceMappingURL=get-provider-eligibility.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"get-provider-eligibility.js","sourceRoot":"","sources":["../../src/routing/get-provider-eligibility.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAwB,MAAM,qBAAqB,CAAC;AAE7E,MAAM,UAAU,GAAyB,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;AAEnF;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAc,EACd,MAAwB;IAExB,OAAO,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,EAAuB,EAAE;QAC1F,MAAM,OAAO,GAAyB,EAAE,CAAC;QAEzC,mBAAmB;QACnB,MAAM,IAAI,GAAG,uBAAuB,CAAC,cAAc,EAAE;YACnD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,MAAM;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,cAAc,CAAC,aAAa;SAClE,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,YAAY;gBACnB,MAAM,EAAE,YAAY,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBACxC,OAAO,EAAE,aAAa,IAAI,0CAA0C,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;aAC1F,CAAC,CAAC;QACL,CAAC;QAED,aAAa;QACb,MAAM,OAAO,GAAG,gBAAgB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChD,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,iBAAiB,GAAG,iBAAiB,EAAE,CAAC;YAC1C,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,MAAM;gBACb,MAAM,EAAE,kBAAkB,OAAO,CAAC,IAAI,eAAe,IAAI,CAAC,IAAI,EAAE;gBAChE,OAAO,EAAE,aAAa,IAAI,MAAM,OAAO,CAAC,IAAI,4BAA4B,IAAI,CAAC,IAAI,GAAG;aACrF,CAAC,CAAC;QACL,CAAC;QAED,kFAAkF;QAClF,2CAA2C;QAC3C,IAAI,cAAc,CAAC,IAAI,KAAK,mBAAmB,IAAI,CAAC,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3E,OAAO,CAAC,IAAI,CAAC;gBACX,KAAK,EAAE,wBAAwB;gBAC/B,MAAM,EAAE,oBAAoB;gBAC5B,OAAO,EAAE,aAAa,IAAI,2DAA2D;aACtF,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,IAAI;YACJ,MAAM,EAAE,cAAc;YACtB,QAAQ,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;YAC9B,OAAO;SACR,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -1,7 +0,0 @@
1
- import type { Capability, ProviderConfig, RunOptions } from '../types.js';
2
- /**
3
- * Returns the capabilities a task will have at runtime, accounting for
4
- * tools, sandboxPolicy, and hosted tools overrides.
5
- */
6
- export declare function resolveTaskCapabilities(providerConfig: ProviderConfig, options: Pick<RunOptions, 'tools' | 'sandboxPolicy'>): Capability[];
7
- //# sourceMappingURL=resolve-task-capabilities.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-task-capabilities.d.ts","sourceRoot":"","sources":["../../src/routing/resolve-task-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG1E;;;GAGG;AACH,wBAAgB,uBAAuB,CACrC,cAAc,EAAE,cAAc,EAC9B,OAAO,EAAE,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,eAAe,CAAC,GACnD,UAAU,EAAE,CAad"}
@@ -1,19 +0,0 @@
1
- import { getBaseCapabilities } from './capabilities.js';
2
- /**
3
- * Returns the capabilities a task will have at runtime, accounting for
4
- * tools, sandboxPolicy, and hosted tools overrides.
5
- */
6
- export function resolveTaskCapabilities(providerConfig, options) {
7
- // If tools are disabled for this task, no capabilities are offered.
8
- if (options.tools === 'none')
9
- return [];
10
- // Merge the per-task sandboxPolicy override (if any) into a config snapshot
11
- // before asking getBaseCapabilities. The provider's persisted config is NOT
12
- // mutated.
13
- const mergedConfig = {
14
- ...providerConfig,
15
- sandboxPolicy: options.sandboxPolicy ?? providerConfig.sandboxPolicy,
16
- };
17
- return getBaseCapabilities(mergedConfig);
18
- }
19
- //# sourceMappingURL=resolve-task-capabilities.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"resolve-task-capabilities.js","sourceRoot":"","sources":["../../src/routing/resolve-task-capabilities.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAExD;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CACrC,cAA8B,EAC9B,OAAoD;IAEpD,oEAAoE;IACpE,IAAI,OAAO,CAAC,KAAK,KAAK,MAAM;QAAE,OAAO,EAAE,CAAC;IAExC,4EAA4E;IAC5E,4EAA4E;IAC5E,WAAW;IACX,MAAM,YAAY,GAAmB;QACnC,GAAG,cAAc;QACjB,aAAa,EAAE,OAAO,CAAC,aAAa,IAAI,cAAc,CAAC,aAAa;KACrE,CAAC;IAEF,OAAO,mBAAmB,CAAC,YAAY,CAAC,CAAC;AAC3C,CAAC"}
@@ -1,18 +0,0 @@
1
- import type { ProviderConfig, TaskSpec, MultiModelConfig } from '../types.js';
2
- export interface SelectedProvider {
3
- name: string;
4
- config: ProviderConfig;
5
- }
6
- /**
7
- * Select which provider to use for a task (when provider is omitted).
8
- * Algorithm:
9
- * 1. Capability filter (HARD): exclude providers missing any requiredCapability.
10
- * 2. Tier filter (HARD): exclude providers whose findModelProfile(model).tier < task.tier.
11
- * Tier ordering: trivial < standard < reasoning.
12
- * 3. Cost preference (STRONG): among remainder, select cheapest costTier.
13
- * 4. Tiebreaker: ASCII/lexicographic by provider name.
14
- *
15
- * Returns null if no provider passes all filters.
16
- */
17
- export declare function selectProviderForTask(task: TaskSpec, config: MultiModelConfig): SelectedProvider | null;
18
- //# sourceMappingURL=select-provider-for-task.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"select-provider-for-task.d.ts","sourceRoot":"","sources":["../../src/routing/select-provider-for-task.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAI9E,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,EAAE,cAAc,CAAA;CACvB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,QAAQ,EACd,MAAM,EAAE,gBAAgB,GACvB,gBAAgB,GAAG,IAAI,CAsCzB"}
@@ -1,50 +0,0 @@
1
- import { resolveTaskCapabilities } from './resolve-task-capabilities.js';
2
- import { findModelProfile, getEffectiveCostTier } from './model-profiles.js';
3
- /**
4
- * Select which provider to use for a task (when provider is omitted).
5
- * Algorithm:
6
- * 1. Capability filter (HARD): exclude providers missing any requiredCapability.
7
- * 2. Tier filter (HARD): exclude providers whose findModelProfile(model).tier < task.tier.
8
- * Tier ordering: trivial < standard < reasoning.
9
- * 3. Cost preference (STRONG): among remainder, select cheapest costTier.
10
- * 4. Tiebreaker: ASCII/lexicographic by provider name.
11
- *
12
- * Returns null if no provider passes all filters.
13
- */
14
- export function selectProviderForTask(task, config) {
15
- const TIER_ORDER = { trivial: 0, standard: 1, reasoning: 2 };
16
- const eligible = [];
17
- for (const [name, providerConfig] of Object.entries(config.providers)) {
18
- // 1. Capability check
19
- const caps = resolveTaskCapabilities(providerConfig, {
20
- tools: task.tools ?? 'full',
21
- sandboxPolicy: task.sandboxPolicy ?? providerConfig.sandboxPolicy,
22
- });
23
- const missing = task.requiredCapabilities.filter((c) => !caps.includes(c));
24
- if (missing.length > 0)
25
- continue;
26
- // 2. Tier check
27
- const profile = findModelProfile(providerConfig.model);
28
- const requiredTierOrder = TIER_ORDER[task.tier] ?? 0;
29
- const providerTierOrder = TIER_ORDER[profile.tier] ?? 0;
30
- if (providerTierOrder < requiredTierOrder)
31
- continue;
32
- // Passed both filters — track for cost comparison
33
- const costTier = getEffectiveCostTier(providerConfig);
34
- eligible.push({ name, config: providerConfig, costTier });
35
- }
36
- if (eligible.length === 0)
37
- return null;
38
- // 3. Sort by cost tier: free < low < medium < high
39
- const COST_ORDER = { free: 0, low: 1, medium: 2, high: 3 };
40
- eligible.sort((a, b) => {
41
- const costDiff = (COST_ORDER[a.costTier] ?? 3) - (COST_ORDER[b.costTier] ?? 3);
42
- if (costDiff !== 0)
43
- return costDiff;
44
- // 4. Tiebreaker: provider name ascending
45
- return a.name.localeCompare(b.name);
46
- });
47
- const winner = eligible[0];
48
- return { name: winner.name, config: winner.config };
49
- }
50
- //# sourceMappingURL=select-provider-for-task.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"select-provider-for-task.js","sourceRoot":"","sources":["../../src/routing/select-provider-for-task.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,uBAAuB,EAAE,MAAM,gCAAgC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAO7E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,qBAAqB,CACnC,IAAc,EACd,MAAwB;IAExB,MAAM,UAAU,GAA2B,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;IAErF,MAAM,QAAQ,GAAiE,EAAE,CAAC;IAElF,KAAK,MAAM,CAAC,IAAI,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QACtE,sBAAsB;QACtB,MAAM,IAAI,GAAG,uBAAuB,CAAC,cAAc,EAAE;YACnD,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,MAAM;YAC3B,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,cAAc,CAAC,aAAa;SAClE,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS;QAEjC,gBAAgB;QAChB,MAAM,OAAO,GAAG,gBAAgB,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QACvD,MAAM,iBAAiB,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrD,MAAM,iBAAiB,GAAG,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,iBAAiB,GAAG,iBAAiB;YAAE,SAAS;QAEpD,kDAAkD;QAClD,MAAM,QAAQ,GAAG,oBAAoB,CAAC,cAAc,CAAC,CAAC;QACtD,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,cAAc,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC5D,CAAC;IAED,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEvC,mDAAmD;IACnD,MAAM,UAAU,GAA2B,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IACnF,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;QAC/E,IAAI,QAAQ,KAAK,CAAC;YAAE,OAAO,QAAQ,CAAC;QACpC,yCAAyC;QACzC,OAAO,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC;AACtD,CAAC"}