@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.
Files changed (57) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +252 -0
  3. package/dist/adapters/claude.d.ts +27 -0
  4. package/dist/adapters/claude.js +253 -0
  5. package/dist/adapters/claude.js.map +1 -0
  6. package/dist/adapters/codex.d.ts +51 -0
  7. package/dist/adapters/codex.js +491 -0
  8. package/dist/adapters/codex.js.map +1 -0
  9. package/dist/adapters/cursor.d.ts +31 -0
  10. package/dist/adapters/cursor.js +231 -0
  11. package/dist/adapters/cursor.js.map +1 -0
  12. package/dist/adapters/mock.d.ts +2 -0
  13. package/dist/adapters/mock.js +101 -0
  14. package/dist/adapters/mock.js.map +1 -0
  15. package/dist/adapters/opencode.d.ts +27 -0
  16. package/dist/adapters/opencode.js +208 -0
  17. package/dist/adapters/opencode.js.map +1 -0
  18. package/dist/adapters/registry.d.ts +33 -0
  19. package/dist/adapters/registry.js +99 -0
  20. package/dist/adapters/registry.js.map +1 -0
  21. package/dist/adapters/types.d.ts +18 -0
  22. package/dist/adapters/types.js +35 -0
  23. package/dist/adapters/types.js.map +1 -0
  24. package/dist/config.d.ts +126 -0
  25. package/dist/config.js +121 -0
  26. package/dist/config.js.map +1 -0
  27. package/dist/index.d.ts +2 -0
  28. package/dist/index.js +253 -0
  29. package/dist/index.js.map +1 -0
  30. package/dist/openrouter/catalog.d.ts +28 -0
  31. package/dist/openrouter/catalog.js +162 -0
  32. package/dist/openrouter/catalog.js.map +1 -0
  33. package/dist/protocol/openai.d.ts +48 -0
  34. package/dist/protocol/openai.js +236 -0
  35. package/dist/protocol/openai.js.map +1 -0
  36. package/dist/protocol/responses.d.ts +57 -0
  37. package/dist/protocol/responses.js +142 -0
  38. package/dist/protocol/responses.js.map +1 -0
  39. package/dist/protocol/tools.d.ts +7 -0
  40. package/dist/protocol/tools.js +143 -0
  41. package/dist/protocol/tools.js.map +1 -0
  42. package/dist/server/app.d.ts +25 -0
  43. package/dist/server/app.js +425 -0
  44. package/dist/server/app.js.map +1 -0
  45. package/dist/server/listen.d.ts +18 -0
  46. package/dist/server/listen.js +30 -0
  47. package/dist/server/listen.js.map +1 -0
  48. package/dist/session.d.ts +9 -0
  49. package/dist/session.js +39 -0
  50. package/dist/session.js.map +1 -0
  51. package/dist/types.d.ts +192 -0
  52. package/dist/types.js +3 -0
  53. package/dist/types.js.map +1 -0
  54. package/dist/util/process.d.ts +38 -0
  55. package/dist/util/process.js +292 -0
  56. package/dist/util/process.js.map +1 -0
  57. package/package.json +65 -0
@@ -0,0 +1,25 @@
1
+ import { Hono } from "hono";
2
+ import type { AdapterRegistry } from "../adapters/registry.js";
3
+ import { type OpenRouterCatalogOptions } from "../openrouter/catalog.js";
4
+ import { sseLine } from "../protocol/openai.js";
5
+ export interface ServerOptions {
6
+ registry: AdapterRegistry;
7
+ /** Preferred adapter when model has no prefix */
8
+ adapter?: string;
9
+ /**
10
+ * Required bearer token. Every request must send `Authorization: Bearer <token>`.
11
+ * No CORS middleware: SDK/script clients don't need it; open CORS would let any
12
+ * same-machine browser tab call the gateway.
13
+ */
14
+ token: string;
15
+ /** Log requests to stderr */
16
+ verbose?: boolean;
17
+ openRouter?: OpenRouterServerOptions;
18
+ }
19
+ export interface OpenRouterServerOptions extends OpenRouterCatalogOptions {
20
+ /** Local equivalent of OpenRouter's account-level default model. */
21
+ defaultModel?: string;
22
+ }
23
+ export declare function createApp(opts: ServerOptions): Hono;
24
+ /** Kept for callers that want raw SSE strings without Hono stream helper. */
25
+ export { sseLine };
@@ -0,0 +1,425 @@
1
+ import { timingSafeEqual } from "node:crypto";
2
+ import { Hono } from "hono";
3
+ import { streamSSE } from "hono/streaming";
4
+ import { collectChatText } from "../adapters/types.js";
5
+ import { transformToolEvents } from "../protocol/tools.js";
6
+ import { SessionStore } from "../session.js";
7
+ import { OpenRouterCatalog } from "../openrouter/catalog.js";
8
+ import { buildResponse, functionOutput, messageOutput, responseId, responsesToChat, } from "../protocol/responses.js";
9
+ import { buildChunk, buildCompletionResponse, completionId, normalizeChatRequest, sseLine, } from "../protocol/openai.js";
10
+ function openRouterError(message, code, errorType, metadata = {}) {
11
+ return {
12
+ error: {
13
+ code,
14
+ message,
15
+ metadata: { error_type: errorType, ...metadata },
16
+ },
17
+ };
18
+ }
19
+ function unauthorized(openRouter = false) {
20
+ const body = openRouter
21
+ ? openRouterError("Unauthorized", 401, "authentication")
22
+ : { error: { message: "Unauthorized", type: "auth_error" } };
23
+ return new Response(JSON.stringify(body), {
24
+ status: 401,
25
+ headers: { "Content-Type": "application/json" },
26
+ });
27
+ }
28
+ function tokensEqual(got, expected) {
29
+ const gotBuf = Buffer.from(got);
30
+ const expectedBuf = Buffer.from(expected);
31
+ if (gotBuf.length !== expectedBuf.length)
32
+ return false;
33
+ return timingSafeEqual(gotBuf, expectedBuf);
34
+ }
35
+ export function createApp(opts) {
36
+ const app = new Hono();
37
+ const { registry, verbose, token } = opts;
38
+ const sessions = new SessionStore();
39
+ const openRouterCatalog = new OpenRouterCatalog(registry, opts.openRouter);
40
+ // No CORS: this gateway is for local SDK/script clients, not browser pages.
41
+ // Wildcard CORS + loopback would let any tab on the machine read agent output.
42
+ app.use("*", async (c, next) => {
43
+ const auth = c.req.header("authorization") || "";
44
+ const m = /^Bearer\s+(.+)$/i.exec(auth);
45
+ const got = m?.[1]?.trim();
46
+ if (!got || !tokensEqual(got, token)) {
47
+ return unauthorized(c.req.path.startsWith("/api/v1/"));
48
+ }
49
+ await next();
50
+ });
51
+ app.get("/", (c) => c.json({
52
+ name: "cli2api",
53
+ version: "0.1.0",
54
+ docs: "Local OpenAI-compatible gateway for coding CLIs",
55
+ endpoints: ["/health", "/v1/models", "/v1/chat/completions", "/v1/responses", "/api/v1/models", "/api/v1/chat/completions", "/api/v1/responses"],
56
+ default_adapter: registry.defaultAdapterId,
57
+ }));
58
+ app.get("/health", async (c) => {
59
+ const reports = await Promise.all(registry.list().map((a) => a.health()));
60
+ const ok = reports.some((r) => r.ok);
61
+ return c.json({ ok, adapters: reports }, ok ? 200 : 503);
62
+ });
63
+ app.get("/v1/models", async (c) => {
64
+ return c.json({
65
+ object: "list",
66
+ data: await registry.listModels(),
67
+ });
68
+ });
69
+ app.get("/api/v1/models", async (c) => {
70
+ return c.json({
71
+ data: await openRouterCatalog.list(new URL(c.req.url).searchParams),
72
+ });
73
+ });
74
+ const chatCompletions = async (c) => {
75
+ const openRouter = c.req.path.startsWith("/api/v1/");
76
+ let body;
77
+ try {
78
+ body = await c.req.json();
79
+ if (openRouter && (!body.model || typeof body.model !== "string") && opts.openRouter?.defaultModel) {
80
+ body = { ...body, model: opts.openRouter.defaultModel };
81
+ }
82
+ }
83
+ catch {
84
+ return c.json(openRouter
85
+ ? openRouterError("Invalid JSON body", 400, "invalid_request")
86
+ : { error: { message: "Invalid JSON body", type: "invalid_request_error" } }, 400);
87
+ }
88
+ let req;
89
+ let requestedModel = "";
90
+ try {
91
+ req = normalizeChatRequest(body);
92
+ requestedModel = req.model;
93
+ if (openRouter && requestedModel.includes("/") && !registry.isExplicitlyRoutable(requestedModel)) {
94
+ return c.json(openRouterError(`Model ${requestedModel} is visible in the OpenRouter catalog but has no local cli2api route.`, 400, "invalid_request", { cli2api_code: "model_not_available" }), 400);
95
+ }
96
+ req = registry.normalizeRequest(req);
97
+ }
98
+ catch (err) {
99
+ const message = err instanceof Error ? err.message : String(err);
100
+ const status = err.status ?? 400;
101
+ return c.json(openRouter
102
+ ? openRouterError(message, status, "invalid_request")
103
+ : { error: { message, type: "invalid_request_error" } }, status);
104
+ }
105
+ let adapter;
106
+ try {
107
+ adapter = registry.resolve(req.model, opts.adapter);
108
+ }
109
+ catch (err) {
110
+ const message = err instanceof Error ? err.message : String(err);
111
+ return c.json(openRouter
112
+ ? openRouterError(message, 400, "invalid_request")
113
+ : { error: { message, type: "invalid_request_error" } }, 400);
114
+ }
115
+ req = {
116
+ ...req,
117
+ nativeSessionId: sessions.get(req.sessionId, adapter.id),
118
+ };
119
+ if (verbose) {
120
+ console.error(`[cli2api] ${adapter.id} model=${req.model} stream=${req.stream} msgs=${req.messages.length}`);
121
+ }
122
+ const id = completionId(openRouter ? "gen" : "chatcmpl");
123
+ const includeReasoning = body.include_reasoning !== false
124
+ && body.reasoning?.exclude !== true
125
+ && body.reasoning?.enabled !== false;
126
+ const ac = new AbortController();
127
+ c.req.raw.signal.addEventListener("abort", () => ac.abort(), { once: true });
128
+ if (req.stream) {
129
+ return streamSSE(c, async (stream) => {
130
+ let toolIndex = 0;
131
+ // Initial role chunk (OpenAI SDK expects this)
132
+ await stream.writeSSE({
133
+ data: JSON.stringify(buildChunk({ id, model: requestedModel, delta: { role: "assistant" }, openRouter })),
134
+ });
135
+ try {
136
+ for await (const ev of transformToolEvents(adapter.chat(req, ac.signal), req)) {
137
+ if (ev.type === "delta") {
138
+ const channel = ev.channel ?? "content";
139
+ if (channel === "reasoning") {
140
+ if (!includeReasoning)
141
+ continue;
142
+ await stream.writeSSE({
143
+ data: JSON.stringify(buildChunk({
144
+ id,
145
+ model: requestedModel,
146
+ delta: { reasoning: ev.text, reasoning_content: ev.text },
147
+ openRouter,
148
+ })),
149
+ });
150
+ }
151
+ else {
152
+ await stream.writeSSE({
153
+ data: JSON.stringify(buildChunk({ id, model: requestedModel, delta: { content: ev.text }, openRouter })),
154
+ });
155
+ }
156
+ }
157
+ else if (ev.type === "tool_call") {
158
+ await stream.writeSSE({
159
+ data: JSON.stringify(buildChunk({
160
+ id,
161
+ model: requestedModel,
162
+ delta: {
163
+ tool_calls: [{
164
+ index: toolIndex++,
165
+ id: ev.call.id,
166
+ type: "function",
167
+ function: ev.call.function,
168
+ }],
169
+ },
170
+ openRouter,
171
+ })),
172
+ });
173
+ }
174
+ else if (ev.type === "session") {
175
+ sessions.set(req.sessionId, adapter.id, ev.id);
176
+ }
177
+ else if (ev.type === "error") {
178
+ await stream.writeSSE({
179
+ data: JSON.stringify({
180
+ ...(openRouter
181
+ ? openRouterError(ev.message, 502, "provider_unavailable", { provider_code: ev.code })
182
+ : { error: { message: ev.message, type: "server_error", code: ev.code } }),
183
+ }),
184
+ });
185
+ await stream.writeSSE({ data: "[DONE]" });
186
+ return;
187
+ }
188
+ else if (ev.type === "done") {
189
+ await stream.writeSSE({
190
+ data: JSON.stringify(buildChunk({ id, model: requestedModel, finishReason: ev.finishReason, openRouter })),
191
+ });
192
+ if (openRouter && ev.usage) {
193
+ await stream.writeSSE({
194
+ data: JSON.stringify(buildChunk({
195
+ id,
196
+ model: requestedModel,
197
+ usage: ev.usage,
198
+ openRouter: true,
199
+ emptyChoices: true,
200
+ })),
201
+ });
202
+ }
203
+ }
204
+ }
205
+ await stream.writeSSE({ data: "[DONE]" });
206
+ }
207
+ catch (err) {
208
+ const message = err instanceof Error ? err.message : String(err);
209
+ await stream.writeSSE({
210
+ data: JSON.stringify(openRouter
211
+ ? openRouterError(message, 500, "server")
212
+ : { error: { message, type: "server_error" } }),
213
+ });
214
+ await stream.writeSSE({ data: "[DONE]" });
215
+ }
216
+ });
217
+ }
218
+ // Non-streaming
219
+ try {
220
+ const result = await collectChatText(transformToolEvents(adapter.chat(req, ac.signal), req));
221
+ if (result.nativeSessionId)
222
+ sessions.set(req.sessionId, adapter.id, result.nativeSessionId);
223
+ if (result.error) {
224
+ return c.json(openRouter
225
+ ? openRouterError(result.error, 502, "provider_unavailable")
226
+ : { error: { message: result.error, type: "server_error" } }, 502);
227
+ }
228
+ const response = buildCompletionResponse({
229
+ id,
230
+ model: requestedModel,
231
+ content: result.text,
232
+ finishReason: result.finishReason,
233
+ usage: result.usage,
234
+ toolCalls: result.toolCalls,
235
+ reasoning: includeReasoning ? result.reasoning : undefined,
236
+ openRouter,
237
+ });
238
+ return c.json(req.sessionId ? { ...response, session_id: req.sessionId } : response);
239
+ }
240
+ catch (err) {
241
+ const message = err instanceof Error ? err.message : String(err);
242
+ return c.json(openRouter
243
+ ? openRouterError(message, 500, "server")
244
+ : { error: { message, type: "server_error" } }, 500);
245
+ }
246
+ };
247
+ app.post("/v1/chat/completions", chatCompletions);
248
+ app.post("/api/v1/chat/completions", chatCompletions);
249
+ const responses = async (c) => {
250
+ const openRouter = c.req.path.startsWith("/api/v1/");
251
+ let body;
252
+ try {
253
+ body = await c.req.json();
254
+ if (openRouter && (!body.model || typeof body.model !== "string") && opts.openRouter?.defaultModel) {
255
+ body = { ...body, model: opts.openRouter.defaultModel };
256
+ }
257
+ }
258
+ catch {
259
+ return c.json({ error: { message: "Invalid JSON body", type: "invalid_request_error" } }, 400);
260
+ }
261
+ let req;
262
+ let requestedModel = "";
263
+ try {
264
+ req = normalizeChatRequest(responsesToChat(body));
265
+ requestedModel = req.model;
266
+ if (openRouter && requestedModel.includes("/") && !registry.isExplicitlyRoutable(requestedModel)) {
267
+ return c.json({ error: {
268
+ message: `Model ${requestedModel} is visible in the OpenRouter catalog but has no local cli2api route.`,
269
+ type: "invalid_request_error",
270
+ code: "model_not_available",
271
+ } }, 400);
272
+ }
273
+ req = registry.normalizeRequest(req);
274
+ }
275
+ catch (err) {
276
+ const message = err instanceof Error ? err.message : String(err);
277
+ return c.json({ error: { message, type: "invalid_request_error" } }, 400);
278
+ }
279
+ let adapter;
280
+ try {
281
+ adapter = registry.resolve(req.model, opts.adapter);
282
+ }
283
+ catch (err) {
284
+ const message = err instanceof Error ? err.message : String(err);
285
+ return c.json({ error: { message, type: "invalid_request_error" } }, 400);
286
+ }
287
+ const id = responseId();
288
+ const inheritedSession = sessions.get(body.previous_response_id, adapter.id);
289
+ if (body.previous_response_id && !inheritedSession) {
290
+ return c.json({
291
+ error: {
292
+ message: `Unknown, expired, or adapter-mismatched previous_response_id: ${body.previous_response_id}`,
293
+ type: "invalid_request_error",
294
+ param: "previous_response_id",
295
+ },
296
+ }, 400);
297
+ }
298
+ req = { ...req, nativeSessionId: inheritedSession };
299
+ if (inheritedSession)
300
+ sessions.set(id, adapter.id, inheritedSession);
301
+ const ac = new AbortController();
302
+ c.req.raw.signal.addEventListener("abort", () => ac.abort(), { once: true });
303
+ if (req.stream) {
304
+ return streamSSE(c, async (stream) => {
305
+ let sequenceNumber = 0;
306
+ const writeEvent = async (type, payload) => {
307
+ await stream.writeSSE({
308
+ event: type,
309
+ data: JSON.stringify({ type, sequence_number: sequenceNumber++, ...payload }),
310
+ });
311
+ };
312
+ const created = buildResponse({ id, model: requestedModel, status: "in_progress" });
313
+ created.output = [];
314
+ await writeEvent("response.created", { response: created });
315
+ await writeEvent("response.in_progress", { response: created });
316
+ let text = "";
317
+ let reasoning = "";
318
+ const calls = [];
319
+ const msgId = `msg_${crypto.randomUUID().replace(/-/g, "").slice(0, 24)}`;
320
+ const reasoningId = `rs_${crypto.randomUUID().replace(/-/g, "").slice(0, 24)}`;
321
+ const outputItems = [];
322
+ let usage;
323
+ let nextOutputIndex = 0;
324
+ let messageOutputIndex = -1;
325
+ let reasoningOutputIndex = -1;
326
+ let messageAdded = false;
327
+ try {
328
+ for await (const ev of transformToolEvents(adapter.chat(req, ac.signal), req)) {
329
+ if (ev.type === "session") {
330
+ sessions.set(id, adapter.id, ev.id);
331
+ }
332
+ else if (ev.type === "delta" && (ev.channel ?? "content") === "content") {
333
+ if (!messageAdded) {
334
+ messageAdded = true;
335
+ messageOutputIndex = nextOutputIndex++;
336
+ await writeEvent("response.output_item.added", { response_id: id, output_index: messageOutputIndex, item: { ...messageOutput(msgId, ""), status: "in_progress", content: [] } });
337
+ await writeEvent("response.content_part.added", { response_id: id, item_id: msgId, output_index: messageOutputIndex, content_index: 0, part: { type: "output_text", text: "", annotations: [] } });
338
+ }
339
+ text += ev.text;
340
+ await writeEvent("response.output_text.delta", { response_id: id, item_id: msgId, output_index: messageOutputIndex, content_index: 0, delta: ev.text });
341
+ }
342
+ else if (ev.type === "delta") {
343
+ if (reasoningOutputIndex < 0) {
344
+ reasoningOutputIndex = nextOutputIndex++;
345
+ await writeEvent("response.output_item.added", { response_id: id, output_index: reasoningOutputIndex, item: { id: reasoningId, type: "reasoning", status: "in_progress", summary: [] } });
346
+ await writeEvent("response.reasoning_summary_part.added", { response_id: id, item_id: reasoningId, output_index: reasoningOutputIndex, summary_index: 0, part: { type: "summary_text", text: "" } });
347
+ }
348
+ reasoning += ev.text;
349
+ await writeEvent("response.reasoning_summary_text.delta", { response_id: id, item_id: reasoningId, output_index: reasoningOutputIndex, summary_index: 0, delta: ev.text });
350
+ }
351
+ else if (ev.type === "tool_call") {
352
+ const outputIndex = nextOutputIndex++;
353
+ calls.push(ev.call);
354
+ const item = functionOutput(ev.call);
355
+ outputItems[outputIndex] = item;
356
+ await writeEvent("response.output_item.added", { response_id: id, output_index: outputIndex, item: { ...item, status: "in_progress", arguments: "" } });
357
+ await writeEvent("response.function_call_arguments.delta", { response_id: id, item_id: item.id, output_index: outputIndex, delta: ev.call.function.arguments });
358
+ await writeEvent("response.function_call_arguments.done", { response_id: id, item_id: item.id, output_index: outputIndex, arguments: ev.call.function.arguments });
359
+ await writeEvent("response.output_item.done", { response_id: id, output_index: outputIndex, item });
360
+ }
361
+ else if (ev.type === "error") {
362
+ const failed = buildResponse({ id, model: requestedModel, status: "failed", error: { message: ev.message, code: ev.code } });
363
+ await writeEvent("response.failed", { response: failed });
364
+ return;
365
+ }
366
+ else if (ev.type === "done") {
367
+ usage = ev.usage;
368
+ }
369
+ }
370
+ if (reasoningOutputIndex >= 0) {
371
+ const item = { id: reasoningId, type: "reasoning", status: "completed", summary: [{ type: "summary_text", text: reasoning }] };
372
+ outputItems[reasoningOutputIndex] = item;
373
+ await writeEvent("response.reasoning_summary_text.done", { response_id: id, item_id: reasoningId, output_index: reasoningOutputIndex, summary_index: 0, text: reasoning });
374
+ await writeEvent("response.reasoning_summary_part.done", { response_id: id, item_id: reasoningId, output_index: reasoningOutputIndex, summary_index: 0, part: { type: "summary_text", text: reasoning } });
375
+ await writeEvent("response.output_item.done", { response_id: id, output_index: reasoningOutputIndex, item });
376
+ }
377
+ if (!calls.length) {
378
+ if (!messageAdded) {
379
+ messageOutputIndex = nextOutputIndex++;
380
+ await writeEvent("response.output_item.added", { response_id: id, output_index: messageOutputIndex, item: { ...messageOutput(msgId, ""), status: "in_progress", content: [] } });
381
+ await writeEvent("response.content_part.added", { response_id: id, item_id: msgId, output_index: messageOutputIndex, content_index: 0, part: { type: "output_text", text: "", annotations: [] } });
382
+ }
383
+ const item = messageOutput(msgId, text);
384
+ outputItems[messageOutputIndex] = item;
385
+ await writeEvent("response.output_text.done", { response_id: id, item_id: msgId, output_index: messageOutputIndex, content_index: 0, text });
386
+ await writeEvent("response.content_part.done", { response_id: id, item_id: msgId, output_index: messageOutputIndex, content_index: 0, part: { type: "output_text", text, annotations: [] } });
387
+ await writeEvent("response.output_item.done", { response_id: id, output_index: messageOutputIndex, item });
388
+ }
389
+ const response = buildResponse({ id, model: requestedModel, text, reasoning, toolCalls: calls, usage });
390
+ response.output = outputItems;
391
+ await writeEvent("response.completed", { response });
392
+ }
393
+ catch (err) {
394
+ const message = err instanceof Error ? err.message : String(err);
395
+ await writeEvent("error", { message });
396
+ }
397
+ });
398
+ }
399
+ try {
400
+ const result = await collectChatText(transformToolEvents(adapter.chat(req, ac.signal), req));
401
+ if (result.nativeSessionId)
402
+ sessions.set(id, adapter.id, result.nativeSessionId);
403
+ if (result.error)
404
+ return c.json({ error: { message: result.error, type: "server_error" } }, 502);
405
+ return c.json(buildResponse({ id, model: requestedModel, text: result.text, reasoning: result.reasoning, toolCalls: result.toolCalls, usage: result.usage }));
406
+ }
407
+ catch (err) {
408
+ const message = err instanceof Error ? err.message : String(err);
409
+ return c.json({ error: { message, type: "server_error" } }, 500);
410
+ }
411
+ };
412
+ app.post("/v1/responses", responses);
413
+ app.post("/api/v1/responses", responses);
414
+ // Friendly 404 for unknown routes
415
+ app.notFound((c) => c.json({
416
+ error: {
417
+ message: `Unknown route ${c.req.method} ${c.req.path}. Try /v1/chat/completions, /api/v1/chat/completions, /v1/responses, or /v1/models.`,
418
+ type: "invalid_request_error",
419
+ },
420
+ }, 404));
421
+ return app;
422
+ }
423
+ /** Kept for callers that want raw SSE strings without Hono stream helper. */
424
+ export { sseLine };
425
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/server/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { AdapterRegistry } from "../adapters/registry.js";
2
+ import { type OpenRouterServerOptions } from "./app.js";
3
+ export interface ListenOptions {
4
+ registry: AdapterRegistry;
5
+ host?: string;
6
+ port?: number;
7
+ adapter?: string;
8
+ /** Required bearer token (generate one at startup if the operator did not set it). */
9
+ token: string;
10
+ verbose?: boolean;
11
+ openRouter?: OpenRouterServerOptions;
12
+ }
13
+ export declare function assertLoopbackHost(host: string): void;
14
+ export declare function listen(opts: ListenOptions): Promise<{
15
+ host: string;
16
+ port: number;
17
+ close: () => void;
18
+ }>;
@@ -0,0 +1,30 @@
1
+ import { serve } from "@hono/node-server";
2
+ import { createApp } from "./app.js";
3
+ export function assertLoopbackHost(host) {
4
+ const allowed = new Set(["127.0.0.1", "localhost", "::1"]);
5
+ if (!allowed.has(host)) {
6
+ throw new Error(`Refusing to bind to "${host}". cli2api is local-only; use 127.0.0.1 (default). ` +
7
+ `If you really need another interface, this is the wrong tool — do not expose CLI auth.`);
8
+ }
9
+ }
10
+ export async function listen(opts) {
11
+ const host = opts.host ?? "127.0.0.1";
12
+ const port = opts.port ?? 3927;
13
+ assertLoopbackHost(host);
14
+ const app = createApp({
15
+ registry: opts.registry,
16
+ adapter: opts.adapter,
17
+ token: opts.token,
18
+ verbose: opts.verbose,
19
+ openRouter: opts.openRouter,
20
+ });
21
+ const server = serve({ fetch: app.fetch, hostname: host, port });
22
+ return {
23
+ host,
24
+ port,
25
+ close: () => {
26
+ server.close();
27
+ },
28
+ };
29
+ }
30
+ //# sourceMappingURL=listen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"listen.js","sourceRoot":"","sources":["../../src/server/listen.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAE1C,OAAO,EAAE,SAAS,EAAgC,MAAM,UAAU,CAAC;AAanE,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,EAAE,KAAK,CAAC,CAAC,CAAC;IAC3D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CACb,wBAAwB,IAAI,qDAAqD;YAC/E,wFAAwF,CAC3F,CAAC;IACJ,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,MAAM,CAAC,IAAmB;IAC9C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC;IAC/B,kBAAkB,CAAC,IAAI,CAAC,CAAC;IAEzB,MAAM,GAAG,GAAG,SAAS,CAAC;QACpB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,UAAU,EAAE,IAAI,CAAC,UAAU;KAC5B,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAEjE,OAAO;QACL,IAAI;QACJ,IAAI;QACJ,KAAK,EAAE,GAAG,EAAE;YACV,MAAM,CAAC,KAAK,EAAE,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,9 @@
1
+ /** In-memory mapping only; native CLI transcripts remain owned by each CLI. */
2
+ export declare class SessionStore {
3
+ private readonly maxEntries;
4
+ private readonly ttlMs;
5
+ private readonly records;
6
+ constructor(maxEntries?: number, ttlMs?: number);
7
+ get(key: string | undefined, adapter: string): string | undefined;
8
+ set(key: string | undefined, adapter: string, nativeId: string): void;
9
+ }
@@ -0,0 +1,39 @@
1
+ /** In-memory mapping only; native CLI transcripts remain owned by each CLI. */
2
+ export class SessionStore {
3
+ maxEntries;
4
+ ttlMs;
5
+ records = new Map();
6
+ constructor(maxEntries = 1_000, ttlMs = 24 * 60 * 60 * 1_000) {
7
+ this.maxEntries = maxEntries;
8
+ this.ttlMs = ttlMs;
9
+ }
10
+ get(key, adapter) {
11
+ if (!key)
12
+ return undefined;
13
+ const record = this.records.get(key);
14
+ if (!record)
15
+ return undefined;
16
+ if (Date.now() - record.touchedAt > this.ttlMs) {
17
+ this.records.delete(key);
18
+ return undefined;
19
+ }
20
+ // A lookup through another adapter must not destroy the original mapping.
21
+ if (record.adapter !== adapter)
22
+ return undefined;
23
+ record.touchedAt = Date.now();
24
+ return record.nativeId;
25
+ }
26
+ set(key, adapter, nativeId) {
27
+ if (!key || !nativeId)
28
+ return;
29
+ this.records.delete(key);
30
+ this.records.set(key, { adapter, nativeId, touchedAt: Date.now() });
31
+ while (this.records.size > this.maxEntries) {
32
+ const oldest = this.records.keys().next().value;
33
+ if (!oldest)
34
+ break;
35
+ this.records.delete(oldest);
36
+ }
37
+ }
38
+ }
39
+ //# sourceMappingURL=session.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session.js","sourceRoot":"","sources":["../src/session.ts"],"names":[],"mappings":"AAMA,+EAA+E;AAC/E,MAAM,OAAO,YAAY;IAIJ;IACA;IAJF,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAE5D,YACmB,aAAa,KAAK,EAClB,QAAQ,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,KAAK;QAD5B,eAAU,GAAV,UAAU,CAAQ;QAClB,UAAK,GAAL,KAAK,CAAuB;IAC5C,CAAC;IAEJ,GAAG,CAAC,GAAuB,EAAE,OAAe;QAC1C,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAC3B,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,CAAC,MAAM;YAAE,OAAO,SAAS,CAAC;QAC9B,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAC/C,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACzB,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,0EAA0E;QAC1E,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO;YAAE,OAAO,SAAS,CAAC;QACjD,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC9B,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,GAAG,CAAC,GAAuB,EAAE,OAAe,EAAE,QAAgB;QAC5D,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC9B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACpE,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;YAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC,KAA2B,CAAC;YACtE,IAAI,CAAC,MAAM;gBAAE,MAAM;YACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC;CACF"}