@map-audio/pam-mcp-server 1.25.0 → 1.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +32 -10
- package/dist/audioAnalysis.d.ts +1 -1
- package/dist/audioAnalysis.js +3 -4
- package/dist/audioAnalysis.js.map +1 -1
- package/dist/bridge.d.ts +5 -1
- package/dist/bridge.js +48 -48
- package/dist/bridge.js.map +1 -1
- package/dist/daemon.d.ts +32 -0
- package/dist/daemon.js +871 -0
- package/dist/daemon.js.map +7 -0
- package/dist/drumSynth.d.ts +12 -0
- package/dist/drumSynth.js +15 -3
- package/dist/drumSynth.js.map +1 -1
- package/dist/drumSynthEngines.json +9 -1
- package/dist/{fgemma-format.d.ts → functiongemma-format.d.ts} +25 -7
- package/dist/{fgemma-format.js → functiongemma-format.js} +34 -11
- package/dist/functiongemma-format.js.map +1 -0
- package/dist/functiongemma-grammar.d.ts +14 -0
- package/dist/functiongemma-grammar.js +140 -0
- package/dist/functiongemma-grammar.js.map +1 -0
- package/dist/functiongemma-params.d.ts +33 -0
- package/dist/functiongemma-params.js +128 -0
- package/dist/functiongemma-params.js.map +1 -0
- package/dist/{fgemma-runner.d.ts → functiongemma-runner.d.ts} +8 -5
- package/dist/{fgemma-runner.js → functiongemma-runner.js} +107 -25
- package/dist/functiongemma-runner.js.map +1 -0
- package/dist/generated/kvWriteOptions.d.ts +20 -0
- package/dist/generated/kvWriteOptions.js +45 -0
- package/dist/generated/kvWriteOptions.js.map +1 -0
- package/dist/generated/variationSnapshot.js +0 -19
- package/dist/generated/variationSnapshot.js.map +1 -1
- package/dist/generativePlayerPresets.json +9 -0
- package/dist/generativePlayers.json +15 -1
- package/dist/launcher.d.ts +2 -0
- package/dist/launcher.js +36 -0
- package/dist/launcher.js.map +1 -0
- package/dist/manifest-mfx.json +12944 -311
- package/dist/manifest-msq.json +11446 -0
- package/dist/manifest.d.ts +2 -0
- package/dist/manifest.js +12 -27
- package/dist/manifest.js.map +1 -1
- package/dist/manifest.json +37047 -6487
- package/dist/mfxCombos.d.ts +2 -0
- package/dist/mfxCombos.js +179 -56
- package/dist/mfxCombos.js.map +1 -1
- package/dist/midiFile.d.ts +20 -6
- package/dist/midiFile.js +22 -14
- package/dist/midiFile.js.map +1 -1
- package/dist/mixAssist.d.ts +35 -0
- package/dist/mixAssist.js +250 -21
- package/dist/mixAssist.js.map +1 -1
- package/dist/patternLanes.d.ts +40 -0
- package/dist/patternLanes.js +108 -0
- package/dist/patternLanes.js.map +1 -0
- package/dist/players.d.ts +22 -0
- package/dist/players.js +70 -0
- package/dist/players.js.map +1 -1
- package/dist/presetSave.d.ts +3 -0
- package/dist/presetSave.js +13 -0
- package/dist/presetSave.js.map +1 -1
- package/dist/productProfile.d.ts +4 -4
- package/dist/productProfile.js +10 -1
- package/dist/productProfile.js.map +1 -1
- package/dist/qwen-format.d.ts +85 -0
- package/dist/qwen-format.js +355 -0
- package/dist/qwen-format.js.map +1 -0
- package/dist/registration.mjs +41 -0
- package/dist/server.js +2112 -470
- package/dist/server.js.map +1 -1
- package/dist/targetDenylist.json +20 -0
- package/dist/variationSessionKeys.json +7 -5
- package/package.json +13 -7
- package/dist/fgemma-format.js.map +0 -1
- package/dist/fgemma-runner.js.map +0 -1
- package/dist/manifest-cell1.json +0 -12968
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../daemon/client/src/index.ts", "../../../daemon/client/src/generated/protocol.ts", "../../../daemon/client/src/codec.ts", "../src/daemon.ts"],
|
|
4
|
+
"sourcesContent": ["import { constants } from 'node:fs'\nimport { lstat, open, readFile } from 'node:fs/promises'\nimport { Socket } from 'node:net'\n\nimport { decodeBody, frameBodyLength, isErrorEnvelope, isEventEnvelope, isRecord, isResponseEnvelope, ProtocolCodec, ProtocolError } from './codec.js'\nimport {\n FRAME_HEADER_BYTES,\n LIMITS,\n MAX_FRAME_BODY_BYTES,\n PROTOCOL_VERSION,\n isErrorCode,\n type ErrorCode,\n type EventEnvelope,\n type Method,\n} from './generated/protocol.js'\n\nexport * from './codec.js'\nexport * from './generated/protocol.js'\n\nconst LOOPBACK_ADDRESS = '127.0.0.1'\nconst TOKEN = /^[A-Za-z0-9_-]{42}[AEIMQUYcgkosw048]$/\nconst MAX_REQUEST_ID = 18_446_744_073_709_551_615n\nconst MAX_OWNER_FILE_BYTES = 64 * 1024\n// Darwin's open(2) flag that takes a shared flock(2) lock; Node does not export it.\nconst O_SHLOCK = 0x10\n\n// `code` falls back to `unavailable` for a code this client predates; `wireCode` keeps what the server sent.\nexport class PamdApiError extends Error {\n readonly code: ErrorCode\n\n constructor(\n readonly wireCode: string,\n message: string,\n ) {\n super(message)\n this.name = 'PamdApiError'\n this.code = isErrorCode(wireCode) ? wireCode : 'unavailable'\n }\n}\n\nexport interface Transport {\n write(bytes: Uint8Array): Promise<void>\n readExactly(bytes: number): Promise<Uint8Array>\n close(): void\n}\n\nexport type EventListener = (event: EventEnvelope) => void\n\nfunction assertToken(token: string): void {\n if (!TOKEN.test(token)) throw new TypeError('PAM token must encode 32 bytes as unpadded base64url')\n}\n\nexport interface RequestOptions {\n timeoutMs?: number\n signal?: AbortSignal\n}\n\ninterface PendingRequest {\n resolve: (value: unknown) => void\n reject: (error: Error) => void\n deadline: number\n timer: ReturnType<typeof setTimeout>\n dispatched: boolean\n removeAbort: () => void\n}\n\nexport class PamdClient {\n private nextRequestId = 1n\n private readonly pending = new Map<string, PendingRequest>()\n private readonly retired = new Set<string>()\n private writeQueue = Promise.resolve()\n private queuedBytes = 0\n private writing: string | undefined\n private failure: Error | undefined\n private closed = false\n private readonly authentication: Promise<void>\n private events: EventEnvelope[] = []\n private eventBytes = 0\n private eventDispatch: ReturnType<typeof setImmediate> | undefined\n\n constructor(\n private readonly transport: Transport,\n token: string,\n private readonly onEvent: EventListener = () => {},\n authenticationTimeoutMs = 5000,\n ) {\n assertToken(token)\n this.authentication = this.submit<{ authenticated?: boolean }>('system.authenticate', { token },\n { timeoutMs: authenticationTimeoutMs }, true).then((result) => {\n if (result?.authenticated !== true) throw new PamdApiError('auth_failed', 'server did not confirm authentication')\n })\n void this.authentication.catch((error: unknown) => this.fail(this.asError(error)))\n void this.readLoop()\n }\n\n ready(): Promise<void> { return this.authentication }\n connectionError(): Error | undefined { return this.failure }\n\n request<T>(method: Method, params: Record<string, unknown> = {}, options: RequestOptions = {}): Promise<T> {\n return this.submit<T>(method, params, options)\n }\n\n close(): void {\n this.closed = true\n this.fail(new PamdApiError('unavailable', 'client closed'))\n if (this.eventDispatch !== undefined) clearImmediate(this.eventDispatch)\n this.events = []\n this.eventBytes = 0\n }\n\n private submit<T>(method: Method, params: Record<string, unknown>, options: RequestOptions, authenticating = false): Promise<T> {\n if (this.failure !== undefined) return Promise.reject(this.failure)\n const timeout = options.timeoutMs ?? 30_000\n if (!Number.isFinite(timeout) || timeout <= 0 || timeout > 2_147_483_647) {\n return Promise.reject(new PamdApiError('timeout', 'invalid or expired request deadline'))\n }\n if (options.signal?.aborted) return Promise.reject(new PamdApiError('cancelled', 'request cancelled locally'))\n if (this.pending.size + this.retired.size >= LIMITS.maxInFlightRequests || this.nextRequestId > MAX_REQUEST_ID) {\n return Promise.reject(new PamdApiError('resource_exhausted', 'client request limit reached'))\n }\n const deadline = performance.now() + timeout\n const id = String(this.nextRequestId)\n let bytes: Uint8Array\n try {\n bytes = ProtocolCodec.encode({ major: PROTOCOL_VERSION.major, minor: PROTOCOL_VERSION.minor, id, method, params })\n } catch (error) { return Promise.reject(this.asError(error)) }\n if (this.queuedBytes + bytes.byteLength > LIMITS.maxQueuedOutboundBytes) {\n return Promise.reject(new PamdApiError('resource_exhausted', 'client outbound queue is full'))\n }\n ++this.nextRequestId\n this.queuedBytes += bytes.byteLength\n const result = new Promise<T>((resolve, reject) => {\n const abort = () => this.abandon(id, new PamdApiError('cancelled', 'request cancelled locally; remote work may continue'))\n const timer = setTimeout(() => this.abandon(id, new PamdApiError('timeout', 'request deadline expired; remote work may continue')),\n Math.max(0, deadline - performance.now()))\n this.pending.set(id, {\n resolve: (value) => resolve(value as T), reject, deadline, timer, dispatched: false,\n removeAbort: () => options.signal?.removeEventListener('abort', abort),\n })\n options.signal?.addEventListener('abort', abort, { once: true })\n if (options.signal?.aborted) abort()\n })\n this.writeQueue = this.writeQueue.then(async () => {\n if (!authenticating) await this.authentication\n const pending = this.pending.get(id)\n if (pending === undefined || this.failure !== undefined) return\n if (performance.now() >= pending.deadline) {\n this.abandon(id, new PamdApiError('timeout', 'request deadline expired'))\n return\n }\n pending.dispatched = true\n this.writing = id\n try { await this.transport.write(bytes) }\n finally { this.writing = undefined }\n }).catch((error: unknown) => this.fail(this.asError(error))).finally(() => { this.queuedBytes -= bytes.byteLength })\n return result\n }\n\n private remove(id: string): PendingRequest | undefined {\n const pending = this.pending.get(id)\n if (pending !== undefined) {\n this.pending.delete(id)\n clearTimeout(pending.timer)\n pending.removeAbort()\n }\n return pending\n }\n\n private abandon(id: string, error: Error): void {\n const pending = this.remove(id)\n if (pending === undefined) return\n pending.reject(error)\n if (this.writing === id) {\n this.fail(error)\n } else if (pending.dispatched) {\n this.retired.add(id)\n }\n }\n\n private asError(error: unknown): PamdApiError {\n if (error instanceof PamdApiError) return error\n return new PamdApiError(error instanceof ProtocolError ? error.code : 'unavailable',\n error instanceof Error ? error.message : String(error))\n }\n\n private fail(error: Error): void {\n if (this.failure !== undefined) return\n this.failure = error\n for (const id of this.pending.keys()) this.remove(id)?.reject(error)\n this.transport.close()\n }\n\n private queueEvent(event: EventEnvelope): void {\n if (this.failure !== undefined) return\n const size = Buffer.byteLength(JSON.stringify(event))\n if (this.events.length >= LIMITS.maxArrayItems || this.eventBytes + size > LIMITS.maxQueuedOutboundBytes) {\n throw new PamdApiError('resource_exhausted', 'client event queue is full')\n }\n this.events.push(event)\n this.eventBytes += size\n if (this.eventDispatch !== undefined) return\n this.eventDispatch = setImmediate(() => {\n this.eventDispatch = undefined\n const events = this.events\n this.events = []\n this.eventBytes = 0\n for (const event of events) {\n if (this.closed) break\n try { this.onEvent(event) } catch { /* A consumer callback cannot break control I/O. */ }\n }\n })\n }\n\n private async readLoop(): Promise<void> {\n try {\n while (this.failure === undefined) {\n const envelope = decodeBody(await this.transport.readExactly(frameBodyLength(await this.transport.readExactly(FRAME_HEADER_BYTES))))\n if (this.failure !== undefined) return\n if (isEventEnvelope(envelope)) { this.queueEvent(envelope); continue }\n if (!isErrorEnvelope(envelope) && !isResponseEnvelope(envelope)) throw new PamdApiError('invalid_request', 'server sent a request envelope')\n if (envelope.id === '0' && isErrorEnvelope(envelope)) throw new PamdApiError(envelope.error.code, envelope.error.message)\n const pending = this.pending.get(envelope.id)\n if (pending === undefined) {\n if (this.retired.delete(envelope.id)) continue\n throw new PamdApiError('invalid_request', 'server sent an unknown response id')\n }\n if (!pending.dispatched) throw new PamdApiError('invalid_request', 'server replied before request dispatch')\n this.remove(envelope.id)\n if (performance.now() >= pending.deadline) pending.reject(new PamdApiError('timeout', 'reply arrived after request deadline'))\n else if (isErrorEnvelope(envelope)) pending.reject(new PamdApiError(envelope.error.code, envelope.error.message))\n else pending.resolve(envelope.result)\n }\n } catch (error) { this.fail(this.asError(error)) }\n }\n}\n\n// Unread bytes stay as a chunk list so a burst of unsolicited frames costs linear copies, capped at the server's own queue limit.\nclass SocketTransport implements Transport {\n private chunks: Buffer[] = []\n private size = 0\n private waiter: (() => void) | undefined\n private failure: Error | undefined\n\n constructor(private readonly socket: Socket) {\n const limit = LIMITS.maxQueuedOutboundBytes + FRAME_HEADER_BYTES + MAX_FRAME_BODY_BYTES\n socket.on('data', (chunk: Buffer) => {\n this.chunks.push(chunk)\n this.size += chunk.byteLength\n if (this.size > limit) {\n this.fail(new Error('PAM server sent more unread data than the protocol allows'))\n socket.destroy()\n }\n this.wake()\n })\n socket.on('error', (error) => this.fail(error))\n socket.on('close', () => this.fail(new Error('PAM connection closed')))\n }\n\n private fail(error: Error): void {\n this.failure ??= error\n this.wake()\n }\n\n private wake(): void {\n this.waiter?.()\n this.waiter = undefined\n }\n\n write(bytes: Uint8Array): Promise<void> {\n return new Promise((resolve, reject) => {\n this.socket.write(bytes, (error) => error ? reject(error) : resolve())\n })\n }\n\n async readExactly(bytes: number): Promise<Uint8Array> {\n while (this.size < bytes) {\n if (this.failure !== undefined) throw this.failure\n await new Promise<void>((resolve) => { this.waiter = resolve })\n }\n const [only] = this.chunks\n const joined = this.chunks.length === 1 && only !== undefined ? only : Buffer.concat(this.chunks, this.size)\n const result = joined.subarray(0, bytes)\n const rest = joined.subarray(bytes)\n this.chunks = rest.byteLength > 0 ? [rest] : []\n this.size = rest.byteLength\n return result\n }\n\n close(): void {\n this.socket.destroy()\n }\n}\n\nexport async function connectPamd(port: number, token: string, onEvent?: EventListener, timeoutMs = 5000): Promise<PamdClient> {\n if (!Number.isInteger(port) || port < 1 || port > 65535) throw new RangeError('PAM port must be between 1 and 65535')\n if (!Number.isFinite(timeoutMs) || timeoutMs <= 0 || timeoutMs > 2_147_483_647) throw new RangeError('invalid connection timeout')\n assertToken(token)\n const deadline = performance.now() + timeoutMs\n const socket = new Socket()\n await new Promise<void>((resolve, reject) => {\n const timer = setTimeout(() => socket.destroy(new PamdApiError('timeout', 'connection deadline expired')), timeoutMs)\n const onError = (error: Error) => { clearTimeout(timer); reject(error instanceof PamdApiError ? error : new PamdApiError('unavailable', error.message)) }\n socket.once('error', onError)\n socket.connect(port, LOOPBACK_ADDRESS, () => {\n clearTimeout(timer)\n socket.removeListener('error', onError)\n resolve()\n })\n })\n const remaining = deadline - performance.now()\n if (remaining <= 0) { socket.destroy(); throw new PamdApiError('timeout', 'connection deadline expired') }\n const client = new PamdClient(new SocketTransport(socket), token, onEvent, remaining)\n try { await client.ready(); return client }\n catch (error) { client.close(); throw error }\n}\n\nexport interface DiscoveryRecord {\n protocolMajor: number\n protocolMinor: number\n address: typeof LOOPBACK_ADDRESS\n port: number\n processId: number\n daemonEpoch: string\n tokenFile: string\n}\n\n// Checks run on the opened descriptor, so a path swapped for a symlink after the check cannot be read.\nasync function readOwnerOnlyFile(path: string, label: string): Promise<string> {\n const handle = await open(path, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0))\n try {\n const stats = await handle.stat()\n const effectiveUserId = process.geteuid?.()\n if (!stats.isFile() || stats.size > MAX_OWNER_FILE_BYTES || (process.platform !== 'win32'\n && ((stats.mode & 0o077) !== 0 || effectiveUserId === undefined || stats.uid !== effectiveUserId))) {\n throw new PamdApiError('invalid_request', `${label} must be a small regular owner-only file`)\n }\n const buffer = Buffer.alloc(stats.size)\n const { bytesRead } = await handle.read(buffer, 0, stats.size, 0)\n return buffer.subarray(0, bytesRead).toString('utf8')\n } finally {\n await handle.close()\n }\n}\n\nexport async function readPamdDiscovery(path: string): Promise<DiscoveryRecord> {\n const record: unknown = JSON.parse(await readOwnerOnlyFile(path, 'PAM discovery record'))\n if (!isRecord(record) || record.protocolMajor !== PROTOCOL_VERSION.major || !Number.isInteger(record.protocolMinor)\n || Number(record.protocolMinor) < 0 || Number(record.protocolMinor) > 65535 || record.address !== LOOPBACK_ADDRESS\n || !Number.isInteger(record.port) || Number(record.port) < 1 || Number(record.port) > 65535\n || !Number.isSafeInteger(record.processId) || Number(record.processId) <= 0\n || typeof record.daemonEpoch !== 'string' || record.daemonEpoch.length === 0\n || typeof record.tokenFile !== 'string' || record.tokenFile.length === 0) {\n throw new PamdApiError('invalid_request', 'PAM discovery record is invalid or incompatible')\n }\n return {\n protocolMajor: record.protocolMajor,\n protocolMinor: Number(record.protocolMinor),\n address: LOOPBACK_ADDRESS,\n port: Number(record.port),\n processId: Number(record.processId),\n daemonEpoch: record.daemonEpoch,\n tokenFile: record.tokenFile,\n }\n}\n\nfunction errorCode(error: unknown): string | undefined {\n return isRecord(error) && typeof error.code === 'string' ? error.code : undefined\n}\n\nasync function linuxFlockHeld(lock: string): Promise<boolean> {\n const info = await lstat(lock, { bigint: true })\n const major = ((info.dev >> 8n) & 0xfffn) | ((info.dev >> 32n) & ~0xfffn)\n const minor = (info.dev & 0xffn) | ((info.dev >> 12n) & ~0xffn)\n const inode = `${major.toString(16).padStart(2, '0')}:${minor.toString(16).padStart(2, '0')}:${info.ino}`\n return (await readFile('/proc/locks', 'utf8')).split('\\n').some((line) => {\n const fields = line.trim().split(/\\s+/)\n return fields[1] === 'FLOCK' && fields[3] === 'WRITE' && fields[5] === inode\n })\n}\n\n// A running daemon holds `<discovery>.lock` exclusively; the probe never creates it.\nasync function daemonHoldsLock(discovery: string): Promise<boolean> {\n const lock = `${discovery}.lock`\n try {\n if (process.platform !== 'win32') {\n const info = await lstat(lock)\n if (!info.isFile() || info.uid !== process.geteuid?.() || (info.mode & 0o077) !== 0) {\n throw new PamdApiError('invalid_request', 'PAM discovery lock must be a regular owner-only file')\n }\n }\n if (process.platform === 'linux') return await linuxFlockHeld(lock)\n if (process.platform !== 'darwin' && process.platform !== 'win32') {\n throw new PamdApiError('unavailable', 'this platform cannot verify which PAM daemon owns discovery')\n }\n const flags = process.platform === 'darwin'\n ? constants.O_RDONLY | constants.O_NOFOLLOW | O_SHLOCK | constants.O_NONBLOCK : constants.O_RDONLY\n await (await open(lock, flags)).close()\n return false\n } catch (error) {\n if (error instanceof PamdApiError) throw error\n const code = errorCode(error)\n if (code === 'ENOENT') return false\n if (code === (process.platform === 'win32' ? 'EBUSY' : 'EAGAIN')) return true\n throw new PamdApiError('invalid_request', 'PAM discovery lock is unreadable or unsafe')\n }\n}\n\nexport async function connectPamdFromDiscovery(path: string, onEvent?: EventListener): Promise<PamdClient> {\n const unowned = new PamdApiError('unavailable', 'no running PAM daemon has published this discovery record')\n if (!await daemonHoldsLock(path)) throw unowned\n const record = await readPamdDiscovery(path).catch((error: unknown) => { throw errorCode(error) === 'ENOENT' ? unowned : error })\n const token = (await readOwnerOnlyFile(record.tokenFile, 'PAM token')).trim()\n // A starting daemon removes the unowned record before rotating, so an unchanged record belongs with this token.\n const confirmed = await readPamdDiscovery(path).catch(() => undefined)\n if (confirmed?.daemonEpoch !== record.daemonEpoch || confirmed.port !== record.port || confirmed.tokenFile !== record.tokenFile) {\n throw new PamdApiError('unavailable', 'the PAM daemon discovery record changed while connecting')\n }\n return connectPamd(record.port, token, onEvent)\n}\n", "// Generated by daemon/scripts/generate-api.mjs from daemon/contracts/v1.contract.json.\n// Authority SHA-256: 4d3e5917e0b8758adfb11ae65acc8c11fddecde38bb4254b5e7f7bdab7bca237\n\nexport const AUTHORITY_SHA256 = '4d3e5917e0b8758adfb11ae65acc8c11fddecde38bb4254b5e7f7bdab7bca237' as const;\nexport const PROTOCOL_VERSION = { major: 1, minor: 1 } as const;\nexport const FRAME_HEADER_BYTES = 4 as const;\nexport const MAX_FRAME_BODY_BYTES = 1048576 as const;\nexport const LIMITS = {\n maxClients: 32,\n maxInFlightRequests: 64,\n maxQueuedOutboundBytes: 4194304,\n maxPromptBytes: 8192,\n maxCataloguePageRecords: 100,\n maxArtifactEntries: 256,\n maxRequestIdDigits: 20,\n maxStringBytes: 65536,\n maxMcpMessageBytes: 786432,\n maxArrayItems: 256,\n maxObjectMembers: 128,\n maxJsonDepth: 32,\n maxErrorMessageBytes: 4096,\n maxRequiredFields: 64,\n} as const;\n\nexport const METHODS = [\n 'system.authenticate',\n 'system.capabilities',\n 'system.health',\n 'catalogue.list',\n 'catalogue.get',\n 'catalogue.install',\n 'catalogue.remove',\n 'session.open',\n 'session.status',\n 'session.close',\n 'model.load',\n 'model.unload',\n 'model.configure',\n 'render.submit',\n 'render.status',\n 'render.cancel',\n 'metrics.read',\n 'metrics.reset',\n 'system.shutdown',\n 'job.status',\n 'job.cancel',\n 'model.ps',\n 'mcp.open',\n 'mcp.message',\n 'job.result',\n 'pack.install',\n] as const;\nexport type Method = (typeof METHODS)[number];\nexport const METHOD_IDS = {\n 'system.authenticate': 0,\n 'system.capabilities': 1,\n 'system.health': 2,\n 'catalogue.list': 3,\n 'catalogue.get': 4,\n 'catalogue.install': 5,\n 'catalogue.remove': 6,\n 'session.open': 7,\n 'session.status': 8,\n 'session.close': 9,\n 'model.load': 10,\n 'model.unload': 11,\n 'model.configure': 12,\n 'render.submit': 13,\n 'render.status': 14,\n 'render.cancel': 15,\n 'metrics.read': 16,\n 'metrics.reset': 17,\n 'system.shutdown': 18,\n 'job.status': 19,\n 'job.cancel': 20,\n 'model.ps': 21,\n 'mcp.open': 22,\n 'mcp.message': 23,\n 'job.result': 24,\n 'pack.install': 25,\n} as const satisfies Record<Method, number>;\n\nexport const EVENTS = [\n 'catalogue.changed',\n 'session.error',\n 'render.progress',\n 'render.completed',\n 'job.changed',\n 'mcp.message',\n] as const;\nexport type Event = (typeof EVENTS)[number];\nexport const isEvent = (value: unknown): value is Event => typeof value === 'string' && (EVENTS as readonly string[]).includes(value);\nexport const EVENT_IDS = {\n 'catalogue.changed': 0,\n 'session.error': 1,\n 'render.progress': 2,\n 'render.completed': 3,\n 'job.changed': 4,\n 'mcp.message': 5,\n} as const satisfies Record<Event, number>;\n\nexport const ERROR_CODES = [\n 'auth_failed',\n 'frame_too_large',\n 'version_unsupported',\n 'invalid_request',\n 'method_not_found',\n 'not_found',\n 'not_admitted',\n 'resource_exhausted',\n 'session_not_owned',\n 'model_crashed',\n 'cancelled',\n 'timeout',\n 'unavailable',\n 'model_in_use',\n 'job_expired',\n 'daemon_restarted',\n 'result_too_large',\n 'pack_license_required',\n 'pack_not_found',\n 'pack_not_installed',\n 'pack_in_use',\n 'pack_catalog_unavailable',\n 'pack_download_failed',\n 'pack_signing_unavailable',\n 'pack_invalid',\n 'pack_install_failed',\n 'pack_unsupported_product',\n] as const;\nexport type ErrorCode = (typeof ERROR_CODES)[number];\nexport const isErrorCode = (value: unknown): value is ErrorCode => typeof value === 'string' && (ERROR_CODES as readonly string[]).includes(value);\nexport const ERROR_CODE_IDS = {\n 'auth_failed': 0,\n 'frame_too_large': 1,\n 'version_unsupported': 2,\n 'invalid_request': 3,\n 'method_not_found': 4,\n 'not_found': 5,\n 'not_admitted': 6,\n 'resource_exhausted': 7,\n 'session_not_owned': 8,\n 'model_crashed': 9,\n 'cancelled': 10,\n 'timeout': 11,\n 'unavailable': 12,\n 'model_in_use': 13,\n 'job_expired': 14,\n 'daemon_restarted': 15,\n 'result_too_large': 16,\n 'pack_license_required': 17,\n 'pack_not_found': 18,\n 'pack_not_installed': 19,\n 'pack_in_use': 20,\n 'pack_catalog_unavailable': 21,\n 'pack_download_failed': 22,\n 'pack_signing_unavailable': 23,\n 'pack_invalid': 24,\n 'pack_install_failed': 25,\n 'pack_unsupported_product': 26,\n} as const satisfies Record<ErrorCode, number>;\n\nexport interface ProtocolVersion {\n major: number;\n minor: number;\n}\n\nexport interface RequestEnvelope extends ProtocolVersion {\n id: string;\n method: Method;\n params: Record<string, unknown>;\n requiredFields?: readonly string[];\n [optionalField: string]: unknown;\n}\n\nexport interface EventEnvelope extends ProtocolVersion {\n event: string;\n data: unknown;\n requiredFields?: readonly string[];\n [optionalField: string]: unknown;\n}\n\nexport interface ResponseEnvelope extends ProtocolVersion {\n id: string;\n result: unknown;\n requiredFields?: readonly string[];\n [optionalField: string]: unknown;\n}\n\nexport interface ErrorEnvelope extends ProtocolVersion {\n id: string;\n error: { code: string; message: string; data?: unknown };\n requiredFields?: readonly string[];\n [optionalField: string]: unknown;\n}\n\nexport type Envelope = RequestEnvelope | EventEnvelope | ResponseEnvelope | ErrorEnvelope;\n", "import {\n FRAME_HEADER_BYTES,\n LIMITS,\n MAX_FRAME_BODY_BYTES,\n METHODS,\n PROTOCOL_VERSION,\n type Envelope,\n type ErrorEnvelope,\n type EventEnvelope,\n type ResponseEnvelope,\n type RequestEnvelope,\n type ErrorCode,\n} from './generated/protocol.js'\n\nexport class ProtocolError extends TypeError {\n constructor(message: string, readonly code: ErrorCode = 'invalid_request') {\n super(message)\n this.name = 'PamdProtocolError'\n }\n}\n\nconst textEncoder = new TextEncoder()\nconst textDecoder = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true })\n\nconst COMMON_FIELDS = ['major', 'minor', 'requiredFields']\nconst KIND_FIELDS: Readonly<Record<string, readonly string[]>> = {\n method: ['id', 'method', 'params'],\n event: ['event', 'data'],\n result: ['id', 'result'],\n error: ['id', 'error'],\n}\n\nexport function isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value)\n}\n\nfunction isDecimalRequestId(value: unknown): value is string {\n return typeof value === 'string' && /^(0|[1-9][0-9]*)$/.test(value) && value.length <= LIMITS.maxRequestIdDigits\n && BigInt(value) <= 18_446_744_073_709_551_615n\n}\n\nfunction isWireName(value: unknown): value is string {\n return typeof value === 'string' && value.length > 0 && textEncoder.encode(value).byteLength <= LIMITS.maxStringBytes\n}\n\nfunction validateJsonValue(value: unknown, depth = 1, opaqueMcp = false, opaqueString = false): void {\n if (depth > LIMITS.maxJsonDepth) throw new ProtocolError('JSON nesting exceeds the protocol limit')\n if (typeof value === 'string') {\n if (/[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?<![\\uD800-\\uDBFF])[\\uDC00-\\uDFFF]/.test(value)) {\n throw new ProtocolError('JSON string contains an unpaired surrogate')\n }\n if (textEncoder.encode(value).byteLength > (opaqueString ? LIMITS.maxMcpMessageBytes : LIMITS.maxStringBytes)) throw new ProtocolError('JSON string exceeds the protocol limit')\n } else if (typeof value === 'number' && !Number.isFinite(value)) {\n throw new ProtocolError('non-finite JSON number')\n } else if (Array.isArray(value)) {\n if (value.length > LIMITS.maxArrayItems) throw new ProtocolError('JSON array exceeds the protocol limit')\n for (const item of value) validateJsonValue(item, depth + 1)\n } else if (isRecord(value)) {\n const entries = Object.entries(value)\n if (entries.length > LIMITS.maxObjectMembers) throw new ProtocolError('JSON object exceeds the protocol limit')\n for (const [key, item] of entries) {\n validateJsonValue(key)\n validateJsonValue(item, depth + 1, opaqueMcp && ['params', 'data', 'result'].includes(key), opaqueMcp && ['message', 'resultJson'].includes(key))\n }\n } else if (value !== null && typeof value !== 'boolean' && typeof value !== 'number') {\n throw new ProtocolError('value is not representable in JSON')\n }\n}\n\nfunction parseBody(text: string): unknown {\n const stack: Array<Set<string> | undefined> = []\n const tokens = /\"(?:[^\"\\\\\\u0000-\\u001f]|\\\\(?:[\"\\\\/bfnrt]|u[0-9a-fA-F]{4}))*\"|[{}\\[\\]]/g\n for (const match of text.matchAll(tokens)) {\n const token = match[0]\n if (token === '{' || token === '[') {\n stack.push(token === '{' ? new Set() : undefined)\n if (stack.length > LIMITS.maxJsonDepth) throw new ProtocolError('JSON nesting exceeds the protocol limit')\n } else if (token === '}' || token === ']') {\n stack.pop()\n } else {\n let next = match.index + token.length\n while (next < text.length && /[ \\t\\r\\n]/.test(text[next]!)) ++next\n if (text[next] === ':') {\n const key: string = JSON.parse(token)\n const keys = stack.at(-1)\n if (keys?.has(key)) throw new ProtocolError('duplicate JSON object key')\n keys?.add(key)\n }\n }\n }\n return JSON.parse(text)\n}\n\nfunction validateRequiredFields(value: Record<string, unknown>, kind: string): void {\n if (!Object.hasOwn(value, 'requiredFields')) return\n const fields = value.requiredFields\n if (!Array.isArray(fields) || fields.length > LIMITS.maxRequiredFields || new Set(fields).size !== fields.length) {\n throw new ProtocolError('requiredFields is invalid')\n }\n const known = [...COMMON_FIELDS, ...(KIND_FIELDS[kind] ?? [])]\n for (const field of fields) {\n if (typeof field !== 'string') throw new ProtocolError('requiredFields contains a non-string value')\n if (!known.includes(field) || !Object.hasOwn(value, field)) {\n throw new ProtocolError(`envelope requires an unsupported field: ${field}`, 'version_unsupported')\n }\n }\n}\n\n// Events and error codes are open sets: a newer minor may add values, so only their shape is checked here.\nfunction validateEnvelope(value: unknown): asserts value is Envelope {\n const opaqueMcp = isRecord(value) && (value.method === 'mcp.message' || value.method === 'job.result'\n || value.event === 'mcp.message' || Object.hasOwn(value, 'result'))\n validateJsonValue(value, 1, opaqueMcp)\n if (!isRecord(value)) throw new ProtocolError('protocol envelope must be an object')\n if (!Number.isInteger(value.major) || Number(value.major) < 0 || Number(value.major) > 65535\n || !Number.isInteger(value.minor) || Number(value.minor) < 0 || Number(value.minor) > 65535) {\n throw new ProtocolError('invalid protocol version')\n }\n if (value.major !== PROTOCOL_VERSION.major) throw new ProtocolError('unsupported protocol major', 'version_unsupported')\n\n const discriminators = Object.keys(KIND_FIELDS).filter((field) => Object.hasOwn(value, field))\n const kind = discriminators[0]\n if (discriminators.length !== 1 || kind === undefined) throw new ProtocolError('protocol envelope must contain one discriminator')\n\n if (kind === 'method') {\n if (!isDecimalRequestId(value.id) || typeof value.method !== 'string' || !isRecord(value.params)) {\n throw new ProtocolError('invalid request envelope')\n }\n if (!METHODS.some((method) => method === value.method)) throw new ProtocolError('unknown method', 'method_not_found')\n } else if (kind === 'event') {\n if (!isWireName(value.event) || !Object.hasOwn(value, 'data')) throw new ProtocolError('invalid event envelope')\n } else if (kind === 'result') {\n if (!isDecimalRequestId(value.id)) throw new ProtocolError('invalid response envelope')\n } else if (!isDecimalRequestId(value.id) || !isRecord(value.error) || !isWireName(value.error.code)\n || typeof value.error.message !== 'string' || textEncoder.encode(value.error.message).byteLength > LIMITS.maxErrorMessageBytes) {\n throw new ProtocolError('invalid error envelope')\n }\n validateRequiredFields(value, kind)\n}\n\nexport const isEventEnvelope = (envelope: Envelope): envelope is EventEnvelope => Object.hasOwn(envelope, 'event')\nexport const isErrorEnvelope = (envelope: Envelope): envelope is ErrorEnvelope => Object.hasOwn(envelope, 'error')\nexport const isResponseEnvelope = (envelope: Envelope): envelope is ResponseEnvelope => Object.hasOwn(envelope, 'result')\nexport const isRequestEnvelope = (envelope: Envelope): envelope is RequestEnvelope => Object.hasOwn(envelope, 'method')\n\nfunction readNetworkLength(header: Uint8Array): number {\n return new DataView(header.buffer, header.byteOffset, header.byteLength).getUint32(0, false)\n}\n\nexport function frameBodyLength(header: Uint8Array): number {\n if (header.byteLength !== FRAME_HEADER_BYTES) throw new ProtocolError('invalid protocol frame header')\n const bodyBytes = readNetworkLength(header)\n if (bodyBytes === 0) throw new ProtocolError('empty protocol frame')\n if (bodyBytes > MAX_FRAME_BODY_BYTES) throw new ProtocolError('protocol frame exceeds its limit', 'frame_too_large')\n return bodyBytes\n}\n\nexport function decodeBody(body: Uint8Array): Envelope {\n if (body.byteLength === 0) throw new ProtocolError('empty protocol body')\n if (body.byteLength > MAX_FRAME_BODY_BYTES) throw new ProtocolError('protocol body exceeds its limit', 'frame_too_large')\n try {\n const value = parseBody(textDecoder.decode(body))\n validateEnvelope(value)\n return value\n } catch (error) {\n if (error instanceof ProtocolError) throw error\n throw new ProtocolError('malformed UTF-8 JSON body')\n }\n}\n\nexport class ProtocolCodec {\n private header = new Uint8Array(FRAME_HEADER_BYTES)\n private headerSize = 0\n private body = new Uint8Array(0)\n private bodySize = 0\n\n static encode(envelope: Envelope): Uint8Array {\n validateEnvelope(envelope)\n const body = textEncoder.encode(JSON.stringify(envelope))\n if (body.byteLength > MAX_FRAME_BODY_BYTES) throw new ProtocolError('protocol body exceeds its limit', 'frame_too_large')\n\n const frame = new Uint8Array(FRAME_HEADER_BYTES + body.byteLength)\n new DataView(frame.buffer).setUint32(0, body.byteLength, false)\n frame.set(body, FRAME_HEADER_BYTES)\n return frame\n }\n\n push(bytes: Uint8Array): readonly Envelope[] {\n const output: Envelope[] = []\n let offset = 0\n try {\n while (offset < bytes.byteLength) {\n if (this.headerSize < FRAME_HEADER_BYTES) {\n const count = Math.min(FRAME_HEADER_BYTES - this.headerSize, bytes.byteLength - offset)\n this.header.set(bytes.subarray(offset, offset + count), this.headerSize)\n this.headerSize += count\n offset += count\n if (this.headerSize < FRAME_HEADER_BYTES) continue\n\n this.body = new Uint8Array(frameBodyLength(this.header))\n this.bodySize = 0\n }\n\n const count = Math.min(this.body.byteLength - this.bodySize, bytes.byteLength - offset)\n this.body.set(bytes.subarray(offset, offset + count), this.bodySize)\n this.bodySize += count\n offset += count\n if (this.bodySize !== this.body.byteLength) continue\n\n output.push(decodeBody(this.body))\n this.reset()\n }\n return output\n } catch (error) {\n this.reset()\n throw error\n }\n }\n\n reset(): void {\n this.header.fill(0)\n this.headerSize = 0\n this.body = new Uint8Array(0)\n this.bodySize = 0\n }\n}\n", "import { connectPamdFromDiscovery, PamdApiError, type PamdClient, type Method } from '@mapaudio/pamd-client';\nimport { createHash, randomUUID } from 'node:crypto';\nimport { constants } from 'node:fs';\nimport { mkdir, open, realpath, rename, unlink } from 'node:fs/promises';\nimport { basename, dirname, isAbsolute, join } from 'node:path';\nimport { setTimeout as delay } from 'node:timers/promises';\n\ntype RecordValue = Record<string, unknown>;\nfunction record(value: unknown): value is RecordValue {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\nfunction failure(code: string, message: string, detail: RecordValue = {}): Error {\n return new Error(JSON.stringify({ ok: false, code, error: message, ...detail }));\n}\nfunction daemonError(error: unknown, detail: RecordValue): Error {\n if (error instanceof PamdApiError) return failure(error.wireCode, error.message, detail);\n if (error instanceof Error && error.message.startsWith('{\"ok\":false,')) return error;\n return failure('unavailable', error instanceof Error ? error.message : String(error), detail);\n}\n\nexport interface DaemonDownload {\n model: string;\n jobId: string;\n daemonEpoch: string;\n requestKey: string;\n}\n\nexport class DaemonSession {\n private client?: Promise<PamdClient>;\n private closing = false;\n private readonly calls = new Map<AbortController, string>();\n\n constructor(private readonly discovery: string, private readonly dataRoot: string,\n private readonly outputDirectory: string) {}\n\n private connection(): Promise<PamdClient> {\n if (this.closing) throw failure('cancelled', 'Plugin session is closing');\n // A failed connection stays failed: reconnecting must never replay a mutation.\n return this.client ??= connectPamdFromDiscovery(this.discovery);\n }\n\n private async job(method: Method, params: RecordValue, signal?: AbortSignal): Promise<RecordValue> {\n const controller = new AbortController();\n const requestKey = randomUUID();\n const cancel = () => {\n controller.abort();\n if (this.client) void this.client.then(client => this.cancelRequest(client, requestKey)).catch(() => {});\n };\n signal?.addEventListener('abort', cancel, { once: true });\n if (signal?.aborted) controller.abort();\n this.calls.set(controller, requestKey);\n let jobId: string | undefined;\n let daemonEpoch: string | undefined;\n try {\n if (controller.signal.aborted) throw failure('cancelled', 'Request cancelled');\n const client = await this.connection();\n if (controller.signal.aborted) throw failure('cancelled', 'Request cancelled');\n const accepted = await this.submit(client, method, params, requestKey);\n jobId = accepted.jobId;\n daemonEpoch = accepted.daemonEpoch;\n let snapshot: RecordValue = accepted;\n const deadline = performance.now() + 5 * 60 * 1000;\n let cancellationSent = false;\n for (;;) {\n if (snapshot.jobId !== jobId || snapshot.daemonEpoch !== daemonEpoch)\n throw failure('daemon_restarted', 'Job identity changed', { jobId, daemonEpoch, requestKey });\n if (typeof snapshot.progress !== 'number' || !Number.isFinite(snapshot.progress) || snapshot.progress < 0 || snapshot.progress > 1)\n throw failure('invalid_result', 'Invalid daemon job progress', { jobId, daemonEpoch, requestKey });\n if (snapshot.state === 'succeeded') {\n if (controller.signal.aborted) throw failure('cancelled', 'Request cancelled', { jobId, daemonEpoch, requestKey });\n if (!record(snapshot.result)) throw failure('invalid_result', 'Daemon job has no result');\n return snapshot.result;\n }\n if (snapshot.state === 'failed' || snapshot.state === 'cancelled') {\n const detail = record(snapshot.error) ? snapshot.error : {};\n throw failure(String(detail.code ?? 'invalid_result'), String(detail.message ?? 'Daemon job failed'), { jobId, daemonEpoch, requestKey });\n }\n if (snapshot.state !== 'queued' && snapshot.state !== 'running') throw failure('invalid_result', 'Invalid daemon job state');\n if (controller.signal.aborted && !cancellationSent) {\n await client.request('job.cancel', { jobId }, { timeoutMs: 500 });\n cancellationSent = true;\n }\n if (performance.now() >= deadline) throw failure('timeout', 'Inspect this job before retrying', { jobId, daemonEpoch, requestKey });\n await delay(25);\n snapshot = await client.request<RecordValue>('job.status', { jobId, expectedEpoch: daemonEpoch }, { timeoutMs: 5000 });\n if (!record(snapshot)) throw failure('invalid_result', 'Invalid daemon job snapshot');\n }\n } catch (error) {\n throw daemonError(error, { ...(jobId ? { jobId, daemonEpoch } : {}), requestKey });\n } finally {\n this.calls.delete(controller);\n signal?.removeEventListener('abort', cancel);\n }\n }\n\n private async submit(client: PamdClient, method: Method, params: RecordValue, requestKey: string) {\n const snapshot = await client.request<RecordValue>(method, { ...params, requestKey }, { timeoutMs: 5000 });\n if (!record(snapshot) || typeof snapshot.jobId !== 'string' || !snapshot.jobId\n || typeof snapshot.daemonEpoch !== 'string' || !snapshot.daemonEpoch)\n throw failure('invalid_result', 'Daemon returned no job identity', { requestKey });\n return snapshot as RecordValue & { jobId: string; daemonEpoch: string };\n }\n\n async remove(modelId: string, signal?: AbortSignal): Promise<RecordValue> {\n await this.job('catalogue.remove', { modelId }, signal);\n return { ok: true, model: modelId };\n }\n\n // Downloads outlive the MCP request: a client timeout must not cancel a multi-GB pull.\n async startDownload(modelId: string): Promise<DaemonDownload & RecordValue> {\n const requestKey = randomUUID();\n try {\n const { jobId, daemonEpoch, state, progress } = await this.submit(await this.connection(), 'catalogue.install', { modelId }, requestKey);\n return { ok: true, model: modelId, jobId, daemonEpoch, requestKey, state, progress };\n } catch (error) { throw daemonError(error, { requestKey }); }\n }\n\n async downloadStatus({ model, jobId, daemonEpoch, requestKey }: DaemonDownload): Promise<RecordValue> {\n try {\n const snapshot = await (await this.connection()).request<RecordValue>('job.status', { jobId, expectedEpoch: daemonEpoch }, { timeoutMs: 5000 });\n if (!record(snapshot) || snapshot.jobId !== jobId || snapshot.daemonEpoch !== daemonEpoch)\n throw failure('daemon_restarted', 'Job identity changed', { jobId, daemonEpoch, requestKey });\n const { state, progress, error } = snapshot;\n return { model, jobId, daemonEpoch, requestKey, state, progress, inFlight: state === 'queued' || state === 'running',\n ...(state === 'succeeded' ? { downloaded: true } : {}), ...(record(error) ? { error } : {}) };\n } catch (error) { throw daemonError(error, { jobId, daemonEpoch, requestKey }); }\n }\n\n async generate(args: { prompt: string; category: string; durationSeconds: number; seed?: number }, signal?: AbortSignal): Promise<RecordValue> {\n const result = await this.job('render.submit', { modelId: 'stable-audio-3-small-sfx',\n prompt: args.prompt, category: args.category, durationSeconds: args.durationSeconds, seed: args.seed ?? 0 }, signal);\n if (signal?.aborted || this.closing) throw failure('cancelled', 'Request cancelled');\n try {\n const wavPath = await this.publish(result, signal);\n return { ok: true, wavPath, sampleRate: result.sampleRate, seed: result.seed };\n } catch (error) {\n if (error instanceof Error && error.message.startsWith('{\"ok\":false,')) throw error;\n throw failure('unavailable', error instanceof Error ? error.message : String(error));\n }\n }\n\n private async publish(result: RecordValue, signal?: AbortSignal): Promise<string> {\n if (typeof result.path !== 'string' || !isAbsolute(result.path)\n || typeof result.fileSha256 !== 'string' || !/^[a-f0-9]{64}$/.test(result.fileSha256)\n || !Number.isInteger(result.seed) || Number(result.seed) <= 0 || Number(result.seed) > 4294967295\n || !Number.isInteger(result.sampleRate) || Number(result.sampleRate) <= 0 || Number(result.sampleRate) > 384000)\n throw failure('invalid_result', 'Daemon returned invalid render metadata');\n const source = await realpath(result.path);\n const root = await realpath(join(this.dataRoot, 'pam-renders'));\n if (dirname(dirname(source)) !== root || basename(source) !== 'audio.wav')\n throw failure('invalid_result', 'Render artifact escapes the daemon render directory');\n await mkdir(this.outputDirectory, { recursive: true });\n const output = await realpath(this.outputDirectory);\n const destination = join(output, `${randomUUID()}.wav`);\n const partial = `${destination}.partial`;\n let published = false;\n let partialCreated = false;\n const input = await open(source, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));\n try {\n if (!(await input.stat()).isFile()) throw failure('invalid_result', 'Render artifact is not a regular file');\n const reserved = await open(destination, 'wx', 0o600);\n await reserved.close();\n try {\n const target = await open(partial, 'wx', 0o600);\n partialCreated = true;\n try {\n const hash = createHash('sha256');\n const bytes = Buffer.alloc(65536);\n for (;;) {\n if (signal?.aborted || this.closing) throw failure('cancelled', 'Request cancelled');\n const { bytesRead } = await input.read(bytes, 0, bytes.length, null);\n if (!bytesRead) break;\n hash.update(bytes.subarray(0, bytesRead));\n let offset = 0;\n while (offset < bytesRead) {\n const written = await target.write(bytes, offset, bytesRead - offset);\n if (!written.bytesWritten) throw failure('unavailable', 'Cannot copy render artifact');\n offset += written.bytesWritten;\n }\n }\n if (hash.digest('hex') !== result.fileSha256) throw failure('invalid_result', 'Render artifact failed integrity verification');\n } finally { await target.close(); }\n if (signal?.aborted || this.closing) throw failure('cancelled', 'Request cancelled');\n await rename(partial, destination);\n published = true;\n return join(this.outputDirectory, basename(destination));\n } finally {\n if (partialCreated) await unlink(partial).catch(() => {});\n if (!published) await unlink(destination).catch(() => {});\n }\n } finally { await input.close(); }\n }\n\n private async cancelRequest(client: PamdClient, requestKey: string): Promise<void> {\n try {\n const snapshot = await client.request<RecordValue>('job.status', { requestKey }, { timeoutMs: 300 });\n if (record(snapshot) && typeof snapshot.jobId === 'string' && (snapshot.state === 'queued' || snapshot.state === 'running'))\n await client.request('job.cancel', { jobId: snapshot.jobId }, { timeoutMs: 300 });\n } catch {}\n }\n\n async close(): Promise<void> {\n this.closing = true;\n for (const call of this.calls.keys()) call.abort();\n if (!this.client) return;\n try {\n const client = await this.client;\n await Promise.all([...this.calls.values()].map(key => this.cancelRequest(client, key)));\n // Keep control I/O alive for a submit already in flight to reveal its accepted job.\n const deadline = performance.now() + 500;\n while (this.calls.size && performance.now() < deadline) await delay(10);\n client.close();\n } catch {}\n }\n}\n"],
|
|
5
|
+
"mappings": ";AAAA,SAAS,iBAAiB;AAC1B,SAAS,OAAO,MAAM,gBAAgB;AACtC,SAAS,cAAc;;;ACEhB,IAAM,mBAAmB,EAAE,OAAO,GAAG,OAAO,EAAE;AAC9C,IAAM,qBAAqB;AAC3B,IAAM,uBAAuB;AAC7B,IAAM,SAAS;AAAA,EACpB,YAAY;AAAA,EACZ,qBAAqB;AAAA,EACrB,wBAAwB;AAAA,EACxB,gBAAgB;AAAA,EAChB,yBAAyB;AAAA,EACzB,oBAAoB;AAAA,EACpB,oBAAoB;AAAA,EACpB,gBAAgB;AAAA,EAChB,oBAAoB;AAAA,EACpB,eAAe;AAAA,EACf,kBAAkB;AAAA,EAClB,cAAc;AAAA,EACd,sBAAsB;AAAA,EACtB,mBAAmB;AACrB;AAEO,IAAM,UAAU;AAAA,EACrB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAkDO,IAAM,cAAc;AAAA,EACzB;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEO,IAAM,cAAc,CAAC,UAAuC,OAAO,UAAU,YAAa,YAAkC,SAAS,KAAK;;;ACrH1I,IAAM,gBAAN,cAA4B,UAAU;AAAA,EAC3C,YAAY,SAA0B,OAAkB,mBAAmB;AACzE,UAAM,OAAO;AADuB;AAEpC,SAAK,OAAO;AAAA,EACd;AAAA,EAHsC;AAIxC;AAEA,IAAM,cAAc,IAAI,YAAY;AACpC,IAAM,cAAc,IAAI,YAAY,SAAS,EAAE,OAAO,MAAM,WAAW,KAAK,CAAC;AAE7E,IAAM,gBAAgB,CAAC,SAAS,SAAS,gBAAgB;AACzD,IAAM,cAA2D;AAAA,EAC/D,QAAQ,CAAC,MAAM,UAAU,QAAQ;AAAA,EACjC,OAAO,CAAC,SAAS,MAAM;AAAA,EACvB,QAAQ,CAAC,MAAM,QAAQ;AAAA,EACvB,OAAO,CAAC,MAAM,OAAO;AACvB;AAEO,SAAS,SAAS,OAAkD;AACzE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;AAEA,SAAS,mBAAmB,OAAiC;AAC3D,SAAO,OAAO,UAAU,YAAY,oBAAoB,KAAK,KAAK,KAAK,MAAM,UAAU,OAAO,sBACzF,OAAO,KAAK,KAAK;AACxB;AAEA,SAAS,WAAW,OAAiC;AACnD,SAAO,OAAO,UAAU,YAAY,MAAM,SAAS,KAAK,YAAY,OAAO,KAAK,EAAE,cAAc,OAAO;AACzG;AAEA,SAAS,kBAAkB,OAAgB,QAAQ,GAAG,YAAY,OAAO,eAAe,OAAa;AACnG,MAAI,QAAQ,OAAO,aAAc,OAAM,IAAI,cAAc,yCAAyC;AAClG,MAAI,OAAO,UAAU,UAAU;AAC7B,QAAI,yEAAyE,KAAK,KAAK,GAAG;AACxF,YAAM,IAAI,cAAc,4CAA4C;AAAA,IACtE;AACA,QAAI,YAAY,OAAO,KAAK,EAAE,cAAc,eAAe,OAAO,qBAAqB,OAAO,gBAAiB,OAAM,IAAI,cAAc,wCAAwC;AAAA,EACjL,WAAW,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,KAAK,GAAG;AAC/D,UAAM,IAAI,cAAc,wBAAwB;AAAA,EAClD,WAAW,MAAM,QAAQ,KAAK,GAAG;AAC/B,QAAI,MAAM,SAAS,OAAO,cAAe,OAAM,IAAI,cAAc,uCAAuC;AACxG,eAAW,QAAQ,MAAO,mBAAkB,MAAM,QAAQ,CAAC;AAAA,EAC7D,WAAW,SAAS,KAAK,GAAG;AAC1B,UAAM,UAAU,OAAO,QAAQ,KAAK;AACpC,QAAI,QAAQ,SAAS,OAAO,iBAAkB,OAAM,IAAI,cAAc,wCAAwC;AAC9G,eAAW,CAAC,KAAK,IAAI,KAAK,SAAS;AACjC,wBAAkB,GAAG;AACrB,wBAAkB,MAAM,QAAQ,GAAG,aAAa,CAAC,UAAU,QAAQ,QAAQ,EAAE,SAAS,GAAG,GAAG,aAAa,CAAC,WAAW,YAAY,EAAE,SAAS,GAAG,CAAC;AAAA,IAClJ;AAAA,EACF,WAAW,UAAU,QAAQ,OAAO,UAAU,aAAa,OAAO,UAAU,UAAU;AACpF,UAAM,IAAI,cAAc,oCAAoC;AAAA,EAC9D;AACF;AAEA,SAAS,UAAU,MAAuB;AACxC,QAAM,QAAwC,CAAC;AAC/C,QAAM,SAAS;AACf,aAAW,SAAS,KAAK,SAAS,MAAM,GAAG;AACzC,UAAM,QAAQ,MAAM,CAAC;AACrB,QAAI,UAAU,OAAO,UAAU,KAAK;AAClC,YAAM,KAAK,UAAU,MAAM,oBAAI,IAAI,IAAI,MAAS;AAChD,UAAI,MAAM,SAAS,OAAO,aAAc,OAAM,IAAI,cAAc,yCAAyC;AAAA,IAC3G,WAAW,UAAU,OAAO,UAAU,KAAK;AACzC,YAAM,IAAI;AAAA,IACZ,OAAO;AACL,UAAI,OAAO,MAAM,QAAQ,MAAM;AAC/B,aAAO,OAAO,KAAK,UAAU,YAAY,KAAK,KAAK,IAAI,CAAE,EAAG,GAAE;AAC9D,UAAI,KAAK,IAAI,MAAM,KAAK;AACtB,cAAM,MAAc,KAAK,MAAM,KAAK;AACpC,cAAM,OAAO,MAAM,GAAG,EAAE;AACxB,YAAI,MAAM,IAAI,GAAG,EAAG,OAAM,IAAI,cAAc,2BAA2B;AACvE,cAAM,IAAI,GAAG;AAAA,MACf;AAAA,IACF;AAAA,EACF;AACA,SAAO,KAAK,MAAM,IAAI;AACxB;AAEA,SAAS,uBAAuB,OAAgC,MAAoB;AAClF,MAAI,CAAC,OAAO,OAAO,OAAO,gBAAgB,EAAG;AAC7C,QAAM,SAAS,MAAM;AACrB,MAAI,CAAC,MAAM,QAAQ,MAAM,KAAK,OAAO,SAAS,OAAO,qBAAqB,IAAI,IAAI,MAAM,EAAE,SAAS,OAAO,QAAQ;AAChH,UAAM,IAAI,cAAc,2BAA2B;AAAA,EACrD;AACA,QAAM,QAAQ,CAAC,GAAG,eAAe,GAAI,YAAY,IAAI,KAAK,CAAC,CAAE;AAC7D,aAAW,SAAS,QAAQ;AAC1B,QAAI,OAAO,UAAU,SAAU,OAAM,IAAI,cAAc,4CAA4C;AACnG,QAAI,CAAC,MAAM,SAAS,KAAK,KAAK,CAAC,OAAO,OAAO,OAAO,KAAK,GAAG;AAC1D,YAAM,IAAI,cAAc,2CAA2C,KAAK,IAAI,qBAAqB;AAAA,IACnG;AAAA,EACF;AACF;AAGA,SAAS,iBAAiB,OAA2C;AACnE,QAAM,YAAY,SAAS,KAAK,MAAM,MAAM,WAAW,iBAAiB,MAAM,WAAW,gBACpF,MAAM,UAAU,iBAAiB,OAAO,OAAO,OAAO,QAAQ;AACnE,oBAAkB,OAAO,GAAG,SAAS;AACrC,MAAI,CAAC,SAAS,KAAK,EAAG,OAAM,IAAI,cAAc,qCAAqC;AACnF,MAAI,CAAC,OAAO,UAAU,MAAM,KAAK,KAAK,OAAO,MAAM,KAAK,IAAI,KAAK,OAAO,MAAM,KAAK,IAAI,SAChF,CAAC,OAAO,UAAU,MAAM,KAAK,KAAK,OAAO,MAAM,KAAK,IAAI,KAAK,OAAO,MAAM,KAAK,IAAI,OAAO;AAC/F,UAAM,IAAI,cAAc,0BAA0B;AAAA,EACpD;AACA,MAAI,MAAM,UAAU,iBAAiB,MAAO,OAAM,IAAI,cAAc,8BAA8B,qBAAqB;AAEvH,QAAM,iBAAiB,OAAO,KAAK,WAAW,EAAE,OAAO,CAAC,UAAU,OAAO,OAAO,OAAO,KAAK,CAAC;AAC7F,QAAM,OAAO,eAAe,CAAC;AAC7B,MAAI,eAAe,WAAW,KAAK,SAAS,OAAW,OAAM,IAAI,cAAc,kDAAkD;AAEjI,MAAI,SAAS,UAAU;AACrB,QAAI,CAAC,mBAAmB,MAAM,EAAE,KAAK,OAAO,MAAM,WAAW,YAAY,CAAC,SAAS,MAAM,MAAM,GAAG;AAChG,YAAM,IAAI,cAAc,0BAA0B;AAAA,IACpD;AACA,QAAI,CAAC,QAAQ,KAAK,CAAC,WAAW,WAAW,MAAM,MAAM,EAAG,OAAM,IAAI,cAAc,kBAAkB,kBAAkB;AAAA,EACtH,WAAW,SAAS,SAAS;AAC3B,QAAI,CAAC,WAAW,MAAM,KAAK,KAAK,CAAC,OAAO,OAAO,OAAO,MAAM,EAAG,OAAM,IAAI,cAAc,wBAAwB;AAAA,EACjH,WAAW,SAAS,UAAU;AAC5B,QAAI,CAAC,mBAAmB,MAAM,EAAE,EAAG,OAAM,IAAI,cAAc,2BAA2B;AAAA,EACxF,WAAW,CAAC,mBAAmB,MAAM,EAAE,KAAK,CAAC,SAAS,MAAM,KAAK,KAAK,CAAC,WAAW,MAAM,MAAM,IAAI,KAC3F,OAAO,MAAM,MAAM,YAAY,YAAY,YAAY,OAAO,MAAM,MAAM,OAAO,EAAE,aAAa,OAAO,sBAAsB;AAClI,UAAM,IAAI,cAAc,wBAAwB;AAAA,EAClD;AACA,yBAAuB,OAAO,IAAI;AACpC;AAEO,IAAM,kBAAkB,CAAC,aAAkD,OAAO,OAAO,UAAU,OAAO;AAC1G,IAAM,kBAAkB,CAAC,aAAkD,OAAO,OAAO,UAAU,OAAO;AAC1G,IAAM,qBAAqB,CAAC,aAAqD,OAAO,OAAO,UAAU,QAAQ;AAGxH,SAAS,kBAAkB,QAA4B;AACrD,SAAO,IAAI,SAAS,OAAO,QAAQ,OAAO,YAAY,OAAO,UAAU,EAAE,UAAU,GAAG,KAAK;AAC7F;AAEO,SAAS,gBAAgB,QAA4B;AAC1D,MAAI,OAAO,eAAe,mBAAoB,OAAM,IAAI,cAAc,+BAA+B;AACrG,QAAM,YAAY,kBAAkB,MAAM;AAC1C,MAAI,cAAc,EAAG,OAAM,IAAI,cAAc,sBAAsB;AACnE,MAAI,YAAY,qBAAsB,OAAM,IAAI,cAAc,oCAAoC,iBAAiB;AACnH,SAAO;AACT;AAEO,SAAS,WAAW,MAA4B;AACrD,MAAI,KAAK,eAAe,EAAG,OAAM,IAAI,cAAc,qBAAqB;AACxE,MAAI,KAAK,aAAa,qBAAsB,OAAM,IAAI,cAAc,mCAAmC,iBAAiB;AACxH,MAAI;AACF,UAAM,QAAQ,UAAU,YAAY,OAAO,IAAI,CAAC;AAChD,qBAAiB,KAAK;AACtB,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiB,cAAe,OAAM;AAC1C,UAAM,IAAI,cAAc,2BAA2B;AAAA,EACrD;AACF;AAEO,IAAM,gBAAN,MAAoB;AAAA,EACjB,SAAS,IAAI,WAAW,kBAAkB;AAAA,EAC1C,aAAa;AAAA,EACb,OAAO,IAAI,WAAW,CAAC;AAAA,EACvB,WAAW;AAAA,EAEnB,OAAO,OAAO,UAAgC;AAC5C,qBAAiB,QAAQ;AACzB,UAAM,OAAO,YAAY,OAAO,KAAK,UAAU,QAAQ,CAAC;AACxD,QAAI,KAAK,aAAa,qBAAsB,OAAM,IAAI,cAAc,mCAAmC,iBAAiB;AAExH,UAAM,QAAQ,IAAI,WAAW,qBAAqB,KAAK,UAAU;AACjE,QAAI,SAAS,MAAM,MAAM,EAAE,UAAU,GAAG,KAAK,YAAY,KAAK;AAC9D,UAAM,IAAI,MAAM,kBAAkB;AAClC,WAAO;AAAA,EACT;AAAA,EAEA,KAAK,OAAwC;AAC3C,UAAM,SAAqB,CAAC;AAC5B,QAAI,SAAS;AACb,QAAI;AACF,aAAO,SAAS,MAAM,YAAY;AAChC,YAAI,KAAK,aAAa,oBAAoB;AACxC,gBAAMA,SAAQ,KAAK,IAAI,qBAAqB,KAAK,YAAY,MAAM,aAAa,MAAM;AACtF,eAAK,OAAO,IAAI,MAAM,SAAS,QAAQ,SAASA,MAAK,GAAG,KAAK,UAAU;AACvE,eAAK,cAAcA;AACnB,oBAAUA;AACV,cAAI,KAAK,aAAa,mBAAoB;AAE1C,eAAK,OAAO,IAAI,WAAW,gBAAgB,KAAK,MAAM,CAAC;AACvD,eAAK,WAAW;AAAA,QAClB;AAEA,cAAM,QAAQ,KAAK,IAAI,KAAK,KAAK,aAAa,KAAK,UAAU,MAAM,aAAa,MAAM;AACtF,aAAK,KAAK,IAAI,MAAM,SAAS,QAAQ,SAAS,KAAK,GAAG,KAAK,QAAQ;AACnE,aAAK,YAAY;AACjB,kBAAU;AACV,YAAI,KAAK,aAAa,KAAK,KAAK,WAAY;AAE5C,eAAO,KAAK,WAAW,KAAK,IAAI,CAAC;AACjC,aAAK,MAAM;AAAA,MACb;AACA,aAAO;AAAA,IACT,SAAS,OAAO;AACd,WAAK,MAAM;AACX,YAAM;AAAA,IACR;AAAA,EACF;AAAA,EAEA,QAAc;AACZ,SAAK,OAAO,KAAK,CAAC;AAClB,SAAK,aAAa;AAClB,SAAK,OAAO,IAAI,WAAW,CAAC;AAC5B,SAAK,WAAW;AAAA,EAClB;AACF;;;AF9MA,IAAM,mBAAmB;AACzB,IAAM,QAAQ;AACd,IAAM,iBAAiB;AACvB,IAAM,uBAAuB,KAAK;AAElC,IAAM,WAAW;AAGV,IAAM,eAAN,cAA2B,MAAM;AAAA,EAGtC,YACW,UACT,SACA;AACA,UAAM,OAAO;AAHJ;AAIT,SAAK,OAAO;AACZ,SAAK,OAAO,YAAY,QAAQ,IAAI,WAAW;AAAA,EACjD;AAAA,EANW;AAAA,EAHF;AAUX;AAUA,SAAS,YAAY,OAAqB;AACxC,MAAI,CAAC,MAAM,KAAK,KAAK,EAAG,OAAM,IAAI,UAAU,sDAAsD;AACpG;AAgBO,IAAM,aAAN,MAAiB;AAAA,EActB,YACmB,WACjB,OACiB,UAAyB,MAAM;AAAA,EAAC,GACjD,0BAA0B,KAC1B;AAJiB;AAEA;AAGjB,gBAAY,KAAK;AACjB,SAAK,iBAAiB,KAAK;AAAA,MAAoC;AAAA,MAAuB,EAAE,MAAM;AAAA,MAC5F,EAAE,WAAW,wBAAwB;AAAA,MAAG;AAAA,IAAI,EAAE,KAAK,CAAC,WAAW;AAC/D,UAAI,QAAQ,kBAAkB,KAAM,OAAM,IAAI,aAAa,eAAe,uCAAuC;AAAA,IACnH,CAAC;AACD,SAAK,KAAK,eAAe,MAAM,CAAC,UAAmB,KAAK,KAAK,KAAK,QAAQ,KAAK,CAAC,CAAC;AACjF,SAAK,KAAK,SAAS;AAAA,EACrB;AAAA,EAZmB;AAAA,EAEA;AAAA,EAhBX,gBAAgB;AAAA,EACP,UAAU,oBAAI,IAA4B;AAAA,EAC1C,UAAU,oBAAI,IAAY;AAAA,EACnC,aAAa,QAAQ,QAAQ;AAAA,EAC7B,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA,SAAS;AAAA,EACA;AAAA,EACT,SAA0B,CAAC;AAAA,EAC3B,aAAa;AAAA,EACb;AAAA,EAiBR,QAAuB;AAAE,WAAO,KAAK;AAAA,EAAe;AAAA,EACpD,kBAAqC;AAAE,WAAO,KAAK;AAAA,EAAQ;AAAA,EAE3D,QAAW,QAAgB,SAAkC,CAAC,GAAG,UAA0B,CAAC,GAAe;AACzG,WAAO,KAAK,OAAU,QAAQ,QAAQ,OAAO;AAAA,EAC/C;AAAA,EAEA,QAAc;AACZ,SAAK,SAAS;AACd,SAAK,KAAK,IAAI,aAAa,eAAe,eAAe,CAAC;AAC1D,QAAI,KAAK,kBAAkB,OAAW,gBAAe,KAAK,aAAa;AACvE,SAAK,SAAS,CAAC;AACf,SAAK,aAAa;AAAA,EACpB;AAAA,EAEQ,OAAU,QAAgB,QAAiC,SAAyB,iBAAiB,OAAmB;AAC9H,QAAI,KAAK,YAAY,OAAW,QAAO,QAAQ,OAAO,KAAK,OAAO;AAClE,UAAM,UAAU,QAAQ,aAAa;AACrC,QAAI,CAAC,OAAO,SAAS,OAAO,KAAK,WAAW,KAAK,UAAU,YAAe;AACxE,aAAO,QAAQ,OAAO,IAAI,aAAa,WAAW,qCAAqC,CAAC;AAAA,IAC1F;AACA,QAAI,QAAQ,QAAQ,QAAS,QAAO,QAAQ,OAAO,IAAI,aAAa,aAAa,2BAA2B,CAAC;AAC7G,QAAI,KAAK,QAAQ,OAAO,KAAK,QAAQ,QAAQ,OAAO,uBAAuB,KAAK,gBAAgB,gBAAgB;AAC9G,aAAO,QAAQ,OAAO,IAAI,aAAa,sBAAsB,8BAA8B,CAAC;AAAA,IAC9F;AACA,UAAM,WAAW,YAAY,IAAI,IAAI;AACrC,UAAM,KAAK,OAAO,KAAK,aAAa;AACpC,QAAI;AACJ,QAAI;AACF,cAAQ,cAAc,OAAO,EAAE,OAAO,iBAAiB,OAAO,OAAO,iBAAiB,OAAO,IAAI,QAAQ,OAAO,CAAC;AAAA,IACnH,SAAS,OAAO;AAAE,aAAO,QAAQ,OAAO,KAAK,QAAQ,KAAK,CAAC;AAAA,IAAE;AAC7D,QAAI,KAAK,cAAc,MAAM,aAAa,OAAO,wBAAwB;AACvE,aAAO,QAAQ,OAAO,IAAI,aAAa,sBAAsB,+BAA+B,CAAC;AAAA,IAC/F;AACA,MAAE,KAAK;AACP,SAAK,eAAe,MAAM;AAC1B,UAAM,SAAS,IAAI,QAAW,CAAC,SAAS,WAAW;AACjD,YAAM,QAAQ,MAAM,KAAK,QAAQ,IAAI,IAAI,aAAa,aAAa,qDAAqD,CAAC;AACzH,YAAM,QAAQ;AAAA,QAAW,MAAM,KAAK,QAAQ,IAAI,IAAI,aAAa,WAAW,oDAAoD,CAAC;AAAA,QAC/H,KAAK,IAAI,GAAG,WAAW,YAAY,IAAI,CAAC;AAAA,MAAC;AAC3C,WAAK,QAAQ,IAAI,IAAI;AAAA,QACnB,SAAS,CAAC,UAAU,QAAQ,KAAU;AAAA,QAAG;AAAA,QAAQ;AAAA,QAAU;AAAA,QAAO,YAAY;AAAA,QAC9E,aAAa,MAAM,QAAQ,QAAQ,oBAAoB,SAAS,KAAK;AAAA,MACvE,CAAC;AACD,cAAQ,QAAQ,iBAAiB,SAAS,OAAO,EAAE,MAAM,KAAK,CAAC;AAC/D,UAAI,QAAQ,QAAQ,QAAS,OAAM;AAAA,IACrC,CAAC;AACD,SAAK,aAAa,KAAK,WAAW,KAAK,YAAY;AACjD,UAAI,CAAC,eAAgB,OAAM,KAAK;AAChC,YAAM,UAAU,KAAK,QAAQ,IAAI,EAAE;AACnC,UAAI,YAAY,UAAa,KAAK,YAAY,OAAW;AACzD,UAAI,YAAY,IAAI,KAAK,QAAQ,UAAU;AACzC,aAAK,QAAQ,IAAI,IAAI,aAAa,WAAW,0BAA0B,CAAC;AACxE;AAAA,MACF;AACA,cAAQ,aAAa;AACrB,WAAK,UAAU;AACf,UAAI;AAAE,cAAM,KAAK,UAAU,MAAM,KAAK;AAAA,MAAE,UACxC;AAAU,aAAK,UAAU;AAAA,MAAU;AAAA,IACrC,CAAC,EAAE,MAAM,CAAC,UAAmB,KAAK,KAAK,KAAK,QAAQ,KAAK,CAAC,CAAC,EAAE,QAAQ,MAAM;AAAE,WAAK,eAAe,MAAM;AAAA,IAAW,CAAC;AACnH,WAAO;AAAA,EACT;AAAA,EAEQ,OAAO,IAAwC;AACrD,UAAM,UAAU,KAAK,QAAQ,IAAI,EAAE;AACnC,QAAI,YAAY,QAAW;AACzB,WAAK,QAAQ,OAAO,EAAE;AACtB,mBAAa,QAAQ,KAAK;AAC1B,cAAQ,YAAY;AAAA,IACtB;AACA,WAAO;AAAA,EACT;AAAA,EAEQ,QAAQ,IAAY,OAAoB;AAC9C,UAAM,UAAU,KAAK,OAAO,EAAE;AAC9B,QAAI,YAAY,OAAW;AAC3B,YAAQ,OAAO,KAAK;AACpB,QAAI,KAAK,YAAY,IAAI;AACvB,WAAK,KAAK,KAAK;AAAA,IACjB,WAAW,QAAQ,YAAY;AAC7B,WAAK,QAAQ,IAAI,EAAE;AAAA,IACrB;AAAA,EACF;AAAA,EAEQ,QAAQ,OAA8B;AAC5C,QAAI,iBAAiB,aAAc,QAAO;AAC1C,WAAO,IAAI;AAAA,MAAa,iBAAiB,gBAAgB,MAAM,OAAO;AAAA,MACpE,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AAAA,IAAC;AAAA,EAC1D;AAAA,EAEQ,KAAK,OAAoB;AAC/B,QAAI,KAAK,YAAY,OAAW;AAChC,SAAK,UAAU;AACf,eAAW,MAAM,KAAK,QAAQ,KAAK,EAAG,MAAK,OAAO,EAAE,GAAG,OAAO,KAAK;AACnE,SAAK,UAAU,MAAM;AAAA,EACvB;AAAA,EAEQ,WAAW,OAA4B;AAC7C,QAAI,KAAK,YAAY,OAAW;AAChC,UAAM,OAAO,OAAO,WAAW,KAAK,UAAU,KAAK,CAAC;AACpD,QAAI,KAAK,OAAO,UAAU,OAAO,iBAAiB,KAAK,aAAa,OAAO,OAAO,wBAAwB;AACxG,YAAM,IAAI,aAAa,sBAAsB,4BAA4B;AAAA,IAC3E;AACA,SAAK,OAAO,KAAK,KAAK;AACtB,SAAK,cAAc;AACnB,QAAI,KAAK,kBAAkB,OAAW;AACtC,SAAK,gBAAgB,aAAa,MAAM;AACtC,WAAK,gBAAgB;AACrB,YAAM,SAAS,KAAK;AACpB,WAAK,SAAS,CAAC;AACf,WAAK,aAAa;AAClB,iBAAWC,UAAS,QAAQ;AAC1B,YAAI,KAAK,OAAQ;AACjB,YAAI;AAAE,eAAK,QAAQA,MAAK;AAAA,QAAE,QAAQ;AAAA,QAAsD;AAAA,MAC1F;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,MAAc,WAA0B;AACtC,QAAI;AACF,aAAO,KAAK,YAAY,QAAW;AACjC,cAAM,WAAW,WAAW,MAAM,KAAK,UAAU,YAAY,gBAAgB,MAAM,KAAK,UAAU,YAAY,kBAAkB,CAAC,CAAC,CAAC;AACnI,YAAI,KAAK,YAAY,OAAW;AAChC,YAAI,gBAAgB,QAAQ,GAAG;AAAE,eAAK,WAAW,QAAQ;AAAG;AAAA,QAAS;AACrE,YAAI,CAAC,gBAAgB,QAAQ,KAAK,CAAC,mBAAmB,QAAQ,EAAG,OAAM,IAAI,aAAa,mBAAmB,gCAAgC;AAC3I,YAAI,SAAS,OAAO,OAAO,gBAAgB,QAAQ,EAAG,OAAM,IAAI,aAAa,SAAS,MAAM,MAAM,SAAS,MAAM,OAAO;AACxH,cAAM,UAAU,KAAK,QAAQ,IAAI,SAAS,EAAE;AAC5C,YAAI,YAAY,QAAW;AACzB,cAAI,KAAK,QAAQ,OAAO,SAAS,EAAE,EAAG;AACtC,gBAAM,IAAI,aAAa,mBAAmB,oCAAoC;AAAA,QAChF;AACA,YAAI,CAAC,QAAQ,WAAY,OAAM,IAAI,aAAa,mBAAmB,wCAAwC;AAC3G,aAAK,OAAO,SAAS,EAAE;AACvB,YAAI,YAAY,IAAI,KAAK,QAAQ,SAAU,SAAQ,OAAO,IAAI,aAAa,WAAW,sCAAsC,CAAC;AAAA,iBACpH,gBAAgB,QAAQ,EAAG,SAAQ,OAAO,IAAI,aAAa,SAAS,MAAM,MAAM,SAAS,MAAM,OAAO,CAAC;AAAA,YAC3G,SAAQ,QAAQ,SAAS,MAAM;AAAA,MACtC;AAAA,IACF,SAAS,OAAO;AAAE,WAAK,KAAK,KAAK,QAAQ,KAAK,CAAC;AAAA,IAAE;AAAA,EACnD;AACF;AAGA,IAAM,kBAAN,MAA2C;AAAA,EAMzC,YAA6B,QAAgB;AAAhB;AAC3B,UAAM,QAAQ,OAAO,yBAAyB,qBAAqB;AACnE,WAAO,GAAG,QAAQ,CAAC,UAAkB;AACnC,WAAK,OAAO,KAAK,KAAK;AACtB,WAAK,QAAQ,MAAM;AACnB,UAAI,KAAK,OAAO,OAAO;AACrB,aAAK,KAAK,IAAI,MAAM,2DAA2D,CAAC;AAChF,eAAO,QAAQ;AAAA,MACjB;AACA,WAAK,KAAK;AAAA,IACZ,CAAC;AACD,WAAO,GAAG,SAAS,CAAC,UAAU,KAAK,KAAK,KAAK,CAAC;AAC9C,WAAO,GAAG,SAAS,MAAM,KAAK,KAAK,IAAI,MAAM,uBAAuB,CAAC,CAAC;AAAA,EACxE;AAAA,EAb6B;AAAA,EALrB,SAAmB,CAAC;AAAA,EACpB,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EAiBA,KAAK,OAAoB;AAC/B,SAAK,YAAY;AACjB,SAAK,KAAK;AAAA,EACZ;AAAA,EAEQ,OAAa;AACnB,SAAK,SAAS;AACd,SAAK,SAAS;AAAA,EAChB;AAAA,EAEA,MAAM,OAAkC;AACtC,WAAO,IAAI,QAAQ,CAAC,SAAS,WAAW;AACtC,WAAK,OAAO,MAAM,OAAO,CAAC,UAAU,QAAQ,OAAO,KAAK,IAAI,QAAQ,CAAC;AAAA,IACvE,CAAC;AAAA,EACH;AAAA,EAEA,MAAM,YAAY,OAAoC;AACpD,WAAO,KAAK,OAAO,OAAO;AACxB,UAAI,KAAK,YAAY,OAAW,OAAM,KAAK;AAC3C,YAAM,IAAI,QAAc,CAAC,YAAY;AAAE,aAAK,SAAS;AAAA,MAAQ,CAAC;AAAA,IAChE;AACA,UAAM,CAAC,IAAI,IAAI,KAAK;AACpB,UAAM,SAAS,KAAK,OAAO,WAAW,KAAK,SAAS,SAAY,OAAO,OAAO,OAAO,KAAK,QAAQ,KAAK,IAAI;AAC3G,UAAM,SAAS,OAAO,SAAS,GAAG,KAAK;AACvC,UAAM,OAAO,OAAO,SAAS,KAAK;AAClC,SAAK,SAAS,KAAK,aAAa,IAAI,CAAC,IAAI,IAAI,CAAC;AAC9C,SAAK,OAAO,KAAK;AACjB,WAAO;AAAA,EACT;AAAA,EAEA,QAAc;AACZ,SAAK,OAAO,QAAQ;AAAA,EACtB;AACF;AAEA,eAAsB,YAAY,MAAc,OAAe,SAAyB,YAAY,KAA2B;AAC7H,MAAI,CAAC,OAAO,UAAU,IAAI,KAAK,OAAO,KAAK,OAAO,MAAO,OAAM,IAAI,WAAW,sCAAsC;AACpH,MAAI,CAAC,OAAO,SAAS,SAAS,KAAK,aAAa,KAAK,YAAY,WAAe,OAAM,IAAI,WAAW,4BAA4B;AACjI,cAAY,KAAK;AACjB,QAAM,WAAW,YAAY,IAAI,IAAI;AACrC,QAAM,SAAS,IAAI,OAAO;AAC1B,QAAM,IAAI,QAAc,CAAC,SAAS,WAAW;AAC3C,UAAM,QAAQ,WAAW,MAAM,OAAO,QAAQ,IAAI,aAAa,WAAW,6BAA6B,CAAC,GAAG,SAAS;AACpH,UAAM,UAAU,CAAC,UAAiB;AAAE,mBAAa,KAAK;AAAG,aAAO,iBAAiB,eAAe,QAAQ,IAAI,aAAa,eAAe,MAAM,OAAO,CAAC;AAAA,IAAE;AACxJ,WAAO,KAAK,SAAS,OAAO;AAC5B,WAAO,QAAQ,MAAM,kBAAkB,MAAM;AAC3C,mBAAa,KAAK;AAClB,aAAO,eAAe,SAAS,OAAO;AACtC,cAAQ;AAAA,IACV,CAAC;AAAA,EACH,CAAC;AACD,QAAM,YAAY,WAAW,YAAY,IAAI;AAC7C,MAAI,aAAa,GAAG;AAAE,WAAO,QAAQ;AAAG,UAAM,IAAI,aAAa,WAAW,6BAA6B;AAAA,EAAE;AACzG,QAAM,SAAS,IAAI,WAAW,IAAI,gBAAgB,MAAM,GAAG,OAAO,SAAS,SAAS;AACpF,MAAI;AAAE,UAAM,OAAO,MAAM;AAAG,WAAO;AAAA,EAAO,SACnC,OAAO;AAAE,WAAO,MAAM;AAAG,UAAM;AAAA,EAAM;AAC9C;AAaA,eAAe,kBAAkB,MAAc,OAAgC;AAC7E,QAAM,SAAS,MAAM,KAAK,MAAM,UAAU,YAAY,UAAU,cAAc,EAAE;AAChF,MAAI;AACF,UAAM,QAAQ,MAAM,OAAO,KAAK;AAChC,UAAM,kBAAkB,QAAQ,UAAU;AAC1C,QAAI,CAAC,MAAM,OAAO,KAAK,MAAM,OAAO,wBAAyB,QAAQ,aAAa,aACzE,MAAM,OAAO,QAAW,KAAK,oBAAoB,UAAa,MAAM,QAAQ,kBAAmB;AACtG,YAAM,IAAI,aAAa,mBAAmB,GAAG,KAAK,0CAA0C;AAAA,IAC9F;AACA,UAAM,SAAS,OAAO,MAAM,MAAM,IAAI;AACtC,UAAM,EAAE,UAAU,IAAI,MAAM,OAAO,KAAK,QAAQ,GAAG,MAAM,MAAM,CAAC;AAChE,WAAO,OAAO,SAAS,GAAG,SAAS,EAAE,SAAS,MAAM;AAAA,EACtD,UAAE;AACA,UAAM,OAAO,MAAM;AAAA,EACrB;AACF;AAEA,eAAsB,kBAAkB,MAAwC;AAC9E,QAAMC,UAAkB,KAAK,MAAM,MAAM,kBAAkB,MAAM,sBAAsB,CAAC;AACxF,MAAI,CAAC,SAASA,OAAM,KAAKA,QAAO,kBAAkB,iBAAiB,SAAS,CAAC,OAAO,UAAUA,QAAO,aAAa,KAC3G,OAAOA,QAAO,aAAa,IAAI,KAAK,OAAOA,QAAO,aAAa,IAAI,SAASA,QAAO,YAAY,oBAC/F,CAAC,OAAO,UAAUA,QAAO,IAAI,KAAK,OAAOA,QAAO,IAAI,IAAI,KAAK,OAAOA,QAAO,IAAI,IAAI,SACnF,CAAC,OAAO,cAAcA,QAAO,SAAS,KAAK,OAAOA,QAAO,SAAS,KAAK,KACvE,OAAOA,QAAO,gBAAgB,YAAYA,QAAO,YAAY,WAAW,KACxE,OAAOA,QAAO,cAAc,YAAYA,QAAO,UAAU,WAAW,GAAG;AAC5E,UAAM,IAAI,aAAa,mBAAmB,iDAAiD;AAAA,EAC7F;AACA,SAAO;AAAA,IACL,eAAeA,QAAO;AAAA,IACtB,eAAe,OAAOA,QAAO,aAAa;AAAA,IAC1C,SAAS;AAAA,IACT,MAAM,OAAOA,QAAO,IAAI;AAAA,IACxB,WAAW,OAAOA,QAAO,SAAS;AAAA,IAClC,aAAaA,QAAO;AAAA,IACpB,WAAWA,QAAO;AAAA,EACpB;AACF;AAEA,SAAS,UAAU,OAAoC;AACrD,SAAO,SAAS,KAAK,KAAK,OAAO,MAAM,SAAS,WAAW,MAAM,OAAO;AAC1E;AAEA,eAAe,eAAe,MAAgC;AAC5D,QAAM,OAAO,MAAM,MAAM,MAAM,EAAE,QAAQ,KAAK,CAAC;AAC/C,QAAM,QAAU,KAAK,OAAO,KAAM,SAAY,KAAK,OAAO,MAAO,CAAC;AAClE,QAAM,QAAS,KAAK,MAAM,QAAW,KAAK,OAAO,MAAO,CAAC;AACzD,QAAM,QAAQ,GAAG,MAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,MAAM,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG,CAAC,IAAI,KAAK,GAAG;AACvG,UAAQ,MAAM,SAAS,eAAe,MAAM,GAAG,MAAM,IAAI,EAAE,KAAK,CAAC,SAAS;AACxE,UAAM,SAAS,KAAK,KAAK,EAAE,MAAM,KAAK;AACtC,WAAO,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM,WAAW,OAAO,CAAC,MAAM;AAAA,EACzE,CAAC;AACH;AAGA,eAAe,gBAAgB,WAAqC;AAClE,QAAM,OAAO,GAAG,SAAS;AACzB,MAAI;AACF,QAAI,QAAQ,aAAa,SAAS;AAChC,YAAM,OAAO,MAAM,MAAM,IAAI;AAC7B,UAAI,CAAC,KAAK,OAAO,KAAK,KAAK,QAAQ,QAAQ,UAAU,MAAM,KAAK,OAAO,QAAW,GAAG;AACnF,cAAM,IAAI,aAAa,mBAAmB,sDAAsD;AAAA,MAClG;AAAA,IACF;AACA,QAAI,QAAQ,aAAa,QAAS,QAAO,MAAM,eAAe,IAAI;AAClE,QAAI,QAAQ,aAAa,YAAY,QAAQ,aAAa,SAAS;AACjE,YAAM,IAAI,aAAa,eAAe,6DAA6D;AAAA,IACrG;AACA,UAAM,QAAQ,QAAQ,aAAa,WAC/B,UAAU,WAAW,UAAU,aAAa,WAAW,UAAU,aAAa,UAAU;AAC5F,WAAO,MAAM,KAAK,MAAM,KAAK,GAAG,MAAM;AACtC,WAAO;AAAA,EACT,SAAS,OAAO;AACd,QAAI,iBAAiB,aAAc,OAAM;AACzC,UAAM,OAAO,UAAU,KAAK;AAC5B,QAAI,SAAS,SAAU,QAAO;AAC9B,QAAI,UAAU,QAAQ,aAAa,UAAU,UAAU,UAAW,QAAO;AACzE,UAAM,IAAI,aAAa,mBAAmB,4CAA4C;AAAA,EACxF;AACF;AAEA,eAAsB,yBAAyB,MAAc,SAA8C;AACzG,QAAM,UAAU,IAAI,aAAa,eAAe,2DAA2D;AAC3G,MAAI,CAAC,MAAM,gBAAgB,IAAI,EAAG,OAAM;AACxC,QAAMA,UAAS,MAAM,kBAAkB,IAAI,EAAE,MAAM,CAAC,UAAmB;AAAE,UAAM,UAAU,KAAK,MAAM,WAAW,UAAU;AAAA,EAAM,CAAC;AAChI,QAAM,SAAS,MAAM,kBAAkBA,QAAO,WAAW,WAAW,GAAG,KAAK;AAE5E,QAAM,YAAY,MAAM,kBAAkB,IAAI,EAAE,MAAM,MAAM,MAAS;AACrE,MAAI,WAAW,gBAAgBA,QAAO,eAAe,UAAU,SAASA,QAAO,QAAQ,UAAU,cAAcA,QAAO,WAAW;AAC/H,UAAM,IAAI,aAAa,eAAe,0DAA0D;AAAA,EAClG;AACA,SAAO,YAAYA,QAAO,MAAM,OAAO,OAAO;AAChD;;;AGjaA,SAAS,YAAY,kBAAkB;AACvC,SAAS,aAAAC,kBAAiB;AAC1B,SAAS,OAAO,QAAAC,OAAM,UAAU,QAAQ,cAAc;AACtD,SAAS,UAAU,SAAS,YAAY,YAAY;AACpD,SAAS,cAAc,aAAa;AAGpC,SAAS,OAAO,OAAsC;AACpD,SAAO,UAAU,QAAQ,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,KAAK;AAC5E;AACA,SAAS,QAAQ,MAAc,SAAiB,SAAsB,CAAC,GAAU;AAC/E,SAAO,IAAI,MAAM,KAAK,UAAU,EAAE,IAAI,OAAO,MAAM,OAAO,SAAS,GAAG,OAAO,CAAC,CAAC;AACjF;AACA,SAAS,YAAY,OAAgB,QAA4B;AAC/D,MAAI,iBAAiB,aAAc,QAAO,QAAQ,MAAM,UAAU,MAAM,SAAS,MAAM;AACvF,MAAI,iBAAiB,SAAS,MAAM,QAAQ,WAAW,cAAc,EAAG,QAAO;AAC/E,SAAO,QAAQ,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,GAAG,MAAM;AAC9F;AASO,IAAM,gBAAN,MAAoB;AAAA,EAKzB,YAA6B,WAAoC,UACpC,iBAAyB;AADzB;AAAoC;AACpC;AAAA,EAA0B;AAAA,EAD1B;AAAA,EAAoC;AAAA,EACpC;AAAA,EALrB;AAAA,EACA,UAAU;AAAA,EACD,QAAQ,oBAAI,IAA6B;AAAA,EAKlD,aAAkC;AACxC,QAAI,KAAK,QAAS,OAAM,QAAQ,aAAa,2BAA2B;AAExE,WAAO,KAAK,WAAW,yBAAyB,KAAK,SAAS;AAAA,EAChE;AAAA,EAEA,MAAc,IAAI,QAAgB,QAAqB,QAA4C;AACjG,UAAM,aAAa,IAAI,gBAAgB;AACvC,UAAM,aAAa,WAAW;AAC9B,UAAM,SAAS,MAAM;AACnB,iBAAW,MAAM;AACjB,UAAI,KAAK,OAAQ,MAAK,KAAK,OAAO,KAAK,YAAU,KAAK,cAAc,QAAQ,UAAU,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAAA,IACzG;AACA,YAAQ,iBAAiB,SAAS,QAAQ,EAAE,MAAM,KAAK,CAAC;AACxD,QAAI,QAAQ,QAAS,YAAW,MAAM;AACtC,SAAK,MAAM,IAAI,YAAY,UAAU;AACrC,QAAI;AACJ,QAAI;AACJ,QAAI;AACF,UAAI,WAAW,OAAO,QAAS,OAAM,QAAQ,aAAa,mBAAmB;AAC7E,YAAM,SAAS,MAAM,KAAK,WAAW;AACrC,UAAI,WAAW,OAAO,QAAS,OAAM,QAAQ,aAAa,mBAAmB;AAC7E,YAAM,WAAW,MAAM,KAAK,OAAO,QAAQ,QAAQ,QAAQ,UAAU;AACrE,cAAQ,SAAS;AACjB,oBAAc,SAAS;AACvB,UAAI,WAAwB;AAC5B,YAAM,WAAW,YAAY,IAAI,IAAI,IAAI,KAAK;AAC9C,UAAI,mBAAmB;AACvB,iBAAS;AACP,YAAI,SAAS,UAAU,SAAS,SAAS,gBAAgB;AACvD,gBAAM,QAAQ,oBAAoB,wBAAwB,EAAE,OAAO,aAAa,WAAW,CAAC;AAC9F,YAAI,OAAO,SAAS,aAAa,YAAY,CAAC,OAAO,SAAS,SAAS,QAAQ,KAAK,SAAS,WAAW,KAAK,SAAS,WAAW;AAC/H,gBAAM,QAAQ,kBAAkB,+BAA+B,EAAE,OAAO,aAAa,WAAW,CAAC;AACnG,YAAI,SAAS,UAAU,aAAa;AAClC,cAAI,WAAW,OAAO,QAAS,OAAM,QAAQ,aAAa,qBAAqB,EAAE,OAAO,aAAa,WAAW,CAAC;AACjH,cAAI,CAAC,OAAO,SAAS,MAAM,EAAG,OAAM,QAAQ,kBAAkB,0BAA0B;AACxF,iBAAO,SAAS;AAAA,QAClB;AACA,YAAI,SAAS,UAAU,YAAY,SAAS,UAAU,aAAa;AACjE,gBAAM,SAAS,OAAO,SAAS,KAAK,IAAI,SAAS,QAAQ,CAAC;AAC1D,gBAAM,QAAQ,OAAO,OAAO,QAAQ,gBAAgB,GAAG,OAAO,OAAO,WAAW,mBAAmB,GAAG,EAAE,OAAO,aAAa,WAAW,CAAC;AAAA,QAC1I;AACA,YAAI,SAAS,UAAU,YAAY,SAAS,UAAU,UAAW,OAAM,QAAQ,kBAAkB,0BAA0B;AAC3H,YAAI,WAAW,OAAO,WAAW,CAAC,kBAAkB;AAClD,gBAAM,OAAO,QAAQ,cAAc,EAAE,MAAM,GAAG,EAAE,WAAW,IAAI,CAAC;AAChE,6BAAmB;AAAA,QACrB;AACA,YAAI,YAAY,IAAI,KAAK,SAAU,OAAM,QAAQ,WAAW,oCAAoC,EAAE,OAAO,aAAa,WAAW,CAAC;AAClI,cAAM,MAAM,EAAE;AACd,mBAAW,MAAM,OAAO,QAAqB,cAAc,EAAE,OAAO,eAAe,YAAY,GAAG,EAAE,WAAW,IAAK,CAAC;AACrH,YAAI,CAAC,OAAO,QAAQ,EAAG,OAAM,QAAQ,kBAAkB,6BAA6B;AAAA,MACtF;AAAA,IACF,SAAS,OAAO;AACd,YAAM,YAAY,OAAO,EAAE,GAAI,QAAQ,EAAE,OAAO,YAAY,IAAI,CAAC,GAAI,WAAW,CAAC;AAAA,IACnF,UAAE;AACA,WAAK,MAAM,OAAO,UAAU;AAC5B,cAAQ,oBAAoB,SAAS,MAAM;AAAA,IAC7C;AAAA,EACF;AAAA,EAEA,MAAc,OAAO,QAAoB,QAAgB,QAAqB,YAAoB;AAChG,UAAM,WAAW,MAAM,OAAO,QAAqB,QAAQ,EAAE,GAAG,QAAQ,WAAW,GAAG,EAAE,WAAW,IAAK,CAAC;AACzG,QAAI,CAAC,OAAO,QAAQ,KAAK,OAAO,SAAS,UAAU,YAAY,CAAC,SAAS,SAClE,OAAO,SAAS,gBAAgB,YAAY,CAAC,SAAS;AAC3D,YAAM,QAAQ,kBAAkB,mCAAmC,EAAE,WAAW,CAAC;AACnF,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,OAAO,SAAiB,QAA4C;AACxE,UAAM,KAAK,IAAI,oBAAoB,EAAE,QAAQ,GAAG,MAAM;AACtD,WAAO,EAAE,IAAI,MAAM,OAAO,QAAQ;AAAA,EACpC;AAAA;AAAA,EAGA,MAAM,cAAc,SAAwD;AAC1E,UAAM,aAAa,WAAW;AAC9B,QAAI;AACF,YAAM,EAAE,OAAO,aAAa,OAAO,SAAS,IAAI,MAAM,KAAK,OAAO,MAAM,KAAK,WAAW,GAAG,qBAAqB,EAAE,QAAQ,GAAG,UAAU;AACvI,aAAO,EAAE,IAAI,MAAM,OAAO,SAAS,OAAO,aAAa,YAAY,OAAO,SAAS;AAAA,IACrF,SAAS,OAAO;AAAE,YAAM,YAAY,OAAO,EAAE,WAAW,CAAC;AAAA,IAAG;AAAA,EAC9D;AAAA,EAEA,MAAM,eAAe,EAAE,OAAO,OAAO,aAAa,WAAW,GAAyC;AACpG,QAAI;AACF,YAAM,WAAW,OAAO,MAAM,KAAK,WAAW,GAAG,QAAqB,cAAc,EAAE,OAAO,eAAe,YAAY,GAAG,EAAE,WAAW,IAAK,CAAC;AAC9I,UAAI,CAAC,OAAO,QAAQ,KAAK,SAAS,UAAU,SAAS,SAAS,gBAAgB;AAC5E,cAAM,QAAQ,oBAAoB,wBAAwB,EAAE,OAAO,aAAa,WAAW,CAAC;AAC9F,YAAM,EAAE,OAAO,UAAU,MAAM,IAAI;AACnC,aAAO;AAAA,QAAE;AAAA,QAAO;AAAA,QAAO;AAAA,QAAa;AAAA,QAAY;AAAA,QAAO;AAAA,QAAU,UAAU,UAAU,YAAY,UAAU;AAAA,QACzG,GAAI,UAAU,cAAc,EAAE,YAAY,KAAK,IAAI,CAAC;AAAA,QAAI,GAAI,OAAO,KAAK,IAAI,EAAE,MAAM,IAAI,CAAC;AAAA,MAAG;AAAA,IAChG,SAAS,OAAO;AAAE,YAAM,YAAY,OAAO,EAAE,OAAO,aAAa,WAAW,CAAC;AAAA,IAAG;AAAA,EAClF;AAAA,EAEA,MAAM,SAAS,MAAoF,QAA4C;AAC7I,UAAM,SAAS,MAAM,KAAK,IAAI,iBAAiB;AAAA,MAAE,SAAS;AAAA,MACxD,QAAQ,KAAK;AAAA,MAAQ,UAAU,KAAK;AAAA,MAAU,iBAAiB,KAAK;AAAA,MAAiB,MAAM,KAAK,QAAQ;AAAA,IAAE,GAAG,MAAM;AACrH,QAAI,QAAQ,WAAW,KAAK,QAAS,OAAM,QAAQ,aAAa,mBAAmB;AACnF,QAAI;AACF,YAAM,UAAU,MAAM,KAAK,QAAQ,QAAQ,MAAM;AACjD,aAAO,EAAE,IAAI,MAAM,SAAS,YAAY,OAAO,YAAY,MAAM,OAAO,KAAK;AAAA,IAC/E,SAAS,OAAO;AACd,UAAI,iBAAiB,SAAS,MAAM,QAAQ,WAAW,cAAc,EAAG,OAAM;AAC9E,YAAM,QAAQ,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CAAC;AAAA,IACrF;AAAA,EACF;AAAA,EAEA,MAAc,QAAQ,QAAqB,QAAuC;AAChF,QAAI,OAAO,OAAO,SAAS,YAAY,CAAC,WAAW,OAAO,IAAI,KACvD,OAAO,OAAO,eAAe,YAAY,CAAC,iBAAiB,KAAK,OAAO,UAAU,KACjF,CAAC,OAAO,UAAU,OAAO,IAAI,KAAK,OAAO,OAAO,IAAI,KAAK,KAAK,OAAO,OAAO,IAAI,IAAI,cACpF,CAAC,OAAO,UAAU,OAAO,UAAU,KAAK,OAAO,OAAO,UAAU,KAAK,KAAK,OAAO,OAAO,UAAU,IAAI;AAC3G,YAAM,QAAQ,kBAAkB,yCAAyC;AAC3E,UAAM,SAAS,MAAM,SAAS,OAAO,IAAI;AACzC,UAAM,OAAO,MAAM,SAAS,KAAK,KAAK,UAAU,aAAa,CAAC;AAC9D,QAAI,QAAQ,QAAQ,MAAM,CAAC,MAAM,QAAQ,SAAS,MAAM,MAAM;AAC5D,YAAM,QAAQ,kBAAkB,qDAAqD;AACvF,UAAM,MAAM,KAAK,iBAAiB,EAAE,WAAW,KAAK,CAAC;AACrD,UAAM,SAAS,MAAM,SAAS,KAAK,eAAe;AAClD,UAAM,cAAc,KAAK,QAAQ,GAAG,WAAW,CAAC,MAAM;AACtD,UAAM,UAAU,GAAG,WAAW;AAC9B,QAAI,YAAY;AAChB,QAAI,iBAAiB;AACrB,UAAM,QAAQ,MAAMA,MAAK,QAAQD,WAAU,YAAYA,WAAU,cAAc,EAAE;AACjF,QAAI;AACF,UAAI,EAAE,MAAM,MAAM,KAAK,GAAG,OAAO,EAAG,OAAM,QAAQ,kBAAkB,uCAAuC;AAC3G,YAAM,WAAW,MAAMC,MAAK,aAAa,MAAM,GAAK;AACpD,YAAM,SAAS,MAAM;AACrB,UAAI;AACF,cAAM,SAAS,MAAMA,MAAK,SAAS,MAAM,GAAK;AAC9C,yBAAiB;AACjB,YAAI;AACF,gBAAM,OAAO,WAAW,QAAQ;AAChC,gBAAM,QAAQ,OAAO,MAAM,KAAK;AAChC,qBAAS;AACP,gBAAI,QAAQ,WAAW,KAAK,QAAS,OAAM,QAAQ,aAAa,mBAAmB;AACnF,kBAAM,EAAE,UAAU,IAAI,MAAM,MAAM,KAAK,OAAO,GAAG,MAAM,QAAQ,IAAI;AACnE,gBAAI,CAAC,UAAW;AAChB,iBAAK,OAAO,MAAM,SAAS,GAAG,SAAS,CAAC;AACxC,gBAAI,SAAS;AACb,mBAAO,SAAS,WAAW;AACzB,oBAAM,UAAU,MAAM,OAAO,MAAM,OAAO,QAAQ,YAAY,MAAM;AACpE,kBAAI,CAAC,QAAQ,aAAc,OAAM,QAAQ,eAAe,6BAA6B;AACrF,wBAAU,QAAQ;AAAA,YACpB;AAAA,UACF;AACA,cAAI,KAAK,OAAO,KAAK,MAAM,OAAO,WAAY,OAAM,QAAQ,kBAAkB,+CAA+C;AAAA,QAC/H,UAAE;AAAU,gBAAM,OAAO,MAAM;AAAA,QAAG;AAClC,YAAI,QAAQ,WAAW,KAAK,QAAS,OAAM,QAAQ,aAAa,mBAAmB;AACnF,cAAM,OAAO,SAAS,WAAW;AACjC,oBAAY;AACZ,eAAO,KAAK,KAAK,iBAAiB,SAAS,WAAW,CAAC;AAAA,MACzD,UAAE;AACA,YAAI,eAAgB,OAAM,OAAO,OAAO,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACxD,YAAI,CAAC,UAAW,OAAM,OAAO,WAAW,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAC1D;AAAA,IACF,UAAE;AAAU,YAAM,MAAM,MAAM;AAAA,IAAG;AAAA,EACnC;AAAA,EAEA,MAAc,cAAc,QAAoB,YAAmC;AACjF,QAAI;AACF,YAAM,WAAW,MAAM,OAAO,QAAqB,cAAc,EAAE,WAAW,GAAG,EAAE,WAAW,IAAI,CAAC;AACnG,UAAI,OAAO,QAAQ,KAAK,OAAO,SAAS,UAAU,aAAa,SAAS,UAAU,YAAY,SAAS,UAAU;AAC/G,cAAM,OAAO,QAAQ,cAAc,EAAE,OAAO,SAAS,MAAM,GAAG,EAAE,WAAW,IAAI,CAAC;AAAA,IACpF,QAAQ;AAAA,IAAC;AAAA,EACX;AAAA,EAEA,MAAM,QAAuB;AAC3B,SAAK,UAAU;AACf,eAAW,QAAQ,KAAK,MAAM,KAAK,EAAG,MAAK,MAAM;AACjD,QAAI,CAAC,KAAK,OAAQ;AAClB,QAAI;AACF,YAAM,SAAS,MAAM,KAAK;AAC1B,YAAM,QAAQ,IAAI,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC,EAAE,IAAI,SAAO,KAAK,cAAc,QAAQ,GAAG,CAAC,CAAC;AAEtF,YAAM,WAAW,YAAY,IAAI,IAAI;AACrC,aAAO,KAAK,MAAM,QAAQ,YAAY,IAAI,IAAI,SAAU,OAAM,MAAM,EAAE;AACtE,aAAO,MAAM;AAAA,IACf,QAAQ;AAAA,IAAC;AAAA,EACX;AACF;",
|
|
6
|
+
"names": ["count", "event", "record", "constants", "open"]
|
|
7
|
+
}
|
package/dist/drumSynth.d.ts
CHANGED
|
@@ -18,10 +18,17 @@ export interface DrumRegistrySlot extends DrumParamDisplay {
|
|
|
18
18
|
group: "pitch" | "gen" | "amp";
|
|
19
19
|
groupOrder: number;
|
|
20
20
|
}
|
|
21
|
+
export interface DrumEngineMode {
|
|
22
|
+
name: string;
|
|
23
|
+
/** This mode sustains under cell{N}_synthHold even when the engine as a whole does not. */
|
|
24
|
+
hold?: boolean;
|
|
25
|
+
}
|
|
21
26
|
export interface DrumSynthRegistry {
|
|
22
27
|
engines: Record<string, {
|
|
23
28
|
name: string;
|
|
24
29
|
slots: DrumRegistrySlot[];
|
|
30
|
+
hold?: boolean;
|
|
31
|
+
modes?: DrumEngineMode[];
|
|
25
32
|
}>;
|
|
26
33
|
}
|
|
27
34
|
export interface DrumSynthEngineDescriptor {
|
|
@@ -34,6 +41,9 @@ export interface DrumSynthEngineDescriptor {
|
|
|
34
41
|
bipolar?: boolean;
|
|
35
42
|
rand?: [number, number];
|
|
36
43
|
}[];
|
|
44
|
+
/** cell{N}_synthMode choices, index = mode value; empty when the engine has none. */
|
|
45
|
+
modes: DrumEngineMode[];
|
|
46
|
+
hold: boolean;
|
|
37
47
|
}
|
|
38
48
|
/** Breakpoint shape of cell{N}_synthAmpCurve — structurally the UI's CurvePoint. */
|
|
39
49
|
export interface DrumCurvePoint {
|
|
@@ -86,6 +96,8 @@ export interface DrumSynthCatalog {
|
|
|
86
96
|
engines: DrumSynthEngineDescriptor[];
|
|
87
97
|
getEngine(engineId: number): DrumSynthEngineDescriptor | undefined;
|
|
88
98
|
getDisplay(engineId: number, slot: number): DrumParamDisplay | undefined;
|
|
99
|
+
/** Mirrors drumsynth::holdsInMode: an out-of-range mode plays, and holds as, mode 0. */
|
|
100
|
+
holdsInMode(engineId: number, mode: number): boolean;
|
|
89
101
|
buildEngineSwitchDelta(cellId: number, nextEngineId: number, state: Record<string, unknown>): DrumSynthDelta;
|
|
90
102
|
}
|
|
91
103
|
/**
|
package/dist/drumSynth.js
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// A call over the bridge therefore landed somewhere the same call in the plugin
|
|
9
9
|
// does not (issue #999).
|
|
10
10
|
//
|
|
11
|
-
// Everything here mirrors interface/src/
|
|
11
|
+
// Everything here mirrors interface/src/utils/drumSynth.ts, which is the
|
|
12
12
|
// implementation the UI hook and the in-plugin assistant executor both call.
|
|
13
13
|
// The published package cannot import across workspaces, so this is a vendored
|
|
14
14
|
// twin — interface/test/mcpDrumSynthParity.test.ts drives both over the same
|
|
@@ -150,16 +150,28 @@ export function createDrumSynthCatalog(registry) {
|
|
|
150
150
|
...(s.bipolar ? { bipolar: true } : {}),
|
|
151
151
|
...(s.rand ? { rand: s.rand } : {}),
|
|
152
152
|
})),
|
|
153
|
+
modes: (bySlot[String(id)].modes ?? []).map((m) => ({ name: m.name, ...(m.hold ? { hold: true } : {}) })),
|
|
154
|
+
hold: bySlot[String(id)].hold === true,
|
|
153
155
|
}));
|
|
154
156
|
const display = Object.fromEntries(ids.map((id) => [id, bySlot[String(id)].slots]));
|
|
155
157
|
const getEngine = (engineId) => engines.find((e) => e.id === engineId);
|
|
156
158
|
const getDisplay = (engineId, slot) => display[engineId]?.[slot - 1];
|
|
159
|
+
const holdsInMode = (engineId, mode) => {
|
|
160
|
+
const engine = getEngine(engineId);
|
|
161
|
+
if (!engine)
|
|
162
|
+
return false;
|
|
163
|
+
const played = mode > 0 && mode < engine.modes.length ? mode : 0;
|
|
164
|
+
return engine.hold || engine.modes[played]?.hold === true;
|
|
165
|
+
};
|
|
157
166
|
const buildEngineSwitchDelta = (cellId, nextEngineId, state) => {
|
|
158
167
|
const delta = { [`cell${cellId}_synthEngine`]: nextEngineId };
|
|
168
|
+
const currentEngineId = Math.round(Number(state[`cell${cellId}_synthEngine`] ?? 0));
|
|
169
|
+
// Modes are per engine: a change of engine plays the original render, a re-select keeps it.
|
|
170
|
+
if (currentEngineId !== nextEngineId)
|
|
171
|
+
delta[`cell${cellId}_synthMode`] = 0;
|
|
159
172
|
const nextEngine = getEngine(nextEngineId);
|
|
160
173
|
if (!nextEngine)
|
|
161
174
|
return delta;
|
|
162
|
-
const currentEngineId = Math.round(Number(state[`cell${cellId}_synthEngine`] ?? 0));
|
|
163
175
|
const currentEngine = getEngine(currentEngineId);
|
|
164
176
|
// Only slots the user MOVED off their curated default travel. An untouched
|
|
165
177
|
// cell therefore lands on the destination's factory voice exactly.
|
|
@@ -188,6 +200,6 @@ export function createDrumSynthCatalog(registry) {
|
|
|
188
200
|
}
|
|
189
201
|
return delta;
|
|
190
202
|
};
|
|
191
|
-
return { engineNames, engines, getEngine, getDisplay, buildEngineSwitchDelta };
|
|
203
|
+
return { engineNames, engines, getEngine, getDisplay, holdsInMode, buildEngineSwitchDelta };
|
|
192
204
|
}
|
|
193
205
|
//# sourceMappingURL=drumSynth.js.map
|
package/dist/drumSynth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"drumSynth.js","sourceRoot":"","sources":["../src/drumSynth.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAC7D,gCAAgC;AAChC,EAAE;AACF,2EAA2E;AAC3E,gFAAgF;AAChF,8EAA8E;AAC9E,gFAAgF;AAChF,gFAAgF;AAChF,yBAAyB;AACzB,EAAE;AACF
|
|
1
|
+
{"version":3,"file":"drumSynth.js","sourceRoot":"","sources":["../src/drumSynth.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
{
|
|
2
|
-
"_doc": "SINGLE REGISTRY for the drum-synth engines. One entry per engine: name + slots, index-aligned with drumsynth::Engine (id 1..N; 0 is Off and has no entry). Consumed by build.js (codegens modules/drumsynth/DrumSynthParamSpec.generated.h, DRUM_SYNTH_ENGINE_LABELS, and manifest.drumSynth.engineParams/engineDefaults) and interface/src/
|
|
2
|
+
"_doc": "SINGLE REGISTRY for the drum-synth engines. One entry per engine: name + slots (+ optional hold: true when the voice can sustain under cell{N}_synthHold, and optional modes: [{name, hold?}] topology variants over the same slots, index 0 the original render, selected by cell{N}_synthMode), index-aligned with drumsynth::Engine (id 1..N; 0 is Off and has no entry). Consumed by build.js (codegens modules/drumsynth/DrumSynthParamSpec.generated.h, DRUM_SYNTH_ENGINE_LABELS, and manifest.drumSynth.engineParams/engineDefaults) and interface/src/utils/drumSynth.ts (DRUM_SYNTH_ENGINE_NAMES, DRUM_SYNTH_ENGINES, DRUM_SYNTH_LAYOUT, DRUM_SYNTH_PARAM_DISPLAY). Per slot, UI fields: label (also the pairing key for an engine switch), default (curated normalized seed), optional bipolar (centered knob) and rand (randomization band), group (pitch|gen|amp) + groupOrder (sort key within the group) for the on-screen partition, which is exhaustive by construction. Cook fields: lo/hi/curve are the map — value = curve=='exp' ? lo*pow(hi/lo,p) : lo+(hi-lo)*p, exactly matching expMap/linMap in DrumSynthCore.cpp. An optional center anchors normalized 0.5 exactly and maps each half independently (lo->center, then center->hi); every UI control labelled Tune with kind 'note' anchors on a full-precision equal-tempered C, so a knob reset lands on a real note: C4 261.6255653005986 when it lies inside lo..hi, otherwise the C nearest the range's geometric midpoint (Kick and 808 C2 65.40639132514966, Cowbell C5 523.2511306011972). Their defaults carry full precision because they are the inverse of the pre-anchor factory pitch, and the engine-switch carry compares them against migrated values within DRUM_SLOT_EDIT_EPSILON. Folds are absorbed into lo/hi (e.g. sweep depth 1+linMap(0,N) is stored lin 1..1+N; HiHat 320*expMap(0.5,2) is stored exp 160..640) so cookVoice reads mapped(slot) directly and stays bit-identical. The cook NEVER reads kind — kind is display-only, so flipping a slot kind (ratio/num -> pct shows knob-position 0-100%) keeps lo/hi and is sound-identical; note and freq are the same Hz quantity and share a carry family on an engine switch. pct params display the knob position (stored*100) and ignore lo/hi for display, but the cook still uses lo/hi. NEVER reorder a slot; changing a lo/hi/center/curve range requires re-baselining the [drumsynth][golden] test. Append-only with the engine roster. Still hand-maintained beside this file: the drumsynth::Engine enum, kOutTrim[] in DrumSynthCore.cpp, and DRUM_ENGINE_ICONS in interface/src/utils/drumSynthIcons.ts.",
|
|
3
3
|
"version": 2,
|
|
4
4
|
"engines": {
|
|
5
5
|
"1": {
|
|
6
6
|
"name": "Kick",
|
|
7
|
+
"modes": [{ "name": "Classic" }, { "name": "Ping" }],
|
|
7
8
|
"slots": [
|
|
8
9
|
{
|
|
9
10
|
"label": "Tune",
|
|
@@ -368,6 +369,7 @@
|
|
|
368
369
|
},
|
|
369
370
|
"6": {
|
|
370
371
|
"name": "FM",
|
|
372
|
+
"hold": true,
|
|
371
373
|
"slots": [
|
|
372
374
|
{
|
|
373
375
|
"label": "Tune",
|
|
@@ -564,6 +566,7 @@
|
|
|
564
566
|
},
|
|
565
567
|
"9": {
|
|
566
568
|
"name": "808",
|
|
569
|
+
"hold": true,
|
|
567
570
|
"slots": [
|
|
568
571
|
{
|
|
569
572
|
"label": "Tune",
|
|
@@ -936,6 +939,7 @@
|
|
|
936
939
|
},
|
|
937
940
|
"14": {
|
|
938
941
|
"name": "Pluck",
|
|
942
|
+
"modes": [{ "name": "Classic" }, { "name": "Bowed", "hold": true }],
|
|
939
943
|
"slots": [
|
|
940
944
|
{
|
|
941
945
|
"label": "Tune",
|
|
@@ -1013,6 +1017,7 @@
|
|
|
1013
1017
|
},
|
|
1014
1018
|
"15": {
|
|
1015
1019
|
"name": "Zap",
|
|
1020
|
+
"hold": true,
|
|
1016
1021
|
"slots": [
|
|
1017
1022
|
{
|
|
1018
1023
|
"label": "Tune",
|
|
@@ -1104,6 +1109,7 @@
|
|
|
1104
1109
|
},
|
|
1105
1110
|
"16": {
|
|
1106
1111
|
"name": "Wave",
|
|
1112
|
+
"hold": true,
|
|
1107
1113
|
"slots": [
|
|
1108
1114
|
{
|
|
1109
1115
|
"label": "Tune",
|
|
@@ -1195,6 +1201,7 @@
|
|
|
1195
1201
|
},
|
|
1196
1202
|
"17": {
|
|
1197
1203
|
"name": "Chaos",
|
|
1204
|
+
"hold": true,
|
|
1198
1205
|
"slots": [
|
|
1199
1206
|
{
|
|
1200
1207
|
"label": "Tune",
|
|
@@ -1262,6 +1269,7 @@
|
|
|
1262
1269
|
},
|
|
1263
1270
|
"18": {
|
|
1264
1271
|
"name": "Stab",
|
|
1272
|
+
"hold": true,
|
|
1265
1273
|
"slots": [
|
|
1266
1274
|
{
|
|
1267
1275
|
"label": "Tune",
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* FunctionGemma wire format — renderer + parser.
|
|
3
3
|
*
|
|
4
4
|
* Byte-parity with HF `tokenizer.apply_chat_template` is REQUIRED and pinned by
|
|
5
|
-
* scripts/check-
|
|
6
|
-
* packages/
|
|
5
|
+
* scripts/check-functiongemma-format.mjs against fixtures dumped by
|
|
6
|
+
* packages/ml-research's pam_ml.contracts.fixtures.functiongemma. Empirical rules (from the
|
|
7
7
|
* fixtures, 2026-07-03, google/functiongemma-270m-it template):
|
|
8
8
|
*
|
|
9
9
|
* - Prompt starts with literal `<bos>` (template-added; serving layers that
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* - Schema objects render with keys sorted alphabetically at every level;
|
|
13
13
|
* `type` values are UPPERCASED; all schema strings are <escape>-wrapped.
|
|
14
14
|
* - Tool call/response argument objects ALSO sort keys at every level (the
|
|
15
|
-
* template dictsorts them — pinned by fixtures/hf_dictsort_probe.txt; the
|
|
15
|
+
* template dictsorts them — pinned by fixtures/functiongemma/hf_dictsort_probe.txt; the
|
|
16
16
|
* original fixtures were accidentally all-alphabetical and hid this);
|
|
17
17
|
* strings are <escape>-wrapped, numbers/booleans bare.
|
|
18
18
|
* - The tool call AND its function response live inside ONE continuous
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* this byte-exactly.
|
|
27
27
|
* - Session context: `renderContextLine` renders the compact `[ctx]` state
|
|
28
28
|
* line prepended to the LAST user turn (grammar pinned against
|
|
29
|
-
* fixtures/
|
|
29
|
+
* fixtures/prompt_lines/context-format34.txt; Python twin: packages/ml-research/src/pam_ml/contracts/context.py).
|
|
30
30
|
*/
|
|
31
31
|
export interface ToolDef {
|
|
32
32
|
name: string;
|
|
@@ -42,6 +42,8 @@ export declare const TRIGGER_PHRASE = "You are a model that can do function call
|
|
|
42
42
|
/** Stop sequences for generation (per docs; <end_function_call> is deliberately
|
|
43
43
|
* absent — parallel calls arrive in one turn). */
|
|
44
44
|
export declare const STOP_SEQUENCES: string[];
|
|
45
|
+
export declare function byKeyDictsort([a]: [string, unknown], [b]: [string, unknown]): number;
|
|
46
|
+
export declare function renderNumber(n: number): string;
|
|
45
47
|
/** Render a call/response VALUE: keys sorted at every level (matches the
|
|
46
48
|
* template's dictsort — training/inference byte-parity), strings escaped,
|
|
47
49
|
* no uppercasing. null/undefined render as bare `null` — never trained, but
|
|
@@ -61,7 +63,7 @@ export interface AssistantContext {
|
|
|
61
63
|
bpm: number;
|
|
62
64
|
playing: boolean;
|
|
63
65
|
/** Current main view — the set_view tool's lowercase token vocabulary
|
|
64
|
-
* (
|
|
66
|
+
* (pam_ml.contracts.context CTX_VIEWS); absent renders as the default `cells`. */
|
|
65
67
|
view?: string;
|
|
66
68
|
/** Active preset display name (RAW — sanitized here); absent → `none`. */
|
|
67
69
|
preset?: string | null;
|
|
@@ -72,13 +74,29 @@ export interface AssistantContext {
|
|
|
72
74
|
cells: ContextCell[];
|
|
73
75
|
}
|
|
74
76
|
/** Basename, one extension stripped, whitespace→_, grammar-safe, ≤24 chars.
|
|
75
|
-
* Must match
|
|
77
|
+
* Must match pam_ml.contracts.context `sanitize_label` step for step. */
|
|
76
78
|
export declare function sanitizeContextLabel(name: string): string;
|
|
77
79
|
/** The compact `[ctx]` session-state line (fixed field order, all fields
|
|
78
|
-
* always present) — pinned against fixtures/
|
|
80
|
+
* always present) — pinned against fixtures/prompt_lines/context-format34.txt. */
|
|
79
81
|
export declare function renderContextLine(ctx: AssistantContext): string;
|
|
80
82
|
/** The exact user-turn content shape: ctx line, newline, raw text. */
|
|
81
83
|
export declare function withContext(userText: string, ctx?: AssistantContext | null): string;
|
|
84
|
+
export interface AssistantSceneContext extends AssistantContext {
|
|
85
|
+
sig?: string;
|
|
86
|
+
win?: string[];
|
|
87
|
+
src?: "factory" | "user" | null;
|
|
88
|
+
saved?: boolean;
|
|
89
|
+
genre?: string | null;
|
|
90
|
+
key?: string | null;
|
|
91
|
+
variation?: number | null;
|
|
92
|
+
filled?: number[];
|
|
93
|
+
song?: boolean;
|
|
94
|
+
solo?: number[];
|
|
95
|
+
}
|
|
96
|
+
/** Scene [ctx] line (context_format 35): the compact line's fields plus sig, win, src, saved, genre, key, var, filled, song, solo. */
|
|
97
|
+
export declare function renderSceneContextLine(ctx: AssistantSceneContext): string;
|
|
98
|
+
/** Scene-context user-turn content: ctx line, params line, raw text. */
|
|
99
|
+
export declare function withPromptContext(userText: string, ctx: AssistantSceneContext | null, paramsLine: string): string;
|
|
82
100
|
export interface HistoryExchange {
|
|
83
101
|
/** RAW user text of the past exchange (history turns carry no ctx line). */
|
|
84
102
|
user: string;
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* FunctionGemma wire format — renderer + parser.
|
|
3
3
|
*
|
|
4
4
|
* Byte-parity with HF `tokenizer.apply_chat_template` is REQUIRED and pinned by
|
|
5
|
-
* scripts/check-
|
|
6
|
-
* packages/
|
|
5
|
+
* scripts/check-functiongemma-format.mjs against fixtures dumped by
|
|
6
|
+
* packages/ml-research's pam_ml.contracts.fixtures.functiongemma. Empirical rules (from the
|
|
7
7
|
* fixtures, 2026-07-03, google/functiongemma-270m-it template):
|
|
8
8
|
*
|
|
9
9
|
* - Prompt starts with literal `<bos>` (template-added; serving layers that
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* - Schema objects render with keys sorted alphabetically at every level;
|
|
13
13
|
* `type` values are UPPERCASED; all schema strings are <escape>-wrapped.
|
|
14
14
|
* - Tool call/response argument objects ALSO sort keys at every level (the
|
|
15
|
-
* template dictsorts them — pinned by fixtures/hf_dictsort_probe.txt; the
|
|
15
|
+
* template dictsorts them — pinned by fixtures/functiongemma/hf_dictsort_probe.txt; the
|
|
16
16
|
* original fixtures were accidentally all-alphabetical and hid this);
|
|
17
17
|
* strings are <escape>-wrapped, numbers/booleans bare.
|
|
18
18
|
* - The tool call AND its function response live inside ONE continuous
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
* this byte-exactly.
|
|
27
27
|
* - Session context: `renderContextLine` renders the compact `[ctx]` state
|
|
28
28
|
* line prepended to the LAST user turn (grammar pinned against
|
|
29
|
-
* fixtures/
|
|
29
|
+
* fixtures/prompt_lines/context-format34.txt; Python twin: packages/ml-research/src/pam_ml/contracts/context.py).
|
|
30
30
|
*/
|
|
31
31
|
export const TRIGGER_PHRASE = "You are a model that can do function calling with the following functions";
|
|
32
32
|
/** Stop sequences for generation (per docs; <end_function_call> is deliberately
|
|
@@ -39,14 +39,14 @@ function escStr(s) {
|
|
|
39
39
|
// Jinja's dictsort (what the chat template uses on every object) is
|
|
40
40
|
// case-INSENSITIVE by default; both sorts here must match it exactly.
|
|
41
41
|
// Stable sort keeps insertion order on lowercase ties, same as Python.
|
|
42
|
-
function byKeyDictsort([a], [b]) {
|
|
42
|
+
export function byKeyDictsort([a], [b]) {
|
|
43
43
|
const la = a.toLowerCase();
|
|
44
44
|
const lb = b.toLowerCase();
|
|
45
45
|
return la < lb ? -1 : la > lb ? 1 : 0;
|
|
46
46
|
}
|
|
47
|
-
function renderNumber(n) {
|
|
47
|
+
export function renderNumber(n) {
|
|
48
48
|
if (!Number.isFinite(n))
|
|
49
|
-
throw new Error(`non-finite number in
|
|
49
|
+
throw new Error(`non-finite number in functiongemma render: ${n}`);
|
|
50
50
|
return Number.isInteger(n) ? String(n) : String(n);
|
|
51
51
|
}
|
|
52
52
|
/** Render a JSON-Schema node in declaration position: keys sorted, `type`
|
|
@@ -89,7 +89,7 @@ export function renderValue(v) {
|
|
|
89
89
|
.map(([k, val]) => `${k}:${renderValue(val)}`);
|
|
90
90
|
return `{${entries.join(",")}}`;
|
|
91
91
|
}
|
|
92
|
-
throw new Error(`unsupported value in
|
|
92
|
+
throw new Error(`unsupported value in functiongemma render: ${JSON.stringify(v)}`);
|
|
93
93
|
}
|
|
94
94
|
export function renderDeclaration(tool) {
|
|
95
95
|
const body = `{description:${escStr(tool.description)},parameters:${renderSchema(tool.parameters)}}`;
|
|
@@ -110,7 +110,7 @@ export function renderFunctionResponse(name, response) {
|
|
|
110
110
|
}
|
|
111
111
|
const LABEL_MAX = 24;
|
|
112
112
|
/** Basename, one extension stripped, whitespace→_, grammar-safe, ≤24 chars.
|
|
113
|
-
* Must match
|
|
113
|
+
* Must match pam_ml.contracts.context `sanitize_label` step for step. */
|
|
114
114
|
export function sanitizeContextLabel(name) {
|
|
115
115
|
let base = String(name).split(/[/\\]/).pop() ?? "";
|
|
116
116
|
base = base.replace(/\.[A-Za-z0-9]{1,4}$/, "");
|
|
@@ -120,7 +120,7 @@ export function sanitizeContextLabel(name) {
|
|
|
120
120
|
return base || "sample";
|
|
121
121
|
}
|
|
122
122
|
/** The compact `[ctx]` session-state line (fixed field order, all fields
|
|
123
|
-
* always present) — pinned against fixtures/
|
|
123
|
+
* always present) — pinned against fixtures/prompt_lines/context-format34.txt. */
|
|
124
124
|
export function renderContextLine(ctx) {
|
|
125
125
|
const cells = [...(ctx.cells ?? [])].sort((a, b) => a.id - b.id);
|
|
126
126
|
const cellStr = cells.map((c) => `${c.id}=${sanitizeContextLabel(c.name)}`).join(" ") || "none";
|
|
@@ -135,6 +135,29 @@ export function renderContextLine(ctx) {
|
|
|
135
135
|
export function withContext(userText, ctx) {
|
|
136
136
|
return ctx ? `${renderContextLine(ctx)}\n${userText}` : userText;
|
|
137
137
|
}
|
|
138
|
+
const idList = (values) => [...new Set((values ?? []).filter((id) => Number.isInteger(id) && id > 0))].sort((a, b) => a - b).join(",") || "none";
|
|
139
|
+
/** Scene [ctx] line (context_format 35): the compact line's fields plus sig, win, src, saved, genre, key, var, filled, song, solo. */
|
|
140
|
+
export function renderSceneContextLine(ctx) {
|
|
141
|
+
const cells = [...(ctx.cells ?? [])].sort((a, b) => a.id - b.id);
|
|
142
|
+
const cellStr = cells.map((c) => `${c.id}=${sanitizeContextLabel(c.name)}`).join(" ") || "none";
|
|
143
|
+
const sig = /^\d{1,2}\/\d{1,2}$/.test(ctx.sig ?? "") ? ctx.sig : "4/4";
|
|
144
|
+
const win = (ctx.win ?? []).filter((w) => /^[a-z0-9.]+$/.test(w)).sort().join(",") || "none";
|
|
145
|
+
const src = ctx.src === "factory" || ctx.src === "user" ? ctx.src : "none";
|
|
146
|
+
return `[ctx] bpm=${Math.round(ctx.bpm)} sig=${sig} playing=${ctx.playing ? "yes" : "no"}` +
|
|
147
|
+
` view=${ctx.view || "cells"} win:${win}` +
|
|
148
|
+
` preset=${ctx.preset ? sanitizeContextLabel(ctx.preset) : "none"}` +
|
|
149
|
+
` src=${src} saved=${ctx.saved === false ? "no" : "yes"}` +
|
|
150
|
+
` genre=${ctx.genre ? sanitizeContextLabel(ctx.genre) : "none"}` +
|
|
151
|
+
` key=${ctx.key ? sanitizeContextLabel(ctx.key) : "none"}` +
|
|
152
|
+
` var=${ctx.variation ? String(ctx.variation) : "none"} filled:${idList(ctx.filled)}` +
|
|
153
|
+
` song=${ctx.song ? "on" : "off"}` +
|
|
154
|
+
` sel=${ctx.sel ? String(ctx.sel) : "none"} muted:${idList(ctx.muted)} solo:${idList(ctx.solo)}` +
|
|
155
|
+
` cells: ${cellStr}`;
|
|
156
|
+
}
|
|
157
|
+
/** Scene-context user-turn content: ctx line, params line, raw text. */
|
|
158
|
+
export function withPromptContext(userText, ctx, paramsLine) {
|
|
159
|
+
return ctx ? `${renderSceneContextLine(ctx)}\n${paramsLine}\n${userText}` : userText;
|
|
160
|
+
}
|
|
138
161
|
/**
|
|
139
162
|
* Full generation prompt: declarations [+ completed history exchanges] +
|
|
140
163
|
* user turn + `<start_of_turn>model\n`.
|
|
@@ -289,4 +312,4 @@ function parseValueAt(text, p) {
|
|
|
289
312
|
return [false, end];
|
|
290
313
|
return [raw, end];
|
|
291
314
|
}
|
|
292
|
-
//# sourceMappingURL=
|
|
315
|
+
//# sourceMappingURL=functiongemma-format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"functiongemma-format.js","sourceRoot":"","sources":["../src/functiongemma-format.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { type ToolDef } from "./functiongemma-format.js";
|
|
2
|
+
export type GrammarMode = "lazy" | "full";
|
|
3
|
+
export interface GrammarOptions {
|
|
4
|
+
mode?: GrammarMode;
|
|
5
|
+
/** Upper bound on call blocks per turn; golds peak at 9, so runaways end parsable. */
|
|
6
|
+
maxCalls?: number;
|
|
7
|
+
}
|
|
8
|
+
export declare const CALL_TRIGGER = "<start_function_call>";
|
|
9
|
+
export declare const DEFAULT_MAX_CALLS = 12;
|
|
10
|
+
export declare function gbnfLiteral(text: string): string;
|
|
11
|
+
/** GBNF for one assistant turn's call blocks, generated from the toolpack the model is prompted with. */
|
|
12
|
+
export declare function buildToolGrammar(tools: ToolDef[], opts?: GrammarOptions): string;
|
|
13
|
+
/** llama-server request fields that apply `grammar` lazily from the first call token. */
|
|
14
|
+
export declare function lazyGrammarRequest(grammar: string): Record<string, unknown>;
|