@map-audio/pam-mcp-server 1.12.0 → 1.18.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.
- package/README.md +21 -5
- package/dist/bridge.d.ts +17 -3
- package/dist/bridge.js +81 -20
- package/dist/bridge.js.map +1 -1
- package/dist/fgemma-format.d.ts +119 -0
- package/dist/fgemma-format.js +292 -0
- package/dist/fgemma-format.js.map +1 -0
- package/dist/fgemma-runner.d.ts +27 -0
- package/dist/fgemma-runner.js +475 -0
- package/dist/fgemma-runner.js.map +1 -0
- package/dist/manifest-cell1.json +7950 -0
- package/dist/manifest-mfx.json +13381 -0
- package/dist/manifest.d.ts +2 -1
- package/dist/manifest.js +79 -29
- package/dist/manifest.js.map +1 -1
- package/dist/manifest.json +821 -130
- package/dist/mixAssist.d.ts +155 -0
- package/dist/mixAssist.js +647 -0
- package/dist/mixAssist.js.map +1 -0
- package/dist/presetSave.d.ts +10 -0
- package/dist/presetSave.js +22 -0
- package/dist/presetSave.js.map +1 -0
- package/dist/server.js +2204 -140
- package/dist/server.js.map +1 -1
- package/package.json +5 -2
|
@@ -0,0 +1,475 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* PAM FunctionGemma runner — drives a (fine-tuned) FunctionGemma model against
|
|
4
|
+
* the PAM MCP server using the model's native wire format (fgemma-format.ts),
|
|
5
|
+
* NOT the OpenAI chat+tools API: raw /completions + our own renderer/parser is
|
|
6
|
+
* deterministic and byte-matches training (agent.ts remains the big-model
|
|
7
|
+
* OpenAI-style baseline harness).
|
|
8
|
+
*
|
|
9
|
+
* Modes:
|
|
10
|
+
* REPL (default) npx tsx src/fgemma-runner.ts [--url http://localhost:1234/v1] [--model id]
|
|
11
|
+
* Offline eval ... --eval ../fgemma-poc/out/eval.jsonl --out ../fgemma-poc/out/predictions.jsonl
|
|
12
|
+
* Live e2e ... --live ../fgemma-poc/scenarios/live.jsonl [--gold]
|
|
13
|
+
*
|
|
14
|
+
* Flags: --toolpack <path> --bos text|none (default none; use text if the
|
|
15
|
+
* serving layer does NOT add BOS itself) --max-tokens N --final (generate a
|
|
16
|
+
* model NL summary after write-tool calls; read-tools always continue)
|
|
17
|
+
* --no-ctx (skip the live [ctx] session line).
|
|
18
|
+
*
|
|
19
|
+
* Session context (dataset v3): each command's user turn is prefixed with the
|
|
20
|
+
* [ctx] state line built live from the bridge (get_transport +
|
|
21
|
+
* get_design_overview; sel is UI-only so it renders `none` here). The REPL
|
|
22
|
+
* additionally threads the last completed exchanges as history — the same
|
|
23
|
+
* shapes the in-plugin executor produces. Within one command the runner does
|
|
24
|
+
* up to MAX_ROUNDS call→response continuations inside the same model turn
|
|
25
|
+
* (the trained repair/introspect pattern).
|
|
26
|
+
*/
|
|
27
|
+
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
|
|
28
|
+
import { StdioClientTransport } from "@modelcontextprotocol/sdk/client/stdio.js";
|
|
29
|
+
import { createInterface } from "node:readline";
|
|
30
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
31
|
+
import { resolve, dirname } from "node:path";
|
|
32
|
+
import { fileURLToPath } from "node:url";
|
|
33
|
+
import { STOP_SEQUENCES, buildGenerationPrompt, renderFunctionCall, renderFunctionResponse, parseFunctionCalls, truncateAtFabricatedResponse, withContext, } from "./fgemma-format.js";
|
|
34
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
35
|
+
const DEFAULT_TOOLPACK = resolve(__dirname, "../../fgemma-poc/out/toolpack.json");
|
|
36
|
+
const MAX_ROUNDS = 3;
|
|
37
|
+
const RESULT_TRUNC = 400; // chars of tool-result JSON fed back as function response
|
|
38
|
+
function parseArgs() {
|
|
39
|
+
const a = process.argv.slice(2);
|
|
40
|
+
const get = (flag) => {
|
|
41
|
+
const i = a.indexOf(flag);
|
|
42
|
+
return i > -1 ? a[i + 1] : undefined;
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
url: get("--url") || process.env.PAM_LLM_URL || "http://localhost:1234/v1",
|
|
46
|
+
model: get("--model") || process.env.PAM_LLM_MODEL || "pam-functiongemma-poc",
|
|
47
|
+
toolpack: get("--toolpack") || DEFAULT_TOOLPACK,
|
|
48
|
+
bos: get("--bos") || "none",
|
|
49
|
+
maxTokens: Number(get("--max-tokens") || 256),
|
|
50
|
+
final: a.includes("--final"),
|
|
51
|
+
noCtx: a.includes("--no-ctx"),
|
|
52
|
+
evalPath: get("--eval"),
|
|
53
|
+
outPath: get("--out"),
|
|
54
|
+
livePath: get("--live"),
|
|
55
|
+
gold: a.includes("--gold"),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
const config = parseArgs();
|
|
59
|
+
function loadToolpack() {
|
|
60
|
+
const doc = JSON.parse(readFileSync(config.toolpack, "utf-8"));
|
|
61
|
+
return doc.tools;
|
|
62
|
+
}
|
|
63
|
+
/** Map assistant-facing alias calls onto real MCP tools (no server change). */
|
|
64
|
+
function resolveAlias(call, pack) {
|
|
65
|
+
const tool = pack.find((t) => t.name === call.name);
|
|
66
|
+
if (!tool?.aliasOf)
|
|
67
|
+
return call;
|
|
68
|
+
if (tool.name === "set_parameter") {
|
|
69
|
+
const { paramId, value } = call.arguments;
|
|
70
|
+
return { name: "set_parameters", arguments: { parameters: { [paramId]: value } } };
|
|
71
|
+
}
|
|
72
|
+
throw new Error(`no alias mapping implemented for ${tool.name} -> ${tool.aliasOf}`);
|
|
73
|
+
}
|
|
74
|
+
const READ_TOOL_RE = /^(get_|list_|connection_status)/;
|
|
75
|
+
// --- generation ----------------------------------------------------------
|
|
76
|
+
async function complete(prompt) {
|
|
77
|
+
const t0 = Date.now();
|
|
78
|
+
const resp = await fetch(`${config.url}/completions`, {
|
|
79
|
+
method: "POST",
|
|
80
|
+
headers: { "Content-Type": "application/json" },
|
|
81
|
+
body: JSON.stringify({
|
|
82
|
+
model: config.model,
|
|
83
|
+
prompt,
|
|
84
|
+
max_tokens: config.maxTokens,
|
|
85
|
+
temperature: 0,
|
|
86
|
+
stop: STOP_SEQUENCES,
|
|
87
|
+
stream: false,
|
|
88
|
+
}),
|
|
89
|
+
});
|
|
90
|
+
if (!resp.ok)
|
|
91
|
+
throw new Error(`LLM API error ${resp.status}: ${await resp.text()}`);
|
|
92
|
+
const data = (await resp.json());
|
|
93
|
+
return { text: data.choices[0].text, ms: Date.now() - t0 };
|
|
94
|
+
}
|
|
95
|
+
// --- MCP -----------------------------------------------------------------
|
|
96
|
+
async function createMcpClient() {
|
|
97
|
+
const transport = new StdioClientTransport({
|
|
98
|
+
command: "npx",
|
|
99
|
+
args: ["tsx", resolve(__dirname, "server.ts")],
|
|
100
|
+
stderr: "inherit",
|
|
101
|
+
});
|
|
102
|
+
const client = new Client({ name: "pam-fgemma-runner", version: "1.0.0" });
|
|
103
|
+
await client.connect(transport);
|
|
104
|
+
return client;
|
|
105
|
+
}
|
|
106
|
+
async function execCall(client, call, pack) {
|
|
107
|
+
const real = resolveAlias(call, pack);
|
|
108
|
+
try {
|
|
109
|
+
const result = await client.callTool({ name: real.name, arguments: real.arguments });
|
|
110
|
+
const contentArr = Array.isArray(result.content) ? result.content : [];
|
|
111
|
+
const text = contentArr
|
|
112
|
+
.filter((c) => c.type === "text")
|
|
113
|
+
.map((c) => c.text || "")
|
|
114
|
+
.join("\n");
|
|
115
|
+
return { text, isError: Boolean(result.isError) };
|
|
116
|
+
}
|
|
117
|
+
catch (e) {
|
|
118
|
+
return { text: `Tool error: ${e.message}`, isError: true };
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
function toResponsePayload(resultText, isError) {
|
|
122
|
+
if (isError)
|
|
123
|
+
return { error: resultText.slice(0, RESULT_TRUNC) };
|
|
124
|
+
try {
|
|
125
|
+
const parsed = JSON.parse(resultText);
|
|
126
|
+
if (parsed && typeof parsed === "object" && !Array.isArray(parsed)) {
|
|
127
|
+
const s = JSON.stringify(parsed);
|
|
128
|
+
return s.length <= RESULT_TRUNC ? parsed : { result: s.slice(0, RESULT_TRUNC) };
|
|
129
|
+
}
|
|
130
|
+
return { result: parsed };
|
|
131
|
+
}
|
|
132
|
+
catch {
|
|
133
|
+
return { result: resultText.slice(0, RESULT_TRUNC) };
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
// --- session context (dataset v3) ------------------------------------------
|
|
137
|
+
/** Build the live [ctx] line from the bridge: get_transport (bpm/playing) +
|
|
138
|
+
* get_design_overview (per-cell sample/synth labels). The selected cell is
|
|
139
|
+
* UI-only state the bridge can't see → sel renders `none` here (the
|
|
140
|
+
* in-plugin executor supplies the real selection). Returns null when the
|
|
141
|
+
* reads fail (no PAM running) — prompts then use the trained no-ctx shape. */
|
|
142
|
+
async function fetchContext(client, tools) {
|
|
143
|
+
if (config.noCtx)
|
|
144
|
+
return null;
|
|
145
|
+
try {
|
|
146
|
+
const t = await execCall(client, { name: "get_transport", arguments: {} }, tools);
|
|
147
|
+
const o = await execCall(client, { name: "get_design_overview", arguments: {} }, tools);
|
|
148
|
+
if (t.isError || o.isError)
|
|
149
|
+
return null;
|
|
150
|
+
const transport = JSON.parse(t.text);
|
|
151
|
+
const overview = JSON.parse(o.text);
|
|
152
|
+
// preset= IS bridge-visible (state.activePresetPath); only view/sel are
|
|
153
|
+
// UI-only. Renders `none` for Init/Default, like the in-plugin executor.
|
|
154
|
+
let preset = null;
|
|
155
|
+
try {
|
|
156
|
+
const s = await execCall(client, { name: "get_state", arguments: { keys: ["activePresetPath"] } }, tools);
|
|
157
|
+
const activePath = JSON.parse(s.text).activePresetPath;
|
|
158
|
+
if (typeof activePath === "string" && activePath && activePath !== "Init") {
|
|
159
|
+
const stem = (activePath.split("/").pop() ?? "").replace(/\.preset$/, "");
|
|
160
|
+
preset = stem && stem !== "Default" ? stem : null;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
preset = null;
|
|
165
|
+
}
|
|
166
|
+
return {
|
|
167
|
+
bpm: Number(transport.bpm ?? 120),
|
|
168
|
+
playing: Boolean(transport.playing ?? transport.isPlaying),
|
|
169
|
+
preset,
|
|
170
|
+
sel: null,
|
|
171
|
+
cells: (overview.cells ?? [])
|
|
172
|
+
.filter((c) => c.sample || c.synth)
|
|
173
|
+
.map((c) => ({ id: c.id, name: c.sample ?? `${c.synth}(synth)` })),
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
catch {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
async function runCommandExec(userText, tools, client, log, opts = {}) {
|
|
181
|
+
let prompt = buildGenerationPrompt(tools, withContext(userText, opts.ctx), {
|
|
182
|
+
bos: config.bos,
|
|
183
|
+
history: opts.history,
|
|
184
|
+
});
|
|
185
|
+
const trace = { rounds: [], executed: [], modelTurn: "" };
|
|
186
|
+
const declared = new Set(tools.map((t) => t.name));
|
|
187
|
+
// A repair round that re-emits the exact call that just errored will error
|
|
188
|
+
// identically forever — cut the loop (executor parity, assistantExecutor.ts).
|
|
189
|
+
const failedCalls = opts.failedCalls ?? new Set();
|
|
190
|
+
for (let round = 0; round < MAX_ROUNDS; round++) {
|
|
191
|
+
const { text: rawFull, ms } = await complete(prompt);
|
|
192
|
+
const raw = truncateAtFabricatedResponse(rawFull);
|
|
193
|
+
if (raw !== rawFull) {
|
|
194
|
+
trace.quarantineHistory = true;
|
|
195
|
+
log(" (dropped fabricated function-response continuation)");
|
|
196
|
+
}
|
|
197
|
+
const calls = parseFunctionCalls(raw);
|
|
198
|
+
trace.rounds.push({ raw, calls, ms });
|
|
199
|
+
if (calls.length === 0) {
|
|
200
|
+
trace.finalText = raw.trim();
|
|
201
|
+
trace.modelTurn += trace.finalText;
|
|
202
|
+
return trace;
|
|
203
|
+
}
|
|
204
|
+
const unknown = calls.filter((c) => !declared.has(c.name));
|
|
205
|
+
if (unknown.length) {
|
|
206
|
+
trace.quarantineHistory = true;
|
|
207
|
+
log(` refusing undeclared tool(s): ${unknown.map((c) => c.name).join(", ")}`);
|
|
208
|
+
return trace;
|
|
209
|
+
}
|
|
210
|
+
let continuation = raw.trimEnd();
|
|
211
|
+
let responses = "";
|
|
212
|
+
let wantContinue = false;
|
|
213
|
+
for (const call of calls) {
|
|
214
|
+
const signature = `${call.name} ${JSON.stringify(call.arguments)}`;
|
|
215
|
+
if (failedCalls.has(signature)) {
|
|
216
|
+
trace.quarantineHistory = true;
|
|
217
|
+
log(` stopped — the model repeated a call that already failed (${call.name}).`);
|
|
218
|
+
return trace;
|
|
219
|
+
}
|
|
220
|
+
log(` ⚡ ${call.name}(${JSON.stringify(call.arguments)})`);
|
|
221
|
+
const { text, isError } = await execCall(client, call, tools);
|
|
222
|
+
if (isError) {
|
|
223
|
+
failedCalls.add(signature);
|
|
224
|
+
trace.quarantineHistory = true;
|
|
225
|
+
}
|
|
226
|
+
trace.executed.push({ call, resultText: text, isError });
|
|
227
|
+
log(` → ${text.length > 200 ? text.slice(0, 200) + "…" : text || "(ok)"}`);
|
|
228
|
+
const response = renderFunctionResponse(call.name, toResponsePayload(text, isError));
|
|
229
|
+
continuation += response;
|
|
230
|
+
responses += response;
|
|
231
|
+
if (isError || READ_TOOL_RE.test(call.name))
|
|
232
|
+
wantContinue = true;
|
|
233
|
+
}
|
|
234
|
+
trace.modelTurn += calls.map(renderFunctionCall).join("") + responses;
|
|
235
|
+
if (!wantContinue && !config.final)
|
|
236
|
+
return trace;
|
|
237
|
+
prompt += continuation;
|
|
238
|
+
}
|
|
239
|
+
return trace;
|
|
240
|
+
}
|
|
241
|
+
/** Rebuild history exchanges from a row's messages before its LAST user turn
|
|
242
|
+
* (followup rows). renderValue key-sorts recursively (template dictsort
|
|
243
|
+
* parity), so no extra normalization is needed here. */
|
|
244
|
+
function historyFromMessages(messages, lastUser) {
|
|
245
|
+
const history = [];
|
|
246
|
+
let i = 1; // skip the developer message
|
|
247
|
+
while (i < lastUser) {
|
|
248
|
+
if (messages[i].role !== "user") {
|
|
249
|
+
i++;
|
|
250
|
+
continue;
|
|
251
|
+
}
|
|
252
|
+
const user = String(messages[i].content ?? "");
|
|
253
|
+
let model = "";
|
|
254
|
+
i++;
|
|
255
|
+
while (i < lastUser && messages[i].role !== "user") {
|
|
256
|
+
const m = messages[i];
|
|
257
|
+
if (m.role === "assistant" && m.tool_calls) {
|
|
258
|
+
model += m.tool_calls
|
|
259
|
+
.map((tc) => renderFunctionCall({ name: tc.function.name, arguments: tc.function.arguments }))
|
|
260
|
+
.join("");
|
|
261
|
+
}
|
|
262
|
+
else if (m.role === "assistant" && m.content) {
|
|
263
|
+
model += String(m.content);
|
|
264
|
+
}
|
|
265
|
+
else if (m.role === "tool" && m.content && typeof m.content === "object") {
|
|
266
|
+
const c = m.content;
|
|
267
|
+
model += renderFunctionResponse(c.name, c.response);
|
|
268
|
+
}
|
|
269
|
+
i++;
|
|
270
|
+
}
|
|
271
|
+
history.push({ user, model });
|
|
272
|
+
}
|
|
273
|
+
return history;
|
|
274
|
+
}
|
|
275
|
+
async function runEval(tools) {
|
|
276
|
+
const rows = readFileSync(config.evalPath, "utf-8")
|
|
277
|
+
.trim()
|
|
278
|
+
.split("\n")
|
|
279
|
+
.map((l) => JSON.parse(l));
|
|
280
|
+
const outPath = config.outPath || resolve(dirname(config.evalPath), "predictions.jsonl");
|
|
281
|
+
const out = [];
|
|
282
|
+
const latencies = [];
|
|
283
|
+
for (let i = 0; i < rows.length; i++) {
|
|
284
|
+
const row = rows[i];
|
|
285
|
+
// Replay to the LAST user turn (followup rows carry a first exchange as
|
|
286
|
+
// history); gold = the first assistant message after it. Rows carry their
|
|
287
|
+
// own [ctx] line inside the user content — nothing to inject here.
|
|
288
|
+
const lastUser = row.messages.reduce((acc, m, idx) => (m.role === "user" ? idx : acc), -1);
|
|
289
|
+
const user = row.messages[lastUser];
|
|
290
|
+
const firstAssistant = row.messages.slice(lastUser + 1).find((m) => m.role === "assistant");
|
|
291
|
+
const utterance = String(user?.content ?? "");
|
|
292
|
+
const gold = firstAssistant?.tool_calls
|
|
293
|
+
? firstAssistant.tool_calls.map((tc) => ({ name: tc.function.name, arguments: tc.function.arguments }))
|
|
294
|
+
: null; // null = abstain expected
|
|
295
|
+
// Protocol: always generate against the FULL toolpack (deployment prompt),
|
|
296
|
+
// regardless of the subset recorded in the row.
|
|
297
|
+
const prompt = buildGenerationPrompt(tools, utterance, {
|
|
298
|
+
bos: config.bos,
|
|
299
|
+
history: historyFromMessages(row.messages, lastUser),
|
|
300
|
+
});
|
|
301
|
+
let raw = "";
|
|
302
|
+
let ms = -1;
|
|
303
|
+
try {
|
|
304
|
+
const r = await complete(prompt);
|
|
305
|
+
raw = r.text;
|
|
306
|
+
ms = r.ms;
|
|
307
|
+
latencies.push(ms);
|
|
308
|
+
}
|
|
309
|
+
catch (e) {
|
|
310
|
+
raw = `__GENERATION_ERROR__ ${e.message}`;
|
|
311
|
+
}
|
|
312
|
+
const calls = parseFunctionCalls(raw);
|
|
313
|
+
out.push(JSON.stringify({ idx: i, meta: row._meta, utterance, gold, raw, calls, ms }));
|
|
314
|
+
if ((i + 1) % 25 === 0)
|
|
315
|
+
console.error(`eval ${i + 1}/${rows.length}`);
|
|
316
|
+
}
|
|
317
|
+
writeFileSync(outPath, out.join("\n") + "\n");
|
|
318
|
+
latencies.sort((a, b) => a - b);
|
|
319
|
+
const p = (q) => latencies[Math.min(latencies.length - 1, Math.floor(q * latencies.length))] ?? -1;
|
|
320
|
+
console.log(`wrote ${out.length} predictions -> ${outPath}\nlatency ms p50=${p(0.5)} p95=${p(0.95)} (n=${latencies.length})`);
|
|
321
|
+
console.log("score with: python3 packages/fgemma-poc/eval_offline.py " + outPath);
|
|
322
|
+
}
|
|
323
|
+
function callMatches(call, tool, argsSubset) {
|
|
324
|
+
if (call.name !== tool)
|
|
325
|
+
return false;
|
|
326
|
+
if (!argsSubset)
|
|
327
|
+
return true;
|
|
328
|
+
return Object.entries(argsSubset).every(([k, v]) => JSON.stringify(call.arguments[k]) === JSON.stringify(v));
|
|
329
|
+
}
|
|
330
|
+
async function runLive(tools) {
|
|
331
|
+
const scenarios = readFileSync(config.livePath, "utf-8")
|
|
332
|
+
.trim()
|
|
333
|
+
.split("\n")
|
|
334
|
+
.filter((l) => l.trim() && !l.trimStart().startsWith("//"))
|
|
335
|
+
.map((l) => JSON.parse(l));
|
|
336
|
+
const client = await createMcpClient();
|
|
337
|
+
let pass = 0;
|
|
338
|
+
let softFail = 0;
|
|
339
|
+
const failures = [];
|
|
340
|
+
for (const sc of scenarios) {
|
|
341
|
+
const log = (s) => console.log(s);
|
|
342
|
+
console.log(`\n== ${sc.id}: "${sc.utterance}"${config.gold ? " [gold]" : ""}`);
|
|
343
|
+
let trace;
|
|
344
|
+
if (config.gold) {
|
|
345
|
+
trace = { rounds: [{ raw: "(gold)", calls: [], ms: 0 }], executed: [], modelTurn: "" };
|
|
346
|
+
for (const g of sc.gold) {
|
|
347
|
+
const call = { name: g.tool, arguments: g.args };
|
|
348
|
+
log(` ⚡ ${call.name}(${JSON.stringify(call.arguments)})`);
|
|
349
|
+
const { text, isError } = await execCall(client, call, tools);
|
|
350
|
+
trace.executed.push({ call, resultText: text, isError });
|
|
351
|
+
log(` → ${text.length > 160 ? text.slice(0, 160) + "…" : text || "(ok)"}`);
|
|
352
|
+
}
|
|
353
|
+
trace.rounds[0].calls = sc.gold.map((g) => ({ name: g.tool, arguments: g.args }));
|
|
354
|
+
}
|
|
355
|
+
else {
|
|
356
|
+
// Live scenarios are independent — fresh ctx per command, no history.
|
|
357
|
+
const ctx = await fetchContext(client, tools);
|
|
358
|
+
trace = await runCommandExec(sc.utterance, tools, client, log, { ctx });
|
|
359
|
+
}
|
|
360
|
+
let ok = true;
|
|
361
|
+
for (const ex of sc.expect) {
|
|
362
|
+
let this_ok = false;
|
|
363
|
+
let detail = "";
|
|
364
|
+
const allCalls = trace.rounds.flatMap((r) => r.calls);
|
|
365
|
+
if (ex.kind === "no_calls") {
|
|
366
|
+
this_ok = allCalls.length === 0;
|
|
367
|
+
detail = this_ok ? "" : `emitted ${allCalls.map((c) => c.name).join(",")}`;
|
|
368
|
+
}
|
|
369
|
+
else if (ex.kind === "call") {
|
|
370
|
+
this_ok = allCalls.some((c) => callMatches(c, ex.tool, ex.args_subset));
|
|
371
|
+
detail = this_ok ? "" : `no matching call ${ex.tool}(${JSON.stringify(ex.args_subset ?? {})})`;
|
|
372
|
+
}
|
|
373
|
+
else if (ex.kind === "state") {
|
|
374
|
+
const { text } = await execCall(client, { name: ex.tool, arguments: ex.args ?? {} }, tools);
|
|
375
|
+
this_ok = ex.contains ? text.includes(ex.contains) : text.length > 0;
|
|
376
|
+
detail = this_ok ? "" : `"${ex.contains}" not in ${ex.tool} result`;
|
|
377
|
+
}
|
|
378
|
+
if (!this_ok) {
|
|
379
|
+
if (ex.soft) {
|
|
380
|
+
softFail++;
|
|
381
|
+
console.log(` ~ soft-fail: ${detail}`);
|
|
382
|
+
}
|
|
383
|
+
else {
|
|
384
|
+
ok = false;
|
|
385
|
+
console.log(` ✗ ${detail}`);
|
|
386
|
+
}
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
if (ok) {
|
|
390
|
+
pass++;
|
|
391
|
+
console.log(" ✓ pass");
|
|
392
|
+
}
|
|
393
|
+
else {
|
|
394
|
+
failures.push(sc.id);
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
console.log(`\nlive: ${pass}/${scenarios.length} passed (${softFail} soft-fails)${failures.length ? "; failed: " + failures.join(", ") : ""}`);
|
|
398
|
+
process.exit(failures.length ? 1 : 0);
|
|
399
|
+
}
|
|
400
|
+
// --- REPL ------------------------------------------------------------------
|
|
401
|
+
const HISTORY_MAX_EXCHANGES = 2;
|
|
402
|
+
const HISTORY_TURN_MAX_CHARS = 600;
|
|
403
|
+
async function runRepl(tools) {
|
|
404
|
+
const client = await createMcpClient();
|
|
405
|
+
console.log(`\x1b[36mPAM FunctionGemma runner\x1b[0m — ${tools.length} tools, model ${config.model} at ${config.url}`);
|
|
406
|
+
// Async iteration, NOT rl.question: question() drops lines that arrive
|
|
407
|
+
// while no question is pending, so piping a batch of prompts through stdin
|
|
408
|
+
// silently lost every line after the first. The iterator buffers them.
|
|
409
|
+
const rl = createInterface({ input: process.stdin, output: process.stdout, terminal: process.stdin.isTTY });
|
|
410
|
+
if (process.stdin.isTTY)
|
|
411
|
+
process.stdout.write("\x1b[33myou>\x1b[0m ");
|
|
412
|
+
const history = [];
|
|
413
|
+
const failedCalls = new Set();
|
|
414
|
+
for await (const rawLine of rl) {
|
|
415
|
+
const input = rawLine.trim();
|
|
416
|
+
if (!process.stdin.isTTY && input)
|
|
417
|
+
console.log(`\x1b[33myou>\x1b[0m ${input}`);
|
|
418
|
+
if (!input) {
|
|
419
|
+
if (process.stdin.isTTY)
|
|
420
|
+
process.stdout.write("\x1b[33myou>\x1b[0m ");
|
|
421
|
+
continue;
|
|
422
|
+
}
|
|
423
|
+
if (input === "/quit")
|
|
424
|
+
break;
|
|
425
|
+
if (input === "/clear") {
|
|
426
|
+
history.length = 0;
|
|
427
|
+
failedCalls.clear();
|
|
428
|
+
console.log("\x1b[90m history cleared\x1b[0m");
|
|
429
|
+
if (process.stdin.isTTY)
|
|
430
|
+
process.stdout.write("\x1b[33myou>\x1b[0m ");
|
|
431
|
+
continue;
|
|
432
|
+
}
|
|
433
|
+
try {
|
|
434
|
+
const ctx = await fetchContext(client, tools);
|
|
435
|
+
const trace = await runCommandExec(input, tools, client, (s) => console.log(s), {
|
|
436
|
+
ctx,
|
|
437
|
+
history: history.slice(-HISTORY_MAX_EXCHANGES),
|
|
438
|
+
failedCalls,
|
|
439
|
+
});
|
|
440
|
+
if (!trace.quarantineHistory && trace.modelTurn && trace.modelTurn.length <= HISTORY_TURN_MAX_CHARS) {
|
|
441
|
+
history.push({ user: input, model: trace.modelTurn });
|
|
442
|
+
}
|
|
443
|
+
if (trace.finalText)
|
|
444
|
+
console.log(`\x1b[36mpam>\x1b[0m ${trace.finalText}`);
|
|
445
|
+
else if (trace.executed.length) {
|
|
446
|
+
const failed = trace.executed.filter((e) => e.isError).length;
|
|
447
|
+
console.log(`\x1b[36mpam>\x1b[0m ${trace.executed.length - failed}/${trace.executed.length} call(s) applied.`);
|
|
448
|
+
}
|
|
449
|
+
else
|
|
450
|
+
console.log(`\x1b[36mpam>\x1b[0m (no action)`);
|
|
451
|
+
const ms = trace.rounds.reduce((s, r) => s + r.ms, 0);
|
|
452
|
+
console.log(`\x1b[90m ${ms} ms model time, ${trace.rounds.length} round(s)\x1b[0m`);
|
|
453
|
+
}
|
|
454
|
+
catch (e) {
|
|
455
|
+
console.error(`\x1b[31merror:\x1b[0m ${e.message}`);
|
|
456
|
+
}
|
|
457
|
+
if (process.stdin.isTTY)
|
|
458
|
+
process.stdout.write("\x1b[33myou>\x1b[0m ");
|
|
459
|
+
}
|
|
460
|
+
rl.close();
|
|
461
|
+
process.exit(0);
|
|
462
|
+
}
|
|
463
|
+
async function main() {
|
|
464
|
+
const tools = loadToolpack();
|
|
465
|
+
if (config.evalPath)
|
|
466
|
+
return runEval(tools);
|
|
467
|
+
if (config.livePath)
|
|
468
|
+
return runLive(tools);
|
|
469
|
+
return runRepl(tools);
|
|
470
|
+
}
|
|
471
|
+
main().catch((e) => {
|
|
472
|
+
console.error("Fatal:", e.message);
|
|
473
|
+
process.exit(1);
|
|
474
|
+
});
|
|
475
|
+
//# sourceMappingURL=fgemma-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fgemma-runner.js","sourceRoot":"","sources":["../src/fgemma-runner.ts"],"names":[],"mappings":"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"}
|