@cochon123/cli2api 0.1.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.
- package/LICENSE +21 -0
- package/README.md +252 -0
- package/dist/adapters/claude.d.ts +27 -0
- package/dist/adapters/claude.js +253 -0
- package/dist/adapters/claude.js.map +1 -0
- package/dist/adapters/codex.d.ts +51 -0
- package/dist/adapters/codex.js +491 -0
- package/dist/adapters/codex.js.map +1 -0
- package/dist/adapters/cursor.d.ts +31 -0
- package/dist/adapters/cursor.js +231 -0
- package/dist/adapters/cursor.js.map +1 -0
- package/dist/adapters/mock.d.ts +2 -0
- package/dist/adapters/mock.js +101 -0
- package/dist/adapters/mock.js.map +1 -0
- package/dist/adapters/opencode.d.ts +27 -0
- package/dist/adapters/opencode.js +208 -0
- package/dist/adapters/opencode.js.map +1 -0
- package/dist/adapters/registry.d.ts +33 -0
- package/dist/adapters/registry.js +99 -0
- package/dist/adapters/registry.js.map +1 -0
- package/dist/adapters/types.d.ts +18 -0
- package/dist/adapters/types.js +35 -0
- package/dist/adapters/types.js.map +1 -0
- package/dist/config.d.ts +126 -0
- package/dist/config.js +121 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +253 -0
- package/dist/index.js.map +1 -0
- package/dist/openrouter/catalog.d.ts +28 -0
- package/dist/openrouter/catalog.js +162 -0
- package/dist/openrouter/catalog.js.map +1 -0
- package/dist/protocol/openai.d.ts +48 -0
- package/dist/protocol/openai.js +236 -0
- package/dist/protocol/openai.js.map +1 -0
- package/dist/protocol/responses.d.ts +57 -0
- package/dist/protocol/responses.js +142 -0
- package/dist/protocol/responses.js.map +1 -0
- package/dist/protocol/tools.d.ts +7 -0
- package/dist/protocol/tools.js +143 -0
- package/dist/protocol/tools.js.map +1 -0
- package/dist/server/app.d.ts +25 -0
- package/dist/server/app.js +425 -0
- package/dist/server/app.js.map +1 -0
- package/dist/server/listen.d.ts +18 -0
- package/dist/server/listen.js +30 -0
- package/dist/server/listen.js.map +1 -0
- package/dist/session.d.ts +9 -0
- package/dist/session.js +39 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +192 -0
- package/dist/types.js +3 -0
- package/dist/types.js.map +1 -0
- package/dist/util/process.d.ts +38 -0
- package/dist/util/process.js +292 -0
- package/dist/util/process.js.map +1 -0
- package/package.json +65 -0
|
@@ -0,0 +1,491 @@
|
|
|
1
|
+
import { requestToPrompt } from "../protocol/openai.js";
|
|
2
|
+
import { runCommand, runCommandLines, which } from "../util/process.js";
|
|
3
|
+
const DEFAULT_MODELS = [
|
|
4
|
+
"default",
|
|
5
|
+
"gpt-5.6-terra",
|
|
6
|
+
"gpt-5.1-codex",
|
|
7
|
+
"o3",
|
|
8
|
+
"o4-mini",
|
|
9
|
+
];
|
|
10
|
+
/** Delay between fake-streamed content words (ms). */
|
|
11
|
+
const CONTENT_WORD_DELAY_MS = 28;
|
|
12
|
+
function sleep(ms, signal) {
|
|
13
|
+
if (ms <= 0)
|
|
14
|
+
return Promise.resolve();
|
|
15
|
+
return new Promise((resolve, reject) => {
|
|
16
|
+
if (signal?.aborted) {
|
|
17
|
+
reject(Object.assign(new Error("Aborted"), { code: "ABORT_ERR" }));
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
let timer;
|
|
21
|
+
const onAbort = () => {
|
|
22
|
+
clearTimeout(timer);
|
|
23
|
+
reject(Object.assign(new Error("Aborted"), { code: "ABORT_ERR" }));
|
|
24
|
+
};
|
|
25
|
+
timer = setTimeout(() => {
|
|
26
|
+
signal?.removeEventListener("abort", onAbort);
|
|
27
|
+
resolve();
|
|
28
|
+
}, ms);
|
|
29
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
/** Yield text word-by-word so SSE clients see a typing effect. */
|
|
33
|
+
export async function* fakeStreamWords(text, delayMs, signal, channel = "content") {
|
|
34
|
+
const parts = text.match(/\S+\s*|\s+/g) ?? [text];
|
|
35
|
+
for (const part of parts) {
|
|
36
|
+
if (signal?.aborted) {
|
|
37
|
+
yield { type: "error", message: "Aborted", code: "abort" };
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
if (!part)
|
|
41
|
+
continue;
|
|
42
|
+
yield { type: "delta", text: part, channel };
|
|
43
|
+
if (delayMs > 0) {
|
|
44
|
+
try {
|
|
45
|
+
await sleep(delayMs, signal);
|
|
46
|
+
}
|
|
47
|
+
catch {
|
|
48
|
+
yield { type: "error", message: "Aborted", code: "abort" };
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
function itemTypeOf(item) {
|
|
55
|
+
return typeof item.type === "string" ? item.type : "";
|
|
56
|
+
}
|
|
57
|
+
/** Extract assistant-facing text from a Codex JSONL item, if any. */
|
|
58
|
+
function agentMessageText(item) {
|
|
59
|
+
const itemType = itemTypeOf(item);
|
|
60
|
+
// Current schema uses agent_message; older experimental-json used assistant_message.
|
|
61
|
+
if (itemType !== "agent_message" && itemType !== "assistant_message" && itemType !== "message") {
|
|
62
|
+
return null;
|
|
63
|
+
}
|
|
64
|
+
if (typeof item.text === "string" && item.text)
|
|
65
|
+
return item.text;
|
|
66
|
+
if (typeof item.content === "string" && item.content)
|
|
67
|
+
return item.content;
|
|
68
|
+
if (typeof item.message === "string" && item.message)
|
|
69
|
+
return item.message;
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
function reasoningText(item) {
|
|
73
|
+
if (itemTypeOf(item) !== "reasoning")
|
|
74
|
+
return null;
|
|
75
|
+
let text = "";
|
|
76
|
+
if (typeof item.text === "string" && item.text)
|
|
77
|
+
text = item.text;
|
|
78
|
+
else if (typeof item.content === "string" && item.content)
|
|
79
|
+
text = item.content;
|
|
80
|
+
if (!text)
|
|
81
|
+
return null;
|
|
82
|
+
// Codex sometimes appends empty HTML comment markers in summary text.
|
|
83
|
+
return text.replace(/<!--\s*-->/g, "").trim() || null;
|
|
84
|
+
}
|
|
85
|
+
/** Short human-readable breadcrumb for non-message Codex items (reasoning channel). */
|
|
86
|
+
function activityBreadcrumb(eventType, item) {
|
|
87
|
+
if (eventType === "thread.started")
|
|
88
|
+
return "thread started\n";
|
|
89
|
+
if (eventType === "turn.started")
|
|
90
|
+
return "turn started\n";
|
|
91
|
+
if (!item)
|
|
92
|
+
return null;
|
|
93
|
+
const itemType = itemTypeOf(item);
|
|
94
|
+
if (itemType === "command_execution") {
|
|
95
|
+
const cmd = typeof item.command === "string" ? item.command : "";
|
|
96
|
+
const status = typeof item.status === "string" ? item.status : "";
|
|
97
|
+
if (eventType === "item.started") {
|
|
98
|
+
return cmd ? `running: ${cmd.slice(0, 120)}\n` : "command started\n";
|
|
99
|
+
}
|
|
100
|
+
if (eventType === "item.completed") {
|
|
101
|
+
const code = typeof item.exit_code === "number" ? ` (exit ${item.exit_code})` : "";
|
|
102
|
+
return cmd ? `done: ${cmd.slice(0, 80)}${code}\n` : `command ${status || "completed"}${code}\n`;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
if (itemType === "file_change" && eventType === "item.completed") {
|
|
106
|
+
const changes = Array.isArray(item.changes) ? item.changes : [];
|
|
107
|
+
const n = changes.length;
|
|
108
|
+
return n ? `file changes: ${n}\n` : "file change\n";
|
|
109
|
+
}
|
|
110
|
+
if (itemType === "mcp_tool_call") {
|
|
111
|
+
const tool = typeof item.tool === "string" ? item.tool : "tool";
|
|
112
|
+
const server = typeof item.server === "string" ? item.server : "";
|
|
113
|
+
const label = server ? `${server}/${tool}` : tool;
|
|
114
|
+
if (eventType === "item.started")
|
|
115
|
+
return `mcp: ${label}\n`;
|
|
116
|
+
if (eventType === "item.completed")
|
|
117
|
+
return `mcp done: ${label}\n`;
|
|
118
|
+
}
|
|
119
|
+
if (itemType === "web_search" && eventType === "item.completed") {
|
|
120
|
+
const q = typeof item.query === "string" ? item.query : "";
|
|
121
|
+
return q ? `web search: ${q.slice(0, 100)}\n` : "web search\n";
|
|
122
|
+
}
|
|
123
|
+
if (itemType === "todo_list" && (eventType === "item.started" || eventType === "item.updated")) {
|
|
124
|
+
return "plan updated\n";
|
|
125
|
+
}
|
|
126
|
+
if (itemType === "error") {
|
|
127
|
+
const msg = typeof item.message === "string" ? item.message : "error item";
|
|
128
|
+
return `${msg}\n`;
|
|
129
|
+
}
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Parse one Codex JSONL line into a typed payload.
|
|
134
|
+
* Content (agent_message) is returned whole — caller fake-streams words.
|
|
135
|
+
* Everything else useful goes to reasoning.
|
|
136
|
+
*/
|
|
137
|
+
export function parseCodexLine(line) {
|
|
138
|
+
const trimmed = line.trim();
|
|
139
|
+
if (!trimmed)
|
|
140
|
+
return { kind: "ignore" };
|
|
141
|
+
let obj;
|
|
142
|
+
try {
|
|
143
|
+
obj = JSON.parse(trimmed);
|
|
144
|
+
}
|
|
145
|
+
catch {
|
|
146
|
+
if (!trimmed.startsWith("{"))
|
|
147
|
+
return { kind: "content", text: trimmed };
|
|
148
|
+
return { kind: "ignore" };
|
|
149
|
+
}
|
|
150
|
+
if (!obj || typeof obj !== "object")
|
|
151
|
+
return { kind: "ignore" };
|
|
152
|
+
const rec = obj;
|
|
153
|
+
const type = typeof rec.type === "string" ? rec.type : "";
|
|
154
|
+
if (type === "error") {
|
|
155
|
+
let message = "codex stream error";
|
|
156
|
+
if (typeof rec.message === "string" && rec.message) {
|
|
157
|
+
message = rec.message;
|
|
158
|
+
}
|
|
159
|
+
else if (rec.error && typeof rec.error === "object") {
|
|
160
|
+
const nested = rec.error.message;
|
|
161
|
+
if (typeof nested === "string" && nested)
|
|
162
|
+
message = nested;
|
|
163
|
+
}
|
|
164
|
+
if (/^Reconnecting\.\.\./i.test(message))
|
|
165
|
+
return { kind: "ignore" };
|
|
166
|
+
return { kind: "error", error: { type: "error", message, code: "cli_error" } };
|
|
167
|
+
}
|
|
168
|
+
if (type === "turn.failed") {
|
|
169
|
+
let message = "codex turn failed";
|
|
170
|
+
if (rec.error && typeof rec.error === "object") {
|
|
171
|
+
const nested = rec.error.message;
|
|
172
|
+
if (typeof nested === "string" && nested)
|
|
173
|
+
message = nested;
|
|
174
|
+
}
|
|
175
|
+
return { kind: "error", error: { type: "error", message, code: "turn_failed" } };
|
|
176
|
+
}
|
|
177
|
+
if (type === "turn.completed") {
|
|
178
|
+
const usageRaw = rec.usage;
|
|
179
|
+
let usage;
|
|
180
|
+
if (usageRaw && typeof usageRaw === "object") {
|
|
181
|
+
const u = usageRaw;
|
|
182
|
+
const prompt = typeof u.input_tokens === "number" ? u.input_tokens : 0;
|
|
183
|
+
const completion = typeof u.output_tokens === "number" ? u.output_tokens : 0;
|
|
184
|
+
usage = {
|
|
185
|
+
prompt_tokens: prompt,
|
|
186
|
+
completion_tokens: completion,
|
|
187
|
+
total_tokens: prompt + completion,
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
return { kind: "done", done: { type: "done", finishReason: "stop", usage } };
|
|
191
|
+
}
|
|
192
|
+
const item = rec.item && typeof rec.item === "object" ? rec.item : null;
|
|
193
|
+
// Lifecycle breadcrumbs
|
|
194
|
+
if (type === "thread.started") {
|
|
195
|
+
return typeof rec.thread_id === "string" && rec.thread_id
|
|
196
|
+
? { kind: "session", sessionId: rec.thread_id }
|
|
197
|
+
: { kind: "ignore" };
|
|
198
|
+
}
|
|
199
|
+
if (type === "turn.started") {
|
|
200
|
+
const crumb = activityBreadcrumb(type, null);
|
|
201
|
+
return crumb ? { kind: "reasoning", text: crumb } : { kind: "ignore" };
|
|
202
|
+
}
|
|
203
|
+
if (type === "item.started" || type === "item.updated" || type === "item.completed") {
|
|
204
|
+
if (item) {
|
|
205
|
+
const agent = agentMessageText(item);
|
|
206
|
+
if (agent && type === "item.completed") {
|
|
207
|
+
return { kind: "content", text: agent };
|
|
208
|
+
}
|
|
209
|
+
const reason = reasoningText(item);
|
|
210
|
+
if (reason && (type === "item.completed" || type === "item.updated")) {
|
|
211
|
+
const text = reason.endsWith("\n") ? reason : `${reason}\n`;
|
|
212
|
+
return { kind: "reasoning", text, fakeStream: true };
|
|
213
|
+
}
|
|
214
|
+
const crumb = activityBreadcrumb(type, item);
|
|
215
|
+
if (crumb)
|
|
216
|
+
return { kind: "reasoning", text: crumb, fakeStream: false };
|
|
217
|
+
}
|
|
218
|
+
return { kind: "ignore" };
|
|
219
|
+
}
|
|
220
|
+
if (type === "agent_message" || type === "message") {
|
|
221
|
+
const src = item ?? rec;
|
|
222
|
+
const text = agentMessageText(src);
|
|
223
|
+
if (text)
|
|
224
|
+
return { kind: "content", text };
|
|
225
|
+
if (typeof rec.message === "string" && rec.message) {
|
|
226
|
+
return { kind: "content", text: rec.message };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return { kind: "ignore" };
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Map one Codex JSONL event to ChatEvents (content returned as a single delta;
|
|
233
|
+
* prefer parseCodexLine + fakeStreamWords in the live adapter path).
|
|
234
|
+
*/
|
|
235
|
+
export function chatEventsFromCodexLine(line) {
|
|
236
|
+
const parsed = parseCodexLine(line);
|
|
237
|
+
if (parsed.kind === "content" && parsed.text) {
|
|
238
|
+
return [{ type: "delta", text: parsed.text, channel: "content" }];
|
|
239
|
+
}
|
|
240
|
+
if (parsed.kind === "reasoning" && parsed.text) {
|
|
241
|
+
return [{ type: "delta", text: parsed.text, channel: "reasoning" }];
|
|
242
|
+
}
|
|
243
|
+
if (parsed.kind === "done" && parsed.done)
|
|
244
|
+
return [parsed.done];
|
|
245
|
+
if (parsed.kind === "session" && parsed.sessionId)
|
|
246
|
+
return [{ type: "session", id: parsed.sessionId }];
|
|
247
|
+
if (parsed.kind === "error" && parsed.error)
|
|
248
|
+
return [parsed.error];
|
|
249
|
+
return [];
|
|
250
|
+
}
|
|
251
|
+
/** Batch helper kept for tests / non-streaming inspection. */
|
|
252
|
+
export function parseCodexJsonl(stdout) {
|
|
253
|
+
const lines = stdout.split(/\r?\n/);
|
|
254
|
+
let text = "";
|
|
255
|
+
let lastMessage = "";
|
|
256
|
+
for (const line of lines) {
|
|
257
|
+
const trimmed = line.trim();
|
|
258
|
+
if (!trimmed)
|
|
259
|
+
continue;
|
|
260
|
+
try {
|
|
261
|
+
const obj = JSON.parse(trimmed);
|
|
262
|
+
if (typeof obj.last_agent_message === "string") {
|
|
263
|
+
lastMessage = obj.last_agent_message;
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
catch {
|
|
267
|
+
// ignore
|
|
268
|
+
}
|
|
269
|
+
for (const ev of chatEventsFromCodexLine(line)) {
|
|
270
|
+
if (ev.type === "delta" && (ev.channel ?? "content") === "content")
|
|
271
|
+
text += ev.text;
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
if (lastMessage)
|
|
275
|
+
return lastMessage.trim();
|
|
276
|
+
if (text)
|
|
277
|
+
return text.trim();
|
|
278
|
+
const trimmed = stdout.trim();
|
|
279
|
+
if (trimmed && !trimmed.startsWith("{"))
|
|
280
|
+
return trimmed;
|
|
281
|
+
return trimmed;
|
|
282
|
+
}
|
|
283
|
+
function buildExecArgs(opts, req, sandbox, skipGitRepoCheck, prompt) {
|
|
284
|
+
const args = req.nativeSessionId
|
|
285
|
+
? ["exec", "resume", "--json"]
|
|
286
|
+
: ["exec", "--json", "-s", sandbox];
|
|
287
|
+
if (skipGitRepoCheck)
|
|
288
|
+
args.push("--skip-git-repo-check");
|
|
289
|
+
if (req.nativeSessionId)
|
|
290
|
+
args.push("-c", `sandbox_mode=\"${sandbox}\"`);
|
|
291
|
+
// Surface reasoning *summaries* on the JSONL stream (effort alone is not enough).
|
|
292
|
+
args.push("-c", "model_reasoning_summary=detailed", "-c", "model_supports_reasoning_summaries=true", "-c", "hide_agent_reasoning=false");
|
|
293
|
+
// Optional effort override from OpenAI-shaped request body.
|
|
294
|
+
const reasoning = req.raw?.reasoning;
|
|
295
|
+
const rawEffort = req.raw?.reasoning_effort
|
|
296
|
+
?? (reasoning && typeof reasoning === "object" && !Array.isArray(reasoning) ? reasoning.effort : undefined)
|
|
297
|
+
?? req.raw?.reasoningEffort;
|
|
298
|
+
if (typeof rawEffort === "string" && rawEffort.trim() && rawEffort.trim() !== "none") {
|
|
299
|
+
args.push("-c", `model_reasoning_effort=${rawEffort.trim().toLowerCase()}`);
|
|
300
|
+
}
|
|
301
|
+
// cwd is applied via spawn options only — do not also pass -C (double-resolves relative paths).
|
|
302
|
+
if (req.modelLocal && req.modelLocal !== "default") {
|
|
303
|
+
args.push("-m", req.modelLocal);
|
|
304
|
+
}
|
|
305
|
+
if (opts.extraArgs?.length)
|
|
306
|
+
args.push(...opts.extraArgs);
|
|
307
|
+
if (req.nativeSessionId)
|
|
308
|
+
args.push(req.nativeSessionId);
|
|
309
|
+
args.push(prompt);
|
|
310
|
+
return args;
|
|
311
|
+
}
|
|
312
|
+
export function createCodexAdapter(opts = {}) {
|
|
313
|
+
const binary = opts.binary ?? "codex";
|
|
314
|
+
const timeoutMs = opts.timeoutMs ?? 180_000;
|
|
315
|
+
const sandbox = opts.sandbox ?? "read-only";
|
|
316
|
+
const skipGitRepoCheck = opts.skipGitRepoCheck ?? true;
|
|
317
|
+
const wordDelay = typeof opts.contentWordDelayMs === "number" ? opts.contentWordDelayMs : CONTENT_WORD_DELAY_MS;
|
|
318
|
+
return {
|
|
319
|
+
id: "codex",
|
|
320
|
+
description: "OpenAI Codex CLI via `codex exec --json`",
|
|
321
|
+
async listModels() {
|
|
322
|
+
return DEFAULT_MODELS.map((m) => ({
|
|
323
|
+
id: `codex/${m}`,
|
|
324
|
+
object: "model",
|
|
325
|
+
created: 0,
|
|
326
|
+
owned_by: "codex",
|
|
327
|
+
description: m === "default" ? "Uses Codex CLI default model" : undefined,
|
|
328
|
+
}));
|
|
329
|
+
},
|
|
330
|
+
async *chat(req, signal) {
|
|
331
|
+
const path = await which(binary);
|
|
332
|
+
if (!path) {
|
|
333
|
+
yield {
|
|
334
|
+
type: "error",
|
|
335
|
+
message: `codex binary not found on PATH (looked for "${binary}"). Install Codex CLI or set CLI2API_CODEX_BIN.`,
|
|
336
|
+
code: "binary_missing",
|
|
337
|
+
};
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
const prompt = requestToPrompt(req);
|
|
341
|
+
const args = buildExecArgs(opts, req, sandbox, skipGitRepoCheck, prompt);
|
|
342
|
+
// Fake-stream delays are only for SSE typing effect — skip for non-stream collectors.
|
|
343
|
+
const effectiveWordDelay = req.stream ? wordDelay : 0;
|
|
344
|
+
let sawContent = false;
|
|
345
|
+
let pendingDone = null;
|
|
346
|
+
let exitCode = null;
|
|
347
|
+
let timedOut = false;
|
|
348
|
+
let stderr = "";
|
|
349
|
+
try {
|
|
350
|
+
for await (const pev of runCommandLines(path, args, {
|
|
351
|
+
cwd: opts.cwd,
|
|
352
|
+
timeoutMs,
|
|
353
|
+
signal,
|
|
354
|
+
inheritEnv: ["CODEX_HOME"],
|
|
355
|
+
})) {
|
|
356
|
+
if (signal.aborted) {
|
|
357
|
+
yield { type: "error", message: "Aborted", code: "abort" };
|
|
358
|
+
return;
|
|
359
|
+
}
|
|
360
|
+
if (pev.type === "stdout_line") {
|
|
361
|
+
const parsed = parseCodexLine(pev.line);
|
|
362
|
+
if (parsed.kind === "session" && parsed.sessionId) {
|
|
363
|
+
yield { type: "session", id: parsed.sessionId };
|
|
364
|
+
}
|
|
365
|
+
else if (parsed.kind === "reasoning" && parsed.text) {
|
|
366
|
+
if (parsed.fakeStream) {
|
|
367
|
+
for await (const ev of fakeStreamWords(parsed.text, effectiveWordDelay, signal, "reasoning")) {
|
|
368
|
+
yield ev;
|
|
369
|
+
if (ev.type === "error")
|
|
370
|
+
return;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
else {
|
|
374
|
+
yield { type: "delta", text: parsed.text, channel: "reasoning" };
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
else if (parsed.kind === "content" && parsed.text) {
|
|
378
|
+
sawContent = true;
|
|
379
|
+
// Fake-stream the whole agent message word-by-word.
|
|
380
|
+
for await (const ev of fakeStreamWords(parsed.text, effectiveWordDelay, signal, "content")) {
|
|
381
|
+
yield ev;
|
|
382
|
+
if (ev.type === "error")
|
|
383
|
+
return;
|
|
384
|
+
}
|
|
385
|
+
}
|
|
386
|
+
else if (parsed.kind === "done" && parsed.done) {
|
|
387
|
+
// Buffer until exit validation — nonzero exit must not look like success.
|
|
388
|
+
pendingDone = parsed.done;
|
|
389
|
+
}
|
|
390
|
+
else if (parsed.kind === "error" && parsed.error) {
|
|
391
|
+
yield parsed.error;
|
|
392
|
+
return;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
else if (pev.type === "exit") {
|
|
396
|
+
exitCode = pev.code;
|
|
397
|
+
timedOut = pev.timedOut;
|
|
398
|
+
stderr = pev.stderr;
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
catch (err) {
|
|
403
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
404
|
+
yield { type: "error", message: `Failed to spawn codex: ${message}`, code: "spawn_error" };
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
if (timedOut) {
|
|
408
|
+
yield { type: "error", message: `codex timed out after ${timeoutMs}ms`, code: "timeout" };
|
|
409
|
+
return;
|
|
410
|
+
}
|
|
411
|
+
if (signal.aborted) {
|
|
412
|
+
yield { type: "error", message: "Aborted", code: "abort" };
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
if (exitCode !== 0) {
|
|
416
|
+
const detail = stderr.trim().slice(0, 2000);
|
|
417
|
+
yield {
|
|
418
|
+
type: "error",
|
|
419
|
+
message: `codex exited with code ${exitCode}${detail ? `: ${detail}` : ""}`,
|
|
420
|
+
code: "cli_error",
|
|
421
|
+
};
|
|
422
|
+
return;
|
|
423
|
+
}
|
|
424
|
+
if (!sawContent) {
|
|
425
|
+
yield {
|
|
426
|
+
type: "error",
|
|
427
|
+
message: `codex returned empty output. stderr: ${stderr.trim().slice(0, 1000)}`,
|
|
428
|
+
code: "empty_output",
|
|
429
|
+
};
|
|
430
|
+
return;
|
|
431
|
+
}
|
|
432
|
+
yield pendingDone ?? { type: "done", finishReason: "stop" };
|
|
433
|
+
},
|
|
434
|
+
async health() {
|
|
435
|
+
const path = await which(binary);
|
|
436
|
+
if (!path) {
|
|
437
|
+
return {
|
|
438
|
+
ok: false,
|
|
439
|
+
adapter: "codex",
|
|
440
|
+
details: { binary },
|
|
441
|
+
message: "codex binary not found on PATH",
|
|
442
|
+
};
|
|
443
|
+
}
|
|
444
|
+
const ver = await runCommand(path, ["--version"], { timeoutMs: 8_000 });
|
|
445
|
+
return {
|
|
446
|
+
ok: ver.code === 0,
|
|
447
|
+
adapter: "codex",
|
|
448
|
+
details: {
|
|
449
|
+
binary: path,
|
|
450
|
+
version: ver.stdout.trim() || ver.stderr.trim(),
|
|
451
|
+
sandbox,
|
|
452
|
+
},
|
|
453
|
+
message: ver.code === 0 ? "codex available" : "codex --version failed",
|
|
454
|
+
};
|
|
455
|
+
},
|
|
456
|
+
async doctor() {
|
|
457
|
+
const checks = [];
|
|
458
|
+
const path = await which(binary);
|
|
459
|
+
checks.push({
|
|
460
|
+
name: "binary-on-path",
|
|
461
|
+
ok: Boolean(path),
|
|
462
|
+
detail: path ?? `missing: ${binary}`,
|
|
463
|
+
});
|
|
464
|
+
let version;
|
|
465
|
+
if (path) {
|
|
466
|
+
const ver = await runCommand(path, ["--version"], { timeoutMs: 8_000 });
|
|
467
|
+
version = (ver.stdout || ver.stderr).trim();
|
|
468
|
+
checks.push({
|
|
469
|
+
name: "version",
|
|
470
|
+
ok: ver.code === 0,
|
|
471
|
+
detail: version || `exit ${ver.code}`,
|
|
472
|
+
});
|
|
473
|
+
const help = await runCommand(path, ["exec", "--help"], { timeoutMs: 8_000 });
|
|
474
|
+
const hasJson = /--json/.test(help.stdout + help.stderr);
|
|
475
|
+
checks.push({
|
|
476
|
+
name: "exec-json-flag",
|
|
477
|
+
ok: hasJson,
|
|
478
|
+
detail: hasJson ? "codex exec --json supported" : "codex exec --json not found in help",
|
|
479
|
+
});
|
|
480
|
+
}
|
|
481
|
+
return {
|
|
482
|
+
adapter: "codex",
|
|
483
|
+
ok: checks.every((c) => c.ok),
|
|
484
|
+
binary: path ?? undefined,
|
|
485
|
+
version,
|
|
486
|
+
checks,
|
|
487
|
+
};
|
|
488
|
+
},
|
|
489
|
+
};
|
|
490
|
+
}
|
|
491
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/adapters/codex.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAExE,MAAM,cAAc,GAAG;IACrB,SAAS;IACT,eAAe;IACf,eAAe;IACf,IAAI;IACJ,SAAS;CACV,CAAC;AAEF,sDAAsD;AACtD,MAAM,qBAAqB,GAAG,EAAE,CAAC;AAsBjC,SAAS,KAAK,CAAC,EAAU,EAAE,MAAoB;IAC7C,IAAI,EAAE,IAAI,CAAC;QAAE,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IACtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;YACnE,OAAO;QACT,CAAC;QACD,IAAI,KAAoC,CAAC;QACzC,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,YAAY,CAAC,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC;QACrE,CAAC,CAAC;QACF,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;YACtB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YAC9C,OAAO,EAAE,CAAC;QACZ,CAAC,EAAE,EAAE,CAAC,CAAC;QACP,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAC7D,CAAC,CAAC,CAAC;AACL,CAAC;AAED,kEAAkE;AAClE,MAAM,CAAC,KAAK,SAAS,CAAC,CAAC,eAAe,CACpC,IAAY,EACZ,OAAe,EACf,MAAoB,EACpB,UAAmC,SAAS;IAE5C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,MAAM,EAAE,OAAO,EAAE,CAAC;YACpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;YAC3D,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QAC7C,IAAI,OAAO,GAAG,CAAC,EAAE,CAAC;YAChB,IAAI,CAAC;gBACH,MAAM,KAAK,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC/B,CAAC;YAAC,MAAM,CAAC;gBACP,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC3D,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,UAAU,CAAC,IAA6B;IAC/C,OAAO,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;AACxD,CAAC;AAED,qEAAqE;AACrE,SAAS,gBAAgB,CAAC,IAA6B;IACrD,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,qFAAqF;IACrF,IAAI,QAAQ,KAAK,eAAe,IAAI,QAAQ,KAAK,mBAAmB,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC/F,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI,CAAC;IACjE,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IAC1E,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC,OAAO,CAAC;IAC1E,OAAO,IAAI,CAAC;AACd,CAAC;AAED,SAAS,aAAa,CAAC,IAA6B;IAClD,IAAI,UAAU,CAAC,IAAI,CAAC,KAAK,WAAW;QAAE,OAAO,IAAI,CAAC;IAClD,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,IAAI;QAAE,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;SAC5D,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO;QAAE,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC;IAC/E,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,sEAAsE;IACtE,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;AACxD,CAAC;AAED,uFAAuF;AACvF,SAAS,kBAAkB,CACzB,SAAiB,EACjB,IAAoC;IAEpC,IAAI,SAAS,KAAK,gBAAgB;QAAE,OAAO,kBAAkB,CAAC;IAC9D,IAAI,SAAS,KAAK,cAAc;QAAE,OAAO,gBAAgB,CAAC;IAC1D,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,QAAQ,KAAK,mBAAmB,EAAE,CAAC;QACrC,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACjE,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,IAAI,SAAS,KAAK,cAAc,EAAE,CAAC;YACjC,OAAO,GAAG,CAAC,CAAC,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,mBAAmB,CAAC;QACvE,CAAC;QACD,IAAI,SAAS,KAAK,gBAAgB,EAAE,CAAC;YACnC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACnF,OAAO,GAAG,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,WAAW,MAAM,IAAI,WAAW,GAAG,IAAI,IAAI,CAAC;QAClG,CAAC;IACH,CAAC;IACD,IAAI,QAAQ,KAAK,aAAa,IAAI,SAAS,KAAK,gBAAgB,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QAChE,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;QACzB,OAAO,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;IACtD,CAAC;IACD,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QAChE,MAAM,MAAM,GAAG,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;QAClE,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAClD,IAAI,SAAS,KAAK,cAAc;YAAE,OAAO,QAAQ,KAAK,IAAI,CAAC;QAC3D,IAAI,SAAS,KAAK,gBAAgB;YAAE,OAAO,aAAa,KAAK,IAAI,CAAC;IACpE,CAAC;IACD,IAAI,QAAQ,KAAK,YAAY,IAAI,SAAS,KAAK,gBAAgB,EAAE,CAAC;QAChE,MAAM,CAAC,GAAG,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC3D,OAAO,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;IACjE,CAAC;IACD,IAAI,QAAQ,KAAK,WAAW,IAAI,CAAC,SAAS,KAAK,cAAc,IAAI,SAAS,KAAK,cAAc,CAAC,EAAE,CAAC;QAC/F,OAAO,gBAAgB,CAAC;IAC1B,CAAC;IACD,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,YAAY,CAAC;QAC3E,OAAO,GAAG,GAAG,IAAI,CAAC;IACpB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAcD;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY;IACzC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,CAAC,OAAO;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAExC,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAC5B,CAAC;IAAC,MAAM,CAAC;QACP,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;QACxE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IACD,IAAI,CAAC,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAE/D,MAAM,GAAG,GAAG,GAA8B,CAAC;IAC3C,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IAE1D,IAAI,IAAI,KAAK,OAAO,EAAE,CAAC;QACrB,IAAI,OAAO,GAAG,oBAAoB,CAAC;QACnC,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACnD,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QACxB,CAAC;aAAM,IAAI,GAAG,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YACtD,MAAM,MAAM,GAAI,GAAG,CAAC,KAAiC,CAAC,OAAO,CAAC;YAC9D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM;gBAAE,OAAO,GAAG,MAAM,CAAC;QAC7D,CAAC;QACD,IAAI,sBAAsB,CAAC,IAAI,CAAC,OAAO,CAAC;YAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACpE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC;IACjF,CAAC;IAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,IAAI,OAAO,GAAG,mBAAmB,CAAC;QAClC,IAAI,GAAG,CAAC,KAAK,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/C,MAAM,MAAM,GAAI,GAAG,CAAC,KAAiC,CAAC,OAAO,CAAC;YAC9D,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM;gBAAE,OAAO,GAAG,MAAM,CAAC;QAC7D,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,EAAE,CAAC;IACnF,CAAC;IAED,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC9B,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC;QAC3B,IAAI,KAA6F,CAAC;QAClG,IAAI,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,QAAmC,CAAC;YAC9C,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;YACvE,MAAM,UAAU,GAAG,OAAO,CAAC,CAAC,aAAa,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7E,KAAK,GAAG;gBACN,aAAa,EAAE,MAAM;gBACrB,iBAAiB,EAAE,UAAU;gBAC7B,YAAY,EAAE,MAAM,GAAG,UAAU;aAClC,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,CAAC;IAC/E,CAAC;IAED,MAAM,IAAI,GACR,GAAG,CAAC,IAAI,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,GAAG,CAAC,IAAgC,CAAC,CAAC,CAAC,IAAI,CAAC;IAE1F,wBAAwB;IACxB,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QAC9B,OAAO,OAAO,GAAG,CAAC,SAAS,KAAK,QAAQ,IAAI,GAAG,CAAC,SAAS;YACvD,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE;YAC/C,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACzB,CAAC;IACD,IAAI,IAAI,KAAK,cAAc,EAAE,CAAC;QAC5B,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC7C,OAAO,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IACzE,CAAC;IAED,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,cAAc,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;QACpF,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;YACrC,IAAI,KAAK,IAAI,IAAI,KAAK,gBAAgB,EAAE,CAAC;gBACvC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;YAC1C,CAAC;YACD,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,gBAAgB,IAAI,IAAI,KAAK,cAAc,CAAC,EAAE,CAAC;gBACrE,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,CAAC;gBAC5D,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YACvD,CAAC;YACD,MAAM,KAAK,GAAG,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;YAC7C,IAAI,KAAK;gBAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;QAC1E,CAAC;QACD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC5B,CAAC;IAED,IAAI,IAAI,KAAK,eAAe,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;QACnD,MAAM,GAAG,GAAG,IAAI,IAAI,GAAG,CAAC;QACxB,MAAM,IAAI,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,IAAI;YAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;QAC3C,IAAI,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YACnD,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;AAC5B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAY;IAClD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC7C,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IACpE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC/C,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI;QAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAChE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS;QAAE,OAAO,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACtG,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK;QAAE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACnE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACpC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,WAAW,GAAG,EAAE,CAAC;IACrB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,CAAC,OAAO;YAAE,SAAS;QACvB,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;YAC3D,IAAI,OAAO,GAAG,CAAC,kBAAkB,KAAK,QAAQ,EAAE,CAAC;gBAC/C,WAAW,GAAG,GAAG,CAAC,kBAAkB,CAAC;YACvC,CAAC;QACH,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;QACD,KAAK,MAAM,EAAE,IAAI,uBAAuB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/C,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,EAAE,CAAC,OAAO,IAAI,SAAS,CAAC,KAAK,SAAS;gBAAE,IAAI,IAAI,EAAE,CAAC,IAAI,CAAC;QACtF,CAAC;IACH,CAAC;IACD,IAAI,WAAW;QAAE,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC;IAC3C,IAAI,IAAI;QAAE,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC;IAC7B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IACxD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAS,aAAa,CACpB,IAAyB,EACzB,GAA0B,EAC1B,OAAe,EACf,gBAAyB,EACzB,MAAc;IAEd,MAAM,IAAI,GAAG,GAAG,CAAC,eAAe;QAC9B,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC;QAC9B,CAAC,CAAC,CAAC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,gBAAgB;QAAE,IAAI,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACzD,IAAI,GAAG,CAAC,eAAe;QAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,OAAO,IAAI,CAAC,CAAC;IACxE,kFAAkF;IAClF,IAAI,CAAC,IAAI,CACP,IAAI,EACJ,kCAAkC,EAClC,IAAI,EACJ,yCAAyC,EACzC,IAAI,EACJ,4BAA4B,CAC7B,CAAC;IACF,4DAA4D;IAC5D,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,EAAE,SAAS,CAAC;IACrC,MAAM,SAAS,GAAG,GAAG,CAAC,GAAG,EAAE,gBAAgB;WACtC,CAAC,SAAS,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC;WACxG,GAAG,CAAC,GAAG,EAAE,eAAe,CAAC;IAC9B,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,CAAC,IAAI,EAAE,IAAI,SAAS,CAAC,IAAI,EAAE,KAAK,MAAM,EAAE,CAAC;QACrF,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,0BAA0B,SAAS,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,gGAAgG;IAChG,IAAI,GAAG,CAAC,UAAU,IAAI,GAAG,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IACD,IAAI,IAAI,CAAC,SAAS,EAAE,MAAM;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,GAAG,CAAC,eAAe;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;IACxD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAClB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,OAA4B,EAAE;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,IAAI,OAAO,CAAC;IACtC,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,OAAO,CAAC;IAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,WAAW,CAAC;IAC5C,MAAM,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC;IACvD,MAAM,SAAS,GACb,OAAO,IAAI,CAAC,kBAAkB,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,qBAAqB,CAAC;IAEhG,OAAO;QACL,EAAE,EAAE,OAAO;QACX,WAAW,EAAE,0CAA0C;QAEvD,KAAK,CAAC,UAAU;YACd,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAChC,EAAE,EAAE,SAAS,CAAC,EAAE;gBAChB,MAAM,EAAE,OAAgB;gBACxB,OAAO,EAAE,CAAC;gBACV,QAAQ,EAAE,OAAO;gBACjB,WAAW,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,SAAS;aAC1E,CAAC,CAAC,CAAC;QACN,CAAC;QAED,KAAK,CAAC,CAAC,IAAI,CAAC,GAA0B,EAAE,MAAmB;YACzD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,+CAA+C,MAAM,iDAAiD;oBAC/G,IAAI,EAAE,gBAAgB;iBACvB,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,gBAAgB,EAAE,MAAM,CAAC,CAAC;YACzE,sFAAsF;YACtF,MAAM,kBAAkB,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YAEtD,IAAI,UAAU,GAAG,KAAK,CAAC;YACvB,IAAI,WAAW,GAA0C,IAAI,CAAC;YAC9D,IAAI,QAAQ,GAAkB,IAAI,CAAC;YACnC,IAAI,QAAQ,GAAG,KAAK,CAAC;YACrB,IAAI,MAAM,GAAG,EAAE,CAAC;YAEhB,IAAI,CAAC;gBACH,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE;oBAClD,GAAG,EAAE,IAAI,CAAC,GAAG;oBACb,SAAS;oBACT,MAAM;oBACN,UAAU,EAAE,CAAC,YAAY,CAAC;iBAC3B,CAAC,EAAE,CAAC;oBACH,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;wBACnB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;wBAC3D,OAAO;oBACT,CAAC;oBAED,IAAI,GAAG,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;wBAC/B,MAAM,MAAM,GAAG,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;wBACxC,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;4BAClD,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;wBAClD,CAAC;6BAAM,IAAI,MAAM,CAAC,IAAI,KAAK,WAAW,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;4BACtD,IAAI,MAAM,CAAC,UAAU,EAAE,CAAC;gCACtB,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,eAAe,CACpC,MAAM,CAAC,IAAI,EACX,kBAAkB,EAClB,MAAM,EACN,WAAW,CACZ,EAAE,CAAC;oCACF,MAAM,EAAE,CAAC;oCACT,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO;wCAAE,OAAO;gCAClC,CAAC;4BACH,CAAC;iCAAM,CAAC;gCACN,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC;4BACnE,CAAC;wBACH,CAAC;6BAAM,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;4BACpD,UAAU,GAAG,IAAI,CAAC;4BAClB,oDAAoD;4BACpD,IAAI,KAAK,EAAE,MAAM,EAAE,IAAI,eAAe,CACpC,MAAM,CAAC,IAAI,EACX,kBAAkB,EAClB,MAAM,EACN,SAAS,CACV,EAAE,CAAC;gCACF,MAAM,EAAE,CAAC;gCACT,IAAI,EAAE,CAAC,IAAI,KAAK,OAAO;oCAAE,OAAO;4BAClC,CAAC;wBACH,CAAC;6BAAM,IAAI,MAAM,CAAC,IAAI,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;4BACjD,0EAA0E;4BAC1E,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC;wBAC5B,CAAC;6BAAM,IAAI,MAAM,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;4BACnD,MAAM,MAAM,CAAC,KAAK,CAAC;4BACnB,OAAO;wBACT,CAAC;oBACH,CAAC;yBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;wBAC/B,QAAQ,GAAG,GAAG,CAAC,IAAI,CAAC;wBACpB,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC;wBACxB,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC;oBACtB,CAAC;gBACH,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBACjE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,0BAA0B,OAAO,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC;gBAC3F,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,yBAAyB,SAAS,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;gBAC1F,OAAO;YACT,CAAC;YAED,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACnB,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;gBAC3D,OAAO;YACT,CAAC;YAED,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;gBACnB,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;gBAC5C,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,0BAA0B,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;oBAC3E,IAAI,EAAE,WAAW;iBAClB,CAAC;gBACF,OAAO;YACT,CAAC;YAED,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM;oBACJ,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,wCAAwC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE;oBAC/E,IAAI,EAAE,cAAc;iBACrB,CAAC;gBACF,OAAO;YACT,CAAC;YAED,MAAM,WAAW,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;QAC9D,CAAC;QAED,KAAK,CAAC,MAAM;YACV,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,OAAO,EAAE,OAAO;oBAChB,OAAO,EAAE,EAAE,MAAM,EAAE;oBACnB,OAAO,EAAE,gCAAgC;iBAC1C,CAAC;YACJ,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;YACxE,OAAO;gBACL,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC;gBAClB,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE;oBACP,MAAM,EAAE,IAAI;oBACZ,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE;oBAC/C,OAAO;iBACR;gBACD,OAAO,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,wBAAwB;aACvE,CAAC;QACJ,CAAC;QAED,KAAK,CAAC,MAAM;YACV,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,gBAAgB;gBACtB,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC;gBACjB,MAAM,EAAE,IAAI,IAAI,YAAY,MAAM,EAAE;aACrC,CAAC,CAAC;YAEH,IAAI,OAA2B,CAAC;YAChC,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,GAAG,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,WAAW,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxE,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;gBAC5C,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,SAAS;oBACf,EAAE,EAAE,GAAG,CAAC,IAAI,KAAK,CAAC;oBAClB,MAAM,EAAE,OAAO,IAAI,QAAQ,GAAG,CAAC,IAAI,EAAE;iBACtC,CAAC,CAAC;gBAEH,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;gBAC9E,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;gBACzD,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,gBAAgB;oBACtB,EAAE,EAAE,OAAO;oBACX,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,qCAAqC;iBACxF,CAAC,CAAC;YACL,CAAC;YAED,OAAO;gBACL,OAAO,EAAE,OAAO;gBAChB,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7B,MAAM,EAAE,IAAI,IAAI,SAAS;gBACzB,OAAO;gBACP,MAAM;aACP,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Adapter } from "./types.js";
|
|
2
|
+
import type { ChatCompletionResponse } from "../types.js";
|
|
3
|
+
export interface CursorAdapterOptions {
|
|
4
|
+
binary?: string;
|
|
5
|
+
cwd?: string;
|
|
6
|
+
timeoutMs?: number;
|
|
7
|
+
extraArgs?: string[];
|
|
8
|
+
/** Cursor read-only mode. */
|
|
9
|
+
mode?: "ask" | "plan";
|
|
10
|
+
/** Headless Cursor requires explicit workspace trust. */
|
|
11
|
+
trust?: boolean;
|
|
12
|
+
}
|
|
13
|
+
export type CursorParsedLine = {
|
|
14
|
+
kind: "content" | "reasoning";
|
|
15
|
+
text: string;
|
|
16
|
+
partial: boolean;
|
|
17
|
+
} | {
|
|
18
|
+
kind: "session";
|
|
19
|
+
id: string;
|
|
20
|
+
} | {
|
|
21
|
+
kind: "result";
|
|
22
|
+
text?: string;
|
|
23
|
+
usage?: ChatCompletionResponse["usage"];
|
|
24
|
+
} | {
|
|
25
|
+
kind: "error";
|
|
26
|
+
message: string;
|
|
27
|
+
} | {
|
|
28
|
+
kind: "ignore";
|
|
29
|
+
};
|
|
30
|
+
export declare function parseCursorLine(line: string): CursorParsedLine;
|
|
31
|
+
export declare function createCursorAdapter(opts?: CursorAdapterOptions): Adapter;
|