promptopskit 0.5.0 → 0.7.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.
Files changed (70) hide show
  1. package/README.md +9 -7
  2. package/SKILL.md +16 -10
  3. package/dist/{chunk-QK3WKE3K.js → chunk-35NN5F6O.js} +2 -2
  4. package/dist/{chunk-D75HKF64.js → chunk-3G3EAV7H.js} +2 -2
  5. package/dist/{chunk-LNGHGGJN.js → chunk-6NOUETAC.js} +2 -2
  6. package/dist/{chunk-KN7H4JRK.js → chunk-F552OBUV.js} +619 -502
  7. package/dist/chunk-F552OBUV.js.map +1 -0
  8. package/dist/{chunk-6BOUQVSX.js → chunk-FICB2ZSK.js} +3 -3
  9. package/dist/{chunk-6VLKZCNS.js → chunk-OWMP5NMV.js} +2 -2
  10. package/dist/{chunk-IN4KT5EU.js → chunk-R65RAHAG.js} +3 -3
  11. package/dist/{chunk-K6ZU3CGV.js → chunk-ULVY473P.js} +306 -17
  12. package/dist/chunk-ULVY473P.js.map +1 -0
  13. package/dist/cli/index.js +446 -103
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/index.cjs +1223 -772
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +9 -5
  18. package/dist/index.d.ts +9 -5
  19. package/dist/index.js +67 -18
  20. package/dist/index.js.map +1 -1
  21. package/dist/providers/anthropic.cjs +902 -502
  22. package/dist/providers/anthropic.cjs.map +1 -1
  23. package/dist/providers/anthropic.d.cts +2 -2
  24. package/dist/providers/anthropic.d.ts +2 -2
  25. package/dist/providers/anthropic.js +3 -3
  26. package/dist/providers/gemini.cjs +902 -502
  27. package/dist/providers/gemini.cjs.map +1 -1
  28. package/dist/providers/gemini.d.cts +2 -2
  29. package/dist/providers/gemini.d.ts +2 -2
  30. package/dist/providers/gemini.js +3 -3
  31. package/dist/providers/llmasaservice.cjs +901 -501
  32. package/dist/providers/llmasaservice.cjs.map +1 -1
  33. package/dist/providers/llmasaservice.d.cts +2 -2
  34. package/dist/providers/llmasaservice.d.ts +2 -2
  35. package/dist/providers/llmasaservice.js +4 -4
  36. package/dist/providers/openai-responses.cjs +902 -502
  37. package/dist/providers/openai-responses.cjs.map +1 -1
  38. package/dist/providers/openai-responses.d.cts +2 -2
  39. package/dist/providers/openai-responses.d.ts +2 -2
  40. package/dist/providers/openai-responses.js +3 -3
  41. package/dist/providers/openai.cjs +902 -502
  42. package/dist/providers/openai.cjs.map +1 -1
  43. package/dist/providers/openai.d.cts +2 -2
  44. package/dist/providers/openai.d.ts +2 -2
  45. package/dist/providers/openai.js +3 -3
  46. package/dist/providers/openrouter.cjs +902 -502
  47. package/dist/providers/openrouter.cjs.map +1 -1
  48. package/dist/providers/openrouter.d.cts +2 -2
  49. package/dist/providers/openrouter.d.ts +2 -2
  50. package/dist/providers/openrouter.js +4 -4
  51. package/dist/{schema-D-RI4w-k.d.cts → schema-DBcSns_b.d.cts} +732 -206
  52. package/dist/{schema-D-RI4w-k.d.ts → schema-DBcSns_b.d.ts} +732 -206
  53. package/dist/testing.cjs +54 -5
  54. package/dist/testing.cjs.map +1 -1
  55. package/dist/testing.d.cts +1 -1
  56. package/dist/testing.d.ts +1 -1
  57. package/dist/testing.js +1 -1
  58. package/dist/{types-B3dxBGu6.d.ts → types-8T2D5KB5.d.cts} +20 -2
  59. package/dist/{types-DbTAjlTN.d.cts → types-BlLXT5Qb.d.ts} +20 -2
  60. package/dist/usagetap/index.d.cts +2 -2
  61. package/dist/usagetap/index.d.ts +2 -2
  62. package/package.json +9 -2
  63. package/dist/chunk-K6ZU3CGV.js.map +0 -1
  64. package/dist/chunk-KN7H4JRK.js.map +0 -1
  65. /package/dist/{chunk-QK3WKE3K.js.map → chunk-35NN5F6O.js.map} +0 -0
  66. /package/dist/{chunk-D75HKF64.js.map → chunk-3G3EAV7H.js.map} +0 -0
  67. /package/dist/{chunk-LNGHGGJN.js.map → chunk-6NOUETAC.js.map} +0 -0
  68. /package/dist/{chunk-6BOUQVSX.js.map → chunk-FICB2ZSK.js.map} +0 -0
  69. /package/dist/{chunk-6VLKZCNS.js.map → chunk-OWMP5NMV.js.map} +0 -0
  70. /package/dist/{chunk-IN4KT5EU.js.map → chunk-R65RAHAG.js.map} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/renderer/interpolate.ts","../src/context.ts","../src/renderer/renderer.ts","../src/overrides/apply-overrides.ts","../src/providers/resolve-asset.ts","../src/cache.ts","../src/composition/resolve-includes.ts","../src/prompt-resolution.ts","../src/history.ts","../src/compression.ts","../src/providers/prompt-input.ts","../src/providers/raw.ts"],"sourcesContent":["export interface InterpolateOptions {\n strict?: boolean;\n optionalVariables?: Iterable<string>;\n}\n\nconst VARIABLE_RE = /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\}\\}/g;\nconst ESCAPED_OPEN = /\\\\\\{\\\\\\{/g;\nconst ESCAPE_PLACEHOLDER = '\\x00ESCAPED_OPEN\\x00';\n\n/**\n * Interpolate variables into a template string.\n *\n * Syntax: {{ variable_name }}\n * Escape: \\{\\{ produces literal {{\n *\n * In strict mode, throws on missing variables.\n * In permissive mode, leaves {{ placeholder }} intact.\n */\nexport function interpolate(\n template: string,\n variables: Record<string, string>,\n options: InterpolateOptions = {},\n): string {\n const { strict = false } = options;\n const optionalVariables = new Set(options.optionalVariables ?? []);\n\n // Replace escaped sequences with placeholder\n let result = template.replace(ESCAPED_OPEN, ESCAPE_PLACEHOLDER);\n\n result = result.replace(VARIABLE_RE, (match, name: string) => {\n if (name in variables) {\n return variables[name];\n }\n if (strict && !optionalVariables.has(name)) {\n throw new Error(`Missing required variable: \"${name}\"`);\n }\n return match; // leave placeholder intact in permissive mode\n });\n\n // Restore escaped sequences\n result = result.replaceAll(ESCAPE_PLACEHOLDER, '{{');\n\n return result;\n}\n\n/**\n * Extract all variable names referenced in a template.\n */\nexport function extractVariables(template: string): string[] {\n const vars = new Set<string>();\n let match: RegExpExecArray | null;\n const re = new RegExp(VARIABLE_RE.source, 'g');\n while ((match = re.exec(template)) !== null) {\n vars.add(match[1]);\n }\n return [...vars];\n}\n","import type {\n PromptAsset,\n ResolvedPromptAsset,\n ContextBuiltInValidatorDefinition,\n ContextInputDefinition,\n ContextRegexDefinition,\n} from './schema/index.js';\n\nexport interface ContextValidationShortCircuit {\n returnMessage: string;\n code: 'POK031' | 'POK032' | 'POK033' | 'POK034';\n variable: string;\n field: 'allow_regex' | 'deny_regex' | 'non_empty' | 'reject_secrets';\n}\n\nexport interface SanitizedContextVariablesResult {\n variables: Record<string, string>;\n shortCircuit?: ContextValidationShortCircuit;\n}\n\nexport interface NormalizedContextRegex {\n pattern: string;\n flags: string;\n raw: string;\n invalidLiteral?: boolean;\n returnMessage?: string;\n}\n\nexport interface NormalizedContextBuiltInValidator {\n returnMessage?: string;\n}\n\nexport interface NormalizedContextInput {\n name: string;\n optional?: boolean;\n warnings?: boolean;\n max_size?: number;\n trim?: boolean | 'start' | 'end' | 'both';\n allow_regex?: NormalizedContextRegex;\n deny_regex?: NormalizedContextRegex;\n non_empty?: NormalizedContextBuiltInValidator;\n reject_secrets?: NormalizedContextBuiltInValidator;\n}\n\nexport interface ContextSizeWarning {\n variable: string;\n maxSize: number;\n actualSize: number;\n}\n\nexport interface ContextOverflowInfo {\n promptId: string;\n variable: string;\n value: string;\n maxSize: number;\n actualSize: number;\n}\n\nexport interface SanitizeContextOptions {\n onContextOverflow?: (info: ContextOverflowInfo) => string;\n}\n\nconst textEncoder = new TextEncoder();\nconst REJECT_SECRETS_PATTERN = '(secret|api[_-]?key|password)';\nconst REJECT_SECRETS_FLAGS = 'i';\n\nexport function getContextInputs(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context'>,\n): NormalizedContextInput[] {\n return (asset.context?.inputs ?? []).map(normalizeContextInput);\n}\n\nexport function getContextInputNames(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context'>,\n): string[] {\n return getContextInputs(asset).map((input) => input.name);\n}\n\nexport function normalizeContextInput(input: ContextInputDefinition): NormalizedContextInput {\n if (typeof input === 'string') {\n return { name: input };\n }\n\n return {\n name: input.name,\n optional: input.optional,\n warnings: input.warnings,\n max_size: input.max_size,\n trim: input.trim,\n allow_regex: normalizeContextRegex(input.allow_regex),\n deny_regex: normalizeContextRegex(input.deny_regex),\n non_empty: normalizeBuiltInValidator(input.non_empty),\n reject_secrets: normalizeBuiltInValidator(input.reject_secrets),\n };\n}\n\nexport function areContextInputWarningsEnabled(input: Pick<NormalizedContextInput, 'warnings'>): boolean {\n return input.warnings !== false;\n}\n\nexport function normalizeContextRegex(\n value: ContextRegexDefinition | undefined,\n): NormalizedContextRegex | undefined {\n if (value === undefined) {\n return undefined;\n }\n\n if (typeof value === 'string') {\n const literal = parseRegexLiteral(value);\n if (value.startsWith('/') && !literal) {\n return {\n pattern: value,\n flags: '',\n raw: value,\n invalidLiteral: true,\n };\n }\n\n return {\n pattern: literal?.pattern ?? value,\n flags: literal?.flags ?? '',\n raw: value,\n };\n }\n\n return {\n pattern: value.pattern,\n flags: value.flags ?? '',\n raw: JSON.stringify(value),\n returnMessage: value.return_message,\n };\n}\n\nexport function normalizeBuiltInValidator(\n value: ContextBuiltInValidatorDefinition | undefined,\n): NormalizedContextBuiltInValidator | undefined {\n if (value === undefined || value === false) {\n return undefined;\n }\n\n if (value === true) {\n return {};\n }\n\n return {\n returnMessage: value.return_message,\n };\n}\n\nfunction parseRegexLiteral(value: string): { pattern: string; flags: string } | undefined {\n if (!value.startsWith('/')) {\n return undefined;\n }\n\n for (let index = value.length - 1; index > 0; index -= 1) {\n if (value[index] !== '/') {\n continue;\n }\n\n let backslashCount = 0;\n for (let cursor = index - 1; cursor >= 0 && value[cursor] === '\\\\'; cursor -= 1) {\n backslashCount += 1;\n }\n\n if (backslashCount % 2 === 1) {\n continue;\n }\n\n return {\n pattern: value.slice(1, index),\n flags: value.slice(index + 1),\n };\n }\n\n return undefined;\n}\n\nexport function formatInvalidContextRegexMessage(details: {\n promptId: string;\n variable: string;\n field: string;\n raw: string;\n reason: string;\n}): string {\n return [\n `Invalid context regex for prompt \"${details.promptId}\"`,\n `variable \"${details.variable}\"`,\n `field \"${details.field}\"`,\n `value ${JSON.stringify(details.raw)}: ${details.reason}`,\n ].join(', ');\n}\n\nexport function compileContextRegex(\n regex: NormalizedContextRegex,\n details: { promptId: string; variable: string; field: string },\n): RegExp {\n if (regex.invalidLiteral) {\n throw new Error(\n `POK013: ${formatInvalidContextRegexMessage({\n ...details,\n raw: regex.raw,\n reason: 'Malformed regex literal. Use /pattern/flags or { pattern, flags }.',\n })}`,\n );\n }\n\n try {\n return new RegExp(regex.pattern, regex.flags);\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n throw new Error(`POK013: ${formatInvalidContextRegexMessage({ ...details, raw: regex.raw, reason })}`);\n }\n}\n\nfunction getRejectSecretsRegex(): NormalizedContextRegex {\n return {\n pattern: REJECT_SECRETS_PATTERN,\n flags: REJECT_SECRETS_FLAGS,\n raw: JSON.stringify({ pattern: REJECT_SECRETS_PATTERN, flags: REJECT_SECRETS_FLAGS }),\n };\n}\n\ntype TrimMode = boolean | 'start' | 'end' | 'both';\n\nfunction isTrimEnabled(mode: TrimMode | undefined): mode is true | 'start' | 'end' | 'both' {\n return mode === true || mode === 'start' || mode === 'end' || mode === 'both';\n}\n\nfunction normalizeTrimMode(mode: TrimMode): 'start' | 'end' {\n if (mode === 'start') {\n return 'start';\n }\n return 'end';\n}\n\nfunction trimToMaxSize(\n value: string,\n maxSize: number,\n mode: TrimMode,\n): string {\n const measured = measureContextValueSize(value);\n if (measured <= maxSize) {\n return value;\n }\n\n const characters = Array.from(value);\n const normalizedMode = normalizeTrimMode(mode);\n\n if (normalizedMode === 'start') {\n let collected = '';\n let size = 0;\n for (let i = characters.length - 1; i >= 0; i -= 1) {\n const next = characters[i];\n const charSize = measureContextValueSize(next);\n if (size + charSize > maxSize) {\n break;\n }\n collected = next + collected;\n size += charSize;\n }\n return collected;\n }\n\n let collected = '';\n let size = 0;\n for (const char of characters) {\n const charSize = measureContextValueSize(char);\n if (size + charSize > maxSize) {\n break;\n }\n collected += char;\n size += charSize;\n }\n return collected;\n}\n\nexport function sanitizeContextVariables(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context' | 'id'>,\n variables: Record<string, string> = {},\n options: SanitizeContextOptions = {},\n): SanitizedContextVariablesResult {\n const { onContextOverflow } = options;\n const sanitized = { ...variables };\n\n for (const input of getContextInputs(asset)) {\n const value = sanitized[input.name];\n if (value === undefined) {\n continue;\n }\n\n let candidate = value;\n\n if (input.max_size !== undefined) {\n const actualSize = measureContextValueSize(candidate);\n if (actualSize > input.max_size && onContextOverflow) {\n candidate = onContextOverflow({\n promptId: asset.id,\n variable: input.name,\n value: candidate,\n maxSize: input.max_size,\n actualSize,\n });\n }\n }\n\n if (isTrimEnabled(input.trim) && input.max_size !== undefined) {\n candidate = trimToMaxSize(candidate, input.max_size, input.trim);\n }\n\n sanitized[input.name] = candidate;\n\n if (input.allow_regex) {\n const candidate = sanitized[input.name];\n const matcher = compileContextRegex(input.allow_regex, {\n promptId: asset.id,\n variable: input.name,\n field: 'allow_regex',\n });\n if (!matcher.test(candidate)) {\n if (input.allow_regex.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.allow_regex.returnMessage,\n code: 'POK031',\n variable: input.name,\n field: 'allow_regex',\n },\n };\n }\n\n throw new Error(\n `POK031: Context variable \"${input.name}\" failed allow_regex validation for prompt \"${asset.id}\".`,\n );\n }\n }\n\n if (input.deny_regex) {\n const candidate = sanitized[input.name];\n const matcher = compileContextRegex(input.deny_regex, {\n promptId: asset.id,\n variable: input.name,\n field: 'deny_regex',\n });\n if (matcher.test(candidate)) {\n if (input.deny_regex.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.deny_regex.returnMessage,\n code: 'POK032',\n variable: input.name,\n field: 'deny_regex',\n },\n };\n }\n\n throw new Error(\n `POK032: Context variable \"${input.name}\" matched deny_regex for prompt \"${asset.id}\".`,\n );\n }\n }\n\n if (input.non_empty && candidate.trim().length === 0) {\n if (input.non_empty.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.non_empty.returnMessage,\n code: 'POK033',\n variable: input.name,\n field: 'non_empty',\n },\n };\n }\n\n throw new Error(\n `POK033: Context variable \"${input.name}\" failed non_empty validation for prompt \"${asset.id}\".`,\n );\n }\n\n if (input.reject_secrets) {\n const matcher = compileContextRegex(getRejectSecretsRegex(), {\n promptId: asset.id,\n variable: input.name,\n field: 'reject_secrets',\n });\n if (matcher.test(candidate)) {\n if (input.reject_secrets.returnMessage) {\n return {\n variables: sanitized,\n shortCircuit: {\n returnMessage: input.reject_secrets.returnMessage,\n code: 'POK034',\n variable: input.name,\n field: 'reject_secrets',\n },\n };\n }\n\n throw new Error(\n `POK034: Context variable \"${input.name}\" matched reject_secrets validation for prompt \"${asset.id}\".`,\n );\n }\n }\n }\n\n return { variables: sanitized };\n}\n\nexport function measureContextValueSize(value: string): number {\n return textEncoder.encode(value).length;\n}\n\nexport function collectContextSizeWarnings(\n asset: Pick<PromptAsset | ResolvedPromptAsset, 'context'>,\n variables: Record<string, string> = {},\n): ContextSizeWarning[] {\n const warnings: ContextSizeWarning[] = [];\n\n for (const input of getContextInputs(asset)) {\n if (!areContextInputWarningsEnabled(input)) {\n continue;\n }\n\n if (input.max_size === undefined) {\n continue;\n }\n\n const value = variables[input.name];\n if (value === undefined) {\n continue;\n }\n\n const actualSize = measureContextValueSize(value);\n if (actualSize > input.max_size) {\n warnings.push({\n variable: input.name,\n maxSize: input.max_size,\n actualSize,\n });\n }\n }\n\n return warnings;\n}\n","import type { ResolvedPromptAsset } from '../schema/index.js';\nimport { interpolate, extractVariables } from './interpolate.js';\nimport { getContextInputs } from '../context.js';\n\nexport interface RenderOptions {\n variables?: Record<string, string>;\n strict?: boolean;\n}\n\nexport interface RenderedSections {\n system_instructions?: string;\n prompt_template?: string;\n}\n\n/**\n * Render the sections of a resolved prompt asset with variable interpolation.\n */\nexport function renderSections(\n asset: ResolvedPromptAsset,\n options: RenderOptions = {},\n): RenderedSections {\n const { variables = {}, strict = false } = options;\n const optionalVariables = getContextInputs(asset)\n .filter((input) => input.optional === true)\n .map((input) => input.name);\n\n const result: RenderedSections = {};\n\n if (asset.sections.system_instructions) {\n result.system_instructions = interpolate(\n asset.sections.system_instructions,\n variables,\n { strict, optionalVariables },\n );\n }\n\n if (asset.sections.prompt_template) {\n result.prompt_template = interpolate(\n asset.sections.prompt_template,\n variables,\n { strict, optionalVariables },\n );\n }\n\n return result;\n}\n\n/**\n * Get all variable names used across all sections.\n */\nexport function getRequiredVariables(asset: ResolvedPromptAsset): string[] {\n const vars = new Set<string>();\n const optionalVariables = new Set(\n getContextInputs(asset)\n .filter((input) => input.optional === true)\n .map((input) => input.name),\n );\n\n if (asset.sections.system_instructions) {\n for (const v of extractVariables(asset.sections.system_instructions)) {\n vars.add(v);\n }\n }\n\n if (asset.sections.prompt_template) {\n for (const v of extractVariables(asset.sections.prompt_template)) {\n vars.add(v);\n }\n }\n\n return [...vars].filter((variable) => !optionalVariables.has(variable));\n}\n","import type { PromptAsset, PromptAssetOverrides } from '../schema/index.js';\n\nexport interface OverrideOptions {\n environment?: string;\n tier?: string;\n runtime?: Partial<PromptAssetOverrides>;\n}\n\n/**\n * Apply environment, tier, and runtime overrides to a prompt asset.\n *\n * Precedence: base → environment → tier → runtime\n * Scalars are replaced. Arrays are replaced (not concatenated).\n */\nexport function applyOverrides(\n asset: PromptAsset,\n options: OverrideOptions = {},\n): PromptAsset {\n let result = { ...asset };\n\n // Apply environment override\n if (options.environment && result.environments?.[options.environment]) {\n result = mergeOverride(result, result.environments[options.environment]);\n }\n\n // Apply tier override\n if (options.tier && result.tiers?.[options.tier]) {\n result = mergeOverride(result, result.tiers[options.tier]);\n }\n\n // Apply runtime overrides\n if (options.runtime) {\n result = mergeOverride(result, options.runtime);\n }\n\n return result;\n}\n\nfunction mergeOverride(\n base: PromptAsset,\n override: Partial<PromptAssetOverrides>,\n): PromptAsset {\n const result = { ...base };\n\n if (override.model !== undefined) result.model = override.model;\n if (override.fallback_models !== undefined) result.fallback_models = override.fallback_models;\n if (override.tools !== undefined) result.tools = override.tools;\n\n if (override.reasoning !== undefined) {\n result.reasoning = { ...result.reasoning, ...override.reasoning };\n }\n if (override.sampling !== undefined) {\n result.sampling = { ...result.sampling, ...override.sampling };\n }\n if (override.response !== undefined) {\n result.response = { ...result.response, ...override.response };\n }\n if (override.compression !== undefined) {\n result.compression = {\n ...result.compression,\n ...override.compression,\n thetokencompany: mergeRecordBlock(\n result.compression?.thetokencompany,\n override.compression.thetokencompany,\n ),\n };\n }\n if (override.cache !== undefined) {\n result.cache = {\n ...result.cache,\n ...override.cache,\n openai: mergeRecordBlock(result.cache?.openai, override.cache.openai),\n anthropic: mergeRecordBlock(result.cache?.anthropic, override.cache.anthropic),\n gemini: mergeRecordBlock(result.cache?.gemini, override.cache.gemini),\n google: mergeRecordBlock(result.cache?.google, override.cache.google),\n };\n }\n if (override.raw !== undefined) {\n result.raw = {\n ...result.raw,\n ...override.raw,\n openai: mergeRecordBlock(result.raw?.openai, override.raw.openai),\n 'openai-responses': mergeRecordBlock(result.raw?.['openai-responses'], override.raw['openai-responses']),\n openai_responses: mergeRecordBlock(result.raw?.openai_responses, override.raw.openai_responses),\n anthropic: mergeRecordBlock(result.raw?.anthropic, override.raw.anthropic),\n gemini: mergeRecordBlock(result.raw?.gemini, override.raw.gemini),\n google: mergeRecordBlock(result.raw?.google, override.raw.google),\n openrouter: mergeRecordBlock(result.raw?.openrouter, override.raw.openrouter),\n llmasaservice: mergeRecordBlock(result.raw?.llmasaservice, override.raw.llmasaservice),\n };\n }\n\n if (override.provider_options !== undefined) {\n result.provider_options = {\n ...result.provider_options,\n ...override.provider_options,\n anthropic: {\n ...result.provider_options?.anthropic,\n ...override.provider_options.anthropic,\n },\n gemini: {\n ...result.provider_options?.gemini,\n ...override.provider_options.gemini,\n },\n openrouter: {\n ...result.provider_options?.openrouter,\n ...override.provider_options.openrouter,\n },\n llmasaservice: {\n ...result.provider_options?.llmasaservice,\n ...override.provider_options.llmasaservice,\n },\n };\n }\n\n return result;\n}\n\nfunction mergeRecordBlock<T extends object>(\n base: T | undefined,\n override: T | undefined,\n): T | undefined {\n if (override === undefined) return base;\n return { ...base, ...override } as T;\n}\n","import { applyOverrides } from '../overrides/index.js';\nimport type { ResolvedPromptAsset } from '../schema/index.js';\nimport type { RuntimeRenderOptions } from './types.js';\n\nexport function resolveAssetForProvider(\n asset: ResolvedPromptAsset,\n runtime: Pick<RuntimeRenderOptions, 'environment' | 'tier' | 'runtime'> = {},\n): ResolvedPromptAsset {\n if (!runtime.environment && !runtime.tier && !runtime.runtime) {\n return asset;\n }\n\n return applyOverrides(asset, {\n environment: runtime.environment,\n tier: runtime.tier,\n runtime: runtime.runtime,\n }) as ResolvedPromptAsset;\n}","import { statSync } from 'node:fs';\n\ninterface CacheEntry<T> {\n value: T;\n mtime: number;\n}\n\n/**\n * Simple in-memory LRU cache keyed by file path + mtime.\n * Used to avoid re-parsing prompt files on every renderPrompt() call.\n */\nexport class PromptCache<T> {\n private cache = new Map<string, CacheEntry<T>>();\n private maxSize: number;\n\n constructor(maxSize = 100) {\n this.maxSize = maxSize;\n }\n\n get(filePath: string): T | undefined {\n const entry = this.cache.get(filePath);\n if (!entry) return undefined;\n\n try {\n const stat = statSync(filePath);\n if (stat.mtimeMs !== entry.mtime) {\n this.cache.delete(filePath);\n return undefined;\n }\n } catch {\n this.cache.delete(filePath);\n return undefined;\n }\n\n // Refresh recency for true LRU semantics.\n this.cache.delete(filePath);\n this.cache.set(filePath, entry);\n\n return entry.value;\n }\n\n set(filePath: string, value: T): void {\n try {\n const stat = statSync(filePath);\n\n if (this.cache.has(filePath)) {\n this.cache.delete(filePath);\n } else if (this.cache.size >= this.maxSize) {\n const oldest = this.cache.keys().next().value;\n if (oldest) this.cache.delete(oldest);\n }\n\n this.cache.set(filePath, { value, mtime: stat.mtimeMs });\n } catch {\n // Can't stat the file — don't cache\n }\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n get size(): number {\n return this.cache.size;\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { resolve, dirname } from 'node:path';\nimport { parsePrompt } from '../parser/index.js';\nimport type { PromptAsset } from '../schema/index.js';\n\n/**\n * Resolve includes for a prompt asset, inlining content from referenced files.\n * Detects and rejects circular includes.\n */\nexport async function resolveIncludes(\n asset: PromptAsset,\n basePath: string,\n visited: Set<string> = new Set(),\n): Promise<PromptAsset> {\n if (!asset.includes || asset.includes.length === 0) {\n return asset;\n }\n\n const baseDir = dirname(basePath);\n const resolvedPath = resolve(basePath);\n\n if (visited.has(resolvedPath)) {\n throw new Error(`Circular include detected: ${resolvedPath}`);\n }\n visited.add(resolvedPath);\n\n let mergedSystemInstructions = '';\n\n for (const includePath of asset.includes) {\n const fullPath = resolve(baseDir, includePath);\n\n if (visited.has(fullPath)) {\n throw new Error(`Circular include detected: ${fullPath} (included from ${basePath})`);\n }\n\n const content = await readFile(fullPath, 'utf-8');\n const { asset: includedAsset } = parsePrompt(content, fullPath);\n\n // Recursively resolve nested includes\n const resolved = await resolveIncludes(includedAsset, fullPath, new Set(visited));\n\n // Append included system instructions before local ones\n if (resolved.sections?.system_instructions) {\n mergedSystemInstructions += resolved.sections.system_instructions + '\\n\\n';\n }\n }\n\n // Prepend included system instructions before the local ones\n const localSystem = asset.sections?.system_instructions ?? '';\n const combinedSystem = (mergedSystemInstructions + localSystem).trim() || undefined;\n\n return {\n ...asset,\n sections: {\n ...asset.sections,\n system_instructions: combinedSystem,\n },\n // Drop includes from the resolved asset — they've been inlined\n includes: undefined,\n };\n}\n","import { readFile } from 'node:fs/promises';\nimport { existsSync, statSync } from 'node:fs';\nimport { resolve } from 'node:path';\n\nimport { PromptCache } from './cache.js';\nimport { resolveIncludes } from './composition/index.js';\nimport { applyOverrides } from './overrides/index.js';\nimport { parsePrompt, loadPromptFile } from './parser/index.js';\nimport type { PromptAsset, PromptAssetOverrides, ResolvedPromptAsset } from './schema/index.js';\n\nexport type PromptResolutionMode = 'auto' | 'compiled-only' | 'source-only';\n\nexport const DEFAULT_PROMPTS_DIR = './prompts';\nexport const DEFAULT_COMPILED_JSON_DIR = './.generated-prompts/json';\nexport const DEFAULT_COMPILED_ESM_DIR = './.generated-prompts/esm';\n\nexport interface PromptResolutionConfig {\n sourceDir?: string;\n compiledDir?: string;\n mode?: PromptResolutionMode;\n cache?: boolean;\n}\n\nexport interface ResolvedPromptResolutionConfig {\n sourceDir: string;\n compiledDir: string;\n mode?: PromptResolutionMode;\n cache?: boolean;\n}\n\nexport function defaultCompiledDirForFormat(format: 'json' | 'esm'): string {\n return format === 'esm' ? DEFAULT_COMPILED_ESM_DIR : DEFAULT_COMPILED_JSON_DIR;\n}\n\nexport function withPromptResolutionDefaults(config: PromptResolutionConfig): ResolvedPromptResolutionConfig {\n return {\n ...config,\n sourceDir: config.sourceDir ?? DEFAULT_PROMPTS_DIR,\n compiledDir: config.compiledDir ?? DEFAULT_COMPILED_JSON_DIR,\n };\n}\n\nconst sharedPromptCache = new PromptCache<PromptAsset>();\n\nexport async function loadPromptAsset(\n promptPath: string,\n config: PromptResolutionConfig,\n promptCache: PromptCache<PromptAsset> = sharedPromptCache,\n): Promise<PromptAsset> {\n const resolvedConfig = withPromptResolutionDefaults(config);\n const mode = resolvedConfig.mode ?? 'auto';\n\n if (mode !== 'source-only' && resolvedConfig.compiledDir) {\n const compiledFile = resolve(resolvedConfig.compiledDir, promptPath + '.json');\n if (existsSync(compiledFile)) {\n if (mode === 'auto') {\n const sourceFile = resolve(resolvedConfig.sourceDir, promptPath + '.md');\n if (existsSync(sourceFile)) {\n const compiledMtime = statSync(compiledFile).mtimeMs;\n const sourceMtime = statSync(sourceFile).mtimeMs;\n if (sourceMtime > compiledMtime) {\n console.warn(\n `[promptopskit] Warning: compiled artifact for \"${promptPath}\" is older than source .md file.\\n`\n + ' Run \"promptopskit compile\" or switch to source-only mode.',\n );\n }\n }\n }\n\n const content = await readFile(compiledFile, 'utf-8');\n return JSON.parse(content) as PromptAsset;\n }\n\n if (mode === 'compiled-only') {\n throw new Error(\n `Compiled artifact not found: ${compiledFile}\\n`\n + 'Run \"promptopskit compile\" to generate it.',\n );\n }\n }\n\n if (mode !== 'compiled-only') {\n const sourceFile = resolve(resolvedConfig.sourceDir, promptPath + '.md');\n\n if (resolvedConfig.cache !== false) {\n const cached = promptCache.get(sourceFile);\n if (cached) {\n return cached;\n }\n }\n\n if (!existsSync(sourceFile)) {\n const paths = [sourceFile];\n if (resolvedConfig.compiledDir) {\n paths.unshift(resolve(resolvedConfig.compiledDir, promptPath + '.json'));\n }\n\n throw new Error(\n `Prompt not found: \"${promptPath}\"\\nSearched:\\n${paths.map((candidate) => ` - ${candidate}`).join('\\n')}`,\n );\n }\n\n const { asset } = await loadPromptFile(sourceFile, { defaultsRoot: resolvedConfig.sourceDir });\n\n if (resolvedConfig.cache !== false) {\n promptCache.set(sourceFile, asset);\n }\n\n return asset;\n }\n\n throw new Error(`Prompt not found: \"${promptPath}\"`);\n}\n\nexport async function resolvePromptAsset(\n promptPath: string,\n config: PromptResolutionConfig,\n options: { environment?: string; tier?: string; runtime?: Partial<PromptAssetOverrides> } = {},\n promptCache: PromptCache<PromptAsset> = sharedPromptCache,\n): Promise<ResolvedPromptAsset> {\n const resolvedConfig = withPromptResolutionDefaults(config);\n let asset = await loadPromptAsset(promptPath, resolvedConfig, promptCache);\n\n const sourceFile = resolve(resolvedConfig.sourceDir, promptPath + '.md');\n if (asset.includes && asset.includes.length > 0 && existsSync(sourceFile)) {\n asset = await resolveIncludes(asset, sourceFile);\n }\n\n asset = applyOverrides(asset, {\n environment: options.environment,\n tier: options.tier,\n runtime: options.runtime,\n });\n\n return asset as ResolvedPromptAsset;\n}\n\nexport function resolveInlinePromptSource(\n source: string,\n options: { environment?: string; tier?: string; runtime?: Partial<PromptAssetOverrides> } = {},\n): ResolvedPromptAsset {\n const { asset } = parsePrompt(source);\n return applyOverrides(asset, {\n environment: options.environment,\n tier: options.tier,\n runtime: options.runtime,\n }) as ResolvedPromptAsset;\n}","import type { ResolvedPromptAsset } from './schema/index.js';\nimport type {\n RuntimeHistoryCompactionInfo,\n RuntimeHistoryMessage,\n RuntimeRenderOptions,\n} from './providers/types.js';\n\nfunction defaultCompactHistory(info: RuntimeHistoryCompactionInfo): RuntimeHistoryMessage {\n const content = info.overflow\n .map((message) => `${message.role}: ${message.content}`)\n .join('\\n\\n');\n\n return {\n role: 'user',\n content: `Earlier conversation compacted to preserve history:\\n\\n${content}`,\n };\n}\n\nfunction normalizeCompactionResult(result: ReturnType<NonNullable<RuntimeRenderOptions['onHistoryCompaction']>>): RuntimeHistoryMessage {\n if (typeof result === 'string') {\n return {\n role: 'user',\n content: result,\n };\n }\n\n return result;\n}\n\nexport function compactHistoryForPrompt(\n asset: Pick<ResolvedPromptAsset, 'id' | 'context'>,\n runtime: Pick<RuntimeRenderOptions, 'history' | 'onHistoryCompaction'>,\n): RuntimeHistoryMessage[] | undefined {\n const history = runtime.history;\n const maxItems = asset.context?.history?.max_items;\n\n if (!history || maxItems === undefined || history.length <= maxItems) {\n return history;\n }\n\n if (maxItems === 1) {\n const info = {\n promptId: asset.id,\n maxItems,\n overflow: history,\n preserved: [],\n history,\n };\n const compacted = runtime.onHistoryCompaction\n ? normalizeCompactionResult(runtime.onHistoryCompaction(info))\n : defaultCompactHistory(info);\n return [compacted];\n }\n\n const preservedCount = maxItems - 1;\n const overflow = history.slice(0, history.length - preservedCount);\n const preserved = history.slice(-preservedCount);\n const info = {\n promptId: asset.id,\n maxItems,\n overflow,\n preserved,\n history,\n };\n const compacted = runtime.onHistoryCompaction\n ? normalizeCompactionResult(runtime.onHistoryCompaction(info))\n : defaultCompactHistory(info);\n\n return [compacted, ...preserved];\n}\n","import type { ResolvedPromptAsset } from './schema/index.js';\nimport { renderSections } from './renderer/index.js';\nimport type { RuntimeRenderOptions } from './providers/types.js';\n\nexport const THETOKENCOMPANY_DEFAULT_MODEL = 'bear-2';\nexport const THETOKENCOMPANY_DEFAULT_BASE_URL = 'https://api.thetokencompany.com';\n\nexport interface TheTokenCompanyRuntimeOptions {\n apiKey?: string;\n baseURL?: string;\n fetch?: typeof fetch;\n}\n\nexport interface PromptCompressionResult {\n provider: 'thetokencompany';\n model: string;\n inputTokens: number;\n outputTokens: number;\n tokensSaved: number;\n compressionRatio: number;\n}\n\nexport interface PromptCompressionRenderResult {\n asset: ResolvedPromptAsset;\n runtime: RuntimeRenderOptions;\n compression: PromptCompressionResult[];\n}\n\ninterface TheTokenCompanyCompressResponse {\n output: string;\n output_tokens: number;\n input_tokens: number;\n tokens_saved: number;\n compression_ratio: number;\n}\n\nexport async function applyPromptCompressionForRender(\n asset: ResolvedPromptAsset,\n runtime: RuntimeRenderOptions,\n): Promise<PromptCompressionRenderResult> {\n const config = asset.compression?.thetokencompany;\n\n if (config?.enabled !== true || !asset.sections.prompt_template) {\n return { asset, runtime, compression: [] };\n }\n\n const sections = renderSections(asset, {\n variables: runtime.variables,\n strict: runtime.strict,\n });\n\n if (!sections.prompt_template) {\n return { asset, runtime, compression: [] };\n }\n\n const model = config.model ?? THETOKENCOMPANY_DEFAULT_MODEL;\n const result = await compressWithTheTokenCompany(sections.prompt_template, {\n apiKey: runtime.theTokenCompany?.apiKey,\n baseURL: runtime.theTokenCompany?.baseURL,\n fetch: runtime.theTokenCompany?.fetch,\n model,\n aggressiveness: config.aggressiveness,\n });\n\n return {\n asset: {\n ...asset,\n sections: {\n ...asset.sections,\n ...sections,\n prompt_template: result.output,\n },\n },\n runtime: {\n ...runtime,\n variables: {},\n strict: false,\n },\n compression: [{\n provider: 'thetokencompany',\n model,\n inputTokens: result.input_tokens,\n outputTokens: result.output_tokens,\n tokensSaved: result.tokens_saved,\n compressionRatio: result.compression_ratio,\n }],\n };\n}\n\nasync function compressWithTheTokenCompany(\n input: string,\n options: {\n apiKey?: string;\n baseURL?: string;\n fetch?: typeof fetch;\n model: string;\n aggressiveness?: number;\n },\n): Promise<TheTokenCompanyCompressResponse> {\n const apiKey = options.apiKey ?? getEnv('THETOKENCOMPANY_API_KEY') ?? getEnv('TTC_API_KEY');\n if (!apiKey) {\n throw new Error(\n 'TheTokenCompany compression is enabled, but no API key was provided. '\n + 'Pass theTokenCompany.apiKey to renderPrompt() or set THETOKENCOMPANY_API_KEY.',\n );\n }\n\n const fetchImpl = options.fetch ?? globalThis.fetch;\n if (!fetchImpl) {\n throw new Error('TheTokenCompany compression requires a runtime with fetch support.');\n }\n\n const baseURL = (options.baseURL ?? THETOKENCOMPANY_DEFAULT_BASE_URL).replace(/\\/+$/, '');\n const compressionSettings = options.aggressiveness === undefined\n ? undefined\n : { aggressiveness: options.aggressiveness };\n\n const response = await fetchImpl(`${baseURL}/v1/compress`, {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${apiKey}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n model: options.model,\n input,\n ...(compressionSettings ? { compression_settings: compressionSettings } : {}),\n }),\n });\n\n if (!response.ok) {\n const body = await response.text().catch(() => '');\n throw new Error(\n `TheTokenCompany compression failed with HTTP ${response.status}`\n + (body ? `: ${body}` : '.'),\n );\n }\n\n const data = await response.json() as Partial<TheTokenCompanyCompressResponse>;\n if (\n typeof data.output !== 'string'\n || typeof data.output_tokens !== 'number'\n || typeof data.input_tokens !== 'number'\n || typeof data.tokens_saved !== 'number'\n || typeof data.compression_ratio !== 'number'\n ) {\n throw new Error('TheTokenCompany compression returned an invalid response payload.');\n }\n\n return data as TheTokenCompanyCompressResponse;\n}\n\nfunction getEnv(name: string): string | undefined {\n if (typeof process === 'undefined') {\n return undefined;\n }\n\n return process.env[name];\n}\n","import { resolveInlinePromptSource, resolvePromptAsset } from '../prompt-resolution.js';\nimport type { ResolvedPromptAsset } from '../schema/index.js';\nimport { sanitizeContextVariables } from '../context.js';\nimport { compactHistoryForPrompt } from '../history.js';\nimport { applyPromptCompressionForRender } from '../compression.js';\nimport { resolveAssetForProvider } from './resolve-asset.js';\nimport type {\n ProviderAdapter,\n ProviderPromptInput,\n RenderPromptMethod,\n RuntimeRenderOptions,\n ValidatePromptMethod,\n} from './types.js';\n\ntype SyncProviderAdapter = Omit<ProviderAdapter, 'validatePrompt' | 'renderPrompt'>;\n\nfunction isPromptLookup(input: ProviderPromptInput): input is Extract<ProviderPromptInput, { path: string }> {\n return 'path' in input && typeof input.path === 'string';\n}\n\nfunction isInlinePromptSource(input: ProviderPromptInput): input is Extract<ProviderPromptInput, { source: string }> {\n return 'source' in input && typeof input.source === 'string';\n}\n\nasync function resolveProviderPromptInput(\n input: ProviderPromptInput,\n runtime?: Pick<RuntimeRenderOptions, 'environment' | 'tier' | 'runtime'>,\n): Promise<ResolvedPromptAsset> {\n if (isPromptLookup(input)) {\n return resolvePromptAsset(input.path, input, runtime);\n }\n\n if (isInlinePromptSource(input)) {\n return resolveInlinePromptSource(input.source, runtime);\n }\n\n return input;\n}\n\nexport function withPromptInputSupport(adapter: SyncProviderAdapter): ProviderAdapter {\n const validatePrompt: ValidatePromptMethod = async (input, runtime) => {\n const resolved = await resolveProviderPromptInput(input, runtime);\n return adapter.validate(resolved, runtime);\n };\n\n const renderPrompt: RenderPromptMethod = async (input, runtime) => {\n const resolved = await resolveProviderPromptInput(input, runtime);\n const resolvedForRender = resolveAssetForProvider(resolved, runtime);\n const sanitization = sanitizeContextVariables(resolvedForRender, runtime.variables, {\n onContextOverflow: runtime.onContextOverflow,\n });\n\n if (sanitization.shortCircuit) {\n return {\n provider: adapter.name,\n model: resolvedForRender.model ?? '',\n returnMessage: sanitization.shortCircuit.returnMessage,\n };\n }\n\n const prepared = await applyPromptCompressionForRender(resolvedForRender, {\n ...runtime,\n environment: undefined,\n tier: undefined,\n runtime: undefined,\n variables: sanitization.variables,\n history: compactHistoryForPrompt(resolvedForRender, runtime),\n });\n const request = adapter.render(prepared.asset, prepared.runtime);\n\n return prepared.compression.length > 0\n ? { ...request, compression: prepared.compression }\n : request;\n };\n\n return {\n ...adapter,\n validatePrompt,\n renderPrompt,\n };\n}\n","import type { ResolvedPromptAsset } from '../schema/index.js';\n\nexport function applyRawProviderBody(\n body: Record<string, unknown>,\n asset: ResolvedPromptAsset,\n provider: 'openai' | 'openai-responses' | 'anthropic' | 'gemini' | 'openrouter' | 'llmasaservice',\n): Record<string, unknown> {\n const raw = getRawProviderBody(asset, provider);\n return raw ? { ...body, ...raw } : body;\n}\n\nfunction getRawProviderBody(\n asset: ResolvedPromptAsset,\n provider: 'openai' | 'openai-responses' | 'anthropic' | 'gemini' | 'openrouter' | 'llmasaservice',\n): Record<string, unknown> | undefined {\n if (provider === 'openai-responses') {\n return asset.raw?.['openai-responses'] ?? asset.raw?.openai_responses;\n }\n if (provider === 'gemini') {\n return asset.raw?.gemini ?? asset.raw?.google;\n }\n return asset.raw?.[provider];\n}\n"],"mappings":"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","names":["collected","size","candidate","readFile","statSync","resolve","resolve","statSync","readFile","info","compacted"]}
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  openaiAdapter
3
- } from "./chunk-D75HKF64.js";
3
+ } from "./chunk-3G3EAV7H.js";
4
4
  import {
5
5
  applyRawProviderBody,
6
6
  resolveAssetForProvider,
7
7
  withPromptInputSupport
8
- } from "./chunk-KN7H4JRK.js";
8
+ } from "./chunk-F552OBUV.js";
9
9
 
10
10
  // src/providers/llmasaservice.ts
11
11
  var LLMASASERVICE_BASE_URL = "https://gateway.llmasaservice.io";
@@ -127,4 +127,4 @@ export {
127
127
  createLLMAsAServiceOpenAIConfig,
128
128
  llmasaserviceAdapter
129
129
  };
130
- //# sourceMappingURL=chunk-6BOUQVSX.js.map
130
+ //# sourceMappingURL=chunk-FICB2ZSK.js.map
@@ -4,7 +4,7 @@ import {
4
4
  renderSections,
5
5
  resolveAssetForProvider,
6
6
  withPromptInputSupport
7
- } from "./chunk-KN7H4JRK.js";
7
+ } from "./chunk-F552OBUV.js";
8
8
 
9
9
  // src/providers/openai-responses.ts
10
10
  var openaiResponsesAdapter = withPromptInputSupport({
@@ -112,4 +112,4 @@ var openaiResponsesAdapter = withPromptInputSupport({
112
112
  export {
113
113
  openaiResponsesAdapter
114
114
  };
115
- //# sourceMappingURL=chunk-6VLKZCNS.js.map
115
+ //# sourceMappingURL=chunk-OWMP5NMV.js.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  openaiAdapter
3
- } from "./chunk-D75HKF64.js";
3
+ } from "./chunk-3G3EAV7H.js";
4
4
  import {
5
5
  applyRawProviderBody,
6
6
  resolveAssetForProvider,
7
7
  withPromptInputSupport
8
- } from "./chunk-KN7H4JRK.js";
8
+ } from "./chunk-F552OBUV.js";
9
9
 
10
10
  // src/providers/openrouter.ts
11
11
  var openrouterAdapter = withPromptInputSupport({
@@ -58,4 +58,4 @@ var openrouterAdapter = withPromptInputSupport({
58
58
  export {
59
59
  openrouterAdapter
60
60
  };
61
- //# sourceMappingURL=chunk-IN4KT5EU.js.map
61
+ //# sourceMappingURL=chunk-R65RAHAG.js.map
@@ -29,10 +29,26 @@ var ResponseSchema = z.object({
29
29
  format: z.enum(["text", "json", "markdown"]).optional(),
30
30
  stream: z.boolean().optional(),
31
31
  schema: z.record(z.unknown()).optional(),
32
+ schema_ref: z.string().min(1).optional(),
33
+ schema_source: z.object({
34
+ mode: z.enum(["inline", "schema_ref_json", "schema_ref_zod_module"]).optional(),
35
+ ref: z.string().optional(),
36
+ resolved_path: z.string().optional(),
37
+ hash: z.string().optional()
38
+ }).optional(),
32
39
  schema_name: z.string().optional(),
33
40
  schema_description: z.string().optional(),
34
41
  schema_strict: z.boolean().optional()
35
42
  });
43
+ var ResponseSchemaWithValidation = ResponseSchema.superRefine((value, ctx) => {
44
+ if (value.schema !== void 0 && value.schema_ref !== void 0) {
45
+ ctx.addIssue({
46
+ code: z.ZodIssueCode.custom,
47
+ message: "response.schema and response.schema_ref are mutually exclusive",
48
+ path: ["schema_ref"]
49
+ });
50
+ }
51
+ });
36
52
  var AnthropicProviderOptionsSchema = z.object({
37
53
  top_k: z.number().int().min(0).optional(),
38
54
  tool_choice: z.record(z.unknown()).optional(),
@@ -84,6 +100,14 @@ var RawProviderBodySchema = z.object({
84
100
  openrouter: z.record(z.unknown()).optional(),
85
101
  llmasaservice: z.record(z.unknown()).optional()
86
102
  });
103
+ var TheTokenCompanyCompressionSchema = z.object({
104
+ enabled: z.boolean().optional(),
105
+ model: z.string().min(1).optional(),
106
+ aggressiveness: z.number().min(0).max(1).optional()
107
+ });
108
+ var CompressionSchema = z.object({
109
+ thetokencompany: TheTokenCompanyCompressionSchema.optional()
110
+ });
87
111
  var OpenAICacheSchema = z.object({
88
112
  prompt_cache_key: z.string().min(1).optional(),
89
113
  retention: z.enum(["in_memory", "24h"]).optional()
@@ -124,6 +148,8 @@ var ContextBuiltInValidatorSchema = z.union([
124
148
  ]);
125
149
  var ContextInputDefinitionObjectSchema = z.object({
126
150
  name: z.string(),
151
+ optional: z.boolean().optional(),
152
+ warnings: z.boolean().optional(),
127
153
  max_size: z.number().int().positive().optional(),
128
154
  trim: z.union([z.boolean(), z.enum(["start", "end", "both"])]).optional(),
129
155
  allow_regex: ContextRegexSchema.optional(),
@@ -153,7 +179,8 @@ var PromptAssetOverridesSchema = z.object({
153
179
  fallback_models: z.array(z.string()).optional(),
154
180
  reasoning: ReasoningSchema.optional(),
155
181
  sampling: SamplingSchema.optional(),
156
- response: ResponseSchema.optional(),
182
+ response: ResponseSchemaWithValidation.optional(),
183
+ compression: CompressionSchema.optional(),
157
184
  cache: CacheSchema.optional(),
158
185
  raw: RawProviderBodySchema.optional(),
159
186
  tools: z.array(ToolRefSchema).optional(),
@@ -171,7 +198,20 @@ var SectionsSchema = z.object({
171
198
  var PromptDefaultsSchema = z.object({
172
199
  provider: z.enum(["openai", "openai-responses", "anthropic", "google", "gemini", "openrouter", "llmasaservice", "any"]).optional(),
173
200
  model: z.string().optional(),
201
+ fallback_models: z.array(z.string()).optional(),
202
+ reasoning: ReasoningSchema.optional(),
203
+ sampling: SamplingSchema.optional(),
204
+ response: ResponseSchema.optional(),
205
+ compression: CompressionSchema.optional(),
174
206
  cache: CacheSchema.optional(),
207
+ raw: RawProviderBodySchema.optional(),
208
+ tools: z.array(ToolRefSchema).optional(),
209
+ provider_options: ProviderOptionsSchema.optional(),
210
+ mcp: MCPSchema.optional(),
211
+ context: ContextSchema.optional(),
212
+ includes: z.array(z.string()).optional(),
213
+ environments: z.record(PromptAssetOverridesSchema).optional(),
214
+ tiers: z.record(PromptAssetOverridesSchema).optional(),
175
215
  metadata: MetadataSchema.optional(),
176
216
  sections: z.object({
177
217
  system_instructions: z.string().optional()
@@ -186,7 +226,8 @@ var PromptAssetSchema = z.object({
186
226
  fallback_models: z.array(z.string()).optional(),
187
227
  reasoning: ReasoningSchema.optional(),
188
228
  sampling: SamplingSchema.optional(),
189
- response: ResponseSchema.optional(),
229
+ response: ResponseSchemaWithValidation.optional(),
230
+ compression: CompressionSchema.optional(),
190
231
  cache: CacheSchema.optional(),
191
232
  raw: RawProviderBodySchema.optional(),
192
233
  tools: z.array(ToolRefSchema).optional(),
@@ -381,16 +422,122 @@ function parsePrompt(content, filePath) {
381
422
  }
382
423
 
383
424
  // src/parser/loader.ts
384
- import { readFile } from "fs/promises";
385
- import { dirname, join, resolve } from "path";
425
+ import { readFile as readFile2 } from "fs/promises";
426
+ import { dirname as dirname2, join, relative, resolve as resolve2 } from "path";
386
427
  import matter2 from "gray-matter";
428
+
429
+ // src/parser/response-schema-ref.ts
430
+ import { readFile } from "fs/promises";
431
+ import { createHash } from "crypto";
432
+ import { dirname, extname, resolve } from "path";
433
+ import { pathToFileURL } from "url";
434
+ import { z as z2 } from "zod";
435
+ import { zodToJsonSchema } from "zod-to-json-schema";
436
+ var SUPPORTED_SCHEMA_REF_EXTENSIONS = /* @__PURE__ */ new Set([".json", ".js", ".mjs", ".cjs"]);
437
+ async function resolveJsonSchemaRef(schemaRef, promptFilePath) {
438
+ const resolvedPath = resolve(dirname(promptFilePath), schemaRef);
439
+ let raw;
440
+ try {
441
+ raw = await readFile(resolvedPath, "utf-8");
442
+ } catch (error) {
443
+ const code = error.code;
444
+ if (code === "ENOENT") {
445
+ throw new Error(`POK050: response.schema_ref "${schemaRef}" not found (resolved from ${promptFilePath})`);
446
+ }
447
+ throw error;
448
+ }
449
+ let parsed;
450
+ try {
451
+ parsed = JSON.parse(raw);
452
+ } catch {
453
+ throw new Error(`POK050: response.schema_ref "${schemaRef}" is not valid JSON`);
454
+ }
455
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
456
+ throw new Error(`POK050: response.schema_ref "${schemaRef}" must resolve to a JSON object schema`);
457
+ }
458
+ return {
459
+ schema: parsed,
460
+ resolvedPath,
461
+ hash: createHash("sha256").update(raw).digest("hex")
462
+ };
463
+ }
464
+ async function resolveZodSchemaRef(schemaRef, promptFilePath) {
465
+ const resolvedPath = resolve(dirname(promptFilePath), schemaRef);
466
+ let moduleSource;
467
+ try {
468
+ moduleSource = await readFile(resolvedPath, "utf-8");
469
+ } catch (error) {
470
+ const code = error.code;
471
+ if (code === "ENOENT") {
472
+ throw new Error(`POK051: response.schema_ref "${schemaRef}" not found (resolved from ${promptFilePath})`);
473
+ }
474
+ throw error;
475
+ }
476
+ let imported;
477
+ try {
478
+ imported = await import(pathToFileURL(resolvedPath).href);
479
+ } catch (error) {
480
+ const message = error instanceof Error ? error.message : String(error);
481
+ throw new Error(`POK051: response.schema_ref "${schemaRef}" could not be imported as a module (${message})`);
482
+ }
483
+ const mod = imported;
484
+ const candidate = mod.default ?? mod.schema;
485
+ if (!(candidate instanceof z2.ZodType)) {
486
+ throw new Error('POK051: zod schema modules must export a Zod schema as default export or named export "schema"');
487
+ }
488
+ const jsonSchema = zodToJsonSchema(candidate, {
489
+ target: "jsonSchema7",
490
+ $refStrategy: "none"
491
+ });
492
+ if (!jsonSchema || typeof jsonSchema !== "object" || Array.isArray(jsonSchema)) {
493
+ throw new Error(`POK051: response.schema_ref "${schemaRef}" did not produce a valid JSON schema object`);
494
+ }
495
+ return {
496
+ schema: jsonSchema,
497
+ resolvedPath,
498
+ hash: createHash("sha256").update(moduleSource).digest("hex")
499
+ };
500
+ }
501
+ async function resolveResponseSchemaRef(asset, promptFilePath) {
502
+ const schemaRef = asset.response?.schema_ref;
503
+ if (!schemaRef) return asset;
504
+ const ext = extname(schemaRef).toLowerCase();
505
+ if (!SUPPORTED_SCHEMA_REF_EXTENSIONS.has(ext)) {
506
+ throw new Error(`POK051: response.schema_ref "${schemaRef}" has unsupported extension "${ext}". Use .json, .js, .mjs, or .cjs`);
507
+ }
508
+ const resolved = ext === ".json" ? await resolveJsonSchemaRef(schemaRef, promptFilePath) : await resolveZodSchemaRef(schemaRef, promptFilePath);
509
+ return {
510
+ ...asset,
511
+ response: {
512
+ ...asset.response,
513
+ schema: resolved.schema,
514
+ schema_ref: void 0,
515
+ schema_source: {
516
+ mode: ext === ".json" ? "schema_ref_json" : "schema_ref_zod_module",
517
+ ref: schemaRef,
518
+ resolved_path: resolved.resolvedPath,
519
+ hash: resolved.hash
520
+ }
521
+ }
522
+ };
523
+ }
524
+
525
+ // src/parser/loader.ts
387
526
  var DEFAULTS_FILE_NAME = "defaults.md";
388
527
  async function loadPromptFile(filePath, options = {}) {
389
- const content = await readFile(filePath, "utf-8");
528
+ const content = await readFile2(filePath, "utf-8");
390
529
  const parsed = parsePrompt(content, filePath);
391
- const root = options.defaultsRoot ?? dirname(filePath);
530
+ const root = options.defaultsRoot ?? dirname2(filePath);
392
531
  const defaults = await loadDefaultsForPath(filePath, root);
393
- const asset = applyDefaults(parsed.asset, defaults);
532
+ const withDefaults = applyDefaults(parsed.asset, defaults);
533
+ const resolved = await resolveResponseSchemaRef(withDefaults, filePath);
534
+ const asset = resolved.response?.schema !== void 0 && !resolved.response?.schema_source ? {
535
+ ...resolved,
536
+ response: {
537
+ ...resolved.response,
538
+ schema_source: { mode: "inline" }
539
+ }
540
+ } : resolved;
394
541
  return {
395
542
  ...parsed,
396
543
  asset
@@ -402,8 +549,8 @@ async function loadDefaultsForPath(filePath, defaultsRoot) {
402
549
  for (const dir of directories) {
403
550
  const defaultsPath = join(dir, DEFAULTS_FILE_NAME);
404
551
  try {
405
- const defaultsContent = await readFile(defaultsPath, "utf-8");
406
- const defaults = parseDefaults(defaultsContent);
552
+ const defaultsContent = await readFile2(defaultsPath, "utf-8");
553
+ const defaults = normalizeDefaultIncludes(parseDefaults(defaultsContent), defaultsPath, filePath);
407
554
  merged = mergeDefaults(merged, defaults);
408
555
  } catch (error) {
409
556
  if (error.code !== "ENOENT") {
@@ -415,14 +562,14 @@ async function loadDefaultsForPath(filePath, defaultsRoot) {
415
562
  }
416
563
  function getDirectoriesToCheck(filePath, defaultsRoot) {
417
564
  const dirs = [];
418
- let current = resolve(dirname(filePath));
419
- const boundary = defaultsRoot ? resolve(defaultsRoot) : void 0;
565
+ let current = resolve2(dirname2(filePath));
566
+ const boundary = defaultsRoot ? resolve2(defaultsRoot) : void 0;
420
567
  while (true) {
421
568
  dirs.unshift(current);
422
- if (boundary && current === boundary || current === dirname(current)) {
569
+ if (boundary && current === boundary || current === dirname2(current)) {
423
570
  break;
424
571
  }
425
- current = dirname(current);
572
+ current = dirname2(current);
426
573
  }
427
574
  return dirs;
428
575
  }
@@ -440,7 +587,20 @@ function mergeDefaults(base, local) {
440
587
  return {
441
588
  provider: local.provider ?? base.provider,
442
589
  model: local.model ?? base.model,
590
+ fallback_models: local.fallback_models ?? base.fallback_models,
591
+ reasoning: mergeRecordBlock(base.reasoning, local.reasoning),
592
+ sampling: mergeRecordBlock(base.sampling, local.sampling),
593
+ response: mergeRecordBlock(base.response, local.response),
594
+ compression: mergeCompression(base.compression, local.compression),
443
595
  cache: mergeCache(base.cache, local.cache),
596
+ raw: mergeRaw(base.raw, local.raw),
597
+ tools: local.tools ?? base.tools,
598
+ provider_options: mergeProviderOptions(base.provider_options, local.provider_options),
599
+ mcp: mergeMcp(base.mcp, local.mcp),
600
+ context: mergeContext(base.context, local.context),
601
+ includes: local.includes ?? base.includes,
602
+ environments: mergeOverrideMap(base.environments, local.environments),
603
+ tiers: mergeOverrideMap(base.tiers, local.tiers),
444
604
  metadata: {
445
605
  ...base.metadata ?? {},
446
606
  ...local.metadata ?? {}
@@ -452,12 +612,22 @@ function mergeDefaults(base, local) {
452
612
  };
453
613
  }
454
614
  function applyDefaults(asset, defaults) {
615
+ const compression = mergeCompression(defaults.compression, asset.compression);
455
616
  const cache = mergeCache(defaults.cache, asset.cache);
617
+ const raw = mergeRaw(defaults.raw, asset.raw);
618
+ const providerOptions = mergeProviderOptions(defaults.provider_options, asset.provider_options);
619
+ const reasoning = mergeRecordBlock(defaults.reasoning, asset.reasoning);
620
+ const sampling = mergeRecordBlock(defaults.sampling, asset.sampling);
621
+ const response = mergeRecordBlock(defaults.response, asset.response);
622
+ const mcp = mergeMcp(defaults.mcp, asset.mcp);
623
+ const context = mergeContext(defaults.context, asset.context);
624
+ const environments = mergeOverrideMap(defaults.environments, asset.environments);
625
+ const tiers = mergeOverrideMap(defaults.tiers, asset.tiers);
456
626
  const hasDefaultMetadata = defaults.metadata && Object.keys(defaults.metadata).length > 0;
457
627
  const hasDefaultSystem = !!defaults.sections?.system_instructions;
458
- const hasDefaultScalars = defaults.provider !== void 0 || defaults.model !== void 0;
459
- const hasDefaultCache = cache !== void 0;
460
- if (!hasDefaultMetadata && !hasDefaultSystem && !hasDefaultScalars && !hasDefaultCache) {
628
+ const hasDefaultScalars = defaults.provider !== void 0 || defaults.model !== void 0 || defaults.fallback_models !== void 0 || defaults.tools !== void 0 || defaults.includes !== void 0;
629
+ const hasDefaultObjects = compression !== void 0 || cache !== void 0 || raw !== void 0 || providerOptions !== void 0 || reasoning !== void 0 || sampling !== void 0 || response !== void 0 || mcp !== void 0 || context !== void 0 || environments !== void 0 || tiers !== void 0;
630
+ if (!hasDefaultMetadata && !hasDefaultSystem && !hasDefaultScalars && !hasDefaultObjects) {
461
631
  return asset;
462
632
  }
463
633
  const mergedMetadata = {
@@ -471,11 +641,53 @@ function applyDefaults(asset, defaults) {
471
641
  ...asset,
472
642
  provider: asset.provider ?? defaults.provider,
473
643
  model: asset.model ?? defaults.model,
644
+ fallback_models: asset.fallback_models ?? defaults.fallback_models,
645
+ reasoning,
646
+ sampling,
647
+ response,
648
+ compression,
474
649
  cache,
650
+ raw,
651
+ tools: asset.tools ?? defaults.tools,
652
+ provider_options: providerOptions,
653
+ mcp,
654
+ context,
655
+ includes: asset.includes ?? defaults.includes,
656
+ environments,
657
+ tiers,
475
658
  metadata,
476
659
  sections
477
660
  };
478
661
  }
662
+ function normalizeDefaultIncludes(defaults, defaultsPath, filePath) {
663
+ if (!defaults.includes) return defaults;
664
+ const promptDir = dirname2(filePath);
665
+ const defaultsDir = dirname2(defaultsPath);
666
+ const includes = defaults.includes.map((includePath) => {
667
+ const relativePath = relative(promptDir, resolve2(defaultsDir, includePath)).replace(/\\/g, "/");
668
+ return relativePath.startsWith(".") ? relativePath : `./${relativePath}`;
669
+ });
670
+ return {
671
+ ...defaults,
672
+ includes
673
+ };
674
+ }
675
+ function mergeRecordBlock(base, local) {
676
+ if (base === void 0) return local;
677
+ if (local === void 0) return base;
678
+ return { ...base, ...local };
679
+ }
680
+ function mergeMcp(base, local) {
681
+ return mergeRecordBlock(base, local);
682
+ }
683
+ function mergeContext(base, local) {
684
+ const merged = {
685
+ ...base ?? {},
686
+ ...local ?? {},
687
+ history: mergeRecordBlock(base?.history, local?.history)
688
+ };
689
+ return Object.keys(merged).length > 0 ? merged : void 0;
690
+ }
479
691
  function mergeCache(base, local) {
480
692
  const merged = {
481
693
  ...base ?? {},
@@ -503,6 +715,83 @@ function mergeCache(base, local) {
503
715
  if (merged.google && Object.keys(merged.google).length === 0) delete merged.google;
504
716
  return Object.keys(merged).length > 0 ? merged : void 0;
505
717
  }
718
+ function mergeCompression(base, local) {
719
+ const merged = {
720
+ ...base ?? {},
721
+ ...local ?? {},
722
+ thetokencompany: mergeRecordBlock(base?.thetokencompany, local?.thetokencompany)
723
+ };
724
+ removeEmptyProviderBlocks(merged);
725
+ return Object.keys(merged).length > 0 ? merged : void 0;
726
+ }
727
+ function mergeRaw(base, local) {
728
+ const merged = {
729
+ ...base ?? {},
730
+ ...local ?? {},
731
+ openai: mergeRecordBlock(base?.openai, local?.openai),
732
+ "openai-responses": mergeRecordBlock(base?.["openai-responses"], local?.["openai-responses"]),
733
+ openai_responses: mergeRecordBlock(base?.openai_responses, local?.openai_responses),
734
+ anthropic: mergeRecordBlock(base?.anthropic, local?.anthropic),
735
+ gemini: mergeRecordBlock(base?.gemini, local?.gemini),
736
+ google: mergeRecordBlock(base?.google, local?.google),
737
+ openrouter: mergeRecordBlock(base?.openrouter, local?.openrouter),
738
+ llmasaservice: mergeRecordBlock(base?.llmasaservice, local?.llmasaservice)
739
+ };
740
+ removeEmptyProviderBlocks(merged);
741
+ return Object.keys(merged).length > 0 ? merged : void 0;
742
+ }
743
+ function mergeProviderOptions(base, local) {
744
+ const merged = {
745
+ ...base ?? {},
746
+ ...local ?? {},
747
+ anthropic: mergeRecordBlock(base?.anthropic, local?.anthropic),
748
+ gemini: mergeRecordBlock(base?.gemini, local?.gemini),
749
+ openrouter: mergeRecordBlock(base?.openrouter, local?.openrouter),
750
+ llmasaservice: mergeRecordBlock(base?.llmasaservice, local?.llmasaservice)
751
+ };
752
+ removeEmptyProviderBlocks(merged);
753
+ return Object.keys(merged).length > 0 ? merged : void 0;
754
+ }
755
+ function mergeOverrideMap(base, local) {
756
+ const merged = { ...base ?? {} };
757
+ for (const [name, localOverride] of Object.entries(local ?? {})) {
758
+ merged[name] = mergeOverrideConfig(merged[name], localOverride);
759
+ }
760
+ return Object.keys(merged).length > 0 ? merged : void 0;
761
+ }
762
+ function mergeOverrideConfig(base, local) {
763
+ const merged = {
764
+ ...base ?? {},
765
+ ...local
766
+ };
767
+ const reasoning = mergeRecordBlock(base?.reasoning, local.reasoning);
768
+ const sampling = mergeRecordBlock(base?.sampling, local.sampling);
769
+ const response = mergeRecordBlock(base?.response, local.response);
770
+ const compression = mergeCompression(base?.compression, local.compression);
771
+ const cache = mergeCache(base?.cache, local.cache);
772
+ const raw = mergeRaw(base?.raw, local.raw);
773
+ const providerOptions = mergeProviderOptions(base?.provider_options, local.provider_options);
774
+ if (reasoning !== void 0) merged.reasoning = reasoning;
775
+ if (sampling !== void 0) merged.sampling = sampling;
776
+ if (response !== void 0) merged.response = response;
777
+ if (compression !== void 0) merged.compression = compression;
778
+ if (cache !== void 0) merged.cache = cache;
779
+ if (raw !== void 0) merged.raw = raw;
780
+ if (providerOptions !== void 0) merged.provider_options = providerOptions;
781
+ return merged;
782
+ }
783
+ function removeEmptyProviderBlocks(value) {
784
+ for (const key of Object.keys(value)) {
785
+ const block = value[key];
786
+ if (block === void 0) {
787
+ delete value[key];
788
+ continue;
789
+ }
790
+ if (block !== null && typeof block === "object" && !Array.isArray(block) && Object.keys(block).length === 0) {
791
+ delete value[key];
792
+ }
793
+ }
794
+ }
506
795
 
507
796
  export {
508
797
  PromptAssetOverridesSchema,
@@ -511,4 +800,4 @@ export {
511
800
  parsePrompt,
512
801
  loadPromptFile
513
802
  };
514
- //# sourceMappingURL=chunk-K6ZU3CGV.js.map
803
+ //# sourceMappingURL=chunk-ULVY473P.js.map