@jterrazz/test 6.5.0 → 7.0.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.
@@ -1,7 +1,7 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
2
  //#region src/builder/common/intercept/adapters/anthropic.ts
3
3
  const ANTHROPIC_MESSAGES_URL = "https://api.anthropic.com/v1/messages";
4
- function matchesFilter$1(body, filter) {
4
+ function matchesFilter(body, filter) {
5
5
  if (filter.model) {
6
6
  const model = body?.model;
7
7
  if (typeof filter.model === "string" && model !== filter.model) return false;
@@ -32,7 +32,7 @@ const anthropic = {
32
32
  return {
33
33
  method: "POST",
34
34
  url: ANTHROPIC_MESSAGES_URL,
35
- match: filter ? (body) => matchesFilter$1(body, filter) : void 0
35
+ match: filter ? (body) => matchesFilter(body, filter) : void 0
36
36
  };
37
37
  },
38
38
  response(data) {
@@ -77,42 +77,54 @@ const anthropic = {
77
77
  };
78
78
  //#endregion
79
79
  //#region src/builder/common/intercept/adapters/http.ts
80
+ /** Default wrap: raw JSON data becomes the response body. */
81
+ function wrapJson(data) {
82
+ return {
83
+ status: 200,
84
+ body: data
85
+ };
86
+ }
80
87
  /**
81
88
  * Generic HTTP intercept helpers for any URL.
82
89
  *
83
90
  * @example
84
- * .intercept(http.get('https://api.example.com/data'), { body: [...] })
85
- * .intercept(http.post('https://api.stripe.com/v1/charges'), { body: { id: 'ch_...' } })
91
+ * .intercept(http.get('https://api.example.com/data'), 'response.json')
92
+ * .intercept(http.post('https://api.stripe.com/v1/charges'), http.json({ id: 'ch_...' }))
86
93
  */
87
94
  const http = {
88
95
  get(url) {
89
96
  return {
90
97
  method: "GET",
91
- url
98
+ url,
99
+ wrap: wrapJson
92
100
  };
93
101
  },
94
102
  post(url) {
95
103
  return {
96
104
  method: "POST",
97
- url
105
+ url,
106
+ wrap: wrapJson
98
107
  };
99
108
  },
100
109
  put(url) {
101
110
  return {
102
111
  method: "PUT",
103
- url
112
+ url,
113
+ wrap: wrapJson
104
114
  };
105
115
  },
106
116
  delete(url) {
107
117
  return {
108
118
  method: "DELETE",
109
- url
119
+ url,
120
+ wrap: wrapJson
110
121
  };
111
122
  },
112
123
  any(url) {
113
124
  return {
114
125
  method: "*",
115
- url
126
+ url,
127
+ wrap: wrapJson
116
128
  };
117
129
  },
118
130
  json(data, status = 200) {
@@ -132,25 +144,25 @@ const http = {
132
144
  //#region src/builder/common/intercept/adapters/openai.ts
133
145
  const OPENAI_CHAT_URL = "https://api.openai.com/v1/chat/completions";
134
146
  const OPENAI_RESPONSES_URL = "https://api.openai.com/v1/responses";
135
- function matchesFilter(body, filter) {
147
+ function matchesChatFilter(body, filter) {
136
148
  if (filter.model) {
137
149
  const model = body?.model;
138
150
  if (typeof filter.model === "string" && model !== filter.model) return false;
139
151
  if (filter.model instanceof RegExp && !filter.model.test(model ?? "")) return false;
140
152
  }
141
153
  if (filter.system) {
142
- const systemMsg = body?.messages?.find((m) => m.role === "system")?.content ?? "";
143
- if (typeof filter.system === "string" && !systemMsg.includes(filter.system)) return false;
144
- if (filter.system instanceof RegExp && !filter.system.test(systemMsg)) return false;
154
+ const msg = body?.messages?.find((m) => m.role === "system")?.content ?? "";
155
+ if (typeof filter.system === "string" && !msg.includes(filter.system)) return false;
156
+ if (filter.system instanceof RegExp && !filter.system.test(msg)) return false;
145
157
  }
146
158
  if (filter.user) {
147
- const userMsg = body?.messages?.find((m) => m.role === "user")?.content ?? "";
148
- if (typeof filter.user === "string" && !userMsg.includes(filter.user)) return false;
149
- if (filter.user instanceof RegExp && !filter.user.test(userMsg)) return false;
159
+ const msg = body?.messages?.find((m) => m.role === "user")?.content ?? "";
160
+ if (typeof filter.user === "string" && !msg.includes(filter.user)) return false;
161
+ if (filter.user instanceof RegExp && !filter.user.test(msg)) return false;
150
162
  }
151
163
  if (filter.tools) {
152
- const requestTools = body?.tools?.map((t) => t.function?.name).filter(Boolean) ?? [];
153
- if (!filter.tools.every((t) => requestTools.includes(t))) return false;
164
+ const names = body?.tools?.map((t) => t.function?.name).filter(Boolean) ?? [];
165
+ if (!filter.tools.every((t) => names.includes(t))) return false;
154
166
  }
155
167
  if (filter.temperature !== void 0 && body?.temperature !== filter.temperature) return false;
156
168
  return true;
@@ -164,90 +176,94 @@ function matchesResponsesFilter(body, filter) {
164
176
  if (filter.system) {
165
177
  const instructions = body?.instructions ?? "";
166
178
  const systemInput = body?.input?.find?.((m) => m.role === "system")?.content ?? "";
167
- const systemText = instructions || systemInput;
168
- if (typeof filter.system === "string" && !systemText.includes(filter.system)) return false;
169
- if (filter.system instanceof RegExp && !filter.system.test(systemText)) return false;
179
+ const text = instructions || systemInput;
180
+ if (typeof filter.system === "string" && !text.includes(filter.system)) return false;
181
+ if (filter.system instanceof RegExp && !filter.system.test(text)) return false;
170
182
  }
171
183
  if (filter.user) {
172
- const userInputs = (body?.input ?? []).filter((m) => m.role === "user").map((m) => typeof m.content === "string" ? m.content : JSON.stringify(m.content)).join(" ");
173
- if (typeof filter.user === "string" && !userInputs.includes(filter.user)) return false;
174
- if (filter.user instanceof RegExp && !filter.user.test(userInputs)) return false;
184
+ const msgs = (body?.input ?? []).filter((m) => m.role === "user").map((m) => typeof m.content === "string" ? m.content : JSON.stringify(m.content)).join(" ");
185
+ if (typeof filter.user === "string" && !msgs.includes(filter.user)) return false;
186
+ if (filter.user instanceof RegExp && !filter.user.test(msgs)) return false;
175
187
  }
176
188
  if (filter.tools) {
177
- const requestTools = body?.tools?.map((t) => t.name ?? t.function?.name).filter(Boolean) ?? [];
178
- if (!filter.tools.every((t) => requestTools.includes(t))) return false;
189
+ const names = body?.tools?.map((t) => t.name ?? t.function?.name).filter(Boolean) ?? [];
190
+ if (!filter.tools.every((t) => names.includes(t))) return false;
179
191
  }
180
192
  return true;
181
193
  }
194
+ function buildChatReply(data) {
195
+ const content = typeof data === "string" ? data : JSON.stringify(data);
196
+ return {
197
+ status: 200,
198
+ body: {
199
+ id: "chatcmpl-test",
200
+ object: "chat.completion",
201
+ created: Math.floor(Date.now() / 1e3),
202
+ model: "gpt-4o-test",
203
+ choices: [{
204
+ index: 0,
205
+ message: {
206
+ role: "assistant",
207
+ content
208
+ },
209
+ finish_reason: "stop"
210
+ }],
211
+ usage: {
212
+ prompt_tokens: 10,
213
+ completion_tokens: 10,
214
+ total_tokens: 20
215
+ }
216
+ }
217
+ };
218
+ }
219
+ function buildResponsesReply(data) {
220
+ const text = typeof data === "string" ? data : JSON.stringify(data);
221
+ return {
222
+ status: 200,
223
+ body: {
224
+ id: "resp-test",
225
+ object: "response",
226
+ created_at: Math.floor(Date.now() / 1e3),
227
+ model: "gpt-4o-test",
228
+ output: [{
229
+ type: "message",
230
+ id: "msg-test",
231
+ role: "assistant",
232
+ content: [{
233
+ type: "output_text",
234
+ text,
235
+ annotations: []
236
+ }]
237
+ }],
238
+ usage: {
239
+ input_tokens: 10,
240
+ output_tokens: 10,
241
+ total_tokens: 20
242
+ }
243
+ }
244
+ };
245
+ }
182
246
  /**
183
247
  * OpenAI API intercept helpers.
184
248
  */
185
249
  const openai = {
186
- chat(filter) {
250
+ request(filter) {
187
251
  return {
188
252
  method: "POST",
189
253
  url: OPENAI_CHAT_URL,
190
- match: filter ? (body) => matchesFilter(body, filter) : void 0
254
+ match: filter ? (body) => matchesChatFilter(body, filter) : void 0,
255
+ wrap: buildChatReply
191
256
  };
192
257
  },
193
- responses(filter, url) {
258
+ agent(filter, url) {
194
259
  return {
195
260
  method: "POST",
196
261
  url: url ?? OPENAI_RESPONSES_URL,
197
- match: filter ? (body) => matchesResponsesFilter(body, filter) : void 0
198
- };
199
- },
200
- responsesResponse(data) {
201
- const text = typeof data === "string" ? data : JSON.stringify(data);
202
- return {
203
- status: 200,
204
- body: {
205
- id: "resp-test",
206
- object: "response",
207
- created_at: Math.floor(Date.now() / 1e3),
208
- model: "gpt-4o-test",
209
- output: [{
210
- type: "message",
211
- role: "assistant",
212
- content: [{
213
- type: "output_text",
214
- text,
215
- annotations: []
216
- }]
217
- }],
218
- usage: {
219
- input_tokens: 10,
220
- output_tokens: 10,
221
- total_tokens: 20
222
- }
223
- }
224
- };
225
- },
226
- response(data) {
227
- const content = typeof data === "string" ? data : JSON.stringify(data);
228
- return {
229
- status: 200,
230
- body: {
231
- id: "chatcmpl-test",
232
- object: "chat.completion",
233
- created: Math.floor(Date.now() / 1e3),
234
- model: "gpt-4o-test",
235
- choices: [{
236
- index: 0,
237
- message: {
238
- role: "assistant",
239
- content
240
- },
241
- finish_reason: "stop"
242
- }],
243
- usage: {
244
- prompt_tokens: 10,
245
- completion_tokens: 10,
246
- total_tokens: 20
247
- }
248
- }
262
+ match: filter ? (body) => matchesResponsesFilter(body, filter) : void 0,
263
+ wrap: buildResponsesReply
249
264
  };
250
265
  },
266
+ reply: buildChatReply,
251
267
  error(status, message) {
252
268
  return {
253
269
  status,
@@ -259,28 +275,7 @@ const openai = {
259
275
  };
260
276
  },
261
277
  malformed(content) {
262
- return {
263
- status: 200,
264
- body: {
265
- id: "chatcmpl-test",
266
- object: "chat.completion",
267
- created: Math.floor(Date.now() / 1e3),
268
- model: "gpt-4o-test",
269
- choices: [{
270
- index: 0,
271
- message: {
272
- role: "assistant",
273
- content
274
- },
275
- finish_reason: "stop"
276
- }],
277
- usage: {
278
- prompt_tokens: 10,
279
- completion_tokens: 10,
280
- total_tokens: 20
281
- }
282
- }
283
- };
278
+ return buildChatReply(content);
284
279
  },
285
280
  timeout() {
286
281
  return {
@@ -288,7 +283,15 @@ const openai = {
288
283
  body: {},
289
284
  delay: 3e4
290
285
  };
291
- }
286
+ },
287
+ chat(filter) {
288
+ return openai.request(filter);
289
+ },
290
+ response: buildChatReply,
291
+ responses(filter, url) {
292
+ return openai.agent(filter, url);
293
+ },
294
+ responsesResponse: buildResponsesReply
292
295
  };
293
296
  //#endregion
294
297
  exports.anthropic = anthropic;
@@ -1 +1 @@
1
- {"version":3,"file":"intercept.cjs","names":["matchesFilter"],"sources":["../src/builder/common/intercept/adapters/anthropic.ts","../src/builder/common/intercept/adapters/http.ts","../src/builder/common/intercept/adapters/openai.ts"],"sourcesContent":["import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst ANTHROPIC_MESSAGES_URL = 'https://api.anthropic.com/v1/messages';\n\nexport interface AnthropicMessagesFilter {\n /** Match by model name. */\n model?: RegExp | string;\n /** Match by system message content. */\n system?: RegExp | string;\n /** Match by user message content. */\n user?: RegExp | string;\n /** Match by tool names. */\n tools?: string[];\n}\n\nfunction matchesFilter(body: any, filter: AnthropicMessagesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n\n if (filter.system) {\n const system = typeof body?.system === 'string' ? body.system : '';\n if (typeof filter.system === 'string' && !system.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(system)) {\n return false;\n }\n }\n\n if (filter.user) {\n const userMsg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n const text = typeof userMsg === 'string' ? userMsg : JSON.stringify(userMsg);\n if (typeof filter.user === 'string' && !text.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(text)) {\n return false;\n }\n }\n\n if (filter.tools) {\n const requestTools = body?.tools?.map((t: any) => t.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => requestTools.includes(t))) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Anthropic API intercept helpers.\n */\nexport const anthropic = {\n /**\n * Trigger: match Anthropic messages API requests.\n */\n messages(filter?: AnthropicMessagesFilter): InterceptTrigger {\n return {\n method: 'POST',\n url: ANTHROPIC_MESSAGES_URL,\n match: filter ? (body: unknown) => matchesFilter(body, filter) : undefined,\n };\n },\n\n /** Response: wrap data in Anthropic messages format. */\n response(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'msg-test',\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: content }],\n model: 'claude-sonnet-4-20250514',\n stop_reason: 'end_turn',\n usage: { input_tokens: 10, output_tokens: 10 },\n },\n };\n },\n\n /** Response: return an Anthropic error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n type: 'error',\n error: {\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n message: message ?? `Anthropic error (${status})`,\n },\n },\n };\n },\n\n /** Response: simulate a timeout. */\n timeout(): InterceptResponse {\n return { status: 200, body: {}, delay: 30_000 };\n },\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\n/**\n * Generic HTTP intercept helpers for any URL.\n *\n * @example\n * .intercept(http.get('https://api.example.com/data'), { body: [...] })\n * .intercept(http.post('https://api.stripe.com/v1/charges'), { body: { id: 'ch_...' } })\n */\nexport const http = {\n /** Trigger: match GET requests to a URL pattern. */\n get(url: RegExp | string): InterceptTrigger {\n return { method: 'GET', url };\n },\n\n /** Trigger: match POST requests to a URL pattern. */\n post(url: RegExp | string): InterceptTrigger {\n return { method: 'POST', url };\n },\n\n /** Trigger: match PUT requests to a URL pattern. */\n put(url: RegExp | string): InterceptTrigger {\n return { method: 'PUT', url };\n },\n\n /** Trigger: match DELETE requests to a URL pattern. */\n delete(url: RegExp | string): InterceptTrigger {\n return { method: 'DELETE', url };\n },\n\n /** Trigger: match any method to a URL pattern. */\n any(url: RegExp | string): InterceptTrigger {\n return { method: '*', url };\n },\n\n /** Response: simple JSON success. */\n json(data: unknown, status = 200): InterceptResponse {\n return { status, body: data };\n },\n\n /** Response: error with message. */\n error(status: number, message?: string): InterceptResponse {\n return { status, body: { error: message ?? `HTTP ${status}` } };\n },\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst OPENAI_CHAT_URL = 'https://api.openai.com/v1/chat/completions';\nconst OPENAI_RESPONSES_URL = 'https://api.openai.com/v1/responses';\n\nexport interface OpenAIChatFilter {\n /** Match by model name (exact string or regex). */\n model?: RegExp | string;\n /** Match by system message content (regex or substring). */\n system?: RegExp | string;\n /** Match by user message content (regex or substring). */\n user?: RegExp | string;\n /** Match by tool/function names present in the request. */\n tools?: string[];\n /** Match by temperature value. */\n temperature?: number;\n}\n\nfunction matchesFilter(body: any, filter: OpenAIChatFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n\n if (filter.system) {\n const systemMsg = body?.messages?.find((m: any) => m.role === 'system')?.content ?? '';\n if (typeof filter.system === 'string' && !systemMsg.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(systemMsg)) {\n return false;\n }\n }\n\n if (filter.user) {\n const userMsg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n if (typeof filter.user === 'string' && !userMsg.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(userMsg)) {\n return false;\n }\n }\n\n if (filter.tools) {\n const requestTools = body?.tools?.map((t: any) => t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => requestTools.includes(t))) {\n return false;\n }\n }\n\n if (filter.temperature !== undefined && body?.temperature !== filter.temperature) {\n return false;\n }\n\n return true;\n}\n\n/** Responses API filter — uses `input` array instead of `messages`. */\nexport interface OpenAIResponsesFilter {\n /** Match by model name. */\n model?: RegExp | string;\n /** Match by system instruction content. */\n system?: RegExp | string;\n /** Match by user input content. */\n user?: RegExp | string;\n /** Match by tool names. */\n tools?: string[];\n}\n\nfunction matchesResponsesFilter(body: any, filter: OpenAIResponsesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n\n if (filter.system) {\n const instructions = body?.instructions ?? '';\n const systemInput = body?.input?.find?.((m: any) => m.role === 'system')?.content ?? '';\n const systemText = instructions || systemInput;\n if (typeof filter.system === 'string' && !systemText.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(systemText)) {\n return false;\n }\n }\n\n if (filter.user) {\n const userInputs = (body?.input ?? [])\n .filter((m: any) => m.role === 'user')\n .map((m: any) =>\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n )\n .join(' ');\n if (typeof filter.user === 'string' && !userInputs.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(userInputs)) {\n return false;\n }\n }\n\n if (filter.tools) {\n const requestTools =\n body?.tools?.map((t: any) => t.name ?? t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => requestTools.includes(t))) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * OpenAI API intercept helpers.\n */\nexport const openai = {\n /**\n * Trigger: match OpenAI chat completion requests.\n *\n * @param filter - Optional filters to narrow which requests match.\n *\n * @example\n * openai.chat() // any chat call\n * openai.chat({ model: 'gpt-4o' }) // specific model\n * openai.chat({ system: /classify/ }) // system prompt contains \"classify\"\n * openai.chat({ tools: ['extract_facts'] }) // function calling\n */\n chat(filter?: OpenAIChatFilter): InterceptTrigger {\n return {\n method: 'POST',\n url: OPENAI_CHAT_URL,\n match: filter ? (body: unknown) => matchesFilter(body, filter) : undefined,\n };\n },\n\n /**\n * Trigger: match OpenAI Responses API requests (AI SDK v5+).\n *\n * @param filter - Optional filters. Supports custom gateway URLs.\n * @param url - Override URL for custom gateways (e.g. 'https://gateway.example.com/v1/responses').\n *\n * @example\n * openai.responses() // default URL\n * openai.responses({ user: /Report Ingestion/ }) // match by prompt content\n * openai.responses({ model: 'gpt-4o' }, 'https://my-gateway/v1/responses') // custom gateway\n */\n responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger {\n return {\n method: 'POST',\n url: url ?? OPENAI_RESPONSES_URL,\n match: filter ? (body: unknown) => matchesResponsesFilter(body, filter) : undefined,\n };\n },\n\n /**\n * Response: wrap data in OpenAI Responses API format (AI SDK v5+).\n *\n * @example\n * openai.responsesResponse({ categories: ['TECH'] })\n */\n responsesResponse(data: unknown): InterceptResponse {\n const text = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'resp-test',\n object: 'response',\n created_at: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n output: [\n {\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text, annotations: [] }],\n },\n ],\n usage: {\n input_tokens: 10,\n output_tokens: 10,\n total_tokens: 20,\n },\n },\n };\n },\n\n /**\n * Response: wrap data in OpenAI chat completion format.\n *\n * @param data - The content to return (will be JSON.stringified if not a string).\n *\n * @example\n * openai.response({ categories: ['TECH'] })\n */\n response(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'chatcmpl-test',\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n choices: [\n {\n index: 0,\n message: { role: 'assistant', content },\n finish_reason: 'stop',\n },\n ],\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n },\n };\n },\n\n /** Response: return an OpenAI error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n error: {\n message: message ?? `OpenAI error (${status})`,\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n code: status === 429 ? 'rate_limit_exceeded' : null,\n },\n },\n };\n },\n\n /** Response: return malformed (non-JSON) content. */\n malformed(content: string): InterceptResponse {\n return {\n status: 200,\n body: {\n id: 'chatcmpl-test',\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n choices: [\n {\n index: 0,\n message: { role: 'assistant', content },\n finish_reason: 'stop',\n },\n ],\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n },\n };\n },\n\n /** Response: simulate a timeout (30s delay). */\n timeout(): InterceptResponse {\n return {\n status: 200,\n body: {},\n delay: 30_000,\n };\n },\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"intercept.cjs","names":[],"sources":["../src/builder/common/intercept/adapters/anthropic.ts","../src/builder/common/intercept/adapters/http.ts","../src/builder/common/intercept/adapters/openai.ts"],"sourcesContent":["import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst ANTHROPIC_MESSAGES_URL = 'https://api.anthropic.com/v1/messages';\n\nexport interface AnthropicMessagesFilter {\n /** Match by model name. */\n model?: RegExp | string;\n /** Match by system message content. */\n system?: RegExp | string;\n /** Match by user message content. */\n user?: RegExp | string;\n /** Match by tool names. */\n tools?: string[];\n}\n\nfunction matchesFilter(body: any, filter: AnthropicMessagesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n\n if (filter.system) {\n const system = typeof body?.system === 'string' ? body.system : '';\n if (typeof filter.system === 'string' && !system.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(system)) {\n return false;\n }\n }\n\n if (filter.user) {\n const userMsg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n const text = typeof userMsg === 'string' ? userMsg : JSON.stringify(userMsg);\n if (typeof filter.user === 'string' && !text.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(text)) {\n return false;\n }\n }\n\n if (filter.tools) {\n const requestTools = body?.tools?.map((t: any) => t.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => requestTools.includes(t))) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Anthropic API intercept helpers.\n */\nexport const anthropic = {\n /**\n * Trigger: match Anthropic messages API requests.\n */\n messages(filter?: AnthropicMessagesFilter): InterceptTrigger {\n return {\n method: 'POST',\n url: ANTHROPIC_MESSAGES_URL,\n match: filter ? (body: unknown) => matchesFilter(body, filter) : undefined,\n };\n },\n\n /** Response: wrap data in Anthropic messages format. */\n response(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'msg-test',\n type: 'message',\n role: 'assistant',\n content: [{ type: 'text', text: content }],\n model: 'claude-sonnet-4-20250514',\n stop_reason: 'end_turn',\n usage: { input_tokens: 10, output_tokens: 10 },\n },\n };\n },\n\n /** Response: return an Anthropic error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n type: 'error',\n error: {\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n message: message ?? `Anthropic error (${status})`,\n },\n },\n };\n },\n\n /** Response: simulate a timeout. */\n timeout(): InterceptResponse {\n return { status: 200, body: {}, delay: 30_000 };\n },\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\n/** Default wrap: raw JSON data becomes the response body. */\nfunction wrapJson(data: unknown): InterceptResponse {\n return { status: 200, body: data };\n}\n\n/**\n * Generic HTTP intercept helpers for any URL.\n *\n * @example\n * .intercept(http.get('https://api.example.com/data'), 'response.json')\n * .intercept(http.post('https://api.stripe.com/v1/charges'), http.json({ id: 'ch_...' }))\n */\nexport const http = {\n /** Trigger: match GET requests to a URL pattern. */\n get(url: RegExp | string): InterceptTrigger {\n return { method: 'GET', url, wrap: wrapJson };\n },\n\n /** Trigger: match POST requests to a URL pattern. */\n post(url: RegExp | string): InterceptTrigger {\n return { method: 'POST', url, wrap: wrapJson };\n },\n\n /** Trigger: match PUT requests to a URL pattern. */\n put(url: RegExp | string): InterceptTrigger {\n return { method: 'PUT', url, wrap: wrapJson };\n },\n\n /** Trigger: match DELETE requests to a URL pattern. */\n delete(url: RegExp | string): InterceptTrigger {\n return { method: 'DELETE', url, wrap: wrapJson };\n },\n\n /** Trigger: match any method to a URL pattern. */\n any(url: RegExp | string): InterceptTrigger {\n return { method: '*', url, wrap: wrapJson };\n },\n\n /** Response: simple JSON success. */\n json(data: unknown, status = 200): InterceptResponse {\n return { status, body: data };\n },\n\n /** Response: error with message. */\n error(status: number, message?: string): InterceptResponse {\n return { status, body: { error: message ?? `HTTP ${status}` } };\n },\n};\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\nconst OPENAI_CHAT_URL = 'https://api.openai.com/v1/chat/completions';\nconst OPENAI_RESPONSES_URL = 'https://api.openai.com/v1/responses';\n\n// ── Chat Completions filters ──\n\nexport interface OpenAIChatFilter {\n model?: RegExp | string;\n system?: RegExp | string;\n user?: RegExp | string;\n tools?: string[];\n temperature?: number;\n}\n\nfunction matchesChatFilter(body: any, filter: OpenAIChatFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n if (filter.system) {\n const msg = body?.messages?.find((m: any) => m.role === 'system')?.content ?? '';\n if (typeof filter.system === 'string' && !msg.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(msg)) {\n return false;\n }\n }\n if (filter.user) {\n const msg = body?.messages?.find((m: any) => m.role === 'user')?.content ?? '';\n if (typeof filter.user === 'string' && !msg.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(msg)) {\n return false;\n }\n }\n if (filter.tools) {\n const names = body?.tools?.map((t: any) => t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => names.includes(t))) {\n return false;\n }\n }\n if (filter.temperature !== undefined && body?.temperature !== filter.temperature) {\n return false;\n }\n return true;\n}\n\n// ── Responses API filters ──\n\nexport interface OpenAIResponsesFilter {\n model?: RegExp | string;\n system?: RegExp | string;\n user?: RegExp | string;\n tools?: string[];\n}\n\nfunction matchesResponsesFilter(body: any, filter: OpenAIResponsesFilter): boolean {\n if (filter.model) {\n const model = body?.model;\n if (typeof filter.model === 'string' && model !== filter.model) {\n return false;\n }\n if (filter.model instanceof RegExp && !filter.model.test(model ?? '')) {\n return false;\n }\n }\n if (filter.system) {\n const instructions = body?.instructions ?? '';\n const systemInput = body?.input?.find?.((m: any) => m.role === 'system')?.content ?? '';\n const text = instructions || systemInput;\n if (typeof filter.system === 'string' && !text.includes(filter.system)) {\n return false;\n }\n if (filter.system instanceof RegExp && !filter.system.test(text)) {\n return false;\n }\n }\n if (filter.user) {\n const msgs = (body?.input ?? [])\n .filter((m: any) => m.role === 'user')\n .map((m: any) =>\n typeof m.content === 'string' ? m.content : JSON.stringify(m.content),\n )\n .join(' ');\n if (typeof filter.user === 'string' && !msgs.includes(filter.user)) {\n return false;\n }\n if (filter.user instanceof RegExp && !filter.user.test(msgs)) {\n return false;\n }\n }\n if (filter.tools) {\n const names =\n body?.tools?.map((t: any) => t.name ?? t.function?.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => names.includes(t))) {\n return false;\n }\n }\n return true;\n}\n\n// ── Response builders ──\n\nfunction buildChatReply(data: unknown): InterceptResponse {\n const content = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'chatcmpl-test',\n object: 'chat.completion',\n created: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n choices: [{ index: 0, message: { role: 'assistant', content }, finish_reason: 'stop' }],\n usage: { prompt_tokens: 10, completion_tokens: 10, total_tokens: 20 },\n },\n };\n}\n\nfunction buildResponsesReply(data: unknown): InterceptResponse {\n const text = typeof data === 'string' ? data : JSON.stringify(data);\n return {\n status: 200,\n body: {\n id: 'resp-test',\n object: 'response',\n created_at: Math.floor(Date.now() / 1000),\n model: 'gpt-4o-test',\n output: [\n {\n type: 'message',\n id: 'msg-test',\n role: 'assistant',\n content: [{ type: 'output_text', text, annotations: [] }],\n },\n ],\n usage: { input_tokens: 10, output_tokens: 10, total_tokens: 20 },\n },\n };\n}\n\n// ── Public API ──\n\n/**\n * OpenAI API intercept helpers.\n */\nexport const openai = {\n /**\n * Trigger: match Chat Completions API requests.\n *\n * @example\n * openai.request() // any chat call\n * openai.request({ model: 'gpt-4o' }) // specific model\n * openai.request({ system: /classify/ }) // system prompt match\n */\n request(filter?: OpenAIChatFilter): InterceptTrigger {\n return {\n method: 'POST',\n url: OPENAI_CHAT_URL,\n match: filter ? (body: unknown) => matchesChatFilter(body, filter) : undefined,\n wrap: buildChatReply,\n };\n },\n\n /**\n * Trigger: match Responses API requests (AI SDK v5+) with auto-wrapping.\n * When used with a JSON file, the data is automatically wrapped in the\n * Responses API envelope.\n *\n * @param filter - Optional body filters.\n * @param url - Custom gateway URL (default: api.openai.com).\n *\n * @example\n * openai.agent({ user: /Report Ingestion/ }, GATEWAY)\n */\n agent(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger {\n return {\n method: 'POST',\n url: url ?? OPENAI_RESPONSES_URL,\n match: filter ? (body: unknown) => matchesResponsesFilter(body, filter) : undefined,\n wrap: buildResponsesReply,\n };\n },\n\n /**\n * Response: wrap data in Chat Completions format.\n *\n * @example\n * openai.reply({ categories: ['TECH'] })\n */\n reply: buildChatReply,\n\n /** Response: return an OpenAI error. */\n error(status: number, message?: string): InterceptResponse {\n return {\n status,\n body: {\n error: {\n message: message ?? `OpenAI error (${status})`,\n type: status === 429 ? 'rate_limit_error' : 'api_error',\n code: status === 429 ? 'rate_limit_exceeded' : null,\n },\n },\n };\n },\n\n /** Response: return malformed content. */\n malformed(content: string): InterceptResponse {\n return buildChatReply(content);\n },\n\n /** Response: simulate a timeout. */\n timeout(): InterceptResponse {\n return { status: 200, body: {}, delay: 30_000 };\n },\n\n // ── Legacy aliases ──\n\n /** @deprecated Use openai.request() instead. */\n chat(filter?: OpenAIChatFilter): InterceptTrigger {\n return openai.request(filter);\n },\n\n /** @deprecated Use openai.reply() instead. */\n response: buildChatReply,\n\n /** @deprecated Use openai.agent() instead. */\n responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger {\n return openai.agent(filter, url);\n },\n\n /** @deprecated Use openai.reply() or .intercept(trigger, 'file.json') instead. */\n responsesResponse: buildResponsesReply,\n};\n"],"mappings":"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"}
@@ -29,8 +29,8 @@ declare const anthropic: {
29
29
  * Generic HTTP intercept helpers for any URL.
30
30
  *
31
31
  * @example
32
- * .intercept(http.get('https://api.example.com/data'), { body: [...] })
33
- * .intercept(http.post('https://api.stripe.com/v1/charges'), { body: { id: 'ch_...' } })
32
+ * .intercept(http.get('https://api.example.com/data'), 'response.json')
33
+ * .intercept(http.post('https://api.stripe.com/v1/charges'), http.json({ id: 'ch_...' }))
34
34
  */
35
35
  declare const http: {
36
36
  /** Trigger: match GET requests to a URL pattern. */get(url: RegExp | string): InterceptTrigger; /** Trigger: match POST requests to a URL pattern. */
@@ -44,75 +44,59 @@ declare const http: {
44
44
  //#endregion
45
45
  //#region src/builder/common/intercept/adapters/openai.d.ts
46
46
  interface OpenAIChatFilter {
47
- /** Match by model name (exact string or regex). */
48
47
  model?: RegExp | string;
49
- /** Match by system message content (regex or substring). */
50
48
  system?: RegExp | string;
51
- /** Match by user message content (regex or substring). */
52
49
  user?: RegExp | string;
53
- /** Match by tool/function names present in the request. */
54
50
  tools?: string[];
55
- /** Match by temperature value. */
56
51
  temperature?: number;
57
52
  }
58
- /** Responses API filter — uses `input` array instead of `messages`. */
59
53
  interface OpenAIResponsesFilter {
60
- /** Match by model name. */
61
54
  model?: RegExp | string;
62
- /** Match by system instruction content. */
63
55
  system?: RegExp | string;
64
- /** Match by user input content. */
65
56
  user?: RegExp | string;
66
- /** Match by tool names. */
67
57
  tools?: string[];
68
58
  }
59
+ declare function buildChatReply(data: unknown): InterceptResponse;
60
+ declare function buildResponsesReply(data: unknown): InterceptResponse;
69
61
  /**
70
62
  * OpenAI API intercept helpers.
71
63
  */
72
64
  declare const openai: {
73
65
  /**
74
- * Trigger: match OpenAI chat completion requests.
75
- *
76
- * @param filter - Optional filters to narrow which requests match.
66
+ * Trigger: match Chat Completions API requests.
77
67
  *
78
68
  * @example
79
- * openai.chat() // any chat call
80
- * openai.chat({ model: 'gpt-4o' }) // specific model
81
- * openai.chat({ system: /classify/ }) // system prompt contains "classify"
82
- * openai.chat({ tools: ['extract_facts'] }) // function calling
69
+ * openai.request() // any chat call
70
+ * openai.request({ model: 'gpt-4o' }) // specific model
71
+ * openai.request({ system: /classify/ }) // system prompt match
83
72
  */
84
- chat(filter?: OpenAIChatFilter): InterceptTrigger;
73
+ request(filter?: OpenAIChatFilter): InterceptTrigger;
85
74
  /**
86
- * Trigger: match OpenAI Responses API requests (AI SDK v5+).
75
+ * Trigger: match Responses API requests (AI SDK v5+) with auto-wrapping.
76
+ * When used with a JSON file, the data is automatically wrapped in the
77
+ * Responses API envelope.
87
78
  *
88
- * @param filter - Optional filters. Supports custom gateway URLs.
89
- * @param url - Override URL for custom gateways (e.g. 'https://gateway.example.com/v1/responses').
79
+ * @param filter - Optional body filters.
80
+ * @param url - Custom gateway URL (default: api.openai.com).
90
81
  *
91
82
  * @example
92
- * openai.responses() // default URL
93
- * openai.responses({ user: /Report Ingestion/ }) // match by prompt content
94
- * openai.responses({ model: 'gpt-4o' }, 'https://my-gateway/v1/responses') // custom gateway
83
+ * openai.agent({ user: /Report Ingestion/ }, GATEWAY)
95
84
  */
96
- responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger;
85
+ agent(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger;
97
86
  /**
98
- * Response: wrap data in OpenAI Responses API format (AI SDK v5+).
87
+ * Response: wrap data in Chat Completions format.
99
88
  *
100
89
  * @example
101
- * openai.responsesResponse({ categories: ['TECH'] })
90
+ * openai.reply({ categories: ['TECH'] })
102
91
  */
103
- responsesResponse(data: unknown): InterceptResponse;
104
- /**
105
- * Response: wrap data in OpenAI chat completion format.
106
- *
107
- * @param data - The content to return (will be JSON.stringified if not a string).
108
- *
109
- * @example
110
- * openai.response({ categories: ['TECH'] })
111
- */
112
- response(data: unknown): InterceptResponse; /** Response: return an OpenAI error. */
113
- error(status: number, message?: string): InterceptResponse; /** Response: return malformed (non-JSON) content. */
114
- malformed(content: string): InterceptResponse; /** Response: simulate a timeout (30s delay). */
115
- timeout(): InterceptResponse;
92
+ reply: typeof buildChatReply; /** Response: return an OpenAI error. */
93
+ error(status: number, message?: string): InterceptResponse; /** Response: return malformed content. */
94
+ malformed(content: string): InterceptResponse; /** Response: simulate a timeout. */
95
+ timeout(): InterceptResponse; /** @deprecated Use openai.request() instead. */
96
+ chat(filter?: OpenAIChatFilter): InterceptTrigger; /** @deprecated Use openai.reply() instead. */
97
+ response: typeof buildChatReply; /** @deprecated Use openai.agent() instead. */
98
+ responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger; /** @deprecated Use openai.reply() or .intercept(trigger, 'file.json') instead. */
99
+ responsesResponse: typeof buildResponsesReply;
116
100
  };
117
101
  //#endregion
118
102
  export { type InterceptEntry, type InterceptResponse, type InterceptTrigger, anthropic, http, openai };
@@ -29,8 +29,8 @@ declare const anthropic: {
29
29
  * Generic HTTP intercept helpers for any URL.
30
30
  *
31
31
  * @example
32
- * .intercept(http.get('https://api.example.com/data'), { body: [...] })
33
- * .intercept(http.post('https://api.stripe.com/v1/charges'), { body: { id: 'ch_...' } })
32
+ * .intercept(http.get('https://api.example.com/data'), 'response.json')
33
+ * .intercept(http.post('https://api.stripe.com/v1/charges'), http.json({ id: 'ch_...' }))
34
34
  */
35
35
  declare const http: {
36
36
  /** Trigger: match GET requests to a URL pattern. */get(url: RegExp | string): InterceptTrigger; /** Trigger: match POST requests to a URL pattern. */
@@ -44,75 +44,59 @@ declare const http: {
44
44
  //#endregion
45
45
  //#region src/builder/common/intercept/adapters/openai.d.ts
46
46
  interface OpenAIChatFilter {
47
- /** Match by model name (exact string or regex). */
48
47
  model?: RegExp | string;
49
- /** Match by system message content (regex or substring). */
50
48
  system?: RegExp | string;
51
- /** Match by user message content (regex or substring). */
52
49
  user?: RegExp | string;
53
- /** Match by tool/function names present in the request. */
54
50
  tools?: string[];
55
- /** Match by temperature value. */
56
51
  temperature?: number;
57
52
  }
58
- /** Responses API filter — uses `input` array instead of `messages`. */
59
53
  interface OpenAIResponsesFilter {
60
- /** Match by model name. */
61
54
  model?: RegExp | string;
62
- /** Match by system instruction content. */
63
55
  system?: RegExp | string;
64
- /** Match by user input content. */
65
56
  user?: RegExp | string;
66
- /** Match by tool names. */
67
57
  tools?: string[];
68
58
  }
59
+ declare function buildChatReply(data: unknown): InterceptResponse;
60
+ declare function buildResponsesReply(data: unknown): InterceptResponse;
69
61
  /**
70
62
  * OpenAI API intercept helpers.
71
63
  */
72
64
  declare const openai: {
73
65
  /**
74
- * Trigger: match OpenAI chat completion requests.
75
- *
76
- * @param filter - Optional filters to narrow which requests match.
66
+ * Trigger: match Chat Completions API requests.
77
67
  *
78
68
  * @example
79
- * openai.chat() // any chat call
80
- * openai.chat({ model: 'gpt-4o' }) // specific model
81
- * openai.chat({ system: /classify/ }) // system prompt contains "classify"
82
- * openai.chat({ tools: ['extract_facts'] }) // function calling
69
+ * openai.request() // any chat call
70
+ * openai.request({ model: 'gpt-4o' }) // specific model
71
+ * openai.request({ system: /classify/ }) // system prompt match
83
72
  */
84
- chat(filter?: OpenAIChatFilter): InterceptTrigger;
73
+ request(filter?: OpenAIChatFilter): InterceptTrigger;
85
74
  /**
86
- * Trigger: match OpenAI Responses API requests (AI SDK v5+).
75
+ * Trigger: match Responses API requests (AI SDK v5+) with auto-wrapping.
76
+ * When used with a JSON file, the data is automatically wrapped in the
77
+ * Responses API envelope.
87
78
  *
88
- * @param filter - Optional filters. Supports custom gateway URLs.
89
- * @param url - Override URL for custom gateways (e.g. 'https://gateway.example.com/v1/responses').
79
+ * @param filter - Optional body filters.
80
+ * @param url - Custom gateway URL (default: api.openai.com).
90
81
  *
91
82
  * @example
92
- * openai.responses() // default URL
93
- * openai.responses({ user: /Report Ingestion/ }) // match by prompt content
94
- * openai.responses({ model: 'gpt-4o' }, 'https://my-gateway/v1/responses') // custom gateway
83
+ * openai.agent({ user: /Report Ingestion/ }, GATEWAY)
95
84
  */
96
- responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger;
85
+ agent(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger;
97
86
  /**
98
- * Response: wrap data in OpenAI Responses API format (AI SDK v5+).
87
+ * Response: wrap data in Chat Completions format.
99
88
  *
100
89
  * @example
101
- * openai.responsesResponse({ categories: ['TECH'] })
90
+ * openai.reply({ categories: ['TECH'] })
102
91
  */
103
- responsesResponse(data: unknown): InterceptResponse;
104
- /**
105
- * Response: wrap data in OpenAI chat completion format.
106
- *
107
- * @param data - The content to return (will be JSON.stringified if not a string).
108
- *
109
- * @example
110
- * openai.response({ categories: ['TECH'] })
111
- */
112
- response(data: unknown): InterceptResponse; /** Response: return an OpenAI error. */
113
- error(status: number, message?: string): InterceptResponse; /** Response: return malformed (non-JSON) content. */
114
- malformed(content: string): InterceptResponse; /** Response: simulate a timeout (30s delay). */
115
- timeout(): InterceptResponse;
92
+ reply: typeof buildChatReply; /** Response: return an OpenAI error. */
93
+ error(status: number, message?: string): InterceptResponse; /** Response: return malformed content. */
94
+ malformed(content: string): InterceptResponse; /** Response: simulate a timeout. */
95
+ timeout(): InterceptResponse; /** @deprecated Use openai.request() instead. */
96
+ chat(filter?: OpenAIChatFilter): InterceptTrigger; /** @deprecated Use openai.reply() instead. */
97
+ response: typeof buildChatReply; /** @deprecated Use openai.agent() instead. */
98
+ responses(filter?: OpenAIResponsesFilter, url?: string): InterceptTrigger; /** @deprecated Use openai.reply() or .intercept(trigger, 'file.json') instead. */
99
+ responsesResponse: typeof buildResponsesReply;
116
100
  };
117
101
  //#endregion
118
102
  export { type InterceptEntry, type InterceptResponse, type InterceptTrigger, anthropic, http, openai };