@uluops/core 0.5.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 (167) hide show
  1. package/README.md +543 -0
  2. package/definitions/starter/code-validator.agent.yaml +134 -0
  3. package/definitions/starter/docs-validator.agent.yaml +142 -0
  4. package/definitions/starter/public-interface-validator.agent.yaml +138 -0
  5. package/definitions/starter/security-analyst.agent.yaml +144 -0
  6. package/definitions/starter/test-architect.agent.yaml +137 -0
  7. package/dist/ai/AIProvider.d.ts +198 -0
  8. package/dist/ai/AIProvider.d.ts.map +1 -0
  9. package/dist/ai/AIProvider.js +557 -0
  10. package/dist/ai/AIProvider.js.map +1 -0
  11. package/dist/ai/ModelCatalog.d.ts +78 -0
  12. package/dist/ai/ModelCatalog.d.ts.map +1 -0
  13. package/dist/ai/ModelCatalog.js +193 -0
  14. package/dist/ai/ModelCatalog.js.map +1 -0
  15. package/dist/ai/ShellExecutor.d.ts +42 -0
  16. package/dist/ai/ShellExecutor.d.ts.map +1 -0
  17. package/dist/ai/ShellExecutor.js +62 -0
  18. package/dist/ai/ShellExecutor.js.map +1 -0
  19. package/dist/ai/TokenBudgetTracker.d.ts +49 -0
  20. package/dist/ai/TokenBudgetTracker.d.ts.map +1 -0
  21. package/dist/ai/TokenBudgetTracker.js +61 -0
  22. package/dist/ai/TokenBudgetTracker.js.map +1 -0
  23. package/dist/ai/ToolAdapter.d.ts +25 -0
  24. package/dist/ai/ToolAdapter.d.ts.map +1 -0
  25. package/dist/ai/ToolAdapter.js +135 -0
  26. package/dist/ai/ToolAdapter.js.map +1 -0
  27. package/dist/ai/index.d.ts +6 -0
  28. package/dist/ai/index.d.ts.map +1 -0
  29. package/dist/ai/index.js +4 -0
  30. package/dist/ai/index.js.map +1 -0
  31. package/dist/client/UluOpsClient.d.ts +111 -0
  32. package/dist/client/UluOpsClient.d.ts.map +1 -0
  33. package/dist/client/UluOpsClient.js +329 -0
  34. package/dist/client/UluOpsClient.js.map +1 -0
  35. package/dist/constants.d.ts +6 -0
  36. package/dist/constants.d.ts.map +1 -0
  37. package/dist/constants.js +9 -0
  38. package/dist/constants.js.map +1 -0
  39. package/dist/errors/UluOpsError.d.ts +10 -0
  40. package/dist/errors/UluOpsError.d.ts.map +1 -0
  41. package/dist/errors/UluOpsError.js +13 -0
  42. package/dist/errors/UluOpsError.js.map +1 -0
  43. package/dist/errors/index.d.ts +64 -0
  44. package/dist/errors/index.d.ts.map +1 -0
  45. package/dist/errors/index.js +93 -0
  46. package/dist/errors/index.js.map +1 -0
  47. package/dist/executor/AgentExecutor.d.ts +57 -0
  48. package/dist/executor/AgentExecutor.d.ts.map +1 -0
  49. package/dist/executor/AgentExecutor.js +331 -0
  50. package/dist/executor/AgentExecutor.js.map +1 -0
  51. package/dist/executor/CommandExecutor.d.ts +33 -0
  52. package/dist/executor/CommandExecutor.d.ts.map +1 -0
  53. package/dist/executor/CommandExecutor.js +183 -0
  54. package/dist/executor/CommandExecutor.js.map +1 -0
  55. package/dist/executor/PipelineExecutor.d.ts +55 -0
  56. package/dist/executor/PipelineExecutor.d.ts.map +1 -0
  57. package/dist/executor/PipelineExecutor.js +273 -0
  58. package/dist/executor/PipelineExecutor.js.map +1 -0
  59. package/dist/executor/ToolHandler.d.ts +47 -0
  60. package/dist/executor/ToolHandler.d.ts.map +1 -0
  61. package/dist/executor/ToolHandler.js +615 -0
  62. package/dist/executor/ToolHandler.js.map +1 -0
  63. package/dist/executor/WorkflowExecutor.d.ts +55 -0
  64. package/dist/executor/WorkflowExecutor.d.ts.map +1 -0
  65. package/dist/executor/WorkflowExecutor.js +368 -0
  66. package/dist/executor/WorkflowExecutor.js.map +1 -0
  67. package/dist/executor/preflight.d.ts +8 -0
  68. package/dist/executor/preflight.d.ts.map +1 -0
  69. package/dist/executor/preflight.js +102 -0
  70. package/dist/executor/preflight.js.map +1 -0
  71. package/dist/executor/symbols.d.ts +13 -0
  72. package/dist/executor/symbols.d.ts.map +1 -0
  73. package/dist/executor/symbols.js +102 -0
  74. package/dist/executor/symbols.js.map +1 -0
  75. package/dist/index.d.ts +32 -0
  76. package/dist/index.d.ts.map +1 -0
  77. package/dist/index.js +25 -0
  78. package/dist/index.js.map +1 -0
  79. package/dist/parser/OutputExtractor.d.ts +52 -0
  80. package/dist/parser/OutputExtractor.d.ts.map +1 -0
  81. package/dist/parser/OutputExtractor.js +818 -0
  82. package/dist/parser/OutputExtractor.js.map +1 -0
  83. package/dist/parser/outputSchemas.d.ts +223 -0
  84. package/dist/parser/outputSchemas.d.ts.map +1 -0
  85. package/dist/parser/outputSchemas.js +73 -0
  86. package/dist/parser/outputSchemas.js.map +1 -0
  87. package/dist/registry/RegistryClient.d.ts +75 -0
  88. package/dist/registry/RegistryClient.d.ts.map +1 -0
  89. package/dist/registry/RegistryClient.js +419 -0
  90. package/dist/registry/RegistryClient.js.map +1 -0
  91. package/dist/registry/index.d.ts +2 -0
  92. package/dist/registry/index.d.ts.map +1 -0
  93. package/dist/registry/index.js +2 -0
  94. package/dist/registry/index.js.map +1 -0
  95. package/dist/types/agent.d.ts +406 -0
  96. package/dist/types/agent.d.ts.map +1 -0
  97. package/dist/types/agent.js +2 -0
  98. package/dist/types/agent.js.map +1 -0
  99. package/dist/types/ai.d.ts +14 -0
  100. package/dist/types/ai.d.ts.map +1 -0
  101. package/dist/types/ai.js +2 -0
  102. package/dist/types/ai.js.map +1 -0
  103. package/dist/types/command.d.ts +153 -0
  104. package/dist/types/command.d.ts.map +1 -0
  105. package/dist/types/command.js +2 -0
  106. package/dist/types/command.js.map +1 -0
  107. package/dist/types/config.d.ts +136 -0
  108. package/dist/types/config.d.ts.map +1 -0
  109. package/dist/types/config.js +2 -0
  110. package/dist/types/config.js.map +1 -0
  111. package/dist/types/execution.d.ts +172 -0
  112. package/dist/types/execution.d.ts.map +1 -0
  113. package/dist/types/execution.js +2 -0
  114. package/dist/types/execution.js.map +1 -0
  115. package/dist/types/index.d.ts +12 -0
  116. package/dist/types/index.d.ts.map +1 -0
  117. package/dist/types/index.js +2 -0
  118. package/dist/types/index.js.map +1 -0
  119. package/dist/types/parser.d.ts +75 -0
  120. package/dist/types/parser.d.ts.map +1 -0
  121. package/dist/types/parser.js +2 -0
  122. package/dist/types/parser.js.map +1 -0
  123. package/dist/types/pipeline.d.ts +155 -0
  124. package/dist/types/pipeline.d.ts.map +1 -0
  125. package/dist/types/pipeline.js +2 -0
  126. package/dist/types/pipeline.js.map +1 -0
  127. package/dist/types/registry.d.ts +232 -0
  128. package/dist/types/registry.d.ts.map +1 -0
  129. package/dist/types/registry.js +2 -0
  130. package/dist/types/registry.js.map +1 -0
  131. package/dist/types/tools.d.ts +29 -0
  132. package/dist/types/tools.d.ts.map +1 -0
  133. package/dist/types/tools.js +2 -0
  134. package/dist/types/tools.js.map +1 -0
  135. package/dist/types/validation.d.ts +237 -0
  136. package/dist/types/validation.d.ts.map +1 -0
  137. package/dist/types/validation.js +2 -0
  138. package/dist/types/validation.js.map +1 -0
  139. package/dist/types/workflow.d.ts +131 -0
  140. package/dist/types/workflow.d.ts.map +1 -0
  141. package/dist/types/workflow.js +2 -0
  142. package/dist/types/workflow.js.map +1 -0
  143. package/dist/utils/formatError.d.ts +6 -0
  144. package/dist/utils/formatError.d.ts.map +1 -0
  145. package/dist/utils/formatError.js +10 -0
  146. package/dist/utils/formatError.js.map +1 -0
  147. package/dist/utils/parseRef.d.ts +11 -0
  148. package/dist/utils/parseRef.d.ts.map +1 -0
  149. package/dist/utils/parseRef.js +16 -0
  150. package/dist/utils/parseRef.js.map +1 -0
  151. package/dist/utils/sumTokenMetrics.d.ts +9 -0
  152. package/dist/utils/sumTokenMetrics.d.ts.map +1 -0
  153. package/dist/utils/sumTokenMetrics.js +20 -0
  154. package/dist/utils/sumTokenMetrics.js.map +1 -0
  155. package/dist/utils/topoSort.d.ts +24 -0
  156. package/dist/utils/topoSort.d.ts.map +1 -0
  157. package/dist/utils/topoSort.js +60 -0
  158. package/dist/utils/topoSort.js.map +1 -0
  159. package/dist/validation/ValidationClient.d.ts +51 -0
  160. package/dist/validation/ValidationClient.d.ts.map +1 -0
  161. package/dist/validation/ValidationClient.js +179 -0
  162. package/dist/validation/ValidationClient.js.map +1 -0
  163. package/dist/validation/index.d.ts +2 -0
  164. package/dist/validation/index.d.ts.map +1 -0
  165. package/dist/validation/index.js +2 -0
  166. package/dist/validation/index.js.map +1 -0
  167. package/package.json +76 -0
@@ -0,0 +1,557 @@
1
+ import { generateText, Output, NoObjectGeneratedError, stepCountIs } from 'ai';
2
+ import { createAnthropic } from '@ai-sdk/anthropic';
3
+ import { createOpenAI } from '@ai-sdk/openai';
4
+ import { createGoogleGenerativeAI } from '@ai-sdk/google';
5
+ import { formatErrorMessage } from '../utils/formatError.js';
6
+ import { executeShellAsString, executeShellAsOpenAIResult } from './ShellExecutor.js';
7
+ import { SdkApiError, RateLimitError, UnauthorizedError, ForbiddenError, ServiceUnavailableError, TimeoutError, ConfigurationError, } from '../errors/index.js';
8
+ /**
9
+ * Multi-provider AI SDK wrapper with registry-backed model resolution.
10
+ *
11
+ * Wraps Vercel AI SDK v6 to provide:
12
+ * - Registry-backed model alias resolution (sonnet → anthropic:claude-sonnet-4-5-20250929)
13
+ * - Multi-provider support (Anthropic + OpenAI + Google bundled, others via dynamic import)
14
+ * - Capability pre-flight checks (tools, vision, streaming, extendedThinking)
15
+ * - Unified generation with automatic tool loops
16
+ * - Automatic prompt caching for Anthropic system messages
17
+ * - Extended thinking auto-enabled for capable Anthropic models
18
+ * - Reasoning effort auto-set for capable OpenAI models
19
+ * - Provider-defined tool support (Anthropic bash, OpenAI shell)
20
+ * - Error mapping to UluOps error types
21
+ * - Usage metrics in UluOps format (including OpenAI reasoning + Google thinking tokens)
22
+ */
23
+ export class AIProvider {
24
+ config;
25
+ catalog;
26
+ logger;
27
+ /** Factory name overrides for providers that don't follow the `create<Name>` convention */
28
+ static FACTORY_NAME_OVERRIDES = {
29
+ google: 'createGoogleGenerativeAI',
30
+ };
31
+ /**
32
+ * Allowlist of valid provider names for dynamic import.
33
+ * Prevents path traversal via crafted provider strings (CWE-829).
34
+ */
35
+ static VALID_DYNAMIC_PROVIDERS = new Set([
36
+ 'anthropic', 'openai', 'google', 'mistral', 'cohere', 'groq', 'xai', 'deepseek',
37
+ ]);
38
+ /** Initialized AI SDK provider factories, keyed by provider name */
39
+ providers = new Map();
40
+ /** Anthropic provider instance for accessing provider-defined tools */
41
+ anthropicInstance;
42
+ /** OpenAI provider instance for accessing provider-defined tools */
43
+ openaiInstance;
44
+ /** Google provider instance for future provider-defined tools (googleSearch, codeExecution) */
45
+ // @ts-expect-error Reserved for future Google tool integration (googleSearch, codeExecution, urlContext)
46
+ googleInstance;
47
+ constructor(config, catalog, logger) {
48
+ this.config = config;
49
+ this.catalog = catalog;
50
+ this.logger = logger;
51
+ this.initializeProviders(config.ai);
52
+ }
53
+ /**
54
+ * Generate text with automatic tool loop handling.
55
+ *
56
+ * Resolution flow:
57
+ * 1. Resolve model alias → provider:modelId via ModelCatalog
58
+ * 2. Validate required capabilities (if specified)
59
+ * 3. Get AI SDK LanguageModel from provider factory
60
+ * 4. Build provider options (cache control, thinking, etc.)
61
+ * 5. Call generateText with maxSteps for automatic tool loop
62
+ */
63
+ async generate(options) {
64
+ // Apply model override if configured
65
+ const modelInput = this.config.ai.modelOverride ?? options.model;
66
+ // Resolve alias → provider:modelId with capability check
67
+ const resolved = await this.catalog.resolve(modelInput, {
68
+ requiredCapabilities: options.requiredCapabilities,
69
+ });
70
+ // Ensure provider is loaded (for dynamic providers)
71
+ await this.ensureProvider(resolved.provider);
72
+ // Get provider factory
73
+ const factory = this.getProviderFactory(resolved.provider);
74
+ const languageModel = factory(resolved.providerModelId);
75
+ // Build provider-specific options (thinking, caching, etc.)
76
+ const providerOptions = this.buildProviderOptions(resolved, options.providerOptions);
77
+ // Build system message with cache control for Anthropic
78
+ const system = this.buildSystemMessage(resolved.provider, options.system);
79
+ // Log pre-generation context
80
+ this.logger.info(`Model: ${resolved.provider}:${resolved.modelId} (from "${modelInput}")`);
81
+ this.logger.debug(`System prompt: ${options.system.length} chars`);
82
+ this.logger.debug(`User prompt: ${options.prompt.length} chars`);
83
+ if (options.tools) {
84
+ this.logger.debug(`Tools: ${Object.keys(options.tools).join(', ')}`);
85
+ }
86
+ this.logger.debug(`Config: maxTokens=${options.maxTokens ?? 8192}, maxSteps=${options.maxSteps ?? 50}, temp=${options.temperature ?? 0}`);
87
+ // Determine if structured output should be used
88
+ const useStructuredOutput = !!options.output
89
+ && resolved.capabilities.structuredOutput;
90
+ if (options.output && !resolved.capabilities.structuredOutput) {
91
+ this.logger.info(`Model ${resolved.modelId} does not support structured output — falling back to free-form extraction`);
92
+ }
93
+ try {
94
+ let stepCount = 0;
95
+ const budgetTracker = options.budgetTracker;
96
+ // Build prepareStep for budget-based wrap-up
97
+ const prepareStep = options.contextBudget
98
+ ? this.buildBudgetPrepareStep(options.contextBudget)
99
+ : undefined;
100
+ const maxSteps = options.maxSteps ?? 50;
101
+ const result = await generateText({
102
+ model: languageModel,
103
+ system,
104
+ prompt: options.prompt,
105
+ tools: options.tools,
106
+ maxOutputTokens: options.maxTokens ?? 8192,
107
+ // +2 when structured output: +1 for the output generation step, +1 buffer
108
+ stopWhen: stepCountIs(maxSteps + (useStructuredOutput ? 2 : 0)),
109
+ temperature: options.temperature ?? 0,
110
+ abortSignal: options.timeoutMs
111
+ ? AbortSignal.timeout(options.timeoutMs)
112
+ : undefined,
113
+ ...(providerOptions ? { providerOptions } : {}),
114
+ ...(prepareStep ? { prepareStep } : {}),
115
+ ...(useStructuredOutput ? { output: Output.object(options.output) } : {}),
116
+ onStepFinish: (step) => {
117
+ stepCount++;
118
+ const toolNames = step.toolCalls?.map(tc => tc.toolName) ?? [];
119
+ const usage = step.usage;
120
+ const textLen = step.text?.length ?? 0;
121
+ this.logger.info(`Step ${stepCount}: ${step.finishReason}` +
122
+ (toolNames.length > 0 ? ` | tools: [${toolNames.join(', ')}]` : '') +
123
+ ` | usage: ${usage.inputTokens ?? 0}in/${usage.outputTokens ?? 0}out` +
124
+ (textLen > 0 ? ` | text: ${textLen} chars` : ''));
125
+ // Update budget tracker for get_token_budget tool
126
+ if (budgetTracker) {
127
+ budgetTracker.update(usage.inputTokens ?? 0, usage.outputTokens ?? 0);
128
+ }
129
+ },
130
+ });
131
+ // Count tool calls across all steps
132
+ const toolCallCount = result.steps.reduce((sum, step) => sum + (step.toolCalls?.length ?? 0), 0);
133
+ const usage = this.mapUsage(result.usage, result.providerMetadata);
134
+ this.logger.info(`Complete: ${result.steps.length} steps, ${toolCallCount} tool calls, finish=${result.finishReason}`);
135
+ this.logger.info(`Usage: ${usage.input_tokens}in / ${usage.output_tokens}out` +
136
+ (usage.cache_creation_input_tokens ? ` / cache_write=${usage.cache_creation_input_tokens}` : '') +
137
+ (usage.cache_read_input_tokens ? ` / cache_read=${usage.cache_read_input_tokens}` : '') +
138
+ (usage.thinking_tokens ? ` / thinking=${usage.thinking_tokens}` : ''));
139
+ return {
140
+ text: result.text,
141
+ usage,
142
+ toolCallCount,
143
+ model: `${resolved.provider}:${resolved.modelId}`,
144
+ provider: resolved.provider,
145
+ steps: result.steps.length,
146
+ finishReason: result.finishReason,
147
+ structuredOutput: useStructuredOutput ? result.output : undefined,
148
+ };
149
+ }
150
+ catch (error) {
151
+ // If structured output fails, extract from the error's preserved text
152
+ // instead of re-running the entire generation (which would double cost).
153
+ if (useStructuredOutput && NoObjectGeneratedError.isInstance(error)) {
154
+ this.logger.warn(`Structured output generation failed — falling back to text extraction: ${error.message}`);
155
+ return {
156
+ text: error.text ?? '',
157
+ structuredOutput: undefined,
158
+ usage: this.mapUsage(error.usage ?? { inputTokens: 0, outputTokens: 0 }),
159
+ toolCallCount: 0,
160
+ model: `${resolved.provider}:${resolved.modelId}`,
161
+ provider: resolved.provider,
162
+ steps: 0,
163
+ finishReason: error.finishReason ?? 'error',
164
+ };
165
+ }
166
+ throw this.mapError(error, options.timeoutMs);
167
+ }
168
+ }
169
+ /**
170
+ * Resolve model alias and ensure provider is loaded.
171
+ * @internal Used by AgentExecutor for early provider detection.
172
+ */
173
+ async resolveModel(input, opts) {
174
+ const resolved = await this.catalog.resolve(input, opts);
175
+ await this.ensureProvider(resolved.provider);
176
+ return resolved;
177
+ }
178
+ /**
179
+ * Create provider-defined shell tool for the resolved model's provider.
180
+ *
181
+ * - Anthropic: bash_20250124 (Claude's built-in bash knowledge) — returns string
182
+ * - OpenAI: openai.tools.shell() with local execution — returns structured output
183
+ *
184
+ * Returns undefined if the model's provider has no shell tool support or
185
+ * the provider instance is not available.
186
+ */
187
+ createProviderShellTool(provider, targetDir, timeoutMs = 30_000) {
188
+ if (provider === 'anthropic' && this.anthropicInstance) {
189
+ return {
190
+ bash: this.anthropicInstance.tools.bash_20250124({
191
+ execute: async ({ command }) => executeShellAsString(command, targetDir, timeoutMs),
192
+ }),
193
+ };
194
+ }
195
+ if (provider === 'openai' && this.openaiInstance) {
196
+ // Type assertion needed: OpenAI provider-defined tool uses a specific
197
+ // FlexibleSchema<{action: ...}> that doesn't widen to ToolSet's generic
198
+ // Tool<any, any> due to schema symbol variance. Safe at runtime.
199
+ return {
200
+ shell: this.openaiInstance.tools.shell({
201
+ execute: async ({ action }) => executeShellAsOpenAIResult(action, targetDir, timeoutMs),
202
+ }),
203
+ };
204
+ }
205
+ return undefined;
206
+ }
207
+ // ─────────────────────────────────────────────────────────────────────────
208
+ // Provider Options
209
+ // ─────────────────────────────────────────────────────────────────────────
210
+ /**
211
+ * Build system message with provider-specific cache control.
212
+ *
213
+ * For Anthropic: wraps system text in a SystemModelMessage with
214
+ * ephemeral cache control. The API ignores cache hints if the
215
+ * prompt is below the minimum cacheable length (1024 tokens for Sonnet).
216
+ *
217
+ * For other providers: passes through as plain string.
218
+ * OpenAI caching is automatic for prompts ≥1024 tokens — no markup needed.
219
+ */
220
+ buildSystemMessage(provider, systemText) {
221
+ if (provider !== 'anthropic') {
222
+ return systemText;
223
+ }
224
+ return {
225
+ role: 'system',
226
+ content: systemText,
227
+ providerOptions: {
228
+ anthropic: {
229
+ cacheControl: { type: 'ephemeral' },
230
+ },
231
+ },
232
+ };
233
+ }
234
+ /**
235
+ * Build top-level providerOptions for generateText().
236
+ * Dispatches to provider-specific builders.
237
+ */
238
+ buildProviderOptions(resolved, userOptions) {
239
+ if (resolved.provider === 'anthropic') {
240
+ return this.buildAnthropicOptions(resolved, userOptions);
241
+ }
242
+ if (resolved.provider === 'openai') {
243
+ return this.buildOpenAIOptions(resolved, userOptions);
244
+ }
245
+ if (resolved.provider === 'google') {
246
+ return this.buildGoogleOptions(resolved, userOptions);
247
+ }
248
+ return userOptions;
249
+ }
250
+ /**
251
+ * Anthropic-specific provider options.
252
+ * - Auto-enables extended thinking when model has extendedThinking capability
253
+ * - Auto-injects context management (clear old tool uses at 100K tokens)
254
+ */
255
+ buildAnthropicOptions(resolved, userOptions) {
256
+ const userAnthropicOpts = (userOptions?.anthropic ?? {});
257
+ let anthropicOpts = { ...userAnthropicOpts };
258
+ // Auto-enable extended thinking if model supports it and user hasn't specified
259
+ if (resolved.capabilities.extendedThinking && !('thinking' in anthropicOpts)) {
260
+ const budgetTokens = this.config.defaultThinkingBudget;
261
+ anthropicOpts = {
262
+ ...anthropicOpts,
263
+ thinking: { type: 'enabled', budgetTokens },
264
+ };
265
+ }
266
+ // Auto-inject context management to clear old tool uses when context grows large.
267
+ // Trigger at 100K tokens (~50% of Claude's 200K context) to leave room for the final
268
+ // response. Keep the 5 most recent tool uses so the model retains working context.
269
+ if (!('contextManagement' in anthropicOpts)) {
270
+ anthropicOpts = {
271
+ ...anthropicOpts,
272
+ contextManagement: {
273
+ edits: [
274
+ {
275
+ type: 'clear_tool_uses_20250919',
276
+ trigger: { type: 'input_tokens', value: 100_000 },
277
+ keep: { type: 'tool_uses', value: 5 },
278
+ clearToolInputs: true,
279
+ },
280
+ ],
281
+ },
282
+ };
283
+ }
284
+ return {
285
+ ...(userOptions ?? {}),
286
+ anthropic: anthropicOpts,
287
+ };
288
+ }
289
+ /**
290
+ * OpenAI-specific provider options.
291
+ * - Auto-sets reasoningEffort for reasoning-capable models (o1, o3, o4-mini)
292
+ * - No context management equivalent — budget wrap-up via prepareStep is the only guard
293
+ * - systemMessageMode auto-handled by @ai-sdk/openai (system → developer for reasoning)
294
+ */
295
+ buildOpenAIOptions(resolved, userOptions) {
296
+ const userOpenAIOpts = (userOptions?.openai ?? {});
297
+ let openaiOpts = { ...userOpenAIOpts };
298
+ // Auto-set reasoningEffort for reasoning models if user hasn't specified
299
+ if (resolved.capabilities.extendedThinking && !('reasoningEffort' in openaiOpts)) {
300
+ openaiOpts = {
301
+ ...openaiOpts,
302
+ reasoningEffort: 'medium',
303
+ };
304
+ }
305
+ // No options to inject — return user options unchanged
306
+ if (Object.keys(openaiOpts).length === 0) {
307
+ return userOptions;
308
+ }
309
+ return {
310
+ ...(userOptions ?? {}),
311
+ openai: openaiOpts,
312
+ };
313
+ }
314
+ /**
315
+ * Google-specific provider options.
316
+ * - Auto-enables thinkingConfig with thinkingBudget for thinking-capable models (Gemini 2.5+)
317
+ * - No context management equivalent — budget wrap-up via prepareStep is the only guard
318
+ * - No system message wrapping — Gemini caching is implicit for 2.5+ models
319
+ */
320
+ buildGoogleOptions(resolved, userOptions) {
321
+ const userGoogleOpts = (userOptions?.google ?? {});
322
+ let googleOpts = { ...userGoogleOpts };
323
+ // Auto-enable thinking for models with extendedThinking capability (Gemini 2.5+)
324
+ if (resolved.capabilities.extendedThinking && !('thinkingConfig' in googleOpts)) {
325
+ googleOpts = {
326
+ ...googleOpts,
327
+ thinkingConfig: { thinkingBudget: this.config.defaultThinkingBudget },
328
+ };
329
+ }
330
+ if (Object.keys(googleOpts).length === 0) {
331
+ return userOptions;
332
+ }
333
+ return {
334
+ ...(userOptions ?? {}),
335
+ google: googleOpts,
336
+ };
337
+ }
338
+ /**
339
+ * Build a prepareStep callback that forces wrap-up when budget is 80% consumed.
340
+ *
341
+ * Each step's `inputTokens` is the TOTAL input for that API call (the full
342
+ * conversation including cached tokens). The last step's value represents the
343
+ * current context window size. We check that against the budget.
344
+ */
345
+ buildBudgetPrepareStep(budget) {
346
+ let wrapUpInjected = false;
347
+ return ({ steps }) => {
348
+ if (wrapUpInjected) {
349
+ // Already forced wrap-up, keep forcing no tools
350
+ return { toolChoice: 'none' };
351
+ }
352
+ if (steps.length === 0)
353
+ return {};
354
+ // Last step's inputTokens = current context window size
355
+ const lastStep = steps[steps.length - 1];
356
+ const contextSize = lastStep.usage.inputTokens ?? 0;
357
+ if (contextSize >= budget * 0.80) {
358
+ wrapUpInjected = true;
359
+ this.logger.warn(`Context budget 80% used (${contextSize}/${budget}). Forcing output — no more tool calls.`);
360
+ return { toolChoice: 'none' };
361
+ }
362
+ return {};
363
+ };
364
+ }
365
+ // ─────────────────────────────────────────────────────────────────────────
366
+ // Shell Command Execution (delegated to ShellExecutor)
367
+ // ─────────────────────────────────────────────────────────────────────────
368
+ // ─────────────────────────────────────────────────────────────────────────
369
+ // Provider Management
370
+ // ─────────────────────────────────────────────────────────────────────────
371
+ /**
372
+ * Initialize AI SDK provider factories from config.
373
+ * @ai-sdk/anthropic, @ai-sdk/openai, and @ai-sdk/google are bundled and eagerly initialized.
374
+ */
375
+ initializeProviders(aiConfig) {
376
+ for (const [providerName, creds] of Object.entries(aiConfig.providers)) {
377
+ if (providerName === 'anthropic') {
378
+ const anthropic = createAnthropic({ apiKey: creds.apiKey });
379
+ this.anthropicInstance = anthropic;
380
+ this.providers.set('anthropic', (modelId) => anthropic(modelId));
381
+ }
382
+ else if (providerName === 'openai') {
383
+ const openai = createOpenAI({ apiKey: creds.apiKey });
384
+ this.openaiInstance = openai;
385
+ this.providers.set('openai', (modelId) => openai(modelId));
386
+ }
387
+ else if (providerName === 'google') {
388
+ const google = createGoogleGenerativeAI({ apiKey: creds.apiKey });
389
+ this.googleInstance = google;
390
+ this.providers.set('google', (modelId) => google(modelId));
391
+ }
392
+ // Other providers are loaded lazily in ensureProvider()
393
+ }
394
+ }
395
+ /**
396
+ * Ensure a provider is loaded. Dynamically imports non-bundled providers.
397
+ */
398
+ async ensureProvider(providerName) {
399
+ if (this.providers.has(providerName))
400
+ return;
401
+ const creds = this.config.ai.providers[providerName];
402
+ if (!creds) {
403
+ throw this.missingProviderError(providerName);
404
+ }
405
+ if (!AIProvider.VALID_DYNAMIC_PROVIDERS.has(providerName)) {
406
+ throw new ConfigurationError(`Unknown AI provider: "${providerName}". ` +
407
+ `Valid providers: ${[...AIProvider.VALID_DYNAMIC_PROVIDERS].join(', ')}`);
408
+ }
409
+ try {
410
+ // Dynamic import of @ai-sdk/<provider>
411
+ const mod = await import(`@ai-sdk/${providerName}`);
412
+ // Check override map first, then try standard naming convention (createMistral, createCohere, etc.)
413
+ const factoryName = AIProvider.FACTORY_NAME_OVERRIDES[providerName]
414
+ ?? `create${providerName.charAt(0).toUpperCase() + providerName.slice(1)}`;
415
+ const createProvider = (mod[factoryName] ?? mod['default']);
416
+ if (!createProvider || typeof createProvider !== 'function') {
417
+ throw new ConfigurationError(`@ai-sdk/${providerName} does not export ${factoryName} or default. ` +
418
+ `Check the package documentation.`);
419
+ }
420
+ const provider = createProvider({ apiKey: creds.apiKey });
421
+ this.providers.set(providerName, (modelId) => provider(modelId));
422
+ }
423
+ catch (error) {
424
+ if (error instanceof ConfigurationError)
425
+ throw error;
426
+ const errCode = error.code;
427
+ if (errCode === 'ERR_MODULE_NOT_FOUND' || errCode === 'MODULE_NOT_FOUND') {
428
+ throw new ConfigurationError(`Provider "${providerName}" requires @ai-sdk/${providerName}. ` +
429
+ `Install: npm install @ai-sdk/${providerName}`);
430
+ }
431
+ throw error;
432
+ }
433
+ }
434
+ /**
435
+ * Get provider factory, throwing if not configured.
436
+ */
437
+ getProviderFactory(providerName) {
438
+ const factory = this.providers.get(providerName);
439
+ if (!factory) {
440
+ throw this.missingProviderError(providerName);
441
+ }
442
+ return factory;
443
+ }
444
+ missingProviderError(providerName) {
445
+ const envVar = `${providerName.toUpperCase()}_API_KEY`;
446
+ return new ConfigurationError(`AI provider "${providerName}" is not configured. ` +
447
+ `Set the ${envVar} environment variable or add it to config.ai.providers: { ${providerName}: { apiKey: '...' } }`);
448
+ }
449
+ // ─────────────────────────────────────────────────────────────────────────
450
+ // Usage + Error Mapping
451
+ // ─────────────────────────────────────────────────────────────────────────
452
+ /**
453
+ * Convert AI SDK usage to UluOps format
454
+ */
455
+ mapUsage(usage, providerMetadata) {
456
+ const base = {
457
+ input_tokens: usage.inputTokens ?? 0,
458
+ output_tokens: usage.outputTokens ?? 0,
459
+ };
460
+ // 1. AI SDK standard path (works for both providers)
461
+ if (usage.inputTokenDetails) {
462
+ base.cache_read_input_tokens = usage.inputTokenDetails.cacheReadTokens ?? undefined;
463
+ base.cache_creation_input_tokens = usage.inputTokenDetails.cacheWriteTokens ?? undefined;
464
+ }
465
+ // 2-4. Extract provider-specific metadata
466
+ this.extractAnthropicUsage(base, providerMetadata);
467
+ this.extractOpenAIUsage(base, providerMetadata);
468
+ this.extractGoogleUsage(base, providerMetadata);
469
+ // 5. Generic provider metadata scan for non-bundled providers.
470
+ // Best-effort extraction of cache tokens from unknown provider metadata.
471
+ // Uses ??= to never override values set by provider-specific tiers above.
472
+ if (providerMetadata && base.cache_read_input_tokens == null) {
473
+ this.extractGenericUsage(base, providerMetadata);
474
+ }
475
+ return base;
476
+ }
477
+ extractAnthropicUsage(base, providerMetadata) {
478
+ const meta = providerMetadata?.anthropic;
479
+ if (!meta)
480
+ return;
481
+ base.cache_creation_input_tokens ??= meta.cacheCreationInputTokens;
482
+ base.cache_read_input_tokens ??= meta.cacheReadInputTokens;
483
+ }
484
+ extractOpenAIUsage(base, providerMetadata) {
485
+ const meta = providerMetadata?.openai;
486
+ if (!meta)
487
+ return;
488
+ base.cache_read_input_tokens ??= meta.cachedPromptTokens;
489
+ if (meta.reasoningTokens)
490
+ base.reasoning_tokens = meta.reasoningTokens;
491
+ }
492
+ extractGoogleUsage(base, providerMetadata) {
493
+ const gUsage = providerMetadata?.google?.usageMetadata;
494
+ if (!gUsage)
495
+ return;
496
+ base.cache_read_input_tokens ??= gUsage.cachedContentTokenCount;
497
+ if (gUsage.thoughtsTokenCount)
498
+ base.thinking_tokens = gUsage.thoughtsTokenCount;
499
+ }
500
+ extractGenericUsage(base, providerMetadata) {
501
+ const KNOWN_PROVIDERS = new Set(['anthropic', 'openai', 'google']);
502
+ for (const [key, value] of Object.entries(providerMetadata)) {
503
+ if (KNOWN_PROVIDERS.has(key) || typeof value !== 'object' || !value)
504
+ continue;
505
+ const meta = value;
506
+ const cached = meta['cachedTokens'] ?? meta['cachedContentTokenCount'] ?? meta['cachedPromptTokens'];
507
+ if (typeof cached === 'number' && cached > 0) {
508
+ base.cache_read_input_tokens = cached;
509
+ break;
510
+ }
511
+ }
512
+ }
513
+ /**
514
+ * Map AI SDK errors to sdk-core error types.
515
+ * AI SDK normalizes all provider errors to APICallError with statusCode.
516
+ */
517
+ mapError(error, timeoutMs) {
518
+ this.logger.error(`AI SDK error: ${formatErrorMessage(error)}`);
519
+ if (isAPICallError(error)) {
520
+ const status = error.statusCode ?? 0;
521
+ if (status === 429) {
522
+ return new RateLimitError(`Rate limit exceeded: ${error.message}`);
523
+ }
524
+ if (status === 401) {
525
+ return new UnauthorizedError(`Authentication failed: ${error.message}`);
526
+ }
527
+ if (status === 403) {
528
+ return new ForbiddenError(`Forbidden: ${error.message}`);
529
+ }
530
+ if (status >= 500) {
531
+ return new ServiceUnavailableError(`Server error: ${error.message}`);
532
+ }
533
+ return new SdkApiError(status, error.message);
534
+ }
535
+ if (isRetryError(error)) {
536
+ return new SdkApiError(0, `Retries exhausted: ${error.message}`);
537
+ }
538
+ // Timeout (AbortError)
539
+ if (error instanceof Error && error.name === 'AbortError') {
540
+ return new TimeoutError(timeoutMs ?? this.config.timeout);
541
+ }
542
+ return new SdkApiError(0, formatErrorMessage(error));
543
+ }
544
+ }
545
+ /**
546
+ * Type guard for AI SDK's APICallError
547
+ */
548
+ function isAPICallError(error) {
549
+ return error instanceof Error && 'statusCode' in error;
550
+ }
551
+ /**
552
+ * Type guard for AI SDK's RetryError
553
+ */
554
+ function isRetryError(error) {
555
+ return error instanceof Error && error.name === 'RetryError';
556
+ }
557
+ //# sourceMappingURL=AIProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AIProvider.js","sourceRoot":"","sources":["../../src/ai/AIProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,78 @@
1
+ import type { RegistryClient as RegistrySdk, Model, ModelAlias as RegistryModelAlias, ModelCapabilities, ModelTier } from '@uluops/registry-sdk';
2
+ /**
3
+ * Resolved model with provider routing information
4
+ */
5
+ export interface ResolvedModel {
6
+ /** Provider name (e.g., 'anthropic', 'openai') */
7
+ provider: string;
8
+ /** Model ID in registry (e.g., 'claude-sonnet-4-5-20250929') */
9
+ modelId: string;
10
+ /** Provider-specific model ID for AI SDK */
11
+ providerModelId: string;
12
+ /** Model tier for cost estimation */
13
+ tier: ModelTier;
14
+ /** Model capabilities */
15
+ capabilities: ModelCapabilities;
16
+ /** Original input that resolved to this model */
17
+ resolvedFrom: string;
18
+ }
19
+ /**
20
+ * Options for model resolution
21
+ */
22
+ export interface ResolveOptions {
23
+ /** Capabilities the model must support */
24
+ requiredCapabilities?: Array<keyof ModelCapabilities>;
25
+ /** Preferred provider (used when resolving by tier) */
26
+ preferredProvider?: string;
27
+ }
28
+ /**
29
+ * Registry-backed model catalog with in-memory caching.
30
+ *
31
+ * Resolution priority:
32
+ * 1. Explicit provider:modelId (e.g., "anthropic:claude-sonnet-4-5-20250929")
33
+ * 2. Registry alias (e.g., "sonnet") via models.resolveAlias()
34
+ * 3. Tier name (e.g., "premium") — resolves to first available model for tier
35
+ *
36
+ * Cache is in-memory only. Call refresh() to clear after admin syncs models.
37
+ * No auto-sync or TTL — model sync is an admin operation.
38
+ */
39
+ export declare class ModelCatalog {
40
+ private sdk;
41
+ private aliasCache;
42
+ private modelCache;
43
+ constructor(sdk: RegistrySdk);
44
+ /**
45
+ * Resolve a model input to a fully-qualified ResolvedModel.
46
+ *
47
+ * @param input - Alias ('sonnet'), tier ('premium'), or 'provider:modelId'
48
+ * @param opts - Resolution options (capability checks, provider preference)
49
+ * @throws {ModelNotFoundError} If alias/model cannot be resolved
50
+ * @throws {CapabilityError} If model lacks required capabilities
51
+ */
52
+ resolve(input: string, opts?: ResolveOptions): Promise<ResolvedModel>;
53
+ /**
54
+ * List all available aliases
55
+ */
56
+ listAliases(): Promise<RegistryModelAlias[]>;
57
+ /**
58
+ * List available models, optionally filtered
59
+ */
60
+ listModels(filter?: {
61
+ provider?: string;
62
+ tier?: ModelTier;
63
+ capability?: keyof ModelCapabilities;
64
+ }): Promise<Model[]>;
65
+ /**
66
+ * Clear in-memory cache. Call after admin syncs models in the registry.
67
+ */
68
+ refresh(): void;
69
+ private resolveExplicit;
70
+ private resolveAlias;
71
+ private resolveByTier;
72
+ private getModel;
73
+ /** Check if an error is a 404/not-found from the registry API */
74
+ private isNotFoundError;
75
+ private toResolvedModel;
76
+ private validateCapabilities;
77
+ }
78
+ //# sourceMappingURL=ModelCatalog.d.ts.map