@map-audio/pam-mcp-server 1.12.0 → 1.21.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.
@@ -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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"}
@@ -0,0 +1,31 @@
1
+ export interface VariationSnapshotContract {
2
+ /** Session keys a variation must not carry (shared/variationSessionKeys.json). */
3
+ sessionKeys: readonly string[];
4
+ /** Visual audio-react paramIds — they persist ACROSS variations, so they are
5
+ * stripped from every snapshot rather than captured per slot. */
6
+ visualParamIds: readonly string[];
7
+ /** Number of shared LFO generators (NUM_LFOS). */
8
+ lfoGeneratorCount: number;
9
+ }
10
+ export interface VariationSnapshotOptions {
11
+ /** FX-router products ship without Vary — never serialize its matrix state. */
12
+ isFxProduct?: boolean;
13
+ }
14
+ /**
15
+ * Force each `lfo{g}_enabled` flag to match whether that generator still has a
16
+ * live link.
17
+ *
18
+ * A generator whose links were all removed or disabled must not persist as
19
+ * enabled: on load it would re-arm a generator driving nothing, and the next
20
+ * link added to that slot would inherit an on state the user never set.
21
+ */
22
+ export declare function reconcileLfoGeneratorEnabledState(snapshot: Record<string, unknown>, lfoGeneratorCount: number): void;
23
+ /**
24
+ * Shape a variation snapshot from plugin state.
25
+ *
26
+ * Order matters and is part of the contract: strip session keys, drop the
27
+ * active-preset path, strip visual params, narrow for FX products, then
28
+ * reconcile the LFO generator flags LAST — the reconcile reads `lfos`, which
29
+ * the earlier steps may have removed.
30
+ */
31
+ export declare function buildVariationSnapshotBase(state: Record<string, unknown>, contract: VariationSnapshotContract, options?: VariationSnapshotOptions): Record<string, unknown>;
@@ -0,0 +1,62 @@
1
+ // GENERATED COPY of shared/variationSnapshot.ts — do not edit here.
2
+ // Regenerate: node scripts/generate-variation-session-keys.mjs
3
+ // The variation-snapshot shaping both save paths run.
4
+ //
5
+ // The UI (interface/src/interop.ts) and MCP (packages/mcp-server) both shape
6
+ // through here, because two implementations drift: the MCP side was missing 16
7
+ // session keys, the visual-param strip and the LFO-generator reconcile, so a
8
+ // variation saved over MCP was not the same bytes as one saved from the window.
9
+ //
10
+ // This is the PURE half. It takes state plus the contract data and returns the
11
+ // shaped snapshot, so both callers produce identical bytes for identical input
12
+ // (pinned by interface/test/variationSnapshotParity.test.ts).
13
+ //
14
+ // The IMPURE half stays per-caller and is genuinely different: the UI can await
15
+ // `refreshLoadedPluginStateBlobs()` and stamp hosted-plugin identity/bypass from
16
+ // `pluginHostStore`; the headless bridge cannot reach either, and says so on the
17
+ // save result instead of writing a silently lossy slot.
18
+ //
19
+ // GENERATED COPY: packages/mcp-server/src/generated/variationSnapshot.ts is
20
+ // produced from this file by scripts/generate-variation-session-keys.mjs.
21
+ // Edit THIS file; the drift check fails if the copy is stale.
22
+ /**
23
+ * Force each `lfo{g}_enabled` flag to match whether that generator still has a
24
+ * live link.
25
+ *
26
+ * A generator whose links were all removed or disabled must not persist as
27
+ * enabled: on load it would re-arm a generator driving nothing, and the next
28
+ * link added to that slot would inherit an on state the user never set.
29
+ */
30
+ export function reconcileLfoGeneratorEnabledState(snapshot, lfoGeneratorCount) {
31
+ if (!Array.isArray(snapshot.lfos))
32
+ return;
33
+ const lfos = snapshot.lfos;
34
+ for (let generatorIndex = 1; generatorIndex <= lfoGeneratorCount; generatorIndex++) {
35
+ const hasEnabledLinks = lfos.some((lfo) => lfo?.lfoGeneratorIndex === generatorIndex &&
36
+ (lfo?.enabled ?? 1) === 1 &&
37
+ typeof lfo?.paramId === 'string' &&
38
+ lfo.paramId.length > 0);
39
+ snapshot[`lfo${generatorIndex}_enabled`] = hasEnabledLinks ? 1 : 0;
40
+ }
41
+ }
42
+ /**
43
+ * Shape a variation snapshot from plugin state.
44
+ *
45
+ * Order matters and is part of the contract: strip session keys, drop the
46
+ * active-preset path, strip visual params, narrow for FX products, then
47
+ * reconcile the LFO generator flags LAST — the reconcile reads `lfos`, which
48
+ * the earlier steps may have removed.
49
+ */
50
+ export function buildVariationSnapshotBase(state, contract, options = {}) {
51
+ const snapshot = { ...state };
52
+ for (const key of contract.sessionKeys)
53
+ delete snapshot[key];
54
+ delete snapshot.activePresetPath;
55
+ for (const paramId of contract.visualParamIds)
56
+ delete snapshot[paramId];
57
+ if (options.isFxProduct)
58
+ delete snapshot.vary;
59
+ reconcileLfoGeneratorEnabledState(snapshot, contract.lfoGeneratorCount);
60
+ return snapshot;
61
+ }
62
+ //# sourceMappingURL=variationSnapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variationSnapshot.js","sourceRoot":"","sources":["../../src/generated/variationSnapshot.ts"],"names":[],"mappings":"AAAA,oEAAoE;AACpE,+DAA+D;AAC/D,sDAAsD;AACtD,EAAE;AACF,6EAA6E;AAC7E,+EAA+E;AAC/E,6EAA6E;AAC7E,gFAAgF;AAChF,EAAE;AACF,+EAA+E;AAC/E,+EAA+E;AAC/E,8DAA8D;AAC9D,EAAE;AACF,gFAAgF;AAChF,iFAAiF;AACjF,iFAAiF;AACjF,wDAAwD;AACxD,EAAE;AACF,4EAA4E;AAC5E,0EAA0E;AAC1E,8DAA8D;AAuB9D;;;;;;;GAOG;AACH,MAAM,UAAU,iCAAiC,CAC/C,QAAiC,EACjC,iBAAyB;IAEzB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,OAAM;IACzC,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAiB,CAAA;IAEvC,KAAK,IAAI,cAAc,GAAG,CAAC,EAAE,cAAc,IAAI,iBAAiB,EAAE,cAAc,EAAE,EAAE,CAAC;QACnF,MAAM,eAAe,GAAG,IAAI,CAAC,IAAI,CAC/B,CAAC,GAAG,EAAE,EAAE,CACN,GAAG,EAAE,iBAAiB,KAAK,cAAc;YACzC,CAAC,GAAG,EAAE,OAAO,IAAI,CAAC,CAAC,KAAK,CAAC;YACzB,OAAO,GAAG,EAAE,OAAO,KAAK,QAAQ;YAChC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CACzB,CAAA;QACD,QAAQ,CAAC,MAAM,cAAc,UAAU,CAAC,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IACpE,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,0BAA0B,CACxC,KAA8B,EAC9B,QAAmC,EACnC,UAAoC,EAAE;IAEtC,MAAM,QAAQ,GAA4B,EAAE,GAAG,KAAK,EAAE,CAAA;IAEtD,KAAK,MAAM,GAAG,IAAI,QAAQ,CAAC,WAAW;QAAE,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC5D,OAAO,QAAQ,CAAC,gBAAgB,CAAA;IAChC,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,cAAc;QAAE,OAAO,QAAQ,CAAC,OAAO,CAAC,CAAA;IACvE,IAAI,OAAO,CAAC,WAAW;QAAE,OAAO,QAAQ,CAAC,IAAI,CAAA;IAE7C,iCAAiC,CAAC,QAAQ,EAAE,QAAQ,CAAC,iBAAiB,CAAC,CAAA;IACvE,OAAO,QAAQ,CAAA;AACjB,CAAC"}