@jterrazz/test 7.0.0 → 8.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,5 +1,5 @@
1
1
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
- //#region src/builder/common/intercept/adapters/anthropic.ts
2
+ //#region src/spec/intercept/adapters/anthropic.ts
3
3
  const ANTHROPIC_MESSAGES_URL = "https://api.anthropic.com/v1/messages";
4
4
  function matchesFilter(body, filter) {
5
5
  if (filter.model) {
@@ -19,42 +19,60 @@ function matchesFilter(body, filter) {
19
19
  if (filter.user instanceof RegExp && !filter.user.test(text)) return false;
20
20
  }
21
21
  if (filter.tools) {
22
- const requestTools = body?.tools?.map((t) => t.name).filter(Boolean) ?? [];
23
- if (!filter.tools.every((t) => requestTools.includes(t))) return false;
22
+ const names = body?.tools?.map((t) => t.name).filter(Boolean) ?? [];
23
+ if (!filter.tools.every((t) => names.includes(t))) return false;
24
24
  }
25
25
  return true;
26
26
  }
27
+ function buildReply(data) {
28
+ return {
29
+ status: 200,
30
+ body: {
31
+ id: "msg-test",
32
+ type: "message",
33
+ role: "assistant",
34
+ content: [{
35
+ type: "text",
36
+ text: typeof data === "string" ? data : JSON.stringify(data)
37
+ }],
38
+ model: "claude-sonnet-4-20250514",
39
+ stop_reason: "end_turn",
40
+ usage: {
41
+ input_tokens: 10,
42
+ output_tokens: 10
43
+ }
44
+ }
45
+ };
46
+ }
27
47
  /**
28
48
  * Anthropic API intercept helpers.
29
49
  */
30
50
  const anthropic = {
31
- messages(filter) {
51
+ request(filter) {
32
52
  return {
53
+ adapter: "anthropic",
33
54
  method: "POST",
34
55
  url: ANTHROPIC_MESSAGES_URL,
35
- match: filter ? (body) => matchesFilter(body, filter) : void 0
56
+ match: filter ? (body) => matchesFilter(body, filter) : void 0,
57
+ wrap: buildReply
36
58
  };
37
59
  },
38
- response(data) {
60
+ message(filter, url) {
39
61
  return {
40
- status: 200,
41
- body: {
42
- id: "msg-test",
43
- type: "message",
44
- role: "assistant",
45
- content: [{
46
- type: "text",
47
- text: typeof data === "string" ? data : JSON.stringify(data)
48
- }],
49
- model: "claude-sonnet-4-20250514",
50
- stop_reason: "end_turn",
51
- usage: {
52
- input_tokens: 10,
53
- output_tokens: 10
54
- }
62
+ adapter: "anthropic",
63
+ method: "POST",
64
+ url: url ?? ANTHROPIC_MESSAGES_URL,
65
+ match: filter ? (body) => matchesFilter(body, filter) : void 0,
66
+ wrap(data) {
67
+ if (data && typeof data === "object" && !Array.isArray(data)) return {
68
+ status: 200,
69
+ body: data
70
+ };
71
+ return buildReply(data);
55
72
  }
56
73
  };
57
74
  },
75
+ reply: buildReply,
58
76
  error(status, message) {
59
77
  return {
60
78
  status,
@@ -75,9 +93,14 @@ const anthropic = {
75
93
  };
76
94
  }
77
95
  };
96
+ /**
97
+ * Alias for {@link anthropic} — matches consumers that call the vendor "claude".
98
+ * Re-exposed as a spread copy so downstream tooling (Knip, dts rollup) sees a
99
+ * distinct export and not a duplicate of `anthropic`.
100
+ */
101
+ const claude = { ...anthropic };
78
102
  //#endregion
79
- //#region src/builder/common/intercept/adapters/http.ts
80
- /** Default wrap: raw JSON data becomes the response body. */
103
+ //#region src/spec/intercept/adapters/http.ts
81
104
  function wrapJson(data) {
82
105
  return {
83
106
  status: 200,
@@ -88,12 +111,12 @@ function wrapJson(data) {
88
111
  * Generic HTTP intercept helpers for any URL.
89
112
  *
90
113
  * @example
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_...' }))
114
+ * .intercept(http.get('https://api.example.com/data'), 'http/response.json')
93
115
  */
94
116
  const http = {
95
117
  get(url) {
96
118
  return {
119
+ adapter: "http",
97
120
  method: "GET",
98
121
  url,
99
122
  wrap: wrapJson
@@ -101,6 +124,7 @@ const http = {
101
124
  },
102
125
  post(url) {
103
126
  return {
127
+ adapter: "http",
104
128
  method: "POST",
105
129
  url,
106
130
  wrap: wrapJson
@@ -108,6 +132,7 @@ const http = {
108
132
  },
109
133
  put(url) {
110
134
  return {
135
+ adapter: "http",
111
136
  method: "PUT",
112
137
  url,
113
138
  wrap: wrapJson
@@ -115,6 +140,7 @@ const http = {
115
140
  },
116
141
  delete(url) {
117
142
  return {
143
+ adapter: "http",
118
144
  method: "DELETE",
119
145
  url,
120
146
  wrap: wrapJson
@@ -122,6 +148,7 @@ const http = {
122
148
  },
123
149
  any(url) {
124
150
  return {
151
+ adapter: "http",
125
152
  method: "*",
126
153
  url,
127
154
  wrap: wrapJson
@@ -141,7 +168,7 @@ const http = {
141
168
  }
142
169
  };
143
170
  //#endregion
144
- //#region src/builder/common/intercept/adapters/openai.ts
171
+ //#region src/spec/intercept/adapters/openai.ts
145
172
  const OPENAI_CHAT_URL = "https://api.openai.com/v1/chat/completions";
146
173
  const OPENAI_RESPONSES_URL = "https://api.openai.com/v1/responses";
147
174
  function matchesChatFilter(body, filter) {
@@ -249,6 +276,7 @@ function buildResponsesReply(data) {
249
276
  const openai = {
250
277
  request(filter) {
251
278
  return {
279
+ adapter: "openai",
252
280
  method: "POST",
253
281
  url: OPENAI_CHAT_URL,
254
282
  match: filter ? (body) => matchesChatFilter(body, filter) : void 0,
@@ -257,6 +285,7 @@ const openai = {
257
285
  },
258
286
  agent(filter, url) {
259
287
  return {
288
+ adapter: "openai",
260
289
  method: "POST",
261
290
  url: url ?? OPENAI_RESPONSES_URL,
262
291
  match: filter ? (body) => matchesResponsesFilter(body, filter) : void 0,
@@ -283,18 +312,11 @@ const openai = {
283
312
  body: {},
284
313
  delay: 3e4
285
314
  };
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
315
+ }
295
316
  };
296
317
  //#endregion
297
318
  exports.anthropic = anthropic;
319
+ exports.claude = claude;
298
320
  exports.http = http;
299
321
  exports.openai = openai;
300
322
 
@@ -1 +1 @@
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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"}
1
+ {"version":3,"file":"intercept.cjs","names":[],"sources":["../src/spec/intercept/adapters/anthropic.ts","../src/spec/intercept/adapters/http.ts","../src/spec/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 model?: RegExp | string;\n system?: RegExp | string;\n user?: RegExp | string;\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 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 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 if (filter.tools) {\n const names = body?.tools?.map((t: any) => t.name).filter(Boolean) ?? [];\n if (!filter.tools.every((t) => names.includes(t))) {\n return false;\n }\n }\n return true;\n}\n\nfunction buildReply(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/**\n * Anthropic API intercept helpers.\n */\nexport const anthropic = {\n /**\n * Trigger: match Anthropic messages API requests.\n *\n * @example\n * anthropic.request()\n * anthropic.request({ system: /classify/ })\n */\n request(filter?: AnthropicMessagesFilter): InterceptTrigger {\n return {\n adapter: 'anthropic',\n method: 'POST',\n url: ANTHROPIC_MESSAGES_URL,\n match: filter ? (body: unknown) => matchesFilter(body, filter) : undefined,\n wrap: buildReply,\n };\n },\n\n /**\n * Trigger: match `messages.create` calls, optionally routed through a\n * custom gateway URL. Mirrors `openai.agent()`. When used with a JSON\n * fixture file, the data is returned as-is (no wrapping) because Anthropic\n * fixtures are typically already in the `messages.create` response shape.\n *\n * @example\n * anthropic.message({ user: /classify/ }, GATEWAY)\n * claude.message({ system: /journal/ }, GATEWAY)\n */\n message(filter?: AnthropicMessagesFilter, url?: string): InterceptTrigger {\n return {\n adapter: 'anthropic',\n method: 'POST',\n url: url ?? ANTHROPIC_MESSAGES_URL,\n match: filter ? (body: unknown) => matchesFilter(body, filter) : undefined,\n // Fixture files are already in the messages.create response shape;\n // Pass them through verbatim. Falls back to wrapping for strings.\n wrap(data: unknown): InterceptResponse {\n if (data && typeof data === 'object' && !Array.isArray(data)) {\n return { status: 200, body: data as Record<string, unknown> };\n }\n return buildReply(data);\n },\n };\n },\n\n /** Response: wrap data in Anthropic messages format. */\n reply: buildReply,\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\n/**\n * Alias for {@link anthropic} — matches consumers that call the vendor \"claude\".\n * Re-exposed as a spread copy so downstream tooling (Knip, dts rollup) sees a\n * distinct export and not a duplicate of `anthropic`.\n */\nexport const claude: typeof anthropic = { ...anthropic };\n","import type { InterceptResponse, InterceptTrigger } from '../types.js';\n\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'), 'http/response.json')\n */\nexport const http = {\n get(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'GET', url, wrap: wrapJson };\n },\n\n post(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'POST', url, wrap: wrapJson };\n },\n\n put(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'PUT', url, wrap: wrapJson };\n },\n\n delete(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', method: 'DELETE', url, wrap: wrapJson };\n },\n\n any(url: RegExp | string): InterceptTrigger {\n return { adapter: 'http', 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 adapter: 'openai',\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 adapter: 'openai',\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"],"mappings":"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"}
@@ -1,48 +1,65 @@
1
1
  import { n as InterceptResponse, r as InterceptTrigger, t as InterceptEntry } from "./types.cjs";
2
2
 
3
- //#region src/builder/common/intercept/adapters/anthropic.d.ts
3
+ //#region src/spec/intercept/adapters/anthropic.d.ts
4
4
  interface AnthropicMessagesFilter {
5
- /** Match by model name. */
6
5
  model?: RegExp | string;
7
- /** Match by system message content. */
8
6
  system?: RegExp | string;
9
- /** Match by user message content. */
10
7
  user?: RegExp | string;
11
- /** Match by tool names. */
12
8
  tools?: string[];
13
9
  }
10
+ declare function buildReply(data: unknown): InterceptResponse;
14
11
  /**
15
12
  * Anthropic API intercept helpers.
16
13
  */
17
14
  declare const anthropic: {
18
15
  /**
19
16
  * Trigger: match Anthropic messages API requests.
17
+ *
18
+ * @example
19
+ * anthropic.request()
20
+ * anthropic.request({ system: /classify/ })
20
21
  */
21
- messages(filter?: AnthropicMessagesFilter): InterceptTrigger; /** Response: wrap data in Anthropic messages format. */
22
- response(data: unknown): InterceptResponse; /** Response: return an Anthropic error. */
22
+ request(filter?: AnthropicMessagesFilter): InterceptTrigger;
23
+ /**
24
+ * Trigger: match `messages.create` calls, optionally routed through a
25
+ * custom gateway URL. Mirrors `openai.agent()`. When used with a JSON
26
+ * fixture file, the data is returned as-is (no wrapping) because Anthropic
27
+ * fixtures are typically already in the `messages.create` response shape.
28
+ *
29
+ * @example
30
+ * anthropic.message({ user: /classify/ }, GATEWAY)
31
+ * claude.message({ system: /journal/ }, GATEWAY)
32
+ */
33
+ message(filter?: AnthropicMessagesFilter, url?: string): InterceptTrigger; /** Response: wrap data in Anthropic messages format. */
34
+ reply: typeof buildReply; /** Response: return an Anthropic error. */
23
35
  error(status: number, message?: string): InterceptResponse; /** Response: simulate a timeout. */
24
36
  timeout(): InterceptResponse;
25
37
  };
38
+ /**
39
+ * Alias for {@link anthropic} — matches consumers that call the vendor "claude".
40
+ * Re-exposed as a spread copy so downstream tooling (Knip, dts rollup) sees a
41
+ * distinct export and not a duplicate of `anthropic`.
42
+ */
43
+ declare const claude: typeof anthropic;
26
44
  //#endregion
27
- //#region src/builder/common/intercept/adapters/http.d.ts
45
+ //#region src/spec/intercept/adapters/http.d.ts
28
46
  /**
29
47
  * Generic HTTP intercept helpers for any URL.
30
48
  *
31
49
  * @example
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_...' }))
50
+ * .intercept(http.get('https://api.example.com/data'), 'http/response.json')
34
51
  */
35
52
  declare const http: {
36
- /** Trigger: match GET requests to a URL pattern. */get(url: RegExp | string): InterceptTrigger; /** Trigger: match POST requests to a URL pattern. */
37
- post(url: RegExp | string): InterceptTrigger; /** Trigger: match PUT requests to a URL pattern. */
38
- put(url: RegExp | string): InterceptTrigger; /** Trigger: match DELETE requests to a URL pattern. */
39
- delete(url: RegExp | string): InterceptTrigger; /** Trigger: match any method to a URL pattern. */
53
+ get(url: RegExp | string): InterceptTrigger;
54
+ post(url: RegExp | string): InterceptTrigger;
55
+ put(url: RegExp | string): InterceptTrigger;
56
+ delete(url: RegExp | string): InterceptTrigger;
40
57
  any(url: RegExp | string): InterceptTrigger; /** Response: simple JSON success. */
41
58
  json(data: unknown, status?: number): InterceptResponse; /** Response: error with message. */
42
59
  error(status: number, message?: string): InterceptResponse;
43
60
  };
44
61
  //#endregion
45
- //#region src/builder/common/intercept/adapters/openai.d.ts
62
+ //#region src/spec/intercept/adapters/openai.d.ts
46
63
  interface OpenAIChatFilter {
47
64
  model?: RegExp | string;
48
65
  system?: RegExp | string;
@@ -57,7 +74,6 @@ interface OpenAIResponsesFilter {
57
74
  tools?: string[];
58
75
  }
59
76
  declare function buildChatReply(data: unknown): InterceptResponse;
60
- declare function buildResponsesReply(data: unknown): InterceptResponse;
61
77
  /**
62
78
  * OpenAI API intercept helpers.
63
79
  */
@@ -92,12 +108,8 @@ declare const openai: {
92
108
  reply: typeof buildChatReply; /** Response: return an OpenAI error. */
93
109
  error(status: number, message?: string): InterceptResponse; /** Response: return malformed content. */
94
110
  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;
111
+ timeout(): InterceptResponse;
100
112
  };
101
113
  //#endregion
102
- export { type InterceptEntry, type InterceptResponse, type InterceptTrigger, anthropic, http, openai };
114
+ export { type InterceptEntry, type InterceptResponse, type InterceptTrigger, anthropic, claude, http, openai };
103
115
  //# sourceMappingURL=intercept.d.cts.map
@@ -1,48 +1,65 @@
1
1
  import { n as InterceptResponse, r as InterceptTrigger, t as InterceptEntry } from "./types.js";
2
2
 
3
- //#region src/builder/common/intercept/adapters/anthropic.d.ts
3
+ //#region src/spec/intercept/adapters/anthropic.d.ts
4
4
  interface AnthropicMessagesFilter {
5
- /** Match by model name. */
6
5
  model?: RegExp | string;
7
- /** Match by system message content. */
8
6
  system?: RegExp | string;
9
- /** Match by user message content. */
10
7
  user?: RegExp | string;
11
- /** Match by tool names. */
12
8
  tools?: string[];
13
9
  }
10
+ declare function buildReply(data: unknown): InterceptResponse;
14
11
  /**
15
12
  * Anthropic API intercept helpers.
16
13
  */
17
14
  declare const anthropic: {
18
15
  /**
19
16
  * Trigger: match Anthropic messages API requests.
17
+ *
18
+ * @example
19
+ * anthropic.request()
20
+ * anthropic.request({ system: /classify/ })
20
21
  */
21
- messages(filter?: AnthropicMessagesFilter): InterceptTrigger; /** Response: wrap data in Anthropic messages format. */
22
- response(data: unknown): InterceptResponse; /** Response: return an Anthropic error. */
22
+ request(filter?: AnthropicMessagesFilter): InterceptTrigger;
23
+ /**
24
+ * Trigger: match `messages.create` calls, optionally routed through a
25
+ * custom gateway URL. Mirrors `openai.agent()`. When used with a JSON
26
+ * fixture file, the data is returned as-is (no wrapping) because Anthropic
27
+ * fixtures are typically already in the `messages.create` response shape.
28
+ *
29
+ * @example
30
+ * anthropic.message({ user: /classify/ }, GATEWAY)
31
+ * claude.message({ system: /journal/ }, GATEWAY)
32
+ */
33
+ message(filter?: AnthropicMessagesFilter, url?: string): InterceptTrigger; /** Response: wrap data in Anthropic messages format. */
34
+ reply: typeof buildReply; /** Response: return an Anthropic error. */
23
35
  error(status: number, message?: string): InterceptResponse; /** Response: simulate a timeout. */
24
36
  timeout(): InterceptResponse;
25
37
  };
38
+ /**
39
+ * Alias for {@link anthropic} — matches consumers that call the vendor "claude".
40
+ * Re-exposed as a spread copy so downstream tooling (Knip, dts rollup) sees a
41
+ * distinct export and not a duplicate of `anthropic`.
42
+ */
43
+ declare const claude: typeof anthropic;
26
44
  //#endregion
27
- //#region src/builder/common/intercept/adapters/http.d.ts
45
+ //#region src/spec/intercept/adapters/http.d.ts
28
46
  /**
29
47
  * Generic HTTP intercept helpers for any URL.
30
48
  *
31
49
  * @example
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_...' }))
50
+ * .intercept(http.get('https://api.example.com/data'), 'http/response.json')
34
51
  */
35
52
  declare const http: {
36
- /** Trigger: match GET requests to a URL pattern. */get(url: RegExp | string): InterceptTrigger; /** Trigger: match POST requests to a URL pattern. */
37
- post(url: RegExp | string): InterceptTrigger; /** Trigger: match PUT requests to a URL pattern. */
38
- put(url: RegExp | string): InterceptTrigger; /** Trigger: match DELETE requests to a URL pattern. */
39
- delete(url: RegExp | string): InterceptTrigger; /** Trigger: match any method to a URL pattern. */
53
+ get(url: RegExp | string): InterceptTrigger;
54
+ post(url: RegExp | string): InterceptTrigger;
55
+ put(url: RegExp | string): InterceptTrigger;
56
+ delete(url: RegExp | string): InterceptTrigger;
40
57
  any(url: RegExp | string): InterceptTrigger; /** Response: simple JSON success. */
41
58
  json(data: unknown, status?: number): InterceptResponse; /** Response: error with message. */
42
59
  error(status: number, message?: string): InterceptResponse;
43
60
  };
44
61
  //#endregion
45
- //#region src/builder/common/intercept/adapters/openai.d.ts
62
+ //#region src/spec/intercept/adapters/openai.d.ts
46
63
  interface OpenAIChatFilter {
47
64
  model?: RegExp | string;
48
65
  system?: RegExp | string;
@@ -57,7 +74,6 @@ interface OpenAIResponsesFilter {
57
74
  tools?: string[];
58
75
  }
59
76
  declare function buildChatReply(data: unknown): InterceptResponse;
60
- declare function buildResponsesReply(data: unknown): InterceptResponse;
61
77
  /**
62
78
  * OpenAI API intercept helpers.
63
79
  */
@@ -92,12 +108,8 @@ declare const openai: {
92
108
  reply: typeof buildChatReply; /** Response: return an OpenAI error. */
93
109
  error(status: number, message?: string): InterceptResponse; /** Response: return malformed content. */
94
110
  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;
111
+ timeout(): InterceptResponse;
100
112
  };
101
113
  //#endregion
102
- export { type InterceptEntry, type InterceptResponse, type InterceptTrigger, anthropic, http, openai };
114
+ export { type InterceptEntry, type InterceptResponse, type InterceptTrigger, anthropic, claude, http, openai };
103
115
  //# sourceMappingURL=intercept.d.ts.map