promptopskit 0.9.1 → 0.10.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -7
- package/SKILL.md +5 -4
- package/dist/{chunk-QZHR2YMK.js → chunk-46Z64RVO.js} +61 -21
- package/dist/{chunk-QZHR2YMK.js.map → chunk-46Z64RVO.js.map} +1 -1
- package/dist/{chunk-EDHPVR2F.js → chunk-7XLJOH2K.js} +3 -3
- package/dist/{chunk-VOXMOGU5.js → chunk-ALBSFXYR.js} +2 -1
- package/dist/chunk-ALBSFXYR.js.map +1 -0
- package/dist/{chunk-C5HHTLZX.js → chunk-IGLKVT74.js} +2 -2
- package/dist/{chunk-7GMCNHXJ.js → chunk-PSQWMBKX.js} +21 -21
- package/dist/chunk-PSQWMBKX.js.map +1 -0
- package/dist/{chunk-O3SRIDTH.js → chunk-QVJTND5A.js} +2 -2
- package/dist/{chunk-QHAIOVQ3.js → chunk-UULXO5I6.js} +2 -2
- package/dist/{chunk-D23T3X4V.js → chunk-VUQEB5ML.js} +2 -2
- package/dist/cli/index.js +1 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +81 -39
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -3
- package/dist/index.d.ts +5 -3
- package/dist/index.js +11 -11
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.cjs +60 -19
- package/dist/providers/anthropic.cjs.map +1 -1
- package/dist/providers/anthropic.d.cts +1 -1
- package/dist/providers/anthropic.d.ts +1 -1
- package/dist/providers/anthropic.js +3 -3
- package/dist/providers/gemini.cjs +60 -19
- package/dist/providers/gemini.cjs.map +1 -1
- package/dist/providers/gemini.d.cts +1 -1
- package/dist/providers/gemini.d.ts +1 -1
- package/dist/providers/gemini.js +3 -3
- package/dist/providers/llmasaservice.cjs +78 -38
- package/dist/providers/llmasaservice.cjs.map +1 -1
- package/dist/providers/llmasaservice.d.cts +6 -5
- package/dist/providers/llmasaservice.d.ts +6 -5
- package/dist/providers/llmasaservice.js +4 -6
- package/dist/providers/openai-responses.cjs +60 -19
- package/dist/providers/openai-responses.cjs.map +1 -1
- package/dist/providers/openai-responses.d.cts +1 -1
- package/dist/providers/openai-responses.d.ts +1 -1
- package/dist/providers/openai-responses.js +3 -3
- package/dist/providers/openai.cjs +60 -19
- package/dist/providers/openai.cjs.map +1 -1
- package/dist/providers/openai.d.cts +1 -1
- package/dist/providers/openai.d.ts +1 -1
- package/dist/providers/openai.js +3 -3
- package/dist/providers/openrouter.cjs +60 -19
- package/dist/providers/openrouter.cjs.map +1 -1
- package/dist/providers/openrouter.d.cts +1 -1
- package/dist/providers/openrouter.d.ts +1 -1
- package/dist/providers/openrouter.js +4 -4
- package/dist/testing.cjs +1 -0
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.js +1 -1
- package/dist/{types-D6VJJo1x.d.ts → types-9Jv8eHhM.d.ts} +8 -1
- package/dist/{types-B4TWRzUY.d.cts → types-D3MemVmM.d.cts} +8 -1
- package/dist/usagetap/index.d.cts +1 -1
- package/dist/usagetap/index.d.ts +1 -1
- package/package.json +1 -1
- package/dist/chunk-7GMCNHXJ.js.map +0 -1
- package/dist/chunk-VOXMOGU5.js.map +0 -1
- /package/dist/{chunk-EDHPVR2F.js.map → chunk-7XLJOH2K.js.map} +0 -0
- /package/dist/{chunk-C5HHTLZX.js.map → chunk-IGLKVT74.js.map} +0 -0
- /package/dist/{chunk-O3SRIDTH.js.map → chunk-QVJTND5A.js.map} +0 -0
- /package/dist/{chunk-QHAIOVQ3.js.map → chunk-UULXO5I6.js.map} +0 -0
- /package/dist/{chunk-D23T3X4V.js.map → chunk-VUQEB5ML.js.map} +0 -0
package/dist/index.d.cts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { P as PromptAsset, a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-BkOMklgI.cjs';
|
|
2
2
|
export { b as PromptAssetOverridesSchema, c as PromptAssetSchema } from './schema-BkOMklgI.cjs';
|
|
3
|
-
import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest, b as PromptCompressionResult, c as PromptCompressionSummary } from './types-
|
|
4
|
-
export { O as OpenAIResponsesRuntimeOptions, d as ProviderInlinePromptSource, e as ProviderPromptInput, f as ProviderPromptLookup, g as ProviderPromptRenderResult, h as RuntimeHistoryCompactionInfo, i as RuntimeHistoryCompactionResult, j as RuntimeHistoryMessage, T as THETOKENCOMPANY_DEFAULT_BASE_URL, k as THETOKENCOMPANY_DEFAULT_MODEL, l as TheTokenCompanyRuntimeOptions, V as ValidationResult, s as summarizePromptCompression } from './types-
|
|
3
|
+
import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest, b as PromptCompressionResult, c as PromptCompressionSummary } from './types-D3MemVmM.cjs';
|
|
4
|
+
export { L as LLMAsAServiceRuntimeOptions, O as OpenAIResponsesRuntimeOptions, d as ProviderInlinePromptSource, e as ProviderPromptInput, f as ProviderPromptLookup, g as ProviderPromptRenderResult, h as RuntimeHistoryCompactionInfo, i as RuntimeHistoryCompactionResult, j as RuntimeHistoryMessage, T as THETOKENCOMPANY_DEFAULT_BASE_URL, k as THETOKENCOMPANY_DEFAULT_MODEL, l as TheTokenCompanyRuntimeOptions, V as ValidationResult, s as summarizePromptCompression } from './types-D3MemVmM.cjs';
|
|
5
5
|
export { UsageTapAllowed, UsageTapAllowedCapability, UsageTapBeginRequest, UsageTapBeginResponse, UsageTapCallOptions, UsageTapCallResult, UsageTapClient, UsageTapClientConfig, UsageTapEndRequest, UsageTapEndResponse, UsageTapEndUsage, UsageTapEntitlementMode, UsageTapEntitlementOptions, UsageTapErrorPayload, UsageTapInvokeContext, UsageTapInvokeResult, UsageTapProviderRunOptions, UsageTapProviderRunResult, UsageTapReasoningLevel, applyUsageTapEntitlements, beginUsageTapCall, createUsageTapClient, defaultUsageTapErrorMapper, endUsageTapCall, extractAnthropicUsage, extractGeminiUsage, extractOpenAIUsage, runAnthropicWithUsageTap, runGeminiWithUsageTap, runLLMAsAServiceWithUsageTap, runOpenAIWithUsageTap, runOpenRouterWithUsageTap, withUsageTapCall } from './usagetap/index.cjs';
|
|
6
6
|
export { anthropicAdapter } from './providers/anthropic.cjs';
|
|
7
7
|
export { geminiAdapter } from './providers/gemini.cjs';
|
|
8
8
|
export { openrouterAdapter } from './providers/openrouter.cjs';
|
|
9
|
-
export { LLMASASERVICE_BASE_URL, LLMASASERVICE_DEFAULT_MODEL, LLMASASERVICE_RESPONSE_HEADER_NAMES,
|
|
9
|
+
export { LLMASASERVICE_BASE_URL, LLMASASERVICE_DEFAULT_MODEL, LLMASASERVICE_RESPONSE_HEADER_NAMES, createLLMAsAServiceOpenAIConfig, llmasaserviceAdapter } from './providers/llmasaservice.cjs';
|
|
10
10
|
export { openaiAdapter } from './providers/openai.cjs';
|
|
11
11
|
export { openaiResponsesAdapter } from './providers/openai-responses.cjs';
|
|
12
12
|
import 'zod';
|
|
@@ -196,6 +196,8 @@ interface RenderPromptOptions {
|
|
|
196
196
|
strict?: boolean;
|
|
197
197
|
/** OpenAI Responses API-specific request options */
|
|
198
198
|
openaiResponses?: RuntimeRenderOptions['openaiResponses'];
|
|
199
|
+
/** LLMAsAService gateway credentials */
|
|
200
|
+
llmasaservice?: RuntimeRenderOptions['llmasaservice'];
|
|
199
201
|
/** TheTokenCompany compression credentials and transport options */
|
|
200
202
|
theTokenCompany?: RuntimeRenderOptions['theTokenCompany'];
|
|
201
203
|
}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { P as PromptAsset, a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-BkOMklgI.js';
|
|
2
2
|
export { b as PromptAssetOverridesSchema, c as PromptAssetSchema } from './schema-BkOMklgI.js';
|
|
3
|
-
import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest, b as PromptCompressionResult, c as PromptCompressionSummary } from './types-
|
|
4
|
-
export { O as OpenAIResponsesRuntimeOptions, d as ProviderInlinePromptSource, e as ProviderPromptInput, f as ProviderPromptLookup, g as ProviderPromptRenderResult, h as RuntimeHistoryCompactionInfo, i as RuntimeHistoryCompactionResult, j as RuntimeHistoryMessage, T as THETOKENCOMPANY_DEFAULT_BASE_URL, k as THETOKENCOMPANY_DEFAULT_MODEL, l as TheTokenCompanyRuntimeOptions, V as ValidationResult, s as summarizePromptCompression } from './types-
|
|
3
|
+
import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest, b as PromptCompressionResult, c as PromptCompressionSummary } from './types-9Jv8eHhM.js';
|
|
4
|
+
export { L as LLMAsAServiceRuntimeOptions, O as OpenAIResponsesRuntimeOptions, d as ProviderInlinePromptSource, e as ProviderPromptInput, f as ProviderPromptLookup, g as ProviderPromptRenderResult, h as RuntimeHistoryCompactionInfo, i as RuntimeHistoryCompactionResult, j as RuntimeHistoryMessage, T as THETOKENCOMPANY_DEFAULT_BASE_URL, k as THETOKENCOMPANY_DEFAULT_MODEL, l as TheTokenCompanyRuntimeOptions, V as ValidationResult, s as summarizePromptCompression } from './types-9Jv8eHhM.js';
|
|
5
5
|
export { UsageTapAllowed, UsageTapAllowedCapability, UsageTapBeginRequest, UsageTapBeginResponse, UsageTapCallOptions, UsageTapCallResult, UsageTapClient, UsageTapClientConfig, UsageTapEndRequest, UsageTapEndResponse, UsageTapEndUsage, UsageTapEntitlementMode, UsageTapEntitlementOptions, UsageTapErrorPayload, UsageTapInvokeContext, UsageTapInvokeResult, UsageTapProviderRunOptions, UsageTapProviderRunResult, UsageTapReasoningLevel, applyUsageTapEntitlements, beginUsageTapCall, createUsageTapClient, defaultUsageTapErrorMapper, endUsageTapCall, extractAnthropicUsage, extractGeminiUsage, extractOpenAIUsage, runAnthropicWithUsageTap, runGeminiWithUsageTap, runLLMAsAServiceWithUsageTap, runOpenAIWithUsageTap, runOpenRouterWithUsageTap, withUsageTapCall } from './usagetap/index.js';
|
|
6
6
|
export { anthropicAdapter } from './providers/anthropic.js';
|
|
7
7
|
export { geminiAdapter } from './providers/gemini.js';
|
|
8
8
|
export { openrouterAdapter } from './providers/openrouter.js';
|
|
9
|
-
export { LLMASASERVICE_BASE_URL, LLMASASERVICE_DEFAULT_MODEL, LLMASASERVICE_RESPONSE_HEADER_NAMES,
|
|
9
|
+
export { LLMASASERVICE_BASE_URL, LLMASASERVICE_DEFAULT_MODEL, LLMASASERVICE_RESPONSE_HEADER_NAMES, createLLMAsAServiceOpenAIConfig, llmasaserviceAdapter } from './providers/llmasaservice.js';
|
|
10
10
|
export { openaiAdapter } from './providers/openai.js';
|
|
11
11
|
export { openaiResponsesAdapter } from './providers/openai-responses.js';
|
|
12
12
|
import 'zod';
|
|
@@ -196,6 +196,8 @@ interface RenderPromptOptions {
|
|
|
196
196
|
strict?: boolean;
|
|
197
197
|
/** OpenAI Responses API-specific request options */
|
|
198
198
|
openaiResponses?: RuntimeRenderOptions['openaiResponses'];
|
|
199
|
+
/** LLMAsAService gateway credentials */
|
|
200
|
+
llmasaservice?: RuntimeRenderOptions['llmasaservice'];
|
|
199
201
|
/** TheTokenCompany compression credentials and transport options */
|
|
200
202
|
theTokenCompany?: RuntimeRenderOptions['theTokenCompany'];
|
|
201
203
|
}
|
package/dist/index.js
CHANGED
|
@@ -2,10 +2,9 @@ import {
|
|
|
2
2
|
LLMASASERVICE_BASE_URL,
|
|
3
3
|
LLMASASERVICE_DEFAULT_MODEL,
|
|
4
4
|
LLMASASERVICE_RESPONSE_HEADER_NAMES,
|
|
5
|
-
LLMASASERVICE_SDK_PLACEHOLDER_API_KEY,
|
|
6
5
|
createLLMAsAServiceOpenAIConfig,
|
|
7
6
|
llmasaserviceAdapter
|
|
8
|
-
} from "./chunk-
|
|
7
|
+
} from "./chunk-PSQWMBKX.js";
|
|
9
8
|
import {
|
|
10
9
|
applyUsageTapEntitlements,
|
|
11
10
|
beginUsageTapCall,
|
|
@@ -24,19 +23,19 @@ import {
|
|
|
24
23
|
} from "./chunk-AGTGIZMR.js";
|
|
25
24
|
import {
|
|
26
25
|
openaiResponsesAdapter
|
|
27
|
-
} from "./chunk-
|
|
26
|
+
} from "./chunk-UULXO5I6.js";
|
|
28
27
|
import {
|
|
29
28
|
anthropicAdapter
|
|
30
|
-
} from "./chunk-
|
|
29
|
+
} from "./chunk-VUQEB5ML.js";
|
|
31
30
|
import {
|
|
32
31
|
geminiAdapter
|
|
33
|
-
} from "./chunk-
|
|
32
|
+
} from "./chunk-QVJTND5A.js";
|
|
34
33
|
import {
|
|
35
34
|
openrouterAdapter
|
|
36
|
-
} from "./chunk-
|
|
35
|
+
} from "./chunk-7XLJOH2K.js";
|
|
37
36
|
import {
|
|
38
37
|
openaiAdapter
|
|
39
|
-
} from "./chunk-
|
|
38
|
+
} from "./chunk-IGLKVT74.js";
|
|
40
39
|
import {
|
|
41
40
|
DEFAULT_PROMPTS_DIR,
|
|
42
41
|
PromptCache,
|
|
@@ -58,14 +57,14 @@ import {
|
|
|
58
57
|
sanitizeContextVariables,
|
|
59
58
|
summarizePromptCompression,
|
|
60
59
|
withPromptResolutionDefaults
|
|
61
|
-
} from "./chunk-
|
|
60
|
+
} from "./chunk-46Z64RVO.js";
|
|
62
61
|
import {
|
|
63
62
|
PromptAssetOverridesSchema,
|
|
64
63
|
PromptAssetSchema,
|
|
65
64
|
extractSections,
|
|
66
65
|
loadPromptFile,
|
|
67
66
|
parsePrompt
|
|
68
|
-
} from "./chunk-
|
|
67
|
+
} from "./chunk-ALBSFXYR.js";
|
|
69
68
|
|
|
70
69
|
// src/index.ts
|
|
71
70
|
import { resolve } from "path";
|
|
@@ -542,7 +541,8 @@ var PromptOpsKit = class {
|
|
|
542
541
|
}
|
|
543
542
|
const adapter = getAdapter(options.provider);
|
|
544
543
|
const validation = adapter.validate(resolved, {
|
|
545
|
-
openaiResponses: options.openaiResponses
|
|
544
|
+
openaiResponses: options.openaiResponses,
|
|
545
|
+
llmasaservice: options.llmasaservice
|
|
546
546
|
});
|
|
547
547
|
if (!validation.valid) {
|
|
548
548
|
throw new Error(
|
|
@@ -579,6 +579,7 @@ var PromptOpsKit = class {
|
|
|
579
579
|
toolRegistry: options.toolRegistry,
|
|
580
580
|
strict: options.strict,
|
|
581
581
|
openaiResponses: options.openaiResponses,
|
|
582
|
+
llmasaservice: options.llmasaservice,
|
|
582
583
|
theTokenCompany: options.theTokenCompany
|
|
583
584
|
});
|
|
584
585
|
const request = adapter.render(prepared.asset, prepared.runtime);
|
|
@@ -651,7 +652,6 @@ export {
|
|
|
651
652
|
LLMASASERVICE_BASE_URL,
|
|
652
653
|
LLMASASERVICE_DEFAULT_MODEL,
|
|
653
654
|
LLMASASERVICE_RESPONSE_HEADER_NAMES,
|
|
654
|
-
LLMASASERVICE_SDK_PLACEHOLDER_API_KEY,
|
|
655
655
|
PromptAssetOverridesSchema,
|
|
656
656
|
PromptAssetSchema,
|
|
657
657
|
PromptOpsKit,
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/providers/index.ts","../src/validation/levenshtein.ts","../src/validation/validate.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\n\nimport { parsePrompt, loadPromptFile } from './parser/index.js';\nimport { resolveIncludes } from './composition/index.js';\nimport { applyOverrides } from './overrides/index.js';\nimport { renderSections } from './renderer/index.js';\nimport { getAdapter } from './providers/index.js';\nimport { validateAsset, validateAssetWithIncludes } from './validation/index.js';\nimport { PromptCache } from './cache.js';\nimport { collectContextSizeWarnings, sanitizeContextVariables } from './context.js';\nimport { compactHistoryForPrompt } from './history.js';\nimport { applyPromptCompressionForRender, summarizePromptCompression } from './compression.js';\nimport {\n DEFAULT_PROMPTS_DIR,\n loadPromptAsset,\n resolveInlinePromptSource,\n resolvePromptAsset,\n withPromptResolutionDefaults,\n} from './prompt-resolution.js';\nimport type { PromptAsset, PromptAssetOverrides, ResolvedPromptAsset } from './schema/index.js';\nimport type { ProviderRequest, RuntimeRenderOptions } from './providers/types.js';\nimport type {\n PromptCompressionResult,\n PromptCompressionSummary,\n TheTokenCompanyRuntimeOptions,\n} from './compression.js';\nimport type { PromptValidationResult } from './validation/index.js';\n\n// --- Re-exports ---\nexport type { PromptAsset, ResolvedPromptAsset } from './schema/index.js';\nexport type {\n ProviderRequest,\n ProviderPromptRenderResult,\n RuntimeRenderOptions,\n RuntimeHistoryCompactionInfo,\n RuntimeHistoryCompactionResult,\n RuntimeHistoryMessage,\n OpenAIResponsesRuntimeOptions,\n ProviderAdapter,\n ProviderInlinePromptSource,\n ProviderPromptInput,\n ProviderPromptLookup,\n ValidationResult,\n} from './providers/types.js';\nexport type {\n PromptCompressionResult,\n PromptCompressionSummary,\n TheTokenCompanyRuntimeOptions,\n} from './compression.js';\nexport type { PromptValidationResult, ValidationError } from './validation/index.js';\nexport type { RenderedSections, RenderOptions } from './renderer/index.js';\nexport type { ParseResult } from './parser/index.js';\nexport type { OverrideOptions } from './overrides/index.js';\nexport type {\n UsageTapAllowed,\n UsageTapAllowedCapability,\n UsageTapBeginRequest,\n UsageTapBeginResponse,\n UsageTapCallOptions,\n UsageTapCallResult,\n UsageTapClient,\n UsageTapClientConfig,\n UsageTapEndRequest,\n UsageTapEndResponse,\n UsageTapEndUsage,\n UsageTapEntitlementMode,\n UsageTapEntitlementOptions,\n UsageTapErrorPayload,\n UsageTapInvokeContext,\n UsageTapInvokeResult,\n UsageTapProviderRunOptions,\n UsageTapProviderRunResult,\n UsageTapReasoningLevel,\n} from './usagetap/index.js';\n\nexport { parsePrompt, loadPromptFile, extractSections } from './parser/index.js';\nexport { interpolate, extractVariables } from './renderer/index.js';\nexport { resolveIncludes } from './composition/index.js';\nexport { applyOverrides } from './overrides/index.js';\nexport { validateAsset, validateAssetWithIncludes } from './validation/index.js';\nexport { getAdapter, openaiAdapter, openaiResponsesAdapter } from './providers/index.js';\nexport { anthropicAdapter } from './providers/anthropic.js';\nexport { geminiAdapter } from './providers/gemini.js';\nexport { openrouterAdapter } from './providers/openrouter.js';\nexport {\n LLMASASERVICE_BASE_URL,\n LLMASASERVICE_DEFAULT_MODEL,\n LLMASASERVICE_RESPONSE_HEADER_NAMES,\n LLMASASERVICE_SDK_PLACEHOLDER_API_KEY,\n createLLMAsAServiceOpenAIConfig,\n llmasaserviceAdapter,\n} from './providers/llmasaservice.js';\nexport { PromptAssetSchema, PromptAssetOverridesSchema } from './schema/index.js';\nexport {\n summarizePromptCompression,\n THETOKENCOMPANY_DEFAULT_BASE_URL,\n THETOKENCOMPANY_DEFAULT_MODEL,\n} from './compression.js';\nexport {\n applyUsageTapEntitlements,\n beginUsageTapCall,\n createUsageTapClient,\n defaultUsageTapErrorMapper,\n endUsageTapCall,\n extractAnthropicUsage,\n extractGeminiUsage,\n extractOpenAIUsage,\n runAnthropicWithUsageTap,\n runGeminiWithUsageTap,\n runLLMAsAServiceWithUsageTap,\n runOpenAIWithUsageTap,\n runOpenRouterWithUsageTap,\n withUsageTapCall,\n} from './usagetap/index.js';\n\n// --- Config ---\n\nexport interface PromptOpsKitConfig {\n sourceDir?: string;\n compiledDir?: string;\n mode?: 'auto' | 'compiled-only' | 'source-only';\n cache?: boolean;\n warnings?: {\n contextSize?: 'auto' | 'off' | 'result-only' | 'console' | 'console-and-result';\n };\n}\n\n// --- Render options ---\n\nexport interface RenderPromptOptions {\n /** Prompt path (no extension), e.g. 'support/reply' */\n path?: string;\n /** Inline prompt source string (alternative to path) */\n source?: string;\n /** Provider name */\n provider: string;\n /** Environment override */\n environment?: string;\n /** Tier override */\n tier?: string;\n /** Runtime overrides applied after environment and tier */\n runtime?: Partial<PromptAssetOverrides>;\n /** Variables for interpolation */\n variables?: Record<string, string>;\n /** Optional callback to transform oversized context values before warnings/rendering */\n onContextOverflow?: RuntimeRenderOptions['onContextOverflow'];\n /** Conversation history */\n history?: RuntimeRenderOptions['history'];\n /** Optional callback to compact history overflow when context.history.max_items is exceeded */\n onHistoryCompaction?: RuntimeRenderOptions['onHistoryCompaction'];\n /** Tool registry for resolving tool references */\n toolRegistry?: Record<string, unknown>;\n /** Strict mode — fail on missing variables */\n strict?: boolean;\n /** OpenAI Responses API-specific request options */\n openaiResponses?: RuntimeRenderOptions['openaiResponses'];\n /** TheTokenCompany compression credentials and transport options */\n theTokenCompany?: RuntimeRenderOptions['theTokenCompany'];\n}\n\n// --- Result ---\n\nexport interface RenderResult {\n resolved: ResolvedPromptAsset;\n request?: ProviderRequest;\n returnMessage?: string;\n compression?: PromptCompressionResult[];\n compressionSummary?: PromptCompressionSummary;\n warnings: string[];\n}\n\nfunction shouldIncludeContextWarningsInResult(\n policy: NonNullable<PromptOpsKitConfig['warnings']>['contextSize'] | undefined,\n): boolean {\n return policy === undefined\n || policy === 'auto'\n || policy === 'result-only'\n || policy === 'console-and-result';\n}\n\nfunction shouldLogContextWarnings(\n policy: NonNullable<PromptOpsKitConfig['warnings']>['contextSize'] | undefined,\n options: Pick<RenderPromptOptions, 'source'>,\n mode: PromptOpsKitConfig['mode'],\n): boolean {\n if (policy === 'off' || policy === 'result-only') {\n return false;\n }\n\n if (policy === 'console' || policy === 'console-and-result') {\n return true;\n }\n\n return Boolean(options.source || mode !== 'compiled-only');\n}\n\nfunction formatContextSizeWarning(\n asset: ResolvedPromptAsset,\n warning: { variable: string; maxSize: number; actualSize: number },\n): string {\n return [\n 'POK030:',\n `Context variable \"${warning.variable}\" exceeded max_size`,\n `for prompt \"${asset.id}\"`,\n `(${warning.actualSize} bytes > ${warning.maxSize} bytes).`,\n ].join(' ');\n}\n\n// --- Main class ---\n\nexport class PromptOpsKit {\n private config: Required<Pick<PromptOpsKitConfig, 'sourceDir' | 'mode'>> & PromptOpsKitConfig;\n private promptCache: PromptCache<PromptAsset>;\n\n constructor(config: PromptOpsKitConfig) {\n const resolvedConfig = withPromptResolutionDefaults(config);\n this.config = {\n ...resolvedConfig,\n mode: resolvedConfig.mode ?? 'auto',\n cache: resolvedConfig.cache ?? true,\n };\n this.promptCache = new PromptCache();\n }\n\n /**\n * Load a prompt asset from compiled or source, based on mode.\n */\n async loadPrompt(promptPath: string): Promise<PromptAsset> {\n return loadPromptAsset(promptPath, this.config, this.promptCache);\n }\n\n /**\n * Resolve a prompt: load, resolve includes, apply overrides.\n */\n async resolvePrompt(\n promptPath: string,\n options: { environment?: string; tier?: string; runtime?: Partial<PromptAssetOverrides> } = {},\n ): Promise<ResolvedPromptAsset> {\n return resolvePromptAsset(promptPath, this.config, options, this.promptCache);\n }\n\n /**\n * Render a prompt for a specific provider.\n */\n async renderPrompt(options: RenderPromptOptions): Promise<RenderResult> {\n let resolved: ResolvedPromptAsset;\n\n if (options.source) {\n resolved = resolveInlinePromptSource(options.source, {\n environment: options.environment,\n tier: options.tier,\n runtime: options.runtime,\n });\n } else if (options.path) {\n resolved = await this.resolvePrompt(options.path, {\n environment: options.environment,\n tier: options.tier,\n runtime: options.runtime,\n });\n } else {\n throw new Error('Either \"path\" or \"source\" must be provided to renderPrompt()');\n }\n\n const adapter = getAdapter(options.provider);\n const validation = adapter.validate(resolved, {\n openaiResponses: options.openaiResponses,\n });\n\n if (!validation.valid) {\n throw new Error(\n `Provider validation failed for \"${options.provider}\":\\n` +\n validation.errors.map((e) => ` - ${e}`).join('\\n'),\n );\n }\n\n const sanitization = sanitizeContextVariables(resolved, options.variables, {\n onContextOverflow: options.onContextOverflow,\n });\n\n if (sanitization.shortCircuit) {\n return {\n resolved,\n returnMessage: sanitization.shortCircuit.returnMessage,\n warnings: validation.warnings,\n };\n }\n\n const contextSizeWarnings = collectContextSizeWarnings(resolved, sanitization.variables).map((warning) =>\n formatContextSizeWarning(resolved, warning),\n );\n\n const contextWarningPolicy = this.config.warnings?.contextSize;\n\n if (contextSizeWarnings.length > 0 && shouldLogContextWarnings(contextWarningPolicy, options, this.config.mode)) {\n for (const warning of contextSizeWarnings) {\n console.warn(`[promptopskit] Warning: ${warning}`);\n }\n }\n\n const prepared = await applyPromptCompressionForRender(resolved, {\n variables: sanitization.variables,\n history: compactHistoryForPrompt(resolved, {\n history: options.history,\n onHistoryCompaction: options.onHistoryCompaction,\n }),\n onHistoryCompaction: options.onHistoryCompaction,\n toolRegistry: options.toolRegistry,\n strict: options.strict,\n openaiResponses: options.openaiResponses,\n theTokenCompany: options.theTokenCompany,\n });\n const request = adapter.render(prepared.asset, prepared.runtime);\n const compressionSummary = prepared.compression.length > 0\n ? summarizePromptCompression(prepared.compression)\n : undefined;\n\n return {\n resolved,\n request: prepared.compression.length > 0 || prepared.warnings.length > 0\n ? {\n ...request,\n ...(prepared.compression.length > 0 ? { compression: prepared.compression, compressionSummary } : {}),\n ...(prepared.warnings.length > 0 ? { warnings: prepared.warnings } : {}),\n }\n : request,\n ...(prepared.compression.length > 0 ? { compression: prepared.compression } : {}),\n ...(compressionSummary ? { compressionSummary } : {}),\n warnings: shouldIncludeContextWarningsInResult(contextWarningPolicy)\n ? [...validation.warnings, ...contextSizeWarnings, ...prepared.warnings]\n : [...validation.warnings, ...prepared.warnings],\n };\n }\n\n /**\n * Validate a prompt file.\n */\n async validatePrompt(promptPath: string): Promise<PromptValidationResult> {\n const sourceFile = resolve(this.config.sourceDir, promptPath + '.md');\n\n try {\n const asset = await this.loadPrompt(promptPath);\n return validateAssetWithIncludes(asset, sourceFile);\n } catch (error) {\n const validationError = toPromptValidationError(error, sourceFile);\n if (validationError) {\n return {\n valid: false,\n errors: [validationError],\n warnings: [],\n };\n }\n\n throw error;\n }\n }\n\n /**\n * Clear the internal cache.\n */\n clearCache(): void {\n this.promptCache.clear();\n }\n}\n\n// --- Factory ---\n\nexport function createPromptOpsKit(config: PromptOpsKitConfig = {}): PromptOpsKit {\n return new PromptOpsKit(config);\n}\n\nfunction toPromptValidationError(error: unknown, filePath: string): PromptValidationResult['errors'][number] | undefined {\n if (!(error instanceof Error)) {\n return undefined;\n }\n\n const match = error.message.match(/^(POK\\d+):\\s*(.*)$/);\n if (!match) {\n return undefined;\n }\n\n return {\n code: match[1],\n message: match[2],\n filePath,\n };\n}\n\n// --- Standalone convenience ---\n\n/**\n * Standalone renderPrompt for quick usage without creating a PromptOpsKit instance.\n * Requires either `source` (inline) or `path` + implicit sourceDir of ./prompts.\n */\nexport async function renderPrompt(\n options: RenderPromptOptions & {\n sourceDir?: string;\n warnings?: PromptOpsKitConfig['warnings'];\n },\n): Promise<RenderResult> {\n const kit = createPromptOpsKit({\n sourceDir: options.sourceDir ?? DEFAULT_PROMPTS_DIR,\n cache: false,\n warnings: options.warnings,\n });\n return kit.renderPrompt(options);\n}\n","export type {\n ProviderAdapter,\n ProviderInlinePromptSource,\n ProviderPromptInput,\n ProviderPromptLookup,\n ProviderRequest,\n ValidationResult,\n RuntimeRenderOptions,\n} from './types.js';\nexport { openaiAdapter } from './openai.js';\nexport { openaiResponsesAdapter } from './openai-responses.js';\nexport { anthropicAdapter } from './anthropic.js';\nexport { geminiAdapter } from './gemini.js';\nexport { openrouterAdapter } from './openrouter.js';\nexport {\n LLMASASERVICE_BASE_URL,\n LLMASASERVICE_DEFAULT_MODEL,\n LLMASASERVICE_RESPONSE_HEADER_NAMES,\n LLMASASERVICE_SDK_PLACEHOLDER_API_KEY,\n createLLMAsAServiceOpenAIConfig,\n llmasaserviceAdapter,\n} from './llmasaservice.js';\n\nimport type { ProviderAdapter } from './types.js';\nimport { openaiAdapter } from './openai.js';\nimport { openaiResponsesAdapter } from './openai-responses.js';\nimport { anthropicAdapter } from './anthropic.js';\nimport { geminiAdapter } from './gemini.js';\nimport { openrouterAdapter } from './openrouter.js';\nimport { llmasaserviceAdapter } from './llmasaservice.js';\n\nconst adapters: Record<string, ProviderAdapter> = {\n openai: openaiAdapter,\n 'openai-responses': openaiResponsesAdapter,\n anthropic: anthropicAdapter,\n google: geminiAdapter,\n gemini: geminiAdapter,\n openrouter: openrouterAdapter,\n llmasaservice: llmasaserviceAdapter,\n};\n\n/**\n * Get a provider adapter by name.\n */\nexport function getAdapter(provider: string): ProviderAdapter {\n const adapter = adapters[provider];\n if (!adapter) {\n throw new Error(\n `Unknown provider: \"${provider}\". Supported: ${Object.keys(adapters).join(', ')}`,\n );\n }\n return adapter;\n}\n","/**\n * Compute the Levenshtein distance between two strings.\n * Used for \"did you mean?\" suggestions on unknown fields.\n */\nexport function levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n\n if (m === 0) return n;\n if (n === 0) return m;\n\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0) as number[]);\n\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(\n dp[i - 1][j] + 1,\n dp[i][j - 1] + 1,\n dp[i - 1][j - 1] + cost,\n );\n }\n }\n\n return dp[m][n];\n}\n","import { PromptAssetSchema } from '../schema/index.js';\nimport type { PromptAsset } from '../schema/index.js';\nimport { extractVariables } from '../renderer/index.js';\nimport { resolveIncludes } from '../composition/index.js';\nimport {\n areContextInputWarningsEnabled,\n compileContextRegex,\n getContextInputs,\n} from '../context.js';\nimport { levenshtein } from './levenshtein.js';\n\nexport interface ValidationError {\n code: string;\n message: string;\n filePath?: string;\n suggestion?: string;\n}\n\nexport interface PromptValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationError[];\n}\n\nconst KNOWN_FRONT_MATTER_KEYS = new Set([\n 'id', 'schema_version', 'description', 'provider', 'model', 'fallback_models',\n 'reasoning', 'sampling', 'response', 'tools', 'mcp', 'context', 'includes',\n 'environments', 'tiers', 'metadata', 'cache', 'compression', 'provider_options', 'raw',\n]);\n\n\n\nfunction collectSchemaKeywords(value: unknown, acc: Set<string>): void {\n if (!value || typeof value !== 'object') return;\n if (Array.isArray(value)) {\n for (const item of value) collectSchemaKeywords(item, acc);\n return;\n }\n\n const record = value as Record<string, unknown>;\n for (const [key, child] of Object.entries(record)) {\n acc.add(key);\n collectSchemaKeywords(child, acc);\n }\n}\n\nconst RISKY_UNBOUNDED_INPUT_NAMES = [\n 'message',\n 'prompt',\n 'history',\n 'transcript',\n 'document',\n 'content',\n 'input',\n 'body',\n 'context',\n];\n\nconst COMPRESS_MODIFIER_RE = /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\|\\s*compress\\s*\\}\\}/g;\n\n/**\n * Validate a parsed prompt asset, returning all errors and warnings.\n */\nexport function validateAsset(\n asset: PromptAsset,\n frontMatterKeys?: string[],\n filePath?: string,\n): PromptValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationError[] = [];\n\n // Schema validation\n const result = PromptAssetSchema.safeParse(asset);\n if (!result.success) {\n for (const issue of result.error.issues) {\n errors.push({\n code: 'POK001',\n message: `Schema error at ${issue.path.join('.')}: ${issue.message}`,\n filePath,\n });\n }\n }\n\n // Missing id\n if (!asset.id) {\n errors.push({\n code: 'POK002',\n message: 'Missing required field: \"id\"',\n filePath,\n });\n }\n\n // Missing body sections\n if (!asset.sections?.system_instructions && !asset.sections?.prompt_template) {\n errors.push({\n code: 'POK003',\n message: 'Prompt must have at least one body section (System instructions or Prompt template)',\n filePath,\n });\n }\n\n // Unknown front matter keys with \"did you mean?\"\n if (frontMatterKeys) {\n for (const key of frontMatterKeys) {\n if (!KNOWN_FRONT_MATTER_KEYS.has(key)) {\n const suggestion = findClosestMatch(key, KNOWN_FRONT_MATTER_KEYS);\n warnings.push({\n code: 'POK010',\n message: `Unknown front matter field: \"${key}\"`,\n filePath,\n suggestion: suggestion ? `Did you mean \"${suggestion}\"?` : undefined,\n });\n }\n }\n }\n\n // Variable validation: used but not declared\n const contextInputs = getContextInputs(asset);\n const declaredInputs = new Set(contextInputs.map((input) => input.name));\n const declaredInputsByName = new Map(contextInputs.map((input) => [input.name, input]));\n const usedVars = new Set<string>();\n\n if (asset.sections?.system_instructions) {\n for (const v of extractVariables(asset.sections.system_instructions)) {\n usedVars.add(v);\n }\n }\n if (asset.sections?.prompt_template) {\n for (const v of extractVariables(asset.sections.prompt_template)) {\n usedVars.add(v);\n }\n }\n\n for (const v of usedVars) {\n if (!declaredInputs.has(v)) {\n warnings.push({\n code: 'POK011',\n message: `Variable \"{{ ${v} }}\" is used but not declared in context.inputs`,\n filePath,\n });\n }\n }\n\n // Declared but unused\n for (const v of declaredInputs) {\n const input = declaredInputsByName.get(v);\n if (!usedVars.has(v) && input?.optional !== true && areContextInputWarningsEnabled(input ?? {})) {\n warnings.push({\n code: 'POK012',\n message: `Variable \"${v}\" is declared in context.inputs but never used`,\n filePath,\n });\n }\n }\n\n if (usedVars.size > 0 && (!asset.context?.inputs || asset.context.inputs.length === 0)) {\n warnings.push({\n code: 'POK046',\n message: `Template uses ${usedVars.size === 1 ? 'a variable' : 'variables'} but context.inputs is not declared.`,\n filePath,\n suggestion: 'Declare context.inputs to enable input policy validation.',\n });\n }\n\n if (asset.compression?.heuristic?.enabled === true && asset.compression.heuristic.json_to_toon !== true) {\n warnings.push({\n code: 'POK055',\n message: 'Prompt-level heuristic compression is enabled for the full prompt template.',\n filePath,\n suggestion: 'Prefer per-placeholder compression for bulky context values so instructions, output constraints, and safety conditions are not sentence-selected away.',\n });\n }\n\n const systemHeuristicCompressionVariables = findSystemHeuristicCompressionVariables(\n asset.sections?.system_instructions,\n declaredInputsByName,\n );\n if (systemHeuristicCompressionVariables.length > 0) {\n warnings.push({\n code: 'POK056',\n message: `System instructions use heuristic compression for ${formatQuotedList(systemHeuristicCompressionVariables)}.`,\n filePath,\n suggestion: 'Avoid compressing values inside system instructions; move lossy compression to prompt-template context placeholders when possible.',\n });\n }\n\n // Context regex definitions compile successfully\n for (const input of contextInputs) {\n const lowerName = input.name.toLowerCase();\n const inputWarningsEnabled = areContextInputWarningsEnabled(input);\n\n if (\n inputWarningsEnabled\n && input.max_size === undefined\n && RISKY_UNBOUNDED_INPUT_NAMES.some((needle) => lowerName.includes(needle))\n ) {\n warnings.push({\n code: 'POK040',\n message: `Context input \"${input.name}\" has no max_size and appears unbounded.`,\n filePath,\n suggestion: 'Add max_size to constrain prompt payload growth.',\n });\n }\n\n if (\n inputWarningsEnabled\n && input.optional !== true\n && input.allow_regex === undefined\n && input.deny_regex === undefined\n && input.non_empty === undefined\n && input.reject_secrets === undefined\n ) {\n warnings.push({\n code: 'POK041',\n message: `Context input \"${input.name}\" has no input hardening validators.`,\n filePath,\n suggestion: 'Consider non_empty/reject_secrets and allow/deny regex validators.',\n });\n }\n\n if (inputWarningsEnabled && input.trim !== undefined && input.trim !== false && input.max_size === undefined) {\n warnings.push({\n code: 'POK014',\n message: `Context input \"${input.name}\" sets trim but has no max_size; trim-to-budget will be skipped.`,\n filePath,\n });\n }\n\n const checks: Array<{\n regex: NonNullable<typeof input.allow_regex>;\n kind: 'allow_regex' | 'deny_regex';\n }> = [];\n\n if (input.allow_regex) checks.push({ regex: input.allow_regex, kind: 'allow_regex' });\n if (input.deny_regex) checks.push({ regex: input.deny_regex, kind: 'deny_regex' });\n\n for (const check of checks) {\n try {\n compileContextRegex(check.regex, {\n promptId: asset.id,\n variable: input.name,\n field: check.kind,\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message.replace(/^POK013:\\s*/, '') : String(error);\n errors.push({\n code: 'POK013',\n message: reason,\n filePath,\n });\n }\n }\n }\n\n\n if (asset.response?.schema && asset.provider) {\n const keywords = new Set<string>();\n collectSchemaKeywords(asset.response.schema, keywords);\n\n const openAIUnsupported = ['patternProperties', 'unevaluatedProperties', '$dynamicRef'];\n const geminiUnsupported = ['patternProperties', '$dynamicRef', 'dependentSchemas'];\n const anthropicCaution = ['if', 'then', 'else'];\n\n const checks: Array<{ provider: string[]; unsupported: string[]; code: string }> = [\n { provider: ['openai', 'openai-responses', 'openrouter', 'llmasaservice'], unsupported: openAIUnsupported, code: 'POK052' },\n { provider: ['gemini', 'google'], unsupported: geminiUnsupported, code: 'POK053' },\n { provider: ['anthropic'], unsupported: anthropicCaution, code: 'POK054' },\n ];\n\n for (const check of checks) {\n if (!check.provider.includes(asset.provider)) continue;\n const hits = check.unsupported.filter((k) => keywords.has(k));\n if (hits.length > 0) {\n warnings.push({\n code: check.code,\n message: `response.schema includes provider-sensitive JSON Schema keywords for \"${asset.provider}\": ${hits.join(', ')}`,\n filePath,\n suggestion: 'Validate schema compatibility with your provider docs or simplify the schema dialect.',\n });\n }\n }\n }\n\n if (asset.provider) {\n let providerCache: unknown;\n let cacheSuggestionField: string | undefined;\n\n switch (asset.provider) {\n case 'openai':\n providerCache = asset.cache?.openai;\n cacheSuggestionField = 'cache.openai';\n break;\n case 'anthropic':\n providerCache = asset.cache?.anthropic;\n cacheSuggestionField = 'cache.anthropic';\n break;\n case 'gemini':\n case 'google':\n providerCache = asset.cache?.gemini ?? asset.cache?.google;\n cacheSuggestionField = 'cache.gemini';\n break;\n default:\n break;\n }\n\n if (cacheSuggestionField && providerCache === undefined) {\n warnings.push({\n code: 'POK042',\n message: `Provider \"${asset.provider}\" has no provider-specific cache settings.`,\n filePath,\n suggestion: `Consider configuring ${cacheSuggestionField} for better cache-hit behavior.`,\n });\n }\n\n if (!asset.model) {\n warnings.push({\n code: 'POK044',\n message: `Provider \"${asset.provider}\" is configured without a model.`,\n filePath,\n suggestion: 'Set model in prompt or defaults to avoid adapter-time errors.',\n });\n }\n }\n\n if (\n asset.cache?.gemini?.cached_content\n && asset.cache.google?.cached_content\n && asset.cache.gemini.cached_content !== asset.cache.google.cached_content\n ) {\n warnings.push({\n code: 'POK043',\n message: 'cache.gemini.cached_content and cache.google.cached_content are both set to different values.',\n filePath,\n suggestion: 'Use one canonical value; Gemini prefers cache.gemini.cached_content.',\n });\n }\n\n for (const [envName, overrides] of Object.entries(asset.environments ?? {})) {\n if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {\n warnings.push({\n code: 'POK045',\n message: `Environment \"${envName}\" does not override cache while prompt-level cache is defined.`,\n filePath,\n suggestion: 'Confirm cache strategy is intentionally shared across environments.',\n });\n }\n }\n\n for (const [tierName, overrides] of Object.entries(asset.tiers ?? {})) {\n if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {\n warnings.push({\n code: 'POK045',\n message: `Tier \"${tierName}\" does not override cache while prompt-level cache is defined.`,\n filePath,\n suggestion: 'Confirm cache strategy is intentionally shared across tiers.',\n });\n }\n }\n\n for (const tool of asset.tools ?? []) {\n if (isRecord(tool)) {\n if (!tool.description) {\n warnings.push({\n code: 'POK047',\n message: `Inline tool \"${tool.name}\" is missing a description.`,\n filePath,\n suggestion: 'Add description to improve model tool-selection quality.',\n });\n }\n if (!tool.input_schema) {\n warnings.push({\n code: 'POK047',\n message: `Inline tool \"${tool.name}\" is missing input_schema.`,\n filePath,\n suggestion: 'Add input_schema so tool inputs are strongly typed.',\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validate a prompt asset including its include graph.\n * Catches missing include files, circular includes, and parse errors in included files.\n */\nexport async function validateAssetWithIncludes(\n asset: PromptAsset,\n filePath: string,\n frontMatterKeys?: string[],\n): Promise<PromptValidationResult> {\n // Run standard validation first\n const result = validateAsset(asset, frontMatterKeys, filePath);\n\n // Validate includes\n if (asset.includes && asset.includes.length > 0) {\n try {\n await resolveIncludes(asset, filePath);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const isCircular = message.includes('Circular include');\n result.errors.push({\n code: isCircular ? 'POK021' : 'POK020',\n message: isCircular\n ? `Circular include detected: ${message}`\n : `Include resolution failed: ${message}`,\n filePath,\n });\n result.valid = false;\n }\n }\n\n return result;\n}\n\nfunction findClosestMatch(input: string, candidates: Set<string>): string | undefined {\n let best: string | undefined;\n let bestDist = Infinity;\n\n for (const candidate of candidates) {\n const dist = levenshtein(input.toLowerCase(), candidate.toLowerCase());\n if (dist < bestDist && dist <= 3) {\n bestDist = dist;\n best = candidate;\n }\n }\n\n return best;\n}\n\nfunction findSystemHeuristicCompressionVariables(\n systemInstructions: string | undefined,\n declaredInputsByName: Map<string, ReturnType<typeof getContextInputs>[number]>,\n): string[] {\n if (!systemInstructions) {\n return [];\n }\n\n const variables = new Set<string>();\n\n for (const match of systemInstructions.matchAll(COMPRESS_MODIFIER_RE)) {\n variables.add(match[1]);\n }\n\n for (const variable of extractVariables(systemInstructions)) {\n const input = declaredInputsByName.get(variable);\n const heuristic = input?.compression?.heuristic;\n if (heuristic?.enabled === true && heuristic.json_to_toon !== true) {\n variables.add(variable);\n }\n }\n\n return [...variables].sort();\n}\n\nfunction formatQuotedList(values: string[]): string {\n return values.map((value) => `\"${value}\"`).join(', ');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,SAAS,eAAqB;;;AC8B9B,IAAM,WAA4C;AAAA,EAChD,QAAQ;AAAA,EACR,oBAAoB;AAAA,EACpB,WAAW;AAAA,EACX,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,YAAY;AAAA,EACZ,eAAe;AACjB;AAKO,SAAS,WAAW,UAAmC;AAC5D,QAAM,UAAU,SAAS,QAAQ;AACjC,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI;AAAA,MACR,sBAAsB,QAAQ,iBAAiB,OAAO,KAAK,QAAQ,EAAE,KAAK,IAAI,CAAC;AAAA,IACjF;AAAA,EACF;AACA,SAAO;AACT;;;AChDO,SAAS,YAAY,GAAW,GAAmB;AACxD,QAAM,IAAI,EAAE;AACZ,QAAM,IAAI,EAAE;AAEZ,MAAI,MAAM,EAAG,QAAO;AACpB,MAAI,MAAM,EAAG,QAAO;AAEpB,QAAM,KAAiB,MAAM,KAAK,EAAE,QAAQ,IAAI,EAAE,GAAG,MAAM,MAAM,IAAI,CAAC,EAAE,KAAK,CAAC,CAAa;AAE3F,WAAS,IAAI,GAAG,KAAK,GAAG,IAAK,IAAG,CAAC,EAAE,CAAC,IAAI;AACxC,WAAS,IAAI,GAAG,KAAK,GAAG,IAAK,IAAG,CAAC,EAAE,CAAC,IAAI;AAExC,WAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,aAAS,IAAI,GAAG,KAAK,GAAG,KAAK;AAC3B,YAAM,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI;AACzC,SAAG,CAAC,EAAE,CAAC,IAAI,KAAK;AAAA,QACd,GAAG,IAAI,CAAC,EAAE,CAAC,IAAI;AAAA,QACf,GAAG,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA,QACf,GAAG,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;AAAA,MACrB;AAAA,IACF;AAAA,EACF;AAEA,SAAO,GAAG,CAAC,EAAE,CAAC;AAChB;;;ACJA,IAAM,0BAA0B,oBAAI,IAAI;AAAA,EACtC;AAAA,EAAM;AAAA,EAAkB;AAAA,EAAe;AAAA,EAAY;AAAA,EAAS;AAAA,EAC5D;AAAA,EAAa;AAAA,EAAY;AAAA,EAAY;AAAA,EAAS;AAAA,EAAO;AAAA,EAAW;AAAA,EAChE;AAAA,EAAgB;AAAA,EAAS;AAAA,EAAY;AAAA,EAAS;AAAA,EAAe;AAAA,EAAoB;AACnF,CAAC;AAID,SAAS,sBAAsB,OAAgB,KAAwB;AACrE,MAAI,CAAC,SAAS,OAAO,UAAU,SAAU;AACzC,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,eAAW,QAAQ,MAAO,uBAAsB,MAAM,GAAG;AACzD;AAAA,EACF;AAEA,QAAM,SAAS;AACf,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,MAAM,GAAG;AACjD,QAAI,IAAI,GAAG;AACX,0BAAsB,OAAO,GAAG;AAAA,EAClC;AACF;AAEA,IAAM,8BAA8B;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;AAEA,IAAM,uBAAuB;AAKtB,SAAS,cACd,OACA,iBACA,UACwB;AACxB,QAAM,SAA4B,CAAC;AACnC,QAAM,WAA8B,CAAC;AAGrC,QAAM,SAAS,kBAAkB,UAAU,KAAK;AAChD,MAAI,CAAC,OAAO,SAAS;AACnB,eAAW,SAAS,OAAO,MAAM,QAAQ;AACvC,aAAO,KAAK;AAAA,QACV,MAAM;AAAA,QACN,SAAS,mBAAmB,MAAM,KAAK,KAAK,GAAG,CAAC,KAAK,MAAM,OAAO;AAAA,QAClE;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,MAAI,CAAC,MAAM,IAAI;AACb,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,CAAC,MAAM,UAAU,uBAAuB,CAAC,MAAM,UAAU,iBAAiB;AAC5E,WAAO,KAAK;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,IACF,CAAC;AAAA,EACH;AAGA,MAAI,iBAAiB;AACnB,eAAW,OAAO,iBAAiB;AACjC,UAAI,CAAC,wBAAwB,IAAI,GAAG,GAAG;AACrC,cAAM,aAAa,iBAAiB,KAAK,uBAAuB;AAChE,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,gCAAgC,GAAG;AAAA,UAC5C;AAAA,UACA,YAAY,aAAa,iBAAiB,UAAU,OAAO;AAAA,QAC7D,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,QAAM,gBAAgB,iBAAiB,KAAK;AAC5C,QAAM,iBAAiB,IAAI,IAAI,cAAc,IAAI,CAAC,UAAU,MAAM,IAAI,CAAC;AACvE,QAAM,uBAAuB,IAAI,IAAI,cAAc,IAAI,CAAC,UAAU,CAAC,MAAM,MAAM,KAAK,CAAC,CAAC;AACtF,QAAM,WAAW,oBAAI,IAAY;AAEjC,MAAI,MAAM,UAAU,qBAAqB;AACvC,eAAW,KAAK,iBAAiB,MAAM,SAAS,mBAAmB,GAAG;AACpE,eAAS,IAAI,CAAC;AAAA,IAChB;AAAA,EACF;AACA,MAAI,MAAM,UAAU,iBAAiB;AACnC,eAAW,KAAK,iBAAiB,MAAM,SAAS,eAAe,GAAG;AAChE,eAAS,IAAI,CAAC;AAAA,IAChB;AAAA,EACF;AAEA,aAAW,KAAK,UAAU;AACxB,QAAI,CAAC,eAAe,IAAI,CAAC,GAAG;AAC1B,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,gBAAgB,CAAC;AAAA,QAC1B;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAGA,aAAW,KAAK,gBAAgB;AAC9B,UAAM,QAAQ,qBAAqB,IAAI,CAAC;AACxC,QAAI,CAAC,SAAS,IAAI,CAAC,KAAK,OAAO,aAAa,QAAQ,+BAA+B,SAAS,CAAC,CAAC,GAAG;AAC/F,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,aAAa,CAAC;AAAA,QACvB;AAAA,MACF,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MAAI,SAAS,OAAO,MAAM,CAAC,MAAM,SAAS,UAAU,MAAM,QAAQ,OAAO,WAAW,IAAI;AACtF,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,iBAAiB,SAAS,SAAS,IAAI,eAAe,WAAW;AAAA,MAC1E;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,MAAI,MAAM,aAAa,WAAW,YAAY,QAAQ,MAAM,YAAY,UAAU,iBAAiB,MAAM;AACvG,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,QAAM,sCAAsC;AAAA,IAC1C,MAAM,UAAU;AAAA,IAChB;AAAA,EACF;AACA,MAAI,oCAAoC,SAAS,GAAG;AAClD,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS,qDAAqD,iBAAiB,mCAAmC,CAAC;AAAA,MACnH;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAGA,aAAW,SAAS,eAAe;AACjC,UAAM,YAAY,MAAM,KAAK,YAAY;AACzC,UAAM,uBAAuB,+BAA+B,KAAK;AAEjE,QACE,wBACG,MAAM,aAAa,UACnB,4BAA4B,KAAK,CAAC,WAAW,UAAU,SAAS,MAAM,CAAC,GAC1E;AACA,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,kBAAkB,MAAM,IAAI;AAAA,QACrC;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAEA,QACE,wBACG,MAAM,aAAa,QACnB,MAAM,gBAAgB,UACtB,MAAM,eAAe,UACrB,MAAM,cAAc,UACpB,MAAM,mBAAmB,QAC5B;AACA,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,kBAAkB,MAAM,IAAI;AAAA,QACrC;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAEA,QAAI,wBAAwB,MAAM,SAAS,UAAa,MAAM,SAAS,SAAS,MAAM,aAAa,QAAW;AAC5G,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,kBAAkB,MAAM,IAAI;AAAA,QACrC;AAAA,MACF,CAAC;AAAA,IACH;AAEA,UAAM,SAGD,CAAC;AAEN,QAAI,MAAM,YAAa,QAAO,KAAK,EAAE,OAAO,MAAM,aAAa,MAAM,cAAc,CAAC;AACpF,QAAI,MAAM,WAAY,QAAO,KAAK,EAAE,OAAO,MAAM,YAAY,MAAM,aAAa,CAAC;AAEjF,eAAW,SAAS,QAAQ;AAC1B,UAAI;AACF,4BAAoB,MAAM,OAAO;AAAA,UAC/B,UAAU,MAAM;AAAA,UAChB,UAAU,MAAM;AAAA,UAChB,OAAO,MAAM;AAAA,QACf,CAAC;AAAA,MACH,SAAS,OAAO;AACd,cAAM,SAAS,iBAAiB,QAAQ,MAAM,QAAQ,QAAQ,eAAe,EAAE,IAAI,OAAO,KAAK;AAC/F,eAAO,KAAK;AAAA,UACV,MAAM;AAAA,UACN,SAAS;AAAA,UACT;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,MAAM,UAAU,UAAU,MAAM,UAAU;AAC5C,UAAM,WAAW,oBAAI,IAAY;AACjC,0BAAsB,MAAM,SAAS,QAAQ,QAAQ;AAErD,UAAM,oBAAoB,CAAC,qBAAqB,yBAAyB,aAAa;AACtF,UAAM,oBAAoB,CAAC,qBAAqB,eAAe,kBAAkB;AACjF,UAAM,mBAAmB,CAAC,MAAM,QAAQ,MAAM;AAE9C,UAAM,SAA6E;AAAA,MACjF,EAAE,UAAU,CAAC,UAAU,oBAAoB,cAAc,eAAe,GAAG,aAAa,mBAAmB,MAAM,SAAS;AAAA,MAC1H,EAAE,UAAU,CAAC,UAAU,QAAQ,GAAG,aAAa,mBAAmB,MAAM,SAAS;AAAA,MACjF,EAAE,UAAU,CAAC,WAAW,GAAG,aAAa,kBAAkB,MAAM,SAAS;AAAA,IAC3E;AAEA,eAAW,SAAS,QAAQ;AAC1B,UAAI,CAAC,MAAM,SAAS,SAAS,MAAM,QAAQ,EAAG;AAC9C,YAAM,OAAO,MAAM,YAAY,OAAO,CAAC,MAAM,SAAS,IAAI,CAAC,CAAC;AAC5D,UAAI,KAAK,SAAS,GAAG;AACnB,iBAAS,KAAK;AAAA,UACZ,MAAM,MAAM;AAAA,UACZ,SAAS,yEAAyE,MAAM,QAAQ,MAAM,KAAK,KAAK,IAAI,CAAC;AAAA,UACrH;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,MAAI,MAAM,UAAU;AAClB,QAAI;AACJ,QAAI;AAEJ,YAAQ,MAAM,UAAU;AAAA,MACtB,KAAK;AACH,wBAAgB,MAAM,OAAO;AAC7B,+BAAuB;AACvB;AAAA,MACF,KAAK;AACH,wBAAgB,MAAM,OAAO;AAC7B,+BAAuB;AACvB;AAAA,MACF,KAAK;AAAA,MACL,KAAK;AACH,wBAAgB,MAAM,OAAO,UAAU,MAAM,OAAO;AACpD,+BAAuB;AACvB;AAAA,MACF;AACE;AAAA,IACJ;AAEA,QAAI,wBAAwB,kBAAkB,QAAW;AACvD,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,aAAa,MAAM,QAAQ;AAAA,QACpC;AAAA,QACA,YAAY,wBAAwB,oBAAoB;AAAA,MAC1D,CAAC;AAAA,IACH;AAEA,QAAI,CAAC,MAAM,OAAO;AAChB,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,aAAa,MAAM,QAAQ;AAAA,QACpC;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AAEA,MACE,MAAM,OAAO,QAAQ,kBAClB,MAAM,MAAM,QAAQ,kBACpB,MAAM,MAAM,OAAO,mBAAmB,MAAM,MAAM,OAAO,gBAC5D;AACA,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,SAAS;AAAA,MACT;AAAA,MACA,YAAY;AAAA,IACd,CAAC;AAAA,EACH;AAEA,aAAW,CAAC,SAAS,SAAS,KAAK,OAAO,QAAQ,MAAM,gBAAgB,CAAC,CAAC,GAAG;AAC3E,QAAI,MAAM,UAAU,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU,QAAQ;AAC7D,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,gBAAgB,OAAO;AAAA,QAChC;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,CAAC,UAAU,SAAS,KAAK,OAAO,QAAQ,MAAM,SAAS,CAAC,CAAC,GAAG;AACrE,QAAI,MAAM,UAAU,CAAC,SAAS,SAAS,KAAK,CAAC,UAAU,QAAQ;AAC7D,eAAS,KAAK;AAAA,QACZ,MAAM;AAAA,QACN,SAAS,SAAS,QAAQ;AAAA,QAC1B;AAAA,QACA,YAAY;AAAA,MACd,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,QAAQ,MAAM,SAAS,CAAC,GAAG;AACpC,QAAI,SAAS,IAAI,GAAG;AAClB,UAAI,CAAC,KAAK,aAAa;AACrB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,gBAAgB,KAAK,IAAI;AAAA,UAClC;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AACA,UAAI,CAAC,KAAK,cAAc;AACtB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,SAAS,gBAAgB,KAAK,IAAI;AAAA,UAClC;AAAA,UACA,YAAY;AAAA,QACd,CAAC;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AAAA,IACL,OAAO,OAAO,WAAW;AAAA,IACzB;AAAA,IACA;AAAA,EACF;AACF;AAMA,eAAsB,0BACpB,OACA,UACA,iBACiC;AAEjC,QAAM,SAAS,cAAc,OAAO,iBAAiB,QAAQ;AAG7D,MAAI,MAAM,YAAY,MAAM,SAAS,SAAS,GAAG;AAC/C,QAAI;AACF,YAAM,gBAAgB,OAAO,QAAQ;AAAA,IACvC,SAAS,KAAK;AACZ,YAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;AAC/D,YAAM,aAAa,QAAQ,SAAS,kBAAkB;AACtD,aAAO,OAAO,KAAK;AAAA,QACjB,MAAM,aAAa,WAAW;AAAA,QAC9B,SAAS,aACL,8BAA8B,OAAO,KACrC,8BAA8B,OAAO;AAAA,QACzC;AAAA,MACF,CAAC;AACD,aAAO,QAAQ;AAAA,IACjB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,OAAe,YAA6C;AACpF,MAAI;AACJ,MAAI,WAAW;AAEf,aAAW,aAAa,YAAY;AAClC,UAAM,OAAO,YAAY,MAAM,YAAY,GAAG,UAAU,YAAY,CAAC;AACrE,QAAI,OAAO,YAAY,QAAQ,GAAG;AAChC,iBAAW;AACX,aAAO;AAAA,IACT;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,wCACP,oBACA,sBACU;AACV,MAAI,CAAC,oBAAoB;AACvB,WAAO,CAAC;AAAA,EACV;AAEA,QAAM,YAAY,oBAAI,IAAY;AAElC,aAAW,SAAS,mBAAmB,SAAS,oBAAoB,GAAG;AACrE,cAAU,IAAI,MAAM,CAAC,CAAC;AAAA,EACxB;AAEA,aAAW,YAAY,iBAAiB,kBAAkB,GAAG;AAC3D,UAAM,QAAQ,qBAAqB,IAAI,QAAQ;AAC/C,UAAM,YAAY,OAAO,aAAa;AACtC,QAAI,WAAW,YAAY,QAAQ,UAAU,iBAAiB,MAAM;AAClE,gBAAU,IAAI,QAAQ;AAAA,IACxB;AAAA,EACF;AAEA,SAAO,CAAC,GAAG,SAAS,EAAE,KAAK;AAC7B;AAEA,SAAS,iBAAiB,QAA0B;AAClD,SAAO,OAAO,IAAI,CAAC,UAAU,IAAI,KAAK,GAAG,EAAE,KAAK,IAAI;AACtD;AAEA,SAAS,SAAS,OAAkD;AAClE,SAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,KAAK;AAC5E;;;AHtSA,SAAS,qCACP,QACS;AACT,SAAO,WAAW,UACb,WAAW,UACX,WAAW,iBACX,WAAW;AAClB;AAEA,SAAS,yBACP,QACA,SACA,MACS;AACT,MAAI,WAAW,SAAS,WAAW,eAAe;AAChD,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,aAAa,WAAW,sBAAsB;AAC3D,WAAO;AAAA,EACT;AAEA,SAAO,QAAQ,QAAQ,UAAU,SAAS,eAAe;AAC3D;AAEA,SAAS,yBACP,OACA,SACQ;AACR,SAAO;AAAA,IACL;AAAA,IACA,qBAAqB,QAAQ,QAAQ;AAAA,IACrC,eAAe,MAAM,EAAE;AAAA,IACvB,IAAI,QAAQ,UAAU,YAAY,QAAQ,OAAO;AAAA,EACnD,EAAE,KAAK,GAAG;AACZ;AAIO,IAAM,eAAN,MAAmB;AAAA,EAChB;AAAA,EACA;AAAA,EAER,YAAY,QAA4B;AACtC,UAAM,iBAAiB,6BAA6B,MAAM;AAC1D,SAAK,SAAS;AAAA,MACZ,GAAG;AAAA,MACH,MAAM,eAAe,QAAQ;AAAA,MAC7B,OAAO,eAAe,SAAS;AAAA,IACjC;AACA,SAAK,cAAc,IAAI,YAAY;AAAA,EACrC;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,WAAW,YAA0C;AACzD,WAAO,gBAAgB,YAAY,KAAK,QAAQ,KAAK,WAAW;AAAA,EAClE;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,cACJ,YACA,UAA4F,CAAC,GAC/D;AAC9B,WAAO,mBAAmB,YAAY,KAAK,QAAQ,SAAS,KAAK,WAAW;AAAA,EAC9E;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,aAAa,SAAqD;AACtE,QAAI;AAEJ,QAAI,QAAQ,QAAQ;AAClB,iBAAW,0BAA0B,QAAQ,QAAQ;AAAA,QACnD,aAAa,QAAQ;AAAA,QACrB,MAAM,QAAQ;AAAA,QACd,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,IACH,WAAW,QAAQ,MAAM;AACvB,iBAAW,MAAM,KAAK,cAAc,QAAQ,MAAM;AAAA,QAChD,aAAa,QAAQ;AAAA,QACrB,MAAM,QAAQ;AAAA,QACd,SAAS,QAAQ;AAAA,MACnB,CAAC;AAAA,IACH,OAAO;AACL,YAAM,IAAI,MAAM,8DAA8D;AAAA,IAChF;AAEA,UAAM,UAAU,WAAW,QAAQ,QAAQ;AAC3C,UAAM,aAAa,QAAQ,SAAS,UAAU;AAAA,MAC5C,iBAAiB,QAAQ;AAAA,IAC3B,CAAC;AAED,QAAI,CAAC,WAAW,OAAO;AACrB,YAAM,IAAI;AAAA,QACR,mCAAmC,QAAQ,QAAQ;AAAA,IACnD,WAAW,OAAO,IAAI,CAAC,MAAM,OAAO,CAAC,EAAE,EAAE,KAAK,IAAI;AAAA,MACpD;AAAA,IACF;AAEA,UAAM,eAAe,yBAAyB,UAAU,QAAQ,WAAW;AAAA,MACzE,mBAAmB,QAAQ;AAAA,IAC7B,CAAC;AAED,QAAI,aAAa,cAAc;AAC7B,aAAO;AAAA,QACL;AAAA,QACA,eAAe,aAAa,aAAa;AAAA,QACzC,UAAU,WAAW;AAAA,MACvB;AAAA,IACF;AAEA,UAAM,sBAAsB,2BAA2B,UAAU,aAAa,SAAS,EAAE;AAAA,MAAI,CAAC,YAC5F,yBAAyB,UAAU,OAAO;AAAA,IAC5C;AAEA,UAAM,uBAAuB,KAAK,OAAO,UAAU;AAEnD,QAAI,oBAAoB,SAAS,KAAK,yBAAyB,sBAAsB,SAAS,KAAK,OAAO,IAAI,GAAG;AAC/G,iBAAW,WAAW,qBAAqB;AACzC,gBAAQ,KAAK,2BAA2B,OAAO,EAAE;AAAA,MACnD;AAAA,IACF;AAEA,UAAM,WAAW,MAAM,gCAAgC,UAAU;AAAA,MAC/D,WAAW,aAAa;AAAA,MACxB,SAAS,wBAAwB,UAAU;AAAA,QACzC,SAAS,QAAQ;AAAA,QACjB,qBAAqB,QAAQ;AAAA,MAC/B,CAAC;AAAA,MACD,qBAAqB,QAAQ;AAAA,MAC7B,cAAc,QAAQ;AAAA,MACtB,QAAQ,QAAQ;AAAA,MAChB,iBAAiB,QAAQ;AAAA,MACzB,iBAAiB,QAAQ;AAAA,IAC3B,CAAC;AACD,UAAM,UAAU,QAAQ,OAAO,SAAS,OAAO,SAAS,OAAO;AAC/D,UAAM,qBAAqB,SAAS,YAAY,SAAS,IACrD,2BAA2B,SAAS,WAAW,IAC/C;AAEJ,WAAO;AAAA,MACL;AAAA,MACA,SAAS,SAAS,YAAY,SAAS,KAAK,SAAS,SAAS,SAAS,IACnE;AAAA,QACA,GAAG;AAAA,QACH,GAAI,SAAS,YAAY,SAAS,IAAI,EAAE,aAAa,SAAS,aAAa,mBAAmB,IAAI,CAAC;AAAA,QACnG,GAAI,SAAS,SAAS,SAAS,IAAI,EAAE,UAAU,SAAS,SAAS,IAAI,CAAC;AAAA,MACxE,IACE;AAAA,MACJ,GAAI,SAAS,YAAY,SAAS,IAAI,EAAE,aAAa,SAAS,YAAY,IAAI,CAAC;AAAA,MAC/E,GAAI,qBAAqB,EAAE,mBAAmB,IAAI,CAAC;AAAA,MACnD,UAAU,qCAAqC,oBAAoB,IAC/D,CAAC,GAAG,WAAW,UAAU,GAAG,qBAAqB,GAAG,SAAS,QAAQ,IACrE,CAAC,GAAG,WAAW,UAAU,GAAG,SAAS,QAAQ;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,eAAe,YAAqD;AACxE,UAAM,aAAa,QAAQ,KAAK,OAAO,WAAW,aAAa,KAAK;AAEpE,QAAI;AACF,YAAM,QAAQ,MAAM,KAAK,WAAW,UAAU;AAC9C,aAAO,0BAA0B,OAAO,UAAU;AAAA,IACpD,SAAS,OAAO;AACd,YAAM,kBAAkB,wBAAwB,OAAO,UAAU;AACjE,UAAI,iBAAiB;AACnB,eAAO;AAAA,UACL,OAAO;AAAA,UACP,QAAQ,CAAC,eAAe;AAAA,UACxB,UAAU,CAAC;AAAA,QACb;AAAA,MACF;AAEA,YAAM;AAAA,IACR;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,aAAmB;AACjB,SAAK,YAAY,MAAM;AAAA,EACzB;AACF;AAIO,SAAS,mBAAmB,SAA6B,CAAC,GAAiB;AAChF,SAAO,IAAI,aAAa,MAAM;AAChC;AAEA,SAAS,wBAAwB,OAAgB,UAAwE;AACvH,MAAI,EAAE,iBAAiB,QAAQ;AAC7B,WAAO;AAAA,EACT;AAEA,QAAM,QAAQ,MAAM,QAAQ,MAAM,oBAAoB;AACtD,MAAI,CAAC,OAAO;AACV,WAAO;AAAA,EACT;AAEA,SAAO;AAAA,IACL,MAAM,MAAM,CAAC;AAAA,IACb,SAAS,MAAM,CAAC;AAAA,IAChB;AAAA,EACF;AACF;AAQA,eAAsB,aACpB,SAIuB;AACvB,QAAM,MAAM,mBAAmB;AAAA,IAC7B,WAAW,QAAQ,aAAa;AAAA,IAChC,OAAO;AAAA,IACP,UAAU,QAAQ;AAAA,EACpB,CAAC;AACD,SAAO,IAAI,aAAa,OAAO;AACjC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/providers/index.ts","../src/validation/levenshtein.ts","../src/validation/validate.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\n\nimport { parsePrompt, loadPromptFile } from './parser/index.js';\nimport { resolveIncludes } from './composition/index.js';\nimport { applyOverrides } from './overrides/index.js';\nimport { renderSections } from './renderer/index.js';\nimport { getAdapter } from './providers/index.js';\nimport { validateAsset, validateAssetWithIncludes } from './validation/index.js';\nimport { PromptCache } from './cache.js';\nimport { collectContextSizeWarnings, sanitizeContextVariables } from './context.js';\nimport { compactHistoryForPrompt } from './history.js';\nimport { applyPromptCompressionForRender, summarizePromptCompression } from './compression.js';\nimport {\n DEFAULT_PROMPTS_DIR,\n loadPromptAsset,\n resolveInlinePromptSource,\n resolvePromptAsset,\n withPromptResolutionDefaults,\n} from './prompt-resolution.js';\nimport type { PromptAsset, PromptAssetOverrides, ResolvedPromptAsset } from './schema/index.js';\nimport type { ProviderRequest, RuntimeRenderOptions } from './providers/types.js';\nimport type {\n PromptCompressionResult,\n PromptCompressionSummary,\n TheTokenCompanyRuntimeOptions,\n} from './compression.js';\nimport type { PromptValidationResult } from './validation/index.js';\n\n// --- Re-exports ---\nexport type { PromptAsset, ResolvedPromptAsset } from './schema/index.js';\nexport type {\n ProviderRequest,\n ProviderPromptRenderResult,\n RuntimeRenderOptions,\n RuntimeHistoryCompactionInfo,\n RuntimeHistoryCompactionResult,\n RuntimeHistoryMessage,\n OpenAIResponsesRuntimeOptions,\n LLMAsAServiceRuntimeOptions,\n ProviderAdapter,\n ProviderInlinePromptSource,\n ProviderPromptInput,\n ProviderPromptLookup,\n ValidationResult,\n} from './providers/types.js';\nexport type {\n PromptCompressionResult,\n PromptCompressionSummary,\n TheTokenCompanyRuntimeOptions,\n} from './compression.js';\nexport type { PromptValidationResult, ValidationError } from './validation/index.js';\nexport type { RenderedSections, RenderOptions } from './renderer/index.js';\nexport type { ParseResult } from './parser/index.js';\nexport type { OverrideOptions } from './overrides/index.js';\nexport type {\n UsageTapAllowed,\n UsageTapAllowedCapability,\n UsageTapBeginRequest,\n UsageTapBeginResponse,\n UsageTapCallOptions,\n UsageTapCallResult,\n UsageTapClient,\n UsageTapClientConfig,\n UsageTapEndRequest,\n UsageTapEndResponse,\n UsageTapEndUsage,\n UsageTapEntitlementMode,\n UsageTapEntitlementOptions,\n UsageTapErrorPayload,\n UsageTapInvokeContext,\n UsageTapInvokeResult,\n UsageTapProviderRunOptions,\n UsageTapProviderRunResult,\n UsageTapReasoningLevel,\n} from './usagetap/index.js';\n\nexport { parsePrompt, loadPromptFile, extractSections } from './parser/index.js';\nexport { interpolate, extractVariables } from './renderer/index.js';\nexport { resolveIncludes } from './composition/index.js';\nexport { applyOverrides } from './overrides/index.js';\nexport { validateAsset, validateAssetWithIncludes } from './validation/index.js';\nexport { getAdapter, openaiAdapter, openaiResponsesAdapter } from './providers/index.js';\nexport { anthropicAdapter } from './providers/anthropic.js';\nexport { geminiAdapter } from './providers/gemini.js';\nexport { openrouterAdapter } from './providers/openrouter.js';\nexport {\n LLMASASERVICE_BASE_URL,\n LLMASASERVICE_DEFAULT_MODEL,\n LLMASASERVICE_RESPONSE_HEADER_NAMES,\n createLLMAsAServiceOpenAIConfig,\n llmasaserviceAdapter,\n} from './providers/llmasaservice.js';\nexport { PromptAssetSchema, PromptAssetOverridesSchema } from './schema/index.js';\nexport {\n summarizePromptCompression,\n THETOKENCOMPANY_DEFAULT_BASE_URL,\n THETOKENCOMPANY_DEFAULT_MODEL,\n} from './compression.js';\nexport {\n applyUsageTapEntitlements,\n beginUsageTapCall,\n createUsageTapClient,\n defaultUsageTapErrorMapper,\n endUsageTapCall,\n extractAnthropicUsage,\n extractGeminiUsage,\n extractOpenAIUsage,\n runAnthropicWithUsageTap,\n runGeminiWithUsageTap,\n runLLMAsAServiceWithUsageTap,\n runOpenAIWithUsageTap,\n runOpenRouterWithUsageTap,\n withUsageTapCall,\n} from './usagetap/index.js';\n\n// --- Config ---\n\nexport interface PromptOpsKitConfig {\n sourceDir?: string;\n compiledDir?: string;\n mode?: 'auto' | 'compiled-only' | 'source-only';\n cache?: boolean;\n warnings?: {\n contextSize?: 'auto' | 'off' | 'result-only' | 'console' | 'console-and-result';\n };\n}\n\n// --- Render options ---\n\nexport interface RenderPromptOptions {\n /** Prompt path (no extension), e.g. 'support/reply' */\n path?: string;\n /** Inline prompt source string (alternative to path) */\n source?: string;\n /** Provider name */\n provider: string;\n /** Environment override */\n environment?: string;\n /** Tier override */\n tier?: string;\n /** Runtime overrides applied after environment and tier */\n runtime?: Partial<PromptAssetOverrides>;\n /** Variables for interpolation */\n variables?: Record<string, string>;\n /** Optional callback to transform oversized context values before warnings/rendering */\n onContextOverflow?: RuntimeRenderOptions['onContextOverflow'];\n /** Conversation history */\n history?: RuntimeRenderOptions['history'];\n /** Optional callback to compact history overflow when context.history.max_items is exceeded */\n onHistoryCompaction?: RuntimeRenderOptions['onHistoryCompaction'];\n /** Tool registry for resolving tool references */\n toolRegistry?: Record<string, unknown>;\n /** Strict mode — fail on missing variables */\n strict?: boolean;\n /** OpenAI Responses API-specific request options */\n openaiResponses?: RuntimeRenderOptions['openaiResponses'];\n /** LLMAsAService gateway credentials */\n llmasaservice?: RuntimeRenderOptions['llmasaservice'];\n /** TheTokenCompany compression credentials and transport options */\n theTokenCompany?: RuntimeRenderOptions['theTokenCompany'];\n}\n\n// --- Result ---\n\nexport interface RenderResult {\n resolved: ResolvedPromptAsset;\n request?: ProviderRequest;\n returnMessage?: string;\n compression?: PromptCompressionResult[];\n compressionSummary?: PromptCompressionSummary;\n warnings: string[];\n}\n\nfunction shouldIncludeContextWarningsInResult(\n policy: NonNullable<PromptOpsKitConfig['warnings']>['contextSize'] | undefined,\n): boolean {\n return policy === undefined\n || policy === 'auto'\n || policy === 'result-only'\n || policy === 'console-and-result';\n}\n\nfunction shouldLogContextWarnings(\n policy: NonNullable<PromptOpsKitConfig['warnings']>['contextSize'] | undefined,\n options: Pick<RenderPromptOptions, 'source'>,\n mode: PromptOpsKitConfig['mode'],\n): boolean {\n if (policy === 'off' || policy === 'result-only') {\n return false;\n }\n\n if (policy === 'console' || policy === 'console-and-result') {\n return true;\n }\n\n return Boolean(options.source || mode !== 'compiled-only');\n}\n\nfunction formatContextSizeWarning(\n asset: ResolvedPromptAsset,\n warning: { variable: string; maxSize: number; actualSize: number },\n): string {\n return [\n 'POK030:',\n `Context variable \"${warning.variable}\" exceeded max_size`,\n `for prompt \"${asset.id}\"`,\n `(${warning.actualSize} bytes > ${warning.maxSize} bytes).`,\n ].join(' ');\n}\n\n// --- Main class ---\n\nexport class PromptOpsKit {\n private config: Required<Pick<PromptOpsKitConfig, 'sourceDir' | 'mode'>> & PromptOpsKitConfig;\n private promptCache: PromptCache<PromptAsset>;\n\n constructor(config: PromptOpsKitConfig) {\n const resolvedConfig = withPromptResolutionDefaults(config);\n this.config = {\n ...resolvedConfig,\n mode: resolvedConfig.mode ?? 'auto',\n cache: resolvedConfig.cache ?? true,\n };\n this.promptCache = new PromptCache();\n }\n\n /**\n * Load a prompt asset from compiled or source, based on mode.\n */\n async loadPrompt(promptPath: string): Promise<PromptAsset> {\n return loadPromptAsset(promptPath, this.config, this.promptCache);\n }\n\n /**\n * Resolve a prompt: load, resolve includes, apply overrides.\n */\n async resolvePrompt(\n promptPath: string,\n options: { environment?: string; tier?: string; runtime?: Partial<PromptAssetOverrides> } = {},\n ): Promise<ResolvedPromptAsset> {\n return resolvePromptAsset(promptPath, this.config, options, this.promptCache);\n }\n\n /**\n * Render a prompt for a specific provider.\n */\n async renderPrompt(options: RenderPromptOptions): Promise<RenderResult> {\n let resolved: ResolvedPromptAsset;\n\n if (options.source) {\n resolved = resolveInlinePromptSource(options.source, {\n environment: options.environment,\n tier: options.tier,\n runtime: options.runtime,\n });\n } else if (options.path) {\n resolved = await this.resolvePrompt(options.path, {\n environment: options.environment,\n tier: options.tier,\n runtime: options.runtime,\n });\n } else {\n throw new Error('Either \"path\" or \"source\" must be provided to renderPrompt()');\n }\n\n const adapter = getAdapter(options.provider);\n const validation = adapter.validate(resolved, {\n openaiResponses: options.openaiResponses,\n llmasaservice: options.llmasaservice,\n });\n\n if (!validation.valid) {\n throw new Error(\n `Provider validation failed for \"${options.provider}\":\\n` +\n validation.errors.map((e) => ` - ${e}`).join('\\n'),\n );\n }\n\n const sanitization = sanitizeContextVariables(resolved, options.variables, {\n onContextOverflow: options.onContextOverflow,\n });\n\n if (sanitization.shortCircuit) {\n return {\n resolved,\n returnMessage: sanitization.shortCircuit.returnMessage,\n warnings: validation.warnings,\n };\n }\n\n const contextSizeWarnings = collectContextSizeWarnings(resolved, sanitization.variables).map((warning) =>\n formatContextSizeWarning(resolved, warning),\n );\n\n const contextWarningPolicy = this.config.warnings?.contextSize;\n\n if (contextSizeWarnings.length > 0 && shouldLogContextWarnings(contextWarningPolicy, options, this.config.mode)) {\n for (const warning of contextSizeWarnings) {\n console.warn(`[promptopskit] Warning: ${warning}`);\n }\n }\n\n const prepared = await applyPromptCompressionForRender(resolved, {\n variables: sanitization.variables,\n history: compactHistoryForPrompt(resolved, {\n history: options.history,\n onHistoryCompaction: options.onHistoryCompaction,\n }),\n onHistoryCompaction: options.onHistoryCompaction,\n toolRegistry: options.toolRegistry,\n strict: options.strict,\n openaiResponses: options.openaiResponses,\n llmasaservice: options.llmasaservice,\n theTokenCompany: options.theTokenCompany,\n });\n const request = adapter.render(prepared.asset, prepared.runtime);\n const compressionSummary = prepared.compression.length > 0\n ? summarizePromptCompression(prepared.compression)\n : undefined;\n\n return {\n resolved,\n request: prepared.compression.length > 0 || prepared.warnings.length > 0\n ? {\n ...request,\n ...(prepared.compression.length > 0 ? { compression: prepared.compression, compressionSummary } : {}),\n ...(prepared.warnings.length > 0 ? { warnings: prepared.warnings } : {}),\n }\n : request,\n ...(prepared.compression.length > 0 ? { compression: prepared.compression } : {}),\n ...(compressionSummary ? { compressionSummary } : {}),\n warnings: shouldIncludeContextWarningsInResult(contextWarningPolicy)\n ? [...validation.warnings, ...contextSizeWarnings, ...prepared.warnings]\n : [...validation.warnings, ...prepared.warnings],\n };\n }\n\n /**\n * Validate a prompt file.\n */\n async validatePrompt(promptPath: string): Promise<PromptValidationResult> {\n const sourceFile = resolve(this.config.sourceDir, promptPath + '.md');\n\n try {\n const asset = await this.loadPrompt(promptPath);\n return validateAssetWithIncludes(asset, sourceFile);\n } catch (error) {\n const validationError = toPromptValidationError(error, sourceFile);\n if (validationError) {\n return {\n valid: false,\n errors: [validationError],\n warnings: [],\n };\n }\n\n throw error;\n }\n }\n\n /**\n * Clear the internal cache.\n */\n clearCache(): void {\n this.promptCache.clear();\n }\n}\n\n// --- Factory ---\n\nexport function createPromptOpsKit(config: PromptOpsKitConfig = {}): PromptOpsKit {\n return new PromptOpsKit(config);\n}\n\nfunction toPromptValidationError(error: unknown, filePath: string): PromptValidationResult['errors'][number] | undefined {\n if (!(error instanceof Error)) {\n return undefined;\n }\n\n const match = error.message.match(/^(POK\\d+):\\s*(.*)$/);\n if (!match) {\n return undefined;\n }\n\n return {\n code: match[1],\n message: match[2],\n filePath,\n };\n}\n\n// --- Standalone convenience ---\n\n/**\n * Standalone renderPrompt for quick usage without creating a PromptOpsKit instance.\n * Requires either `source` (inline) or `path` + implicit sourceDir of ./prompts.\n */\nexport async function renderPrompt(\n options: RenderPromptOptions & {\n sourceDir?: string;\n warnings?: PromptOpsKitConfig['warnings'];\n },\n): Promise<RenderResult> {\n const kit = createPromptOpsKit({\n sourceDir: options.sourceDir ?? DEFAULT_PROMPTS_DIR,\n cache: false,\n warnings: options.warnings,\n });\n return kit.renderPrompt(options);\n}\n","export type {\n ProviderAdapter,\n ProviderInlinePromptSource,\n ProviderPromptInput,\n ProviderPromptLookup,\n ProviderRequest,\n ValidationResult,\n RuntimeRenderOptions,\n LLMAsAServiceRuntimeOptions,\n} from './types.js';\nexport { openaiAdapter } from './openai.js';\nexport { openaiResponsesAdapter } from './openai-responses.js';\nexport { anthropicAdapter } from './anthropic.js';\nexport { geminiAdapter } from './gemini.js';\nexport { openrouterAdapter } from './openrouter.js';\nexport {\n LLMASASERVICE_BASE_URL,\n LLMASASERVICE_DEFAULT_MODEL,\n LLMASASERVICE_RESPONSE_HEADER_NAMES,\n createLLMAsAServiceOpenAIConfig,\n llmasaserviceAdapter,\n} from './llmasaservice.js';\n\nimport type { ProviderAdapter } from './types.js';\nimport { openaiAdapter } from './openai.js';\nimport { openaiResponsesAdapter } from './openai-responses.js';\nimport { anthropicAdapter } from './anthropic.js';\nimport { geminiAdapter } from './gemini.js';\nimport { openrouterAdapter } from './openrouter.js';\nimport { llmasaserviceAdapter } from './llmasaservice.js';\n\nconst adapters: Record<string, ProviderAdapter> = {\n openai: openaiAdapter,\n 'openai-responses': openaiResponsesAdapter,\n anthropic: anthropicAdapter,\n google: geminiAdapter,\n gemini: geminiAdapter,\n openrouter: openrouterAdapter,\n llmasaservice: llmasaserviceAdapter,\n};\n\n/**\n * Get a provider adapter by name.\n */\nexport function getAdapter(provider: string): ProviderAdapter {\n const adapter = adapters[provider];\n if (!adapter) {\n throw new Error(\n `Unknown provider: \"${provider}\". Supported: ${Object.keys(adapters).join(', ')}`,\n );\n }\n return adapter;\n}\n","/**\n * Compute the Levenshtein distance between two strings.\n * Used for \"did you mean?\" suggestions on unknown fields.\n */\nexport function levenshtein(a: string, b: string): number {\n const m = a.length;\n const n = b.length;\n\n if (m === 0) return n;\n if (n === 0) return m;\n\n const dp: number[][] = Array.from({ length: m + 1 }, () => Array(n + 1).fill(0) as number[]);\n\n for (let i = 0; i <= m; i++) dp[i][0] = i;\n for (let j = 0; j <= n; j++) dp[0][j] = j;\n\n for (let i = 1; i <= m; i++) {\n for (let j = 1; j <= n; j++) {\n const cost = a[i - 1] === b[j - 1] ? 0 : 1;\n dp[i][j] = Math.min(\n dp[i - 1][j] + 1,\n dp[i][j - 1] + 1,\n dp[i - 1][j - 1] + cost,\n );\n }\n }\n\n return dp[m][n];\n}\n","import { PromptAssetSchema } from '../schema/index.js';\nimport type { PromptAsset } from '../schema/index.js';\nimport { extractVariables } from '../renderer/index.js';\nimport { resolveIncludes } from '../composition/index.js';\nimport {\n areContextInputWarningsEnabled,\n compileContextRegex,\n getContextInputs,\n} from '../context.js';\nimport { levenshtein } from './levenshtein.js';\n\nexport interface ValidationError {\n code: string;\n message: string;\n filePath?: string;\n suggestion?: string;\n}\n\nexport interface PromptValidationResult {\n valid: boolean;\n errors: ValidationError[];\n warnings: ValidationError[];\n}\n\nconst KNOWN_FRONT_MATTER_KEYS = new Set([\n 'id', 'schema_version', 'description', 'provider', 'model', 'fallback_models',\n 'reasoning', 'sampling', 'response', 'tools', 'mcp', 'context', 'includes',\n 'environments', 'tiers', 'metadata', 'cache', 'compression', 'provider_options', 'raw',\n]);\n\n\n\nfunction collectSchemaKeywords(value: unknown, acc: Set<string>): void {\n if (!value || typeof value !== 'object') return;\n if (Array.isArray(value)) {\n for (const item of value) collectSchemaKeywords(item, acc);\n return;\n }\n\n const record = value as Record<string, unknown>;\n for (const [key, child] of Object.entries(record)) {\n acc.add(key);\n collectSchemaKeywords(child, acc);\n }\n}\n\nconst RISKY_UNBOUNDED_INPUT_NAMES = [\n 'message',\n 'prompt',\n 'history',\n 'transcript',\n 'document',\n 'content',\n 'input',\n 'body',\n 'context',\n];\n\nconst COMPRESS_MODIFIER_RE = /\\{\\{\\s*([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\|\\s*compress\\s*\\}\\}/g;\n\n/**\n * Validate a parsed prompt asset, returning all errors and warnings.\n */\nexport function validateAsset(\n asset: PromptAsset,\n frontMatterKeys?: string[],\n filePath?: string,\n): PromptValidationResult {\n const errors: ValidationError[] = [];\n const warnings: ValidationError[] = [];\n\n // Schema validation\n const result = PromptAssetSchema.safeParse(asset);\n if (!result.success) {\n for (const issue of result.error.issues) {\n errors.push({\n code: 'POK001',\n message: `Schema error at ${issue.path.join('.')}: ${issue.message}`,\n filePath,\n });\n }\n }\n\n // Missing id\n if (!asset.id) {\n errors.push({\n code: 'POK002',\n message: 'Missing required field: \"id\"',\n filePath,\n });\n }\n\n // Missing body sections\n if (!asset.sections?.system_instructions && !asset.sections?.prompt_template) {\n errors.push({\n code: 'POK003',\n message: 'Prompt must have at least one body section (System instructions or Prompt template)',\n filePath,\n });\n }\n\n // Unknown front matter keys with \"did you mean?\"\n if (frontMatterKeys) {\n for (const key of frontMatterKeys) {\n if (!KNOWN_FRONT_MATTER_KEYS.has(key)) {\n const suggestion = findClosestMatch(key, KNOWN_FRONT_MATTER_KEYS);\n warnings.push({\n code: 'POK010',\n message: `Unknown front matter field: \"${key}\"`,\n filePath,\n suggestion: suggestion ? `Did you mean \"${suggestion}\"?` : undefined,\n });\n }\n }\n }\n\n // Variable validation: used but not declared\n const contextInputs = getContextInputs(asset);\n const declaredInputs = new Set(contextInputs.map((input) => input.name));\n const declaredInputsByName = new Map(contextInputs.map((input) => [input.name, input]));\n const usedVars = new Set<string>();\n\n if (asset.sections?.system_instructions) {\n for (const v of extractVariables(asset.sections.system_instructions)) {\n usedVars.add(v);\n }\n }\n if (asset.sections?.prompt_template) {\n for (const v of extractVariables(asset.sections.prompt_template)) {\n usedVars.add(v);\n }\n }\n\n for (const v of usedVars) {\n if (!declaredInputs.has(v)) {\n warnings.push({\n code: 'POK011',\n message: `Variable \"{{ ${v} }}\" is used but not declared in context.inputs`,\n filePath,\n });\n }\n }\n\n // Declared but unused\n for (const v of declaredInputs) {\n const input = declaredInputsByName.get(v);\n if (!usedVars.has(v) && input?.optional !== true && areContextInputWarningsEnabled(input ?? {})) {\n warnings.push({\n code: 'POK012',\n message: `Variable \"${v}\" is declared in context.inputs but never used`,\n filePath,\n });\n }\n }\n\n if (usedVars.size > 0 && (!asset.context?.inputs || asset.context.inputs.length === 0)) {\n warnings.push({\n code: 'POK046',\n message: `Template uses ${usedVars.size === 1 ? 'a variable' : 'variables'} but context.inputs is not declared.`,\n filePath,\n suggestion: 'Declare context.inputs to enable input policy validation.',\n });\n }\n\n if (asset.compression?.heuristic?.enabled === true && asset.compression.heuristic.json_to_toon !== true) {\n warnings.push({\n code: 'POK055',\n message: 'Prompt-level heuristic compression is enabled for the full prompt template.',\n filePath,\n suggestion: 'Prefer per-placeholder compression for bulky context values so instructions, output constraints, and safety conditions are not sentence-selected away.',\n });\n }\n\n const systemHeuristicCompressionVariables = findSystemHeuristicCompressionVariables(\n asset.sections?.system_instructions,\n declaredInputsByName,\n );\n if (systemHeuristicCompressionVariables.length > 0) {\n warnings.push({\n code: 'POK056',\n message: `System instructions use heuristic compression for ${formatQuotedList(systemHeuristicCompressionVariables)}.`,\n filePath,\n suggestion: 'Avoid compressing values inside system instructions; move lossy compression to prompt-template context placeholders when possible.',\n });\n }\n\n // Context regex definitions compile successfully\n for (const input of contextInputs) {\n const lowerName = input.name.toLowerCase();\n const inputWarningsEnabled = areContextInputWarningsEnabled(input);\n\n if (\n inputWarningsEnabled\n && input.max_size === undefined\n && RISKY_UNBOUNDED_INPUT_NAMES.some((needle) => lowerName.includes(needle))\n ) {\n warnings.push({\n code: 'POK040',\n message: `Context input \"${input.name}\" has no max_size and appears unbounded.`,\n filePath,\n suggestion: 'Add max_size to constrain prompt payload growth.',\n });\n }\n\n if (\n inputWarningsEnabled\n && input.optional !== true\n && input.allow_regex === undefined\n && input.deny_regex === undefined\n && input.non_empty === undefined\n && input.reject_secrets === undefined\n ) {\n warnings.push({\n code: 'POK041',\n message: `Context input \"${input.name}\" has no input hardening validators.`,\n filePath,\n suggestion: 'Consider non_empty/reject_secrets and allow/deny regex validators.',\n });\n }\n\n if (inputWarningsEnabled && input.trim !== undefined && input.trim !== false && input.max_size === undefined) {\n warnings.push({\n code: 'POK014',\n message: `Context input \"${input.name}\" sets trim but has no max_size; trim-to-budget will be skipped.`,\n filePath,\n });\n }\n\n const checks: Array<{\n regex: NonNullable<typeof input.allow_regex>;\n kind: 'allow_regex' | 'deny_regex';\n }> = [];\n\n if (input.allow_regex) checks.push({ regex: input.allow_regex, kind: 'allow_regex' });\n if (input.deny_regex) checks.push({ regex: input.deny_regex, kind: 'deny_regex' });\n\n for (const check of checks) {\n try {\n compileContextRegex(check.regex, {\n promptId: asset.id,\n variable: input.name,\n field: check.kind,\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message.replace(/^POK013:\\s*/, '') : String(error);\n errors.push({\n code: 'POK013',\n message: reason,\n filePath,\n });\n }\n }\n }\n\n\n if (asset.response?.schema && asset.provider) {\n const keywords = new Set<string>();\n collectSchemaKeywords(asset.response.schema, keywords);\n\n const openAIUnsupported = ['patternProperties', 'unevaluatedProperties', '$dynamicRef'];\n const geminiUnsupported = ['patternProperties', '$dynamicRef', 'dependentSchemas'];\n const anthropicCaution = ['if', 'then', 'else'];\n\n const checks: Array<{ provider: string[]; unsupported: string[]; code: string }> = [\n { provider: ['openai', 'openai-responses', 'openrouter', 'llmasaservice'], unsupported: openAIUnsupported, code: 'POK052' },\n { provider: ['gemini', 'google'], unsupported: geminiUnsupported, code: 'POK053' },\n { provider: ['anthropic'], unsupported: anthropicCaution, code: 'POK054' },\n ];\n\n for (const check of checks) {\n if (!check.provider.includes(asset.provider)) continue;\n const hits = check.unsupported.filter((k) => keywords.has(k));\n if (hits.length > 0) {\n warnings.push({\n code: check.code,\n message: `response.schema includes provider-sensitive JSON Schema keywords for \"${asset.provider}\": ${hits.join(', ')}`,\n filePath,\n suggestion: 'Validate schema compatibility with your provider docs or simplify the schema dialect.',\n });\n }\n }\n }\n\n if (asset.provider) {\n let providerCache: unknown;\n let cacheSuggestionField: string | undefined;\n\n switch (asset.provider) {\n case 'openai':\n providerCache = asset.cache?.openai;\n cacheSuggestionField = 'cache.openai';\n break;\n case 'anthropic':\n providerCache = asset.cache?.anthropic;\n cacheSuggestionField = 'cache.anthropic';\n break;\n case 'gemini':\n case 'google':\n providerCache = asset.cache?.gemini ?? asset.cache?.google;\n cacheSuggestionField = 'cache.gemini';\n break;\n default:\n break;\n }\n\n if (cacheSuggestionField && providerCache === undefined) {\n warnings.push({\n code: 'POK042',\n message: `Provider \"${asset.provider}\" has no provider-specific cache settings.`,\n filePath,\n suggestion: `Consider configuring ${cacheSuggestionField} for better cache-hit behavior.`,\n });\n }\n\n if (!asset.model) {\n warnings.push({\n code: 'POK044',\n message: `Provider \"${asset.provider}\" is configured without a model.`,\n filePath,\n suggestion: 'Set model in prompt or defaults to avoid adapter-time errors.',\n });\n }\n }\n\n if (\n asset.cache?.gemini?.cached_content\n && asset.cache.google?.cached_content\n && asset.cache.gemini.cached_content !== asset.cache.google.cached_content\n ) {\n warnings.push({\n code: 'POK043',\n message: 'cache.gemini.cached_content and cache.google.cached_content are both set to different values.',\n filePath,\n suggestion: 'Use one canonical value; Gemini prefers cache.gemini.cached_content.',\n });\n }\n\n for (const [envName, overrides] of Object.entries(asset.environments ?? {})) {\n if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {\n warnings.push({\n code: 'POK045',\n message: `Environment \"${envName}\" does not override cache while prompt-level cache is defined.`,\n filePath,\n suggestion: 'Confirm cache strategy is intentionally shared across environments.',\n });\n }\n }\n\n for (const [tierName, overrides] of Object.entries(asset.tiers ?? {})) {\n if (asset.cache && (!isRecord(overrides) || !overrides.cache)) {\n warnings.push({\n code: 'POK045',\n message: `Tier \"${tierName}\" does not override cache while prompt-level cache is defined.`,\n filePath,\n suggestion: 'Confirm cache strategy is intentionally shared across tiers.',\n });\n }\n }\n\n for (const tool of asset.tools ?? []) {\n if (isRecord(tool)) {\n if (!tool.description) {\n warnings.push({\n code: 'POK047',\n message: `Inline tool \"${tool.name}\" is missing a description.`,\n filePath,\n suggestion: 'Add description to improve model tool-selection quality.',\n });\n }\n if (!tool.input_schema) {\n warnings.push({\n code: 'POK047',\n message: `Inline tool \"${tool.name}\" is missing input_schema.`,\n filePath,\n suggestion: 'Add input_schema so tool inputs are strongly typed.',\n });\n }\n }\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n}\n\n/**\n * Validate a prompt asset including its include graph.\n * Catches missing include files, circular includes, and parse errors in included files.\n */\nexport async function validateAssetWithIncludes(\n asset: PromptAsset,\n filePath: string,\n frontMatterKeys?: string[],\n): Promise<PromptValidationResult> {\n // Run standard validation first\n const result = validateAsset(asset, frontMatterKeys, filePath);\n\n // Validate includes\n if (asset.includes && asset.includes.length > 0) {\n try {\n await resolveIncludes(asset, filePath);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const isCircular = message.includes('Circular include');\n result.errors.push({\n code: isCircular ? 'POK021' : 'POK020',\n message: isCircular\n ? `Circular include detected: ${message}`\n : `Include resolution failed: ${message}`,\n filePath,\n });\n result.valid = false;\n }\n }\n\n return result;\n}\n\nfunction findClosestMatch(input: string, candidates: Set<string>): string | undefined {\n let best: string | undefined;\n let bestDist = Infinity;\n\n for (const candidate of candidates) {\n const dist = levenshtein(input.toLowerCase(), candidate.toLowerCase());\n if (dist < bestDist && dist <= 3) {\n bestDist = dist;\n best = candidate;\n }\n }\n\n return best;\n}\n\nfunction findSystemHeuristicCompressionVariables(\n systemInstructions: string | undefined,\n declaredInputsByName: Map<string, ReturnType<typeof getContextInputs>[number]>,\n): string[] {\n if (!systemInstructions) {\n return [];\n }\n\n const variables = new Set<string>();\n\n for (const match of systemInstructions.matchAll(COMPRESS_MODIFIER_RE)) {\n variables.add(match[1]);\n }\n\n for (const variable of extractVariables(systemInstructions)) {\n const input = declaredInputsByName.get(variable);\n const heuristic = input?.compression?.heuristic;\n if (heuristic?.enabled === true && heuristic.json_to_toon !== true) {\n variables.add(variable);\n }\n }\n\n return [...variables].sort();\n}\n\nfunction formatQuotedList(values: string[]): string {\n return values.map((value) => `\"${value}\"`).join(', ');\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n"],"mappings":"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","names":[]}
|
|
@@ -1401,6 +1401,7 @@ var LLMAsAServiceCustomerSchema = import_zod.z.object({
|
|
|
1401
1401
|
});
|
|
1402
1402
|
var LLMAsAServiceProviderOptionsSchema = import_zod.z.object({
|
|
1403
1403
|
base_url: import_zod.z.string().url().optional(),
|
|
1404
|
+
// Deprecated compatibility fields; the gateway no longer requires project routing.
|
|
1404
1405
|
project_id: import_zod.z.string().optional(),
|
|
1405
1406
|
customer: LLMAsAServiceCustomerSchema.optional(),
|
|
1406
1407
|
conversationId: import_zod.z.string().optional(),
|
|
@@ -2457,6 +2458,7 @@ async function applyPromptCompressionForRender(asset, runtime) {
|
|
|
2457
2458
|
aggressiveness: theTokenCompanyConfig?.aggressiveness
|
|
2458
2459
|
});
|
|
2459
2460
|
promptTemplate = result.output;
|
|
2461
|
+
warnings.push(...result.warnings ?? []);
|
|
2460
2462
|
compression.push({
|
|
2461
2463
|
provider: "thetokencompany",
|
|
2462
2464
|
model,
|
|
@@ -2522,41 +2524,80 @@ function reportHeuristicCompressionWarnings2(warnings, compressionWarnings, scop
|
|
|
2522
2524
|
async function compressWithTheTokenCompany(input, options) {
|
|
2523
2525
|
const apiKey = options.apiKey ?? getEnv("THETOKENCOMPANY_API_KEY") ?? getEnv("TTC_API_KEY");
|
|
2524
2526
|
if (!apiKey) {
|
|
2525
|
-
|
|
2526
|
-
|
|
2527
|
+
return createTheTokenCompanyFallback(
|
|
2528
|
+
input,
|
|
2529
|
+
"no API key was provided"
|
|
2527
2530
|
);
|
|
2528
2531
|
}
|
|
2529
2532
|
const fetchImpl = options.fetch ?? globalThis.fetch;
|
|
2530
2533
|
if (!fetchImpl) {
|
|
2531
|
-
|
|
2534
|
+
return createTheTokenCompanyFallback(
|
|
2535
|
+
input,
|
|
2536
|
+
"fetch is unavailable in this runtime"
|
|
2537
|
+
);
|
|
2532
2538
|
}
|
|
2533
2539
|
const baseURL = (options.baseURL ?? THETOKENCOMPANY_DEFAULT_BASE_URL).replace(/\/+$/, "");
|
|
2534
2540
|
const compressionSettings = options.aggressiveness === void 0 ? void 0 : { aggressiveness: options.aggressiveness };
|
|
2535
|
-
|
|
2536
|
-
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2541
|
+
let response;
|
|
2542
|
+
try {
|
|
2543
|
+
response = await fetchImpl(`${baseURL}/v1/compress`, {
|
|
2544
|
+
method: "POST",
|
|
2545
|
+
headers: {
|
|
2546
|
+
Authorization: `Bearer ${apiKey}`,
|
|
2547
|
+
"Content-Type": "application/json"
|
|
2548
|
+
},
|
|
2549
|
+
body: JSON.stringify({
|
|
2550
|
+
model: options.model,
|
|
2551
|
+
input,
|
|
2552
|
+
...compressionSettings ? { compression_settings: compressionSettings } : {}
|
|
2553
|
+
})
|
|
2554
|
+
});
|
|
2555
|
+
} catch (error) {
|
|
2556
|
+
return createTheTokenCompanyFallback(
|
|
2543
2557
|
input,
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
}
|
|
2558
|
+
`request failed: ${toErrorMessage(error)}`
|
|
2559
|
+
);
|
|
2560
|
+
}
|
|
2547
2561
|
if (!response.ok) {
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
`
|
|
2562
|
+
return createTheTokenCompanyFallback(
|
|
2563
|
+
input,
|
|
2564
|
+
`service returned HTTP ${response.status}`
|
|
2565
|
+
);
|
|
2566
|
+
}
|
|
2567
|
+
let data;
|
|
2568
|
+
try {
|
|
2569
|
+
data = await response.json();
|
|
2570
|
+
} catch (error) {
|
|
2571
|
+
return createTheTokenCompanyFallback(
|
|
2572
|
+
input,
|
|
2573
|
+
`response body was not valid JSON: ${toErrorMessage(error)}`
|
|
2551
2574
|
);
|
|
2552
2575
|
}
|
|
2553
|
-
const data = await response.json();
|
|
2554
2576
|
const normalized = normalizeTheTokenCompanyCompressResponse(data);
|
|
2555
2577
|
if (!normalized) {
|
|
2556
|
-
|
|
2578
|
+
return createTheTokenCompanyFallback(
|
|
2579
|
+
input,
|
|
2580
|
+
"response payload was invalid"
|
|
2581
|
+
);
|
|
2557
2582
|
}
|
|
2558
2583
|
return normalized;
|
|
2559
2584
|
}
|
|
2585
|
+
function createTheTokenCompanyFallback(input, reason) {
|
|
2586
|
+
const tokens = estimateHeuristicTokens(input);
|
|
2587
|
+
return {
|
|
2588
|
+
output: input,
|
|
2589
|
+
output_tokens: tokens,
|
|
2590
|
+
input_tokens: tokens,
|
|
2591
|
+
tokens_saved: 0,
|
|
2592
|
+
compression_ratio: tokens === 0 ? 0 : 1,
|
|
2593
|
+
warnings: [
|
|
2594
|
+
`POK057: TheTokenCompany compression skipped; using uncompressed prompt with zero token savings (${reason}).`
|
|
2595
|
+
]
|
|
2596
|
+
};
|
|
2597
|
+
}
|
|
2598
|
+
function toErrorMessage(error) {
|
|
2599
|
+
return error instanceof Error && error.message ? error.message : "unknown error";
|
|
2600
|
+
}
|
|
2560
2601
|
function normalizeTheTokenCompanyCompressResponse(data) {
|
|
2561
2602
|
if (typeof data.output !== "string" || typeof data.output_tokens !== "number") {
|
|
2562
2603
|
return void 0;
|