adonis-ai-kit 0.0.0-stage → 1.2.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 (196) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/LICENSE +21 -0
  3. package/README.md +397 -2
  4. package/dist/commands/ai_test.d.ts +12 -0
  5. package/dist/commands/ai_test.d.ts.map +1 -0
  6. package/dist/commands/ai_test.js +98 -0
  7. package/dist/commands/ai_test.js.map +1 -0
  8. package/dist/commands/main.d.ts +14 -0
  9. package/dist/commands/main.d.ts.map +1 -0
  10. package/dist/commands/main.js +31 -0
  11. package/dist/commands/main.js.map +1 -0
  12. package/dist/commands/make_agent.d.ts +13 -0
  13. package/dist/commands/make_agent.d.ts.map +1 -0
  14. package/dist/commands/make_agent.js +116 -0
  15. package/dist/commands/make_agent.js.map +1 -0
  16. package/dist/providers/ai_provider.d.ts +23 -0
  17. package/dist/providers/ai_provider.d.ts.map +1 -0
  18. package/dist/providers/ai_provider.js +34 -0
  19. package/dist/providers/ai_provider.js.map +1 -0
  20. package/dist/services/main.d.ts +4 -0
  21. package/dist/services/main.d.ts.map +1 -0
  22. package/dist/services/main.js +7 -0
  23. package/dist/services/main.js.map +1 -0
  24. package/dist/src/acp/acp_agents.d.ts +89 -0
  25. package/dist/src/acp/acp_agents.d.ts.map +1 -0
  26. package/dist/src/acp/acp_agents.js +367 -0
  27. package/dist/src/acp/acp_agents.js.map +1 -0
  28. package/dist/src/acp/index.d.ts +4 -0
  29. package/dist/src/acp/index.d.ts.map +1 -0
  30. package/dist/src/acp/index.js +4 -0
  31. package/dist/src/acp/index.js.map +1 -0
  32. package/dist/src/acp/provider.d.ts +74 -0
  33. package/dist/src/acp/provider.d.ts.map +1 -0
  34. package/dist/src/acp/provider.js +276 -0
  35. package/dist/src/acp/provider.js.map +1 -0
  36. package/dist/src/acp/types.d.ts +128 -0
  37. package/dist/src/acp/types.d.ts.map +1 -0
  38. package/dist/src/acp/types.js +2 -0
  39. package/dist/src/acp/types.js.map +1 -0
  40. package/dist/src/agents/agent_runner.d.ts +60 -0
  41. package/dist/src/agents/agent_runner.d.ts.map +1 -0
  42. package/dist/src/agents/agent_runner.js +134 -0
  43. package/dist/src/agents/agent_runner.js.map +1 -0
  44. package/dist/src/agents/index.d.ts +4 -0
  45. package/dist/src/agents/index.d.ts.map +1 -0
  46. package/dist/src/agents/index.js +4 -0
  47. package/dist/src/agents/index.js.map +1 -0
  48. package/dist/src/agents/loader.d.ts +56 -0
  49. package/dist/src/agents/loader.d.ts.map +1 -0
  50. package/dist/src/agents/loader.js +184 -0
  51. package/dist/src/agents/loader.js.map +1 -0
  52. package/dist/src/agents/manifest.d.ts +61 -0
  53. package/dist/src/agents/manifest.d.ts.map +1 -0
  54. package/dist/src/agents/manifest.js +35 -0
  55. package/dist/src/agents/manifest.js.map +1 -0
  56. package/dist/src/ai_manager.d.ts +140 -0
  57. package/dist/src/ai_manager.d.ts.map +1 -0
  58. package/dist/src/ai_manager.js +814 -0
  59. package/dist/src/ai_manager.js.map +1 -0
  60. package/dist/src/budget/budget_allocator.d.ts +37 -0
  61. package/dist/src/budget/budget_allocator.d.ts.map +1 -0
  62. package/dist/src/budget/budget_allocator.js +98 -0
  63. package/dist/src/budget/budget_allocator.js.map +1 -0
  64. package/dist/src/budget/budget_enforcer.d.ts +70 -0
  65. package/dist/src/budget/budget_enforcer.d.ts.map +1 -0
  66. package/dist/src/budget/budget_enforcer.js +195 -0
  67. package/dist/src/budget/budget_enforcer.js.map +1 -0
  68. package/dist/src/budget/cost_tracker.d.ts +71 -0
  69. package/dist/src/budget/cost_tracker.d.ts.map +1 -0
  70. package/dist/src/budget/cost_tracker.js +199 -0
  71. package/dist/src/budget/cost_tracker.js.map +1 -0
  72. package/dist/src/budget/index.d.ts +6 -0
  73. package/dist/src/budget/index.d.ts.map +1 -0
  74. package/dist/src/budget/index.js +6 -0
  75. package/dist/src/budget/index.js.map +1 -0
  76. package/dist/src/budget/pricing.d.ts +35 -0
  77. package/dist/src/budget/pricing.d.ts.map +1 -0
  78. package/dist/src/budget/pricing.js +129 -0
  79. package/dist/src/budget/pricing.js.map +1 -0
  80. package/dist/src/budget/types.d.ts +86 -0
  81. package/dist/src/budget/types.d.ts.map +1 -0
  82. package/dist/src/budget/types.js +2 -0
  83. package/dist/src/budget/types.js.map +1 -0
  84. package/dist/src/catalog/index.d.ts +3 -0
  85. package/dist/src/catalog/index.d.ts.map +1 -0
  86. package/dist/src/catalog/index.js +3 -0
  87. package/dist/src/catalog/index.js.map +1 -0
  88. package/dist/src/catalog/models_dev.d.ts +87 -0
  89. package/dist/src/catalog/models_dev.d.ts.map +1 -0
  90. package/dist/src/catalog/models_dev.js +38 -0
  91. package/dist/src/catalog/models_dev.js.map +1 -0
  92. package/dist/src/catalog/source.d.ts +67 -0
  93. package/dist/src/catalog/source.d.ts.map +1 -0
  94. package/dist/src/catalog/source.js +678 -0
  95. package/dist/src/catalog/source.js.map +1 -0
  96. package/dist/src/circuit_breaker.d.ts +61 -0
  97. package/dist/src/circuit_breaker.d.ts.map +1 -0
  98. package/dist/src/circuit_breaker.js +217 -0
  99. package/dist/src/circuit_breaker.js.map +1 -0
  100. package/dist/src/define_config.d.ts +11 -0
  101. package/dist/src/define_config.d.ts.map +1 -0
  102. package/dist/src/define_config.js +48 -0
  103. package/dist/src/define_config.js.map +1 -0
  104. package/dist/src/error_classifier.d.ts +50 -0
  105. package/dist/src/error_classifier.d.ts.map +1 -0
  106. package/dist/src/error_classifier.js +206 -0
  107. package/dist/src/error_classifier.js.map +1 -0
  108. package/dist/src/errors.d.ts +52 -0
  109. package/dist/src/errors.d.ts.map +1 -0
  110. package/dist/src/errors.js +70 -0
  111. package/dist/src/errors.js.map +1 -0
  112. package/dist/src/guard/confirmation.d.ts +67 -0
  113. package/dist/src/guard/confirmation.d.ts.map +1 -0
  114. package/dist/src/guard/confirmation.js +180 -0
  115. package/dist/src/guard/confirmation.js.map +1 -0
  116. package/dist/src/guard/errors.d.ts +10 -0
  117. package/dist/src/guard/errors.d.ts.map +1 -0
  118. package/dist/src/guard/errors.js +14 -0
  119. package/dist/src/guard/errors.js.map +1 -0
  120. package/dist/src/guard/guard.d.ts +47 -0
  121. package/dist/src/guard/guard.d.ts.map +1 -0
  122. package/dist/src/guard/guard.js +133 -0
  123. package/dist/src/guard/guard.js.map +1 -0
  124. package/dist/src/guard/index.d.ts +7 -0
  125. package/dist/src/guard/index.d.ts.map +1 -0
  126. package/dist/src/guard/index.js +7 -0
  127. package/dist/src/guard/index.js.map +1 -0
  128. package/dist/src/guard/registry.d.ts +72 -0
  129. package/dist/src/guard/registry.d.ts.map +1 -0
  130. package/dist/src/guard/registry.js +192 -0
  131. package/dist/src/guard/registry.js.map +1 -0
  132. package/dist/src/guard/schema_registry.d.ts +37 -0
  133. package/dist/src/guard/schema_registry.d.ts.map +1 -0
  134. package/dist/src/guard/schema_registry.js +57 -0
  135. package/dist/src/guard/schema_registry.js.map +1 -0
  136. package/dist/src/guard/types.d.ts +63 -0
  137. package/dist/src/guard/types.d.ts.map +1 -0
  138. package/dist/src/guard/types.js +2 -0
  139. package/dist/src/guard/types.js.map +1 -0
  140. package/dist/src/index.d.ts +16 -0
  141. package/dist/src/index.d.ts.map +1 -0
  142. package/dist/src/index.js +14 -0
  143. package/dist/src/index.js.map +1 -0
  144. package/dist/src/logger.d.ts +7 -0
  145. package/dist/src/logger.d.ts.map +1 -0
  146. package/dist/src/logger.js +2 -0
  147. package/dist/src/logger.js.map +1 -0
  148. package/dist/src/models/catalog_resolver.d.ts +24 -0
  149. package/dist/src/models/catalog_resolver.d.ts.map +1 -0
  150. package/dist/src/models/catalog_resolver.js +66 -0
  151. package/dist/src/models/catalog_resolver.js.map +1 -0
  152. package/dist/src/models/index.d.ts +14 -0
  153. package/dist/src/models/index.d.ts.map +1 -0
  154. package/dist/src/models/index.js +8 -0
  155. package/dist/src/models/index.js.map +1 -0
  156. package/dist/src/models/keys.d.ts +9 -0
  157. package/dist/src/models/keys.d.ts.map +1 -0
  158. package/dist/src/models/keys.js +12 -0
  159. package/dist/src/models/keys.js.map +1 -0
  160. package/dist/src/models/language_model_factory.d.ts +44 -0
  161. package/dist/src/models/language_model_factory.d.ts.map +1 -0
  162. package/dist/src/models/language_model_factory.js +193 -0
  163. package/dist/src/models/language_model_factory.js.map +1 -0
  164. package/dist/src/models/model_chain.d.ts +58 -0
  165. package/dist/src/models/model_chain.d.ts.map +1 -0
  166. package/dist/src/models/model_chain.js +144 -0
  167. package/dist/src/models/model_chain.js.map +1 -0
  168. package/dist/src/models/model_ref.d.ts +12 -0
  169. package/dist/src/models/model_ref.d.ts.map +1 -0
  170. package/dist/src/models/model_ref.js +33 -0
  171. package/dist/src/models/model_ref.js.map +1 -0
  172. package/dist/src/models/protocols.d.ts +6 -0
  173. package/dist/src/models/protocols.d.ts.map +1 -0
  174. package/dist/src/models/protocols.js +33 -0
  175. package/dist/src/models/protocols.js.map +1 -0
  176. package/dist/src/models/provider_factories.d.ts +19 -0
  177. package/dist/src/models/provider_factories.d.ts.map +1 -0
  178. package/dist/src/models/provider_factories.js +70 -0
  179. package/dist/src/models/provider_factories.js.map +1 -0
  180. package/dist/src/models/types.d.ts +17 -0
  181. package/dist/src/models/types.d.ts.map +1 -0
  182. package/dist/src/models/types.js +2 -0
  183. package/dist/src/models/types.js.map +1 -0
  184. package/dist/src/response_macro.d.ts +16 -0
  185. package/dist/src/response_macro.d.ts.map +1 -0
  186. package/dist/src/response_macro.js +151 -0
  187. package/dist/src/response_macro.js.map +1 -0
  188. package/dist/src/types.d.ts +340 -0
  189. package/dist/src/types.d.ts.map +1 -0
  190. package/dist/src/types.js +2 -0
  191. package/dist/src/types.js.map +1 -0
  192. package/dist/src/usage.d.ts +13 -0
  193. package/dist/src/usage.d.ts.map +1 -0
  194. package/dist/src/usage.js +61 -0
  195. package/dist/src/usage.js.map +1 -0
  196. package/package.json +208 -4
@@ -0,0 +1,63 @@
1
+ export type { Logger } from '../logger.js';
2
+ export type ToolPermission = 'allow' | 'ask' | 'deny';
3
+ /**
4
+ * Structural shape of an AI SDK tool (v5+: `inputSchema`; legacy v4 tools used `parameters`).
5
+ * Extra keys (`outputSchema`, `providerOptions`, ...) are preserved when a tool is wrapped.
6
+ */
7
+ export interface ToolDefinition<TArgs = any, TResult = any> {
8
+ /**
9
+ * Tool description. AI SDK v7 also allows a function that builds the description
10
+ * from the call context, so both shapes are accepted.
11
+ */
12
+ description?: string | ((options: any) => string);
13
+ inputSchema?: unknown;
14
+ /** @deprecated AI SDK v4 name of `inputSchema`. */
15
+ parameters?: unknown;
16
+ execute?: (args: TArgs, options?: any) => Promise<TResult> | TResult;
17
+ [key: string]: unknown;
18
+ }
19
+ export interface PendingAction<TParams = Record<string, unknown>> {
20
+ id: string;
21
+ sessionId?: string;
22
+ toolName: string;
23
+ action: string;
24
+ params: TParams;
25
+ createdAt: number;
26
+ expiresAt: number;
27
+ status: 'pending' | 'approved' | 'rejected' | 'timeout';
28
+ reason?: string;
29
+ metadata?: Record<string, unknown>;
30
+ }
31
+ export interface ConfirmationResponse {
32
+ status: 'approved' | 'rejected' | 'timeout';
33
+ reason?: string;
34
+ }
35
+ export interface ActionGuard {
36
+ /**
37
+ * Validates tool invocation before execution.
38
+ * Returns a violation error message if rejected, or null if allowed.
39
+ *
40
+ * A guard that returns `null` may reserve capacity (e.g. a call slot). Every allowed `check()`
41
+ * is followed by exactly one `record()` (the tool ran) or one `release()` (it did not).
42
+ */
43
+ check(toolName: string, args: unknown): string | null;
44
+ /**
45
+ * Optional callback invoked after tool execution completes to record result stats.
46
+ */
47
+ record?(toolName: string, result: unknown): void;
48
+ /**
49
+ * Optional callback invoked when a call that passed `check()` was NOT executed
50
+ * (confirmation denied, timed out, aborted). Lets the guard give back reserved capacity.
51
+ */
52
+ release?(toolName: string): void;
53
+ /**
54
+ * Optional summary of guard activity (e.g. accepted count, violations).
55
+ */
56
+ summary?(): Record<string, unknown>;
57
+ }
58
+ export interface ExecutionReconciliation {
59
+ claimed: number;
60
+ verified: number;
61
+ mismatch: boolean;
62
+ }
63
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/guard/types.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAE1C,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,KAAK,GAAG,MAAM,CAAA;AAErD;;;GAGG;AACH,MAAM,WAAW,cAAc,CAAC,KAAK,GAAG,GAAG,EAAE,OAAO,GAAG,GAAG;IACxD;;;OAGG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,OAAO,EAAE,GAAG,KAAK,MAAM,CAAC,CAAA;IACjD,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,mDAAmD;IACnD,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,EAAE,GAAG,KAAK,OAAO,CAAC,OAAO,CAAC,GAAG,OAAO,CAAA;IACpE,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAED,MAAM,WAAW,aAAa,CAAC,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;IAC9D,EAAE,EAAE,MAAM,CAAA;IACV,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,QAAQ,EAAE,MAAM,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,OAAO,CAAA;IACf,SAAS,EAAE,MAAM,CAAA;IACjB,SAAS,EAAE,MAAM,CAAA;IACjB,MAAM,EAAE,SAAS,GAAG,UAAU,GAAG,UAAU,GAAG,SAAS,CAAA;IACvD,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,UAAU,GAAG,UAAU,GAAG,SAAS,CAAA;IAC3C,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B;;;;;;OAMG;IACH,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAAA;IAErD;;OAEG;IACH,MAAM,CAAC,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;IAEhD;;;OAGG;IACH,OAAO,CAAC,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;IAEhC;;OAEG;IACH,OAAO,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CACpC;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,MAAM,CAAA;IACf,QAAQ,EAAE,MAAM,CAAA;IAChB,QAAQ,EAAE,OAAO,CAAA;CAClB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/guard/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ export * from './types.js';
2
+ export type { Logger } from './logger.js';
3
+ export * from './errors.js';
4
+ export * from './error_classifier.js';
5
+ export * from './circuit_breaker.js';
6
+ export * from './define_config.js';
7
+ export * from './ai_manager.js';
8
+ export * from './response_macro.js';
9
+ export * from './catalog/index.js';
10
+ export * from './acp/index.js';
11
+ export * from './agents/index.js';
12
+ export * from './guard/index.js';
13
+ export * from './budget/index.js';
14
+ export * from './models/index.js';
15
+ export type { ToolPermission } from './guard/index.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAC1B,YAAY,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AACzC,cAAc,aAAa,CAAA;AAC3B,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA;AAGjC,YAAY,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,14 @@
1
+ export * from './types.js';
2
+ export * from './errors.js';
3
+ export * from './error_classifier.js';
4
+ export * from './circuit_breaker.js';
5
+ export * from './define_config.js';
6
+ export * from './ai_manager.js';
7
+ export * from './response_macro.js';
8
+ export * from './catalog/index.js';
9
+ export * from './acp/index.js';
10
+ export * from './agents/index.js';
11
+ export * from './guard/index.js';
12
+ export * from './budget/index.js';
13
+ export * from './models/index.js';
14
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAA;AAE1B,cAAc,aAAa,CAAA;AAC3B,cAAc,uBAAuB,CAAA;AACrC,cAAc,sBAAsB,CAAA;AACpC,cAAc,oBAAoB,CAAA;AAClC,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,mBAAmB,CAAA;AACjC,cAAc,kBAAkB,CAAA;AAChC,cAAc,mBAAmB,CAAA;AACjC,cAAc,mBAAmB,CAAA"}
@@ -0,0 +1,7 @@
1
+ export interface Logger {
2
+ debug?(message: string, ...args: unknown[]): void;
3
+ info(message: string, ...args: unknown[]): void;
4
+ warn(message: string, ...args: unknown[]): void;
5
+ error(message: string, ...args: unknown[]): void;
6
+ }
7
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,MAAM;IACrB,KAAK,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IACjD,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAC/C,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;IAC/C,KAAK,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,CAAA;CACjD"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":""}
@@ -0,0 +1,24 @@
1
+ import type { AcpRuntimeOptions } from '../acp/types.js';
2
+ import type { ModelsDevCatalog } from '../catalog/models_dev.js';
3
+ import type { ResolvedModel } from './types.js';
4
+ export interface ModelResolver {
5
+ resolve(ref?: string): Promise<ResolvedModel>;
6
+ }
7
+ export interface CatalogModelResolverOptions {
8
+ catalog: {
9
+ load(): Promise<ModelsDevCatalog>;
10
+ };
11
+ /** Model reference used when `resolve()` is called without one. */
12
+ defaultModelRef?: () => string | undefined;
13
+ /** Provider to use for refs that are not provider-prefixed. */
14
+ explicitProvider?: () => string | undefined;
15
+ /** Default: the first non-empty `process.env[name]`. */
16
+ getApiKey?: (envNames: string[]) => string | undefined;
17
+ acp?: AcpRuntimeOptions;
18
+ }
19
+ export declare class CatalogModelResolver implements ModelResolver {
20
+ private readonly options;
21
+ constructor(options: CatalogModelResolverOptions);
22
+ resolve(ref?: string): Promise<ResolvedModel>;
23
+ }
24
+ //# sourceMappingURL=catalog_resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog_resolver.d.ts","sourceRoot":"","sources":["../../../src/models/catalog_resolver.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAA;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAGhE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,MAAM,WAAW,aAAa;IAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;CAC9C;AAED,MAAM,WAAW,2BAA2B;IAC1C,OAAO,EAAE;QAAE,IAAI,IAAI,OAAO,CAAC,gBAAgB,CAAC,CAAA;KAAE,CAAA;IAC9C,mEAAmE;IACnE,eAAe,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IAC1C,+DAA+D;IAC/D,gBAAgB,CAAC,EAAE,MAAM,MAAM,GAAG,SAAS,CAAA;IAC3C,wDAAwD;IACxD,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,MAAM,GAAG,SAAS,CAAA;IACtD,GAAG,CAAC,EAAE,iBAAiB,CAAA;CACxB;AAYD,qBAAa,oBAAqB,YAAW,aAAa;IAC5C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,2BAA2B;IAE3D,OAAO,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;CAkDpD"}
@@ -0,0 +1,66 @@
1
+ import { buildAcpRuntimeConfig } from '../acp/acp_agents.js';
2
+ import { parseModelRef } from './model_ref.js';
3
+ import { resolveProviderNpm } from './protocols.js';
4
+ const ACP_NPM = '@mcpc-tech/acp-ai-provider';
5
+ function firstEnvValue(envNames) {
6
+ for (const name of envNames) {
7
+ const value = process.env[name];
8
+ if (value)
9
+ return value;
10
+ }
11
+ return undefined;
12
+ }
13
+ export class CatalogModelResolver {
14
+ options;
15
+ constructor(options) {
16
+ this.options = options;
17
+ }
18
+ async resolve(ref) {
19
+ const { options } = this;
20
+ const catalog = await options.catalog.load();
21
+ const resolved = ref || options.defaultModelRef?.();
22
+ const explicitProvider = options.explicitProvider?.();
23
+ let providerID;
24
+ let modelID;
25
+ if (resolved) {
26
+ const parsed = parseModelRef({
27
+ modelRef: resolved,
28
+ explicitProvider,
29
+ knownProviderIds: Object.keys(catalog),
30
+ });
31
+ providerID = parsed.providerId;
32
+ modelID = parsed.modelId;
33
+ if (!catalog[providerID])
34
+ throw new Error(`Unknown provider: ${providerID}`);
35
+ }
36
+ else {
37
+ providerID = explicitProvider || '';
38
+ if (!catalog[providerID])
39
+ throw new Error('A model or provider is required');
40
+ modelID = Object.keys(catalog[providerID].models)[0];
41
+ }
42
+ const provider = catalog[providerID];
43
+ if (!provider.models[modelID] && resolved && provider.models[resolved]) {
44
+ modelID = resolved;
45
+ }
46
+ const modelInfo = provider.models[modelID];
47
+ const apiKey = (options.getApiKey ?? firstEnvValue)(provider.env ?? []);
48
+ const npm = resolveProviderNpm({ npmPackage: provider.npm, protocol: provider.protocol });
49
+ if (provider.protocol === 'acp') {
50
+ const agentId = modelID || Object.keys(provider.models)[0];
51
+ const acpConfig = buildAcpRuntimeConfig(agentId, options.acp);
52
+ if (acpConfig) {
53
+ return { providerID, modelID: agentId, npm: npm || ACP_NPM, acpAgentId: agentId, acpConfig };
54
+ }
55
+ }
56
+ return {
57
+ providerID,
58
+ modelID,
59
+ apiUrl: provider.api,
60
+ npm,
61
+ apiKey,
62
+ headers: modelInfo?.headers,
63
+ };
64
+ }
65
+ }
66
+ //# sourceMappingURL=catalog_resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog_resolver.js","sourceRoot":"","sources":["../../../src/models/catalog_resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export type { ResolvedModel } from './types.js';
2
+ export { parseModelRef } from './model_ref.js';
3
+ export type { ParseModelRefOptions, ParsedModelRef } from './model_ref.js';
4
+ export { modelKeyFor, breakerKeyFor } from './keys.js';
5
+ export { PROTOCOL_TO_NPM, resolveProviderNpm } from './protocols.js';
6
+ export { BUILTIN_PROVIDER_EXPORTS, ProviderFactoryRegistry } from './provider_factories.js';
7
+ export type { ProviderFactory } from './provider_factories.js';
8
+ export { LanguageModelFactory } from './language_model_factory.js';
9
+ export type { LanguageModelFactoryOptions } from './language_model_factory.js';
10
+ export { CatalogModelResolver } from './catalog_resolver.js';
11
+ export type { CatalogModelResolverOptions, ModelResolver } from './catalog_resolver.js';
12
+ export { buildChainCandidates, runModelChain } from './model_chain.js';
13
+ export type { ChainAttempt, ChainCandidate, FallbackEvent, ModelChainOptions, } from './model_chain.js';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAC/C,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAC9C,YAAY,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAC1E,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAC3F,YAAY,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAC9D,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAClE,YAAY,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAA;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAC5D,YAAY,EAAE,2BAA2B,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AACvF,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AACtE,YAAY,EACV,YAAY,EACZ,cAAc,EACd,aAAa,EACb,iBAAiB,GAClB,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,8 @@
1
+ export { parseModelRef } from './model_ref.js';
2
+ export { modelKeyFor, breakerKeyFor } from './keys.js';
3
+ export { PROTOCOL_TO_NPM, resolveProviderNpm } from './protocols.js';
4
+ export { BUILTIN_PROVIDER_EXPORTS, ProviderFactoryRegistry } from './provider_factories.js';
5
+ export { LanguageModelFactory } from './language_model_factory.js';
6
+ export { CatalogModelResolver } from './catalog_resolver.js';
7
+ export { buildChainCandidates, runModelChain } from './model_chain.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/models/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;AAE9C,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAA;AACpE,OAAO,EAAE,wBAAwB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAE3F,OAAO,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAA;AAElE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAA;AAE5D,OAAO,EAAE,oBAAoB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA"}
@@ -0,0 +1,9 @@
1
+ import type { ResolvedModel } from './types.js';
2
+ export declare function modelKeyFor(m: Pick<ResolvedModel, 'providerID' | 'modelID'>): string;
3
+ /**
4
+ * Identity used for circuit-breaker lookups. Two credentials of the same
5
+ * provider/model are different failure domains, so a non-empty credential key
6
+ * wins; otherwise the plain `provider/model` key is used.
7
+ */
8
+ export declare function breakerKeyFor(m: Pick<ResolvedModel, 'providerID' | 'modelID' | 'credentialKey'>): string;
9
+ //# sourceMappingURL=keys.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.d.ts","sourceRoot":"","sources":["../../../src/models/keys.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,GAAG,SAAS,CAAC,GAAG,MAAM,CAEpF;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAC3B,CAAC,EAAE,IAAI,CAAC,aAAa,EAAE,YAAY,GAAG,SAAS,GAAG,eAAe,CAAC,GACjE,MAAM,CAER"}
@@ -0,0 +1,12 @@
1
+ export function modelKeyFor(m) {
2
+ return `${m.providerID}/${m.modelID}`;
3
+ }
4
+ /**
5
+ * Identity used for circuit-breaker lookups. Two credentials of the same
6
+ * provider/model are different failure domains, so a non-empty credential key
7
+ * wins; otherwise the plain `provider/model` key is used.
8
+ */
9
+ export function breakerKeyFor(m) {
10
+ return m.credentialKey ? m.credentialKey : modelKeyFor(m);
11
+ }
12
+ //# sourceMappingURL=keys.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"keys.js","sourceRoot":"","sources":["../../../src/models/keys.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,WAAW,CAAC,CAAgD;IAC1E,OAAO,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,OAAO,EAAE,CAAA;AACvC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAC3B,CAAkE;IAElE,OAAO,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAA;AAC3D,CAAC"}
@@ -0,0 +1,44 @@
1
+ import type { LanguageModel } from 'ai';
2
+ import type { AcpPermissionPolicy } from '../acp/types.js';
3
+ import type { ConfirmationService } from '../guard/confirmation.js';
4
+ import type { Logger } from '../logger.js';
5
+ import { ProviderFactoryRegistry } from './provider_factories.js';
6
+ import type { ResolvedModel } from './types.js';
7
+ export interface LanguageModelFactoryOptions {
8
+ factories?: ProviderFactoryRegistry;
9
+ /** Per-request fetch timeout. Default: 180_000 */
10
+ timeoutMs?: number;
11
+ logger?: Logger;
12
+ acp?: {
13
+ permissionPolicy?: AcpPermissionPolicy;
14
+ confirmation?: ConfirmationService;
15
+ /** Pass the full server environment to agent processes. Default: false (allowlisted variables only). */
16
+ inheritEnv?: boolean;
17
+ /** Reuse one driver (and agent process) per command and cwd. Default: true. */
18
+ shareDriver?: boolean;
19
+ };
20
+ }
21
+ export declare class LanguageModelFactory {
22
+ private readonly factories;
23
+ private readonly timeoutMs;
24
+ private readonly logger?;
25
+ private readonly acp;
26
+ private readonly drivers;
27
+ /** Unshared drivers with a call in flight; tracked so `shutdown()` can stop them. Emptied as calls end. */
28
+ private readonly unsharedDrivers;
29
+ constructor(options?: LanguageModelFactoryOptions);
30
+ create(model: ResolvedModel): Promise<LanguageModel>;
31
+ /** Stops every ACP agent process started by this factory. */
32
+ shutdown(): Promise<void>;
33
+ private createAcp;
34
+ /**
35
+ * Wraps a per-call model so its driver is tracked only while a call is in flight (so shutdown()
36
+ * can stop it) and released when the last call ends (result, error, stream end or cancel). A model
37
+ * that is never called is not tracked, so it is collected together with its driver.
38
+ */
39
+ private releaseWhenCallEnds;
40
+ /** Re-exposes a stream, calling `done` exactly once when it ends, errors or is cancelled. */
41
+ private endWith;
42
+ private createTimeoutFetch;
43
+ }
44
+ //# sourceMappingURL=language_model_factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language_model_factory.d.ts","sourceRoot":"","sources":["../../../src/models/language_model_factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,IAAI,CAAA;AAEvC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAA;AAE1D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAA;AACnE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AACjE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,MAAM,WAAW,2BAA2B;IAC1C,SAAS,CAAC,EAAE,uBAAuB,CAAA;IACnC,kDAAkD;IAClD,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,MAAM,CAAC,EAAE,MAAM,CAAA;IACf,GAAG,CAAC,EAAE;QACJ,gBAAgB,CAAC,EAAE,mBAAmB,CAAA;QACtC,YAAY,CAAC,EAAE,mBAAmB,CAAA;QAClC,wGAAwG;QACxG,UAAU,CAAC,EAAE,OAAO,CAAA;QACpB,+EAA+E;QAC/E,WAAW,CAAC,EAAE,OAAO,CAAA;KACtB,CAAA;CACF;AAqBD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyB;IACnD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAoC;IACxD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,2GAA2G;IAC3G,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAuB;gBAE3C,OAAO,GAAE,2BAAgC;IAO/C,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;IAuB1D,6DAA6D;IACvD,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;YAOjB,SAAS;IAiCvB;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IA8C3B,6FAA6F;IAC7F,OAAO,CAAC,OAAO;IAiCf,OAAO,CAAC,kBAAkB;CAqB3B"}
@@ -0,0 +1,193 @@
1
+ import { AcpDriver } from '../acp/provider.js';
2
+ import { ProviderConfigError } from '../errors.js';
3
+ import { ProviderFactoryRegistry } from './provider_factories.js';
4
+ const ACP_NPM = '@mcpc-tech/acp-ai-provider';
5
+ const DEFAULT_TIMEOUT_MS = 180_000;
6
+ function redactHeaders(headers) {
7
+ if (!headers)
8
+ return undefined;
9
+ return Object.fromEntries(Object.entries(headers).map(([key, value]) => {
10
+ const lower = key.toLowerCase();
11
+ const sensitive = lower.includes('authorization') || lower.includes('api-key') || lower.includes('x-api');
12
+ return [key, sensitive ? '***' : value];
13
+ }));
14
+ }
15
+ function requestUrl(input) {
16
+ return typeof input === 'string' ? input : input instanceof URL ? input.toString() : input.url;
17
+ }
18
+ export class LanguageModelFactory {
19
+ factories;
20
+ timeoutMs;
21
+ logger;
22
+ acp;
23
+ drivers = new Map();
24
+ /** Unshared drivers with a call in flight; tracked so `shutdown()` can stop them. Emptied as calls end. */
25
+ unsharedDrivers = new Set();
26
+ constructor(options = {}) {
27
+ this.factories = options.factories ?? new ProviderFactoryRegistry();
28
+ this.timeoutMs = options.timeoutMs ?? DEFAULT_TIMEOUT_MS;
29
+ this.logger = options.logger;
30
+ this.acp = options.acp;
31
+ }
32
+ async create(model) {
33
+ if (model.npm === ACP_NPM)
34
+ return this.createAcp(model);
35
+ if (!model.npm) {
36
+ throw new ProviderConfigError(model.providerID, `Model "${model.modelID}" has no provider package`);
37
+ }
38
+ const factory = await this.factories.get(model.npm);
39
+ this.logger?.info(`[LLM Provider] Creating SDK for ${model.providerID}/${model.modelID} (npm=${model.npm})`);
40
+ this.logger?.info(`[LLM Provider] Base URL: ${model.apiUrl}`);
41
+ this.logger?.info(`[LLM Provider] Headers: ${JSON.stringify(redactHeaders(model.headers))}`);
42
+ return factory({
43
+ name: model.providerID,
44
+ apiKey: model.apiKey,
45
+ baseURL: model.apiUrl,
46
+ headers: model.headers,
47
+ fetch: this.createTimeoutFetch(),
48
+ }).languageModel(model.modelID);
49
+ }
50
+ /** Stops every ACP agent process started by this factory. */
51
+ async shutdown() {
52
+ const drivers = [...this.drivers.values(), ...this.unsharedDrivers];
53
+ this.drivers.clear();
54
+ this.unsharedDrivers.clear();
55
+ await Promise.all(drivers.map((driver) => driver.shutdown()));
56
+ }
57
+ async createAcp(model) {
58
+ const runtime = model.acpConfig;
59
+ if (!runtime) {
60
+ throw new ProviderConfigError(model.providerID, `ACP model "${model.modelID}" requires runtime config (resolve it with buildAcpRuntimeConfig)`);
61
+ }
62
+ const agentId = model.acpAgentId ?? model.modelID;
63
+ this.logger?.info(`[LLM Provider] Creating ACP agent for ${model.providerID}/${model.modelID}`);
64
+ this.logger?.info(`[LLM Provider] ACP command: ${runtime.command} (cwd: ${runtime.cwd})`);
65
+ const key = `${runtime.command}::${runtime.cwd}`;
66
+ const shared = this.acp?.shareDriver !== false;
67
+ let driver = shared ? this.drivers.get(key) : undefined;
68
+ if (!driver) {
69
+ driver = new AcpDriver(model.providerID, {
70
+ driver: 'acp',
71
+ agentId,
72
+ permissionPolicy: this.acp?.permissionPolicy ?? 'ask',
73
+ inheritEnv: this.acp?.inheritEnv ?? false,
74
+ }, { logger: this.logger, confirmation: this.acp?.confirmation, runtime });
75
+ if (shared)
76
+ this.drivers.set(key, driver);
77
+ }
78
+ const languageModel = await driver.getModel(agentId);
79
+ return shared ? languageModel : this.releaseWhenCallEnds(driver, languageModel);
80
+ }
81
+ /**
82
+ * Wraps a per-call model so its driver is tracked only while a call is in flight (so shutdown()
83
+ * can stop it) and released when the last call ends (result, error, stream end or cancel). A model
84
+ * that is never called is not tracked, so it is collected together with its driver.
85
+ */
86
+ releaseWhenCallEnds(driver, model) {
87
+ if (typeof model !== 'object' || model === null)
88
+ return model;
89
+ let inFlight = 0;
90
+ const begin = () => {
91
+ inFlight++;
92
+ this.unsharedDrivers.add(driver);
93
+ };
94
+ // The ACP model cleans up its own agent process at the end of each turn. The driver is not shut
95
+ // down here: that would drop its provider, and a later step of the same call would then start a
96
+ // process that factory.shutdown() could no longer reach.
97
+ const end = () => {
98
+ if (--inFlight > 0)
99
+ return;
100
+ this.unsharedDrivers.delete(driver);
101
+ };
102
+ return new Proxy(model, {
103
+ get: (target, prop) => {
104
+ const value = Reflect.get(target, prop, target);
105
+ if (prop === 'doGenerate' && typeof value === 'function') {
106
+ return async (...args) => {
107
+ begin();
108
+ try {
109
+ return await value.apply(target, args);
110
+ }
111
+ finally {
112
+ end();
113
+ }
114
+ };
115
+ }
116
+ if (prop === 'doStream' && typeof value === 'function') {
117
+ return async (...args) => {
118
+ begin();
119
+ let result;
120
+ try {
121
+ result = await value.apply(target, args);
122
+ }
123
+ catch (err) {
124
+ end();
125
+ throw err;
126
+ }
127
+ return { ...result, stream: this.endWith(result.stream, end) };
128
+ };
129
+ }
130
+ return typeof value === 'function' ? value.bind(target) : value;
131
+ },
132
+ });
133
+ }
134
+ /** Re-exposes a stream, calling `done` exactly once when it ends, errors or is cancelled. */
135
+ endWith(source, done) {
136
+ const reader = source.getReader();
137
+ let finished = false;
138
+ const finish = () => {
139
+ if (finished)
140
+ return;
141
+ finished = true;
142
+ done();
143
+ };
144
+ return new ReadableStream({
145
+ async pull(controller) {
146
+ try {
147
+ const chunk = await reader.read();
148
+ if (chunk.done) {
149
+ finish();
150
+ controller.close();
151
+ }
152
+ else {
153
+ controller.enqueue(chunk.value);
154
+ }
155
+ }
156
+ catch (err) {
157
+ finish();
158
+ controller.error(err);
159
+ }
160
+ },
161
+ async cancel(reason) {
162
+ try {
163
+ await reader.cancel(reason);
164
+ }
165
+ finally {
166
+ finish();
167
+ }
168
+ },
169
+ });
170
+ }
171
+ createTimeoutFetch() {
172
+ const { timeoutMs, logger } = this;
173
+ return async (input, init) => {
174
+ const url = requestUrl(input).slice(0, 120);
175
+ const method = init?.method || 'POST';
176
+ const startMs = Date.now();
177
+ const timeout = AbortSignal.timeout(timeoutMs);
178
+ const signal = init?.signal ? AbortSignal.any([timeout, init.signal]) : timeout;
179
+ logger?.debug?.(`[LLM HTTP] ${method} ${url} | timeout=${timeoutMs}ms`);
180
+ try {
181
+ const response = await fetch(input, { ...init, signal });
182
+ logger?.debug?.(`[LLM HTTP] ${response.status} ${method} ${url} | ${Date.now() - startMs}ms`);
183
+ return response;
184
+ }
185
+ catch (err) {
186
+ const msg = err instanceof Error ? err.message : String(err);
187
+ logger?.error(`[LLM HTTP] FAILED ${method} ${url} | ${Date.now() - startMs}ms | ${msg}`);
188
+ throw err;
189
+ }
190
+ };
191
+ }
192
+ }
193
+ //# sourceMappingURL=language_model_factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"language_model_factory.js","sourceRoot":"","sources":["../../../src/models/language_model_factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAA;AAE9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAGlD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAA;AAkBjE,MAAM,OAAO,GAAG,4BAA4B,CAAA;AAC5C,MAAM,kBAAkB,GAAG,OAAO,CAAA;AAElC,SAAS,aAAa,CAAC,OAAgC;IACrD,IAAI,CAAC,OAAO;QAAE,OAAO,SAAS,CAAA;IAC9B,OAAO,MAAM,CAAC,WAAW,CACvB,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAA;QAC/B,MAAM,SAAS,GACb,KAAK,CAAC,QAAQ,CAAC,eAAe,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACzF,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC,CAAC,CACH,CAAA;AACH,CAAC;AAED,SAAS,UAAU,CAAC,KAAkC;IACpD,OAAO,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAA;AAChG,CAAC;AAED,MAAM,OAAO,oBAAoB;IACd,SAAS,CAAyB;IAClC,SAAS,CAAQ;IACjB,MAAM,CAAS;IACf,GAAG,CAAoC;IACvC,OAAO,GAAG,IAAI,GAAG,EAAqB,CAAA;IACvD,2GAA2G;IAC1F,eAAe,GAAG,IAAI,GAAG,EAAa,CAAA;IAEvD,YAAY,UAAuC,EAAE;QACnD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,IAAI,uBAAuB,EAAE,CAAA;QACnE,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,kBAAkB,CAAA;QACxD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAA;QAC5B,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAA;IACxB,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,KAAoB;QAC/B,IAAI,KAAK,CAAC,GAAG,KAAK,OAAO;YAAE,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAEvD,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACf,MAAM,IAAI,mBAAmB,CAAC,KAAK,CAAC,UAAU,EAAE,UAAU,KAAK,CAAC,OAAO,2BAA2B,CAAC,CAAA;QACrG,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QAEnD,IAAI,CAAC,MAAM,EAAE,IAAI,CACf,mCAAmC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,SAAS,KAAK,CAAC,GAAG,GAAG,CAC1F,CAAA;QACD,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,4BAA4B,KAAK,CAAC,MAAM,EAAE,CAAC,CAAA;QAC7D,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,2BAA2B,IAAI,CAAC,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,CAAA;QAE5F,OAAO,OAAO,CAAC;YACb,IAAI,EAAE,KAAK,CAAC,UAAU;YACtB,MAAM,EAAE,KAAK,CAAC,MAAM;YACpB,OAAO,EAAE,KAAK,CAAC,MAAM;YACrB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,KAAK,EAAE,IAAI,CAAC,kBAAkB,EAAE;SACjC,CAAC,CAAC,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;IACjC,CAAC;IAED,6DAA6D;IAC7D,KAAK,CAAC,QAAQ;QACZ,MAAM,OAAO,GAAG,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,eAAe,CAAC,CAAA;QACnE,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAA;QACpB,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAA;QAC5B,MAAM,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAA;IAC/D,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,KAAoB;QAC1C,MAAM,OAAO,GAAG,KAAK,CAAC,SAAS,CAAA;QAC/B,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,mBAAmB,CAC3B,KAAK,CAAC,UAAU,EAChB,cAAc,KAAK,CAAC,OAAO,mEAAmE,CAC/F,CAAA;QACH,CAAC;QAED,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,CAAA;QACjD,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,yCAAyC,KAAK,CAAC,UAAU,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC,CAAA;QAC/F,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,+BAA+B,OAAO,CAAC,OAAO,UAAU,OAAO,CAAC,GAAG,GAAG,CAAC,CAAA;QAEzF,MAAM,GAAG,GAAG,GAAG,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,GAAG,EAAE,CAAA;QAChD,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,EAAE,WAAW,KAAK,KAAK,CAAA;QAC9C,IAAI,MAAM,GAAG,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACvD,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,IAAI,SAAS,CACpB,KAAK,CAAC,UAAU,EAChB;gBACE,MAAM,EAAE,KAAK;gBACb,OAAO;gBACP,gBAAgB,EAAE,IAAI,CAAC,GAAG,EAAE,gBAAgB,IAAI,KAAK;gBACrD,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE,UAAU,IAAI,KAAK;aAC1C,EACD,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,OAAO,EAAE,CACvE,CAAA;YACD,IAAI,MAAM;gBAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAA;QAC3C,CAAC;QACD,MAAM,aAAa,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;QACpD,OAAO,MAAM,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACjF,CAAC;IAED;;;;OAIG;IACK,mBAAmB,CAAC,MAAiB,EAAE,KAAoB;QACjE,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI;YAAE,OAAO,KAAK,CAAA;QAC7D,IAAI,QAAQ,GAAG,CAAC,CAAA;QAChB,MAAM,KAAK,GAAG,GAAG,EAAE;YACjB,QAAQ,EAAE,CAAA;YACV,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,MAAM,CAAC,CAAA;QAClC,CAAC,CAAA;QACD,gGAAgG;QAChG,gGAAgG;QAChG,yDAAyD;QACzD,MAAM,GAAG,GAAG,GAAG,EAAE;YACf,IAAI,EAAE,QAAQ,GAAG,CAAC;gBAAE,OAAM;YAC1B,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;QACrC,CAAC,CAAA;QAED,OAAO,IAAI,KAAK,CAAC,KAAe,EAAE;YAChC,GAAG,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;gBACpB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;gBAC/C,IAAI,IAAI,KAAK,YAAY,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;oBACzD,OAAO,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;wBAClC,KAAK,EAAE,CAAA;wBACP,IAAI,CAAC;4BACH,OAAO,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;wBACxC,CAAC;gCAAS,CAAC;4BACT,GAAG,EAAE,CAAA;wBACP,CAAC;oBACH,CAAC,CAAA;gBACH,CAAC;gBACD,IAAI,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,KAAK,UAAU,EAAE,CAAC;oBACvD,OAAO,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;wBAClC,KAAK,EAAE,CAAA;wBACP,IAAI,MAAkC,CAAA;wBACtC,IAAI,CAAC;4BACH,MAAM,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAA;wBAC1C,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,GAAG,EAAE,CAAA;4BACL,MAAM,GAAG,CAAA;wBACX,CAAC;wBACD,OAAO,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAA;oBAChE,CAAC,CAAA;gBACH,CAAC;gBACD,OAAO,OAAO,KAAK,KAAK,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,KAAK,CAAA;YACjE,CAAC;SACF,CAAkB,CAAA;IACrB,CAAC;IAED,6FAA6F;IACrF,OAAO,CAAI,MAAyB,EAAE,IAAgB;QAC5D,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,EAAE,CAAA;QACjC,IAAI,QAAQ,GAAG,KAAK,CAAA;QACpB,MAAM,MAAM,GAAG,GAAG,EAAE;YAClB,IAAI,QAAQ;gBAAE,OAAM;YACpB,QAAQ,GAAG,IAAI,CAAA;YACf,IAAI,EAAE,CAAA;QACR,CAAC,CAAA;QACD,OAAO,IAAI,cAAc,CAAI;YAC3B,KAAK,CAAC,IAAI,CAAC,UAAU;gBACnB,IAAI,CAAC;oBACH,MAAM,KAAK,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;oBACjC,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBACf,MAAM,EAAE,CAAA;wBACR,UAAU,CAAC,KAAK,EAAE,CAAA;oBACpB,CAAC;yBAAM,CAAC;wBACN,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;oBACjC,CAAC;gBACH,CAAC;gBAAC,OAAO,GAAG,EAAE,CAAC;oBACb,MAAM,EAAE,CAAA;oBACR,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;gBACvB,CAAC;YACH,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,MAAM;gBACjB,IAAI,CAAC;oBACH,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAA;gBAC7B,CAAC;wBAAS,CAAC;oBACT,MAAM,EAAE,CAAA;gBACV,CAAC;YACH,CAAC;SACF,CAAC,CAAA;IACJ,CAAC;IAEO,kBAAkB;QACxB,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,IAAI,CAAA;QAClC,OAAO,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE;YAC3B,MAAM,GAAG,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;YAC3C,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,IAAI,MAAM,CAAA;YACrC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;YAC1B,MAAM,OAAO,GAAG,WAAW,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;YAC9C,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAA;YAE/E,MAAM,EAAE,KAAK,EAAE,CAAC,cAAc,MAAM,IAAI,GAAG,cAAc,SAAS,IAAI,CAAC,CAAA;YACvE,IAAI,CAAC;gBACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;gBACxD,MAAM,EAAE,KAAK,EAAE,CAAC,cAAc,QAAQ,CAAC,MAAM,IAAI,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,IAAI,CAAC,CAAA;gBAC7F,OAAO,QAAQ,CAAA;YACjB,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,GAAG,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;gBAC5D,MAAM,EAAE,KAAK,CAAC,qBAAqB,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,QAAQ,GAAG,EAAE,CAAC,CAAA;gBACxF,MAAM,GAAG,CAAA;YACX,CAAC;QACH,CAAC,CAAA;IACH,CAAC;CACF"}
@@ -0,0 +1,58 @@
1
+ import type { CircuitBreaker } from '../circuit_breaker.js';
2
+ import { type ErrorClass } from '../error_classifier.js';
3
+ import type { Logger } from '../logger.js';
4
+ import type { ModelResolver } from './catalog_resolver.js';
5
+ import type { ResolvedModel } from './types.js';
6
+ export type ChainCandidate = {
7
+ kind: 'resolved';
8
+ model: ResolvedModel;
9
+ key: string;
10
+ } | {
11
+ kind: 'ref';
12
+ ref: string;
13
+ key: string;
14
+ };
15
+ /**
16
+ * Builds the ordered candidate list. A non-empty `chain` is authoritative: it already encodes the
17
+ * caller's chosen order, so `primary` and `defaults` are not appended (falling through to a model
18
+ * nobody picked would trade a visible failure for a silent one). An empty chain counts as absent.
19
+ */
20
+ export declare function buildChainCandidates(input: {
21
+ chain?: ResolvedModel[];
22
+ primary?: ResolvedModel | string;
23
+ defaults?: string[];
24
+ }): ChainCandidate[];
25
+ export interface FallbackEvent {
26
+ fromModel: string;
27
+ toModel: string;
28
+ error: unknown;
29
+ errorClass: ErrorClass;
30
+ }
31
+ export interface ChainAttempt {
32
+ model: ResolvedModel;
33
+ key: string;
34
+ isFallback: boolean;
35
+ /** Call once a tool has run: the chain will not fall back after that, so side effects are not repeated. */
36
+ markToolsExecuted(): void;
37
+ }
38
+ export interface ModelChainOptions {
39
+ breaker?: CircuitBreaker;
40
+ /** Required when a candidate is a `ref`. */
41
+ resolver?: ModelResolver;
42
+ abortSignal?: AbortSignal;
43
+ /** Exceptions thrown or rejected by the handler are swallowed (logged as a warning); it is not awaited. */
44
+ onFallback?: (event: FallbackEvent) => unknown;
45
+ logger?: Logger;
46
+ }
47
+ /**
48
+ * Runs `attempt` against each candidate in order until one succeeds. Each candidate is guarded by a
49
+ * per-credential circuit breaker; a retryable failure, or a candidate that cannot be attempted (missing provider
50
+ * package, config error, open breaker), moves on to the next candidate; anything else, any failure after tools ran
51
+ * and any caller abort is thrown. An exhausted chain rethrows the last error.
52
+ */
53
+ export declare function runModelChain<T>(candidates: ChainCandidate[], attempt: (a: ChainAttempt) => Promise<T>, options?: ModelChainOptions): Promise<{
54
+ result: T;
55
+ model: ResolvedModel;
56
+ key: string;
57
+ }>;
58
+ //# sourceMappingURL=model_chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model_chain.d.ts","sourceRoot":"","sources":["../../../src/models/model_chain.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAiB,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAC1E,OAAO,EAAiB,KAAK,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEvE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAE1D,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAE/C,MAAM,MAAM,cAAc,GACtB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACvD;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAA;AAE7C;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAC1C,KAAK,CAAC,EAAE,aAAa,EAAE,CAAA;IACvB,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,CAAA;IAChC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;CACpB,GAAG,cAAc,EAAE,CAoCnB;AAED,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAA;IACjB,OAAO,EAAE,MAAM,CAAA;IACf,KAAK,EAAE,OAAO,CAAA;IACd,UAAU,EAAE,UAAU,CAAA;CACvB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,aAAa,CAAA;IACpB,GAAG,EAAE,MAAM,CAAA;IACX,UAAU,EAAE,OAAO,CAAA;IACnB,2GAA2G;IAC3G,iBAAiB,IAAI,IAAI,CAAA;CAC1B;AAED,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,cAAc,CAAA;IACxB,4CAA4C;IAC5C,QAAQ,CAAC,EAAE,aAAa,CAAA;IACxB,WAAW,CAAC,EAAE,WAAW,CAAA;IACzB,2GAA2G;IAC3G,UAAU,CAAC,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,OAAO,CAAA;IAC9C,MAAM,CAAC,EAAE,MAAM,CAAA;CAChB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAAC,CAAC,EACnC,UAAU,EAAE,cAAc,EAAE,EAC5B,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY,KAAK,OAAO,CAAC,CAAC,CAAC,EACxC,OAAO,GAAE,iBAAsB,GAC9B,OAAO,CAAC;IAAE,MAAM,EAAE,CAAC,CAAC;IAAC,KAAK,EAAE,aAAa,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC,CA4F3D"}