@kortyx/prompts 0.2.1 → 0.2.3
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/CHANGELOG.md +18 -0
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,23 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [0.2.3](https://github.com/kortyx-io/kortyx/compare/prompts-v0.2.2...prompts-v0.2.3) (2026-10-18)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Dependencies
|
|
7
|
+
|
|
8
|
+
* The following workspace dependencies were updated
|
|
9
|
+
* dependencies
|
|
10
|
+
* @kortyx/usage-telemetry bumped to 0.5.0
|
|
11
|
+
|
|
12
|
+
## [0.2.2](https://github.com/kortyx-io/kortyx/compare/prompts-v0.2.1...prompts-v0.2.2) (2026-10-16)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
### Dependencies
|
|
16
|
+
|
|
17
|
+
* The following workspace dependencies were updated
|
|
18
|
+
* dependencies
|
|
19
|
+
* @kortyx/usage-telemetry bumped to 0.4.0
|
|
20
|
+
|
|
3
21
|
## [0.2.1](https://github.com/kortyx-io/kortyx/compare/prompts-v0.2.0...prompts-v0.2.1) (2026-10-13)
|
|
4
22
|
|
|
5
23
|
|
package/dist/index.js
CHANGED
|
@@ -472,7 +472,7 @@ var import_node = require("@kortyx/usage-telemetry/node");
|
|
|
472
472
|
// package.json
|
|
473
473
|
var package_default = {
|
|
474
474
|
name: "@kortyx/prompts",
|
|
475
|
-
version: "0.2.
|
|
475
|
+
version: "0.2.3",
|
|
476
476
|
description: "Typed, versioned prompts and portable Studio serving for Kortyx.",
|
|
477
477
|
license: "Apache-2.0",
|
|
478
478
|
main: "./dist/index.js",
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/compiler.ts","../src/contracts.ts","../src/references.ts","../src/usage.ts","../package.json","../src/source.ts"],"sourcesContent":["export * from \"./compiler\";\nexport * from \"./contracts\";\nexport * from \"./references\";\nexport * from \"./source\";\n","import Ajv2020 from \"ajv/dist/2020\";\nimport type { z } from \"zod\";\nimport {\n canonicalPromptJson,\n type PromptContent,\n PromptError,\n type PromptVersion,\n} from \"./contracts\";\nimport { expandPromptMessages } from \"./references\";\n\nconst ajv = new Ajv2020({\n strict: false,\n allErrors: true,\n validateFormats: false,\n ownProperties: true,\n});\nconst validators = new Map<string, ReturnType<typeof ajv.compile>>();\nconst compiledPrompts = new WeakSet<object>();\nconst usageMetadata = new WeakSet<object>();\nexport function isCompiledPrompt(value: unknown): value is CompiledPrompt {\n return Boolean(\n value && typeof value === \"object\" && compiledPrompts.has(value),\n );\n}\nexport function promptUsageMetadata(\n prompt: CompiledPrompt,\n): Record<string, unknown> {\n if (!isCompiledPrompt(prompt))\n throw new PromptError(\n \"PROMPT_REASON_INVALID\",\n \"Use a compiled prompt returned by usePrompt.\",\n );\n const metadata = Object.freeze({\n id: prompt.ref.id,\n version: prompt.ref.version,\n hash: prompt.ref.hash,\n environment: prompt.ref.environment,\n snapshotRevision: prompt.ref.snapshotRevision,\n ...(prompt.dependencies?.length\n ? { dependencies: prompt.dependencies }\n : {}),\n });\n usageMetadata.add(metadata);\n return metadata;\n}\nexport function isPromptUsageMetadata(value: unknown): value is {\n id: string;\n version: number;\n hash: string;\n environment: string;\n snapshotRevision: string;\n dependencies?: { id: string; version: number; hash: string }[];\n} {\n return Boolean(\n value && typeof value === \"object\" && usageMetadata.has(value),\n );\n}\nfunction freezeValue<T>(value: T, seen = new WeakSet<object>()): T {\n if (value && typeof value === \"object\" && !seen.has(value)) {\n seen.add(value);\n for (const item of Object.values(value)) freezeValue(item, seen);\n Object.freeze(value);\n }\n return value;\n}\nexport function validatePromptValue(\n schema: Record<string, unknown>,\n value: unknown,\n label: string,\n): void {\n const key = canonicalPromptJson(schema);\n let validator = validators.get(key);\n if (!validator) {\n if (validators.size >= 256) validators.clear();\n try {\n validator = ajv.compile(schema);\n } catch {\n throw new PromptError(\n \"PROMPT_SCHEMA_INVALID\",\n `${label} schema is invalid.`,\n );\n }\n validators.set(key, validator);\n }\n if (!validator(value))\n throw new PromptError(\n \"PROMPT_CONTRACT_MISMATCH\",\n `${label}: ${ajv.errorsText(validator.errors)}.`,\n );\n}\nconst placeholder = /\\{\\{\\s*([A-Za-z_][A-Za-z0-9_.]*)\\s*\\}\\}/g;\nexport function promptVariables(content: PromptContent): string[] {\n return [\n ...new Set(\n content.messages.flatMap((message) =>\n [...message.content.matchAll(placeholder)].map(\n (match) => match[1] as string,\n ),\n ),\n ),\n ];\n}\nexport function validatePromptContent(content: PromptContent): void {\n validatePromptValue(content.configSchema, content.config, \"Configuration\");\n // Compile both contracts before storing an executable version.\n try {\n ajv.compile(content.variablesSchema);\n } catch {\n throw new PromptError(\n \"PROMPT_SCHEMA_INVALID\",\n \"Template input schema is invalid.\",\n );\n }\n const inputs = content.variablesSchema.properties as\n | Record<string, unknown>\n | undefined;\n for (const variable of promptVariables(content)) {\n const top = variable.split(\".\")[0] as string;\n if (!inputs || !Object.hasOwn(inputs, top))\n throw new PromptError(\n \"PROMPT_VARIABLE_UNKNOWN\",\n `Declare template input ${top} in the input schema.`,\n );\n if (Object.hasOwn(content.config, top))\n throw new PromptError(\n \"PROMPT_VARIABLE_CONFIG_OVERLAP\",\n `${top} cannot be both a template input and saved configuration.`,\n );\n }\n}\nexport type PromptRef<\n Inputs = unknown,\n Config = unknown,\n Format extends \"system-user\" | \"chat\" = \"system-user\" | \"chat\",\n> = Readonly<{\n id: string;\n format: Format;\n variables: z.ZodType<Inputs>;\n config: z.ZodType<Config>;\n}>;\nexport function definePrompt<\n Inputs,\n Config,\n Format extends \"system-user\" | \"chat\",\n>(\n reference: PromptRef<Inputs, Config, Format>,\n): PromptRef<Inputs, Config, Format> {\n if (!reference.id || !reference.variables || !reference.config)\n throw new PromptError(\n \"PROMPT_REFERENCE_INVALID\",\n \"A prompt reference needs id, variables and config schemas.\",\n );\n return Object.freeze({ ...reference });\n}\nexport type CompiledPrompt<Config = unknown> = Readonly<{\n format: \"system-user\" | \"chat\";\n system?: string | undefined;\n user?: string | undefined;\n messages: { role: \"system\" | \"user\" | \"assistant\"; content: string }[];\n config: Config;\n dependencies?: { id: string; version: number; hash: string }[];\n ref: {\n id: string;\n version: number;\n hash: string;\n source: string;\n environment: string;\n snapshotRevision: string;\n };\n}>;\nexport function compilePrompt<Inputs, Config>(\n ref: PromptRef<Inputs, Config>,\n version: PromptVersion,\n variables: Inputs,\n identity: { source: string; environment: string; snapshotRevision: string },\n versions?: Readonly<Record<string, PromptVersion>>,\n): CompiledPrompt<Config> {\n if (version.id !== ref.id || version.content.format !== ref.format)\n throw new PromptError(\n \"PROMPT_CONTRACT_MISMATCH\",\n `Prompt ${ref.id} format or identity differs from the application contract.`,\n );\n const values = ref.variables.parse(variables);\n validatePromptValue(\n version.content.variablesSchema,\n values,\n \"Template inputs\",\n );\n validatePromptValue(\n version.content.configSchema,\n version.content.config,\n \"Configuration\",\n );\n const config = ref.config.parse(structuredClone(version.content.config));\n const expanded = expandPromptMessages(version, versions);\n if (expanded.used.length)\n validatePromptContent({ ...version.content, messages: expanded.messages });\n for (const child of expanded.used) {\n const properties = child.content.variablesSchema.properties;\n const childValues =\n properties && typeof properties === \"object\" && !Array.isArray(properties)\n ? Object.fromEntries(\n Object.keys(properties)\n .filter((key) => Object.hasOwn(values as object, key))\n .map((key) => [key, (values as Record<string, unknown>)[key]]),\n )\n : values;\n validatePromptValue(\n child.content.variablesSchema,\n childValues,\n `Inputs for ${child.id}`,\n );\n }\n const messages = expanded.messages.map((message) => ({\n role: message.role,\n content: message.content.replace(placeholder, (_, path: string) => {\n let value: unknown = values;\n for (const key of path.split(\".\")) {\n if (\n [\"__proto__\", \"constructor\", \"prototype\"].includes(key) ||\n !value ||\n typeof value !== \"object\" ||\n !Object.hasOwn(value, key)\n )\n throw new PromptError(\n \"PROMPT_VARIABLE_MISSING\",\n `Missing template input ${path}.`,\n );\n value = (value as Record<string, unknown>)[key];\n }\n if (value === undefined)\n throw new PromptError(\n \"PROMPT_VARIABLE_MISSING\",\n `Missing template input ${path}.`,\n );\n return typeof value === \"string\" ? value : canonicalPromptJson(value);\n }),\n }));\n const compiled = freezeValue({\n format: ref.format,\n messages,\n config,\n ...(expanded.used.length\n ? {\n dependencies: expanded.used.map(({ id, version, hash }) => ({\n id,\n version,\n hash,\n })),\n }\n : {}),\n ...(ref.format === \"system-user\"\n ? { system: messages[0]?.content, user: messages[1]?.content }\n : {}),\n ref: {\n id: ref.id,\n version: version.version,\n hash: version.hash,\n ...identity,\n },\n });\n compiledPrompts.add(compiled);\n return compiled;\n}\n","import { z } from \"zod\";\n\nexport const PROMPT_PROTOCOL_VERSION = 1 as const;\nexport const PromptKeySchema = z\n .string()\n .min(1)\n .max(200)\n .regex(/^[a-zA-Z0-9][a-zA-Z0-9_./-]*$/);\nexport const PromptTagSchema = z\n .string()\n .trim()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9][a-z0-9_-]*$/);\nexport const PromptMessageSchema = z\n .object({\n role: z.enum([\"system\", \"user\", \"assistant\"]),\n content: z.string().max(200_000),\n })\n .strict();\nexport const PromptContentSchema = z\n .object({\n format: z.enum([\"system-user\", \"chat\"]),\n messages: z.array(PromptMessageSchema).min(1).max(100),\n variablesSchema: z.record(z.string(), z.json()),\n configSchema: z.record(z.string(), z.json()),\n config: z.record(z.string(), z.json()),\n dependencies: z\n .array(\n z\n .object({\n id: PromptKeySchema,\n version: z.number().int().positive(),\n hash: z.string().regex(/^[a-f0-9]{64}$/),\n })\n .strict(),\n )\n .max(100)\n .default([]),\n })\n .strict()\n .superRefine((value, ctx) => {\n if (\n value.format === \"system-user\" &&\n (value.messages.length !== 2 ||\n value.messages[0]?.role !== \"system\" ||\n value.messages[1]?.role !== \"user\")\n )\n ctx.addIssue({\n code: \"custom\",\n message:\n \"system-user requires exactly one system message followed by one user message.\",\n path: [\"messages\"],\n });\n });\nexport const PromptVersionSchema = z.object({\n id: PromptKeySchema,\n version: z.number().int().positive(),\n hash: z.string().regex(/^[a-f0-9]{64}$/),\n content: PromptContentSchema,\n});\nexport const PromptSnapshotSchema = z\n .object({\n schemaVersion: z.literal(PROMPT_PROTOCOL_VERSION),\n environment: z.string().min(1).max(128),\n tag: PromptTagSchema.optional(),\n revision: z.string().min(1),\n versions: z.record(z.string(), PromptVersionSchema),\n source: z.enum([\"studio\", \"local\", \"cache\", \"fallback\", \"eval\"]),\n resolvedAt: z.iso.datetime(),\n requestedIds: z.array(PromptKeySchema).max(100).optional(),\n })\n .strict();\nexport type PromptContent = z.infer<typeof PromptContentSchema>;\nexport type PromptVersion = z.infer<typeof PromptVersionSchema>;\nexport type PromptSnapshot = z.infer<typeof PromptSnapshotSchema>;\n\nexport class PromptError extends Error {\n override name = \"PromptError\";\n constructor(\n readonly code: string,\n message: string,\n readonly status = 400,\n ) {\n super(message);\n }\n}\n\n/** The executable hash excludes mutable names, categories, authors and notes. */\nexport function canonicalPromptJson(value: unknown): string {\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value))\n return `[${value.map(canonicalPromptJson).join(\",\")}]`;\n return `{${Object.keys(value)\n .sort()\n .map(\n (key) =>\n `${JSON.stringify(key)}:${canonicalPromptJson((value as Record<string, unknown>)[key])}`,\n )\n .join(\",\")}}`;\n}\nexport async function promptHash(content: PromptContent): Promise<string> {\n const bytes = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(canonicalPromptJson(content)),\n );\n return Array.from(new Uint8Array(bytes), (b) =>\n b.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n}\n\nexport async function verifyPromptSnapshot(\n value: unknown,\n): Promise<PromptSnapshot> {\n const parsed = PromptSnapshotSchema.safeParse(value);\n if (!parsed.success)\n throw new PromptError(\n \"PROMPT_SNAPSHOT_INVALID\",\n \"The prompt snapshot does not match the serving contract.\",\n );\n const snapshot = parsed.data;\n if (Object.keys(snapshot.versions).length > 200)\n throw new PromptError(\n \"PROMPT_SNAPSHOT_LIMIT\",\n \"A snapshot supports at most 200 versions.\",\n );\n for (const [key, version] of Object.entries(snapshot.versions)) {\n if (\n key !== version.id ||\n (await promptHash(version.content)) !== version.hash\n )\n throw new PromptError(\n \"PROMPT_HASH_MISMATCH\",\n `Prompt ${key} did not match its immutable hash.`,\n );\n for (const dependency of version.content.dependencies) {\n const actual = snapshot.versions[dependency.id];\n if (\n !actual ||\n actual.version !== dependency.version ||\n actual.hash !== dependency.hash\n )\n throw new PromptError(\n \"PROMPT_DEPENDENCY_MISMATCH\",\n `Missing exact dependency ${dependency.id}@${dependency.version}.`,\n );\n }\n }\n const visit = (key: string, active: Set<string>, done: Set<string>) => {\n if (active.has(key))\n throw new PromptError(\n \"PROMPT_DEPENDENCY_CYCLE\",\n `Prompt dependency cycle at ${key}.`,\n );\n if (done.has(key)) return;\n active.add(key);\n for (const dep of snapshot.versions[key]?.content.dependencies ?? [])\n visit(dep.id, active, done);\n active.delete(key);\n done.add(key);\n };\n const done = new Set<string>();\n for (const key of Object.keys(snapshot.versions)) visit(key, new Set(), done);\n const freeze = (value: unknown): void => {\n if (value && typeof value === \"object\" && !Object.isFrozen(value)) {\n for (const nested of Object.values(value)) freeze(nested);\n Object.freeze(value);\n }\n };\n freeze(snapshot);\n return snapshot;\n}\n","import {\n type PromptContent,\n PromptError,\n type PromptVersion,\n} from \"./contracts\";\n\n// Display names are editable; persisted references use stable keys and exact\n// versions/hashes in the existing dependency manifest.\nexport const promptReferencePattern =\n /\\[\\[prompt:([a-zA-Z0-9][a-zA-Z0-9_./-]*)\\]\\]/g;\nexport function promptReferenceToken(id: string) {\n return `[[prompt:${id}]]`;\n}\nexport function promptReferences(content: PromptContent): string[] {\n return [\n ...new Set(\n content.messages.flatMap((message) =>\n [...message.content.matchAll(promptReferencePattern)].map(\n (match) => match[1]!,\n ),\n ),\n ),\n ];\n}\nexport function expandPromptMessages(\n root: PromptVersion,\n versions: Readonly<Record<string, PromptVersion>> = {},\n): { messages: PromptContent[\"messages\"]; used: PromptVersion[] } {\n const used = new Map<string, PromptVersion>();\n const cache = new Map<string, string>();\n const expand = (\n owner: PromptVersion,\n text: string,\n role: PromptContent[\"messages\"][number][\"role\"],\n active: Set<string>,\n ): string => {\n const parts: string[] = [];\n let size = 0,\n position = 0;\n const append = (part: string) => {\n size += part.length;\n if (size > 200_000)\n throw new PromptError(\n \"PROMPT_REFERENCE_LIMIT\",\n \"An expanded message cannot exceed 200,000 characters.\",\n );\n parts.push(part);\n };\n for (const match of text.matchAll(promptReferencePattern)) {\n append(text.slice(position, match.index));\n position = match.index! + match[0].length;\n const id = match[1]!;\n const dependency = owner.content.dependencies.find(\n (item) => item.id === id,\n );\n const child = versions[id];\n if (\n !dependency ||\n !child ||\n child.version !== dependency.version ||\n child.hash !== dependency.hash\n )\n throw new PromptError(\n \"PROMPT_REFERENCE_MISSING\",\n `Include an exact dependency for referenced prompt ${id}.`,\n );\n if (active.has(id) || active.size >= 200)\n throw new PromptError(\n \"PROMPT_DEPENDENCY_CYCLE\",\n `Prompt reference cycle at ${id}.`,\n );\n const messages = child.content.messages.filter(\n (message) => message.role === role,\n );\n if (!messages.length)\n throw new PromptError(\n \"PROMPT_REFERENCE_ROLE\",\n `${id} has no ${role} message to include.`,\n );\n used.set(id, child);\n const cacheKey = `${id}@${child.version}:${role}`;\n let included = cache.get(cacheKey);\n if (included === undefined) {\n const next = new Set(active).add(id);\n const chunks: string[] = [];\n let length = 0;\n for (const message of messages) {\n const chunk = expand(child, message.content, role, next);\n length += chunk.length + (chunks.length ? 2 : 0);\n if (length > 200_000)\n throw new PromptError(\n \"PROMPT_REFERENCE_LIMIT\",\n \"An expanded message cannot exceed 200,000 characters.\",\n );\n chunks.push(chunk);\n }\n included = chunks.join(\"\\n\\n\");\n cache.set(cacheKey, included);\n }\n append(included);\n }\n append(text.slice(position));\n return parts.join(\"\");\n };\n return {\n messages: root.content.messages.map((message) => ({\n ...message,\n content: expand(root, message.content, message.role, new Set([root.id])),\n })),\n used: [...used.values()],\n };\n}\n","import type { UsageTelemetry } from \"@kortyx/usage-telemetry\";\nimport { getUsageTelemetry } from \"@kortyx/usage-telemetry/node\";\nimport packageJson from \"../package.json\";\n\nconst client = () => getUsageTelemetry(\"prompts\", packageJson.version);\nexport const usage: Pick<\n UsageTelemetry,\n \"start\" | \"feature\" | \"measure\" | \"flush\"\n> = {\n start: (...args) => client().start(...args),\n feature: (...args) => client().feature(...args),\n measure: (...args) => client().measure(...args),\n flush: () => client().flush(),\n};\n","{\n \"name\": \"@kortyx/prompts\",\n \"version\": \"0.2.1\",\n \"description\": \"Typed, versioned prompts and portable Studio serving for Kortyx.\",\n \"license\": \"Apache-2.0\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./browser\": {\n \"types\": \"./dist/browser.d.ts\",\n \"default\": \"./dist/browser.js\"\n }\n },\n \"files\": [\n \"dist/**\",\n \"README.md\",\n \"CHANGELOG.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsc --watch\",\n \"type-check\": \"tsc --noEmit -p tsconfig.test.json\",\n \"test\": \"vitest run && pnpm -s type-check\",\n \"coverage\": \"vitest run --coverage && pnpm -s type-check\",\n \"lint\": \"biome check src test\"\n },\n \"dependencies\": {\n \"ajv\": \"8.18.0\",\n \"zod\": \"catalog:\",\n \"@kortyx/usage-telemetry\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:\",\n \"vitest\": \"catalog:\",\n \"@vitest/coverage-v8\": \"catalog:\",\n \"@types/node\": \"catalog:\"\n },\n \"sideEffects\": false,\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/kortyx-io/kortyx.git\",\n \"directory\": \"packages/prompts\"\n }\n}\n","import { type CompiledPrompt, compilePrompt, type PromptRef } from \"./compiler\";\nimport {\n PromptError,\n type PromptSnapshot,\n PromptTagSchema,\n verifyPromptSnapshot,\n} from \"./contracts\";\nimport { usage } from \"./usage\";\n\nexport interface PromptSource {\n readonly environment?: string;\n readonly tag?: string;\n readonly identity: string;\n resolve(\n ids: readonly string[],\n options: {\n environment: string;\n tag?: string;\n versions?: Record<string, number>;\n signal?: AbortSignal;\n },\n ): Promise<PromptSnapshot>;\n}\nexport interface PromptCache {\n get(key: string): Promise<PromptSnapshot | undefined>;\n set(key: string, snapshot: PromptSnapshot): Promise<void>;\n}\nexport interface PromptExecution {\n recordUsage(usage: PromptUsageReceipt): void;\n snapshot(stored?: unknown): Promise<PromptSnapshot>;\n pin(id: string, version: number, stored?: unknown): Promise<PromptSnapshot>;\n resolve<Inputs, Config>(\n ref: PromptRef<Inputs, Config>,\n options: {\n variables: Inputs;\n version?: number;\n stored?: unknown;\n pin?: PromptSnapshot;\n },\n ): Promise<CompiledPrompt<Config>>;\n}\nexport interface PromptManager {\n definitions: readonly PromptRef[];\n start(options?: {\n snapshot?: PromptSnapshot;\n signal?: AbortSignal;\n onUsage?: (usage: PromptUsageReceipt) => void;\n }): PromptExecution;\n}\nexport type PromptUsageReceipt = {\n id: string;\n version: number;\n hash: string;\n environment: string;\n snapshotRevision: string;\n model?: string;\n};\nexport function createPrompts(options: {\n definitions: readonly PromptRef[];\n source: PromptSource;\n environment?: string;\n fallback?: \"last-known-good\" | \"error\";\n maxStaleMs?: number;\n cache?: PromptCache;\n}): PromptManager {\n const ids = options.definitions.map((ref) => ref.id),\n tag = PromptTagSchema.parse(options.source.tag ?? \"live\"),\n environment =\n options.environment ?? options.source.environment ?? \"production\";\n if (\n options.maxStaleMs !== undefined &&\n (!Number.isFinite(options.maxStaleMs) || options.maxStaleMs < 0)\n )\n throw new PromptError(\n \"PROMPT_CACHE_INVALID\",\n \"maxStaleMs must be a finite, nonnegative duration.\",\n );\n if (options.source.environment && options.source.environment !== environment)\n throw new PromptError(\n \"PROMPT_ENVIRONMENT_MISMATCH\",\n \"Source and manager environments must match.\",\n );\n if (new Set(ids).size !== ids.length)\n throw new PromptError(\n \"PROMPT_REFERENCE_DUPLICATE\",\n \"Registered prompt IDs must be unique.\",\n );\n let lastGood: PromptSnapshot | undefined;\n const cacheKey = `${options.source.identity}:${environment}:${tag}:${JSON.stringify([...ids].sort())}`;\n const fresh = async (signal?: AbortSignal) => {\n const pending = options.source\n .resolve(ids, { environment, tag, ...(signal ? { signal } : {}) })\n .then(verifyPromptSnapshot)\n .then(async (value) => {\n for (const id of ids)\n if (!value.versions[id])\n throw new PromptError(\n \"PROMPT_NOT_ASSIGNED\",\n `No ${tag} tag for ${id}.`,\n 404,\n );\n if (value.environment !== environment)\n throw new PromptError(\n \"PROMPT_ENVIRONMENT_MISMATCH\",\n \"Source returned a different environment.\",\n );\n if ((value.tag ?? \"live\") !== tag)\n throw new PromptError(\n \"PROMPT_TAG_MISMATCH\",\n \"Source returned a different prompt tag.\",\n );\n lastGood = value;\n await options.cache?.set(cacheKey, value);\n return value;\n });\n try {\n return await pending;\n } catch (error) {\n if (\n signal?.aborted ||\n options.fallback !== \"last-known-good\" ||\n (error instanceof PromptError &&\n error.status < 500 &&\n error.status !== 429)\n )\n throw error;\n const cached = lastGood ?? (await options.cache?.get(cacheKey));\n if (\n !cached ||\n cached.environment !== environment ||\n (cached.tag ?? \"live\") !== tag ||\n Date.parse(cached.resolvedAt) > Date.now() + 30_000 ||\n Date.now() - Date.parse(cached.resolvedAt) >\n (options.maxStaleMs ?? 300_000)\n )\n throw error;\n return {\n ...(await verifyPromptSnapshot(cached)),\n source: \"fallback\" as const,\n };\n }\n };\n return {\n definitions: options.definitions,\n start(start = {}) {\n let snapshotPromise: Promise<PromptSnapshot> | undefined;\n const snapshot = (stored?: unknown) => {\n if (snapshotPromise) return snapshotPromise;\n snapshotPromise = stored\n ? verifyPromptSnapshot(stored).then((value) => {\n if (value.environment !== environment)\n throw new PromptError(\n \"PROMPT_ENVIRONMENT_MISMATCH\",\n \"Stored snapshot belongs to another environment.\",\n );\n return value;\n })\n : start.snapshot\n ? verifyPromptSnapshot(start.snapshot).then((value) => {\n if (\n value.source !== \"eval\" ||\n value.environment !== environment\n )\n throw new PromptError(\n \"PROMPT_EVAL_SNAPSHOT_INVALID\",\n \"An eval snapshot must match the configured environment.\",\n );\n return value;\n })\n : fresh(start.signal);\n return snapshotPromise;\n };\n const pins = new Map<string, Promise<PromptSnapshot>>();\n const pin = async (id: string, version: number, stored?: unknown) => {\n const baseline = await snapshot();\n if (\n baseline.source === \"eval\" &&\n baseline.versions[id]?.version !== version\n )\n throw new PromptError(\n \"PROMPT_EVAL_PIN_CONFLICT\",\n `Pinned ${id}@${version} conflicts with the eval snapshot.`,\n );\n const key = `${id}@${version}`;\n let pendingPin = pins.get(key);\n if (!pendingPin) {\n pendingPin = (\n stored\n ? verifyPromptSnapshot(stored)\n : baseline.versions[id]?.version === version\n ? Promise.resolve(baseline)\n : options.source\n .resolve([id], {\n environment,\n tag,\n versions: { [id]: version },\n ...(start.signal ? { signal: start.signal } : {}),\n })\n .then(verifyPromptSnapshot)\n ).then((value) => {\n if (\n value.environment !== environment ||\n value.versions[id]?.version !== version\n )\n throw new PromptError(\n \"PROMPT_PIN_MISMATCH\",\n `Source returned a different pin for ${id}.`,\n );\n return value;\n });\n pins.set(key, pendingPin);\n }\n return pendingPin;\n };\n return {\n snapshot,\n pin,\n recordUsage(usage) {\n start.onUsage?.(usage);\n },\n async resolve(ref, args) {\n const scope = usage.start(\"sdk.prompt.resolve\");\n try {\n if (!ids.includes(ref.id))\n throw new PromptError(\n \"PROMPT_NOT_REGISTERED\",\n `Register ${ref.id} with createPrompts.`,\n );\n const resolved = await snapshot(args.stored);\n let selectedSnapshot = resolved;\n let selected = resolved.versions[ref.id];\n if (\n args.version !== undefined &&\n selected?.version !== args.version\n ) {\n const pinned = await pin(ref.id, args.version, args.pin);\n selectedSnapshot = pinned;\n selected = pinned.versions[ref.id];\n if (selected?.version !== args.version)\n throw new PromptError(\n \"PROMPT_PIN_MISMATCH\",\n `Source returned a different version of ${ref.id}.`,\n );\n }\n if (!selected)\n throw new PromptError(\n \"PROMPT_NOT_ASSIGNED\",\n `No version resolved for ${ref.id}.`,\n 404,\n );\n const compiled = compilePrompt(\n ref,\n selected,\n args.variables,\n {\n source: selectedSnapshot.source,\n environment: selectedSnapshot.environment,\n snapshotRevision: selectedSnapshot.revision,\n },\n selectedSnapshot.versions,\n );\n scope.end(\"success\", { source: selectedSnapshot.source });\n return compiled;\n } catch (error) {\n scope.fail(error);\n throw error;\n }\n },\n };\n },\n };\n}\nexport function studioPromptSource(options: {\n apiUrl: string;\n apiKey: string;\n /** Version tag to serve. Promotion updates live; other tags are managed manually. */\n tag?: string;\n environment?: string;\n projectId?: string;\n environmentId?: string;\n timeoutMs?: number;\n retries?: number;\n fetch?: typeof fetch;\n}): PromptSource {\n const url = new URL(options.apiUrl);\n if (!/^https?:$/.test(url.protocol) || url.username || url.password)\n throw new PromptError(\n \"PROMPT_SOURCE_INVALID\",\n \"Use an HTTP API origin without embedded credentials.\",\n );\n const request = options.fetch ?? fetch;\n const publicKeyId =\n /^ktyx_(?:test|live)_([^_]+)_/.exec(options.apiKey)?.[1] ??\n crypto.randomUUID();\n return {\n identity: `${url.origin}${url.pathname}:${options.projectId ?? \"\"}:${publicKeyId}:${options.environmentId ?? \"\"}`,\n tag: PromptTagSchema.parse(options.tag ?? \"live\"),\n ...(options.environment ? { environment: options.environment } : {}),\n async resolve(ids, args) {\n for (let attempt = 0; ; attempt++) {\n try {\n const signal = AbortSignal.any([\n AbortSignal.timeout(options.timeoutMs ?? 5000),\n ...(args.signal ? [args.signal] : []),\n ]);\n const response = await request(\n `${options.apiUrl.replace(/\\/$/, \"\")}/v1/prompts/resolve`,\n {\n method: \"POST\",\n signal,\n headers: {\n authorization: `Bearer ${options.apiKey}`,\n \"content-type\": \"application/json\",\n ...(options.projectId\n ? { \"x-kortyx-project-id\": options.projectId }\n : {}),\n ...(options.environmentId\n ? { \"x-kortyx-environment-id\": options.environmentId }\n : {}),\n },\n body: JSON.stringify({\n schemaVersion: 1,\n ids,\n tag: options.tag ?? args.tag ?? \"live\",\n environment: options.environment ?? args.environment,\n ...(args.versions ? { versions: args.versions } : {}),\n }),\n },\n );\n if (!response.ok)\n throw new PromptError(\n \"PROMPT_SOURCE_HTTP\",\n `Prompt serving failed (HTTP ${response.status}).`,\n response.status,\n );\n const reader = response.body?.getReader();\n if (!reader)\n throw new PromptError(\n \"PROMPT_SNAPSHOT_INVALID\",\n \"Prompt serving returned an empty response.\",\n );\n const decoder = new TextDecoder();\n let body = \"\",\n bytes = 0;\n try {\n for (;;) {\n const chunk = await reader.read();\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > 20 * 1024 * 1024)\n throw new PromptError(\n \"PROMPT_SNAPSHOT_LIMIT\",\n \"Prompt serving exceeded the 20 MiB response limit.\",\n );\n body += decoder.decode(chunk.value, { stream: true });\n }\n body += decoder.decode();\n let value: unknown;\n try {\n value = JSON.parse(body);\n } catch {\n throw new PromptError(\n \"PROMPT_SNAPSHOT_INVALID\",\n \"Prompt serving returned invalid JSON.\",\n );\n }\n return await verifyPromptSnapshot(value);\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n } catch (error) {\n if (\n args.signal?.aborted ||\n attempt >= (options.retries ?? 1) ||\n (error instanceof PromptError &&\n error.status < 500 &&\n error.status !== 429)\n )\n throw error;\n }\n }\n },\n };\n}\nexport function localPromptSource(snapshot: PromptSnapshot): PromptSource {\n return {\n identity: `local:${snapshot.revision}`,\n environment: snapshot.environment,\n tag: snapshot.tag ?? \"live\",\n async resolve(ids, args) {\n const verified = await verifyPromptSnapshot(snapshot);\n if (args.environment !== verified.environment)\n throw new PromptError(\n \"PROMPT_ENVIRONMENT_MISMATCH\",\n \"Local snapshot environment differs from the requested environment.\",\n );\n for (const id of ids)\n if (\n !verified.versions[id] ||\n (args.versions?.[id] &&\n verified.versions[id]?.version !== args.versions[id])\n )\n throw new PromptError(\n \"PROMPT_NOT_FOUND\",\n `Local snapshot does not contain ${id}.`,\n 404,\n );\n return { ...verified, source: \"local\" };\n },\n };\n}\n"],"mappings":"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","names":["done","value","Ajv2020","version","usage"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/compiler.ts","../src/contracts.ts","../src/references.ts","../src/usage.ts","../package.json","../src/source.ts"],"sourcesContent":["export * from \"./compiler\";\nexport * from \"./contracts\";\nexport * from \"./references\";\nexport * from \"./source\";\n","import Ajv2020 from \"ajv/dist/2020\";\nimport type { z } from \"zod\";\nimport {\n canonicalPromptJson,\n type PromptContent,\n PromptError,\n type PromptVersion,\n} from \"./contracts\";\nimport { expandPromptMessages } from \"./references\";\n\nconst ajv = new Ajv2020({\n strict: false,\n allErrors: true,\n validateFormats: false,\n ownProperties: true,\n});\nconst validators = new Map<string, ReturnType<typeof ajv.compile>>();\nconst compiledPrompts = new WeakSet<object>();\nconst usageMetadata = new WeakSet<object>();\nexport function isCompiledPrompt(value: unknown): value is CompiledPrompt {\n return Boolean(\n value && typeof value === \"object\" && compiledPrompts.has(value),\n );\n}\nexport function promptUsageMetadata(\n prompt: CompiledPrompt,\n): Record<string, unknown> {\n if (!isCompiledPrompt(prompt))\n throw new PromptError(\n \"PROMPT_REASON_INVALID\",\n \"Use a compiled prompt returned by usePrompt.\",\n );\n const metadata = Object.freeze({\n id: prompt.ref.id,\n version: prompt.ref.version,\n hash: prompt.ref.hash,\n environment: prompt.ref.environment,\n snapshotRevision: prompt.ref.snapshotRevision,\n ...(prompt.dependencies?.length\n ? { dependencies: prompt.dependencies }\n : {}),\n });\n usageMetadata.add(metadata);\n return metadata;\n}\nexport function isPromptUsageMetadata(value: unknown): value is {\n id: string;\n version: number;\n hash: string;\n environment: string;\n snapshotRevision: string;\n dependencies?: { id: string; version: number; hash: string }[];\n} {\n return Boolean(\n value && typeof value === \"object\" && usageMetadata.has(value),\n );\n}\nfunction freezeValue<T>(value: T, seen = new WeakSet<object>()): T {\n if (value && typeof value === \"object\" && !seen.has(value)) {\n seen.add(value);\n for (const item of Object.values(value)) freezeValue(item, seen);\n Object.freeze(value);\n }\n return value;\n}\nexport function validatePromptValue(\n schema: Record<string, unknown>,\n value: unknown,\n label: string,\n): void {\n const key = canonicalPromptJson(schema);\n let validator = validators.get(key);\n if (!validator) {\n if (validators.size >= 256) validators.clear();\n try {\n validator = ajv.compile(schema);\n } catch {\n throw new PromptError(\n \"PROMPT_SCHEMA_INVALID\",\n `${label} schema is invalid.`,\n );\n }\n validators.set(key, validator);\n }\n if (!validator(value))\n throw new PromptError(\n \"PROMPT_CONTRACT_MISMATCH\",\n `${label}: ${ajv.errorsText(validator.errors)}.`,\n );\n}\nconst placeholder = /\\{\\{\\s*([A-Za-z_][A-Za-z0-9_.]*)\\s*\\}\\}/g;\nexport function promptVariables(content: PromptContent): string[] {\n return [\n ...new Set(\n content.messages.flatMap((message) =>\n [...message.content.matchAll(placeholder)].map(\n (match) => match[1] as string,\n ),\n ),\n ),\n ];\n}\nexport function validatePromptContent(content: PromptContent): void {\n validatePromptValue(content.configSchema, content.config, \"Configuration\");\n // Compile both contracts before storing an executable version.\n try {\n ajv.compile(content.variablesSchema);\n } catch {\n throw new PromptError(\n \"PROMPT_SCHEMA_INVALID\",\n \"Template input schema is invalid.\",\n );\n }\n const inputs = content.variablesSchema.properties as\n | Record<string, unknown>\n | undefined;\n for (const variable of promptVariables(content)) {\n const top = variable.split(\".\")[0] as string;\n if (!inputs || !Object.hasOwn(inputs, top))\n throw new PromptError(\n \"PROMPT_VARIABLE_UNKNOWN\",\n `Declare template input ${top} in the input schema.`,\n );\n if (Object.hasOwn(content.config, top))\n throw new PromptError(\n \"PROMPT_VARIABLE_CONFIG_OVERLAP\",\n `${top} cannot be both a template input and saved configuration.`,\n );\n }\n}\nexport type PromptRef<\n Inputs = unknown,\n Config = unknown,\n Format extends \"system-user\" | \"chat\" = \"system-user\" | \"chat\",\n> = Readonly<{\n id: string;\n format: Format;\n variables: z.ZodType<Inputs>;\n config: z.ZodType<Config>;\n}>;\nexport function definePrompt<\n Inputs,\n Config,\n Format extends \"system-user\" | \"chat\",\n>(\n reference: PromptRef<Inputs, Config, Format>,\n): PromptRef<Inputs, Config, Format> {\n if (!reference.id || !reference.variables || !reference.config)\n throw new PromptError(\n \"PROMPT_REFERENCE_INVALID\",\n \"A prompt reference needs id, variables and config schemas.\",\n );\n return Object.freeze({ ...reference });\n}\nexport type CompiledPrompt<Config = unknown> = Readonly<{\n format: \"system-user\" | \"chat\";\n system?: string | undefined;\n user?: string | undefined;\n messages: { role: \"system\" | \"user\" | \"assistant\"; content: string }[];\n config: Config;\n dependencies?: { id: string; version: number; hash: string }[];\n ref: {\n id: string;\n version: number;\n hash: string;\n source: string;\n environment: string;\n snapshotRevision: string;\n };\n}>;\nexport function compilePrompt<Inputs, Config>(\n ref: PromptRef<Inputs, Config>,\n version: PromptVersion,\n variables: Inputs,\n identity: { source: string; environment: string; snapshotRevision: string },\n versions?: Readonly<Record<string, PromptVersion>>,\n): CompiledPrompt<Config> {\n if (version.id !== ref.id || version.content.format !== ref.format)\n throw new PromptError(\n \"PROMPT_CONTRACT_MISMATCH\",\n `Prompt ${ref.id} format or identity differs from the application contract.`,\n );\n const values = ref.variables.parse(variables);\n validatePromptValue(\n version.content.variablesSchema,\n values,\n \"Template inputs\",\n );\n validatePromptValue(\n version.content.configSchema,\n version.content.config,\n \"Configuration\",\n );\n const config = ref.config.parse(structuredClone(version.content.config));\n const expanded = expandPromptMessages(version, versions);\n if (expanded.used.length)\n validatePromptContent({ ...version.content, messages: expanded.messages });\n for (const child of expanded.used) {\n const properties = child.content.variablesSchema.properties;\n const childValues =\n properties && typeof properties === \"object\" && !Array.isArray(properties)\n ? Object.fromEntries(\n Object.keys(properties)\n .filter((key) => Object.hasOwn(values as object, key))\n .map((key) => [key, (values as Record<string, unknown>)[key]]),\n )\n : values;\n validatePromptValue(\n child.content.variablesSchema,\n childValues,\n `Inputs for ${child.id}`,\n );\n }\n const messages = expanded.messages.map((message) => ({\n role: message.role,\n content: message.content.replace(placeholder, (_, path: string) => {\n let value: unknown = values;\n for (const key of path.split(\".\")) {\n if (\n [\"__proto__\", \"constructor\", \"prototype\"].includes(key) ||\n !value ||\n typeof value !== \"object\" ||\n !Object.hasOwn(value, key)\n )\n throw new PromptError(\n \"PROMPT_VARIABLE_MISSING\",\n `Missing template input ${path}.`,\n );\n value = (value as Record<string, unknown>)[key];\n }\n if (value === undefined)\n throw new PromptError(\n \"PROMPT_VARIABLE_MISSING\",\n `Missing template input ${path}.`,\n );\n return typeof value === \"string\" ? value : canonicalPromptJson(value);\n }),\n }));\n const compiled = freezeValue({\n format: ref.format,\n messages,\n config,\n ...(expanded.used.length\n ? {\n dependencies: expanded.used.map(({ id, version, hash }) => ({\n id,\n version,\n hash,\n })),\n }\n : {}),\n ...(ref.format === \"system-user\"\n ? { system: messages[0]?.content, user: messages[1]?.content }\n : {}),\n ref: {\n id: ref.id,\n version: version.version,\n hash: version.hash,\n ...identity,\n },\n });\n compiledPrompts.add(compiled);\n return compiled;\n}\n","import { z } from \"zod\";\n\nexport const PROMPT_PROTOCOL_VERSION = 1 as const;\nexport const PromptKeySchema = z\n .string()\n .min(1)\n .max(200)\n .regex(/^[a-zA-Z0-9][a-zA-Z0-9_./-]*$/);\nexport const PromptTagSchema = z\n .string()\n .trim()\n .min(1)\n .max(64)\n .regex(/^[a-z0-9][a-z0-9_-]*$/);\nexport const PromptMessageSchema = z\n .object({\n role: z.enum([\"system\", \"user\", \"assistant\"]),\n content: z.string().max(200_000),\n })\n .strict();\nexport const PromptContentSchema = z\n .object({\n format: z.enum([\"system-user\", \"chat\"]),\n messages: z.array(PromptMessageSchema).min(1).max(100),\n variablesSchema: z.record(z.string(), z.json()),\n configSchema: z.record(z.string(), z.json()),\n config: z.record(z.string(), z.json()),\n dependencies: z\n .array(\n z\n .object({\n id: PromptKeySchema,\n version: z.number().int().positive(),\n hash: z.string().regex(/^[a-f0-9]{64}$/),\n })\n .strict(),\n )\n .max(100)\n .default([]),\n })\n .strict()\n .superRefine((value, ctx) => {\n if (\n value.format === \"system-user\" &&\n (value.messages.length !== 2 ||\n value.messages[0]?.role !== \"system\" ||\n value.messages[1]?.role !== \"user\")\n )\n ctx.addIssue({\n code: \"custom\",\n message:\n \"system-user requires exactly one system message followed by one user message.\",\n path: [\"messages\"],\n });\n });\nexport const PromptVersionSchema = z.object({\n id: PromptKeySchema,\n version: z.number().int().positive(),\n hash: z.string().regex(/^[a-f0-9]{64}$/),\n content: PromptContentSchema,\n});\nexport const PromptSnapshotSchema = z\n .object({\n schemaVersion: z.literal(PROMPT_PROTOCOL_VERSION),\n environment: z.string().min(1).max(128),\n tag: PromptTagSchema.optional(),\n revision: z.string().min(1),\n versions: z.record(z.string(), PromptVersionSchema),\n source: z.enum([\"studio\", \"local\", \"cache\", \"fallback\", \"eval\"]),\n resolvedAt: z.iso.datetime(),\n requestedIds: z.array(PromptKeySchema).max(100).optional(),\n })\n .strict();\nexport type PromptContent = z.infer<typeof PromptContentSchema>;\nexport type PromptVersion = z.infer<typeof PromptVersionSchema>;\nexport type PromptSnapshot = z.infer<typeof PromptSnapshotSchema>;\n\nexport class PromptError extends Error {\n override name = \"PromptError\";\n constructor(\n readonly code: string,\n message: string,\n readonly status = 400,\n ) {\n super(message);\n }\n}\n\n/** The executable hash excludes mutable names, categories, authors and notes. */\nexport function canonicalPromptJson(value: unknown): string {\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value))\n return `[${value.map(canonicalPromptJson).join(\",\")}]`;\n return `{${Object.keys(value)\n .sort()\n .map(\n (key) =>\n `${JSON.stringify(key)}:${canonicalPromptJson((value as Record<string, unknown>)[key])}`,\n )\n .join(\",\")}}`;\n}\nexport async function promptHash(content: PromptContent): Promise<string> {\n const bytes = await crypto.subtle.digest(\n \"SHA-256\",\n new TextEncoder().encode(canonicalPromptJson(content)),\n );\n return Array.from(new Uint8Array(bytes), (b) =>\n b.toString(16).padStart(2, \"0\"),\n ).join(\"\");\n}\n\nexport async function verifyPromptSnapshot(\n value: unknown,\n): Promise<PromptSnapshot> {\n const parsed = PromptSnapshotSchema.safeParse(value);\n if (!parsed.success)\n throw new PromptError(\n \"PROMPT_SNAPSHOT_INVALID\",\n \"The prompt snapshot does not match the serving contract.\",\n );\n const snapshot = parsed.data;\n if (Object.keys(snapshot.versions).length > 200)\n throw new PromptError(\n \"PROMPT_SNAPSHOT_LIMIT\",\n \"A snapshot supports at most 200 versions.\",\n );\n for (const [key, version] of Object.entries(snapshot.versions)) {\n if (\n key !== version.id ||\n (await promptHash(version.content)) !== version.hash\n )\n throw new PromptError(\n \"PROMPT_HASH_MISMATCH\",\n `Prompt ${key} did not match its immutable hash.`,\n );\n for (const dependency of version.content.dependencies) {\n const actual = snapshot.versions[dependency.id];\n if (\n !actual ||\n actual.version !== dependency.version ||\n actual.hash !== dependency.hash\n )\n throw new PromptError(\n \"PROMPT_DEPENDENCY_MISMATCH\",\n `Missing exact dependency ${dependency.id}@${dependency.version}.`,\n );\n }\n }\n const visit = (key: string, active: Set<string>, done: Set<string>) => {\n if (active.has(key))\n throw new PromptError(\n \"PROMPT_DEPENDENCY_CYCLE\",\n `Prompt dependency cycle at ${key}.`,\n );\n if (done.has(key)) return;\n active.add(key);\n for (const dep of snapshot.versions[key]?.content.dependencies ?? [])\n visit(dep.id, active, done);\n active.delete(key);\n done.add(key);\n };\n const done = new Set<string>();\n for (const key of Object.keys(snapshot.versions)) visit(key, new Set(), done);\n const freeze = (value: unknown): void => {\n if (value && typeof value === \"object\" && !Object.isFrozen(value)) {\n for (const nested of Object.values(value)) freeze(nested);\n Object.freeze(value);\n }\n };\n freeze(snapshot);\n return snapshot;\n}\n","import {\n type PromptContent,\n PromptError,\n type PromptVersion,\n} from \"./contracts\";\n\n// Display names are editable; persisted references use stable keys and exact\n// versions/hashes in the existing dependency manifest.\nexport const promptReferencePattern =\n /\\[\\[prompt:([a-zA-Z0-9][a-zA-Z0-9_./-]*)\\]\\]/g;\nexport function promptReferenceToken(id: string) {\n return `[[prompt:${id}]]`;\n}\nexport function promptReferences(content: PromptContent): string[] {\n return [\n ...new Set(\n content.messages.flatMap((message) =>\n [...message.content.matchAll(promptReferencePattern)].map(\n (match) => match[1]!,\n ),\n ),\n ),\n ];\n}\nexport function expandPromptMessages(\n root: PromptVersion,\n versions: Readonly<Record<string, PromptVersion>> = {},\n): { messages: PromptContent[\"messages\"]; used: PromptVersion[] } {\n const used = new Map<string, PromptVersion>();\n const cache = new Map<string, string>();\n const expand = (\n owner: PromptVersion,\n text: string,\n role: PromptContent[\"messages\"][number][\"role\"],\n active: Set<string>,\n ): string => {\n const parts: string[] = [];\n let size = 0,\n position = 0;\n const append = (part: string) => {\n size += part.length;\n if (size > 200_000)\n throw new PromptError(\n \"PROMPT_REFERENCE_LIMIT\",\n \"An expanded message cannot exceed 200,000 characters.\",\n );\n parts.push(part);\n };\n for (const match of text.matchAll(promptReferencePattern)) {\n append(text.slice(position, match.index));\n position = match.index! + match[0].length;\n const id = match[1]!;\n const dependency = owner.content.dependencies.find(\n (item) => item.id === id,\n );\n const child = versions[id];\n if (\n !dependency ||\n !child ||\n child.version !== dependency.version ||\n child.hash !== dependency.hash\n )\n throw new PromptError(\n \"PROMPT_REFERENCE_MISSING\",\n `Include an exact dependency for referenced prompt ${id}.`,\n );\n if (active.has(id) || active.size >= 200)\n throw new PromptError(\n \"PROMPT_DEPENDENCY_CYCLE\",\n `Prompt reference cycle at ${id}.`,\n );\n const messages = child.content.messages.filter(\n (message) => message.role === role,\n );\n if (!messages.length)\n throw new PromptError(\n \"PROMPT_REFERENCE_ROLE\",\n `${id} has no ${role} message to include.`,\n );\n used.set(id, child);\n const cacheKey = `${id}@${child.version}:${role}`;\n let included = cache.get(cacheKey);\n if (included === undefined) {\n const next = new Set(active).add(id);\n const chunks: string[] = [];\n let length = 0;\n for (const message of messages) {\n const chunk = expand(child, message.content, role, next);\n length += chunk.length + (chunks.length ? 2 : 0);\n if (length > 200_000)\n throw new PromptError(\n \"PROMPT_REFERENCE_LIMIT\",\n \"An expanded message cannot exceed 200,000 characters.\",\n );\n chunks.push(chunk);\n }\n included = chunks.join(\"\\n\\n\");\n cache.set(cacheKey, included);\n }\n append(included);\n }\n append(text.slice(position));\n return parts.join(\"\");\n };\n return {\n messages: root.content.messages.map((message) => ({\n ...message,\n content: expand(root, message.content, message.role, new Set([root.id])),\n })),\n used: [...used.values()],\n };\n}\n","import type { UsageTelemetry } from \"@kortyx/usage-telemetry\";\nimport { getUsageTelemetry } from \"@kortyx/usage-telemetry/node\";\nimport packageJson from \"../package.json\";\n\nconst client = () => getUsageTelemetry(\"prompts\", packageJson.version);\nexport const usage: Pick<\n UsageTelemetry,\n \"start\" | \"feature\" | \"measure\" | \"flush\"\n> = {\n start: (...args) => client().start(...args),\n feature: (...args) => client().feature(...args),\n measure: (...args) => client().measure(...args),\n flush: () => client().flush(),\n};\n","{\n \"name\": \"@kortyx/prompts\",\n \"version\": \"0.2.3\",\n \"description\": \"Typed, versioned prompts and portable Studio serving for Kortyx.\",\n \"license\": \"Apache-2.0\",\n \"main\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"./browser\": {\n \"types\": \"./dist/browser.d.ts\",\n \"default\": \"./dist/browser.js\"\n }\n },\n \"files\": [\n \"dist/**\",\n \"README.md\",\n \"CHANGELOG.md\"\n ],\n \"scripts\": {\n \"build\": \"tsup\",\n \"dev\": \"tsc --watch\",\n \"type-check\": \"tsc --noEmit -p tsconfig.test.json\",\n \"test\": \"vitest run && pnpm -s type-check\",\n \"coverage\": \"vitest run --coverage && pnpm -s type-check\",\n \"lint\": \"biome check src test\"\n },\n \"dependencies\": {\n \"ajv\": \"8.18.0\",\n \"zod\": \"catalog:\",\n \"@kortyx/usage-telemetry\": \"workspace:*\"\n },\n \"devDependencies\": {\n \"tsup\": \"catalog:\",\n \"typescript\": \"catalog:\",\n \"vitest\": \"catalog:\",\n \"@vitest/coverage-v8\": \"catalog:\",\n \"@types/node\": \"catalog:\"\n },\n \"sideEffects\": false,\n \"publishConfig\": {\n \"access\": \"public\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"https://github.com/kortyx-io/kortyx.git\",\n \"directory\": \"packages/prompts\"\n }\n}\n","import { type CompiledPrompt, compilePrompt, type PromptRef } from \"./compiler\";\nimport {\n PromptError,\n type PromptSnapshot,\n PromptTagSchema,\n verifyPromptSnapshot,\n} from \"./contracts\";\nimport { usage } from \"./usage\";\n\nexport interface PromptSource {\n readonly environment?: string;\n readonly tag?: string;\n readonly identity: string;\n resolve(\n ids: readonly string[],\n options: {\n environment: string;\n tag?: string;\n versions?: Record<string, number>;\n signal?: AbortSignal;\n },\n ): Promise<PromptSnapshot>;\n}\nexport interface PromptCache {\n get(key: string): Promise<PromptSnapshot | undefined>;\n set(key: string, snapshot: PromptSnapshot): Promise<void>;\n}\nexport interface PromptExecution {\n recordUsage(usage: PromptUsageReceipt): void;\n snapshot(stored?: unknown): Promise<PromptSnapshot>;\n pin(id: string, version: number, stored?: unknown): Promise<PromptSnapshot>;\n resolve<Inputs, Config>(\n ref: PromptRef<Inputs, Config>,\n options: {\n variables: Inputs;\n version?: number;\n stored?: unknown;\n pin?: PromptSnapshot;\n },\n ): Promise<CompiledPrompt<Config>>;\n}\nexport interface PromptManager {\n definitions: readonly PromptRef[];\n start(options?: {\n snapshot?: PromptSnapshot;\n signal?: AbortSignal;\n onUsage?: (usage: PromptUsageReceipt) => void;\n }): PromptExecution;\n}\nexport type PromptUsageReceipt = {\n id: string;\n version: number;\n hash: string;\n environment: string;\n snapshotRevision: string;\n model?: string;\n};\nexport function createPrompts(options: {\n definitions: readonly PromptRef[];\n source: PromptSource;\n environment?: string;\n fallback?: \"last-known-good\" | \"error\";\n maxStaleMs?: number;\n cache?: PromptCache;\n}): PromptManager {\n const ids = options.definitions.map((ref) => ref.id),\n tag = PromptTagSchema.parse(options.source.tag ?? \"live\"),\n environment =\n options.environment ?? options.source.environment ?? \"production\";\n if (\n options.maxStaleMs !== undefined &&\n (!Number.isFinite(options.maxStaleMs) || options.maxStaleMs < 0)\n )\n throw new PromptError(\n \"PROMPT_CACHE_INVALID\",\n \"maxStaleMs must be a finite, nonnegative duration.\",\n );\n if (options.source.environment && options.source.environment !== environment)\n throw new PromptError(\n \"PROMPT_ENVIRONMENT_MISMATCH\",\n \"Source and manager environments must match.\",\n );\n if (new Set(ids).size !== ids.length)\n throw new PromptError(\n \"PROMPT_REFERENCE_DUPLICATE\",\n \"Registered prompt IDs must be unique.\",\n );\n let lastGood: PromptSnapshot | undefined;\n const cacheKey = `${options.source.identity}:${environment}:${tag}:${JSON.stringify([...ids].sort())}`;\n const fresh = async (signal?: AbortSignal) => {\n const pending = options.source\n .resolve(ids, { environment, tag, ...(signal ? { signal } : {}) })\n .then(verifyPromptSnapshot)\n .then(async (value) => {\n for (const id of ids)\n if (!value.versions[id])\n throw new PromptError(\n \"PROMPT_NOT_ASSIGNED\",\n `No ${tag} tag for ${id}.`,\n 404,\n );\n if (value.environment !== environment)\n throw new PromptError(\n \"PROMPT_ENVIRONMENT_MISMATCH\",\n \"Source returned a different environment.\",\n );\n if ((value.tag ?? \"live\") !== tag)\n throw new PromptError(\n \"PROMPT_TAG_MISMATCH\",\n \"Source returned a different prompt tag.\",\n );\n lastGood = value;\n await options.cache?.set(cacheKey, value);\n return value;\n });\n try {\n return await pending;\n } catch (error) {\n if (\n signal?.aborted ||\n options.fallback !== \"last-known-good\" ||\n (error instanceof PromptError &&\n error.status < 500 &&\n error.status !== 429)\n )\n throw error;\n const cached = lastGood ?? (await options.cache?.get(cacheKey));\n if (\n !cached ||\n cached.environment !== environment ||\n (cached.tag ?? \"live\") !== tag ||\n Date.parse(cached.resolvedAt) > Date.now() + 30_000 ||\n Date.now() - Date.parse(cached.resolvedAt) >\n (options.maxStaleMs ?? 300_000)\n )\n throw error;\n return {\n ...(await verifyPromptSnapshot(cached)),\n source: \"fallback\" as const,\n };\n }\n };\n return {\n definitions: options.definitions,\n start(start = {}) {\n let snapshotPromise: Promise<PromptSnapshot> | undefined;\n const snapshot = (stored?: unknown) => {\n if (snapshotPromise) return snapshotPromise;\n snapshotPromise = stored\n ? verifyPromptSnapshot(stored).then((value) => {\n if (value.environment !== environment)\n throw new PromptError(\n \"PROMPT_ENVIRONMENT_MISMATCH\",\n \"Stored snapshot belongs to another environment.\",\n );\n return value;\n })\n : start.snapshot\n ? verifyPromptSnapshot(start.snapshot).then((value) => {\n if (\n value.source !== \"eval\" ||\n value.environment !== environment\n )\n throw new PromptError(\n \"PROMPT_EVAL_SNAPSHOT_INVALID\",\n \"An eval snapshot must match the configured environment.\",\n );\n return value;\n })\n : fresh(start.signal);\n return snapshotPromise;\n };\n const pins = new Map<string, Promise<PromptSnapshot>>();\n const pin = async (id: string, version: number, stored?: unknown) => {\n const baseline = await snapshot();\n if (\n baseline.source === \"eval\" &&\n baseline.versions[id]?.version !== version\n )\n throw new PromptError(\n \"PROMPT_EVAL_PIN_CONFLICT\",\n `Pinned ${id}@${version} conflicts with the eval snapshot.`,\n );\n const key = `${id}@${version}`;\n let pendingPin = pins.get(key);\n if (!pendingPin) {\n pendingPin = (\n stored\n ? verifyPromptSnapshot(stored)\n : baseline.versions[id]?.version === version\n ? Promise.resolve(baseline)\n : options.source\n .resolve([id], {\n environment,\n tag,\n versions: { [id]: version },\n ...(start.signal ? { signal: start.signal } : {}),\n })\n .then(verifyPromptSnapshot)\n ).then((value) => {\n if (\n value.environment !== environment ||\n value.versions[id]?.version !== version\n )\n throw new PromptError(\n \"PROMPT_PIN_MISMATCH\",\n `Source returned a different pin for ${id}.`,\n );\n return value;\n });\n pins.set(key, pendingPin);\n }\n return pendingPin;\n };\n return {\n snapshot,\n pin,\n recordUsage(usage) {\n start.onUsage?.(usage);\n },\n async resolve(ref, args) {\n const scope = usage.start(\"sdk.prompt.resolve\");\n try {\n if (!ids.includes(ref.id))\n throw new PromptError(\n \"PROMPT_NOT_REGISTERED\",\n `Register ${ref.id} with createPrompts.`,\n );\n const resolved = await snapshot(args.stored);\n let selectedSnapshot = resolved;\n let selected = resolved.versions[ref.id];\n if (\n args.version !== undefined &&\n selected?.version !== args.version\n ) {\n const pinned = await pin(ref.id, args.version, args.pin);\n selectedSnapshot = pinned;\n selected = pinned.versions[ref.id];\n if (selected?.version !== args.version)\n throw new PromptError(\n \"PROMPT_PIN_MISMATCH\",\n `Source returned a different version of ${ref.id}.`,\n );\n }\n if (!selected)\n throw new PromptError(\n \"PROMPT_NOT_ASSIGNED\",\n `No version resolved for ${ref.id}.`,\n 404,\n );\n const compiled = compilePrompt(\n ref,\n selected,\n args.variables,\n {\n source: selectedSnapshot.source,\n environment: selectedSnapshot.environment,\n snapshotRevision: selectedSnapshot.revision,\n },\n selectedSnapshot.versions,\n );\n scope.end(\"success\", { source: selectedSnapshot.source });\n return compiled;\n } catch (error) {\n scope.fail(error);\n throw error;\n }\n },\n };\n },\n };\n}\nexport function studioPromptSource(options: {\n apiUrl: string;\n apiKey: string;\n /** Version tag to serve. Promotion updates live; other tags are managed manually. */\n tag?: string;\n environment?: string;\n projectId?: string;\n environmentId?: string;\n timeoutMs?: number;\n retries?: number;\n fetch?: typeof fetch;\n}): PromptSource {\n const url = new URL(options.apiUrl);\n if (!/^https?:$/.test(url.protocol) || url.username || url.password)\n throw new PromptError(\n \"PROMPT_SOURCE_INVALID\",\n \"Use an HTTP API origin without embedded credentials.\",\n );\n const request = options.fetch ?? fetch;\n const publicKeyId =\n /^ktyx_(?:test|live)_([^_]+)_/.exec(options.apiKey)?.[1] ??\n crypto.randomUUID();\n return {\n identity: `${url.origin}${url.pathname}:${options.projectId ?? \"\"}:${publicKeyId}:${options.environmentId ?? \"\"}`,\n tag: PromptTagSchema.parse(options.tag ?? \"live\"),\n ...(options.environment ? { environment: options.environment } : {}),\n async resolve(ids, args) {\n for (let attempt = 0; ; attempt++) {\n try {\n const signal = AbortSignal.any([\n AbortSignal.timeout(options.timeoutMs ?? 5000),\n ...(args.signal ? [args.signal] : []),\n ]);\n const response = await request(\n `${options.apiUrl.replace(/\\/$/, \"\")}/v1/prompts/resolve`,\n {\n method: \"POST\",\n signal,\n headers: {\n authorization: `Bearer ${options.apiKey}`,\n \"content-type\": \"application/json\",\n ...(options.projectId\n ? { \"x-kortyx-project-id\": options.projectId }\n : {}),\n ...(options.environmentId\n ? { \"x-kortyx-environment-id\": options.environmentId }\n : {}),\n },\n body: JSON.stringify({\n schemaVersion: 1,\n ids,\n tag: options.tag ?? args.tag ?? \"live\",\n environment: options.environment ?? args.environment,\n ...(args.versions ? { versions: args.versions } : {}),\n }),\n },\n );\n if (!response.ok)\n throw new PromptError(\n \"PROMPT_SOURCE_HTTP\",\n `Prompt serving failed (HTTP ${response.status}).`,\n response.status,\n );\n const reader = response.body?.getReader();\n if (!reader)\n throw new PromptError(\n \"PROMPT_SNAPSHOT_INVALID\",\n \"Prompt serving returned an empty response.\",\n );\n const decoder = new TextDecoder();\n let body = \"\",\n bytes = 0;\n try {\n for (;;) {\n const chunk = await reader.read();\n if (chunk.done) break;\n bytes += chunk.value.byteLength;\n if (bytes > 20 * 1024 * 1024)\n throw new PromptError(\n \"PROMPT_SNAPSHOT_LIMIT\",\n \"Prompt serving exceeded the 20 MiB response limit.\",\n );\n body += decoder.decode(chunk.value, { stream: true });\n }\n body += decoder.decode();\n let value: unknown;\n try {\n value = JSON.parse(body);\n } catch {\n throw new PromptError(\n \"PROMPT_SNAPSHOT_INVALID\",\n \"Prompt serving returned invalid JSON.\",\n );\n }\n return await verifyPromptSnapshot(value);\n } finally {\n await reader.cancel().catch(() => {});\n reader.releaseLock();\n }\n } catch (error) {\n if (\n args.signal?.aborted ||\n attempt >= (options.retries ?? 1) ||\n (error instanceof PromptError &&\n error.status < 500 &&\n error.status !== 429)\n )\n throw error;\n }\n }\n },\n };\n}\nexport function localPromptSource(snapshot: PromptSnapshot): PromptSource {\n return {\n identity: `local:${snapshot.revision}`,\n environment: snapshot.environment,\n tag: snapshot.tag ?? \"live\",\n async resolve(ids, args) {\n const verified = await verifyPromptSnapshot(snapshot);\n if (args.environment !== verified.environment)\n throw new PromptError(\n \"PROMPT_ENVIRONMENT_MISMATCH\",\n \"Local snapshot environment differs from the requested environment.\",\n );\n for (const id of ids)\n if (\n !verified.versions[id] ||\n (args.versions?.[id] &&\n verified.versions[id]?.version !== args.versions[id])\n )\n throw new PromptError(\n \"PROMPT_NOT_FOUND\",\n `Local snapshot does not contain ${id}.`,\n 404,\n );\n return { ...verified, source: \"local\" };\n },\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,eAAoB;;;ACApB,iBAAkB;AAEX,IAAM,0BAA0B;AAChC,IAAM,kBAAkB,aAC5B,OAAO,EACP,IAAI,CAAC,EACL,IAAI,GAAG,EACP,MAAM,+BAA+B;AACjC,IAAM,kBAAkB,aAC5B,OAAO,EACP,KAAK,EACL,IAAI,CAAC,EACL,IAAI,EAAE,EACN,MAAM,uBAAuB;AACzB,IAAM,sBAAsB,aAChC,OAAO;AAAA,EACN,MAAM,aAAE,KAAK,CAAC,UAAU,QAAQ,WAAW,CAAC;AAAA,EAC5C,SAAS,aAAE,OAAO,EAAE,IAAI,GAAO;AACjC,CAAC,EACA,OAAO;AACH,IAAM,sBAAsB,aAChC,OAAO;AAAA,EACN,QAAQ,aAAE,KAAK,CAAC,eAAe,MAAM,CAAC;AAAA,EACtC,UAAU,aAAE,MAAM,mBAAmB,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACrD,iBAAiB,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,KAAK,CAAC;AAAA,EAC9C,cAAc,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,KAAK,CAAC;AAAA,EAC3C,QAAQ,aAAE,OAAO,aAAE,OAAO,GAAG,aAAE,KAAK,CAAC;AAAA,EACrC,cAAc,aACX;AAAA,IACC,aACG,OAAO;AAAA,MACN,IAAI;AAAA,MACJ,SAAS,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,MACnC,MAAM,aAAE,OAAO,EAAE,MAAM,gBAAgB;AAAA,IACzC,CAAC,EACA,OAAO;AAAA,EACZ,EACC,IAAI,GAAG,EACP,QAAQ,CAAC,CAAC;AACf,CAAC,EACA,OAAO,EACP,YAAY,CAAC,OAAO,QAAQ;AAC3B,MACE,MAAM,WAAW,kBAChB,MAAM,SAAS,WAAW,KACzB,MAAM,SAAS,CAAC,GAAG,SAAS,YAC5B,MAAM,SAAS,CAAC,GAAG,SAAS;AAE9B,QAAI,SAAS;AAAA,MACX,MAAM;AAAA,MACN,SACE;AAAA,MACF,MAAM,CAAC,UAAU;AAAA,IACnB,CAAC;AACL,CAAC;AACI,IAAM,sBAAsB,aAAE,OAAO;AAAA,EAC1C,IAAI;AAAA,EACJ,SAAS,aAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EACnC,MAAM,aAAE,OAAO,EAAE,MAAM,gBAAgB;AAAA,EACvC,SAAS;AACX,CAAC;AACM,IAAM,uBAAuB,aACjC,OAAO;AAAA,EACN,eAAe,aAAE,QAAQ,uBAAuB;AAAA,EAChD,aAAa,aAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,GAAG;AAAA,EACtC,KAAK,gBAAgB,SAAS;AAAA,EAC9B,UAAU,aAAE,OAAO,EAAE,IAAI,CAAC;AAAA,EAC1B,UAAU,aAAE,OAAO,aAAE,OAAO,GAAG,mBAAmB;AAAA,EAClD,QAAQ,aAAE,KAAK,CAAC,UAAU,SAAS,SAAS,YAAY,MAAM,CAAC;AAAA,EAC/D,YAAY,aAAE,IAAI,SAAS;AAAA,EAC3B,cAAc,aAAE,MAAM,eAAe,EAAE,IAAI,GAAG,EAAE,SAAS;AAC3D,CAAC,EACA,OAAO;AAKH,IAAM,cAAN,cAA0B,MAAM;AAAA,EAErC,YACW,MACT,SACS,SAAS,KAClB;AACA,UAAM,OAAO;AAJJ;AAEA;AAAA,EAGX;AAAA,EALW;AAAA,EAEA;AAAA,EAJF,OAAO;AAQlB;AAGO,SAAS,oBAAoB,OAAwB;AAC1D,MAAI,UAAU,QAAQ,OAAO,UAAU,SAAU,QAAO,KAAK,UAAU,KAAK;AAC5E,MAAI,MAAM,QAAQ,KAAK;AACrB,WAAO,IAAI,MAAM,IAAI,mBAAmB,EAAE,KAAK,GAAG,CAAC;AACrD,SAAO,IAAI,OAAO,KAAK,KAAK,EACzB,KAAK,EACL;AAAA,IACC,CAAC,QACC,GAAG,KAAK,UAAU,GAAG,CAAC,IAAI,oBAAqB,MAAkC,GAAG,CAAC,CAAC;AAAA,EAC1F,EACC,KAAK,GAAG,CAAC;AACd;AACA,eAAsB,WAAW,SAAyC;AACxE,QAAM,QAAQ,MAAM,OAAO,OAAO;AAAA,IAChC;AAAA,IACA,IAAI,YAAY,EAAE,OAAO,oBAAoB,OAAO,CAAC;AAAA,EACvD;AACA,SAAO,MAAM;AAAA,IAAK,IAAI,WAAW,KAAK;AAAA,IAAG,CAAC,MACxC,EAAE,SAAS,EAAE,EAAE,SAAS,GAAG,GAAG;AAAA,EAChC,EAAE,KAAK,EAAE;AACX;AAEA,eAAsB,qBACpB,OACyB;AACzB,QAAM,SAAS,qBAAqB,UAAU,KAAK;AACnD,MAAI,CAAC,OAAO;AACV,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,QAAM,WAAW,OAAO;AACxB,MAAI,OAAO,KAAK,SAAS,QAAQ,EAAE,SAAS;AAC1C,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,aAAW,CAAC,KAAK,OAAO,KAAK,OAAO,QAAQ,SAAS,QAAQ,GAAG;AAC9D,QACE,QAAQ,QAAQ,MACf,MAAM,WAAW,QAAQ,OAAO,MAAO,QAAQ;AAEhD,YAAM,IAAI;AAAA,QACR;AAAA,QACA,UAAU,GAAG;AAAA,MACf;AACF,eAAW,cAAc,QAAQ,QAAQ,cAAc;AACrD,YAAM,SAAS,SAAS,SAAS,WAAW,EAAE;AAC9C,UACE,CAAC,UACD,OAAO,YAAY,WAAW,WAC9B,OAAO,SAAS,WAAW;AAE3B,cAAM,IAAI;AAAA,UACR;AAAA,UACA,4BAA4B,WAAW,EAAE,IAAI,WAAW,OAAO;AAAA,QACjE;AAAA,IACJ;AAAA,EACF;AACA,QAAM,QAAQ,CAAC,KAAa,QAAqBA,UAAsB;AACrE,QAAI,OAAO,IAAI,GAAG;AAChB,YAAM,IAAI;AAAA,QACR;AAAA,QACA,8BAA8B,GAAG;AAAA,MACnC;AACF,QAAIA,MAAK,IAAI,GAAG,EAAG;AACnB,WAAO,IAAI,GAAG;AACd,eAAW,OAAO,SAAS,SAAS,GAAG,GAAG,QAAQ,gBAAgB,CAAC;AACjE,YAAM,IAAI,IAAI,QAAQA,KAAI;AAC5B,WAAO,OAAO,GAAG;AACjB,IAAAA,MAAK,IAAI,GAAG;AAAA,EACd;AACA,QAAM,OAAO,oBAAI,IAAY;AAC7B,aAAW,OAAO,OAAO,KAAK,SAAS,QAAQ,EAAG,OAAM,KAAK,oBAAI,IAAI,GAAG,IAAI;AAC5E,QAAM,SAAS,CAACC,WAAyB;AACvC,QAAIA,UAAS,OAAOA,WAAU,YAAY,CAAC,OAAO,SAASA,MAAK,GAAG;AACjE,iBAAW,UAAU,OAAO,OAAOA,MAAK,EAAG,QAAO,MAAM;AACxD,aAAO,OAAOA,MAAK;AAAA,IACrB;AAAA,EACF;AACA,SAAO,QAAQ;AACf,SAAO;AACT;;;ACnKO,IAAM,yBACX;AACK,SAAS,qBAAqB,IAAY;AAC/C,SAAO,YAAY,EAAE;AACvB;AACO,SAAS,iBAAiB,SAAkC;AACjE,SAAO;AAAA,IACL,GAAG,IAAI;AAAA,MACL,QAAQ,SAAS;AAAA,QAAQ,CAAC,YACxB,CAAC,GAAG,QAAQ,QAAQ,SAAS,sBAAsB,CAAC,EAAE;AAAA,UACpD,CAAC,UAAU,MAAM,CAAC;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AACO,SAAS,qBACd,MACA,WAAoD,CAAC,GACW;AAChE,QAAM,OAAO,oBAAI,IAA2B;AAC5C,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,SAAS,CACb,OACA,MACA,MACA,WACW;AACX,UAAM,QAAkB,CAAC;AACzB,QAAI,OAAO,GACT,WAAW;AACb,UAAM,SAAS,CAAC,SAAiB;AAC/B,cAAQ,KAAK;AACb,UAAI,OAAO;AACT,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AACF,YAAM,KAAK,IAAI;AAAA,IACjB;AACA,eAAW,SAAS,KAAK,SAAS,sBAAsB,GAAG;AACzD,aAAO,KAAK,MAAM,UAAU,MAAM,KAAK,CAAC;AACxC,iBAAW,MAAM,QAAS,MAAM,CAAC,EAAE;AACnC,YAAM,KAAK,MAAM,CAAC;AAClB,YAAM,aAAa,MAAM,QAAQ,aAAa;AAAA,QAC5C,CAAC,SAAS,KAAK,OAAO;AAAA,MACxB;AACA,YAAM,QAAQ,SAAS,EAAE;AACzB,UACE,CAAC,cACD,CAAC,SACD,MAAM,YAAY,WAAW,WAC7B,MAAM,SAAS,WAAW;AAE1B,cAAM,IAAI;AAAA,UACR;AAAA,UACA,qDAAqD,EAAE;AAAA,QACzD;AACF,UAAI,OAAO,IAAI,EAAE,KAAK,OAAO,QAAQ;AACnC,cAAM,IAAI;AAAA,UACR;AAAA,UACA,6BAA6B,EAAE;AAAA,QACjC;AACF,YAAM,WAAW,MAAM,QAAQ,SAAS;AAAA,QACtC,CAAC,YAAY,QAAQ,SAAS;AAAA,MAChC;AACA,UAAI,CAAC,SAAS;AACZ,cAAM,IAAI;AAAA,UACR;AAAA,UACA,GAAG,EAAE,WAAW,IAAI;AAAA,QACtB;AACF,WAAK,IAAI,IAAI,KAAK;AAClB,YAAM,WAAW,GAAG,EAAE,IAAI,MAAM,OAAO,IAAI,IAAI;AAC/C,UAAI,WAAW,MAAM,IAAI,QAAQ;AACjC,UAAI,aAAa,QAAW;AAC1B,cAAM,OAAO,IAAI,IAAI,MAAM,EAAE,IAAI,EAAE;AACnC,cAAM,SAAmB,CAAC;AAC1B,YAAI,SAAS;AACb,mBAAW,WAAW,UAAU;AAC9B,gBAAM,QAAQ,OAAO,OAAO,QAAQ,SAAS,MAAM,IAAI;AACvD,oBAAU,MAAM,UAAU,OAAO,SAAS,IAAI;AAC9C,cAAI,SAAS;AACX,kBAAM,IAAI;AAAA,cACR;AAAA,cACA;AAAA,YACF;AACF,iBAAO,KAAK,KAAK;AAAA,QACnB;AACA,mBAAW,OAAO,KAAK,MAAM;AAC7B,cAAM,IAAI,UAAU,QAAQ;AAAA,MAC9B;AACA,aAAO,QAAQ;AAAA,IACjB;AACA,WAAO,KAAK,MAAM,QAAQ,CAAC;AAC3B,WAAO,MAAM,KAAK,EAAE;AAAA,EACtB;AACA,SAAO;AAAA,IACL,UAAU,KAAK,QAAQ,SAAS,IAAI,CAAC,aAAa;AAAA,MAChD,GAAG;AAAA,MACH,SAAS,OAAO,MAAM,QAAQ,SAAS,QAAQ,MAAM,oBAAI,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;AAAA,IACzE,EAAE;AAAA,IACF,MAAM,CAAC,GAAG,KAAK,OAAO,CAAC;AAAA,EACzB;AACF;;;AFrGA,IAAM,MAAM,IAAI,SAAAC,QAAQ;AAAA,EACtB,QAAQ;AAAA,EACR,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,eAAe;AACjB,CAAC;AACD,IAAM,aAAa,oBAAI,IAA4C;AACnE,IAAM,kBAAkB,oBAAI,QAAgB;AAC5C,IAAM,gBAAgB,oBAAI,QAAgB;AACnC,SAAS,iBAAiB,OAAyC;AACxE,SAAO;AAAA,IACL,SAAS,OAAO,UAAU,YAAY,gBAAgB,IAAI,KAAK;AAAA,EACjE;AACF;AACO,SAAS,oBACd,QACyB;AACzB,MAAI,CAAC,iBAAiB,MAAM;AAC1B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,QAAM,WAAW,OAAO,OAAO;AAAA,IAC7B,IAAI,OAAO,IAAI;AAAA,IACf,SAAS,OAAO,IAAI;AAAA,IACpB,MAAM,OAAO,IAAI;AAAA,IACjB,aAAa,OAAO,IAAI;AAAA,IACxB,kBAAkB,OAAO,IAAI;AAAA,IAC7B,GAAI,OAAO,cAAc,SACrB,EAAE,cAAc,OAAO,aAAa,IACpC,CAAC;AAAA,EACP,CAAC;AACD,gBAAc,IAAI,QAAQ;AAC1B,SAAO;AACT;AACO,SAAS,sBAAsB,OAOpC;AACA,SAAO;AAAA,IACL,SAAS,OAAO,UAAU,YAAY,cAAc,IAAI,KAAK;AAAA,EAC/D;AACF;AACA,SAAS,YAAe,OAAU,OAAO,oBAAI,QAAgB,GAAM;AACjE,MAAI,SAAS,OAAO,UAAU,YAAY,CAAC,KAAK,IAAI,KAAK,GAAG;AAC1D,SAAK,IAAI,KAAK;AACd,eAAW,QAAQ,OAAO,OAAO,KAAK,EAAG,aAAY,MAAM,IAAI;AAC/D,WAAO,OAAO,KAAK;AAAA,EACrB;AACA,SAAO;AACT;AACO,SAAS,oBACd,QACA,OACA,OACM;AACN,QAAM,MAAM,oBAAoB,MAAM;AACtC,MAAI,YAAY,WAAW,IAAI,GAAG;AAClC,MAAI,CAAC,WAAW;AACd,QAAI,WAAW,QAAQ,IAAK,YAAW,MAAM;AAC7C,QAAI;AACF,kBAAY,IAAI,QAAQ,MAAM;AAAA,IAChC,QAAQ;AACN,YAAM,IAAI;AAAA,QACR;AAAA,QACA,GAAG,KAAK;AAAA,MACV;AAAA,IACF;AACA,eAAW,IAAI,KAAK,SAAS;AAAA,EAC/B;AACA,MAAI,CAAC,UAAU,KAAK;AAClB,UAAM,IAAI;AAAA,MACR;AAAA,MACA,GAAG,KAAK,KAAK,IAAI,WAAW,UAAU,MAAM,CAAC;AAAA,IAC/C;AACJ;AACA,IAAM,cAAc;AACb,SAAS,gBAAgB,SAAkC;AAChE,SAAO;AAAA,IACL,GAAG,IAAI;AAAA,MACL,QAAQ,SAAS;AAAA,QAAQ,CAAC,YACxB,CAAC,GAAG,QAAQ,QAAQ,SAAS,WAAW,CAAC,EAAE;AAAA,UACzC,CAAC,UAAU,MAAM,CAAC;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AACO,SAAS,sBAAsB,SAA8B;AAClE,sBAAoB,QAAQ,cAAc,QAAQ,QAAQ,eAAe;AAEzE,MAAI;AACF,QAAI,QAAQ,QAAQ,eAAe;AAAA,EACrC,QAAQ;AACN,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACA,QAAM,SAAS,QAAQ,gBAAgB;AAGvC,aAAW,YAAY,gBAAgB,OAAO,GAAG;AAC/C,UAAM,MAAM,SAAS,MAAM,GAAG,EAAE,CAAC;AACjC,QAAI,CAAC,UAAU,CAAC,OAAO,OAAO,QAAQ,GAAG;AACvC,YAAM,IAAI;AAAA,QACR;AAAA,QACA,0BAA0B,GAAG;AAAA,MAC/B;AACF,QAAI,OAAO,OAAO,QAAQ,QAAQ,GAAG;AACnC,YAAM,IAAI;AAAA,QACR;AAAA,QACA,GAAG,GAAG;AAAA,MACR;AAAA,EACJ;AACF;AAWO,SAAS,aAKd,WACmC;AACnC,MAAI,CAAC,UAAU,MAAM,CAAC,UAAU,aAAa,CAAC,UAAU;AACtD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,SAAO,OAAO,OAAO,EAAE,GAAG,UAAU,CAAC;AACvC;AAiBO,SAAS,cACd,KACA,SACA,WACA,UACA,UACwB;AACxB,MAAI,QAAQ,OAAO,IAAI,MAAM,QAAQ,QAAQ,WAAW,IAAI;AAC1D,UAAM,IAAI;AAAA,MACR;AAAA,MACA,UAAU,IAAI,EAAE;AAAA,IAClB;AACF,QAAM,SAAS,IAAI,UAAU,MAAM,SAAS;AAC5C;AAAA,IACE,QAAQ,QAAQ;AAAA,IAChB;AAAA,IACA;AAAA,EACF;AACA;AAAA,IACE,QAAQ,QAAQ;AAAA,IAChB,QAAQ,QAAQ;AAAA,IAChB;AAAA,EACF;AACA,QAAM,SAAS,IAAI,OAAO,MAAM,gBAAgB,QAAQ,QAAQ,MAAM,CAAC;AACvE,QAAM,WAAW,qBAAqB,SAAS,QAAQ;AACvD,MAAI,SAAS,KAAK;AAChB,0BAAsB,EAAE,GAAG,QAAQ,SAAS,UAAU,SAAS,SAAS,CAAC;AAC3E,aAAW,SAAS,SAAS,MAAM;AACjC,UAAM,aAAa,MAAM,QAAQ,gBAAgB;AACjD,UAAM,cACJ,cAAc,OAAO,eAAe,YAAY,CAAC,MAAM,QAAQ,UAAU,IACrE,OAAO;AAAA,MACL,OAAO,KAAK,UAAU,EACnB,OAAO,CAAC,QAAQ,OAAO,OAAO,QAAkB,GAAG,CAAC,EACpD,IAAI,CAAC,QAAQ,CAAC,KAAM,OAAmC,GAAG,CAAC,CAAC;AAAA,IACjE,IACA;AACN;AAAA,MACE,MAAM,QAAQ;AAAA,MACd;AAAA,MACA,cAAc,MAAM,EAAE;AAAA,IACxB;AAAA,EACF;AACA,QAAM,WAAW,SAAS,SAAS,IAAI,CAAC,aAAa;AAAA,IACnD,MAAM,QAAQ;AAAA,IACd,SAAS,QAAQ,QAAQ,QAAQ,aAAa,CAAC,GAAG,SAAiB;AACjE,UAAI,QAAiB;AACrB,iBAAW,OAAO,KAAK,MAAM,GAAG,GAAG;AACjC,YACE,CAAC,aAAa,eAAe,WAAW,EAAE,SAAS,GAAG,KACtD,CAAC,SACD,OAAO,UAAU,YACjB,CAAC,OAAO,OAAO,OAAO,GAAG;AAEzB,gBAAM,IAAI;AAAA,YACR;AAAA,YACA,0BAA0B,IAAI;AAAA,UAChC;AACF,gBAAS,MAAkC,GAAG;AAAA,MAChD;AACA,UAAI,UAAU;AACZ,cAAM,IAAI;AAAA,UACR;AAAA,UACA,0BAA0B,IAAI;AAAA,QAChC;AACF,aAAO,OAAO,UAAU,WAAW,QAAQ,oBAAoB,KAAK;AAAA,IACtE,CAAC;AAAA,EACH,EAAE;AACF,QAAM,WAAW,YAAY;AAAA,IAC3B,QAAQ,IAAI;AAAA,IACZ;AAAA,IACA;AAAA,IACA,GAAI,SAAS,KAAK,SACd;AAAA,MACE,cAAc,SAAS,KAAK,IAAI,CAAC,EAAE,IAAI,SAAAC,UAAS,KAAK,OAAO;AAAA,QAC1D;AAAA,QACA,SAAAA;AAAA,QACA;AAAA,MACF,EAAE;AAAA,IACJ,IACA,CAAC;AAAA,IACL,GAAI,IAAI,WAAW,gBACf,EAAE,QAAQ,SAAS,CAAC,GAAG,SAAS,MAAM,SAAS,CAAC,GAAG,QAAQ,IAC3D,CAAC;AAAA,IACL,KAAK;AAAA,MACH,IAAI,IAAI;AAAA,MACR,SAAS,QAAQ;AAAA,MACjB,MAAM,QAAQ;AAAA,MACd,GAAG;AAAA,IACL;AAAA,EACF,CAAC;AACD,kBAAgB,IAAI,QAAQ;AAC5B,SAAO;AACT;;;AGtQA,kBAAkC;;;ACDlC;AAAA,EACE,MAAQ;AAAA,EACR,SAAW;AAAA,EACX,aAAe;AAAA,EACf,SAAW;AAAA,EACX,MAAQ;AAAA,EACR,OAAS;AAAA,EACT,SAAW;AAAA,IACT,KAAK;AAAA,MACH,OAAS;AAAA,MACT,SAAW;AAAA,IACb;AAAA,IACA,aAAa;AAAA,MACX,OAAS;AAAA,MACT,SAAW;AAAA,IACb;AAAA,EACF;AAAA,EACA,OAAS;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,EACF;AAAA,EACA,SAAW;AAAA,IACT,OAAS;AAAA,IACT,KAAO;AAAA,IACP,cAAc;AAAA,IACd,MAAQ;AAAA,IACR,UAAY;AAAA,IACZ,MAAQ;AAAA,EACV;AAAA,EACA,cAAgB;AAAA,IACd,KAAO;AAAA,IACP,KAAO;AAAA,IACP,2BAA2B;AAAA,EAC7B;AAAA,EACA,iBAAmB;AAAA,IACjB,MAAQ;AAAA,IACR,YAAc;AAAA,IACd,QAAU;AAAA,IACV,uBAAuB;AAAA,IACvB,eAAe;AAAA,EACjB;AAAA,EACA,aAAe;AAAA,EACf,eAAiB;AAAA,IACf,QAAU;AAAA,EACZ;AAAA,EACA,YAAc;AAAA,IACZ,MAAQ;AAAA,IACR,KAAO;AAAA,IACP,WAAa;AAAA,EACf;AACF;;;AD/CA,IAAM,SAAS,UAAM,+BAAkB,WAAW,gBAAY,OAAO;AAC9D,IAAM,QAGT;AAAA,EACF,OAAO,IAAI,SAAS,OAAO,EAAE,MAAM,GAAG,IAAI;AAAA,EAC1C,SAAS,IAAI,SAAS,OAAO,EAAE,QAAQ,GAAG,IAAI;AAAA,EAC9C,SAAS,IAAI,SAAS,OAAO,EAAE,QAAQ,GAAG,IAAI;AAAA,EAC9C,OAAO,MAAM,OAAO,EAAE,MAAM;AAC9B;;;AE4CO,SAAS,cAAc,SAOZ;AAChB,QAAM,MAAM,QAAQ,YAAY,IAAI,CAAC,QAAQ,IAAI,EAAE,GACjD,MAAM,gBAAgB,MAAM,QAAQ,OAAO,OAAO,MAAM,GACxD,cACE,QAAQ,eAAe,QAAQ,OAAO,eAAe;AACzD,MACE,QAAQ,eAAe,WACtB,CAAC,OAAO,SAAS,QAAQ,UAAU,KAAK,QAAQ,aAAa;AAE9D,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,MAAI,QAAQ,OAAO,eAAe,QAAQ,OAAO,gBAAgB;AAC/D,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,MAAI,IAAI,IAAI,GAAG,EAAE,SAAS,IAAI;AAC5B,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,MAAI;AACJ,QAAM,WAAW,GAAG,QAAQ,OAAO,QAAQ,IAAI,WAAW,IAAI,GAAG,IAAI,KAAK,UAAU,CAAC,GAAG,GAAG,EAAE,KAAK,CAAC,CAAC;AACpG,QAAM,QAAQ,OAAO,WAAyB;AAC5C,UAAM,UAAU,QAAQ,OACrB,QAAQ,KAAK,EAAE,aAAa,KAAK,GAAI,SAAS,EAAE,OAAO,IAAI,CAAC,EAAG,CAAC,EAChE,KAAK,oBAAoB,EACzB,KAAK,OAAO,UAAU;AACrB,iBAAW,MAAM;AACf,YAAI,CAAC,MAAM,SAAS,EAAE;AACpB,gBAAM,IAAI;AAAA,YACR;AAAA,YACA,MAAM,GAAG,YAAY,EAAE;AAAA,YACvB;AAAA,UACF;AACJ,UAAI,MAAM,gBAAgB;AACxB,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AACF,WAAK,MAAM,OAAO,YAAY;AAC5B,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AACF,iBAAW;AACX,YAAM,QAAQ,OAAO,IAAI,UAAU,KAAK;AACxC,aAAO;AAAA,IACT,CAAC;AACH,QAAI;AACF,aAAO,MAAM;AAAA,IACf,SAAS,OAAO;AACd,UACE,QAAQ,WACR,QAAQ,aAAa,qBACpB,iBAAiB,eAChB,MAAM,SAAS,OACf,MAAM,WAAW;AAEnB,cAAM;AACR,YAAM,SAAS,YAAa,MAAM,QAAQ,OAAO,IAAI,QAAQ;AAC7D,UACE,CAAC,UACD,OAAO,gBAAgB,gBACtB,OAAO,OAAO,YAAY,OAC3B,KAAK,MAAM,OAAO,UAAU,IAAI,KAAK,IAAI,IAAI,OAC7C,KAAK,IAAI,IAAI,KAAK,MAAM,OAAO,UAAU,KACtC,QAAQ,cAAc;AAEzB,cAAM;AACR,aAAO;AAAA,QACL,GAAI,MAAM,qBAAqB,MAAM;AAAA,QACrC,QAAQ;AAAA,MACV;AAAA,IACF;AAAA,EACF;AACA,SAAO;AAAA,IACL,aAAa,QAAQ;AAAA,IACrB,MAAM,QAAQ,CAAC,GAAG;AAChB,UAAI;AACJ,YAAM,WAAW,CAAC,WAAqB;AACrC,YAAI,gBAAiB,QAAO;AAC5B,0BAAkB,SACd,qBAAqB,MAAM,EAAE,KAAK,CAAC,UAAU;AAC3C,cAAI,MAAM,gBAAgB;AACxB,kBAAM,IAAI;AAAA,cACR;AAAA,cACA;AAAA,YACF;AACF,iBAAO;AAAA,QACT,CAAC,IACD,MAAM,WACJ,qBAAqB,MAAM,QAAQ,EAAE,KAAK,CAAC,UAAU;AACnD,cACE,MAAM,WAAW,UACjB,MAAM,gBAAgB;AAEtB,kBAAM,IAAI;AAAA,cACR;AAAA,cACA;AAAA,YACF;AACF,iBAAO;AAAA,QACT,CAAC,IACD,MAAM,MAAM,MAAM;AACxB,eAAO;AAAA,MACT;AACA,YAAM,OAAO,oBAAI,IAAqC;AACtD,YAAM,MAAM,OAAO,IAAY,SAAiB,WAAqB;AACnE,cAAM,WAAW,MAAM,SAAS;AAChC,YACE,SAAS,WAAW,UACpB,SAAS,SAAS,EAAE,GAAG,YAAY;AAEnC,gBAAM,IAAI;AAAA,YACR;AAAA,YACA,UAAU,EAAE,IAAI,OAAO;AAAA,UACzB;AACF,cAAM,MAAM,GAAG,EAAE,IAAI,OAAO;AAC5B,YAAI,aAAa,KAAK,IAAI,GAAG;AAC7B,YAAI,CAAC,YAAY;AACf,wBACE,SACI,qBAAqB,MAAM,IAC3B,SAAS,SAAS,EAAE,GAAG,YAAY,UACjC,QAAQ,QAAQ,QAAQ,IACxB,QAAQ,OACL,QAAQ,CAAC,EAAE,GAAG;AAAA,YACb;AAAA,YACA;AAAA,YACA,UAAU,EAAE,CAAC,EAAE,GAAG,QAAQ;AAAA,YAC1B,GAAI,MAAM,SAAS,EAAE,QAAQ,MAAM,OAAO,IAAI,CAAC;AAAA,UACjD,CAAC,EACA,KAAK,oBAAoB,GAClC,KAAK,CAAC,UAAU;AAChB,gBACE,MAAM,gBAAgB,eACtB,MAAM,SAAS,EAAE,GAAG,YAAY;AAEhC,oBAAM,IAAI;AAAA,gBACR;AAAA,gBACA,uCAAuC,EAAE;AAAA,cAC3C;AACF,mBAAO;AAAA,UACT,CAAC;AACD,eAAK,IAAI,KAAK,UAAU;AAAA,QAC1B;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA,YAAYC,QAAO;AACjB,gBAAM,UAAUA,MAAK;AAAA,QACvB;AAAA,QACA,MAAM,QAAQ,KAAK,MAAM;AACvB,gBAAM,QAAQ,MAAM,MAAM,oBAAoB;AAC9C,cAAI;AACF,gBAAI,CAAC,IAAI,SAAS,IAAI,EAAE;AACtB,oBAAM,IAAI;AAAA,gBACR;AAAA,gBACA,YAAY,IAAI,EAAE;AAAA,cACpB;AACF,kBAAM,WAAW,MAAM,SAAS,KAAK,MAAM;AAC3C,gBAAI,mBAAmB;AACvB,gBAAI,WAAW,SAAS,SAAS,IAAI,EAAE;AACvC,gBACE,KAAK,YAAY,UACjB,UAAU,YAAY,KAAK,SAC3B;AACA,oBAAM,SAAS,MAAM,IAAI,IAAI,IAAI,KAAK,SAAS,KAAK,GAAG;AACvD,iCAAmB;AACnB,yBAAW,OAAO,SAAS,IAAI,EAAE;AACjC,kBAAI,UAAU,YAAY,KAAK;AAC7B,sBAAM,IAAI;AAAA,kBACR;AAAA,kBACA,0CAA0C,IAAI,EAAE;AAAA,gBAClD;AAAA,YACJ;AACA,gBAAI,CAAC;AACH,oBAAM,IAAI;AAAA,gBACR;AAAA,gBACA,2BAA2B,IAAI,EAAE;AAAA,gBACjC;AAAA,cACF;AACF,kBAAM,WAAW;AAAA,cACf;AAAA,cACA;AAAA,cACA,KAAK;AAAA,cACL;AAAA,gBACE,QAAQ,iBAAiB;AAAA,gBACzB,aAAa,iBAAiB;AAAA,gBAC9B,kBAAkB,iBAAiB;AAAA,cACrC;AAAA,cACA,iBAAiB;AAAA,YACnB;AACA,kBAAM,IAAI,WAAW,EAAE,QAAQ,iBAAiB,OAAO,CAAC;AACxD,mBAAO;AAAA,UACT,SAAS,OAAO;AACd,kBAAM,KAAK,KAAK;AAChB,kBAAM;AAAA,UACR;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AACO,SAAS,mBAAmB,SAWlB;AACf,QAAM,MAAM,IAAI,IAAI,QAAQ,MAAM;AAClC,MAAI,CAAC,YAAY,KAAK,IAAI,QAAQ,KAAK,IAAI,YAAY,IAAI;AACzD,UAAM,IAAI;AAAA,MACR;AAAA,MACA;AAAA,IACF;AACF,QAAM,UAAU,QAAQ,SAAS;AACjC,QAAM,cACJ,+BAA+B,KAAK,QAAQ,MAAM,IAAI,CAAC,KACvD,OAAO,WAAW;AACpB,SAAO;AAAA,IACL,UAAU,GAAG,IAAI,MAAM,GAAG,IAAI,QAAQ,IAAI,QAAQ,aAAa,EAAE,IAAI,WAAW,IAAI,QAAQ,iBAAiB,EAAE;AAAA,IAC/G,KAAK,gBAAgB,MAAM,QAAQ,OAAO,MAAM;AAAA,IAChD,GAAI,QAAQ,cAAc,EAAE,aAAa,QAAQ,YAAY,IAAI,CAAC;AAAA,IAClE,MAAM,QAAQ,KAAK,MAAM;AACvB,eAAS,UAAU,KAAK,WAAW;AACjC,YAAI;AACF,gBAAM,SAAS,YAAY,IAAI;AAAA,YAC7B,YAAY,QAAQ,QAAQ,aAAa,GAAI;AAAA,YAC7C,GAAI,KAAK,SAAS,CAAC,KAAK,MAAM,IAAI,CAAC;AAAA,UACrC,CAAC;AACD,gBAAM,WAAW,MAAM;AAAA,YACrB,GAAG,QAAQ,OAAO,QAAQ,OAAO,EAAE,CAAC;AAAA,YACpC;AAAA,cACE,QAAQ;AAAA,cACR;AAAA,cACA,SAAS;AAAA,gBACP,eAAe,UAAU,QAAQ,MAAM;AAAA,gBACvC,gBAAgB;AAAA,gBAChB,GAAI,QAAQ,YACR,EAAE,uBAAuB,QAAQ,UAAU,IAC3C,CAAC;AAAA,gBACL,GAAI,QAAQ,gBACR,EAAE,2BAA2B,QAAQ,cAAc,IACnD,CAAC;AAAA,cACP;AAAA,cACA,MAAM,KAAK,UAAU;AAAA,gBACnB,eAAe;AAAA,gBACf;AAAA,gBACA,KAAK,QAAQ,OAAO,KAAK,OAAO;AAAA,gBAChC,aAAa,QAAQ,eAAe,KAAK;AAAA,gBACzC,GAAI,KAAK,WAAW,EAAE,UAAU,KAAK,SAAS,IAAI,CAAC;AAAA,cACrD,CAAC;AAAA,YACH;AAAA,UACF;AACA,cAAI,CAAC,SAAS;AACZ,kBAAM,IAAI;AAAA,cACR;AAAA,cACA,+BAA+B,SAAS,MAAM;AAAA,cAC9C,SAAS;AAAA,YACX;AACF,gBAAM,SAAS,SAAS,MAAM,UAAU;AACxC,cAAI,CAAC;AACH,kBAAM,IAAI;AAAA,cACR;AAAA,cACA;AAAA,YACF;AACF,gBAAM,UAAU,IAAI,YAAY;AAChC,cAAI,OAAO,IACT,QAAQ;AACV,cAAI;AACF,uBAAS;AACP,oBAAM,QAAQ,MAAM,OAAO,KAAK;AAChC,kBAAI,MAAM,KAAM;AAChB,uBAAS,MAAM,MAAM;AACrB,kBAAI,QAAQ,KAAK,OAAO;AACtB,sBAAM,IAAI;AAAA,kBACR;AAAA,kBACA;AAAA,gBACF;AACF,sBAAQ,QAAQ,OAAO,MAAM,OAAO,EAAE,QAAQ,KAAK,CAAC;AAAA,YACtD;AACA,oBAAQ,QAAQ,OAAO;AACvB,gBAAI;AACJ,gBAAI;AACF,sBAAQ,KAAK,MAAM,IAAI;AAAA,YACzB,QAAQ;AACN,oBAAM,IAAI;AAAA,gBACR;AAAA,gBACA;AAAA,cACF;AAAA,YACF;AACA,mBAAO,MAAM,qBAAqB,KAAK;AAAA,UACzC,UAAE;AACA,kBAAM,OAAO,OAAO,EAAE,MAAM,MAAM;AAAA,YAAC,CAAC;AACpC,mBAAO,YAAY;AAAA,UACrB;AAAA,QACF,SAAS,OAAO;AACd,cACE,KAAK,QAAQ,WACb,YAAY,QAAQ,WAAW,MAC9B,iBAAiB,eAChB,MAAM,SAAS,OACf,MAAM,WAAW;AAEnB,kBAAM;AAAA,QACV;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AACO,SAAS,kBAAkB,UAAwC;AACxE,SAAO;AAAA,IACL,UAAU,SAAS,SAAS,QAAQ;AAAA,IACpC,aAAa,SAAS;AAAA,IACtB,KAAK,SAAS,OAAO;AAAA,IACrB,MAAM,QAAQ,KAAK,MAAM;AACvB,YAAM,WAAW,MAAM,qBAAqB,QAAQ;AACpD,UAAI,KAAK,gBAAgB,SAAS;AAChC,cAAM,IAAI;AAAA,UACR;AAAA,UACA;AAAA,QACF;AACF,iBAAW,MAAM;AACf,YACE,CAAC,SAAS,SAAS,EAAE,KACpB,KAAK,WAAW,EAAE,KACjB,SAAS,SAAS,EAAE,GAAG,YAAY,KAAK,SAAS,EAAE;AAErD,gBAAM,IAAI;AAAA,YACR;AAAA,YACA,mCAAmC,EAAE;AAAA,YACrC;AAAA,UACF;AACJ,aAAO,EAAE,GAAG,UAAU,QAAQ,QAAQ;AAAA,IACxC;AAAA,EACF;AACF;","names":["done","value","Ajv2020","version","usage"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kortyx/prompts",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.3",
|
|
4
4
|
"description": "Typed, versioned prompts and portable Studio serving for Kortyx.",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"ajv": "8.18.0",
|
|
25
25
|
"zod": "^4.3.6",
|
|
26
|
-
"@kortyx/usage-telemetry": "0.
|
|
26
|
+
"@kortyx/usage-telemetry": "0.5.0"
|
|
27
27
|
},
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"tsup": "^8.5.1",
|