beth-copilot 1.0.14 → 1.0.15

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 (104) hide show
  1. package/CHANGELOG.md +195 -177
  2. package/README.md +408 -185
  3. package/bin/cli.js +0 -0
  4. package/dist/cli/commands/doctor.e2e.test.d.ts +8 -0
  5. package/dist/cli/commands/doctor.e2e.test.d.ts.map +1 -0
  6. package/dist/cli/commands/doctor.e2e.test.js +428 -0
  7. package/dist/cli/commands/doctor.e2e.test.js.map +1 -0
  8. package/dist/cli/commands/doctor.test.js +1 -1
  9. package/dist/cli/commands/help.e2e.test.d.ts +9 -0
  10. package/dist/cli/commands/help.e2e.test.d.ts.map +1 -0
  11. package/dist/cli/commands/help.e2e.test.js +150 -0
  12. package/dist/cli/commands/help.e2e.test.js.map +1 -0
  13. package/dist/cli/commands/init.test.d.ts +6 -0
  14. package/dist/cli/commands/init.test.d.ts.map +1 -0
  15. package/dist/cli/commands/init.test.js +289 -0
  16. package/dist/cli/commands/init.test.js.map +1 -0
  17. package/dist/cli/commands/mcp.e2e.test.d.ts +9 -0
  18. package/dist/cli/commands/mcp.e2e.test.d.ts.map +1 -0
  19. package/dist/cli/commands/mcp.e2e.test.js +139 -0
  20. package/dist/cli/commands/mcp.e2e.test.js.map +1 -0
  21. package/dist/cli/commands/pipeline.e2e.test.d.ts +9 -0
  22. package/dist/cli/commands/pipeline.e2e.test.d.ts.map +1 -0
  23. package/dist/cli/commands/pipeline.e2e.test.js +192 -0
  24. package/dist/cli/commands/pipeline.e2e.test.js.map +1 -0
  25. package/dist/cli/commands/quickstart.test.d.ts +6 -0
  26. package/dist/cli/commands/quickstart.test.d.ts.map +1 -0
  27. package/dist/cli/commands/quickstart.test.js +232 -0
  28. package/dist/cli/commands/quickstart.test.js.map +1 -0
  29. package/dist/core/agents/frontmatter.test.d.ts +8 -0
  30. package/dist/core/agents/frontmatter.test.d.ts.map +1 -0
  31. package/dist/core/agents/frontmatter.test.js +589 -0
  32. package/dist/core/agents/frontmatter.test.js.map +1 -0
  33. package/dist/core/agents/handoffs.test.d.ts +8 -0
  34. package/dist/core/agents/handoffs.test.d.ts.map +1 -0
  35. package/dist/core/agents/handoffs.test.js +320 -0
  36. package/dist/core/agents/handoffs.test.js.map +1 -0
  37. package/dist/core/agents/loader.test.js +1 -1
  38. package/dist/core/agents/suite.test.d.ts +8 -0
  39. package/dist/core/agents/suite.test.d.ts.map +1 -0
  40. package/dist/core/agents/suite.test.js +207 -0
  41. package/dist/core/agents/suite.test.js.map +1 -0
  42. package/dist/core/agents/tools.test.d.ts +8 -0
  43. package/dist/core/agents/tools.test.d.ts.map +1 -0
  44. package/dist/core/agents/tools.test.js +332 -0
  45. package/dist/core/agents/tools.test.js.map +1 -0
  46. package/dist/init.test.js +288 -0
  47. package/dist/providers/azure.d.ts +147 -0
  48. package/dist/providers/azure.d.ts.map +1 -0
  49. package/dist/providers/azure.js +491 -0
  50. package/dist/providers/azure.js.map +1 -0
  51. package/dist/providers/azure.test.d.ts +11 -0
  52. package/dist/providers/azure.test.d.ts.map +1 -0
  53. package/dist/providers/azure.test.js +330 -0
  54. package/dist/providers/azure.test.js.map +1 -0
  55. package/dist/providers/config.d.ts +87 -0
  56. package/dist/providers/config.d.ts.map +1 -0
  57. package/dist/providers/config.js +193 -0
  58. package/dist/providers/config.js.map +1 -0
  59. package/dist/providers/config.test.d.ts +7 -0
  60. package/dist/providers/config.test.d.ts.map +1 -0
  61. package/dist/providers/config.test.js +370 -0
  62. package/dist/providers/config.test.js.map +1 -0
  63. package/dist/providers/index.d.ts +18 -0
  64. package/dist/providers/index.d.ts.map +1 -0
  65. package/dist/providers/index.js +14 -0
  66. package/dist/providers/index.js.map +1 -0
  67. package/dist/providers/interface.d.ts +191 -0
  68. package/dist/providers/interface.d.ts.map +1 -0
  69. package/dist/providers/interface.js +94 -0
  70. package/dist/providers/interface.js.map +1 -0
  71. package/dist/providers/retry.d.ts +128 -0
  72. package/dist/providers/retry.d.ts.map +1 -0
  73. package/dist/providers/retry.js +205 -0
  74. package/dist/providers/retry.js.map +1 -0
  75. package/dist/providers/retry.test.d.ts +7 -0
  76. package/dist/providers/retry.test.d.ts.map +1 -0
  77. package/dist/providers/retry.test.js +439 -0
  78. package/dist/providers/retry.test.js.map +1 -0
  79. package/dist/providers/streaming.d.ts +157 -0
  80. package/dist/providers/streaming.d.ts.map +1 -0
  81. package/dist/providers/streaming.js +233 -0
  82. package/dist/providers/streaming.js.map +1 -0
  83. package/dist/providers/streaming.test.d.ts +7 -0
  84. package/dist/providers/streaming.test.d.ts.map +1 -0
  85. package/dist/providers/streaming.test.js +372 -0
  86. package/dist/providers/streaming.test.js.map +1 -0
  87. package/dist/providers/types.d.ts +209 -0
  88. package/dist/providers/types.d.ts.map +1 -0
  89. package/dist/providers/types.js +53 -0
  90. package/dist/providers/types.js.map +1 -0
  91. package/dist/providers/types.test.d.ts +7 -0
  92. package/dist/providers/types.test.d.ts.map +1 -0
  93. package/dist/providers/types.test.js +141 -0
  94. package/dist/providers/types.test.js.map +1 -0
  95. package/package.json +60 -56
  96. package/sbom.json +3302 -8
  97. package/templates/.github/agents/beth.agent.md +329 -329
  98. package/templates/.github/agents/developer.agent.md +572 -572
  99. package/templates/.github/agents/product-manager.agent.md +272 -272
  100. package/templates/.github/agents/researcher.agent.md +338 -338
  101. package/templates/.github/agents/security-reviewer.agent.md +465 -465
  102. package/templates/.github/agents/tester.agent.md +496 -496
  103. package/templates/.github/agents/ux-designer.agent.md +393 -393
  104. package/templates/mcp.json.example +4 -0
@@ -0,0 +1,147 @@
1
+ /**
2
+ * Azure OpenAI Provider
3
+ *
4
+ * LLM provider implementation for Azure OpenAI using the Responses API.
5
+ * Uses Entra ID authentication via TokenCredential.
6
+ */
7
+ import type { ChatMessage, ChatChunk, LLMResponse, LLMConfig } from './types.js';
8
+ import { LLMProviderBase, type ChatRequestOptions } from './interface.js';
9
+ /**
10
+ * Azure OpenAI provider implementation.
11
+ *
12
+ * Uses the OpenAI SDK's AzureOpenAI client with Entra ID authentication.
13
+ * Supports both streaming and non-streaming chat completions with tool calling.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { DefaultAzureCredential } from '@azure/identity';
18
+ *
19
+ * const provider = new AzureOpenAIProvider({
20
+ * provider: 'azure-openai',
21
+ * endpoint: 'https://my-resource.openai.azure.com',
22
+ * model: 'gpt-4',
23
+ * credential: new DefaultAzureCredential(),
24
+ * apiVersion: '2025-03-01-preview',
25
+ * });
26
+ *
27
+ * const response = await provider.chat([
28
+ * { role: 'user', content: 'Hello!' }
29
+ * ]);
30
+ * ```
31
+ */
32
+ export declare class AzureOpenAIProvider extends LLMProviderBase {
33
+ /** Azure OpenAI client instance */
34
+ private client;
35
+ /**
36
+ * Create a new Azure OpenAI provider instance.
37
+ *
38
+ * @param config - Provider configuration with Entra ID credentials
39
+ */
40
+ constructor(config: LLMConfig);
41
+ /**
42
+ * Provider identifier.
43
+ */
44
+ get name(): string;
45
+ /**
46
+ * Check if the provider is properly configured.
47
+ *
48
+ * Validates that endpoint, model, and credential are present.
49
+ */
50
+ get isConfigured(): boolean;
51
+ /**
52
+ * Send a non-streaming chat completion request.
53
+ *
54
+ * @param messages - Conversation history
55
+ * @param options - Request options (tools, temperature, etc.)
56
+ * @returns Complete LLM response with message and usage stats
57
+ * @throws {LLMError} On API errors
58
+ */
59
+ chat(messages: ChatMessage[], options?: ChatRequestOptions): Promise<LLMResponse>;
60
+ /**
61
+ * Send a streaming chat completion request.
62
+ *
63
+ * @param messages - Conversation history
64
+ * @param options - Request options (tools, temperature, etc.)
65
+ * @yields ChatChunk objects with incremental content
66
+ * @throws {LLMError} On API errors
67
+ */
68
+ chatStream(messages: ChatMessage[], options?: ChatRequestOptions): AsyncGenerator<ChatChunk, void, undefined>;
69
+ /**
70
+ * Estimate token count for messages.
71
+ *
72
+ * Uses a rough estimation based on character count divided by 4.
73
+ * This is an approximation suitable for basic usage tracking and
74
+ * context window management.
75
+ *
76
+ * @param messages - Messages to count tokens for
77
+ * @returns Estimated token count
78
+ */
79
+ countTokens(messages: ChatMessage[]): Promise<number>;
80
+ /**
81
+ * Map internal ChatMessage format to OpenAI API format.
82
+ *
83
+ * @param messages - Internal message format
84
+ * @returns OpenAI-compatible message array
85
+ */
86
+ private mapMessages;
87
+ /**
88
+ * Map internal ToolDefinition format to OpenAI API format.
89
+ *
90
+ * @param tools - Internal tool definitions
91
+ * @returns OpenAI-compatible tool array
92
+ */
93
+ private mapTools;
94
+ /**
95
+ * Map OpenAI API response to internal LLMResponse format.
96
+ *
97
+ * @param response - OpenAI API response
98
+ * @returns Internal response format
99
+ */
100
+ private mapResponse;
101
+ /**
102
+ * Map tool calls from OpenAI format, filtering out non-function types.
103
+ *
104
+ * @param toolCalls - OpenAI tool calls array
105
+ * @returns Internal tool calls array or undefined
106
+ */
107
+ private mapToolCalls;
108
+ /**
109
+ * Map OpenAI streaming chunk to internal ChatChunk format.
110
+ *
111
+ * @param chunk - OpenAI streaming chunk
112
+ * @returns Internal chunk format
113
+ */
114
+ private mapChunk;
115
+ /**
116
+ * Map OpenAI finish reason to internal FinishReason type.
117
+ *
118
+ * @param reason - OpenAI finish reason string
119
+ * @returns Internal finish reason or null
120
+ */
121
+ private mapFinishReason;
122
+ /**
123
+ * Wrap an error from the OpenAI SDK into an LLMError.
124
+ *
125
+ * Maps HTTP status codes and error types to appropriate LLMErrorCode values.
126
+ *
127
+ * @param error - The original error
128
+ * @returns Wrapped LLMError
129
+ */
130
+ private wrapError;
131
+ /**
132
+ * Extract HTTP status code from various error types.
133
+ *
134
+ * @param error - Error object to inspect
135
+ * @returns HTTP status code or undefined
136
+ */
137
+ private extractStatusCode;
138
+ /**
139
+ * Map HTTP status code to LLMErrorCode.
140
+ *
141
+ * @param statusCode - HTTP status code
142
+ * @param error - Original error for additional context
143
+ * @returns Appropriate LLMErrorCode
144
+ */
145
+ private mapStatusToErrorCode;
146
+ }
147
+ //# sourceMappingURL=azure.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure.d.ts","sourceRoot":"","sources":["../../src/providers/azure.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAYH,OAAO,KAAK,EACV,WAAW,EACX,SAAS,EACT,WAAW,EACX,SAAS,EAIV,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,KAAK,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAkB1E;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,mBAAoB,SAAQ,eAAe;IACtD,mCAAmC;IACnC,OAAO,CAAC,MAAM,CAAc;IAE5B;;;;OAIG;gBACS,MAAM,EAAE,SAAS;IAsB7B;;OAEG;IACH,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED;;;;OAIG;IACH,IAAI,YAAY,IAAI,OAAO,CAM1B;IAMD;;;;;;;OAOG;IACG,IAAI,CACR,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,OAAO,CAAC,WAAW,CAAC;IAwCvB;;;;;;;OAOG;IACI,UAAU,CACf,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,CAAC,EAAE,kBAAkB,GAC3B,cAAc,CAAC,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC;IAwC7C;;;;;;;;;OASG;IACG,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAwC3D;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IA+CnB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAiBhB;;;;;OAKG;IACH,OAAO,CAAC,WAAW;IAqBnB;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAgCpB;;;;;OAKG;IACH,OAAO,CAAC,QAAQ;IAyChB;;;;;OAKG;IACH,OAAO,CAAC,eAAe;IA0BvB;;;;;;;OAOG;IACH,OAAO,CAAC,SAAS;IA4BjB;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAezB;;;;;;OAMG;IACH,OAAO,CAAC,oBAAoB;CA4D7B"}
@@ -0,0 +1,491 @@
1
+ /**
2
+ * Azure OpenAI Provider
3
+ *
4
+ * LLM provider implementation for Azure OpenAI using the Responses API.
5
+ * Uses Entra ID authentication via TokenCredential.
6
+ */
7
+ import { AzureOpenAI } from 'openai';
8
+ import { getBearerTokenProvider } from '@azure/identity';
9
+ import { LLMError } from './types.js';
10
+ import { LLMProviderBase } from './interface.js';
11
+ import { retry, isTransientError } from './retry.js';
12
+ // =============================================================================
13
+ // Constants
14
+ // =============================================================================
15
+ /** Azure Cognitive Services scope for token acquisition */
16
+ const AZURE_COGNITIVE_SERVICES_SCOPE = 'https://cognitiveservices.azure.com/.default';
17
+ /** Provider name identifier */
18
+ const PROVIDER_NAME = 'azure-openai';
19
+ // =============================================================================
20
+ // Azure OpenAI Provider
21
+ // =============================================================================
22
+ /**
23
+ * Azure OpenAI provider implementation.
24
+ *
25
+ * Uses the OpenAI SDK's AzureOpenAI client with Entra ID authentication.
26
+ * Supports both streaming and non-streaming chat completions with tool calling.
27
+ *
28
+ * @example
29
+ * ```typescript
30
+ * import { DefaultAzureCredential } from '@azure/identity';
31
+ *
32
+ * const provider = new AzureOpenAIProvider({
33
+ * provider: 'azure-openai',
34
+ * endpoint: 'https://my-resource.openai.azure.com',
35
+ * model: 'gpt-4',
36
+ * credential: new DefaultAzureCredential(),
37
+ * apiVersion: '2025-03-01-preview',
38
+ * });
39
+ *
40
+ * const response = await provider.chat([
41
+ * { role: 'user', content: 'Hello!' }
42
+ * ]);
43
+ * ```
44
+ */
45
+ export class AzureOpenAIProvider extends LLMProviderBase {
46
+ /** Azure OpenAI client instance */
47
+ client;
48
+ /**
49
+ * Create a new Azure OpenAI provider instance.
50
+ *
51
+ * @param config - Provider configuration with Entra ID credentials
52
+ */
53
+ constructor(config) {
54
+ super(config);
55
+ // Create token provider from TokenCredential
56
+ const tokenProvider = getBearerTokenProvider(config.credential, AZURE_COGNITIVE_SERVICES_SCOPE);
57
+ // Initialize AzureOpenAI client with Entra ID auth
58
+ this.client = new AzureOpenAI({
59
+ endpoint: config.endpoint,
60
+ deployment: config.model,
61
+ apiVersion: config.apiVersion ?? '2025-03-01-preview',
62
+ azureADTokenProvider: tokenProvider,
63
+ });
64
+ }
65
+ // ===========================================================================
66
+ // Abstract Property Implementations
67
+ // ===========================================================================
68
+ /**
69
+ * Provider identifier.
70
+ */
71
+ get name() {
72
+ return PROVIDER_NAME;
73
+ }
74
+ /**
75
+ * Check if the provider is properly configured.
76
+ *
77
+ * Validates that endpoint, model, and credential are present.
78
+ */
79
+ get isConfigured() {
80
+ return Boolean(this.config.endpoint &&
81
+ this.config.model &&
82
+ this.config.credential);
83
+ }
84
+ // ===========================================================================
85
+ // Abstract Method Implementations
86
+ // ===========================================================================
87
+ /**
88
+ * Send a non-streaming chat completion request.
89
+ *
90
+ * @param messages - Conversation history
91
+ * @param options - Request options (tools, temperature, etc.)
92
+ * @returns Complete LLM response with message and usage stats
93
+ * @throws {LLMError} On API errors
94
+ */
95
+ async chat(messages, options) {
96
+ return retry(async () => {
97
+ try {
98
+ const response = await this.client.chat.completions.create({
99
+ model: this.config.model,
100
+ messages: this.mapMessages(messages),
101
+ tools: options?.tools ? this.mapTools(options.tools) : undefined,
102
+ temperature: options?.temperature ?? this.config.temperature,
103
+ max_tokens: options?.maxTokens ?? this.config.maxTokens,
104
+ top_p: options?.topP ?? this.config.topP,
105
+ frequency_penalty: options?.frequencyPenalty ?? this.config.frequencyPenalty,
106
+ presence_penalty: options?.presencePenalty ?? this.config.presencePenalty,
107
+ stream: false,
108
+ }, {
109
+ signal: options?.signal,
110
+ });
111
+ return this.mapResponse(response);
112
+ }
113
+ catch (error) {
114
+ throw this.wrapError(error);
115
+ }
116
+ }, {
117
+ maxRetries: 3,
118
+ onRetry: (error, attempt, delay) => {
119
+ // Could add logging here if needed
120
+ void error;
121
+ void attempt;
122
+ void delay;
123
+ },
124
+ });
125
+ }
126
+ /**
127
+ * Send a streaming chat completion request.
128
+ *
129
+ * @param messages - Conversation history
130
+ * @param options - Request options (tools, temperature, etc.)
131
+ * @yields ChatChunk objects with incremental content
132
+ * @throws {LLMError} On API errors
133
+ */
134
+ async *chatStream(messages, options) {
135
+ let stream;
136
+ try {
137
+ stream = await this.client.chat.completions.create({
138
+ model: this.config.model,
139
+ messages: this.mapMessages(messages),
140
+ tools: options?.tools ? this.mapTools(options.tools) : undefined,
141
+ temperature: options?.temperature ?? this.config.temperature,
142
+ max_tokens: options?.maxTokens ?? this.config.maxTokens,
143
+ top_p: options?.topP ?? this.config.topP,
144
+ frequency_penalty: options?.frequencyPenalty ?? this.config.frequencyPenalty,
145
+ presence_penalty: options?.presencePenalty ?? this.config.presencePenalty,
146
+ stream: true,
147
+ }, {
148
+ signal: options?.signal,
149
+ });
150
+ }
151
+ catch (error) {
152
+ throw this.wrapError(error);
153
+ }
154
+ try {
155
+ for await (const chunk of stream) {
156
+ yield this.mapChunk(chunk);
157
+ }
158
+ }
159
+ catch (error) {
160
+ // Handle errors during streaming
161
+ const wrappedError = this.wrapError(error);
162
+ // If it's a transient error, we could potentially retry,
163
+ // but for streaming we throw immediately
164
+ throw wrappedError;
165
+ }
166
+ }
167
+ /**
168
+ * Estimate token count for messages.
169
+ *
170
+ * Uses a rough estimation based on character count divided by 4.
171
+ * This is an approximation suitable for basic usage tracking and
172
+ * context window management.
173
+ *
174
+ * @param messages - Messages to count tokens for
175
+ * @returns Estimated token count
176
+ */
177
+ async countTokens(messages) {
178
+ // Rough estimation: ~4 characters per token on average
179
+ // This is a common heuristic for English text with GPT models
180
+ let totalChars = 0;
181
+ for (const message of messages) {
182
+ // Count content
183
+ totalChars += message.content.length;
184
+ // Count role (approximate overhead)
185
+ totalChars += message.role.length + 4; // ~4 chars for formatting
186
+ // Count name if present
187
+ if (message.name) {
188
+ totalChars += message.name.length + 2;
189
+ }
190
+ // Count tool calls if present
191
+ if (message.tool_calls) {
192
+ for (const toolCall of message.tool_calls) {
193
+ totalChars += toolCall.function.name.length;
194
+ totalChars += toolCall.function.arguments.length;
195
+ totalChars += 20; // Overhead for structure
196
+ }
197
+ }
198
+ // Count tool_call_id if present
199
+ if (message.tool_call_id) {
200
+ totalChars += message.tool_call_id.length + 4;
201
+ }
202
+ }
203
+ // Divide by 4 and round up for safety
204
+ return Math.ceil(totalChars / 4);
205
+ }
206
+ // ===========================================================================
207
+ // Message Mapping
208
+ // ===========================================================================
209
+ /**
210
+ * Map internal ChatMessage format to OpenAI API format.
211
+ *
212
+ * @param messages - Internal message format
213
+ * @returns OpenAI-compatible message array
214
+ */
215
+ mapMessages(messages) {
216
+ return messages.map((msg) => {
217
+ switch (msg.role) {
218
+ case 'system':
219
+ return {
220
+ role: 'system',
221
+ content: msg.content,
222
+ };
223
+ case 'user':
224
+ return {
225
+ role: 'user',
226
+ content: msg.content,
227
+ name: msg.name,
228
+ };
229
+ case 'assistant':
230
+ return {
231
+ role: 'assistant',
232
+ content: msg.content,
233
+ tool_calls: msg.tool_calls?.map((tc) => ({
234
+ id: tc.id,
235
+ type: tc.type,
236
+ function: {
237
+ name: tc.function.name,
238
+ arguments: tc.function.arguments,
239
+ },
240
+ })),
241
+ };
242
+ case 'tool':
243
+ return {
244
+ role: 'tool',
245
+ content: msg.content,
246
+ tool_call_id: msg.tool_call_id ?? '',
247
+ };
248
+ default:
249
+ // TypeScript should catch this, but just in case
250
+ return {
251
+ role: 'user',
252
+ content: msg.content,
253
+ };
254
+ }
255
+ });
256
+ }
257
+ /**
258
+ * Map internal ToolDefinition format to OpenAI API format.
259
+ *
260
+ * @param tools - Internal tool definitions
261
+ * @returns OpenAI-compatible tool array
262
+ */
263
+ mapTools(tools) {
264
+ return tools.map((tool) => ({
265
+ type: 'function',
266
+ function: {
267
+ name: tool.function.name,
268
+ description: tool.function.description,
269
+ parameters: tool.function.parameters,
270
+ },
271
+ }));
272
+ }
273
+ // ===========================================================================
274
+ // Response Mapping
275
+ // ===========================================================================
276
+ /**
277
+ * Map OpenAI API response to internal LLMResponse format.
278
+ *
279
+ * @param response - OpenAI API response
280
+ * @returns Internal response format
281
+ */
282
+ mapResponse(response) {
283
+ return {
284
+ id: response.id,
285
+ choices: response.choices.map((choice) => ({
286
+ index: choice.index,
287
+ message: {
288
+ role: choice.message.role,
289
+ content: choice.message.content ?? '',
290
+ tool_calls: this.mapToolCalls(choice.message.tool_calls),
291
+ },
292
+ // finish_reason is required in LLMResponseChoice; default to 'stop' if not provided
293
+ finish_reason: this.mapFinishReason(choice.finish_reason) ?? 'stop',
294
+ })),
295
+ usage: {
296
+ prompt_tokens: response.usage?.prompt_tokens ?? 0,
297
+ completion_tokens: response.usage?.completion_tokens ?? 0,
298
+ total_tokens: response.usage?.total_tokens ?? 0,
299
+ },
300
+ };
301
+ }
302
+ /**
303
+ * Map tool calls from OpenAI format, filtering out non-function types.
304
+ *
305
+ * @param toolCalls - OpenAI tool calls array
306
+ * @returns Internal tool calls array or undefined
307
+ */
308
+ mapToolCalls(toolCalls) {
309
+ if (!toolCalls) {
310
+ return undefined;
311
+ }
312
+ const functionCalls = toolCalls.filter((tc) => tc.type === 'function' && 'function' in tc);
313
+ if (functionCalls.length === 0) {
314
+ return undefined;
315
+ }
316
+ return functionCalls.map((tc) => ({
317
+ id: tc.id,
318
+ type: 'function',
319
+ function: {
320
+ name: tc.function.name,
321
+ arguments: tc.function.arguments,
322
+ },
323
+ }));
324
+ }
325
+ /**
326
+ * Map OpenAI streaming chunk to internal ChatChunk format.
327
+ *
328
+ * @param chunk - OpenAI streaming chunk
329
+ * @returns Internal chunk format
330
+ */
331
+ mapChunk(chunk) {
332
+ const choice = chunk.choices[0];
333
+ if (!choice) {
334
+ // Empty chunk (can happen at start/end)
335
+ return {
336
+ id: chunk.id,
337
+ content: null,
338
+ finish_reason: null,
339
+ };
340
+ }
341
+ const delta = choice.delta;
342
+ // Map tool call deltas if present
343
+ let toolCallDeltas;
344
+ if (delta.tool_calls) {
345
+ toolCallDeltas = delta.tool_calls.map((tc) => ({
346
+ index: tc.index,
347
+ id: tc.id,
348
+ type: tc.type,
349
+ function: tc.function
350
+ ? {
351
+ name: tc.function.name,
352
+ arguments: tc.function.arguments,
353
+ }
354
+ : undefined,
355
+ }));
356
+ }
357
+ return {
358
+ id: chunk.id,
359
+ content: delta.content ?? null,
360
+ role: delta.role,
361
+ finish_reason: this.mapFinishReason(choice.finish_reason),
362
+ tool_calls: toolCallDeltas,
363
+ };
364
+ }
365
+ /**
366
+ * Map OpenAI finish reason to internal FinishReason type.
367
+ *
368
+ * @param reason - OpenAI finish reason string
369
+ * @returns Internal finish reason or null
370
+ */
371
+ mapFinishReason(reason) {
372
+ if (!reason) {
373
+ return null;
374
+ }
375
+ switch (reason) {
376
+ case 'stop':
377
+ return 'stop';
378
+ case 'tool_calls':
379
+ return 'tool_calls';
380
+ case 'length':
381
+ return 'length';
382
+ case 'content_filter':
383
+ return 'content_filter';
384
+ default:
385
+ // Unknown reason, treat as stop
386
+ return 'stop';
387
+ }
388
+ }
389
+ // ===========================================================================
390
+ // Error Handling
391
+ // ===========================================================================
392
+ /**
393
+ * Wrap an error from the OpenAI SDK into an LLMError.
394
+ *
395
+ * Maps HTTP status codes and error types to appropriate LLMErrorCode values.
396
+ *
397
+ * @param error - The original error
398
+ * @returns Wrapped LLMError
399
+ */
400
+ wrapError(error) {
401
+ // If already an LLMError, return as-is
402
+ if (error instanceof LLMError) {
403
+ return error;
404
+ }
405
+ // Handle non-Error objects
406
+ if (!(error instanceof Error)) {
407
+ return new LLMError(String(error), 'SERVER_ERROR', PROVIDER_NAME, { retryable: false });
408
+ }
409
+ // Extract status code from OpenAI error structure
410
+ const statusCode = this.extractStatusCode(error);
411
+ const code = this.mapStatusToErrorCode(statusCode, error);
412
+ const retryable = isTransientError(error);
413
+ return new LLMError(error.message, code, PROVIDER_NAME, {
414
+ statusCode,
415
+ retryable,
416
+ cause: error,
417
+ });
418
+ }
419
+ /**
420
+ * Extract HTTP status code from various error types.
421
+ *
422
+ * @param error - Error object to inspect
423
+ * @returns HTTP status code or undefined
424
+ */
425
+ extractStatusCode(error) {
426
+ // OpenAI SDK errors have a 'status' property
427
+ const errorWithStatus = error;
428
+ return (errorWithStatus.status ??
429
+ errorWithStatus.statusCode ??
430
+ errorWithStatus.response?.status);
431
+ }
432
+ /**
433
+ * Map HTTP status code to LLMErrorCode.
434
+ *
435
+ * @param statusCode - HTTP status code
436
+ * @param error - Original error for additional context
437
+ * @returns Appropriate LLMErrorCode
438
+ */
439
+ mapStatusToErrorCode(statusCode, error) {
440
+ // Map by status code first
441
+ if (statusCode !== undefined) {
442
+ switch (statusCode) {
443
+ case 401:
444
+ case 403:
445
+ return 'AUTH_FAILED';
446
+ case 429:
447
+ return 'RATE_LIMITED';
448
+ case 408:
449
+ return 'TIMEOUT';
450
+ case 400:
451
+ case 422:
452
+ return 'INVALID_REQUEST';
453
+ case 500:
454
+ case 502:
455
+ case 503:
456
+ case 504:
457
+ return 'SERVER_ERROR';
458
+ default:
459
+ if (statusCode >= 400 && statusCode < 500) {
460
+ return 'INVALID_REQUEST';
461
+ }
462
+ if (statusCode >= 500) {
463
+ return 'SERVER_ERROR';
464
+ }
465
+ }
466
+ }
467
+ // Check for network errors by error code
468
+ const errorWithCode = error;
469
+ const networkErrorCodes = new Set([
470
+ 'ECONNRESET',
471
+ 'ETIMEDOUT',
472
+ 'ECONNREFUSED',
473
+ 'ENOTFOUND',
474
+ 'ENETUNREACH',
475
+ 'EHOSTUNREACH',
476
+ 'EPIPE',
477
+ 'EAI_AGAIN',
478
+ ]);
479
+ if (errorWithCode.code && networkErrorCodes.has(errorWithCode.code)) {
480
+ return 'NETWORK_ERROR';
481
+ }
482
+ // Check error message for timeout indicators
483
+ if (error.message.toLowerCase().includes('timeout') ||
484
+ error.message.toLowerCase().includes('timed out')) {
485
+ return 'TIMEOUT';
486
+ }
487
+ // Default to server error for unknown cases
488
+ return 'SERVER_ERROR';
489
+ }
490
+ }
491
+ //# sourceMappingURL=azure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure.js","sourceRoot":"","sources":["../../src/providers/azure.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Azure OpenAI Provider Tests
3
+ *
4
+ * Tests for AzureOpenAIProvider class.
5
+ * Due to ESM constraints with mocking, these tests focus on:
6
+ * - Properties and getters (name, isConfigured, model, getConfigSummary)
7
+ * - countTokens method (doesn't require API calls)
8
+ * - Error mapping behavior
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=azure.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"azure.test.d.ts","sourceRoot":"","sources":["../../src/providers/azure.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG"}