promptopskit 0.3.7 → 0.3.8
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 +31 -8
- package/SKILL.md +26 -3
- package/dist/{chunk-IXPIBZXT.js → chunk-5OYWNRNC.js} +11 -4
- package/dist/{chunk-IXPIBZXT.js.map → chunk-5OYWNRNC.js.map} +1 -1
- package/dist/{chunk-KFSP5KN4.js → chunk-BBVVA27J.js} +2 -2
- package/dist/{chunk-DGLLQ3FR.js → chunk-E2NXJLS6.js} +3 -3
- package/dist/{chunk-5TLHYSP7.js → chunk-E6NPZOJL.js} +2 -2
- package/dist/{chunk-QPOHKVY5.js → chunk-UJU5XERR.js} +2 -2
- package/dist/{chunk-6XKV4YVK.js → chunk-X73VG645.js} +71 -8
- package/dist/chunk-X73VG645.js.map +1 -0
- package/dist/cli/index.js +25 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/index.cjs +89 -12
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +6 -5
- package/dist/index.d.ts +6 -5
- package/dist/index.js +16 -9
- package/dist/index.js.map +1 -1
- package/dist/providers/anthropic.cjs +79 -9
- package/dist/providers/anthropic.cjs.map +1 -1
- package/dist/providers/anthropic.d.cts +2 -2
- package/dist/providers/anthropic.d.ts +2 -2
- package/dist/providers/anthropic.js +3 -3
- package/dist/providers/gemini.cjs +79 -9
- package/dist/providers/gemini.cjs.map +1 -1
- package/dist/providers/gemini.d.cts +2 -2
- package/dist/providers/gemini.d.ts +2 -2
- package/dist/providers/gemini.js +3 -3
- package/dist/providers/openai.cjs +79 -9
- package/dist/providers/openai.cjs.map +1 -1
- package/dist/providers/openai.d.cts +2 -2
- package/dist/providers/openai.d.ts +2 -2
- package/dist/providers/openai.js +3 -3
- package/dist/providers/openrouter.cjs +79 -9
- package/dist/providers/openrouter.cjs.map +1 -1
- package/dist/providers/openrouter.d.cts +2 -2
- package/dist/providers/openrouter.d.ts +2 -2
- package/dist/providers/openrouter.js +4 -4
- package/dist/{schema-Bgoff-CN.d.cts → schema-DwzYbZba.d.cts} +68 -14
- package/dist/{schema-Bgoff-CN.d.ts → schema-DwzYbZba.d.ts} +68 -14
- package/dist/testing.cjs +10 -3
- package/dist/testing.cjs.map +1 -1
- package/dist/testing.d.cts +1 -1
- package/dist/testing.d.ts +1 -1
- package/dist/testing.js +1 -1
- package/dist/{types-7U58bgVW.d.cts → types-C6RG0Si0.d.cts} +12 -5
- package/dist/{types-HnZ46u5Q.d.ts → types-fBvo_d4k.d.ts} +12 -5
- package/dist/usagetap/index.d.cts +2 -2
- package/dist/usagetap/index.d.ts +2 -2
- package/package.json +1 -1
- package/dist/chunk-6XKV4YVK.js.map +0 -1
- /package/dist/{chunk-KFSP5KN4.js.map → chunk-BBVVA27J.js.map} +0 -0
- /package/dist/{chunk-DGLLQ3FR.js.map → chunk-E2NXJLS6.js.map} +0 -0
- /package/dist/{chunk-5TLHYSP7.js.map → chunk-E6NPZOJL.js.map} +0 -0
- /package/dist/{chunk-QPOHKVY5.js.map → chunk-UJU5XERR.js.map} +0 -0
package/dist/index.d.cts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { P as PromptAsset, a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-
|
|
2
|
-
export { b as PromptAssetOverridesSchema, c as PromptAssetSchema } from './schema-
|
|
3
|
-
import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest } from './types-
|
|
4
|
-
export { b as ProviderInlinePromptSource, c as ProviderPromptInput, d as ProviderPromptLookup, V as ValidationResult } from './types-
|
|
1
|
+
import { P as PromptAsset, a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-DwzYbZba.cjs';
|
|
2
|
+
export { b as PromptAssetOverridesSchema, c as PromptAssetSchema } from './schema-DwzYbZba.cjs';
|
|
3
|
+
import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest } from './types-C6RG0Si0.cjs';
|
|
4
|
+
export { b as ProviderInlinePromptSource, c as ProviderPromptInput, d as ProviderPromptLookup, e as ProviderPromptRenderResult, V as ValidationResult } from './types-C6RG0Si0.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, runOpenAIWithUsageTap, runOpenRouterWithUsageTap, withUsageTapCall } from './usagetap/index.cjs';
|
|
6
6
|
export { anthropicAdapter } from './providers/anthropic.cjs';
|
|
7
7
|
export { geminiAdapter } from './providers/gemini.cjs';
|
|
@@ -156,7 +156,8 @@ interface RenderPromptOptions {
|
|
|
156
156
|
}
|
|
157
157
|
interface RenderResult {
|
|
158
158
|
resolved: ResolvedPromptAsset;
|
|
159
|
-
request
|
|
159
|
+
request?: ProviderRequest;
|
|
160
|
+
returnMessage?: string;
|
|
160
161
|
warnings: string[];
|
|
161
162
|
}
|
|
162
163
|
declare class PromptOpsKit {
|
package/dist/index.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { P as PromptAsset, a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-
|
|
2
|
-
export { b as PromptAssetOverridesSchema, c as PromptAssetSchema } from './schema-
|
|
3
|
-
import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest } from './types-
|
|
4
|
-
export { b as ProviderInlinePromptSource, c as ProviderPromptInput, d as ProviderPromptLookup, V as ValidationResult } from './types-
|
|
1
|
+
import { P as PromptAsset, a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-DwzYbZba.js';
|
|
2
|
+
export { b as PromptAssetOverridesSchema, c as PromptAssetSchema } from './schema-DwzYbZba.js';
|
|
3
|
+
import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest } from './types-fBvo_d4k.js';
|
|
4
|
+
export { b as ProviderInlinePromptSource, c as ProviderPromptInput, d as ProviderPromptLookup, e as ProviderPromptRenderResult, V as ValidationResult } from './types-fBvo_d4k.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, runOpenAIWithUsageTap, runOpenRouterWithUsageTap, withUsageTapCall } from './usagetap/index.js';
|
|
6
6
|
export { anthropicAdapter } from './providers/anthropic.js';
|
|
7
7
|
export { geminiAdapter } from './providers/gemini.js';
|
|
@@ -156,7 +156,8 @@ interface RenderPromptOptions {
|
|
|
156
156
|
}
|
|
157
157
|
interface RenderResult {
|
|
158
158
|
resolved: ResolvedPromptAsset;
|
|
159
|
-
request
|
|
159
|
+
request?: ProviderRequest;
|
|
160
|
+
returnMessage?: string;
|
|
160
161
|
warnings: string[];
|
|
161
162
|
}
|
|
162
163
|
declare class PromptOpsKit {
|
package/dist/index.js
CHANGED
|
@@ -15,16 +15,16 @@ import {
|
|
|
15
15
|
} from "./chunk-HWEVRBKZ.js";
|
|
16
16
|
import {
|
|
17
17
|
anthropicAdapter
|
|
18
|
-
} from "./chunk-
|
|
18
|
+
} from "./chunk-BBVVA27J.js";
|
|
19
19
|
import {
|
|
20
20
|
geminiAdapter
|
|
21
|
-
} from "./chunk-
|
|
21
|
+
} from "./chunk-E6NPZOJL.js";
|
|
22
22
|
import {
|
|
23
23
|
openrouterAdapter
|
|
24
|
-
} from "./chunk-
|
|
24
|
+
} from "./chunk-E2NXJLS6.js";
|
|
25
25
|
import {
|
|
26
26
|
openaiAdapter
|
|
27
|
-
} from "./chunk-
|
|
27
|
+
} from "./chunk-UJU5XERR.js";
|
|
28
28
|
import {
|
|
29
29
|
DEFAULT_PROMPTS_DIR,
|
|
30
30
|
PromptCache,
|
|
@@ -41,14 +41,14 @@ import {
|
|
|
41
41
|
resolvePromptAsset,
|
|
42
42
|
sanitizeContextVariables,
|
|
43
43
|
withPromptResolutionDefaults
|
|
44
|
-
} from "./chunk-
|
|
44
|
+
} from "./chunk-X73VG645.js";
|
|
45
45
|
import {
|
|
46
46
|
PromptAssetOverridesSchema,
|
|
47
47
|
PromptAssetSchema,
|
|
48
48
|
extractSections,
|
|
49
49
|
loadPromptFile,
|
|
50
50
|
parsePrompt
|
|
51
|
-
} from "./chunk-
|
|
51
|
+
} from "./chunk-5OYWNRNC.js";
|
|
52
52
|
|
|
53
53
|
// src/index.ts
|
|
54
54
|
import { resolve } from "path";
|
|
@@ -320,10 +320,17 @@ var PromptOpsKit = class {
|
|
|
320
320
|
` + validation.errors.map((e) => ` - ${e}`).join("\n")
|
|
321
321
|
);
|
|
322
322
|
}
|
|
323
|
-
const
|
|
323
|
+
const sanitization = sanitizeContextVariables(resolved, options.variables, {
|
|
324
324
|
onContextOverflow: options.onContextOverflow
|
|
325
325
|
});
|
|
326
|
-
|
|
326
|
+
if (sanitization.shortCircuit) {
|
|
327
|
+
return {
|
|
328
|
+
resolved,
|
|
329
|
+
returnMessage: sanitization.shortCircuit.returnMessage,
|
|
330
|
+
warnings: validation.warnings
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
const contextSizeWarnings = collectContextSizeWarnings(resolved, sanitization.variables).map(
|
|
327
334
|
(warning) => formatContextSizeWarning(resolved, warning)
|
|
328
335
|
);
|
|
329
336
|
const contextWarningPolicy = this.config.warnings?.contextSize;
|
|
@@ -333,7 +340,7 @@ var PromptOpsKit = class {
|
|
|
333
340
|
}
|
|
334
341
|
}
|
|
335
342
|
const request = adapter.render(resolved, {
|
|
336
|
-
variables:
|
|
343
|
+
variables: sanitization.variables,
|
|
337
344
|
history: options.history,
|
|
338
345
|
toolRegistry: options.toolRegistry,
|
|
339
346
|
strict: options.strict
|
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 {\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 { PromptValidationResult } from './validation/index.js';\n\n// --- Re-exports ---\nexport type { PromptAsset, ResolvedPromptAsset } from './schema/index.js';\nexport type {\n ProviderRequest,\n RuntimeRenderOptions,\n ProviderAdapter,\n ProviderInlinePromptSource,\n ProviderPromptInput,\n ProviderPromptLookup,\n ValidationResult,\n} from './providers/types.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 } from './providers/index.js';\nexport { anthropicAdapter } from './providers/anthropic.js';\nexport { geminiAdapter } from './providers/gemini.js';\nexport { openrouterAdapter } from './providers/openrouter.js';\nexport { PromptAssetSchema, PromptAssetOverridesSchema } from './schema/index.js';\nexport {\n applyUsageTapEntitlements,\n beginUsageTapCall,\n createUsageTapClient,\n defaultUsageTapErrorMapper,\n endUsageTapCall,\n extractAnthropicUsage,\n extractGeminiUsage,\n extractOpenAIUsage,\n runAnthropicWithUsageTap,\n runGeminiWithUsageTap,\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?: Array<{ role: string; content: string }>;\n /** Tool registry for resolving tool references */\n toolRegistry?: Record<string, unknown>;\n /** Strict mode — fail on missing variables */\n strict?: boolean;\n}\n\n// --- Result ---\n\nexport interface RenderResult {\n resolved: ResolvedPromptAsset;\n request: ProviderRequest;\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\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 sanitizedVariables = sanitizeContextVariables(resolved, options.variables, {\n onContextOverflow: options.onContextOverflow,\n });\n\n const contextSizeWarnings = collectContextSizeWarnings(resolved, sanitizedVariables).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 request = adapter.render(resolved, {\n variables: sanitizedVariables,\n history: options.history,\n toolRegistry: options.toolRegistry,\n strict: options.strict,\n });\n\n return {\n resolved,\n request,\n warnings: shouldIncludeContextWarningsInResult(contextWarningPolicy)\n ? [...validation.warnings, ...contextSizeWarnings]\n : validation.warnings,\n };\n }\n\n /**\n * Validate a prompt file.\n */\n async validatePrompt(promptPath: string): Promise<PromptValidationResult> {\n const asset = await this.loadPrompt(promptPath);\n\n const sourceFile = resolve(this.config.sourceDir, promptPath + '.md');\n return validateAssetWithIncludes(asset, sourceFile);\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\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 { anthropicAdapter } from './anthropic.js';\nexport { geminiAdapter } from './gemini.js';\nexport { openrouterAdapter } from './openrouter.js';\n\nimport type { ProviderAdapter } from './types.js';\nimport { openaiAdapter } from './openai.js';\nimport { anthropicAdapter } from './anthropic.js';\nimport { geminiAdapter } from './gemini.js';\nimport { openrouterAdapter } from './openrouter.js';\n\nconst adapters: Record<string, ProviderAdapter> = {\n openai: openaiAdapter,\n anthropic: anthropicAdapter,\n google: geminiAdapter,\n gemini: geminiAdapter,\n openrouter: openrouterAdapter,\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 compileContextRegex,\n formatInvalidContextRegexMessage,\n getContextInputs,\n getContextInputNames,\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',\n]);\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 declaredInputs = new Set(getContextInputNames(asset));\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 if (!usedVars.has(v)) {\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 // Context regex definitions compile successfully\n for (const input of getContextInputs(asset)) {\n if (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 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"],"mappings":"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","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 {\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 { 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 ProviderAdapter,\n ProviderInlinePromptSource,\n ProviderPromptInput,\n ProviderPromptLookup,\n ValidationResult,\n} from './providers/types.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 } from './providers/index.js';\nexport { anthropicAdapter } from './providers/anthropic.js';\nexport { geminiAdapter } from './providers/gemini.js';\nexport { openrouterAdapter } from './providers/openrouter.js';\nexport { PromptAssetSchema, PromptAssetOverridesSchema } from './schema/index.js';\nexport {\n applyUsageTapEntitlements,\n beginUsageTapCall,\n createUsageTapClient,\n defaultUsageTapErrorMapper,\n endUsageTapCall,\n extractAnthropicUsage,\n extractGeminiUsage,\n extractOpenAIUsage,\n runAnthropicWithUsageTap,\n runGeminiWithUsageTap,\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?: Array<{ role: string; content: string }>;\n /** Tool registry for resolving tool references */\n toolRegistry?: Record<string, unknown>;\n /** Strict mode — fail on missing variables */\n strict?: boolean;\n}\n\n// --- Result ---\n\nexport interface RenderResult {\n resolved: ResolvedPromptAsset;\n request?: ProviderRequest;\n returnMessage?: string;\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\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 request = adapter.render(resolved, {\n variables: sanitization.variables,\n history: options.history,\n toolRegistry: options.toolRegistry,\n strict: options.strict,\n });\n\n return {\n resolved,\n request,\n warnings: shouldIncludeContextWarningsInResult(contextWarningPolicy)\n ? [...validation.warnings, ...contextSizeWarnings]\n : validation.warnings,\n };\n }\n\n /**\n * Validate a prompt file.\n */\n async validatePrompt(promptPath: string): Promise<PromptValidationResult> {\n const asset = await this.loadPrompt(promptPath);\n\n const sourceFile = resolve(this.config.sourceDir, promptPath + '.md');\n return validateAssetWithIncludes(asset, sourceFile);\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\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 { anthropicAdapter } from './anthropic.js';\nexport { geminiAdapter } from './gemini.js';\nexport { openrouterAdapter } from './openrouter.js';\n\nimport type { ProviderAdapter } from './types.js';\nimport { openaiAdapter } from './openai.js';\nimport { anthropicAdapter } from './anthropic.js';\nimport { geminiAdapter } from './gemini.js';\nimport { openrouterAdapter } from './openrouter.js';\n\nconst adapters: Record<string, ProviderAdapter> = {\n openai: openaiAdapter,\n anthropic: anthropicAdapter,\n google: geminiAdapter,\n gemini: geminiAdapter,\n openrouter: openrouterAdapter,\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 compileContextRegex,\n formatInvalidContextRegexMessage,\n getContextInputs,\n getContextInputNames,\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',\n]);\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 declaredInputs = new Set(getContextInputNames(asset));\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 if (!usedVars.has(v)) {\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 // Context regex definitions compile successfully\n for (const input of getContextInputs(asset)) {\n if (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 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"],"mappings":"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","names":[]}
|
|
@@ -214,7 +214,14 @@ var ContextRegexSchema = import_zod.z.union([
|
|
|
214
214
|
import_zod.z.string(),
|
|
215
215
|
import_zod.z.object({
|
|
216
216
|
pattern: import_zod.z.string(),
|
|
217
|
-
flags: import_zod.z.string().optional()
|
|
217
|
+
flags: import_zod.z.string().optional(),
|
|
218
|
+
return_message: import_zod.z.string().optional()
|
|
219
|
+
})
|
|
220
|
+
]);
|
|
221
|
+
var ContextBuiltInValidatorSchema = import_zod.z.union([
|
|
222
|
+
import_zod.z.boolean(),
|
|
223
|
+
import_zod.z.object({
|
|
224
|
+
return_message: import_zod.z.string().optional()
|
|
218
225
|
})
|
|
219
226
|
]);
|
|
220
227
|
var ContextInputDefinitionObjectSchema = import_zod.z.object({
|
|
@@ -223,8 +230,8 @@ var ContextInputDefinitionObjectSchema = import_zod.z.object({
|
|
|
223
230
|
trim: import_zod.z.union([import_zod.z.boolean(), import_zod.z.enum(["start", "end", "both"])]).optional(),
|
|
224
231
|
allow_regex: ContextRegexSchema.optional(),
|
|
225
232
|
deny_regex: ContextRegexSchema.optional(),
|
|
226
|
-
non_empty:
|
|
227
|
-
reject_secrets:
|
|
233
|
+
non_empty: ContextBuiltInValidatorSchema.optional(),
|
|
234
|
+
reject_secrets: ContextBuiltInValidatorSchema.optional()
|
|
228
235
|
});
|
|
229
236
|
var ContextInputDefinitionSchema = import_zod.z.union([
|
|
230
237
|
import_zod.z.string(),
|
|
@@ -584,8 +591,8 @@ function normalizeContextInput(input) {
|
|
|
584
591
|
trim: input.trim,
|
|
585
592
|
allow_regex: normalizeContextRegex(input.allow_regex),
|
|
586
593
|
deny_regex: normalizeContextRegex(input.deny_regex),
|
|
587
|
-
non_empty: input.non_empty,
|
|
588
|
-
reject_secrets: input.reject_secrets
|
|
594
|
+
non_empty: normalizeBuiltInValidator(input.non_empty),
|
|
595
|
+
reject_secrets: normalizeBuiltInValidator(input.reject_secrets)
|
|
589
596
|
};
|
|
590
597
|
}
|
|
591
598
|
function normalizeContextRegex(value) {
|
|
@@ -611,7 +618,19 @@ function normalizeContextRegex(value) {
|
|
|
611
618
|
return {
|
|
612
619
|
pattern: value.pattern,
|
|
613
620
|
flags: value.flags ?? "",
|
|
614
|
-
raw: JSON.stringify(value)
|
|
621
|
+
raw: JSON.stringify(value),
|
|
622
|
+
returnMessage: value.return_message
|
|
623
|
+
};
|
|
624
|
+
}
|
|
625
|
+
function normalizeBuiltInValidator(value) {
|
|
626
|
+
if (value === void 0 || value === false) {
|
|
627
|
+
return void 0;
|
|
628
|
+
}
|
|
629
|
+
if (value === true) {
|
|
630
|
+
return {};
|
|
631
|
+
}
|
|
632
|
+
return {
|
|
633
|
+
returnMessage: value.return_message
|
|
615
634
|
};
|
|
616
635
|
}
|
|
617
636
|
function parseRegexLiteral(value) {
|
|
@@ -743,6 +762,17 @@ function sanitizeContextVariables(asset, variables = {}, options = {}) {
|
|
|
743
762
|
field: "allow_regex"
|
|
744
763
|
});
|
|
745
764
|
if (!matcher.test(candidate2)) {
|
|
765
|
+
if (input.allow_regex.returnMessage) {
|
|
766
|
+
return {
|
|
767
|
+
variables: sanitized,
|
|
768
|
+
shortCircuit: {
|
|
769
|
+
returnMessage: input.allow_regex.returnMessage,
|
|
770
|
+
code: "POK031",
|
|
771
|
+
variable: input.name,
|
|
772
|
+
field: "allow_regex"
|
|
773
|
+
}
|
|
774
|
+
};
|
|
775
|
+
}
|
|
746
776
|
throw new Error(
|
|
747
777
|
`POK031: Context variable "${input.name}" failed allow_regex validation for prompt "${asset.id}".`
|
|
748
778
|
);
|
|
@@ -756,12 +786,34 @@ function sanitizeContextVariables(asset, variables = {}, options = {}) {
|
|
|
756
786
|
field: "deny_regex"
|
|
757
787
|
});
|
|
758
788
|
if (matcher.test(candidate2)) {
|
|
789
|
+
if (input.deny_regex.returnMessage) {
|
|
790
|
+
return {
|
|
791
|
+
variables: sanitized,
|
|
792
|
+
shortCircuit: {
|
|
793
|
+
returnMessage: input.deny_regex.returnMessage,
|
|
794
|
+
code: "POK032",
|
|
795
|
+
variable: input.name,
|
|
796
|
+
field: "deny_regex"
|
|
797
|
+
}
|
|
798
|
+
};
|
|
799
|
+
}
|
|
759
800
|
throw new Error(
|
|
760
801
|
`POK032: Context variable "${input.name}" matched deny_regex for prompt "${asset.id}".`
|
|
761
802
|
);
|
|
762
803
|
}
|
|
763
804
|
}
|
|
764
805
|
if (input.non_empty && candidate.trim().length === 0) {
|
|
806
|
+
if (input.non_empty.returnMessage) {
|
|
807
|
+
return {
|
|
808
|
+
variables: sanitized,
|
|
809
|
+
shortCircuit: {
|
|
810
|
+
returnMessage: input.non_empty.returnMessage,
|
|
811
|
+
code: "POK033",
|
|
812
|
+
variable: input.name,
|
|
813
|
+
field: "non_empty"
|
|
814
|
+
}
|
|
815
|
+
};
|
|
816
|
+
}
|
|
765
817
|
throw new Error(
|
|
766
818
|
`POK033: Context variable "${input.name}" failed non_empty validation for prompt "${asset.id}".`
|
|
767
819
|
);
|
|
@@ -773,13 +825,24 @@ function sanitizeContextVariables(asset, variables = {}, options = {}) {
|
|
|
773
825
|
field: "reject_secrets"
|
|
774
826
|
});
|
|
775
827
|
if (matcher.test(candidate)) {
|
|
828
|
+
if (input.reject_secrets.returnMessage) {
|
|
829
|
+
return {
|
|
830
|
+
variables: sanitized,
|
|
831
|
+
shortCircuit: {
|
|
832
|
+
returnMessage: input.reject_secrets.returnMessage,
|
|
833
|
+
code: "POK034",
|
|
834
|
+
variable: input.name,
|
|
835
|
+
field: "reject_secrets"
|
|
836
|
+
}
|
|
837
|
+
};
|
|
838
|
+
}
|
|
776
839
|
throw new Error(
|
|
777
840
|
`POK034: Context variable "${input.name}" matched reject_secrets validation for prompt "${asset.id}".`
|
|
778
841
|
);
|
|
779
842
|
}
|
|
780
843
|
}
|
|
781
844
|
}
|
|
782
|
-
return sanitized;
|
|
845
|
+
return { variables: sanitized };
|
|
783
846
|
}
|
|
784
847
|
function measureContextValueSize(value) {
|
|
785
848
|
return textEncoder.encode(value).length;
|
|
@@ -808,12 +871,19 @@ function withPromptInputSupport(adapter) {
|
|
|
808
871
|
};
|
|
809
872
|
const renderPrompt = async (input, runtime) => {
|
|
810
873
|
const resolved = await resolveProviderPromptInput(input, runtime);
|
|
811
|
-
const
|
|
874
|
+
const sanitization = sanitizeContextVariables(resolved, runtime.variables, {
|
|
812
875
|
onContextOverflow: runtime.onContextOverflow
|
|
813
876
|
});
|
|
877
|
+
if (sanitization.shortCircuit) {
|
|
878
|
+
return {
|
|
879
|
+
provider: adapter.name,
|
|
880
|
+
model: resolved.model ?? "",
|
|
881
|
+
returnMessage: sanitization.shortCircuit.returnMessage
|
|
882
|
+
};
|
|
883
|
+
}
|
|
814
884
|
return adapter.render(resolved, {
|
|
815
885
|
...runtime,
|
|
816
|
-
variables
|
|
886
|
+
variables: sanitization.variables
|
|
817
887
|
});
|
|
818
888
|
};
|
|
819
889
|
return {
|