@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
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
/** Shared types for cli2api. */
|
|
2
|
+
export type Role = "system" | "user" | "assistant" | "tool" | "developer";
|
|
3
|
+
export interface ChatMessage {
|
|
4
|
+
role: Role | string;
|
|
5
|
+
content: string | ContentPart[] | null;
|
|
6
|
+
name?: string;
|
|
7
|
+
tool_call_id?: string;
|
|
8
|
+
tool_calls?: ToolCall[];
|
|
9
|
+
}
|
|
10
|
+
export interface FunctionDefinition {
|
|
11
|
+
name: string;
|
|
12
|
+
description?: string;
|
|
13
|
+
parameters?: Record<string, unknown>;
|
|
14
|
+
strict?: boolean;
|
|
15
|
+
}
|
|
16
|
+
export interface ChatTool {
|
|
17
|
+
type: "function";
|
|
18
|
+
function: FunctionDefinition;
|
|
19
|
+
}
|
|
20
|
+
export interface ToolCall {
|
|
21
|
+
id: string;
|
|
22
|
+
type: "function";
|
|
23
|
+
function: {
|
|
24
|
+
name: string;
|
|
25
|
+
arguments: string;
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export type ContentPart = {
|
|
29
|
+
type: "text";
|
|
30
|
+
text: string;
|
|
31
|
+
} | {
|
|
32
|
+
type: "image_url";
|
|
33
|
+
image_url: {
|
|
34
|
+
url: string;
|
|
35
|
+
detail?: string;
|
|
36
|
+
};
|
|
37
|
+
} | {
|
|
38
|
+
type: string;
|
|
39
|
+
[key: string]: unknown;
|
|
40
|
+
};
|
|
41
|
+
export interface ChatCompletionRequest {
|
|
42
|
+
model: string;
|
|
43
|
+
messages: ChatMessage[];
|
|
44
|
+
stream?: boolean;
|
|
45
|
+
temperature?: number;
|
|
46
|
+
max_tokens?: number;
|
|
47
|
+
max_completion_tokens?: number;
|
|
48
|
+
top_p?: number;
|
|
49
|
+
stop?: string | string[];
|
|
50
|
+
user?: string;
|
|
51
|
+
tools?: ChatTool[];
|
|
52
|
+
tool_choice?: "none" | "auto" | "required" | {
|
|
53
|
+
type: "function";
|
|
54
|
+
function: {
|
|
55
|
+
name: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
58
|
+
include_reasoning?: boolean;
|
|
59
|
+
reasoning?: {
|
|
60
|
+
effort?: string;
|
|
61
|
+
max_tokens?: number;
|
|
62
|
+
exclude?: boolean;
|
|
63
|
+
enabled?: boolean;
|
|
64
|
+
};
|
|
65
|
+
reasoning_effort?: string;
|
|
66
|
+
response_format?: Record<string, unknown>;
|
|
67
|
+
provider?: Record<string, unknown>;
|
|
68
|
+
plugins?: Array<Record<string, unknown>>;
|
|
69
|
+
/** cli2api extension: stable gateway session key for native CLI resume. */
|
|
70
|
+
session_id?: string;
|
|
71
|
+
/** Pass-through / debug */
|
|
72
|
+
[key: string]: unknown;
|
|
73
|
+
}
|
|
74
|
+
export interface ChatCompletionChoice {
|
|
75
|
+
index: number;
|
|
76
|
+
message: {
|
|
77
|
+
role: "assistant";
|
|
78
|
+
content: string | null;
|
|
79
|
+
/** OpenRouter reasoning text when the selected CLI exposes it. */
|
|
80
|
+
reasoning?: string;
|
|
81
|
+
reasoning_content?: string;
|
|
82
|
+
tool_calls?: ToolCall[];
|
|
83
|
+
};
|
|
84
|
+
finish_reason: "stop" | "length" | "tool_calls" | "error" | null;
|
|
85
|
+
native_finish_reason?: string | null;
|
|
86
|
+
}
|
|
87
|
+
export interface ChatCompletionResponse {
|
|
88
|
+
id: string;
|
|
89
|
+
object: "chat.completion";
|
|
90
|
+
created: number;
|
|
91
|
+
model: string;
|
|
92
|
+
choices: ChatCompletionChoice[];
|
|
93
|
+
usage?: {
|
|
94
|
+
prompt_tokens: number;
|
|
95
|
+
completion_tokens: number;
|
|
96
|
+
total_tokens: number;
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
export interface ChatCompletionChunk {
|
|
100
|
+
id: string;
|
|
101
|
+
object: "chat.completion.chunk";
|
|
102
|
+
created: number;
|
|
103
|
+
model: string;
|
|
104
|
+
choices: Array<{
|
|
105
|
+
index: number;
|
|
106
|
+
delta: {
|
|
107
|
+
role?: "assistant";
|
|
108
|
+
content?: string;
|
|
109
|
+
/** OpenRouter-style reasoning stream */
|
|
110
|
+
reasoning?: string;
|
|
111
|
+
/** Alternate field some OpenAI-compatible clients expect */
|
|
112
|
+
reasoning_content?: string;
|
|
113
|
+
tool_calls?: Array<{
|
|
114
|
+
index: number;
|
|
115
|
+
id?: string;
|
|
116
|
+
type?: "function";
|
|
117
|
+
function?: {
|
|
118
|
+
name?: string;
|
|
119
|
+
arguments?: string;
|
|
120
|
+
};
|
|
121
|
+
}>;
|
|
122
|
+
};
|
|
123
|
+
finish_reason: "stop" | "length" | "tool_calls" | "error" | null;
|
|
124
|
+
native_finish_reason?: string | null;
|
|
125
|
+
}>;
|
|
126
|
+
usage?: ChatCompletionResponse["usage"];
|
|
127
|
+
}
|
|
128
|
+
export interface ModelInfo {
|
|
129
|
+
id: string;
|
|
130
|
+
object: "model";
|
|
131
|
+
created: number;
|
|
132
|
+
owned_by: string;
|
|
133
|
+
/** Adapter-specific notes */
|
|
134
|
+
description?: string;
|
|
135
|
+
[key: string]: unknown;
|
|
136
|
+
}
|
|
137
|
+
export interface ModelRoute {
|
|
138
|
+
adapter: "mock" | "codex" | "opencode" | "cursor" | "claude";
|
|
139
|
+
model: string;
|
|
140
|
+
}
|
|
141
|
+
export interface NormalizedChatRequest {
|
|
142
|
+
model: string;
|
|
143
|
+
/** Model id without adapter prefix */
|
|
144
|
+
modelLocal: string;
|
|
145
|
+
messages: ChatMessage[];
|
|
146
|
+
stream: boolean;
|
|
147
|
+
temperature?: number;
|
|
148
|
+
maxTokens?: number;
|
|
149
|
+
raw: ChatCompletionRequest;
|
|
150
|
+
tools: ChatTool[];
|
|
151
|
+
toolChoice?: ChatCompletionRequest["tool_choice"];
|
|
152
|
+
sessionId?: string;
|
|
153
|
+
/** Native CLI session id, populated by the gateway session store. */
|
|
154
|
+
nativeSessionId?: string;
|
|
155
|
+
}
|
|
156
|
+
export type DeltaChannel = "content" | "reasoning";
|
|
157
|
+
export type ChatEvent = {
|
|
158
|
+
type: "delta";
|
|
159
|
+
text: string;
|
|
160
|
+
channel?: DeltaChannel;
|
|
161
|
+
} | {
|
|
162
|
+
type: "tool_call";
|
|
163
|
+
call: ToolCall;
|
|
164
|
+
} | {
|
|
165
|
+
type: "session";
|
|
166
|
+
id: string;
|
|
167
|
+
} | {
|
|
168
|
+
type: "done";
|
|
169
|
+
finishReason: "stop" | "length" | "tool_calls" | "error";
|
|
170
|
+
usage?: ChatCompletionResponse["usage"];
|
|
171
|
+
} | {
|
|
172
|
+
type: "error";
|
|
173
|
+
message: string;
|
|
174
|
+
code?: string;
|
|
175
|
+
};
|
|
176
|
+
export interface HealthStatus {
|
|
177
|
+
ok: boolean;
|
|
178
|
+
adapter: string;
|
|
179
|
+
details: Record<string, unknown>;
|
|
180
|
+
message?: string;
|
|
181
|
+
}
|
|
182
|
+
export interface DoctorReport {
|
|
183
|
+
adapter: string;
|
|
184
|
+
ok: boolean;
|
|
185
|
+
binary?: string;
|
|
186
|
+
version?: string;
|
|
187
|
+
checks: Array<{
|
|
188
|
+
name: string;
|
|
189
|
+
ok: boolean;
|
|
190
|
+
detail?: string;
|
|
191
|
+
}>;
|
|
192
|
+
}
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,gCAAgC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
export interface RunCommandOptions {
|
|
2
|
+
cwd?: string;
|
|
3
|
+
/** Explicit child environment overrides. These do not re-enable full env inheritance. */
|
|
4
|
+
env?: NodeJS.ProcessEnv;
|
|
5
|
+
/** Additional parent environment variable names to copy into the scrubbed child env. */
|
|
6
|
+
inheritEnv?: string[];
|
|
7
|
+
timeoutMs?: number;
|
|
8
|
+
signal?: AbortSignal;
|
|
9
|
+
stdin?: string;
|
|
10
|
+
}
|
|
11
|
+
export interface RunCommandResult {
|
|
12
|
+
code: number | null;
|
|
13
|
+
stdout: string;
|
|
14
|
+
stderr: string;
|
|
15
|
+
timedOut: boolean;
|
|
16
|
+
}
|
|
17
|
+
export type CommandLineEvent = {
|
|
18
|
+
type: "stdout_line";
|
|
19
|
+
line: string;
|
|
20
|
+
} | {
|
|
21
|
+
type: "stderr";
|
|
22
|
+
data: string;
|
|
23
|
+
} | {
|
|
24
|
+
type: "exit";
|
|
25
|
+
code: number | null;
|
|
26
|
+
timedOut: boolean;
|
|
27
|
+
stderr: string;
|
|
28
|
+
};
|
|
29
|
+
/** Build the allowlisted environment used by every spawned command. */
|
|
30
|
+
export declare function buildChildEnv(overrides?: NodeJS.ProcessEnv, inheritEnv?: string[]): NodeJS.ProcessEnv;
|
|
31
|
+
export declare function runCommand(command: string, args: string[], opts?: RunCommandOptions): Promise<RunCommandResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Spawn a process and yield complete stdout lines as they arrive (JSONL-friendly).
|
|
34
|
+
* Stderr is accumulated and also emitted as chunks; final exit includes full stderr.
|
|
35
|
+
*/
|
|
36
|
+
export declare function runCommandLines(command: string, args: string[], opts?: RunCommandOptions): AsyncGenerator<CommandLineEvent>;
|
|
37
|
+
/** Resolve a binary from PATH; returns absolute path or null. No shell involved. */
|
|
38
|
+
export declare function which(binary: string): Promise<string | null>;
|
|
@@ -0,0 +1,292 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
/** Soft cap on queued stdout/stderr bytes before pausing child streams. */
|
|
3
|
+
const MAX_QUEUED_BYTES = 1_048_576;
|
|
4
|
+
/** Keep only the trailing stderr for exit diagnostics. */
|
|
5
|
+
const MAX_STDERR_BYTES = 65_536;
|
|
6
|
+
/**
|
|
7
|
+
* Environment values needed for a normal local CLI process, without forwarding
|
|
8
|
+
* unrelated API keys and application secrets from the gateway process.
|
|
9
|
+
*/
|
|
10
|
+
const BASE_CHILD_ENV_KEYS = [
|
|
11
|
+
"HOME",
|
|
12
|
+
"USER",
|
|
13
|
+
"LOGNAME",
|
|
14
|
+
"PATH",
|
|
15
|
+
"SHELL",
|
|
16
|
+
"TMPDIR",
|
|
17
|
+
"TMP",
|
|
18
|
+
"TEMP",
|
|
19
|
+
"LANG",
|
|
20
|
+
"LANGUAGE",
|
|
21
|
+
"TERM",
|
|
22
|
+
"COLORTERM",
|
|
23
|
+
"NO_COLOR",
|
|
24
|
+
"FORCE_COLOR",
|
|
25
|
+
"XDG_CONFIG_HOME",
|
|
26
|
+
"XDG_CACHE_HOME",
|
|
27
|
+
"XDG_DATA_HOME",
|
|
28
|
+
"XDG_STATE_HOME",
|
|
29
|
+
];
|
|
30
|
+
function configuredChildEnvKeys() {
|
|
31
|
+
return (process.env.CLI2API_CHILD_ENV_ALLOWLIST ?? "")
|
|
32
|
+
.split(",")
|
|
33
|
+
.map((key) => key.trim())
|
|
34
|
+
.filter((key) => /^[A-Za-z_][A-Za-z0-9_]*$/.test(key));
|
|
35
|
+
}
|
|
36
|
+
/** Build the allowlisted environment used by every spawned command. */
|
|
37
|
+
export function buildChildEnv(overrides = {}, inheritEnv = []) {
|
|
38
|
+
const result = {};
|
|
39
|
+
const keys = new Set([
|
|
40
|
+
...BASE_CHILD_ENV_KEYS,
|
|
41
|
+
...Object.keys(process.env).filter((key) => key === "LC_ALL" || key.startsWith("LC_")),
|
|
42
|
+
...inheritEnv,
|
|
43
|
+
...configuredChildEnvKeys(),
|
|
44
|
+
]);
|
|
45
|
+
for (const key of keys) {
|
|
46
|
+
const value = process.env[key];
|
|
47
|
+
if (typeof value === "string")
|
|
48
|
+
result[key] = value;
|
|
49
|
+
}
|
|
50
|
+
for (const [key, value] of Object.entries(overrides)) {
|
|
51
|
+
if (typeof value === "string")
|
|
52
|
+
result[key] = value;
|
|
53
|
+
else
|
|
54
|
+
delete result[key];
|
|
55
|
+
}
|
|
56
|
+
return result;
|
|
57
|
+
}
|
|
58
|
+
function terminateChild(child) {
|
|
59
|
+
if (child.exitCode !== null || child.signalCode !== null)
|
|
60
|
+
return;
|
|
61
|
+
const signal = (name) => {
|
|
62
|
+
if (process.platform !== "win32" && child.pid) {
|
|
63
|
+
try {
|
|
64
|
+
// Children are spawned as their own process group. Agent CLIs often
|
|
65
|
+
// launch helpers which inherit stdio; killing only the parent leaves
|
|
66
|
+
// those pipes open and prevents the iterator from completing.
|
|
67
|
+
process.kill(-child.pid, name);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// The group may already be gone; fall back to the direct child handle.
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
child.kill(name);
|
|
75
|
+
};
|
|
76
|
+
signal("SIGTERM");
|
|
77
|
+
setTimeout(() => {
|
|
78
|
+
if (child.exitCode === null && child.signalCode === null) {
|
|
79
|
+
signal("SIGKILL");
|
|
80
|
+
}
|
|
81
|
+
}, 2_000).unref();
|
|
82
|
+
}
|
|
83
|
+
function appendCapped(buf, chunk, maxBytes) {
|
|
84
|
+
const next = buf + chunk;
|
|
85
|
+
if (next.length <= maxBytes)
|
|
86
|
+
return next;
|
|
87
|
+
return next.slice(next.length - maxBytes);
|
|
88
|
+
}
|
|
89
|
+
function spawnChild(command, args, opts) {
|
|
90
|
+
const { cwd, env, inheritEnv, timeoutMs = 120_000, signal, stdin } = opts;
|
|
91
|
+
if (signal?.aborted) {
|
|
92
|
+
throw Object.assign(new Error("Aborted"), { code: "ABORT_ERR" });
|
|
93
|
+
}
|
|
94
|
+
const child = spawn(command, args, {
|
|
95
|
+
cwd,
|
|
96
|
+
env: buildChildEnv(env, inheritEnv),
|
|
97
|
+
detached: process.platform !== "win32",
|
|
98
|
+
stdio: ["pipe", "pipe", "pipe"],
|
|
99
|
+
});
|
|
100
|
+
let timedOut = false;
|
|
101
|
+
const timer = timeoutMs > 0
|
|
102
|
+
? setTimeout(() => {
|
|
103
|
+
timedOut = true;
|
|
104
|
+
terminateChild(child);
|
|
105
|
+
}, timeoutMs)
|
|
106
|
+
: undefined;
|
|
107
|
+
const onAbort = () => {
|
|
108
|
+
terminateChild(child);
|
|
109
|
+
};
|
|
110
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
111
|
+
child.stdout.setEncoding("utf8");
|
|
112
|
+
child.stderr.setEncoding("utf8");
|
|
113
|
+
if (stdin != null) {
|
|
114
|
+
child.stdin.write(stdin);
|
|
115
|
+
}
|
|
116
|
+
child.stdin.end();
|
|
117
|
+
return {
|
|
118
|
+
child,
|
|
119
|
+
timedOut: () => timedOut,
|
|
120
|
+
dispose: () => {
|
|
121
|
+
if (timer)
|
|
122
|
+
clearTimeout(timer);
|
|
123
|
+
signal?.removeEventListener("abort", onAbort);
|
|
124
|
+
},
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
export function runCommand(command, args, opts = {}) {
|
|
128
|
+
return new Promise((resolve, reject) => {
|
|
129
|
+
let spawned;
|
|
130
|
+
try {
|
|
131
|
+
spawned = spawnChild(command, args, opts);
|
|
132
|
+
}
|
|
133
|
+
catch (err) {
|
|
134
|
+
reject(err);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
const { child, timedOut, dispose } = spawned;
|
|
138
|
+
let stdout = "";
|
|
139
|
+
let stderr = "";
|
|
140
|
+
let settled = false;
|
|
141
|
+
child.stdout.on("data", (chunk) => {
|
|
142
|
+
stdout += chunk;
|
|
143
|
+
});
|
|
144
|
+
child.stderr.on("data", (chunk) => {
|
|
145
|
+
stderr += chunk;
|
|
146
|
+
});
|
|
147
|
+
child.on("error", (err) => {
|
|
148
|
+
if (settled)
|
|
149
|
+
return;
|
|
150
|
+
settled = true;
|
|
151
|
+
dispose();
|
|
152
|
+
reject(err);
|
|
153
|
+
});
|
|
154
|
+
child.on("close", (code) => {
|
|
155
|
+
if (settled)
|
|
156
|
+
return;
|
|
157
|
+
settled = true;
|
|
158
|
+
dispose();
|
|
159
|
+
resolve({ code, stdout, stderr, timedOut: timedOut() });
|
|
160
|
+
});
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
/**
|
|
164
|
+
* Spawn a process and yield complete stdout lines as they arrive (JSONL-friendly).
|
|
165
|
+
* Stderr is accumulated and also emitted as chunks; final exit includes full stderr.
|
|
166
|
+
*/
|
|
167
|
+
export async function* runCommandLines(command, args, opts = {}) {
|
|
168
|
+
let spawned;
|
|
169
|
+
try {
|
|
170
|
+
spawned = spawnChild(command, args, opts);
|
|
171
|
+
}
|
|
172
|
+
catch (err) {
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
const { child, timedOut, dispose } = spawned;
|
|
176
|
+
const queue = [];
|
|
177
|
+
let queuedBytes = 0;
|
|
178
|
+
let streamsPaused = false;
|
|
179
|
+
let wait = null;
|
|
180
|
+
let done = false;
|
|
181
|
+
let error = null;
|
|
182
|
+
let stderr = "";
|
|
183
|
+
let stdoutBuf = "";
|
|
184
|
+
const eventBytes = (ev) => {
|
|
185
|
+
if (ev.type === "stdout_line")
|
|
186
|
+
return ev.line.length;
|
|
187
|
+
if (ev.type === "stderr")
|
|
188
|
+
return ev.data.length;
|
|
189
|
+
return ev.stderr.length;
|
|
190
|
+
};
|
|
191
|
+
const maybePause = () => {
|
|
192
|
+
if (streamsPaused || queuedBytes < MAX_QUEUED_BYTES)
|
|
193
|
+
return;
|
|
194
|
+
streamsPaused = true;
|
|
195
|
+
child.stdout.pause();
|
|
196
|
+
child.stderr.pause();
|
|
197
|
+
};
|
|
198
|
+
const maybeResume = () => {
|
|
199
|
+
if (!streamsPaused || queuedBytes >= MAX_QUEUED_BYTES / 2)
|
|
200
|
+
return;
|
|
201
|
+
streamsPaused = false;
|
|
202
|
+
child.stdout.resume();
|
|
203
|
+
child.stderr.resume();
|
|
204
|
+
};
|
|
205
|
+
const push = (ev) => {
|
|
206
|
+
queue.push(ev);
|
|
207
|
+
queuedBytes += eventBytes(ev);
|
|
208
|
+
maybePause();
|
|
209
|
+
if (wait) {
|
|
210
|
+
const w = wait;
|
|
211
|
+
wait = null;
|
|
212
|
+
w();
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
child.stdout.on("data", (chunk) => {
|
|
216
|
+
stdoutBuf += chunk;
|
|
217
|
+
let idx;
|
|
218
|
+
while ((idx = stdoutBuf.indexOf("\n")) >= 0) {
|
|
219
|
+
let line = stdoutBuf.slice(0, idx);
|
|
220
|
+
stdoutBuf = stdoutBuf.slice(idx + 1);
|
|
221
|
+
if (line.endsWith("\r"))
|
|
222
|
+
line = line.slice(0, -1);
|
|
223
|
+
push({ type: "stdout_line", line });
|
|
224
|
+
}
|
|
225
|
+
});
|
|
226
|
+
child.stderr.on("data", (chunk) => {
|
|
227
|
+
stderr = appendCapped(stderr, chunk, MAX_STDERR_BYTES);
|
|
228
|
+
push({ type: "stderr", data: chunk });
|
|
229
|
+
});
|
|
230
|
+
child.on("error", (err) => {
|
|
231
|
+
error = err;
|
|
232
|
+
done = true;
|
|
233
|
+
if (wait) {
|
|
234
|
+
const w = wait;
|
|
235
|
+
wait = null;
|
|
236
|
+
w();
|
|
237
|
+
}
|
|
238
|
+
});
|
|
239
|
+
child.on("close", (code) => {
|
|
240
|
+
if (stdoutBuf.length) {
|
|
241
|
+
let line = stdoutBuf;
|
|
242
|
+
stdoutBuf = "";
|
|
243
|
+
if (line.endsWith("\r"))
|
|
244
|
+
line = line.slice(0, -1);
|
|
245
|
+
push({ type: "stdout_line", line });
|
|
246
|
+
}
|
|
247
|
+
push({ type: "exit", code, timedOut: timedOut(), stderr });
|
|
248
|
+
done = true;
|
|
249
|
+
dispose();
|
|
250
|
+
if (wait) {
|
|
251
|
+
const w = wait;
|
|
252
|
+
wait = null;
|
|
253
|
+
w();
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
try {
|
|
257
|
+
while (!done || queue.length > 0) {
|
|
258
|
+
if (queue.length === 0) {
|
|
259
|
+
await new Promise((resolve) => {
|
|
260
|
+
wait = resolve;
|
|
261
|
+
});
|
|
262
|
+
continue;
|
|
263
|
+
}
|
|
264
|
+
const ev = queue.shift();
|
|
265
|
+
queuedBytes = Math.max(0, queuedBytes - eventBytes(ev));
|
|
266
|
+
maybeResume();
|
|
267
|
+
yield ev;
|
|
268
|
+
if (ev.type === "exit")
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
if (error)
|
|
272
|
+
throw error;
|
|
273
|
+
}
|
|
274
|
+
finally {
|
|
275
|
+
dispose();
|
|
276
|
+
// Consumer abandoned the iterator (e.g. client disconnect) — stop the CLI.
|
|
277
|
+
terminateChild(child);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/** Resolve a binary from PATH; returns absolute path or null. No shell involved. */
|
|
281
|
+
export async function which(binary) {
|
|
282
|
+
try {
|
|
283
|
+
const result = await runCommand("which", [binary], { timeoutMs: 5_000 });
|
|
284
|
+
const path = result.stdout.trim().split(/\r?\n/)[0]?.trim() ?? "";
|
|
285
|
+
return result.code === 0 && path ? path : null;
|
|
286
|
+
}
|
|
287
|
+
catch {
|
|
288
|
+
// Missing `which` binary (or spawn failure) → treat as not found.
|
|
289
|
+
return null;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
//# sourceMappingURL=process.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"process.js","sourceRoot":"","sources":["../../src/util/process.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@cochon123/cli2api",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local OpenAI- and OpenRouter-compatible gateway for coding CLIs",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"files": [
|
|
7
|
+
"dist",
|
|
8
|
+
"README.md",
|
|
9
|
+
"LICENSE"
|
|
10
|
+
],
|
|
11
|
+
"bin": {
|
|
12
|
+
"cli2api": "dist/index.js"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/cochon123/cli2api.git"
|
|
17
|
+
},
|
|
18
|
+
"homepage": "https://github.com/cochon123/cli2api#readme",
|
|
19
|
+
"bugs": {
|
|
20
|
+
"url": "https://github.com/cochon123/cli2api/issues"
|
|
21
|
+
},
|
|
22
|
+
"publishConfig": {
|
|
23
|
+
"access": "public"
|
|
24
|
+
},
|
|
25
|
+
"scripts": {
|
|
26
|
+
"dev": "tsx src/index.ts",
|
|
27
|
+
"build": "tsc && node scripts/postbuild.mjs",
|
|
28
|
+
"start": "node dist/index.js",
|
|
29
|
+
"serve": "tsx src/index.ts serve",
|
|
30
|
+
"doctor": "tsx src/index.ts doctor",
|
|
31
|
+
"models": "tsx src/index.ts models",
|
|
32
|
+
"completion": "tsx src/index.ts completion",
|
|
33
|
+
"adapters": "tsx src/index.ts adapters",
|
|
34
|
+
"test:smoke": "tsx scripts/smoke.ts",
|
|
35
|
+
"test:adapters": "tsx scripts/adapter-contract.ts",
|
|
36
|
+
"typecheck": "tsc --noEmit",
|
|
37
|
+
"verify": "npm run typecheck && npm run test:adapters && npm run test:smoke",
|
|
38
|
+
"prepare": "npm run build",
|
|
39
|
+
"prepublishOnly": "npm run verify"
|
|
40
|
+
},
|
|
41
|
+
"engines": {
|
|
42
|
+
"node": ">=20"
|
|
43
|
+
},
|
|
44
|
+
"keywords": [
|
|
45
|
+
"openai",
|
|
46
|
+
"openrouter",
|
|
47
|
+
"cli",
|
|
48
|
+
"codex",
|
|
49
|
+
"local",
|
|
50
|
+
"llm-gateway"
|
|
51
|
+
],
|
|
52
|
+
"license": "MIT",
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"@hono/node-server": "^1.14.4",
|
|
55
|
+
"ajv": "^8.20.0",
|
|
56
|
+
"commander": "^14.0.0",
|
|
57
|
+
"hono": "^4.8.3",
|
|
58
|
+
"zod": "^3.25.67"
|
|
59
|
+
},
|
|
60
|
+
"devDependencies": {
|
|
61
|
+
"@types/node": "^24.0.10",
|
|
62
|
+
"tsx": "^4.20.3",
|
|
63
|
+
"typescript": "^5.8.3"
|
|
64
|
+
}
|
|
65
|
+
}
|