askvireo 0.1.2 → 0.1.3

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.
@@ -0,0 +1,593 @@
1
+ import { execFile, spawn } from "node:child_process";
2
+ import { accessSync, constants, mkdtempSync, readdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
3
+ import { createServer } from "node:http";
4
+ import { homedir, tmpdir } from "node:os";
5
+ import { delimiter, dirname, join } from "node:path";
6
+ import { agentEnv } from "./acp.js";
7
+ import { newId } from "./util.js";
8
+ /**
9
+ * Vireo's model, served by a coding-agent CLI on this machine (Claude Code,
10
+ * Codex or pi) and whatever account it is signed in to.
11
+ *
12
+ * This is not ACP. ACP drives a coding agent as an agent: its own tools, its
13
+ * own system prompt, its own loop — what the Coding agents plugin does. Here
14
+ * the CLI is only the model: Vireo keeps its agents, handoffs, tools and
15
+ * confirmations, and asks the CLI for one turn at a time with its built-in
16
+ * tools switched off. Each CLI's headless mode does that directly (a system
17
+ * prompt of Vireo's, no tools, streamed JSON with token counts), which ACP
18
+ * has no way to ask for.
19
+ *
20
+ * The bridge speaks Chat Completions on a loopback port, like the scripted
21
+ * test model, so the rest of Vireo talks to it exactly as it would to any
22
+ * OpenAI-compatible endpoint. Tool calls travel as text: the system prompt
23
+ * lists Vireo's tools and how to call them, and the reply's <tool_call>
24
+ * blocks come back as Chat Completions tool calls.
25
+ */
26
+ /** The model name that means "whatever the CLI itself is set to use". */
27
+ export const CLI_DEFAULT_MODEL = "default";
28
+ const num = (v) => (typeof v === "number" && Number.isFinite(v) ? v : 0);
29
+ const str = (v) => (typeof v === "string" ? v : undefined);
30
+ const obj = (v) => (v && typeof v === "object" ? v : {});
31
+ const claude = {
32
+ id: "claude",
33
+ name: "Claude Code",
34
+ bin: "claude",
35
+ install: "npm install -g @anthropic-ai/claude-code",
36
+ signIn: "claude",
37
+ defaults: { main: "sonnet", fast: "haiku" },
38
+ ownsSystemPrompt: true,
39
+ args: ({ model, systemFile }) => [
40
+ "-p",
41
+ "--output-format",
42
+ "stream-json",
43
+ "--verbose",
44
+ "--include-partial-messages",
45
+ "--no-session-persistence",
46
+ // No built-in tools, no MCP servers, no hooks: Vireo's own tools are the only ones.
47
+ "--tools",
48
+ "",
49
+ "--strict-mcp-config",
50
+ "--settings",
51
+ JSON.stringify({ disableAllHooks: true }),
52
+ "--system-prompt-file",
53
+ systemFile,
54
+ ...(model && model !== CLI_DEFAULT_MODEL ? ["--model", model] : []),
55
+ ],
56
+ models: async () => ["opus", "sonnet", "haiku"],
57
+ reader: () => {
58
+ let streamed = false;
59
+ return {
60
+ push(l, out) {
61
+ if (l.type === "stream_event") {
62
+ const ev = obj(l.event);
63
+ const delta = obj(ev.delta);
64
+ if (ev.type === "content_block_delta" && delta.type === "text_delta" && str(delta.text)) {
65
+ streamed = true;
66
+ out.text += delta.text;
67
+ out.onDelta(delta.text);
68
+ }
69
+ }
70
+ else if (l.type === "result") {
71
+ const u = obj(l.usage);
72
+ out.usage = { input: num(u.input_tokens) + num(u.cache_read_input_tokens) + num(u.cache_creation_input_tokens), output: num(u.output_tokens), cached: num(u.cache_read_input_tokens), cacheWrite: num(u.cache_creation_input_tokens) };
73
+ if (l.is_error)
74
+ out.error = str(l.result) || str(l.subtype) || "Claude Code reported an error";
75
+ else if (!streamed && str(l.result)) {
76
+ out.text = l.result;
77
+ out.onDelta(out.text);
78
+ }
79
+ }
80
+ },
81
+ };
82
+ },
83
+ };
84
+ const codex = {
85
+ id: "codex",
86
+ name: "Codex",
87
+ bin: "codex",
88
+ install: "npm install -g @openai/codex",
89
+ signIn: "codex login",
90
+ defaults: { main: CLI_DEFAULT_MODEL, fast: CLI_DEFAULT_MODEL },
91
+ ownsSystemPrompt: false,
92
+ args: ({ model, cwd }) => [
93
+ "exec",
94
+ "--json",
95
+ "--ephemeral",
96
+ "--skip-git-repo-check",
97
+ "--sandbox",
98
+ "read-only",
99
+ "-C",
100
+ cwd,
101
+ // Its own tools off as far as this version allows (unknown switches are ignored), and no
102
+ // `notify` hook: every model turn would otherwise tell the owner "Codex finished".
103
+ "-c",
104
+ "features.shell_tool=false",
105
+ "-c",
106
+ 'web_search="disabled"',
107
+ "-c",
108
+ "features.apps=false",
109
+ "-c",
110
+ "features.plugins=false",
111
+ "-c",
112
+ "features.browser_use=false",
113
+ "-c",
114
+ "features.computer_use=false",
115
+ "-c",
116
+ "notify=[]",
117
+ ...(model && model !== CLI_DEFAULT_MODEL ? ["-m", model] : []),
118
+ "-",
119
+ ],
120
+ models: async () => {
121
+ // Codex keeps the models it last saw for this account; the names are all we need.
122
+ const home = process.env.CODEX_HOME || join(homedir(), ".codex");
123
+ try {
124
+ const raw = JSON.parse(readFileSync(join(home, "models_cache.json"), "utf8"));
125
+ const list = Array.isArray(raw) ? raw : obj(raw).models ?? [];
126
+ return [...new Set(list.map((m) => str(obj(m).slug) ?? str(obj(m).id) ?? str(m)).filter((s) => Boolean(s)))];
127
+ }
128
+ catch {
129
+ return [];
130
+ }
131
+ },
132
+ reader: () => ({
133
+ push(l, out) {
134
+ if (l.type === "item.completed") {
135
+ const item = obj(l.item);
136
+ if (item.type === "agent_message" && str(item.text)) {
137
+ const add = (out.text ? "\n\n" : "") + item.text;
138
+ out.text += add;
139
+ out.onDelta(add);
140
+ }
141
+ }
142
+ else if (l.type === "turn.completed") {
143
+ const u = obj(l.usage);
144
+ out.usage = { input: num(u.input_tokens), output: num(u.output_tokens), cached: num(u.cached_input_tokens), cacheWrite: 0 };
145
+ }
146
+ else if (l.type === "turn.failed") {
147
+ out.error = str(obj(l.error).message) ?? "Codex could not finish the turn";
148
+ }
149
+ else if (l.type === "error" && !out.text) {
150
+ out.error = str(l.message) ?? out.error;
151
+ }
152
+ },
153
+ }),
154
+ };
155
+ const pi = {
156
+ id: "pi",
157
+ name: "pi",
158
+ bin: "pi",
159
+ install: "npm install -g @earendil-works/pi-coding-agent",
160
+ signIn: "pi",
161
+ defaults: { main: CLI_DEFAULT_MODEL, fast: CLI_DEFAULT_MODEL },
162
+ ownsSystemPrompt: true,
163
+ args: ({ model, systemFile }) => [
164
+ "-p",
165
+ "--mode",
166
+ "json",
167
+ "--no-session",
168
+ "--no-tools",
169
+ "--no-skills",
170
+ "--no-prompt-templates",
171
+ "--no-context-files",
172
+ "--no-mcp",
173
+ "--system-prompt",
174
+ systemFile,
175
+ ...(model && model !== CLI_DEFAULT_MODEL ? ["--model", model] : []),
176
+ ],
177
+ models: (path) => new Promise((resolve) => {
178
+ execFile(path, ["--list-models"], { timeout: 15_000, env: cliEnv(path) }, (_err, stdout) => {
179
+ const out = [];
180
+ for (const line of String(stdout ?? "").split("\n").slice(1)) {
181
+ const [provider, model] = line.trim().split(/\s+/);
182
+ if (provider && model)
183
+ out.push(`${provider}/${model}`);
184
+ }
185
+ resolve(out);
186
+ });
187
+ }),
188
+ reader: () => ({
189
+ push(l, out) {
190
+ if (l.type === "message_update") {
191
+ const ev = obj(l.assistantMessageEvent);
192
+ if (ev.type === "text_delta" && str(ev.delta)) {
193
+ out.text += ev.delta;
194
+ out.onDelta(ev.delta);
195
+ }
196
+ }
197
+ else if (l.type === "message_end") {
198
+ const m = obj(l.message);
199
+ if (m.role !== "assistant")
200
+ return;
201
+ const u = obj(m.usage);
202
+ out.usage = { input: num(u.input) + num(u.cacheRead) + num(u.cacheWrite), output: num(u.output), cached: num(u.cacheRead), cacheWrite: num(u.cacheWrite) };
203
+ if (m.stopReason === "error" || m.stopReason === "aborted")
204
+ out.error = str(m.errorMessage) ?? "pi reported an error";
205
+ }
206
+ },
207
+ }),
208
+ };
209
+ export const CLIS = { claude, codex, pi };
210
+ export const CLI_ORDER = ["claude", "codex", "pi"];
211
+ // ---------------------------------------------------------------- detection
212
+ /** Where these CLIs install themselves, beyond PATH (a background service often has a short PATH). */
213
+ function searchDirs() {
214
+ const home = homedir();
215
+ const dirs = (process.env.PATH ?? "").split(delimiter).filter(Boolean);
216
+ dirs.push(join(home, ".local", "bin"), join(home, ".claude", "local"), join(home, ".npm-global", "bin"), join(home, ".bun", "bin"), join(home, ".volta", "bin"), join(home, "bin"), "/opt/homebrew/bin", "/usr/local/bin", dirname(process.execPath));
217
+ try {
218
+ const nvm = join(home, ".nvm", "versions", "node");
219
+ for (const v of readdirSync(nvm))
220
+ dirs.push(join(nvm, v, "bin"));
221
+ }
222
+ catch {
223
+ // No nvm.
224
+ }
225
+ return [...new Set(dirs)];
226
+ }
227
+ function executable(path) {
228
+ try {
229
+ accessSync(path, constants.X_OK);
230
+ return true;
231
+ }
232
+ catch {
233
+ return false;
234
+ }
235
+ }
236
+ export function findCli(id) {
237
+ for (const dir of searchDirs()) {
238
+ const p = join(dir, CLIS[id].bin);
239
+ if (executable(p))
240
+ return p;
241
+ }
242
+ return undefined;
243
+ }
244
+ /** PATH for a CLI: its own directory and Node's, since most of them are Node scripts. */
245
+ function cliEnv(path, extra = {}) {
246
+ const env = agentEnv(process.env, extra);
247
+ env.PATH = [dirname(path), dirname(process.execPath), env.PATH].filter(Boolean).join(delimiter);
248
+ return env;
249
+ }
250
+ function version(path) {
251
+ return new Promise((resolve) => {
252
+ execFile(path, ["--version"], { timeout: 15_000, env: cliEnv(path) }, (err, stdout, stderr) => {
253
+ const out = String(stdout ?? "").trim() || String(stderr ?? "").trim();
254
+ if (err && !out)
255
+ resolve({ error: err.message });
256
+ // "2.1.3 (Claude Code)", "codex-cli 0.46.0", "1.2.0": the number is enough.
257
+ else
258
+ resolve({ version: out.match(/\d+\.\d+[\w.-]*/)?.[0] ?? out.split("\n")[0].slice(0, 40) });
259
+ });
260
+ });
261
+ }
262
+ /** Looks for each CLI (or uses the path the owner gave) and asks it for its version and models. */
263
+ export async function detectClis(paths = {}) {
264
+ return Promise.all(CLI_ORDER.map(async (id) => {
265
+ const spec = CLIS[id];
266
+ const base = { id, name: spec.name, install: spec.install, signIn: spec.signIn, defaults: spec.defaults, models: [] };
267
+ const path = paths[id]?.trim() || findCli(id);
268
+ if (!path)
269
+ return { ...base, found: false };
270
+ if (!executable(path))
271
+ return { ...base, found: false, path, error: `${path} is not an executable file` };
272
+ const v = await version(path);
273
+ if (v.error)
274
+ return { ...base, found: false, path, error: v.error };
275
+ const models = await spec.models(path).catch(() => []);
276
+ return { ...base, found: true, path, version: v.version, models };
277
+ }));
278
+ }
279
+ function partsText(content) {
280
+ if (!content)
281
+ return "";
282
+ if (typeof content === "string")
283
+ return content;
284
+ return content.map((p) => (p.type === "text" ? (p.text ?? "") : p.type === "image_url" ? "[An image was attached here; it can't be shown through this model.]" : "")).join("");
285
+ }
286
+ const TOOL_RULES = [
287
+ "# Tools",
288
+ "",
289
+ "You can't use any tools of your own here (no shell, files, web or editing). You act only through the tools below, by writing a call as its own block:",
290
+ "",
291
+ '<tool_call>{"name": "tool_name", "arguments": {"param": "value"}}</tool_call>',
292
+ "",
293
+ "- The block holds one JSON object with the tool's name and its arguments, matching the tool's parameters.",
294
+ "- Several calls in one turn are fine, one block each. A short sentence to the owner before the calls is fine too.",
295
+ "- After your calls, stop. The results come back in the next message as <tool_result> blocks; never write a result yourself.",
296
+ "- When you need no tool, answer the owner in plain text with no blocks.",
297
+ "",
298
+ "Available tools:",
299
+ ];
300
+ /** Vireo's system prompt plus the tool list and how to call them. */
301
+ export function systemText(req) {
302
+ const system = req.messages.filter((m) => m.role === "system" || m.role === "developer").map((m) => partsText(m.content));
303
+ const tools = req.tool_choice === "none" ? [] : (req.tools ?? []);
304
+ if (tools.length) {
305
+ const list = tools.map((t) => {
306
+ const params = JSON.stringify(t.function.parameters ?? { type: "object", properties: {} });
307
+ return `## ${t.function.name}\n${t.function.description ?? ""}\nParameters (JSON Schema): ${params}`;
308
+ });
309
+ system.push([...TOOL_RULES, "", ...list].join("\n"));
310
+ }
311
+ return system.join("\n\n").trim();
312
+ }
313
+ const esc = (s) => s.replace(/<(\/?)(owner|assistant|tool_call|tool_result|conversation)\b/g, "<\\$1$2");
314
+ /** The conversation as one prompt: just the message when there is one, else a transcript to continue. */
315
+ export function promptText(req) {
316
+ const turns = req.messages.filter((m) => m.role !== "system" && m.role !== "developer");
317
+ if (turns.length === 1 && turns[0].role === "user")
318
+ return partsText(turns[0].content);
319
+ const names = new Map();
320
+ const lines = ["<conversation>"];
321
+ for (const m of turns) {
322
+ if (m.role === "user")
323
+ lines.push(`<owner>\n${esc(partsText(m.content))}\n</owner>`);
324
+ else if (m.role === "assistant") {
325
+ const text = partsText(m.content).trim();
326
+ const calls = (m.tool_calls ?? []).map((c) => {
327
+ names.set(c.id, c.function.name);
328
+ let args = {};
329
+ try {
330
+ args = JSON.parse(c.function.arguments || "{}");
331
+ }
332
+ catch {
333
+ args = c.function.arguments;
334
+ }
335
+ return `<tool_call>${JSON.stringify({ name: c.function.name, arguments: args })}</tool_call>`;
336
+ });
337
+ lines.push(`<assistant>\n${[esc(text), ...calls].filter(Boolean).join("\n")}\n</assistant>`);
338
+ }
339
+ else if (m.role === "tool") {
340
+ const name = names.get(m.tool_call_id ?? "") ?? "";
341
+ lines.push(`<tool_result name="${name}">\n${esc(partsText(m.content))}\n</tool_result>`);
342
+ }
343
+ }
344
+ lines.push("</conversation>", "", "Continue as the assistant: write only your next turn, as plain text and/or <tool_call> blocks.");
345
+ return lines.join("\n");
346
+ }
347
+ // ---------------------------------------------------------------- reply
348
+ const OPEN = "<tool_call>";
349
+ const CLOSE = "</tool_call>";
350
+ /** Passes reply text through as it streams, holding back the <tool_call> blocks. */
351
+ export class CallFilter {
352
+ buf = "";
353
+ inCall = false;
354
+ push(chunk) {
355
+ this.buf += chunk;
356
+ let out = "";
357
+ for (;;) {
358
+ if (this.inCall) {
359
+ const end = this.buf.indexOf(CLOSE);
360
+ if (end === -1)
361
+ return out;
362
+ this.buf = this.buf.slice(end + CLOSE.length);
363
+ this.inCall = false;
364
+ }
365
+ else {
366
+ const start = this.buf.indexOf(OPEN);
367
+ if (start !== -1) {
368
+ out += this.buf.slice(0, start);
369
+ this.buf = this.buf.slice(start + OPEN.length);
370
+ this.inCall = true;
371
+ continue;
372
+ }
373
+ // Keep a tail that could be the start of a block still arriving.
374
+ let keep = 0;
375
+ for (let n = Math.min(OPEN.length - 1, this.buf.length); n > 0; n--) {
376
+ if (OPEN.startsWith(this.buf.slice(-n))) {
377
+ keep = n;
378
+ break;
379
+ }
380
+ }
381
+ out += this.buf.slice(0, this.buf.length - keep);
382
+ this.buf = this.buf.slice(this.buf.length - keep);
383
+ return out;
384
+ }
385
+ }
386
+ }
387
+ end() {
388
+ const rest = this.inCall ? "" : this.buf;
389
+ this.buf = "";
390
+ return rest;
391
+ }
392
+ }
393
+ /** The reply's tool calls, for tools Vireo offered; anything else stays text. */
394
+ export function parseCalls(text, tools) {
395
+ const calls = [];
396
+ const rest = text.replace(/<tool_call>\s*([\s\S]*?)\s*(?:<\/tool_call>|$)/g, (whole, body) => {
397
+ const json = body.replace(/^```(?:json)?\s*|\s*```$/g, "");
398
+ try {
399
+ const v = JSON.parse(json);
400
+ const name = typeof v.name === "string" ? v.name : "";
401
+ if (!tools.includes(name))
402
+ return whole;
403
+ const args = v.arguments ?? v.parameters ?? {};
404
+ calls.push({ id: newId("call"), name, arguments: typeof args === "string" ? args : JSON.stringify(args) });
405
+ return "";
406
+ }
407
+ catch {
408
+ return whole;
409
+ }
410
+ });
411
+ return { text: calls.length ? rest.trim() : text.trim(), calls };
412
+ }
413
+ /** Runs one model turn on a CLI. Stopping (the signal) kills it and anything it started. */
414
+ export function runCli(id, path, req, opts = {}) {
415
+ const spec = CLIS[id];
416
+ const dir = mkdtempSync(join(tmpdir(), "vireo-cli-"));
417
+ const systemFile = join(dir, "system.md");
418
+ const system = systemText(req);
419
+ const prompt = promptText(req);
420
+ writeFileSync(systemFile, system || "You are a helpful assistant.");
421
+ // Codex keeps its own system prompt, so Vireo's goes first in the message instead.
422
+ const input = spec.ownsSystemPrompt || !system ? prompt : `<instructions>\n${system}\n</instructions>\n\n${prompt}`;
423
+ const reader = spec.reader();
424
+ const out = { text: "", usage: { input: 0, output: 0, cached: 0, cacheWrite: 0 }, onDelta: (t) => opts.onDelta?.(t) };
425
+ return new Promise((resolve) => {
426
+ const child = spawn(path, spec.args({ model: req.model, systemFile, cwd: dir }), {
427
+ cwd: dir,
428
+ env: cliEnv(path, { VIREO_AS_MODEL: "1" }),
429
+ stdio: ["pipe", "pipe", "pipe"],
430
+ detached: process.platform !== "win32",
431
+ });
432
+ let pending = "";
433
+ let stderr = "";
434
+ let done = false;
435
+ const kill = () => {
436
+ try {
437
+ if (child.pid && process.platform !== "win32")
438
+ process.kill(-child.pid, "SIGKILL");
439
+ else
440
+ child.kill("SIGKILL");
441
+ }
442
+ catch {
443
+ child.kill("SIGKILL");
444
+ }
445
+ };
446
+ const timer = setTimeout(() => {
447
+ out.error = `${spec.name} took longer than ${Math.round((opts.timeoutMs ?? 600_000) / 1000)}s`;
448
+ kill();
449
+ }, opts.timeoutMs ?? 600_000);
450
+ const onAbort = () => {
451
+ out.error = "Stopped";
452
+ kill();
453
+ };
454
+ opts.signal?.addEventListener("abort", onAbort, { once: true });
455
+ const line = (l) => {
456
+ const t = l.trim();
457
+ if (!t.startsWith("{"))
458
+ return;
459
+ try {
460
+ reader.push(JSON.parse(t), out);
461
+ }
462
+ catch {
463
+ // Not a JSON line.
464
+ }
465
+ };
466
+ const finish = (code, err) => {
467
+ if (done)
468
+ return;
469
+ done = true;
470
+ clearTimeout(timer);
471
+ opts.signal?.removeEventListener("abort", onAbort);
472
+ if (pending)
473
+ line(pending);
474
+ rmSync(dir, { recursive: true, force: true });
475
+ if (err)
476
+ out.error = `Could not start ${spec.name}: ${err.message}`;
477
+ else if (!out.error && code !== 0 && !out.text)
478
+ out.error = `${spec.name} exited with code ${code}${stderr.trim() ? `: ${stderr.trim().split("\n").slice(-3).join(" ")}` : ""}`;
479
+ resolve({ text: out.text, usage: out.usage, error: out.error });
480
+ };
481
+ child.stdout.on("data", (chunk) => {
482
+ const lines = (pending + chunk.toString("utf8")).split("\n");
483
+ pending = lines.pop() ?? "";
484
+ for (const l of lines)
485
+ line(l);
486
+ });
487
+ child.stderr.on("data", (chunk) => {
488
+ stderr = (stderr + chunk.toString("utf8")).slice(-8000);
489
+ });
490
+ child.on("error", (err) => finish(null, err));
491
+ child.on("close", (code) => finish(code));
492
+ child.stdin.on("error", () => undefined);
493
+ child.stdin.end(input);
494
+ });
495
+ }
496
+ // ---------------------------------------------------------------- bridge
497
+ /**
498
+ * Serves the CLIs over Chat Completions at http://127.0.0.1:<port>/<cli>/v1.
499
+ * `resolve` gives the executable for a CLI and its model list.
500
+ */
501
+ export async function startCliBridge(resolve) {
502
+ const server = createServer((req, res) => {
503
+ void handle(req, res, resolve).catch((err) => {
504
+ if (!res.headersSent)
505
+ res.writeHead(500, { "content-type": "application/json" });
506
+ res.end(JSON.stringify({ error: { message: String(err) } }));
507
+ });
508
+ });
509
+ await new Promise((r) => server.listen(0, "127.0.0.1", r));
510
+ server.unref();
511
+ const { port } = server.address();
512
+ return { url: `http://127.0.0.1:${port}`, server };
513
+ }
514
+ function fail(res, status, message) {
515
+ res.writeHead(status, { "content-type": "application/json" });
516
+ res.end(JSON.stringify({ error: { message, type: "cli_error" } }));
517
+ }
518
+ async function handle(req, res, resolve) {
519
+ const m = (req.url ?? "").match(/^\/(claude|codex|pi)\/v1\/(models|chat\/completions)\b/);
520
+ if (!m)
521
+ return fail(res, 404, "Not found");
522
+ const id = m[1];
523
+ const found = resolve(id);
524
+ if (m[2] === "models") {
525
+ res.writeHead(200, { "content-type": "application/json" });
526
+ res.end(JSON.stringify({ object: "list", data: found.models.map((x) => ({ id: x, object: "model", owned_by: id })) }));
527
+ return;
528
+ }
529
+ if (req.method !== "POST")
530
+ return fail(res, 405, "POST only");
531
+ if (!found.path)
532
+ return fail(res, 400, `${CLIS[id].name} is not installed on this machine (${CLIS[id].install}).`);
533
+ let raw = "";
534
+ for await (const chunk of req)
535
+ raw += chunk;
536
+ const body = JSON.parse(raw);
537
+ const toolNames = (body.tools ?? []).map((t) => t.function.name);
538
+ // A closed request (the run was stopped) stops the CLI.
539
+ const abort = new AbortController();
540
+ res.on("close", () => {
541
+ if (!res.writableFinished)
542
+ abort.abort();
543
+ });
544
+ const base = { id: `chatcmpl-${Date.now()}`, created: Math.floor(Date.now() / 1000), model: body.model };
545
+ const filter = new CallFilter();
546
+ const send = (choice, extra = {}) => res.write(`data: ${JSON.stringify({ ...base, object: "chat.completion.chunk", choices: choice ? [{ index: 0, ...choice }] : [], ...extra })}\n\n`);
547
+ if (body.stream) {
548
+ res.writeHead(200, { "content-type": "text/event-stream", "cache-control": "no-cache" });
549
+ send({ delta: { role: "assistant", content: "" } });
550
+ }
551
+ const run = await runCli(id, found.path, body, {
552
+ signal: abort.signal,
553
+ onDelta: body.stream
554
+ ? (t) => {
555
+ const visible = filter.push(t);
556
+ if (visible)
557
+ send({ delta: { content: visible } });
558
+ }
559
+ : undefined,
560
+ });
561
+ if (abort.signal.aborted)
562
+ return;
563
+ const usage = { prompt_tokens: run.usage.input, completion_tokens: run.usage.output, total_tokens: run.usage.input + run.usage.output, prompt_tokens_details: { cached_tokens: run.usage.cached, cache_creation_tokens: run.usage.cacheWrite } };
564
+ if (run.error && !run.text) {
565
+ if (!body.stream)
566
+ return fail(res, 502, run.error);
567
+ // Mid-stream, an error event is what the OpenAI client turns into a thrown error.
568
+ res.end(`data: ${JSON.stringify({ error: { message: run.error, type: "cli_error" } })}\n\n`);
569
+ return;
570
+ }
571
+ const { text, calls } = parseCalls(run.text, toolNames);
572
+ const toolCalls = calls.map((c, index) => ({ index, id: c.id, type: "function", function: { name: c.name, arguments: c.arguments } }));
573
+ const finish = calls.length ? "tool_calls" : "stop";
574
+ if (!body.stream) {
575
+ res.writeHead(200, { "content-type": "application/json" });
576
+ res.end(JSON.stringify({
577
+ ...base,
578
+ object: "chat.completion",
579
+ choices: [{ index: 0, message: { role: "assistant", content: text || null, tool_calls: toolCalls.length ? toolCalls : undefined }, finish_reason: finish }],
580
+ usage,
581
+ }));
582
+ return;
583
+ }
584
+ const tail = filter.end();
585
+ if (tail && !calls.length)
586
+ send({ delta: { content: tail } });
587
+ if (toolCalls.length)
588
+ send({ delta: { tool_calls: toolCalls } });
589
+ send({ delta: {}, finish_reason: finish });
590
+ send(null, { usage });
591
+ res.end("data: [DONE]\n\n");
592
+ }
593
+ //# sourceMappingURL=cli-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-model.js","sourceRoot":"","sources":["../src/cli-model.ts"],"names":[],"mappings":"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"}
package/dist/hook.js CHANGED
@@ -90,6 +90,9 @@ async function readStdin() {
90
90
  return Buffer.concat(chunks).toString("utf8");
91
91
  }
92
92
  export async function runHook(kind, dataDir, argv) {
93
+ // The CLI is serving as Vireo's own model (see cli-model.ts): nothing to tell the owner.
94
+ if (process.env.VIREO_AS_MODEL)
95
+ return;
93
96
  if (kind === "codex") {
94
97
  // Codex passes one JSON argument when a turn completes.
95
98
  let e = {};