offrouter-core 0.2.0 → 0.2.2
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.
- package/dist/audit.d.ts +137 -0
- package/dist/audit.d.ts.map +1 -0
- package/dist/audit.js +320 -0
- package/dist/audit.js.map +1 -0
- package/dist/auth/credential-chain.d.ts +84 -0
- package/dist/auth/credential-chain.d.ts.map +1 -0
- package/dist/auth/credential-chain.js +150 -0
- package/dist/auth/credential-chain.js.map +1 -0
- package/dist/auth/index.d.ts +10 -0
- package/dist/auth/index.d.ts.map +1 -0
- package/dist/auth/index.js +7 -0
- package/dist/auth/index.js.map +1 -0
- package/dist/auth/keychain.d.ts +60 -0
- package/dist/auth/keychain.d.ts.map +1 -0
- package/dist/auth/keychain.js +104 -0
- package/dist/auth/keychain.js.map +1 -0
- package/dist/auth/oauth-pkce.d.ts +138 -0
- package/dist/auth/oauth-pkce.d.ts.map +1 -0
- package/dist/auth/oauth-pkce.js +375 -0
- package/dist/auth/oauth-pkce.js.map +1 -0
- package/dist/auth/oauth-server.d.ts +36 -0
- package/dist/auth/oauth-server.d.ts.map +1 -0
- package/dist/auth/oauth-server.js +210 -0
- package/dist/auth/oauth-server.js.map +1 -0
- package/dist/config.d.ts +76 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +355 -0
- package/dist/config.js.map +1 -0
- package/dist/delegation.d.ts +123 -0
- package/dist/delegation.d.ts.map +1 -0
- package/dist/delegation.js +455 -0
- package/dist/delegation.js.map +1 -0
- package/dist/index.d.ts +41 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -0
- package/dist/policy.d.ts +45 -0
- package/dist/policy.d.ts.map +1 -0
- package/dist/policy.js +318 -0
- package/dist/policy.js.map +1 -0
- package/{src/protocol.ts → dist/protocol.d.ts} +2 -2
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +6 -0
- package/dist/protocol.js.map +1 -0
- package/dist/providers/adapter.d.ts +137 -0
- package/dist/providers/adapter.d.ts.map +1 -0
- package/dist/providers/adapter.js +163 -0
- package/dist/providers/adapter.js.map +1 -0
- package/dist/providers/catalog-data.d.ts +128 -0
- package/dist/providers/catalog-data.d.ts.map +1 -0
- package/dist/providers/catalog-data.js +397 -0
- package/dist/providers/catalog-data.js.map +1 -0
- package/dist/providers/catalog.d.ts +63 -0
- package/dist/providers/catalog.d.ts.map +1 -0
- package/dist/providers/catalog.js +394 -0
- package/dist/providers/catalog.js.map +1 -0
- package/dist/providers/fake.d.ts +46 -0
- package/dist/providers/fake.d.ts.map +1 -0
- package/dist/providers/fake.js +234 -0
- package/dist/providers/fake.js.map +1 -0
- package/dist/providers/openai-compatible.d.ts +65 -0
- package/dist/providers/openai-compatible.d.ts.map +1 -0
- package/dist/providers/openai-compatible.js +434 -0
- package/dist/providers/openai-compatible.js.map +1 -0
- package/dist/proxy/responses-mapper.d.ts +366 -0
- package/dist/proxy/responses-mapper.d.ts.map +1 -0
- package/dist/proxy/responses-mapper.js +517 -0
- package/dist/proxy/responses-mapper.js.map +1 -0
- package/dist/proxy/responses-server.d.ts +29 -0
- package/dist/proxy/responses-server.d.ts.map +1 -0
- package/dist/proxy/responses-server.js +360 -0
- package/dist/proxy/responses-server.js.map +1 -0
- package/dist/router.d.ts +18 -0
- package/dist/router.d.ts.map +1 -0
- package/dist/router.js +296 -0
- package/dist/router.js.map +1 -0
- package/dist/schemas.d.ts +560 -0
- package/dist/schemas.d.ts.map +1 -0
- package/{src/schemas.ts → dist/schemas.js} +83 -103
- package/dist/schemas.js.map +1 -0
- package/dist/secrets.d.ts +112 -0
- package/dist/secrets.d.ts.map +1 -0
- package/dist/secrets.js +326 -0
- package/dist/secrets.js.map +1 -0
- package/dist/types.d.ts +117 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/usage-file.d.ts +59 -0
- package/dist/usage-file.d.ts.map +1 -0
- package/dist/usage-file.js +316 -0
- package/dist/usage-file.js.map +1 -0
- package/dist/usage.d.ts +235 -0
- package/dist/usage.d.ts.map +1 -0
- package/dist/usage.js +517 -0
- package/dist/usage.js.map +1 -0
- package/package.json +9 -4
- package/src/audit.test.ts +0 -302
- package/src/audit.ts +0 -553
- package/src/auth/credential-chain.test.ts +0 -326
- package/src/auth/credential-chain.ts +0 -235
- package/src/auth/index.ts +0 -45
- package/src/auth/keychain.test.ts +0 -265
- package/src/auth/keychain.ts +0 -168
- package/src/auth/oauth-pkce.test.ts +0 -329
- package/src/auth/oauth-pkce.ts +0 -571
- package/src/auth/oauth-server.test.ts +0 -83
- package/src/auth/oauth-server.ts +0 -296
- package/src/config.test.ts +0 -479
- package/src/config.ts +0 -505
- package/src/delegation.test.ts +0 -368
- package/src/delegation.ts +0 -605
- package/src/index.ts +0 -280
- package/src/policy.test.ts +0 -634
- package/src/policy.ts +0 -420
- package/src/providers/adapter.test.ts +0 -293
- package/src/providers/adapter.ts +0 -328
- package/src/providers/catalog-data.test.ts +0 -258
- package/src/providers/catalog-data.ts +0 -498
- package/src/providers/catalog.test.ts +0 -84
- package/src/providers/catalog.ts +0 -483
- package/src/providers/fake.ts +0 -312
- package/src/providers/openai-compatible.test.ts +0 -366
- package/src/providers/openai-compatible.ts +0 -554
- package/src/proxy/responses-mapper.test.ts +0 -290
- package/src/proxy/responses-mapper.ts +0 -736
- package/src/proxy/responses-server.test.ts +0 -322
- package/src/proxy/responses-server.ts +0 -469
- package/src/router.test.ts +0 -699
- package/src/router.ts +0 -352
- package/src/schemas.test.ts +0 -291
- package/src/secrets.test.ts +0 -271
- package/src/secrets.ts +0 -461
- package/src/types.ts +0 -173
- package/src/usage-file.test.ts +0 -243
- package/src/usage-file.ts +0 -435
- package/src/usage.test.ts +0 -335
- package/src/usage.ts +0 -859
- package/tsconfig.json +0 -9
|
@@ -0,0 +1,517 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Responses <-> OffRouter translation for the local proxy.
|
|
3
|
+
*
|
|
4
|
+
* Inbound: turn an OpenAI Responses request body into a RouteRequest that
|
|
5
|
+
* carries only a redacted prompt preview and digest (never raw prompt text)
|
|
6
|
+
* plus a DelegationRequest that carries the full prompt after policy allows.
|
|
7
|
+
*
|
|
8
|
+
* Outbound: turn OffRouter delegation/provider events into OpenAI Responses
|
|
9
|
+
* streaming SSE chunks (response.created, response.output_text.delta,
|
|
10
|
+
* response.completed) and map provider/policy errors to HTTP statuses and
|
|
11
|
+
* OpenAI-style error JSON.
|
|
12
|
+
*
|
|
13
|
+
* Keeps HTTP and provider specifics out of the core router.
|
|
14
|
+
*/
|
|
15
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
16
|
+
import { DelegationRuntime, } from "../delegation.js";
|
|
17
|
+
import { ROUTE_PROTOCOL_VERSION } from "../protocol.js";
|
|
18
|
+
import { z } from "zod";
|
|
19
|
+
/** Max chars kept for the routing-only prompt preview. */
|
|
20
|
+
export const RESPONSES_PROMPT_PREVIEW_CHARS = 120;
|
|
21
|
+
// ---------------------------------------------------------------------------
|
|
22
|
+
// Inbound request schemas (Zod, strict at the top level)
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
/**
|
|
25
|
+
* Thrown when an inbound request body fails schema validation. The proxy maps
|
|
26
|
+
* this to a 400 OpenAI-style error response.
|
|
27
|
+
*/
|
|
28
|
+
export class InvalidProxyRequestError extends Error {
|
|
29
|
+
issues;
|
|
30
|
+
constructor(issues) {
|
|
31
|
+
super("Invalid request body.");
|
|
32
|
+
this.name = "InvalidProxyRequestError";
|
|
33
|
+
this.issues = issues;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Nested input item content parts use the default (strip) mode so OpenAI part
|
|
37
|
+
// extras such as "annotations" do not break prompt extraction; only the
|
|
38
|
+
// top-level request object is parsed strictly.
|
|
39
|
+
const ResponsesContentPartSchema = z.object({
|
|
40
|
+
type: z.string().optional(),
|
|
41
|
+
text: z.string().optional(),
|
|
42
|
+
input_text: z.string().optional(),
|
|
43
|
+
output_text: z.string().optional(),
|
|
44
|
+
});
|
|
45
|
+
const ResponsesInputItemSchema = z.object({
|
|
46
|
+
role: z.string().optional(),
|
|
47
|
+
content: z
|
|
48
|
+
.union([
|
|
49
|
+
z.string(),
|
|
50
|
+
z.array(z.union([z.string(), ResponsesContentPartSchema])),
|
|
51
|
+
])
|
|
52
|
+
.optional(),
|
|
53
|
+
});
|
|
54
|
+
/**
|
|
55
|
+
* Strict Zod schema for an OpenAI Responses inbound request body. Unknown
|
|
56
|
+
* top-level keys are rejected so malformed requests surface as a 400 rather
|
|
57
|
+
* than silently ignoring fields.
|
|
58
|
+
*/
|
|
59
|
+
export const ResponsesRequestSchema = z.object({
|
|
60
|
+
model: z.string().optional(),
|
|
61
|
+
instructions: z.string().optional(),
|
|
62
|
+
input: z
|
|
63
|
+
.union([
|
|
64
|
+
z.string(),
|
|
65
|
+
z.array(z.union([z.string(), ResponsesInputItemSchema])),
|
|
66
|
+
])
|
|
67
|
+
.optional(),
|
|
68
|
+
stream: z.boolean().optional(),
|
|
69
|
+
max_output_tokens: z.number().nonnegative().optional(),
|
|
70
|
+
temperature: z.number().optional(),
|
|
71
|
+
});
|
|
72
|
+
// Unknown top-level keys (tools, store, metadata, ...) are stripped, not rejected,
|
|
73
|
+
// so real OpenAI-compatible clients interoperate. Structurally invalid values still 400.
|
|
74
|
+
/**
|
|
75
|
+
* Extract prompt text and tuning options from an OpenAI Responses request body.
|
|
76
|
+
* Validates the body and throws {@link InvalidProxyRequestError} on any
|
|
77
|
+
* schema violation. Accepts both string and structured `input` shapes.
|
|
78
|
+
*/
|
|
79
|
+
export function extractPromptFromResponsesInput(body) {
|
|
80
|
+
const result = ResponsesRequestSchema.safeParse(body);
|
|
81
|
+
if (!result.success) {
|
|
82
|
+
throw new InvalidProxyRequestError(result.error.issues);
|
|
83
|
+
}
|
|
84
|
+
const data = result.data;
|
|
85
|
+
return {
|
|
86
|
+
prompt: joinPromptText(data.instructions, data.input),
|
|
87
|
+
model: data.model,
|
|
88
|
+
maxOutputTokens: data.max_output_tokens,
|
|
89
|
+
temperature: data.temperature,
|
|
90
|
+
stream: data.stream,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
function joinPromptText(instructions, input) {
|
|
94
|
+
const parts = [];
|
|
95
|
+
if (typeof instructions === "string" && instructions.length > 0) {
|
|
96
|
+
parts.push(instructions);
|
|
97
|
+
}
|
|
98
|
+
if (typeof input === "string") {
|
|
99
|
+
if (input.length > 0)
|
|
100
|
+
parts.push(input);
|
|
101
|
+
}
|
|
102
|
+
else if (Array.isArray(input)) {
|
|
103
|
+
for (const item of input) {
|
|
104
|
+
const text = textFromInputItem(item);
|
|
105
|
+
if (text)
|
|
106
|
+
parts.push(text);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return parts.join("\n\n").trim();
|
|
110
|
+
}
|
|
111
|
+
function textFromInputItem(item) {
|
|
112
|
+
if (typeof item === "string") {
|
|
113
|
+
return item.length > 0 ? item : undefined;
|
|
114
|
+
}
|
|
115
|
+
if (!item || typeof item !== "object")
|
|
116
|
+
return undefined;
|
|
117
|
+
const obj = item;
|
|
118
|
+
const content = obj["content"];
|
|
119
|
+
if (typeof content === "string") {
|
|
120
|
+
return content.length > 0 ? content : undefined;
|
|
121
|
+
}
|
|
122
|
+
if (Array.isArray(content)) {
|
|
123
|
+
const out = [];
|
|
124
|
+
for (const part of content) {
|
|
125
|
+
if (typeof part === "string") {
|
|
126
|
+
if (part.length > 0)
|
|
127
|
+
out.push(part);
|
|
128
|
+
continue;
|
|
129
|
+
}
|
|
130
|
+
if (part && typeof part === "object") {
|
|
131
|
+
const p = part;
|
|
132
|
+
const text = p["text"] ?? p["input_text"] ?? p["output_text"];
|
|
133
|
+
if (typeof text === "string" && text.length > 0)
|
|
134
|
+
out.push(text);
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
return out.length > 0 ? out.join("") : undefined;
|
|
138
|
+
}
|
|
139
|
+
return undefined;
|
|
140
|
+
}
|
|
141
|
+
// ---------------------------------------------------------------------------
|
|
142
|
+
// Digest + preview (routing never sees raw prompt text)
|
|
143
|
+
// ---------------------------------------------------------------------------
|
|
144
|
+
/** Stable sha256 digest of the full prompt text. */
|
|
145
|
+
export function promptDigest(text) {
|
|
146
|
+
return `sha256:${createHash("sha256").update(text, "utf8").digest("hex")}`;
|
|
147
|
+
}
|
|
148
|
+
/** Short single-line preview; collapses whitespace and truncates. */
|
|
149
|
+
export function promptPreview(text, max = RESPONSES_PROMPT_PREVIEW_CHARS) {
|
|
150
|
+
const clean = text.replace(/\s+/g, " ").trim();
|
|
151
|
+
if (clean.length <= max)
|
|
152
|
+
return clean;
|
|
153
|
+
// ASCII ellipsis (three dots) keeps the preview ASCII-only; reserve three
|
|
154
|
+
// characters for the marker so the result never exceeds `max`.
|
|
155
|
+
return `${clean.slice(0, Math.max(0, max - 3))}...`;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Build a RouteRequest from the full prompt. The raw prompt is reduced to a
|
|
159
|
+
* redacted preview and digest; the full text never appears on the route.
|
|
160
|
+
*/
|
|
161
|
+
export function buildRouteRequest(input) {
|
|
162
|
+
return {
|
|
163
|
+
protocolVersion: ROUTE_PROTOCOL_VERSION,
|
|
164
|
+
requestId: input.requestId ?? `req_proxy_${randomBytes(8).toString("hex")}`,
|
|
165
|
+
harness: input.harness,
|
|
166
|
+
task: {
|
|
167
|
+
promptPreview: promptPreview(input.prompt),
|
|
168
|
+
promptDigest: promptDigest(input.prompt),
|
|
169
|
+
kind: input.kind ?? "other",
|
|
170
|
+
risk: input.risk ?? "low",
|
|
171
|
+
requiresStreaming: true,
|
|
172
|
+
},
|
|
173
|
+
workspace: input.workspace,
|
|
174
|
+
constraints: {
|
|
175
|
+
subscriptionFirst: true,
|
|
176
|
+
allowApiKeyFallback: true,
|
|
177
|
+
},
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Build a DelegationRequest carrying the full prompt. Routing has already
|
|
182
|
+
* cleared the selected provider; the full text reaches the adapter only here.
|
|
183
|
+
*/
|
|
184
|
+
export function buildDelegationRequest(input) {
|
|
185
|
+
return {
|
|
186
|
+
taskId: input.taskId ?? `task_proxy_${randomBytes(8).toString("hex")}`,
|
|
187
|
+
mode: "stream",
|
|
188
|
+
output: "text",
|
|
189
|
+
prompt: input.prompt,
|
|
190
|
+
route: input.route,
|
|
191
|
+
maxOutputTokens: input.maxOutputTokens,
|
|
192
|
+
temperature: input.temperature,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
function newPrefixId(prefix) {
|
|
196
|
+
return `${prefix}_${randomBytes(12).toString("hex")}`;
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Stateful builder that accumulates output text and produces the three
|
|
200
|
+
* OpenAI Responses SSE event payloads the proxy emits.
|
|
201
|
+
*/
|
|
202
|
+
export class ResponsesSseBuilder {
|
|
203
|
+
responseId;
|
|
204
|
+
messageId;
|
|
205
|
+
createdAtMs;
|
|
206
|
+
now;
|
|
207
|
+
model;
|
|
208
|
+
text = "";
|
|
209
|
+
usage;
|
|
210
|
+
constructor(model, now = () => new Date()) {
|
|
211
|
+
this.model = model;
|
|
212
|
+
this.now = now;
|
|
213
|
+
this.responseId = newPrefixId("resp");
|
|
214
|
+
this.messageId = newPrefixId("msg");
|
|
215
|
+
this.createdAtMs = Math.floor(now().getTime() / 1000);
|
|
216
|
+
}
|
|
217
|
+
setModel(model) {
|
|
218
|
+
this.model = model;
|
|
219
|
+
}
|
|
220
|
+
addText(delta) {
|
|
221
|
+
this.text += delta;
|
|
222
|
+
}
|
|
223
|
+
setUsage(usage) {
|
|
224
|
+
this.usage = usage;
|
|
225
|
+
}
|
|
226
|
+
get fullText() {
|
|
227
|
+
return this.text;
|
|
228
|
+
}
|
|
229
|
+
createdEvent() {
|
|
230
|
+
return {
|
|
231
|
+
type: "response.created",
|
|
232
|
+
response: this.baseObject("in_progress", []),
|
|
233
|
+
};
|
|
234
|
+
}
|
|
235
|
+
deltaEvent(delta) {
|
|
236
|
+
return {
|
|
237
|
+
type: "response.output_text.delta",
|
|
238
|
+
item_id: this.messageId,
|
|
239
|
+
output_index: 0,
|
|
240
|
+
content_index: 0,
|
|
241
|
+
delta,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
completedEvent() {
|
|
245
|
+
const item = {
|
|
246
|
+
id: this.messageId,
|
|
247
|
+
type: "message",
|
|
248
|
+
status: "completed",
|
|
249
|
+
role: "assistant",
|
|
250
|
+
content: [{ type: "output_text", text: this.text, annotations: [] }],
|
|
251
|
+
};
|
|
252
|
+
return {
|
|
253
|
+
type: "response.completed",
|
|
254
|
+
response: this.baseObject("completed", [item], this.text),
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Final non-streaming Responses object: merges created + completed into a
|
|
259
|
+
* single JSON body (status "completed" with output_text).
|
|
260
|
+
*/
|
|
261
|
+
responseObject() {
|
|
262
|
+
return this.completedEvent().response;
|
|
263
|
+
}
|
|
264
|
+
baseObject(status, output, outputText) {
|
|
265
|
+
const obj = {
|
|
266
|
+
id: this.responseId,
|
|
267
|
+
object: "response",
|
|
268
|
+
created_at: this.createdAtMs,
|
|
269
|
+
status,
|
|
270
|
+
model: this.model,
|
|
271
|
+
output,
|
|
272
|
+
};
|
|
273
|
+
if (outputText !== undefined) {
|
|
274
|
+
obj.output_text = outputText;
|
|
275
|
+
}
|
|
276
|
+
if (this.usage) {
|
|
277
|
+
obj.usage = {
|
|
278
|
+
input_tokens: this.usage.inputTokens ?? 0,
|
|
279
|
+
output_tokens: this.usage.outputTokens ?? 0,
|
|
280
|
+
total_tokens: this.usage.totalTokens ?? 0,
|
|
281
|
+
};
|
|
282
|
+
}
|
|
283
|
+
return obj;
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
/** Wrap any JSON-serializable payload as an SSE `data:` line. */
|
|
287
|
+
export function responsesSseData(payload) {
|
|
288
|
+
return `data: ${JSON.stringify(payload)}\n\n`;
|
|
289
|
+
}
|
|
290
|
+
// ---------------------------------------------------------------------------
|
|
291
|
+
// Chat Completions alias (input + SSE)
|
|
292
|
+
// ---------------------------------------------------------------------------
|
|
293
|
+
const ChatMessageContentPartSchema = z.object({
|
|
294
|
+
type: z.string().optional(),
|
|
295
|
+
text: z.string().optional(),
|
|
296
|
+
});
|
|
297
|
+
const ChatMessageSchema = z.object({
|
|
298
|
+
role: z.string().optional(),
|
|
299
|
+
content: z
|
|
300
|
+
.union([
|
|
301
|
+
z.string(),
|
|
302
|
+
z.array(z.union([z.string(), ChatMessageContentPartSchema])),
|
|
303
|
+
])
|
|
304
|
+
.optional(),
|
|
305
|
+
});
|
|
306
|
+
/**
|
|
307
|
+
* Strict Zod schema for an OpenAI Chat Completions inbound request body.
|
|
308
|
+
* Unknown top-level keys are rejected.
|
|
309
|
+
*/
|
|
310
|
+
export const ChatCompletionsRequestSchema = z.object({
|
|
311
|
+
model: z.string().optional(),
|
|
312
|
+
messages: z.array(ChatMessageSchema).optional(),
|
|
313
|
+
stream: z.boolean().optional(),
|
|
314
|
+
max_tokens: z.number().nonnegative().optional(),
|
|
315
|
+
temperature: z.number().optional(),
|
|
316
|
+
});
|
|
317
|
+
// Unknown top-level keys stripped (OpenAI-compat interop); invalid values still 400.
|
|
318
|
+
/**
|
|
319
|
+
* Extract prompt text and options from an OpenAI Chat Completions body.
|
|
320
|
+
* Validates the body strictly and throws {@link InvalidProxyRequestError} on any
|
|
321
|
+
* schema violation. Used by the optional /v1/chat/completions alias.
|
|
322
|
+
*/
|
|
323
|
+
export function extractPromptFromChatCompletions(body) {
|
|
324
|
+
const result = ChatCompletionsRequestSchema.safeParse(body);
|
|
325
|
+
if (!result.success) {
|
|
326
|
+
throw new InvalidProxyRequestError(result.error.issues);
|
|
327
|
+
}
|
|
328
|
+
const data = result.data;
|
|
329
|
+
const messages = data.messages ?? [];
|
|
330
|
+
const parts = [];
|
|
331
|
+
for (const message of messages) {
|
|
332
|
+
const content = message.content;
|
|
333
|
+
if (typeof content === "string") {
|
|
334
|
+
if (content.length > 0)
|
|
335
|
+
parts.push(content);
|
|
336
|
+
}
|
|
337
|
+
else if (Array.isArray(content)) {
|
|
338
|
+
for (const part of content) {
|
|
339
|
+
if (typeof part === "string") {
|
|
340
|
+
if (part.length > 0)
|
|
341
|
+
parts.push(part);
|
|
342
|
+
}
|
|
343
|
+
else if (typeof part.text === "string" && part.text.length > 0) {
|
|
344
|
+
parts.push(part.text);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
}
|
|
349
|
+
return {
|
|
350
|
+
prompt: parts.join("\n").trim(),
|
|
351
|
+
model: data.model,
|
|
352
|
+
maxOutputTokens: data.max_tokens,
|
|
353
|
+
temperature: data.temperature,
|
|
354
|
+
stream: data.stream,
|
|
355
|
+
};
|
|
356
|
+
}
|
|
357
|
+
/** Stateful builder for Chat Completions streaming chunks. */
|
|
358
|
+
export class ChatCompletionsSseBuilder {
|
|
359
|
+
completionId;
|
|
360
|
+
createdAtMs;
|
|
361
|
+
model;
|
|
362
|
+
text = "";
|
|
363
|
+
usage;
|
|
364
|
+
constructor(model, now = () => new Date()) {
|
|
365
|
+
this.model = model;
|
|
366
|
+
this.completionId = newPrefixId("chatcmpl");
|
|
367
|
+
this.createdAtMs = Math.floor(now().getTime() / 1000);
|
|
368
|
+
}
|
|
369
|
+
setModel(model) {
|
|
370
|
+
this.model = model;
|
|
371
|
+
}
|
|
372
|
+
addText(delta) {
|
|
373
|
+
this.text += delta;
|
|
374
|
+
}
|
|
375
|
+
get fullText() {
|
|
376
|
+
return this.text;
|
|
377
|
+
}
|
|
378
|
+
setUsage(usage) {
|
|
379
|
+
this.usage = usage;
|
|
380
|
+
}
|
|
381
|
+
firstEvent() {
|
|
382
|
+
return this.chunk({ delta: { role: "assistant" }, finish_reason: null });
|
|
383
|
+
}
|
|
384
|
+
deltaEvent(content) {
|
|
385
|
+
return this.chunk({ delta: { content }, finish_reason: null });
|
|
386
|
+
}
|
|
387
|
+
doneEvent() {
|
|
388
|
+
return this.chunk({ delta: {}, finish_reason: "stop" });
|
|
389
|
+
}
|
|
390
|
+
/**
|
|
391
|
+
* Final non-streaming Chat Completions object: a single JSON body with the
|
|
392
|
+
* merged assistant message and (optional) usage.
|
|
393
|
+
*/
|
|
394
|
+
completionObject() {
|
|
395
|
+
const obj = {
|
|
396
|
+
id: this.completionId,
|
|
397
|
+
object: "chat.completion",
|
|
398
|
+
created: this.createdAtMs,
|
|
399
|
+
model: this.model,
|
|
400
|
+
choices: [
|
|
401
|
+
{
|
|
402
|
+
index: 0,
|
|
403
|
+
message: { role: "assistant", content: this.text },
|
|
404
|
+
finish_reason: "stop",
|
|
405
|
+
},
|
|
406
|
+
],
|
|
407
|
+
};
|
|
408
|
+
if (this.usage) {
|
|
409
|
+
obj.usage = {
|
|
410
|
+
prompt_tokens: this.usage.promptTokens ?? 0,
|
|
411
|
+
completion_tokens: this.usage.completionTokens ?? 0,
|
|
412
|
+
total_tokens: this.usage.totalTokens ?? 0,
|
|
413
|
+
};
|
|
414
|
+
}
|
|
415
|
+
return obj;
|
|
416
|
+
}
|
|
417
|
+
chunk(input) {
|
|
418
|
+
return {
|
|
419
|
+
id: this.completionId,
|
|
420
|
+
object: "chat.completion.chunk",
|
|
421
|
+
created: this.createdAtMs,
|
|
422
|
+
model: this.model,
|
|
423
|
+
choices: [
|
|
424
|
+
{ index: 0, delta: input.delta, finish_reason: input.finish_reason },
|
|
425
|
+
],
|
|
426
|
+
};
|
|
427
|
+
}
|
|
428
|
+
}
|
|
429
|
+
/** Terminal SSE marker for Chat Completions streams. */
|
|
430
|
+
export const CHAT_COMPLETIONS_DONE = "data: [DONE]\n\n";
|
|
431
|
+
// ---------------------------------------------------------------------------
|
|
432
|
+
// Error mapping
|
|
433
|
+
// ---------------------------------------------------------------------------
|
|
434
|
+
/** Map a canonical provider error code to an HTTP status. */
|
|
435
|
+
export function providerErrorCodeToHttpStatus(code) {
|
|
436
|
+
switch (code) {
|
|
437
|
+
case "auth_failed":
|
|
438
|
+
return 401;
|
|
439
|
+
case "rate_limited":
|
|
440
|
+
case "quota_exhausted":
|
|
441
|
+
return 429;
|
|
442
|
+
case "billing":
|
|
443
|
+
return 402;
|
|
444
|
+
case "model_not_found":
|
|
445
|
+
return 404;
|
|
446
|
+
case "context_window":
|
|
447
|
+
return 413;
|
|
448
|
+
case "overload":
|
|
449
|
+
return 503;
|
|
450
|
+
case "timeout":
|
|
451
|
+
return 504;
|
|
452
|
+
case "network":
|
|
453
|
+
return 502;
|
|
454
|
+
case "invalid_request":
|
|
455
|
+
case "safety_refusal":
|
|
456
|
+
return 400;
|
|
457
|
+
case "stream_interrupted":
|
|
458
|
+
case "unknown":
|
|
459
|
+
default:
|
|
460
|
+
return 500;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
/**
|
|
464
|
+
* Map a routing decision at the gate to an HTTP status.
|
|
465
|
+
* needsConfiguration -> 503; otherwise blocked -> 403.
|
|
466
|
+
*/
|
|
467
|
+
export function policyDecisionToHttpStatus(decision) {
|
|
468
|
+
if (decision.needsConfiguration)
|
|
469
|
+
return 503;
|
|
470
|
+
return 403;
|
|
471
|
+
}
|
|
472
|
+
function openAiErrorType(status) {
|
|
473
|
+
switch (status) {
|
|
474
|
+
case 401:
|
|
475
|
+
return "authentication_error";
|
|
476
|
+
case 403:
|
|
477
|
+
return "permission_denied";
|
|
478
|
+
case 402:
|
|
479
|
+
return "billing_error";
|
|
480
|
+
case 429:
|
|
481
|
+
return "rate_limit_error";
|
|
482
|
+
case 404:
|
|
483
|
+
return "not_found";
|
|
484
|
+
case 400:
|
|
485
|
+
return "invalid_request_error";
|
|
486
|
+
case 503:
|
|
487
|
+
return "service_unavailable";
|
|
488
|
+
default:
|
|
489
|
+
return "server_error";
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
/** Build an OpenAI-style error JSON payload. */
|
|
493
|
+
export function openAiErrorPayload(status, message, code) {
|
|
494
|
+
const error = {
|
|
495
|
+
message,
|
|
496
|
+
type: openAiErrorType(status),
|
|
497
|
+
};
|
|
498
|
+
if (code !== undefined) {
|
|
499
|
+
error.code = code;
|
|
500
|
+
}
|
|
501
|
+
return { error };
|
|
502
|
+
}
|
|
503
|
+
export function createResponsesProxyContext(options) {
|
|
504
|
+
const runtime = new DelegationRuntime({
|
|
505
|
+
adapters: options.adapters,
|
|
506
|
+
candidates: options.candidates,
|
|
507
|
+
policy: options.policy,
|
|
508
|
+
...options.delegation,
|
|
509
|
+
});
|
|
510
|
+
return {
|
|
511
|
+
policy: options.policy,
|
|
512
|
+
candidates: [...options.candidates],
|
|
513
|
+
adapters: { ...options.adapters },
|
|
514
|
+
runtime,
|
|
515
|
+
};
|
|
516
|
+
}
|
|
517
|
+
//# sourceMappingURL=responses-mapper.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses-mapper.js","sourceRoot":"","sources":["../../src/proxy/responses-mapper.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACtD,OAAO,EACL,iBAAiB,GAElB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,sBAAsB,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB,0DAA0D;AAC1D,MAAM,CAAC,MAAM,8BAA8B,GAAG,GAAG,CAAC;AAgBlD,8EAA8E;AAC9E,yDAAyD;AACzD,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACxC,MAAM,CAAwB;IACvC,YAAY,MAA6B;QACvC,KAAK,CAAC,uBAAuB,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,0BAA0B,CAAC;QACvC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF;AAED,8EAA8E;AAC9E,wEAAwE;AACxE,+CAA+C;AAC/C,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC1C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACjC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AAEH,MAAM,wBAAwB,GAAG,CAAC,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC;SACP,KAAK,CAAC;QACL,CAAC,CAAC,MAAM,EAAE;QACV,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,0BAA0B,CAAC,CAAC,CAAC;KAC3D,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH;;;;GAIG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC7C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IACnC,KAAK,EAAE,CAAC;SACL,KAAK,CAAC;QACL,CAAC,CAAC,MAAM,EAAE;QACV,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,wBAAwB,CAAC,CAAC,CAAC;KACzD,CAAC;SACD,QAAQ,EAAE;IACb,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC9B,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IACtD,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AACH,mFAAmF;AACnF,yFAAyF;AAEzF;;;;GAIG;AACH,MAAM,UAAU,+BAA+B,CAC7C,IAAa;IAEb,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACtD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,wBAAwB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,OAAO;QACL,MAAM,EAAE,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC;QACrD,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,eAAe,EAAE,IAAI,CAAC,iBAAiB;QACvC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC;AAED,SAAS,cAAc,CAAC,YAAqB,EAAE,KAAc;IAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChE,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IAC3B,CAAC;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1C,CAAC;SAAM,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAChC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,IAAI;gBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;AACnC,CAAC;AAED,SAAS,iBAAiB,CAAC,IAAa;IACtC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;IAC5C,CAAC;IACD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;QAAE,OAAO,SAAS,CAAC;IACxD,MAAM,GAAG,GAAG,IAA+B,CAAC;IAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAChC,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IAClD,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,MAAM,GAAG,GAAa,EAAE,CAAC;QACzB,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;YAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC7B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACpC,SAAS;YACX,CAAC;YACD,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBACrC,MAAM,CAAC,GAAG,IAA+B,CAAC;gBAC1C,MAAM,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,CAAC;gBAC9D,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;oBAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IACnD,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,8EAA8E;AAC9E,wDAAwD;AACxD,8EAA8E;AAE9E,oDAAoD;AACpD,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,UAAU,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;AAC7E,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,aAAa,CAC3B,IAAY,EACZ,MAAc,8BAA8B;IAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAC/C,IAAI,KAAK,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,KAAK,CAAC;IACtC,0EAA0E;IAC1E,+DAA+D;IAC/D,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;AACtD,CAAC;AAeD;;;GAGG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAsB;IACtD,OAAO;QACL,eAAe,EAAE,sBAAsB;QACvC,SAAS,EAAE,KAAK,CAAC,SAAS,IAAI,aAAa,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QAC3E,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE;YACJ,aAAa,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC;YAC1C,YAAY,EAAE,YAAY,CAAC,KAAK,CAAC,MAAM,CAAC;YACxC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,OAAO;YAC3B,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,KAAK;YACzB,iBAAiB,EAAE,IAAI;SACxB;QACD,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,WAAW,EAAE;YACX,iBAAiB,EAAE,IAAI;YACvB,mBAAmB,EAAE,IAAI;SAC1B;KACF,CAAC;AACJ,CAAC;AAUD;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CACpC,KAA2B;IAE3B,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,MAAM,IAAI,cAAc,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;QACtE,IAAI,EAAE,QAA0B;QAChC,MAAM,EAAE,MAA0B;QAClC,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,eAAe,EAAE,KAAK,CAAC,eAAe;QACtC,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC;AACJ,CAAC;AAqCD,SAAS,WAAW,CAAC,MAAc;IACjC,OAAO,GAAG,MAAM,IAAI,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;AACxD,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,mBAAmB;IACrB,UAAU,CAAS;IACnB,SAAS,CAAS;IAClB,WAAW,CAAS;IACZ,GAAG,CAAa;IACzB,KAAK,CAAS;IACd,IAAI,GAAG,EAAE,CAAC;IACV,KAAK,CAAkC;IAE/C,YAAY,KAAa,EAAE,MAAkB,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;QAC3D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,UAAU,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;QACtC,IAAI,CAAC,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;IACrB,CAAC;IAED,QAAQ,CAAC,KAA0B;QACjC,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,YAAY;QAIV,OAAO;YACL,IAAI,EAAE,kBAAkB;YACxB,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,EAAE,CAAC;SAC7C,CAAC;IACJ,CAAC;IAED,UAAU,CAAC,KAAa;QAOtB,OAAO;YACL,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,IAAI,CAAC,SAAS;YACvB,YAAY,EAAE,CAAC;YACf,aAAa,EAAE,CAAC;YAChB,KAAK;SACN,CAAC;IACJ,CAAC;IAED,cAAc;QAIZ,MAAM,IAAI,GAAyB;YACjC,EAAE,EAAE,IAAI,CAAC,SAAS;YAClB,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,WAAW;YACnB,IAAI,EAAE,WAAW;YACjB,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,CAAC;SACrE,CAAC;QACF,OAAO;YACL,IAAI,EAAE,oBAAoB;YAC1B,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC;SAC1D,CAAC;IACJ,CAAC;IAED;;;OAGG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,cAAc,EAAE,CAAC,QAAQ,CAAC;IACxC,CAAC;IAEO,UAAU,CAChB,MAAiC,EACjC,MAA8B,EAC9B,UAAmB;QAEnB,MAAM,GAAG,GAAoB;YAC3B,EAAE,EAAE,IAAI,CAAC,UAAU;YACnB,MAAM,EAAE,UAAU;YAClB,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,MAAM;YACN,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM;SACP,CAAC;QACF,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,GAAG,CAAC,WAAW,GAAG,UAAU,CAAC;QAC/B,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,GAAG;gBACV,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC;gBACzC,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC;gBAC3C,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC;aAC1C,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAED,iEAAiE;AACjE,MAAM,UAAU,gBAAgB,CAAC,OAAgB;IAC/C,OAAO,SAAS,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,CAAC;AAChD,CAAC;AAED,8EAA8E;AAC9E,uCAAuC;AACvC,8EAA8E;AAE9E,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC5B,CAAC,CAAC;AAEH,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC3B,OAAO,EAAE,CAAC;SACP,KAAK,CAAC;QACL,CAAC,CAAC,MAAM,EAAE;QACV,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,EAAE,4BAA4B,CAAC,CAAC,CAAC;KAC7D,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG,CAAC,CAAC,MAAM,CAAC;IACnD,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC5B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC,QAAQ,EAAE;IAC/C,MAAM,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC9B,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,QAAQ,EAAE;IAC/C,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACnC,CAAC,CAAC;AACH,qFAAqF;AAErF;;;;GAIG;AACH,MAAM,UAAU,gCAAgC,CAC9C,IAAa;IAEb,MAAM,MAAM,GAAG,4BAA4B,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IAC5D,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,IAAI,wBAAwB,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;gBAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC9C,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YAClC,KAAK,MAAM,IAAI,IAAI,OAAO,EAAE,CAAC;gBAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;wBAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxC,CAAC;qBAAM,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACjE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxB,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IACD,OAAO;QACL,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE;QAC/B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,eAAe,EAAE,IAAI,CAAC,UAAU;QAChC,WAAW,EAAE,IAAI,CAAC,WAAW;QAC7B,MAAM,EAAE,IAAI,CAAC,MAAM;KACpB,CAAC;AACJ,CAAC;AAqCD,8DAA8D;AAC9D,MAAM,OAAO,yBAAyB;IAC3B,YAAY,CAAS;IACrB,WAAW,CAAS;IACrB,KAAK,CAAS;IACd,IAAI,GAAG,EAAE,CAAC;IACV,KAAK,CAA6B;IAE1C,YAAY,KAAa,EAAE,MAAkB,GAAG,EAAE,CAAC,IAAI,IAAI,EAAE;QAC3D,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,YAAY,GAAG,WAAW,CAAC,UAAU,CAAC,CAAC;QAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;IACxD,CAAC;IAED,QAAQ,CAAC,KAAa;QACpB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,OAAO,CAAC,KAAa;QACnB,IAAI,CAAC,IAAI,IAAI,KAAK,CAAC;IACrB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IAED,QAAQ,CAAC,KAAqB;QAC5B,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,UAAU;QACR,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,UAAU,CAAC,OAAe;QACxB,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;IACjE,CAAC;IAED,SAAS;QACP,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED;;;OAGG;IACH,gBAAgB;QACd,MAAM,GAAG,GAAyB;YAChC,EAAE,EAAE,IAAI,CAAC,YAAY;YACrB,MAAM,EAAE,iBAAiB;YACzB,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE;gBACP;oBACE,KAAK,EAAE,CAAC;oBACR,OAAO,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE;oBAClD,aAAa,EAAE,MAAM;iBACtB;aACF;SACF,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,GAAG,CAAC,KAAK,GAAG;gBACV,aAAa,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,CAAC;gBAC3C,iBAAiB,EAAE,IAAI,CAAC,KAAK,CAAC,gBAAgB,IAAI,CAAC;gBACnD,YAAY,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,IAAI,CAAC;aAC1C,CAAC;QACJ,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,KAAK,CAAC,KAGb;QACC,OAAO;YACL,EAAE,EAAE,IAAI,CAAC,YAAY;YACrB,MAAM,EAAE,uBAAuB;YAC/B,OAAO,EAAE,IAAI,CAAC,WAAW;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE;gBACP,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,EAAE;aACrE;SACF,CAAC;IACJ,CAAC;CACF;AAED,wDAAwD;AACxD,MAAM,CAAC,MAAM,qBAAqB,GAAG,kBAAkB,CAAC;AAExD,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E,6DAA6D;AAC7D,MAAM,UAAU,6BAA6B,CAAC,IAAuB;IACnE,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,aAAa;YAChB,OAAO,GAAG,CAAC;QACb,KAAK,cAAc,CAAC;QACpB,KAAK,iBAAiB;YACpB,OAAO,GAAG,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC;QACb,KAAK,iBAAiB;YACpB,OAAO,GAAG,CAAC;QACb,KAAK,gBAAgB;YACnB,OAAO,GAAG,CAAC;QACb,KAAK,UAAU;YACb,OAAO,GAAG,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,GAAG,CAAC;QACb,KAAK,iBAAiB,CAAC;QACvB,KAAK,gBAAgB;YACnB,OAAO,GAAG,CAAC;QACb,KAAK,oBAAoB,CAAC;QAC1B,KAAK,SAAS,CAAC;QACf;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,0BAA0B,CAAC,QAAuB;IAChE,IAAI,QAAQ,CAAC,kBAAkB;QAAE,OAAO,GAAG,CAAC;IAC5C,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,eAAe,CAAC,MAAc;IACrC,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,GAAG;YACN,OAAO,sBAAsB,CAAC;QAChC,KAAK,GAAG;YACN,OAAO,mBAAmB,CAAC;QAC7B,KAAK,GAAG;YACN,OAAO,eAAe,CAAC;QACzB,KAAK,GAAG;YACN,OAAO,kBAAkB,CAAC;QAC5B,KAAK,GAAG;YACN,OAAO,WAAW,CAAC;QACrB,KAAK,GAAG;YACN,OAAO,uBAAuB,CAAC;QACjC,KAAK,GAAG;YACN,OAAO,qBAAqB,CAAC;QAC/B;YACE,OAAO,cAAc,CAAC;IAC1B,CAAC;AACH,CAAC;AAUD,gDAAgD;AAChD,MAAM,UAAU,kBAAkB,CAChC,MAAc,EACd,OAAe,EACf,IAAa;IAEb,MAAM,KAAK,GAAgC;QACzC,OAAO;QACP,IAAI,EAAE,eAAe,CAAC,MAAM,CAAC;KAC9B,CAAC;IACF,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACvB,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC;AAaD,MAAM,UAAU,2BAA2B,CAAC,OAQ3C;IACC,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC;QACpC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,OAAO,CAAC,UAAU;KACtB,CAAC,CAAC;IACH,OAAO;QACL,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,UAAU,EAAE,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC;QACnC,QAAQ,EAAE,EAAE,GAAG,OAAO,CAAC,QAAQ,EAAE;QACjC,OAAO;KACR,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { HarnessRef, WorkspaceRef } from "../types.js";
|
|
2
|
+
import { type ResponsesProxyContext } from "./responses-mapper.js";
|
|
3
|
+
export interface ResponsesProxyOptions {
|
|
4
|
+
/** TCP port; default 8787, 0 = ephemeral. */
|
|
5
|
+
port?: number;
|
|
6
|
+
/** Bind host; default 127.0.0.1 (loopback only). */
|
|
7
|
+
host?: string;
|
|
8
|
+
/** Required bearer token; when unset, dev loopback-only mode plus a warning. */
|
|
9
|
+
token?: string;
|
|
10
|
+
/** Harness identity applied to every request; default { other, proxy }. */
|
|
11
|
+
harness?: HarnessRef;
|
|
12
|
+
/** Workspace applied to every request; default trusted process cwd. */
|
|
13
|
+
workspace?: WorkspaceRef;
|
|
14
|
+
/** Clock override for tests. */
|
|
15
|
+
now?: () => Date;
|
|
16
|
+
/** Warning sink for dev-mode notice; default console.warn. */
|
|
17
|
+
warn?: (message: string) => void;
|
|
18
|
+
}
|
|
19
|
+
export interface ResponsesProxyHandle {
|
|
20
|
+
readonly port: number;
|
|
21
|
+
readonly host: string;
|
|
22
|
+
close(): Promise<void>;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Start the local proxy and resolve once it is listening.
|
|
26
|
+
* Returns a handle whose `close()` stops the server.
|
|
27
|
+
*/
|
|
28
|
+
export declare function startResponsesProxy(context: ResponsesProxyContext, options?: ResponsesProxyOptions): Promise<ResponsesProxyHandle>;
|
|
29
|
+
//# sourceMappingURL=responses-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"responses-server.d.ts","sourceRoot":"","sources":["../../src/proxy/responses-server.ts"],"names":[],"mappings":"AAiBA,OAAO,KAAK,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAcL,KAAK,qBAAqB,EAC3B,MAAM,uBAAuB,CAAC;AAY/B,MAAM,WAAW,qBAAqB;IACpC,6CAA6C;IAC7C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,oDAAoD;IACpD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,OAAO,CAAC,EAAE,UAAU,CAAC;IACrB,uEAAuE;IACvE,SAAS,CAAC,EAAE,YAAY,CAAC;IACzB,gCAAgC;IAChC,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,8DAA8D;IAC9D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAClC;AAED,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAID;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,qBAAqB,EAC9B,OAAO,GAAE,qBAA0B,GAClC,OAAO,CAAC,oBAAoB,CAAC,CAkD/B"}
|