promptopskit 0.5.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (70) hide show
  1. package/README.md +9 -7
  2. package/SKILL.md +16 -10
  3. package/dist/{chunk-QK3WKE3K.js → chunk-35NN5F6O.js} +2 -2
  4. package/dist/{chunk-D75HKF64.js → chunk-3G3EAV7H.js} +2 -2
  5. package/dist/{chunk-LNGHGGJN.js → chunk-6NOUETAC.js} +2 -2
  6. package/dist/{chunk-KN7H4JRK.js → chunk-F552OBUV.js} +619 -502
  7. package/dist/chunk-F552OBUV.js.map +1 -0
  8. package/dist/{chunk-6BOUQVSX.js → chunk-FICB2ZSK.js} +3 -3
  9. package/dist/{chunk-6VLKZCNS.js → chunk-OWMP5NMV.js} +2 -2
  10. package/dist/{chunk-IN4KT5EU.js → chunk-R65RAHAG.js} +3 -3
  11. package/dist/{chunk-K6ZU3CGV.js → chunk-ULVY473P.js} +306 -17
  12. package/dist/chunk-ULVY473P.js.map +1 -0
  13. package/dist/cli/index.js +446 -103
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/index.cjs +1223 -772
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +9 -5
  18. package/dist/index.d.ts +9 -5
  19. package/dist/index.js +67 -18
  20. package/dist/index.js.map +1 -1
  21. package/dist/providers/anthropic.cjs +902 -502
  22. package/dist/providers/anthropic.cjs.map +1 -1
  23. package/dist/providers/anthropic.d.cts +2 -2
  24. package/dist/providers/anthropic.d.ts +2 -2
  25. package/dist/providers/anthropic.js +3 -3
  26. package/dist/providers/gemini.cjs +902 -502
  27. package/dist/providers/gemini.cjs.map +1 -1
  28. package/dist/providers/gemini.d.cts +2 -2
  29. package/dist/providers/gemini.d.ts +2 -2
  30. package/dist/providers/gemini.js +3 -3
  31. package/dist/providers/llmasaservice.cjs +901 -501
  32. package/dist/providers/llmasaservice.cjs.map +1 -1
  33. package/dist/providers/llmasaservice.d.cts +2 -2
  34. package/dist/providers/llmasaservice.d.ts +2 -2
  35. package/dist/providers/llmasaservice.js +4 -4
  36. package/dist/providers/openai-responses.cjs +902 -502
  37. package/dist/providers/openai-responses.cjs.map +1 -1
  38. package/dist/providers/openai-responses.d.cts +2 -2
  39. package/dist/providers/openai-responses.d.ts +2 -2
  40. package/dist/providers/openai-responses.js +3 -3
  41. package/dist/providers/openai.cjs +902 -502
  42. package/dist/providers/openai.cjs.map +1 -1
  43. package/dist/providers/openai.d.cts +2 -2
  44. package/dist/providers/openai.d.ts +2 -2
  45. package/dist/providers/openai.js +3 -3
  46. package/dist/providers/openrouter.cjs +902 -502
  47. package/dist/providers/openrouter.cjs.map +1 -1
  48. package/dist/providers/openrouter.d.cts +2 -2
  49. package/dist/providers/openrouter.d.ts +2 -2
  50. package/dist/providers/openrouter.js +4 -4
  51. package/dist/{schema-D-RI4w-k.d.cts → schema-DBcSns_b.d.cts} +732 -206
  52. package/dist/{schema-D-RI4w-k.d.ts → schema-DBcSns_b.d.ts} +732 -206
  53. package/dist/testing.cjs +54 -5
  54. package/dist/testing.cjs.map +1 -1
  55. package/dist/testing.d.cts +1 -1
  56. package/dist/testing.d.ts +1 -1
  57. package/dist/testing.js +1 -1
  58. package/dist/{types-B3dxBGu6.d.ts → types-8T2D5KB5.d.cts} +20 -2
  59. package/dist/{types-DbTAjlTN.d.cts → types-BlLXT5Qb.d.ts} +20 -2
  60. package/dist/usagetap/index.d.cts +2 -2
  61. package/dist/usagetap/index.d.ts +2 -2
  62. package/package.json +9 -2
  63. package/dist/chunk-K6ZU3CGV.js.map +0 -1
  64. package/dist/chunk-KN7H4JRK.js.map +0 -1
  65. /package/dist/{chunk-QK3WKE3K.js.map → chunk-35NN5F6O.js.map} +0 -0
  66. /package/dist/{chunk-D75HKF64.js.map → chunk-3G3EAV7H.js.map} +0 -0
  67. /package/dist/{chunk-LNGHGGJN.js.map → chunk-6NOUETAC.js.map} +0 -0
  68. /package/dist/{chunk-6BOUQVSX.js.map → chunk-FICB2ZSK.js.map} +0 -0
  69. /package/dist/{chunk-6VLKZCNS.js.map → chunk-OWMP5NMV.js.map} +0 -0
  70. /package/dist/{chunk-IN4KT5EU.js.map → chunk-R65RAHAG.js.map} +0 -0
package/dist/index.d.cts CHANGED
@@ -1,7 +1,7 @@
1
- import { P as PromptAsset, a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-D-RI4w-k.cjs';
2
- export { b as PromptAssetOverridesSchema, c as PromptAssetSchema } from './schema-D-RI4w-k.cjs';
3
- import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest } from './types-DbTAjlTN.cjs';
4
- export { b as ProviderInlinePromptSource, c as ProviderPromptInput, d as ProviderPromptLookup, e as ProviderPromptRenderResult, f as RuntimeHistoryCompactionInfo, g as RuntimeHistoryCompactionResult, h as RuntimeHistoryMessage, V as ValidationResult } from './types-DbTAjlTN.cjs';
1
+ import { P as PromptAsset, a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-DBcSns_b.cjs';
2
+ export { b as PromptAssetOverridesSchema, c as PromptAssetSchema } from './schema-DBcSns_b.cjs';
3
+ import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest, b as PromptCompressionResult } from './types-8T2D5KB5.cjs';
4
+ export { O as OpenAIResponsesRuntimeOptions, c as ProviderInlinePromptSource, d as ProviderPromptInput, e as ProviderPromptLookup, f as ProviderPromptRenderResult, g as RuntimeHistoryCompactionInfo, h as RuntimeHistoryCompactionResult, i as RuntimeHistoryMessage, T as THETOKENCOMPANY_DEFAULT_BASE_URL, j as THETOKENCOMPANY_DEFAULT_MODEL, k as TheTokenCompanyRuntimeOptions, V as ValidationResult } from './types-8T2D5KB5.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';
@@ -34,6 +34,7 @@ declare function validateAssetWithIncludes(asset: PromptAsset, filePath: string,
34
34
 
35
35
  interface InterpolateOptions {
36
36
  strict?: boolean;
37
+ optionalVariables?: Iterable<string>;
37
38
  }
38
39
  /**
39
40
  * Interpolate variables into a template string.
@@ -156,11 +157,14 @@ interface RenderPromptOptions {
156
157
  strict?: boolean;
157
158
  /** OpenAI Responses API-specific request options */
158
159
  openaiResponses?: RuntimeRenderOptions['openaiResponses'];
160
+ /** TheTokenCompany compression credentials and transport options */
161
+ theTokenCompany?: RuntimeRenderOptions['theTokenCompany'];
159
162
  }
160
163
  interface RenderResult {
161
164
  resolved: ResolvedPromptAsset;
162
165
  request?: ProviderRequest;
163
166
  returnMessage?: string;
167
+ compression?: PromptCompressionResult[];
164
168
  warnings: string[];
165
169
  }
166
170
  declare class PromptOpsKit {
@@ -202,4 +206,4 @@ declare function renderPrompt(options: RenderPromptOptions & {
202
206
  warnings?: PromptOpsKitConfig['warnings'];
203
207
  }): Promise<RenderResult>;
204
208
 
205
- export { type OverrideOptions, type ParseResult, PromptAsset, PromptOpsKit, type PromptOpsKitConfig, type PromptValidationResult, ProviderAdapter, ProviderRequest, type RenderOptions, type RenderPromptOptions, type RenderResult, type RenderedSections, ResolvedPromptAsset, RuntimeRenderOptions, type ValidationError, applyOverrides, createPromptOpsKit, extractSections, extractVariables, getAdapter, interpolate, loadPromptFile, parsePrompt, renderPrompt, resolveIncludes, validateAsset, validateAssetWithIncludes };
209
+ export { type OverrideOptions, type ParseResult, PromptAsset, PromptCompressionResult, PromptOpsKit, type PromptOpsKitConfig, type PromptValidationResult, ProviderAdapter, ProviderRequest, type RenderOptions, type RenderPromptOptions, type RenderResult, type RenderedSections, ResolvedPromptAsset, RuntimeRenderOptions, type ValidationError, applyOverrides, createPromptOpsKit, extractSections, extractVariables, getAdapter, interpolate, loadPromptFile, parsePrompt, renderPrompt, resolveIncludes, validateAsset, validateAssetWithIncludes };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
- import { P as PromptAsset, a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-D-RI4w-k.js';
2
- export { b as PromptAssetOverridesSchema, c as PromptAssetSchema } from './schema-D-RI4w-k.js';
3
- import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest } from './types-B3dxBGu6.js';
4
- export { b as ProviderInlinePromptSource, c as ProviderPromptInput, d as ProviderPromptLookup, e as ProviderPromptRenderResult, f as RuntimeHistoryCompactionInfo, g as RuntimeHistoryCompactionResult, h as RuntimeHistoryMessage, V as ValidationResult } from './types-B3dxBGu6.js';
1
+ import { P as PromptAsset, a as PromptAssetOverrides, R as ResolvedPromptAsset } from './schema-DBcSns_b.js';
2
+ export { b as PromptAssetOverridesSchema, c as PromptAssetSchema } from './schema-DBcSns_b.js';
3
+ import { P as ProviderAdapter, R as RuntimeRenderOptions, a as ProviderRequest, b as PromptCompressionResult } from './types-BlLXT5Qb.js';
4
+ export { O as OpenAIResponsesRuntimeOptions, c as ProviderInlinePromptSource, d as ProviderPromptInput, e as ProviderPromptLookup, f as ProviderPromptRenderResult, g as RuntimeHistoryCompactionInfo, h as RuntimeHistoryCompactionResult, i as RuntimeHistoryMessage, T as THETOKENCOMPANY_DEFAULT_BASE_URL, j as THETOKENCOMPANY_DEFAULT_MODEL, k as TheTokenCompanyRuntimeOptions, V as ValidationResult } from './types-BlLXT5Qb.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';
@@ -34,6 +34,7 @@ declare function validateAssetWithIncludes(asset: PromptAsset, filePath: string,
34
34
 
35
35
  interface InterpolateOptions {
36
36
  strict?: boolean;
37
+ optionalVariables?: Iterable<string>;
37
38
  }
38
39
  /**
39
40
  * Interpolate variables into a template string.
@@ -156,11 +157,14 @@ interface RenderPromptOptions {
156
157
  strict?: boolean;
157
158
  /** OpenAI Responses API-specific request options */
158
159
  openaiResponses?: RuntimeRenderOptions['openaiResponses'];
160
+ /** TheTokenCompany compression credentials and transport options */
161
+ theTokenCompany?: RuntimeRenderOptions['theTokenCompany'];
159
162
  }
160
163
  interface RenderResult {
161
164
  resolved: ResolvedPromptAsset;
162
165
  request?: ProviderRequest;
163
166
  returnMessage?: string;
167
+ compression?: PromptCompressionResult[];
164
168
  warnings: string[];
165
169
  }
166
170
  declare class PromptOpsKit {
@@ -202,4 +206,4 @@ declare function renderPrompt(options: RenderPromptOptions & {
202
206
  warnings?: PromptOpsKitConfig['warnings'];
203
207
  }): Promise<RenderResult>;
204
208
 
205
- export { type OverrideOptions, type ParseResult, PromptAsset, PromptOpsKit, type PromptOpsKitConfig, type PromptValidationResult, ProviderAdapter, ProviderRequest, type RenderOptions, type RenderPromptOptions, type RenderResult, type RenderedSections, ResolvedPromptAsset, RuntimeRenderOptions, type ValidationError, applyOverrides, createPromptOpsKit, extractSections, extractVariables, getAdapter, interpolate, loadPromptFile, parsePrompt, renderPrompt, resolveIncludes, validateAsset, validateAssetWithIncludes };
209
+ export { type OverrideOptions, type ParseResult, PromptAsset, PromptCompressionResult, PromptOpsKit, type PromptOpsKitConfig, type PromptValidationResult, ProviderAdapter, ProviderRequest, type RenderOptions, type RenderPromptOptions, type RenderResult, type RenderedSections, ResolvedPromptAsset, RuntimeRenderOptions, type ValidationError, applyOverrides, createPromptOpsKit, extractSections, extractVariables, getAdapter, interpolate, loadPromptFile, parsePrompt, renderPrompt, resolveIncludes, validateAsset, validateAssetWithIncludes };
package/dist/index.js CHANGED
@@ -5,7 +5,7 @@ import {
5
5
  LLMASASERVICE_SDK_PLACEHOLDER_API_KEY,
6
6
  createLLMAsAServiceOpenAIConfig,
7
7
  llmasaserviceAdapter
8
- } from "./chunk-6BOUQVSX.js";
8
+ } from "./chunk-FICB2ZSK.js";
9
9
  import {
10
10
  applyUsageTapEntitlements,
11
11
  beginUsageTapCall,
@@ -24,28 +24,31 @@ import {
24
24
  } from "./chunk-AGTGIZMR.js";
25
25
  import {
26
26
  openaiResponsesAdapter
27
- } from "./chunk-6VLKZCNS.js";
27
+ } from "./chunk-OWMP5NMV.js";
28
28
  import {
29
29
  anthropicAdapter
30
- } from "./chunk-LNGHGGJN.js";
30
+ } from "./chunk-6NOUETAC.js";
31
31
  import {
32
32
  geminiAdapter
33
- } from "./chunk-QK3WKE3K.js";
33
+ } from "./chunk-35NN5F6O.js";
34
34
  import {
35
35
  openrouterAdapter
36
- } from "./chunk-IN4KT5EU.js";
36
+ } from "./chunk-R65RAHAG.js";
37
37
  import {
38
38
  openaiAdapter
39
- } from "./chunk-D75HKF64.js";
39
+ } from "./chunk-3G3EAV7H.js";
40
40
  import {
41
41
  DEFAULT_PROMPTS_DIR,
42
42
  PromptCache,
43
+ THETOKENCOMPANY_DEFAULT_BASE_URL,
44
+ THETOKENCOMPANY_DEFAULT_MODEL,
43
45
  applyOverrides,
46
+ applyPromptCompressionForRender,
47
+ areContextInputWarningsEnabled,
44
48
  collectContextSizeWarnings,
45
49
  compactHistoryForPrompt,
46
50
  compileContextRegex,
47
51
  extractVariables,
48
- getContextInputNames,
49
52
  getContextInputs,
50
53
  interpolate,
51
54
  loadPromptAsset,
@@ -54,14 +57,14 @@ import {
54
57
  resolvePromptAsset,
55
58
  sanitizeContextVariables,
56
59
  withPromptResolutionDefaults
57
- } from "./chunk-KN7H4JRK.js";
60
+ } from "./chunk-F552OBUV.js";
58
61
  import {
59
62
  PromptAssetOverridesSchema,
60
63
  PromptAssetSchema,
61
64
  extractSections,
62
65
  loadPromptFile,
63
66
  parsePrompt
64
- } from "./chunk-K6ZU3CGV.js";
67
+ } from "./chunk-ULVY473P.js";
65
68
 
66
69
  // src/index.ts
67
70
  import { resolve } from "path";
@@ -127,9 +130,22 @@ var KNOWN_FRONT_MATTER_KEYS = /* @__PURE__ */ new Set([
127
130
  "tiers",
128
131
  "metadata",
129
132
  "cache",
133
+ "compression",
130
134
  "provider_options",
131
135
  "raw"
132
136
  ]);
137
+ function collectSchemaKeywords(value, acc) {
138
+ if (!value || typeof value !== "object") return;
139
+ if (Array.isArray(value)) {
140
+ for (const item of value) collectSchemaKeywords(item, acc);
141
+ return;
142
+ }
143
+ const record = value;
144
+ for (const [key, child] of Object.entries(record)) {
145
+ acc.add(key);
146
+ collectSchemaKeywords(child, acc);
147
+ }
148
+ }
133
149
  var RISKY_UNBOUNDED_INPUT_NAMES = [
134
150
  "message",
135
151
  "prompt",
@@ -181,7 +197,9 @@ function validateAsset(asset, frontMatterKeys, filePath) {
181
197
  }
182
198
  }
183
199
  }
184
- const declaredInputs = new Set(getContextInputNames(asset));
200
+ const contextInputs = getContextInputs(asset);
201
+ const declaredInputs = new Set(contextInputs.map((input) => input.name));
202
+ const declaredInputsByName = new Map(contextInputs.map((input) => [input.name, input]));
185
203
  const usedVars = /* @__PURE__ */ new Set();
186
204
  if (asset.sections?.system_instructions) {
187
205
  for (const v of extractVariables(asset.sections.system_instructions)) {
@@ -203,7 +221,8 @@ function validateAsset(asset, frontMatterKeys, filePath) {
203
221
  }
204
222
  }
205
223
  for (const v of declaredInputs) {
206
- if (!usedVars.has(v)) {
224
+ const input = declaredInputsByName.get(v);
225
+ if (!usedVars.has(v) && input?.optional !== true && areContextInputWarningsEnabled(input ?? {})) {
207
226
  warnings.push({
208
227
  code: "POK012",
209
228
  message: `Variable "${v}" is declared in context.inputs but never used`,
@@ -219,9 +238,10 @@ function validateAsset(asset, frontMatterKeys, filePath) {
219
238
  suggestion: "Declare context.inputs to enable input policy validation."
220
239
  });
221
240
  }
222
- for (const input of getContextInputs(asset)) {
241
+ for (const input of contextInputs) {
223
242
  const lowerName = input.name.toLowerCase();
224
- if (input.max_size === void 0 && RISKY_UNBOUNDED_INPUT_NAMES.some((needle) => lowerName.includes(needle))) {
243
+ const inputWarningsEnabled = areContextInputWarningsEnabled(input);
244
+ if (inputWarningsEnabled && input.max_size === void 0 && RISKY_UNBOUNDED_INPUT_NAMES.some((needle) => lowerName.includes(needle))) {
225
245
  warnings.push({
226
246
  code: "POK040",
227
247
  message: `Context input "${input.name}" has no max_size and appears unbounded.`,
@@ -229,7 +249,7 @@ function validateAsset(asset, frontMatterKeys, filePath) {
229
249
  suggestion: "Add max_size to constrain prompt payload growth."
230
250
  });
231
251
  }
232
- if (input.allow_regex === void 0 && input.deny_regex === void 0 && input.non_empty === void 0 && input.reject_secrets === void 0) {
252
+ if (inputWarningsEnabled && input.optional !== true && input.allow_regex === void 0 && input.deny_regex === void 0 && input.non_empty === void 0 && input.reject_secrets === void 0) {
233
253
  warnings.push({
234
254
  code: "POK041",
235
255
  message: `Context input "${input.name}" has no input hardening validators.`,
@@ -237,7 +257,7 @@ function validateAsset(asset, frontMatterKeys, filePath) {
237
257
  suggestion: "Consider non_empty/reject_secrets and allow/deny regex validators."
238
258
  });
239
259
  }
240
- if (input.trim !== void 0 && input.trim !== false && input.max_size === void 0) {
260
+ if (inputWarningsEnabled && input.trim !== void 0 && input.trim !== false && input.max_size === void 0) {
241
261
  warnings.push({
242
262
  code: "POK014",
243
263
  message: `Context input "${input.name}" sets trim but has no max_size; trim-to-budget will be skipped.`,
@@ -264,6 +284,30 @@ function validateAsset(asset, frontMatterKeys, filePath) {
264
284
  }
265
285
  }
266
286
  }
287
+ if (asset.response?.schema && asset.provider) {
288
+ const keywords = /* @__PURE__ */ new Set();
289
+ collectSchemaKeywords(asset.response.schema, keywords);
290
+ const openAIUnsupported = ["patternProperties", "unevaluatedProperties", "$dynamicRef"];
291
+ const geminiUnsupported = ["patternProperties", "$dynamicRef", "dependentSchemas"];
292
+ const anthropicCaution = ["if", "then", "else"];
293
+ const checks = [
294
+ { provider: ["openai", "openai-responses", "openrouter", "llmasaservice"], unsupported: openAIUnsupported, code: "POK052" },
295
+ { provider: ["gemini", "google"], unsupported: geminiUnsupported, code: "POK053" },
296
+ { provider: ["anthropic"], unsupported: anthropicCaution, code: "POK054" }
297
+ ];
298
+ for (const check of checks) {
299
+ if (!check.provider.includes(asset.provider)) continue;
300
+ const hits = check.unsupported.filter((k) => keywords.has(k));
301
+ if (hits.length > 0) {
302
+ warnings.push({
303
+ code: check.code,
304
+ message: `response.schema includes provider-sensitive JSON Schema keywords for "${asset.provider}": ${hits.join(", ")}`,
305
+ filePath,
306
+ suggestion: "Validate schema compatibility with your provider docs or simplify the schema dialect."
307
+ });
308
+ }
309
+ }
310
+ }
267
311
  if (asset.provider) {
268
312
  let providerCache;
269
313
  let cacheSuggestionField;
@@ -483,7 +527,7 @@ var PromptOpsKit = class {
483
527
  console.warn(`[promptopskit] Warning: ${warning}`);
484
528
  }
485
529
  }
486
- const request = adapter.render(resolved, {
530
+ const prepared = await applyPromptCompressionForRender(resolved, {
487
531
  variables: sanitization.variables,
488
532
  history: compactHistoryForPrompt(resolved, {
489
533
  history: options.history,
@@ -492,11 +536,14 @@ var PromptOpsKit = class {
492
536
  onHistoryCompaction: options.onHistoryCompaction,
493
537
  toolRegistry: options.toolRegistry,
494
538
  strict: options.strict,
495
- openaiResponses: options.openaiResponses
539
+ openaiResponses: options.openaiResponses,
540
+ theTokenCompany: options.theTokenCompany
496
541
  });
542
+ const request = adapter.render(prepared.asset, prepared.runtime);
497
543
  return {
498
544
  resolved,
499
- request,
545
+ request: prepared.compression.length > 0 ? { ...request, compression: prepared.compression } : request,
546
+ ...prepared.compression.length > 0 ? { compression: prepared.compression } : {},
500
547
  warnings: shouldIncludeContextWarningsInResult(contextWarningPolicy) ? [...validation.warnings, ...contextSizeWarnings] : validation.warnings
501
548
  };
502
549
  }
@@ -560,6 +607,8 @@ export {
560
607
  PromptAssetOverridesSchema,
561
608
  PromptAssetSchema,
562
609
  PromptOpsKit,
610
+ THETOKENCOMPANY_DEFAULT_BASE_URL,
611
+ THETOKENCOMPANY_DEFAULT_MODEL,
563
612
  anthropicAdapter,
564
613
  applyOverrides,
565
614
  applyUsageTapEntitlements,
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 {\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 RuntimeHistoryCompactionInfo,\n RuntimeHistoryCompactionResult,\n RuntimeHistoryMessage,\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, 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 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}\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 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 request = adapter.render(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 });\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 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 compileContextRegex,\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', 'cache', 'provider_options', 'raw',\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\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 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 // Context regex definitions compile successfully\n for (const input of getContextInputs(asset)) {\n const lowerName = input.name.toLowerCase();\n\n if (input.max_size === undefined && RISKY_UNBOUNDED_INPUT_NAMES.some((needle) => lowerName.includes(needle))) {\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 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 (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 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 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":[]}
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 } 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 { PromptCompressionResult, TheTokenCompanyRuntimeOptions } 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 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 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 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\n return {\n resolved,\n request: prepared.compression.length > 0\n ? { ...request, compression: prepared.compression }\n : request,\n ...(prepared.compression.length > 0 ? { compression: prepared.compression } : {}),\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 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\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 // 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 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":[]}