@llm4ts/runner 2.2.1 → 2.3.1

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,377 @@
1
+ import { createServer } from "node:http";
2
+ import * as Deferred from "effect/Deferred";
3
+ import * as Effect from "effect/Effect";
4
+ import * as Option from "effect/Option";
5
+ import * as Ref from "effect/Ref";
6
+ import { InvalidRequestError, ProviderError } from "@llm4ts/core/Errors";
7
+ import { geminiAcpArgv, openGeminiAcpSession } from "@llm4ts/core/providers/GeminiAcpSession";
8
+ import { isJsonRecord, jsonArray, jsonBooleanField, jsonField, jsonStringField } from "@llm4ts/core/providers/CliSupport";
9
+ import { FlowLlmError } from "@llm4ts/flow/FlowError";
10
+ import { handleMcpRequest } from "@llm4ts/flow/McpServer";
11
+ export const makeBridgeState = Effect.fn("@llm4ts/runner/NodeGeminiAcpBridge.makeBridgeState")(function* (session, cwd, mcpServerUrl, forkBackground) {
12
+ return {
13
+ session,
14
+ cwd,
15
+ mcpServerUrl,
16
+ sessionId: yield* Ref.make(Option.none()),
17
+ tools: yield* Ref.make([]),
18
+ pendingToolCall: yield* Ref.make(Option.none()),
19
+ turnOutcome: yield* Ref.make(Option.none()),
20
+ nextToolCallId: yield* Ref.make(0),
21
+ forkBackground
22
+ };
23
+ });
24
+ const resolveTurnOutcomeSuccess = (state, outcome) => Effect.gen(function* () {
25
+ const current = yield* Ref.get(state.turnOutcome);
26
+ if (Option.isSome(current)) {
27
+ yield* Deferred.succeed(current.value, outcome);
28
+ }
29
+ });
30
+ const resolveTurnOutcomeFailure = (state, error) => Effect.gen(function* () {
31
+ const current = yield* Ref.get(state.turnOutcome);
32
+ if (Option.isSome(current)) {
33
+ yield* Deferred.fail(current.value, error);
34
+ }
35
+ });
36
+ export const anthropicToolToMcpTool = (state, def) => ({
37
+ name: def.name,
38
+ description: def.description,
39
+ inputSchema: def.inputSchema,
40
+ call: (arguments_) => Effect.gen(function* () {
41
+ const id = yield* Ref.updateAndGet(state.nextToolCallId, (current) => current + 1);
42
+ const toolCallId = `toolu_${id}`;
43
+ const resultDeferred = yield* Deferred.make();
44
+ yield* Ref.set(state.pendingToolCall, Option.some({ id: toolCallId, name: def.name, resultDeferred }));
45
+ yield* resolveTurnOutcomeSuccess(state, {
46
+ _tag: "ToolUse",
47
+ id: toolCallId,
48
+ name: def.name,
49
+ input: arguments_
50
+ });
51
+ const outcome = yield* Deferred.await(resultDeferred);
52
+ if (outcome.isError) {
53
+ return yield* ProviderError.make({ message: outcome.content });
54
+ }
55
+ return outcome.content;
56
+ }).pipe(Effect.mapError((error) => FlowLlmError.from(error)))
57
+ });
58
+ const parseToolDefs = (body) => jsonArray(jsonField(body, "tools")).flatMap((tool) => {
59
+ const name = jsonStringField(tool, "name");
60
+ if (name === undefined) {
61
+ return [];
62
+ }
63
+ const inputSchema = jsonField(tool, "input_schema");
64
+ return [
65
+ {
66
+ name,
67
+ description: jsonStringField(tool, "description") ?? "",
68
+ inputSchema: inputSchema !== undefined && isJsonRecord(inputSchema) ? inputSchema : {}
69
+ }
70
+ ];
71
+ });
72
+ const lastMessage = (body) => {
73
+ const messages = jsonArray(jsonField(body, "messages"));
74
+ return messages[messages.length - 1];
75
+ };
76
+ const contentBlocksText = (value) => typeof value === "string"
77
+ ? value
78
+ : jsonArray(value)
79
+ .map((block) => jsonStringField(block, "text") ?? "")
80
+ .join("\n");
81
+ const toolResultInLastMessage = (body) => {
82
+ const message = lastMessage(body);
83
+ if (jsonStringField(message, "role") !== "user") {
84
+ return undefined;
85
+ }
86
+ for (const block of jsonArray(jsonField(message, "content"))) {
87
+ if (jsonStringField(block, "type") !== "tool_result") {
88
+ continue;
89
+ }
90
+ const id = jsonStringField(block, "tool_use_id");
91
+ if (id === undefined) {
92
+ continue;
93
+ }
94
+ return {
95
+ id,
96
+ content: contentBlocksText(jsonField(block, "content")),
97
+ isError: jsonBooleanField(block, "is_error") === true
98
+ };
99
+ }
100
+ return undefined;
101
+ };
102
+ const userTextInLastMessage = (body) => contentBlocksText(jsonField(lastMessage(body), "content"));
103
+ /**
104
+ * The route to match, without the query string. `request.url` carries it,
105
+ * and pi's bundled Anthropic SDK posts to `/v1/messages?beta=true` for
106
+ * tool-enabled requests — routing on the raw value 404s exactly the request
107
+ * this bridge exists to serve.
108
+ */
109
+ export const requestPath = (url) => {
110
+ const path = (url ?? "/").split(/[?#]/)[0];
111
+ return path === undefined || path.length === 0 ? "/" : path;
112
+ };
113
+ const anthropicResponse = (model, outcome) => ({
114
+ id: `msg_${Date.now()}`,
115
+ type: "message",
116
+ role: "assistant",
117
+ model,
118
+ content: outcome._tag === "Text"
119
+ ? [{ type: "text", text: outcome.text }]
120
+ : [{ type: "tool_use", id: outcome.id, name: outcome.name, input: outcome.input }],
121
+ stop_reason: outcome._tag === "Text" ? "end_turn" : "tool_use",
122
+ // ACP does not currently surface per-request token counts to this bridge;
123
+ // zero, not omitted, since the Anthropic Messages response shape requires
124
+ // the field. Real usage accounting for this path is future work.
125
+ usage: { input_tokens: 0, output_tokens: 0 }
126
+ });
127
+ /**
128
+ * Drive one turn to its outcome. Split from the response rendering because a
129
+ * streaming request must write `message_start` before this resolves — pi
130
+ * hardcodes `stream: true`, and gemini can take a while to answer.
131
+ */
132
+ export const resolveTurn = Effect.fn("@llm4ts/runner/NodeGeminiAcpBridge.resolveTurn")(function* (state, body) {
133
+ const continuation = toolResultInLastMessage(body);
134
+ let pendingToResolve;
135
+ if (continuation !== undefined) {
136
+ const pending = yield* Ref.get(state.pendingToolCall);
137
+ if (Option.isNone(pending) || pending.value.id !== continuation.id) {
138
+ return yield* InvalidRequestError.make({
139
+ message: `no pending tool call matches tool_result id ${continuation.id}`
140
+ });
141
+ }
142
+ yield* Ref.set(state.pendingToolCall, Option.none());
143
+ pendingToResolve = pending.value;
144
+ }
145
+ // Registered before anything that could resolve it (a resumed tool call
146
+ // unblocking gemini's still-in-flight prompt, or — the first turn — the
147
+ // forked prompt() call itself) can run: both can complete fast enough to
148
+ // race an outcome slot only opened afterward, silently dropping it
149
+ // forever with nothing left awaiting it.
150
+ const outcomeDeferred = yield* Deferred.make();
151
+ yield* Ref.set(state.turnOutcome, Option.some(outcomeDeferred));
152
+ if (pendingToResolve !== undefined) {
153
+ yield* Deferred.succeed(pendingToResolve.resultDeferred, {
154
+ content: continuation?.content ?? "",
155
+ isError: continuation?.isError ?? false
156
+ });
157
+ }
158
+ else {
159
+ yield* Ref.set(state.tools, parseToolDefs(body));
160
+ const existing = yield* Ref.get(state.sessionId);
161
+ const sessionId = existing._tag === "Some"
162
+ ? existing.value
163
+ : yield* Effect.tap(state.session.newSession(state.cwd, state.mcpServerUrl), (id) => Ref.set(state.sessionId, Option.some(id)));
164
+ const text = userTextInLastMessage(body);
165
+ yield* state.forkBackground(state.session.prompt(sessionId, text).pipe(Effect.matchEffect({
166
+ onSuccess: (result) => resolveTurnOutcomeSuccess(state, { _tag: "Text", text: result.text }),
167
+ onFailure: (error) => resolveTurnOutcomeFailure(state, error)
168
+ })));
169
+ }
170
+ const outcome = yield* Deferred.await(outcomeDeferred);
171
+ yield* Ref.set(state.turnOutcome, Option.none());
172
+ return outcome;
173
+ });
174
+ export const requestModel = (body) => jsonStringField(body, "model") ?? "gemini";
175
+ const emptyUsage = { input_tokens: 0, output_tokens: 0 };
176
+ /** Sent before the turn resolves, so the client sees a live response. */
177
+ export const turnStartEvents = (id, model) => [
178
+ {
179
+ event: "message_start",
180
+ data: {
181
+ type: "message_start",
182
+ message: {
183
+ id,
184
+ type: "message",
185
+ role: "assistant",
186
+ model,
187
+ content: [],
188
+ stop_reason: null,
189
+ stop_sequence: null,
190
+ usage: emptyUsage
191
+ }
192
+ }
193
+ }
194
+ ];
195
+ /**
196
+ * The blocks and stop events for a resolved turn. A `tool_use` block carries
197
+ * an empty `input` and supplies the real arguments through `input_json_delta`,
198
+ * which is the shape the Anthropic client expects to accumulate.
199
+ */
200
+ export const turnOutcomeEvents = (outcome) => {
201
+ const blocks = outcome._tag === "Text"
202
+ ? [
203
+ {
204
+ event: "content_block_start",
205
+ data: {
206
+ type: "content_block_start",
207
+ index: 0,
208
+ content_block: { type: "text", text: "" }
209
+ }
210
+ },
211
+ {
212
+ event: "content_block_delta",
213
+ data: {
214
+ type: "content_block_delta",
215
+ index: 0,
216
+ delta: { type: "text_delta", text: outcome.text }
217
+ }
218
+ }
219
+ ]
220
+ : [
221
+ {
222
+ event: "content_block_start",
223
+ data: {
224
+ type: "content_block_start",
225
+ index: 0,
226
+ content_block: { type: "tool_use", id: outcome.id, name: outcome.name, input: {} }
227
+ }
228
+ },
229
+ {
230
+ event: "content_block_delta",
231
+ data: {
232
+ type: "content_block_delta",
233
+ index: 0,
234
+ delta: { type: "input_json_delta", partial_json: JSON.stringify(outcome.input) }
235
+ }
236
+ }
237
+ ];
238
+ return [
239
+ ...blocks,
240
+ { event: "content_block_stop", data: { type: "content_block_stop", index: 0 } },
241
+ {
242
+ event: "message_delta",
243
+ data: {
244
+ type: "message_delta",
245
+ delta: {
246
+ stop_reason: outcome._tag === "Text" ? "end_turn" : "tool_use",
247
+ stop_sequence: null
248
+ },
249
+ usage: { output_tokens: 0 }
250
+ }
251
+ },
252
+ { event: "message_stop", data: { type: "message_stop" } }
253
+ ];
254
+ };
255
+ /** A failure after `message_start` can only be reported in-band. */
256
+ export const turnErrorEvent = (message) => ({
257
+ event: "error",
258
+ data: { type: "error", error: { type: "api_error", message } }
259
+ });
260
+ export const messageId = () => `msg_${Date.now()}`;
261
+ export const handleMessagesRequest = Effect.fn("@llm4ts/runner/NodeGeminiAcpBridge.handleMessagesRequest")(function* (state, body) {
262
+ const outcome = yield* resolveTurn(state, body);
263
+ return anthropicResponse(requestModel(body), outcome);
264
+ });
265
+ const readBody = (request) => Effect.callback((resume) => {
266
+ const chunks = [];
267
+ request.on("data", (chunk) => chunks.push(chunk));
268
+ request.on("end", () => resume(Effect.succeed(Buffer.concat(chunks).toString("utf8"))));
269
+ request.on("error", (error) => resume(ProviderError.make({ message: "failed to read request body", cause: error })));
270
+ });
271
+ const parseJson = (raw) => JSON.parse(raw);
272
+ const parseJsonBody = (raw) => Effect.try({
273
+ try: () => parseJson(raw),
274
+ catch: () => InvalidRequestError.make({ message: "request body is not valid JSON" })
275
+ });
276
+ const writeStreamEvent = (response, event) => {
277
+ response.write(`event: ${event.event}\ndata: ${JSON.stringify(event.data)}\n\n`);
278
+ };
279
+ /**
280
+ * Stream one turn. The head goes out before the turn resolves so the client
281
+ * has a live response while gemini works; after that point a failure can only
282
+ * be reported as an in-band `error` event, never as a status code.
283
+ */
284
+ const respondStreaming = (response, state, body) => Effect.sync(() => {
285
+ response.writeHead(200, {
286
+ "Content-Type": "text/event-stream",
287
+ "Cache-Control": "no-cache",
288
+ Connection: "keep-alive"
289
+ });
290
+ for (const event of turnStartEvents(messageId(), requestModel(body))) {
291
+ writeStreamEvent(response, event);
292
+ }
293
+ }).pipe(Effect.andThen(resolveTurn(state, body)), Effect.matchEffect({
294
+ onSuccess: (outcome) => Effect.sync(() => {
295
+ for (const event of turnOutcomeEvents(outcome)) {
296
+ writeStreamEvent(response, event);
297
+ }
298
+ response.end();
299
+ }),
300
+ onFailure: (error) => Effect.sync(() => {
301
+ writeStreamEvent(response, turnErrorEvent(error.message));
302
+ response.end();
303
+ })
304
+ }));
305
+ const writeJson = (response, status, body) => {
306
+ const text = JSON.stringify(body);
307
+ response.writeHead(status, { "Content-Type": "application/json" });
308
+ response.end(text);
309
+ };
310
+ const errorStatus = (error) => error._tag === "InvalidRequestError" ? 400 : error._tag === "AuthenticationError" ? 401 : 502;
311
+ const bindError = (port, cause) => ProviderError.make({
312
+ message: `Gemini ACP bridge could not bind 127.0.0.1:${port} — another llm4ts run may already ` +
313
+ "own it (concurrent runs against one bridge are unsupported; see ADR 0016)",
314
+ cause
315
+ });
316
+ const acquireServer = (port, listener) => Effect.acquireRelease(Effect.callback((resume) => {
317
+ const server = createServer(listener);
318
+ const onError = (cause) => resume(Effect.fail(bindError(port, cause)));
319
+ server.once("error", onError);
320
+ server.listen(port, "127.0.0.1", () => {
321
+ server.off("error", onError);
322
+ resume(Effect.succeed(server));
323
+ });
324
+ }), (server) => Effect.callback((resume) => {
325
+ if (!server.listening) {
326
+ resume(Effect.void);
327
+ return;
328
+ }
329
+ server.close(() => resume(Effect.void));
330
+ }));
331
+ export const runGeminiAcpBridge = Effect.fn("@llm4ts/runner/NodeGeminiAcpBridge.run")(function* (config) {
332
+ const mcpServerUrl = `http://127.0.0.1:${config.port}/mcp`;
333
+ const session = yield* openGeminiAcpSession(config.executor, geminiAcpArgv(config.model), config.cwd, config.envVars ?? {});
334
+ const forkBackground = (effect) => Effect.sync(() => {
335
+ Effect.runFork(effect);
336
+ });
337
+ const state = yield* makeBridgeState(session, config.cwd, mcpServerUrl, forkBackground);
338
+ const requestListener = (request, response) => {
339
+ const path = requestPath(request.url);
340
+ if (request.method !== "POST" || (path !== "/v1/messages" && path !== "/mcp")) {
341
+ writeJson(response, 404, { error: { message: "not found" } });
342
+ return;
343
+ }
344
+ const handled = Effect.gen(function* () {
345
+ const raw = yield* readBody(request);
346
+ const body = yield* parseJsonBody(raw);
347
+ if (path === "/mcp") {
348
+ const tools = yield* Ref.get(state.tools);
349
+ const mcpTools = tools.map((tool) => anthropicToolToMcpTool(state, tool));
350
+ const reply = yield* handleMcpRequest(body, mcpTools);
351
+ return yield* Effect.sync(() => writeJson(response, 200, reply ?? {}));
352
+ }
353
+ if (jsonBooleanField(body, "stream") === true) {
354
+ return yield* respondStreaming(response, state, body);
355
+ }
356
+ const reply = yield* handleMessagesRequest(state, body);
357
+ return yield* Effect.sync(() => writeJson(response, 200, reply));
358
+ }).pipe(
359
+ // Only a failure before the head went out can still choose a status;
360
+ // `respondStreaming` owns everything after that and never fails.
361
+ Effect.catch((error) => Effect.sync(() => {
362
+ if (!response.headersSent) {
363
+ writeJson(response, errorStatus(error), { error: { message: error.message } });
364
+ }
365
+ })));
366
+ Effect.runPromise(handled).catch((defect) => {
367
+ if (!response.headersSent) {
368
+ writeJson(response, 500, { error: { message: String(defect) } });
369
+ }
370
+ });
371
+ };
372
+ const server = yield* acquireServer(config.port, requestListener);
373
+ const address = server.address();
374
+ const port = address !== null && typeof address !== "string" ? address.port : config.port;
375
+ return { port, baseUrl: `http://127.0.0.1:${port}` };
376
+ });
377
+ //# sourceMappingURL=NodeGeminiAcpBridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeGeminiAcpBridge.js","sourceRoot":"","sources":["../src/NodeGeminiAcpBridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ export declare const defaultGeminiBridgePort = "8731";
2
+ /**
3
+ * `~/.pi/agent/models.json`. Read only — llm4ts never writes it. Missing is
4
+ * not an error: the file simply doesn't exist yet.
5
+ */
6
+ export declare const defaultReadPiModelsJson: () => string | undefined;
7
+ export declare const geminiBridgePort: (environment: Readonly<Record<string, string | undefined>>) => string;
8
+ /**
9
+ * One value pi accepts for `--model`: `<provider>/<model>`, where the
10
+ * provider is a key under `providers` in `~/.pi/agent/models.json` and the
11
+ * model is a `models` entry's `id`. `bridged` marks the pairs whose provider
12
+ * points at this machine's ACP bridge — the ones that draw inference from
13
+ * gemini's OAuth session instead of a model API key.
14
+ *
15
+ * `authConfigured` tracks pi's availability rule rather than its schema: a
16
+ * provider with no `apiKey` still loads, but its models stay hidden from
17
+ * `--model` and `--list-models` until `/login`, `auth.json`, or `--api-key`
18
+ * supplies one. The bridge needs no real credential, so a placeholder is
19
+ * enough — but something must be there.
20
+ */
21
+ export interface PiModelRef {
22
+ readonly ref: string;
23
+ readonly bridged: boolean;
24
+ readonly authConfigured: boolean;
25
+ }
26
+ /**
27
+ * What pi makes of `~/.pi/agent/models.json`. `problems` mirrors pi's own
28
+ * schema validation, and a non-empty list means pi loads *nothing* from the
29
+ * file — it reports "errors loading models.json" and falls back to built-in
30
+ * providers, so `refs` is what the file intended, not what pi will accept.
31
+ */
32
+ export interface PiModelsConfig {
33
+ readonly refs: ReadonlyArray<PiModelRef>;
34
+ readonly problems: ReadonlyArray<string>;
35
+ }
36
+ /**
37
+ * Read pi's config the way pi reads it, so a report can say why a model is
38
+ * missing rather than only that it is. Deliberately total: an unreadable or
39
+ * malformed file yields problems, never a raised error, because this runs
40
+ * only to explain a failure and must never become one.
41
+ */
42
+ export declare const piModelsConfig: (modelsJson: string | undefined, port: string) => PiModelsConfig;
43
+ /** Back-compat shape for callers that only want the pairs. */
44
+ export declare const piModelRefs: (modelsJson: string | undefined, port: string) => ReadonlyArray<PiModelRef>;
45
+ /** The `provider/model` values that reach gemini through the bridge. */
46
+ export declare const bridgeModelRefs: (modelsJson: string | undefined, port: string) => ReadonlyArray<string>;
47
+ /**
48
+ * Which bridge-backed model a run should hand pi, decided from pi's own
49
+ * config rather than a guessed default. Shared by the flow runner and the
50
+ * ADR 0016 smoke test so both fail the same way for the same reason.
51
+ */
52
+ export type BridgeModelResolution = {
53
+ readonly _tag: "Resolved";
54
+ readonly model: string;
55
+ } | {
56
+ readonly _tag: "Ambiguous";
57
+ readonly candidates: ReadonlyArray<string>;
58
+ } | {
59
+ readonly _tag: "Unavailable";
60
+ readonly problems: ReadonlyArray<string>;
61
+ };
62
+ export declare const resolveBridgeModel: (modelsJson: string | undefined, port: string, configured: string | undefined) => BridgeModelResolution;
63
+ /** Why no bridge model could be chosen, phrased for a run that must stop. */
64
+ export declare const bridgeModelProblem: (resolution: BridgeModelResolution, port: string) => string | undefined;
65
+ //# sourceMappingURL=PiModels.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PiModels.d.ts","sourceRoot":"","sources":["../src/PiModels.ts"],"names":[],"mappings":"AAeA,eAAO,MAAM,uBAAuB,SAAS,CAAA;AAE7C;;;GAGG;AACH,eAAO,MAAM,uBAAuB,QAAO,MAAM,GAAG,SAMnD,CAAA;AAED,eAAO,MAAM,gBAAgB,GAC3B,aAAa,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,KACxD,MAG0B,CAAA;AAE7B;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAA;IACzB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAA;CACjC;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC,UAAU,CAAC,CAAA;IACxC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CACzC;AA2BD;;;;;GAKG;AACH,eAAO,MAAM,cAAc,GAAI,YAAY,MAAM,GAAG,SAAS,EAAE,MAAM,MAAM,KAAG,cA8C7E,CAAA;AAED,8DAA8D;AAC9D,eAAO,MAAM,WAAW,GACtB,YAAY,MAAM,GAAG,SAAS,EAC9B,MAAM,MAAM,KACX,aAAa,CAAC,UAAU,CAA0C,CAAA;AAErE,wEAAwE;AACxE,eAAO,MAAM,eAAe,GAC1B,YAAY,MAAM,GAAG,SAAS,EAC9B,MAAM,MAAM,KACX,aAAa,CAAC,MAAM,CAGO,CAAA;AAE9B;;;;GAIG;AACH,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACrD;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAE,GAC1E;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,aAAa,CAAC,MAAM,CAAC,CAAA;CAAE,CAAA;AAE9E,eAAO,MAAM,kBAAkB,GAC7B,YAAY,MAAM,GAAG,SAAS,EAC9B,MAAM,MAAM,EACZ,YAAY,MAAM,GAAG,SAAS,KAC7B,qBAoBF,CAAA;AAED,6EAA6E;AAC7E,eAAO,MAAM,kBAAkB,GAC7B,YAAY,qBAAqB,EACjC,MAAM,MAAM,KACX,MAAM,GAAG,SAqBX,CAAA"}
@@ -0,0 +1,148 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ /**
5
+ * Reading `pi`'s own model config (ADR 0016). Separate from `Doctor.ts` so
6
+ * the flow runner can consult it without importing the doctor — which
7
+ * imports the runner — and so the parsing has no dependency on either.
8
+ *
9
+ * pi owns this file; llm4ts only ever reads it.
10
+ */
11
+ const isSet = (value) => value !== undefined && value.trim().length > 0;
12
+ export const defaultGeminiBridgePort = "8731";
13
+ /**
14
+ * `~/.pi/agent/models.json`. Read only — llm4ts never writes it. Missing is
15
+ * not an error: the file simply doesn't exist yet.
16
+ */
17
+ export const defaultReadPiModelsJson = () => {
18
+ try {
19
+ return readFileSync(join(homedir(), ".pi", "agent", "models.json"), "utf8");
20
+ }
21
+ catch {
22
+ return undefined;
23
+ }
24
+ };
25
+ export const geminiBridgePort = (environment) => isSet(environment.LLM4TS_GEMINI_BRIDGE_PORT)
26
+ ? environment.LLM4TS_GEMINI_BRIDGE_PORT.trim()
27
+ : defaultGeminiBridgePort;
28
+ const isRecord = (value) => typeof value === "object" && value !== null && !Array.isArray(value);
29
+ /** Annotated rather than asserted, matching `NodeGeminiAcpBridge.parseJson`. */
30
+ const parseJson = (raw) => {
31
+ try {
32
+ return JSON.parse(raw);
33
+ }
34
+ catch {
35
+ return undefined;
36
+ }
37
+ };
38
+ /**
39
+ * pi's schema requires each `models` entry to be an object carrying a string
40
+ * `id`; a bare `"model-name"` string fails validation with
41
+ * `models.<i>: must be object` and takes the whole file down with it.
42
+ */
43
+ const modelId = (entry) => {
44
+ if (!isRecord(entry)) {
45
+ return undefined;
46
+ }
47
+ const id = entry.id;
48
+ return typeof id === "string" && id.length > 0 ? id : undefined;
49
+ };
50
+ /**
51
+ * Read pi's config the way pi reads it, so a report can say why a model is
52
+ * missing rather than only that it is. Deliberately total: an unreadable or
53
+ * malformed file yields problems, never a raised error, because this runs
54
+ * only to explain a failure and must never become one.
55
+ */
56
+ export const piModelsConfig = (modelsJson, port) => {
57
+ if (modelsJson === undefined) {
58
+ return { refs: [], problems: [] };
59
+ }
60
+ const parsed = parseJson(modelsJson);
61
+ if (parsed === undefined) {
62
+ return { refs: [], problems: ["models.json is not valid JSON"] };
63
+ }
64
+ const providers = isRecord(parsed) ? parsed.providers : undefined;
65
+ if (!isRecord(providers)) {
66
+ return { refs: [], problems: ["providers: must be an object"] };
67
+ }
68
+ const refs = [];
69
+ const problems = [];
70
+ for (const [provider, entry] of Object.entries(providers)) {
71
+ if (!isRecord(entry)) {
72
+ problems.push(`providers.${provider}: must be an object`);
73
+ continue;
74
+ }
75
+ const baseUrl = entry.baseUrl;
76
+ const bridged = typeof baseUrl === "string" && baseUrl.includes(`127.0.0.1:${port}`);
77
+ // pi resolves `apiKey` from a literal, `$ENV`, or a `!command`; any of
78
+ // them counts as configured here, because presence is the availability
79
+ // rule and llm4ts must never resolve the value itself.
80
+ const authConfigured = typeof entry.apiKey === "string" && entry.apiKey.length > 0;
81
+ const models = entry.models;
82
+ if (models === undefined) {
83
+ continue;
84
+ }
85
+ if (!Array.isArray(models)) {
86
+ problems.push(`providers.${provider}.models: must be an array`);
87
+ continue;
88
+ }
89
+ if (typeof baseUrl !== "string" || baseUrl.length === 0) {
90
+ problems.push(`providers.${provider}.baseUrl: required for a provider with models`);
91
+ }
92
+ models.forEach((model, index) => {
93
+ const id = modelId(model);
94
+ if (id === undefined) {
95
+ problems.push(`providers.${provider}.models.${index}: must be an object with a string id`);
96
+ return;
97
+ }
98
+ refs.push({ ref: `${provider}/${id}`, bridged, authConfigured });
99
+ });
100
+ }
101
+ return { refs, problems };
102
+ };
103
+ /** Back-compat shape for callers that only want the pairs. */
104
+ export const piModelRefs = (modelsJson, port) => piModelsConfig(modelsJson, port).refs;
105
+ /** The `provider/model` values that reach gemini through the bridge. */
106
+ export const bridgeModelRefs = (modelsJson, port) => piModelRefs(modelsJson, port)
107
+ .filter((entry) => entry.bridged)
108
+ .map((entry) => entry.ref);
109
+ export const resolveBridgeModel = (modelsJson, port, configured) => {
110
+ if (isSet(configured)) {
111
+ return { _tag: "Resolved", model: configured.trim() };
112
+ }
113
+ const { refs, problems } = piModelsConfig(modelsJson, port);
114
+ // pi discards the whole file on any schema error, so a bridge entry that
115
+ // parses here is still invisible to pi. Never offer one.
116
+ if (problems.length > 0) {
117
+ return { _tag: "Unavailable", problems };
118
+ }
119
+ const candidates = refs
120
+ .filter((entry) => entry.bridged && entry.authConfigured)
121
+ .map((entry) => entry.ref);
122
+ const [only] = candidates;
123
+ if (only !== undefined && candidates.length === 1) {
124
+ return { _tag: "Resolved", model: only };
125
+ }
126
+ return candidates.length === 0
127
+ ? { _tag: "Unavailable", problems: [] }
128
+ : { _tag: "Ambiguous", candidates };
129
+ };
130
+ /** Why no bridge model could be chosen, phrased for a run that must stop. */
131
+ export const bridgeModelProblem = (resolution, port) => {
132
+ if (resolution._tag === "Resolved") {
133
+ return undefined;
134
+ }
135
+ if (resolution._tag === "Ambiguous") {
136
+ return (`Several bridge models are available; set LLM4TS_GEMINI_BRIDGE_MODEL to one of:\n` +
137
+ resolution.candidates.map((ref) => ` ${ref}`).join("\n"));
138
+ }
139
+ const detail = resolution.problems.length > 0
140
+ ? ` It currently fails pi's schema:\n${resolution.problems.map((p) => ` ${p}`).join("\n")}`
141
+ : "";
142
+ return (`No usable bridge model in ~/.pi/agent/models.json for port ${port}. Add a provider ` +
143
+ `with baseUrl "http://127.0.0.1:${port}", any placeholder apiKey, and a models entry ` +
144
+ `shaped { "id": "..." } (see docs/configuration.md).${detail}\n` +
145
+ `\`pi --list-models\` is the final word on what pi accepts; ` +
146
+ `\`LLM4TS_GEMINI_BRIDGE=1 llm4ts doctor\` explains what it makes of the file.`);
147
+ };
148
+ //# sourceMappingURL=PiModels.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PiModels.js","sourceRoot":"","sources":["../src/PiModels.ts"],"names":[],"mappings":"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"}