promptopskit 0.9.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +8 -6
  2. package/SKILL.md +5 -4
  3. package/dist/{chunk-6ICAKKV3.js → chunk-46Z64RVO.js} +2 -2
  4. package/dist/{chunk-DAJMCV4F.js → chunk-7XLJOH2K.js} +3 -3
  5. package/dist/{chunk-VOXMOGU5.js → chunk-ALBSFXYR.js} +2 -1
  6. package/dist/chunk-ALBSFXYR.js.map +1 -0
  7. package/dist/{chunk-CGBEKODU.js → chunk-IGLKVT74.js} +2 -2
  8. package/dist/{chunk-YLJGWVZ6.js → chunk-PSQWMBKX.js} +21 -21
  9. package/dist/chunk-PSQWMBKX.js.map +1 -0
  10. package/dist/{chunk-A2VPKL4X.js → chunk-QVJTND5A.js} +2 -2
  11. package/dist/{chunk-XSSET4QN.js → chunk-UULXO5I6.js} +2 -2
  12. package/dist/{chunk-DA2NSBIN.js → chunk-VUQEB5ML.js} +2 -2
  13. package/dist/cli/index.js +1 -0
  14. package/dist/cli/index.js.map +1 -1
  15. package/dist/index.cjs +22 -20
  16. package/dist/index.cjs.map +1 -1
  17. package/dist/index.d.cts +5 -3
  18. package/dist/index.d.ts +5 -3
  19. package/dist/index.js +11 -11
  20. package/dist/index.js.map +1 -1
  21. package/dist/providers/anthropic.cjs +1 -0
  22. package/dist/providers/anthropic.cjs.map +1 -1
  23. package/dist/providers/anthropic.d.cts +1 -1
  24. package/dist/providers/anthropic.d.ts +1 -1
  25. package/dist/providers/anthropic.js +3 -3
  26. package/dist/providers/gemini.cjs +1 -0
  27. package/dist/providers/gemini.cjs.map +1 -1
  28. package/dist/providers/gemini.d.cts +1 -1
  29. package/dist/providers/gemini.d.ts +1 -1
  30. package/dist/providers/gemini.js +3 -3
  31. package/dist/providers/llmasaservice.cjs +19 -19
  32. package/dist/providers/llmasaservice.cjs.map +1 -1
  33. package/dist/providers/llmasaservice.d.cts +6 -5
  34. package/dist/providers/llmasaservice.d.ts +6 -5
  35. package/dist/providers/llmasaservice.js +4 -6
  36. package/dist/providers/openai-responses.cjs +1 -0
  37. package/dist/providers/openai-responses.cjs.map +1 -1
  38. package/dist/providers/openai-responses.d.cts +1 -1
  39. package/dist/providers/openai-responses.d.ts +1 -1
  40. package/dist/providers/openai-responses.js +3 -3
  41. package/dist/providers/openai.cjs +1 -0
  42. package/dist/providers/openai.cjs.map +1 -1
  43. package/dist/providers/openai.d.cts +1 -1
  44. package/dist/providers/openai.d.ts +1 -1
  45. package/dist/providers/openai.js +3 -3
  46. package/dist/providers/openrouter.cjs +1 -0
  47. package/dist/providers/openrouter.cjs.map +1 -1
  48. package/dist/providers/openrouter.d.cts +1 -1
  49. package/dist/providers/openrouter.d.ts +1 -1
  50. package/dist/providers/openrouter.js +4 -4
  51. package/dist/testing.cjs +1 -0
  52. package/dist/testing.cjs.map +1 -1
  53. package/dist/testing.js +1 -1
  54. package/dist/{types-D6VJJo1x.d.ts → types-9Jv8eHhM.d.ts} +8 -1
  55. package/dist/{types-B4TWRzUY.d.cts → types-D3MemVmM.d.cts} +8 -1
  56. package/dist/usagetap/index.d.cts +1 -1
  57. package/dist/usagetap/index.d.ts +1 -1
  58. package/package.json +1 -1
  59. package/dist/chunk-VOXMOGU5.js.map +0 -1
  60. package/dist/chunk-YLJGWVZ6.js.map +0 -1
  61. /package/dist/{chunk-6ICAKKV3.js.map → chunk-46Z64RVO.js.map} +0 -0
  62. /package/dist/{chunk-DAJMCV4F.js.map → chunk-7XLJOH2K.js.map} +0 -0
  63. /package/dist/{chunk-CGBEKODU.js.map → chunk-IGLKVT74.js.map} +0 -0
  64. /package/dist/{chunk-A2VPKL4X.js.map → chunk-QVJTND5A.js.map} +0 -0
  65. /package/dist/{chunk-XSSET4QN.js.map → chunk-UULXO5I6.js.map} +0 -0
  66. /package/dist/{chunk-DA2NSBIN.js.map → chunk-VUQEB5ML.js.map} +0 -0
package/README.md CHANGED
@@ -219,14 +219,16 @@ result = await kit.renderPrompt({
219
219
  });
220
220
  if (!result.request) throw new Error(result.returnMessage ?? 'Prompt rendering failed.');
221
221
 
222
- // LLMAsAService — OpenAI-compatible gateway with project and customer metadata
222
+ // LLMAsAService — OpenAI-compatible gateway with bearer auth and customer metadata
223
223
  result = await kit.renderPrompt({
224
224
  path: 'hello',
225
225
  provider: 'llmasaservice',
226
+ llmasaservice: {
227
+ apiKey: process.env.LLM_GATEWAY_API_KEY!,
228
+ },
226
229
  runtime: {
227
230
  provider_options: {
228
231
  llmasaservice: {
229
- project_id: process.env.LLM_GATEWAY_PROJECT_ID,
230
232
  customer: { customer_id: 'cust_123', customer_name: 'Acme' },
231
233
  },
232
234
  },
@@ -235,7 +237,7 @@ result = await kit.renderPrompt({
235
237
  });
236
238
  if (!result.request) throw new Error(result.returnMessage ?? 'Prompt rendering failed.');
237
239
  // result.request.body → { model, messages, customer, ... }
238
- // result.request.headers → { 'x-project-id': '...' }
240
+ // result.request.headers → { Authorization: 'Bearer ...' }
239
241
  ```
240
242
 
241
243
  Provider adapters are also available as direct imports:
@@ -341,7 +343,7 @@ TOON preprocessing uses a local encode-only implementation inspired by the MIT-l
341
343
 
342
344
  See [Compression and Compaction](./docs/compression.md) for complete examples and token-savings reporting.
343
345
 
344
- Use `provider_options` when PromptOpsKit has a known provider-specific mapping, such as Anthropic `top_k`, Gemini's native `response_schema`, OpenRouter routing fields, or LLMAsAService gateway routing/customer metadata.
346
+ Use `provider_options` when PromptOpsKit has a known provider-specific mapping, such as Anthropic `top_k`, Gemini's native `response_schema`, OpenRouter routing fields, or LLMAsAService customer/conversation metadata.
345
347
 
346
348
  ```yaml
347
349
  response:
@@ -359,14 +361,13 @@ provider_options:
359
361
  order: ["anthropic", "openai"]
360
362
  transforms: ["middle-out"]
361
363
  llmasaservice:
362
- project_id: "llm-project-id"
363
364
  # Optional default; usually pass the real customer at render time.
364
365
  customer:
365
366
  customer_id: "cust_123"
366
367
  customer_name: "Acme"
367
368
  ```
368
369
 
369
- For LLMAsAService, `provider_options.llmasaservice.customer` is intended to be render-time attribution for the current account/user. A prompt can keep a default, but production calls should normally override it through `runtime.provider_options.llmasaservice.customer`.
370
+ For LLMAsAService, pass the gateway credential through the render-time `llmasaservice.apiKey` option; the adapter emits it as an `Authorization: Bearer ...` header. `provider_options.llmasaservice.customer` is intended to be render-time attribution for the current account/user. A prompt can keep a default, but production calls should normally override it through `runtime.provider_options.llmasaservice.customer`. A project id is no longer required.
370
371
 
371
372
  When a provider adds a body field PromptOpsKit does not model yet, use `raw`:
372
373
 
@@ -689,6 +690,7 @@ Renders a prompt for a specific provider. Returns `{ resolved, request?, returnM
689
690
  | `toolRegistry` | `Record<string, unknown>` | Tool definitions for resolving string tool references |
690
691
  | `strict` | `boolean` | Fail on missing variables except object-form inputs marked `optional: true` |
691
692
  | `openaiResponses` | `object` | Optional Responses API extras (`previous_response_id`, `conversation`, `instructions`, `parallel_tool_calls`, `max_tool_calls`, `store`, `metadata`, `include`, `background`) |
693
+ | `llmasaservice` | `object` | Required LLMAsAService gateway credentials (`apiKey`) when using that provider |
692
694
  | `theTokenCompany` | `object` | Optional compression settings (`apiKey`, `baseURL`, `fetch`) used when `compression.thetokencompany.enabled: true` |
693
695
 
694
696
  Use `compressionSummary.tokensSaved` for a lightweight operation-level aggregate across compression and compaction steps. Use `compression` for the detailed per-step breakdown.
package/SKILL.md CHANGED
@@ -269,8 +269,8 @@ import {
269
269
  } from 'promptopskit/llmasaservice';
270
270
 
271
271
  const client = new OpenAI(createLLMAsAServiceOpenAIConfig({
272
+ apiKey: process.env.LLM_GATEWAY_API_KEY!,
272
273
  baseURL: process.env.LLM_GATEWAY_BASE_URL,
273
- projectId: process.env.LLM_GATEWAY_PROJECT_ID,
274
274
  }));
275
275
 
276
276
  const result = await llmasaserviceAdapter.renderPrompt(
@@ -278,10 +278,12 @@ const result = await llmasaserviceAdapter.renderPrompt(
278
278
  path: 'support/triage-summary',
279
279
  },
280
280
  {
281
+ llmasaservice: {
282
+ apiKey: process.env.LLM_GATEWAY_API_KEY!,
283
+ },
281
284
  runtime: {
282
285
  provider_options: {
283
286
  llmasaservice: {
284
- project_id: process.env.LLM_GATEWAY_PROJECT_ID,
285
287
  customer: {
286
288
  customer_id: customer.id,
287
289
  customer_name: customer.name,
@@ -772,14 +774,13 @@ provider_options:
772
774
  order: ["anthropic", "openai"]
773
775
  transforms: ["middle-out"]
774
776
  llmasaservice:
775
- project_id: llm-project-id
776
777
  # Optional default; usually pass the real customer at render time.
777
778
  customer:
778
779
  customer_id: cust_123
779
780
  customer_name: Acme
780
781
  ```
781
782
 
782
- For LLMAsAService, prefer putting the current customer/account/user attribution in `runtime.provider_options.llmasaservice.customer` during rendering. Static prompt metadata may include a default, but runtime values should override it for real requests.
783
+ For LLMAsAService, pass the server-owned gateway credential through `llmasaservice.apiKey`; the adapter emits `Authorization: Bearer <api-key>`. Prefer putting the current customer/account/user attribution in `runtime.provider_options.llmasaservice.customer` during rendering. Static prompt metadata may include a default, but runtime values should override it for real requests. Do not require or generate a project id.
783
784
 
784
785
  Use `raw` only when a vendor request-body field is important and PromptOpsKit does not model it yet:
785
786
 
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  loadPromptFile,
3
3
  parsePrompt
4
- } from "./chunk-VOXMOGU5.js";
4
+ } from "./chunk-ALBSFXYR.js";
5
5
 
6
6
  // src/renderer/interpolate.ts
7
7
  var VARIABLE_RE = /\{\{\s*([a-zA-Z_][a-zA-Z0-9_]*)(?:\s*\|\s*(compress|toon|compact|code))?\s*\}\}/g;
@@ -1897,4 +1897,4 @@ export {
1897
1897
  withPromptInputSupport,
1898
1898
  applyRawProviderBody
1899
1899
  };
1900
- //# sourceMappingURL=chunk-6ICAKKV3.js.map
1900
+ //# sourceMappingURL=chunk-46Z64RVO.js.map
@@ -1,11 +1,11 @@
1
1
  import {
2
2
  openaiAdapter
3
- } from "./chunk-CGBEKODU.js";
3
+ } from "./chunk-IGLKVT74.js";
4
4
  import {
5
5
  applyRawProviderBody,
6
6
  resolveAssetForProvider,
7
7
  withPromptInputSupport
8
- } from "./chunk-6ICAKKV3.js";
8
+ } from "./chunk-46Z64RVO.js";
9
9
 
10
10
  // src/providers/openrouter.ts
11
11
  var openrouterAdapter = withPromptInputSupport({
@@ -58,4 +58,4 @@ var openrouterAdapter = withPromptInputSupport({
58
58
  export {
59
59
  openrouterAdapter
60
60
  };
61
- //# sourceMappingURL=chunk-DAJMCV4F.js.map
61
+ //# sourceMappingURL=chunk-7XLJOH2K.js.map
@@ -78,6 +78,7 @@ var LLMAsAServiceCustomerSchema = z.object({
78
78
  });
79
79
  var LLMAsAServiceProviderOptionsSchema = z.object({
80
80
  base_url: z.string().url().optional(),
81
+ // Deprecated compatibility fields; the gateway no longer requires project routing.
81
82
  project_id: z.string().optional(),
82
83
  customer: LLMAsAServiceCustomerSchema.optional(),
83
84
  conversationId: z.string().optional(),
@@ -831,4 +832,4 @@ export {
831
832
  parsePrompt,
832
833
  loadPromptFile
833
834
  };
834
- //# sourceMappingURL=chunk-VOXMOGU5.js.map
835
+ //# sourceMappingURL=chunk-ALBSFXYR.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/schema/schema.ts","../src/parser/sections.ts","../src/parser/parser.ts","../src/parser/frontmatter-guard.ts","../src/parser/loader.ts","../src/parser/response-schema-ref.ts"],"sourcesContent":["import { z } from 'zod';\n\n// --- Tool definitions ---\n\nexport const InlineToolDefSchema = z.object({\n name: z.string(),\n description: z.string().optional(),\n input_schema: z.record(z.unknown()).optional(),\n});\n\nexport type InlineToolDef = z.infer<typeof InlineToolDefSchema>;\n\nexport const ToolRefSchema = z.union([z.string(), InlineToolDefSchema]);\n\n// --- MCP ---\n\nexport const MCPServerRefSchema = z.union([\n z.string(),\n z.object({\n name: z.string(),\n config: z.record(z.unknown()).optional(),\n }),\n]);\n\nexport type MCPServerRef = z.infer<typeof MCPServerRefSchema>;\n\n// --- Reasoning ---\n\nexport const ReasoningSchema = z.object({\n effort: z.enum(['low', 'medium', 'high']).optional(),\n budget_tokens: z.number().int().positive().optional(),\n});\n\n// --- Sampling ---\n\nexport const SamplingSchema = z.object({\n temperature: z.number().min(0).max(2).optional(),\n top_p: z.number().min(0).max(1).optional(),\n frequency_penalty: z.number().optional(),\n presence_penalty: z.number().optional(),\n stop: z.array(z.string()).optional(),\n max_output_tokens: z.number().int().positive().optional(),\n});\n\n// --- Response ---\n\nexport const ResponseSchema = z.object({\n format: z.enum(['text', 'json', 'markdown']).optional(),\n stream: z.boolean().optional(),\n schema: z.record(z.unknown()).optional(),\n schema_ref: z.string().min(1).optional(),\n schema_source: z.object({\n mode: z.enum(['inline', 'schema_ref_json', 'schema_ref_zod_module']).optional(),\n ref: z.string().optional(),\n resolved_path: z.string().optional(),\n hash: z.string().optional(),\n }).optional(),\n schema_name: z.string().optional(),\n schema_description: z.string().optional(),\n schema_strict: z.boolean().optional(),\n});\n\nexport const ResponseSchemaWithValidation = ResponseSchema.superRefine((value, ctx) => {\n if (value.schema !== undefined && value.schema_ref !== undefined) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: 'response.schema and response.schema_ref are mutually exclusive',\n path: ['schema_ref'],\n });\n }\n});\n\n\n// --- Provider-specific options ---\n\nexport const AnthropicProviderOptionsSchema = z.object({\n top_k: z.number().int().min(0).optional(),\n tool_choice: z.record(z.unknown()).optional(),\n output_config: z.record(z.unknown()).optional(),\n});\n\nexport const GeminiProviderOptionsSchema = z.object({\n candidate_count: z.number().int().positive().optional(),\n top_k: z.number().int().min(0).optional(),\n seed: z.number().int().optional(),\n response_schema: z.record(z.unknown()).optional(),\n response_json_schema: z.record(z.unknown()).optional(),\n response_modalities: z.array(z.string()).optional(),\n thinking_budget_tokens: z.number().int().positive().optional(),\n});\n\nexport const OpenRouterProviderOptionsSchema = z.object({\n provider: z.record(z.unknown()).optional(),\n transforms: z.array(z.string()).optional(),\n plugins: z.array(z.record(z.unknown())).optional(),\n models: z.array(z.string()).optional(),\n});\n\nexport const LLMAsAServiceCustomerSchema = z.object({\n customer_id: z.string(),\n customer_name: z.string().optional(),\n customer_user_id: z.string().optional(),\n customer_user_name: z.string().optional(),\n customer_user_email: z.string().optional(),\n});\n\nexport const LLMAsAServiceProviderOptionsSchema = z.object({\n base_url: z.string().url().optional(),\n // Deprecated compatibility fields; the gateway no longer requires project routing.\n project_id: z.string().optional(),\n customer: LLMAsAServiceCustomerSchema.optional(),\n conversationId: z.string().optional(),\n conversationTitle: z.string().optional(),\n projectId: z.string().optional(),\n});\n\nexport const ProviderOptionsSchema = z.object({\n anthropic: AnthropicProviderOptionsSchema.optional(),\n gemini: GeminiProviderOptionsSchema.optional(),\n openrouter: OpenRouterProviderOptionsSchema.optional(),\n llmasaservice: LLMAsAServiceProviderOptionsSchema.optional(),\n});\n\nexport type ProviderOptions = z.infer<typeof ProviderOptionsSchema>;\n\n// --- Raw provider body passthrough ---\n\nexport const RawProviderBodySchema = z.object({\n openai: z.record(z.unknown()).optional(),\n 'openai-responses': z.record(z.unknown()).optional(),\n openai_responses: z.record(z.unknown()).optional(),\n anthropic: z.record(z.unknown()).optional(),\n gemini: z.record(z.unknown()).optional(),\n google: z.record(z.unknown()).optional(),\n openrouter: z.record(z.unknown()).optional(),\n llmasaservice: z.record(z.unknown()).optional(),\n});\n\nexport type RawProviderBody = z.infer<typeof RawProviderBodySchema>;\n\n// --- Prompt compression ---\n\nexport const TheTokenCompanyCompressionSchema = z.object({\n enabled: z.boolean().optional(),\n model: z.string().min(1).optional(),\n aggressiveness: z.number().min(0).max(1).optional(),\n});\n\nexport const HeuristicCompressionSchema = z.object({\n enabled: z.boolean().optional(),\n min_tokens: z.number().int().positive().optional(),\n max_sentences: z.number().int().positive().optional(),\n target_reduction: z.number().min(0).max(1).optional(),\n query: z.string().optional(),\n query_variable: z.string().min(1).optional(),\n json_to_toon: z.boolean().optional(),\n mode: z.enum(['conservative', 'balanced']).optional(),\n preserve_neighbors: z.boolean().optional(),\n fail_on_low_confidence: z.boolean().optional(),\n});\n\nexport const CodeCompactionSchema = z.object({\n enabled: z.boolean().optional(),\n remove_comments: z.boolean().optional(),\n trim_indentation: z.boolean().optional(),\n collapse_blank_lines: z.boolean().optional(),\n});\n\nexport const CompressionSchema = z.object({\n thetokencompany: TheTokenCompanyCompressionSchema.optional(),\n heuristic: HeuristicCompressionSchema.optional(),\n code: CodeCompactionSchema.optional(),\n});\n\nexport type Compression = z.infer<typeof CompressionSchema>;\nexport type TheTokenCompanyCompression = z.infer<typeof TheTokenCompanyCompressionSchema>;\nexport type HeuristicCompression = z.infer<typeof HeuristicCompressionSchema>;\nexport type CodeCompaction = z.infer<typeof CodeCompactionSchema>;\n\n// --- Cache controls ---\n\nexport const OpenAICacheSchema = z.object({\n prompt_cache_key: z.string().min(1).optional(),\n retention: z.enum(['in_memory', '24h']).optional(),\n});\n\nexport const AnthropicCacheSchema = z.object({\n mode: z.enum(['automatic', 'explicit']).optional(),\n type: z.literal('ephemeral').optional(),\n ttl: z.enum(['5m', '1h']).optional(),\n cache_system_instructions: z.boolean().optional(),\n cache_tools: z.boolean().optional(),\n cache_prompt_template: z.boolean().optional(),\n});\n\nexport const GeminiCacheSchema = z.object({\n cached_content: z.string().min(1).optional(),\n});\n\nexport const CacheSchema = z.object({\n openai: OpenAICacheSchema.optional(),\n anthropic: AnthropicCacheSchema.optional(),\n gemini: GeminiCacheSchema.optional(),\n google: GeminiCacheSchema.optional(),\n});\n\n// --- Context ---\n\nexport const HistorySchema = z.object({\n max_items: z.number().int().positive().optional(),\n});\n\nexport const ContextRegexSchema = z.union([\n z.string(),\n z.object({\n pattern: z.string(),\n flags: z.string().optional(),\n return_message: z.string().optional(),\n }),\n]);\n\nexport const ContextBuiltInValidatorSchema = z.union([\n z.boolean(),\n z.object({\n return_message: z.string().optional(),\n }),\n]);\n\nexport const ContextInputCompressionSchema = z.union([\n z.literal('heuristic'),\n z.literal('code'),\n z.object({\n heuristic: HeuristicCompressionSchema.optional(),\n code: CodeCompactionSchema.optional(),\n }),\n]);\n\nexport const ContextInputDefinitionObjectSchema = z.object({\n name: z.string(),\n optional: z.boolean().optional(),\n warnings: z.boolean().optional(),\n max_size: z.number().int().positive().optional(),\n trim: z.union([z.boolean(), z.enum(['start', 'end', 'both'])]).optional(),\n compression: ContextInputCompressionSchema.optional(),\n allow_regex: ContextRegexSchema.optional(),\n deny_regex: ContextRegexSchema.optional(),\n non_empty: ContextBuiltInValidatorSchema.optional(),\n reject_secrets: ContextBuiltInValidatorSchema.optional(),\n});\n\nexport const ContextInputDefinitionSchema = z.union([\n z.string(),\n ContextInputDefinitionObjectSchema,\n]);\n\nexport type ContextInputDefinition = z.infer<typeof ContextInputDefinitionSchema>;\nexport type ContextInputCompression = z.infer<typeof ContextInputCompressionSchema>;\nexport type ContextRegexDefinition = z.infer<typeof ContextRegexSchema>;\nexport type ContextBuiltInValidatorDefinition = z.infer<typeof ContextBuiltInValidatorSchema>;\n\nexport const ContextSchema = z.object({\n inputs: z.array(ContextInputDefinitionSchema).optional(),\n history: HistorySchema.optional(),\n});\n\n// --- Metadata ---\n\nexport const MetadataSchema = z.object({\n owner: z.string().optional(),\n tags: z.array(z.string()).optional(),\n review_required: z.boolean().optional(),\n stable: z.boolean().optional(),\n});\n\n// --- MCP block ---\n\nexport const MCPSchema = z.object({\n servers: z.array(MCPServerRefSchema).optional(),\n});\n\n// --- Overrides (subset allowed in environments/tiers) ---\n\nexport const PromptAssetOverridesSchema = z.object({\n model: z.string().optional(),\n fallback_models: z.array(z.string()).optional(),\n reasoning: ReasoningSchema.optional(),\n sampling: SamplingSchema.optional(),\n response: ResponseSchemaWithValidation.optional(),\n compression: CompressionSchema.optional(),\n cache: CacheSchema.optional(),\n raw: RawProviderBodySchema.optional(),\n tools: z.array(ToolRefSchema).optional(),\n provider_options: ProviderOptionsSchema.optional(),\n});\n\nexport type PromptAssetOverrides = z.infer<typeof PromptAssetOverridesSchema>;\n\n// --- Source tracking ---\n\nexport const SourceSchema = z.object({\n file_path: z.string().optional(),\n checksum: z.string().optional(),\n});\n\n// --- Sections (populated by parser) ---\n\nexport const SectionsSchema = z.object({\n system_instructions: z.string().optional(),\n prompt_template: z.string().optional(),\n notes: z.string().optional(),\n});\n\n// --- Defaults files (folder-level inheritance) ---\n\nexport const PromptDefaultsSchema = z.object({\n provider: z.enum(['openai', 'openai-responses', 'anthropic', 'google', 'gemini', 'openrouter', 'llmasaservice', 'any']).optional(),\n model: z.string().optional(),\n fallback_models: z.array(z.string()).optional(),\n reasoning: ReasoningSchema.optional(),\n sampling: SamplingSchema.optional(),\n response: ResponseSchema.optional(),\n compression: CompressionSchema.optional(),\n cache: CacheSchema.optional(),\n raw: RawProviderBodySchema.optional(),\n tools: z.array(ToolRefSchema).optional(),\n provider_options: ProviderOptionsSchema.optional(),\n mcp: MCPSchema.optional(),\n context: ContextSchema.optional(),\n includes: z.array(z.string()).optional(),\n environments: z.record(PromptAssetOverridesSchema).optional(),\n tiers: z.record(PromptAssetOverridesSchema).optional(),\n metadata: MetadataSchema.optional(),\n sections: z.object({\n system_instructions: z.string().optional(),\n }).optional(),\n});\n\nexport type PromptDefaults = z.infer<typeof PromptDefaultsSchema>;\n\n// --- Top-level PromptAsset ---\n\nexport const PromptAssetSchema = z.object({\n id: z.string(),\n schema_version: z.number().int().positive().default(1),\n description: z.string().optional(),\n\n provider: z.enum(['openai', 'openai-responses', 'anthropic', 'google', 'gemini', 'openrouter', 'llmasaservice', 'any']).optional(),\n model: z.string().optional(),\n fallback_models: z.array(z.string()).optional(),\n\n reasoning: ReasoningSchema.optional(),\n sampling: SamplingSchema.optional(),\n response: ResponseSchemaWithValidation.optional(),\n compression: CompressionSchema.optional(),\n cache: CacheSchema.optional(),\n raw: RawProviderBodySchema.optional(),\n\n tools: z.array(ToolRefSchema).optional(),\n provider_options: ProviderOptionsSchema.optional(),\n mcp: MCPSchema.optional(),\n\n context: ContextSchema.optional(),\n\n includes: z.array(z.string()).optional(),\n\n environments: z.record(PromptAssetOverridesSchema).optional(),\n tiers: z.record(PromptAssetOverridesSchema).optional(),\n\n metadata: MetadataSchema.optional(),\n\n // Populated by parser, not authored in YAML\n sections: SectionsSchema.optional(),\n source: SourceSchema.optional(),\n});\n\nexport type PromptAsset = z.infer<typeof PromptAssetSchema>;\n\n// --- Resolved asset (after includes, overrides applied) ---\n\nexport interface ResolvedPromptAsset extends PromptAsset {\n sections: {\n system_instructions?: string;\n prompt_template?: string;\n notes?: string;\n };\n source: {\n file_path?: string;\n checksum?: string;\n };\n}\n","export interface Sections {\n system_instructions?: string;\n prompt_template?: string;\n notes?: string;\n}\n\nconst SECTION_MAP: Record<string, keyof Sections> = {\n 'system instructions': 'system_instructions',\n 'prompt template': 'prompt_template',\n 'notes': 'notes',\n};\n\n/**\n * Extract named sections from the markdown body using H1 headings.\n * Case-insensitive. H2+ within a section is treated as content.\n * If no H1 headings are found, the entire body is treated as prompt_template.\n */\nexport function extractSections(body: string): Sections {\n const lines = body.split(/\\r?\\n/);\n const sections: Sections = {};\n\n let currentKey: keyof Sections | null = null;\n let currentLines: string[] = [];\n let foundAnyH1 = false;\n\n for (const line of lines) {\n const h1Match = line.match(/^#\\s+(.+)$/);\n if (h1Match) {\n // Flush previous section\n if (currentKey) {\n sections[currentKey] = currentLines.join('\\n').trim();\n }\n\n foundAnyH1 = true;\n const heading = h1Match[1].trim().toLowerCase();\n currentKey = SECTION_MAP[heading] ?? null;\n currentLines = [];\n } else {\n currentLines.push(line);\n }\n }\n\n // Flush last section\n if (currentKey) {\n sections[currentKey] = currentLines.join('\\n').trim();\n }\n\n // If no H1 headings found, treat entire body as prompt_template\n if (!foundAnyH1) {\n const trimmed = body.trim();\n if (trimmed) {\n sections.prompt_template = trimmed;\n }\n }\n\n return sections;\n}\n","import matter from 'gray-matter';\nimport { PromptAssetSchema } from '../schema/index.js';\nimport type { PromptAsset } from '../schema/index.js';\nimport { assertRegexFrontMatterQuoting } from './frontmatter-guard.js';\nimport { extractSections } from './sections.js';\n\nexport interface ParseResult {\n asset: PromptAsset;\n raw: {\n frontMatter: Record<string, unknown>;\n body: string;\n };\n}\n\n/**\n * Parse a prompt markdown string (YAML front matter + markdown body)\n * into a validated PromptAsset.\n */\nexport function parsePrompt(content: string, filePath?: string): ParseResult {\n assertRegexFrontMatterQuoting(content, filePath);\n const { data: frontMatter, content: body } = matter(content);\n\n const sections = extractSections(body);\n\n const raw = {\n ...frontMatter,\n sections,\n source: filePath ? { file_path: filePath } : undefined,\n };\n\n const asset = PromptAssetSchema.parse(raw);\n\n return {\n asset,\n raw: {\n frontMatter: frontMatter as Record<string, unknown>,\n body,\n },\n };\n}\n","const FRONT_MATTER_DELIMITER = /^---[ \\t]*$/;\nconst REGEX_FIELD = /^(?<indent>\\s*)(?<field>allow_regex|deny_regex)\\s*:\\s*(?<value>.*)$/;\nconst PATTERN_FIELD = /^(?<indent>\\s*)pattern\\s*:\\s*(?<value>.*)$/;\nconst INLINE_PATTERN_FIELD = /(?:^|[{,]\\s*)pattern\\s*:\\s*(?<value>\"(?:\\\\.|[^\"\\\\])*\")/;\n\ninterface PendingRegexField {\n field: string;\n indent: number;\n}\n\nexport function assertRegexFrontMatterQuoting(content: string, filePath?: string): void {\n const frontMatter = extractFrontMatter(content);\n if (!frontMatter) {\n return;\n }\n\n let pendingRegex: PendingRegexField | undefined;\n\n for (const [index, line] of frontMatter.lines.entries()) {\n const lineNumber = frontMatter.startLine + index;\n const regexMatch = line.match(REGEX_FIELD);\n\n if (regexMatch?.groups) {\n const field = regexMatch.groups.field;\n const indent = regexMatch.groups.indent.length;\n const value = regexMatch.groups.value.trim();\n pendingRegex = value === '' ? { field, indent } : undefined;\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(value, field, filePath, lineNumber);\n assertNoUnescapedBackslashInInlinePattern(value, field, filePath, lineNumber);\n continue;\n }\n\n if (!pendingRegex) {\n continue;\n }\n\n if (line.trim() === '' || line.trimStart().startsWith('#')) {\n continue;\n }\n\n const indent = line.match(/^\\s*/)?.[0].length ?? 0;\n if (indent <= pendingRegex.indent) {\n pendingRegex = undefined;\n continue;\n }\n\n const patternMatch = line.match(PATTERN_FIELD);\n if (!patternMatch?.groups) {\n continue;\n }\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(\n patternMatch.groups.value.trim(),\n `${pendingRegex.field}.pattern`,\n filePath,\n lineNumber,\n );\n }\n}\n\nfunction assertNoUnescapedBackslashInInlinePattern(\n value: string,\n field: string,\n filePath: string | undefined,\n lineNumber: number,\n): void {\n const match = value.match(INLINE_PATTERN_FIELD);\n const pattern = match?.groups?.value;\n if (!pattern) {\n return;\n }\n\n assertNoUnescapedBackslashInDoubleQuotedRegex(pattern, `${field}.pattern`, filePath, lineNumber);\n}\n\nfunction extractFrontMatter(content: string): { lines: string[]; startLine: number } | undefined {\n const lines = content.split(/\\r?\\n/);\n if (!FRONT_MATTER_DELIMITER.test(lines[0] ?? '')) {\n return undefined;\n }\n\n for (let index = 1; index < lines.length; index += 1) {\n if (FRONT_MATTER_DELIMITER.test(lines[index] ?? '')) {\n return {\n lines: lines.slice(1, index),\n startLine: 2,\n };\n }\n }\n\n return undefined;\n}\n\nfunction assertNoUnescapedBackslashInDoubleQuotedRegex(\n value: string,\n field: string,\n filePath: string | undefined,\n lineNumber: number,\n): void {\n if (!value.startsWith('\"')) {\n return;\n }\n\n const quoted = readDoubleQuotedScalar(value);\n if (!quoted) {\n return;\n }\n\n if (!hasUnescapedBackslash(quoted)) {\n return;\n }\n\n const location = filePath ? `${filePath}:${lineNumber}` : `line ${lineNumber}`;\n throw new Error(\n `POK013: Invalid context regex YAML at ${location}, field \"${field}\": `\n + 'double-quoted regex strings treat backslashes as YAML escapes. '\n + 'Use unquoted /pattern/i literal form, single quotes, or double each backslash.',\n );\n}\n\nfunction readDoubleQuotedScalar(value: string): string | undefined {\n let result = '';\n\n for (let index = 1; index < value.length; index += 1) {\n const char = value[index];\n\n if (char === '\"') {\n return result;\n }\n\n result += char;\n\n if (char === '\\\\' && index + 1 < value.length) {\n index += 1;\n result += value[index];\n }\n }\n\n return undefined;\n}\n\nfunction hasUnescapedBackslash(value: string): boolean {\n for (let index = 0; index < value.length; index += 1) {\n if (value[index] !== '\\\\') {\n continue;\n }\n\n let count = 1;\n while (value[index + count] === '\\\\') {\n count += 1;\n }\n\n if (count % 2 === 1) {\n return true;\n }\n\n index += count - 1;\n }\n\n return false;\n}\n","import { readFile } from 'node:fs/promises';\nimport { dirname, join, relative, resolve } from 'node:path';\nimport matter from 'gray-matter';\nimport { parsePrompt } from './parser.js';\nimport type { ParseResult } from './parser.js';\nimport { extractSections } from './sections.js';\nimport { PromptDefaultsSchema } from '../schema/index.js';\nimport type { PromptDefaults } from '../schema/index.js';\nimport { resolveResponseSchemaRef } from './response-schema-ref.js';\n\nconst DEFAULTS_FILE_NAME = 'defaults.md';\n\nexport interface LoadPromptOptions {\n /**\n * Optional boundary directory for defaults discovery.\n * If provided, defaults are loaded from this directory down to the prompt directory.\n */\n defaultsRoot?: string;\n}\n\n/**\n * Load and parse a prompt file from disk.\n */\nexport async function loadPromptFile(filePath: string, options: LoadPromptOptions = {}): Promise<ParseResult> {\n const content = await readFile(filePath, 'utf-8');\n const parsed = parsePrompt(content, filePath);\n // Default the boundary to the file's own directory so traversal never\n // walks above the prompt tree when no explicit root is provided.\n const root = options.defaultsRoot ?? dirname(filePath);\n const defaults = await loadDefaultsForPath(filePath, root);\n const withDefaults = applyDefaults(parsed.asset, defaults);\n const resolved = await resolveResponseSchemaRef(withDefaults, filePath);\n const asset = (resolved.response?.schema !== undefined && !resolved.response?.schema_source)\n ? {\n ...resolved,\n response: {\n ...resolved.response,\n schema_source: { mode: 'inline' as const },\n },\n }\n : resolved;\n\n return {\n ...parsed,\n asset,\n };\n}\n\nasync function loadDefaultsForPath(filePath: string, defaultsRoot?: string): Promise<PromptDefaults> {\n const directories = getDirectoriesToCheck(filePath, defaultsRoot);\n let merged: PromptDefaults = {};\n\n for (const dir of directories) {\n const defaultsPath = join(dir, DEFAULTS_FILE_NAME);\n try {\n const defaultsContent = await readFile(defaultsPath, 'utf-8');\n const defaults = normalizeDefaultIncludes(parseDefaults(defaultsContent), defaultsPath, filePath);\n merged = mergeDefaults(merged, defaults);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n }\n\n return merged;\n}\n\nfunction getDirectoriesToCheck(filePath: string, defaultsRoot?: string): string[] {\n const dirs: string[] = [];\n let current = resolve(dirname(filePath));\n const boundary = defaultsRoot ? resolve(defaultsRoot) : undefined;\n\n while (true) {\n dirs.unshift(current);\n if ((boundary && current === boundary) || current === dirname(current)) {\n break;\n }\n current = dirname(current);\n }\n\n return dirs;\n}\n\nfunction parseDefaults(content: string): PromptDefaults {\n const { data: frontMatter, content: body } = matter(content);\n const sections = extractSections(body);\n\n return PromptDefaultsSchema.parse({\n ...frontMatter,\n sections: {\n system_instructions: sections.system_instructions,\n },\n });\n}\n\nfunction mergeDefaults(base: PromptDefaults, local: PromptDefaults): PromptDefaults {\n return {\n provider: local.provider ?? base.provider,\n model: local.model ?? base.model,\n fallback_models: local.fallback_models ?? base.fallback_models,\n reasoning: mergeRecordBlock(base.reasoning, local.reasoning),\n sampling: mergeRecordBlock(base.sampling, local.sampling),\n response: mergeRecordBlock(base.response, local.response),\n compression: mergeCompression(base.compression, local.compression),\n cache: mergeCache(base.cache, local.cache),\n raw: mergeRaw(base.raw, local.raw),\n tools: local.tools ?? base.tools,\n provider_options: mergeProviderOptions(base.provider_options, local.provider_options),\n mcp: mergeMcp(base.mcp, local.mcp),\n context: mergeContext(base.context, local.context),\n includes: local.includes ?? base.includes,\n environments: mergeOverrideMap(base.environments, local.environments),\n tiers: mergeOverrideMap(base.tiers, local.tiers),\n metadata: {\n ...(base.metadata ?? {}),\n ...(local.metadata ?? {}),\n },\n sections: {\n ...(base.sections ?? {}),\n ...(local.sections ?? {}),\n },\n };\n}\n\nfunction applyDefaults(asset: ParseResult['asset'], defaults: PromptDefaults): ParseResult['asset'] {\n const compression = mergeCompression(defaults.compression, asset.compression);\n const cache = mergeCache(defaults.cache, asset.cache);\n const raw = mergeRaw(defaults.raw, asset.raw);\n const providerOptions = mergeProviderOptions(defaults.provider_options, asset.provider_options);\n const reasoning = mergeRecordBlock(defaults.reasoning, asset.reasoning);\n const sampling = mergeRecordBlock(defaults.sampling, asset.sampling);\n const response = mergeRecordBlock(defaults.response, asset.response);\n const mcp = mergeMcp(defaults.mcp, asset.mcp);\n const context = mergeContext(defaults.context, asset.context);\n const environments = mergeOverrideMap(defaults.environments, asset.environments);\n const tiers = mergeOverrideMap(defaults.tiers, asset.tiers);\n const hasDefaultMetadata = defaults.metadata && Object.keys(defaults.metadata).length > 0;\n const hasDefaultSystem = !!defaults.sections?.system_instructions;\n const hasDefaultScalars = defaults.provider !== undefined\n || defaults.model !== undefined\n || defaults.fallback_models !== undefined\n || defaults.tools !== undefined\n || defaults.includes !== undefined;\n const hasDefaultObjects = compression !== undefined\n || cache !== undefined\n || raw !== undefined\n || providerOptions !== undefined\n || reasoning !== undefined\n || sampling !== undefined\n || response !== undefined\n || mcp !== undefined\n || context !== undefined\n || environments !== undefined\n || tiers !== undefined;\n\n // Short-circuit: nothing to merge\n if (!hasDefaultMetadata && !hasDefaultSystem && !hasDefaultScalars && !hasDefaultObjects) {\n return asset;\n }\n\n const mergedMetadata = {\n ...(defaults.metadata ?? {}),\n ...(asset.metadata ?? {}),\n };\n const metadata = Object.keys(mergedMetadata).length > 0 ? mergedMetadata : undefined;\n\n const systemInstructions = asset.sections?.system_instructions ?? defaults.sections?.system_instructions;\n\n const sections = asset.sections\n ? { ...asset.sections, system_instructions: systemInstructions }\n : systemInstructions\n ? { system_instructions: systemInstructions }\n : undefined;\n\n return {\n ...asset,\n provider: asset.provider ?? defaults.provider,\n model: asset.model ?? defaults.model,\n fallback_models: asset.fallback_models ?? defaults.fallback_models,\n reasoning,\n sampling,\n response,\n compression,\n cache,\n raw,\n tools: asset.tools ?? defaults.tools,\n provider_options: providerOptions,\n mcp,\n context,\n includes: asset.includes ?? defaults.includes,\n environments,\n tiers,\n metadata,\n sections,\n };\n}\n\nfunction normalizeDefaultIncludes(\n defaults: PromptDefaults,\n defaultsPath: string,\n filePath: string,\n): PromptDefaults {\n if (!defaults.includes) return defaults;\n\n const promptDir = dirname(filePath);\n const defaultsDir = dirname(defaultsPath);\n const includes = defaults.includes.map((includePath) => {\n const relativePath = relative(promptDir, resolve(defaultsDir, includePath)).replace(/\\\\/g, '/');\n return relativePath.startsWith('.') ? relativePath : `./${relativePath}`;\n });\n\n return {\n ...defaults,\n includes,\n };\n}\n\nfunction mergeRecordBlock<T extends object>(base: T | undefined, local: T | undefined): T | undefined {\n if (base === undefined) return local;\n if (local === undefined) return base;\n return { ...base, ...local };\n}\n\nfunction mergeMcp(base: PromptDefaults['mcp'], local: PromptDefaults['mcp']): PromptDefaults['mcp'] {\n return mergeRecordBlock(base, local);\n}\n\nfunction mergeContext(base: PromptDefaults['context'], local: PromptDefaults['context']): PromptDefaults['context'] {\n const merged = {\n ...(base ?? {}),\n ...(local ?? {}),\n history: mergeRecordBlock(base?.history, local?.history),\n };\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeCache(base: PromptDefaults['cache'], local: PromptDefaults['cache']): PromptDefaults['cache'] {\n const merged: NonNullable<PromptDefaults['cache']> = {\n ...(base ?? {}),\n ...(local ?? {}),\n openai: {\n ...(base?.openai ?? {}),\n ...(local?.openai ?? {}),\n },\n anthropic: {\n ...(base?.anthropic ?? {}),\n ...(local?.anthropic ?? {}),\n },\n gemini: {\n ...(base?.gemini ?? {}),\n ...(local?.gemini ?? {}),\n },\n google: {\n ...(base?.google ?? {}),\n ...(local?.google ?? {}),\n },\n };\n\n if (merged.openai && Object.keys(merged.openai).length === 0) delete merged.openai;\n if (merged.anthropic && Object.keys(merged.anthropic).length === 0) delete merged.anthropic;\n if (merged.gemini && Object.keys(merged.gemini).length === 0) delete merged.gemini;\n if (merged.google && Object.keys(merged.google).length === 0) delete merged.google;\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeCompression(\n base: PromptDefaults['compression'],\n local: PromptDefaults['compression'],\n): PromptDefaults['compression'] {\n const merged: NonNullable<PromptDefaults['compression']> = {\n ...(base ?? {}),\n ...(local ?? {}),\n thetokencompany: mergeRecordBlock(base?.thetokencompany, local?.thetokencompany),\n heuristic: mergeRecordBlock(base?.heuristic, local?.heuristic),\n code: mergeRecordBlock(base?.code, local?.code),\n };\n\n removeEmptyProviderBlocks(merged);\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeRaw(base: PromptDefaults['raw'], local: PromptDefaults['raw']): PromptDefaults['raw'] {\n const merged: NonNullable<PromptDefaults['raw']> = {\n ...(base ?? {}),\n ...(local ?? {}),\n openai: mergeRecordBlock(base?.openai, local?.openai),\n 'openai-responses': mergeRecordBlock(base?.['openai-responses'], local?.['openai-responses']),\n openai_responses: mergeRecordBlock(base?.openai_responses, local?.openai_responses),\n anthropic: mergeRecordBlock(base?.anthropic, local?.anthropic),\n gemini: mergeRecordBlock(base?.gemini, local?.gemini),\n google: mergeRecordBlock(base?.google, local?.google),\n openrouter: mergeRecordBlock(base?.openrouter, local?.openrouter),\n llmasaservice: mergeRecordBlock(base?.llmasaservice, local?.llmasaservice),\n };\n\n removeEmptyProviderBlocks(merged);\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeProviderOptions(\n base: PromptDefaults['provider_options'],\n local: PromptDefaults['provider_options'],\n): PromptDefaults['provider_options'] {\n const merged: NonNullable<PromptDefaults['provider_options']> = {\n ...(base ?? {}),\n ...(local ?? {}),\n anthropic: mergeRecordBlock(base?.anthropic, local?.anthropic),\n gemini: mergeRecordBlock(base?.gemini, local?.gemini),\n openrouter: mergeRecordBlock(base?.openrouter, local?.openrouter),\n llmasaservice: mergeRecordBlock(base?.llmasaservice, local?.llmasaservice),\n };\n\n removeEmptyProviderBlocks(merged);\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeOverrideMap(\n base: PromptDefaults['environments'],\n local: PromptDefaults['environments'],\n): PromptDefaults['environments'] {\n const merged: NonNullable<PromptDefaults['environments']> = { ...(base ?? {}) };\n\n for (const [name, localOverride] of Object.entries(local ?? {})) {\n merged[name] = mergeOverrideConfig(merged[name], localOverride);\n }\n\n return Object.keys(merged).length > 0 ? merged : undefined;\n}\n\nfunction mergeOverrideConfig(\n base: NonNullable<PromptDefaults['environments']>[string] | undefined,\n local: NonNullable<PromptDefaults['environments']>[string],\n): NonNullable<PromptDefaults['environments']>[string] {\n const merged: NonNullable<PromptDefaults['environments']>[string] = {\n ...(base ?? {}),\n ...local,\n };\n\n const reasoning = mergeRecordBlock(base?.reasoning, local.reasoning);\n const sampling = mergeRecordBlock(base?.sampling, local.sampling);\n const response = mergeRecordBlock(base?.response, local.response);\n const compression = mergeCompression(base?.compression, local.compression);\n const cache = mergeCache(base?.cache, local.cache);\n const raw = mergeRaw(base?.raw, local.raw);\n const providerOptions = mergeProviderOptions(base?.provider_options, local.provider_options);\n\n if (reasoning !== undefined) merged.reasoning = reasoning;\n if (sampling !== undefined) merged.sampling = sampling;\n if (response !== undefined) merged.response = response;\n if (compression !== undefined) merged.compression = compression;\n if (cache !== undefined) merged.cache = cache;\n if (raw !== undefined) merged.raw = raw;\n if (providerOptions !== undefined) merged.provider_options = providerOptions;\n\n return merged;\n}\n\nfunction removeEmptyProviderBlocks<T extends Record<string, unknown>>(value: T): void {\n for (const key of Object.keys(value)) {\n const block = value[key];\n if (block === undefined) {\n delete value[key];\n continue;\n }\n\n if (\n block !== null\n &&\n typeof block === 'object'\n && !Array.isArray(block)\n && Object.keys(block).length === 0\n ) {\n delete value[key];\n }\n }\n}\n","import { readFile } from 'node:fs/promises';\nimport { createHash } from 'node:crypto';\nimport { dirname, extname, resolve } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { z } from 'zod';\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport type { PromptAsset } from '../schema/index.js';\n\nconst SUPPORTED_SCHEMA_REF_EXTENSIONS = new Set(['.json', '.js', '.mjs', '.cjs']);\n\n\nasync function resolveJsonSchemaRef(schemaRef: string, promptFilePath: string): Promise<{ schema: Record<string, unknown>; resolvedPath: string; hash: string }> {\n const resolvedPath = resolve(dirname(promptFilePath), schemaRef);\n let raw: string;\n\n try {\n raw = await readFile(resolvedPath, 'utf-8');\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`POK050: response.schema_ref \"${schemaRef}\" not found (resolved from ${promptFilePath})`);\n }\n throw error;\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(raw);\n } catch {\n throw new Error(`POK050: response.schema_ref \"${schemaRef}\" is not valid JSON`);\n }\n\n if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed)) {\n throw new Error(`POK050: response.schema_ref \"${schemaRef}\" must resolve to a JSON object schema`);\n }\n\n return {\n schema: parsed as Record<string, unknown>,\n resolvedPath,\n hash: createHash('sha256').update(raw).digest('hex'),\n };\n}\n\nasync function resolveZodSchemaRef(schemaRef: string, promptFilePath: string): Promise<{ schema: Record<string, unknown>; resolvedPath: string; hash: string }> {\n const resolvedPath = resolve(dirname(promptFilePath), schemaRef);\n\n let moduleSource: string;\n try {\n moduleSource = await readFile(resolvedPath, 'utf-8');\n } catch (error) {\n const code = (error as NodeJS.ErrnoException).code;\n if (code === 'ENOENT') {\n throw new Error(`POK051: response.schema_ref \"${schemaRef}\" not found (resolved from ${promptFilePath})`);\n }\n throw error;\n }\n\n let imported: unknown;\n try {\n imported = await import(pathToFileURL(resolvedPath).href);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw new Error(`POK051: response.schema_ref \"${schemaRef}\" could not be imported as a module (${message})`);\n }\n\n const mod = imported as Record<string, unknown>;\n const candidate = mod.default ?? mod.schema;\n\n if (!(candidate instanceof z.ZodType)) {\n throw new Error('POK051: zod schema modules must export a Zod schema as default export or named export \"schema\"');\n }\n\n const jsonSchema = zodToJsonSchema(candidate, {\n target: 'jsonSchema7',\n $refStrategy: 'none',\n });\n\n if (!jsonSchema || typeof jsonSchema !== 'object' || Array.isArray(jsonSchema)) {\n throw new Error(`POK051: response.schema_ref \"${schemaRef}\" did not produce a valid JSON schema object`);\n }\n\n return {\n schema: jsonSchema as Record<string, unknown>,\n resolvedPath,\n hash: createHash('sha256').update(moduleSource).digest('hex'),\n };\n}\n\nexport async function resolveResponseSchemaRef(asset: PromptAsset, promptFilePath: string): Promise<PromptAsset> {\n const schemaRef = asset.response?.schema_ref;\n if (!schemaRef) return asset;\n\n const ext = extname(schemaRef).toLowerCase();\n if (!SUPPORTED_SCHEMA_REF_EXTENSIONS.has(ext)) {\n throw new Error(`POK051: response.schema_ref \"${schemaRef}\" has unsupported extension \"${ext}\". Use .json, .js, .mjs, or .cjs`);\n }\n\n const resolved = (ext === '.json')\n ? await resolveJsonSchemaRef(schemaRef, promptFilePath)\n : await resolveZodSchemaRef(schemaRef, promptFilePath);\n\n return {\n ...asset,\n response: {\n ...asset.response,\n schema: resolved.schema,\n schema_ref: undefined,\n schema_source: {\n mode: ext === '.json' ? 'schema_ref_json' : 'schema_ref_zod_module',\n ref: schemaRef,\n resolved_path: resolved.resolvedPath,\n hash: resolved.hash,\n },\n },\n };\n}\n"],"mappings":";AAAA,SAAS,SAAS;AAIX,IAAM,sBAAsB,EAAE,OAAO;AAAA,EAC1C,MAAM,EAAE,OAAO;AAAA,EACf,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,cAAc,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAC/C,CAAC;AAIM,IAAM,gBAAgB,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,mBAAmB,CAAC;AAI/D,IAAM,qBAAqB,EAAE,MAAM;AAAA,EACxC,EAAE,OAAO;AAAA,EACT,EAAE,OAAO;AAAA,IACP,MAAM,EAAE,OAAO;AAAA,IACf,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACzC,CAAC;AACH,CAAC;AAMM,IAAM,kBAAkB,EAAE,OAAO;AAAA,EACtC,QAAQ,EAAE,KAAK,CAAC,OAAO,UAAU,MAAM,CAAC,EAAE,SAAS;AAAA,EACnD,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AACtD,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,aAAa,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC/C,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACzC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,mBAAmB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAC1D,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,QAAQ,EAAE,KAAK,CAAC,QAAQ,QAAQ,UAAU,CAAC,EAAE,SAAS;AAAA,EACtD,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC7B,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACvC,YAAY,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACvC,eAAe,EAAE,OAAO;AAAA,IACtB,MAAM,EAAE,KAAK,CAAC,UAAU,mBAAmB,uBAAuB,CAAC,EAAE,SAAS;AAAA,IAC9E,KAAK,EAAE,OAAO,EAAE,SAAS;AAAA,IACzB,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,IACnC,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,CAAC,EAAE,SAAS;AAAA,EACZ,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,eAAe,EAAE,QAAQ,EAAE,SAAS;AACtC,CAAC;AAEM,IAAM,+BAA+B,eAAe,YAAY,CAAC,OAAO,QAAQ;AACrF,MAAI,MAAM,WAAW,UAAa,MAAM,eAAe,QAAW;AAChE,QAAI,SAAS;AAAA,MACX,MAAM,EAAE,aAAa;AAAA,MACrB,SAAS;AAAA,MACT,MAAM,CAAC,YAAY;AAAA,IACrB,CAAC;AAAA,EACH;AACF,CAAC;AAKM,IAAM,iCAAiC,EAAE,OAAO;AAAA,EACrD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,aAAa,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC5C,eAAe,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAChD,CAAC;AAEM,IAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,iBAAiB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACtD,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACxC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA,EAChC,iBAAiB,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAChD,sBAAsB,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACrD,qBAAqB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAClD,wBAAwB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAC/D,CAAC;AAEM,IAAM,kCAAkC,EAAE,OAAO;AAAA,EACtD,UAAU,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACzC,YAAY,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACzC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC,EAAE,SAAS;AAAA,EACjD,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AACvC,CAAC;AAEM,IAAM,8BAA8B,EAAE,OAAO;AAAA,EAClD,aAAa,EAAE,OAAO;AAAA,EACtB,eAAe,EAAE,OAAO,EAAE,SAAS;AAAA,EACnC,kBAAkB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,oBAAoB,EAAE,OAAO,EAAE,SAAS;AAAA,EACxC,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAC3C,CAAC;AAEM,IAAM,qCAAqC,EAAE,OAAO;AAAA,EACzD,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS;AAAA;AAAA,EAEpC,YAAY,EAAE,OAAO,EAAE,SAAS;AAAA,EAChC,UAAU,4BAA4B,SAAS;AAAA,EAC/C,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACpC,mBAAmB,EAAE,OAAO,EAAE,SAAS;AAAA,EACvC,WAAW,EAAE,OAAO,EAAE,SAAS;AACjC,CAAC;AAEM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,WAAW,+BAA+B,SAAS;AAAA,EACnD,QAAQ,4BAA4B,SAAS;AAAA,EAC7C,YAAY,gCAAgC,SAAS;AAAA,EACrD,eAAe,mCAAmC,SAAS;AAC7D,CAAC;AAMM,IAAM,wBAAwB,EAAE,OAAO;AAAA,EAC5C,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACvC,oBAAoB,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACnD,kBAAkB,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACjD,WAAW,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC1C,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACvC,QAAQ,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EACvC,YAAY,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAAA,EAC3C,eAAe,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,SAAS;AAChD,CAAC;AAMM,IAAM,mCAAmC,EAAE,OAAO;AAAA,EACvD,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAClC,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AACpD,CAAC;AAEM,IAAM,6BAA6B,EAAE,OAAO;AAAA,EACjD,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,YAAY,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACjD,eAAe,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EACpD,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EACpD,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC3C,cAAc,EAAE,QAAQ,EAAE,SAAS;AAAA,EACnC,MAAM,EAAE,KAAK,CAAC,gBAAgB,UAAU,CAAC,EAAE,SAAS;AAAA,EACpD,oBAAoB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACzC,wBAAwB,EAAE,QAAQ,EAAE,SAAS;AAC/C,CAAC;AAEM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,SAAS,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC9B,iBAAiB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACtC,kBAAkB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACvC,sBAAsB,EAAE,QAAQ,EAAE,SAAS;AAC7C,CAAC;AAEM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,iBAAiB,iCAAiC,SAAS;AAAA,EAC3D,WAAW,2BAA2B,SAAS;AAAA,EAC/C,MAAM,qBAAqB,SAAS;AACtC,CAAC;AASM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,kBAAkB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAAA,EAC7C,WAAW,EAAE,KAAK,CAAC,aAAa,KAAK,CAAC,EAAE,SAAS;AACnD,CAAC;AAEM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,MAAM,EAAE,KAAK,CAAC,aAAa,UAAU,CAAC,EAAE,SAAS;AAAA,EACjD,MAAM,EAAE,QAAQ,WAAW,EAAE,SAAS;AAAA,EACtC,KAAK,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,SAAS;AAAA,EACnC,2BAA2B,EAAE,QAAQ,EAAE,SAAS;AAAA,EAChD,aAAa,EAAE,QAAQ,EAAE,SAAS;AAAA,EAClC,uBAAuB,EAAE,QAAQ,EAAE,SAAS;AAC9C,CAAC;AAEM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,gBAAgB,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,SAAS;AAC7C,CAAC;AAEM,IAAM,cAAc,EAAE,OAAO;AAAA,EAClC,QAAQ,kBAAkB,SAAS;AAAA,EACnC,WAAW,qBAAqB,SAAS;AAAA,EACzC,QAAQ,kBAAkB,SAAS;AAAA,EACnC,QAAQ,kBAAkB,SAAS;AACrC,CAAC;AAIM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,WAAW,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAClD,CAAC;AAEM,IAAM,qBAAqB,EAAE,MAAM;AAAA,EACxC,EAAE,OAAO;AAAA,EACT,EAAE,OAAO;AAAA,IACP,SAAS,EAAE,OAAO;AAAA,IAClB,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,IAC3B,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,CAAC;AACH,CAAC;AAEM,IAAM,gCAAgC,EAAE,MAAM;AAAA,EACnD,EAAE,QAAQ;AAAA,EACV,EAAE,OAAO;AAAA,IACP,gBAAgB,EAAE,OAAO,EAAE,SAAS;AAAA,EACtC,CAAC;AACH,CAAC;AAEM,IAAM,gCAAgC,EAAE,MAAM;AAAA,EACnD,EAAE,QAAQ,WAAW;AAAA,EACrB,EAAE,QAAQ,MAAM;AAAA,EAChB,EAAE,OAAO;AAAA,IACP,WAAW,2BAA2B,SAAS;AAAA,IAC/C,MAAM,qBAAqB,SAAS;AAAA,EACtC,CAAC;AACH,CAAC;AAEM,IAAM,qCAAqC,EAAE,OAAO;AAAA,EACzD,MAAM,EAAE,OAAO;AAAA,EACf,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAU,EAAE,QAAQ,EAAE,SAAS;AAAA,EAC/B,UAAU,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS;AAAA,EAC/C,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,GAAG,EAAE,KAAK,CAAC,SAAS,OAAO,MAAM,CAAC,CAAC,CAAC,EAAE,SAAS;AAAA,EACxE,aAAa,8BAA8B,SAAS;AAAA,EACpD,aAAa,mBAAmB,SAAS;AAAA,EACzC,YAAY,mBAAmB,SAAS;AAAA,EACxC,WAAW,8BAA8B,SAAS;AAAA,EAClD,gBAAgB,8BAA8B,SAAS;AACzD,CAAC;AAEM,IAAM,+BAA+B,EAAE,MAAM;AAAA,EAClD,EAAE,OAAO;AAAA,EACT;AACF,CAAC;AAOM,IAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,QAAQ,EAAE,MAAM,4BAA4B,EAAE,SAAS;AAAA,EACvD,SAAS,cAAc,SAAS;AAClC,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACnC,iBAAiB,EAAE,QAAQ,EAAE,SAAS;AAAA,EACtC,QAAQ,EAAE,QAAQ,EAAE,SAAS;AAC/B,CAAC;AAIM,IAAM,YAAY,EAAE,OAAO;AAAA,EAChC,SAAS,EAAE,MAAM,kBAAkB,EAAE,SAAS;AAChD,CAAC;AAIM,IAAM,6BAA6B,EAAE,OAAO;AAAA,EACjD,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC9C,WAAW,gBAAgB,SAAS;AAAA,EACpC,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,6BAA6B,SAAS;AAAA,EAChD,aAAa,kBAAkB,SAAS;AAAA,EACxC,OAAO,YAAY,SAAS;AAAA,EAC5B,KAAK,sBAAsB,SAAS;AAAA,EACpC,OAAO,EAAE,MAAM,aAAa,EAAE,SAAS;AAAA,EACvC,kBAAkB,sBAAsB,SAAS;AACnD,CAAC;AAMM,IAAM,eAAe,EAAE,OAAO;AAAA,EACnC,WAAW,EAAE,OAAO,EAAE,SAAS;AAAA,EAC/B,UAAU,EAAE,OAAO,EAAE,SAAS;AAChC,CAAC;AAIM,IAAM,iBAAiB,EAAE,OAAO;AAAA,EACrC,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EACzC,iBAAiB,EAAE,OAAO,EAAE,SAAS;AAAA,EACrC,OAAO,EAAE,OAAO,EAAE,SAAS;AAC7B,CAAC;AAIM,IAAM,uBAAuB,EAAE,OAAO;AAAA,EAC3C,UAAU,EAAE,KAAK,CAAC,UAAU,oBAAoB,aAAa,UAAU,UAAU,cAAc,iBAAiB,KAAK,CAAC,EAAE,SAAS;AAAA,EACjI,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAC9C,WAAW,gBAAgB,SAAS;AAAA,EACpC,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,eAAe,SAAS;AAAA,EAClC,aAAa,kBAAkB,SAAS;AAAA,EACxC,OAAO,YAAY,SAAS;AAAA,EAC5B,KAAK,sBAAsB,SAAS;AAAA,EACpC,OAAO,EAAE,MAAM,aAAa,EAAE,SAAS;AAAA,EACvC,kBAAkB,sBAAsB,SAAS;AAAA,EACjD,KAAK,UAAU,SAAS;AAAA,EACxB,SAAS,cAAc,SAAS;AAAA,EAChC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EACvC,cAAc,EAAE,OAAO,0BAA0B,EAAE,SAAS;AAAA,EAC5D,OAAO,EAAE,OAAO,0BAA0B,EAAE,SAAS;AAAA,EACrD,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,EAAE,OAAO;AAAA,IACjB,qBAAqB,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3C,CAAC,EAAE,SAAS;AACd,CAAC;AAMM,IAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,IAAI,EAAE,OAAO;AAAA,EACb,gBAAgB,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,CAAC;AAAA,EACrD,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EAEjC,UAAU,EAAE,KAAK,CAAC,UAAU,oBAAoB,aAAa,UAAU,UAAU,cAAc,iBAAiB,KAAK,CAAC,EAAE,SAAS;AAAA,EACjI,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,iBAAiB,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAE9C,WAAW,gBAAgB,SAAS;AAAA,EACpC,UAAU,eAAe,SAAS;AAAA,EAClC,UAAU,6BAA6B,SAAS;AAAA,EAChD,aAAa,kBAAkB,SAAS;AAAA,EACxC,OAAO,YAAY,SAAS;AAAA,EAC5B,KAAK,sBAAsB,SAAS;AAAA,EAEpC,OAAO,EAAE,MAAM,aAAa,EAAE,SAAS;AAAA,EACvC,kBAAkB,sBAAsB,SAAS;AAAA,EACjD,KAAK,UAAU,SAAS;AAAA,EAExB,SAAS,cAAc,SAAS;AAAA,EAEhC,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,SAAS;AAAA,EAEvC,cAAc,EAAE,OAAO,0BAA0B,EAAE,SAAS;AAAA,EAC5D,OAAO,EAAE,OAAO,0BAA0B,EAAE,SAAS;AAAA,EAErD,UAAU,eAAe,SAAS;AAAA;AAAA,EAGlC,UAAU,eAAe,SAAS;AAAA,EAClC,QAAQ,aAAa,SAAS;AAChC,CAAC;;;AC/WD,IAAM,cAA8C;AAAA,EAClD,uBAAuB;AAAA,EACvB,mBAAmB;AAAA,EACnB,SAAS;AACX;AAOO,SAAS,gBAAgB,MAAwB;AACtD,QAAM,QAAQ,KAAK,MAAM,OAAO;AAChC,QAAM,WAAqB,CAAC;AAE5B,MAAI,aAAoC;AACxC,MAAI,eAAyB,CAAC;AAC9B,MAAI,aAAa;AAEjB,aAAW,QAAQ,OAAO;AACxB,UAAM,UAAU,KAAK,MAAM,YAAY;AACvC,QAAI,SAAS;AAEX,UAAI,YAAY;AACd,iBAAS,UAAU,IAAI,aAAa,KAAK,IAAI,EAAE,KAAK;AAAA,MACtD;AAEA,mBAAa;AACb,YAAM,UAAU,QAAQ,CAAC,EAAE,KAAK,EAAE,YAAY;AAC9C,mBAAa,YAAY,OAAO,KAAK;AACrC,qBAAe,CAAC;AAAA,IAClB,OAAO;AACL,mBAAa,KAAK,IAAI;AAAA,IACxB;AAAA,EACF;AAGA,MAAI,YAAY;AACd,aAAS,UAAU,IAAI,aAAa,KAAK,IAAI,EAAE,KAAK;AAAA,EACtD;AAGA,MAAI,CAAC,YAAY;AACf,UAAM,UAAU,KAAK,KAAK;AAC1B,QAAI,SAAS;AACX,eAAS,kBAAkB;AAAA,IAC7B;AAAA,EACF;AAEA,SAAO;AACT;;;ACxDA,OAAO,YAAY;;;ACAnB,IAAM,yBAAyB;AAC/B,IAAM,cAAc;AACpB,IAAM,gBAAgB;AACtB,IAAM,uBAAuB;AAOtB,SAAS,8BAA8B,SAAiB,UAAyB;AACtF,QAAM,cAAc,mBAAmB,OAAO;AAC9C,MAAI,CAAC,aAAa;AAChB;AAAA,EACF;AAEA,MAAI;AAEJ,aAAW,CAAC,OAAO,IAAI,KAAK,YAAY,MAAM,QAAQ,GAAG;AACvD,UAAM,aAAa,YAAY,YAAY;AAC3C,UAAM,aAAa,KAAK,MAAM,WAAW;AAEzC,QAAI,YAAY,QAAQ;AACtB,YAAM,QAAQ,WAAW,OAAO;AAChC,YAAMA,UAAS,WAAW,OAAO,OAAO;AACxC,YAAM,QAAQ,WAAW,OAAO,MAAM,KAAK;AAC3C,qBAAe,UAAU,KAAK,EAAE,OAAO,QAAAA,QAAO,IAAI;AAElD,oDAA8C,OAAO,OAAO,UAAU,UAAU;AAChF,gDAA0C,OAAO,OAAO,UAAU,UAAU;AAC5E;AAAA,IACF;AAEA,QAAI,CAAC,cAAc;AACjB;AAAA,IACF;AAEA,QAAI,KAAK,KAAK,MAAM,MAAM,KAAK,UAAU,EAAE,WAAW,GAAG,GAAG;AAC1D;AAAA,IACF;AAEA,UAAM,SAAS,KAAK,MAAM,MAAM,IAAI,CAAC,EAAE,UAAU;AACjD,QAAI,UAAU,aAAa,QAAQ;AACjC,qBAAe;AACf;AAAA,IACF;AAEA,UAAM,eAAe,KAAK,MAAM,aAAa;AAC7C,QAAI,CAAC,cAAc,QAAQ;AACzB;AAAA,IACF;AAEA;AAAA,MACE,aAAa,OAAO,MAAM,KAAK;AAAA,MAC/B,GAAG,aAAa,KAAK;AAAA,MACrB;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;AAEA,SAAS,0CACP,OACA,OACA,UACA,YACM;AACN,QAAM,QAAQ,MAAM,MAAM,oBAAoB;AAC9C,QAAM,UAAU,OAAO,QAAQ;AAC/B,MAAI,CAAC,SAAS;AACZ;AAAA,EACF;AAEA,gDAA8C,SAAS,GAAG,KAAK,YAAY,UAAU,UAAU;AACjG;AAEA,SAAS,mBAAmB,SAAqE;AAC/F,QAAM,QAAQ,QAAQ,MAAM,OAAO;AACnC,MAAI,CAAC,uBAAuB,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG;AAChD,WAAO;AAAA,EACT;AAEA,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,QAAI,uBAAuB,KAAK,MAAM,KAAK,KAAK,EAAE,GAAG;AACnD,aAAO;AAAA,QACL,OAAO,MAAM,MAAM,GAAG,KAAK;AAAA,QAC3B,WAAW;AAAA,MACb;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,8CACP,OACA,OACA,UACA,YACM;AACN,MAAI,CAAC,MAAM,WAAW,GAAG,GAAG;AAC1B;AAAA,EACF;AAEA,QAAM,SAAS,uBAAuB,KAAK;AAC3C,MAAI,CAAC,QAAQ;AACX;AAAA,EACF;AAEA,MAAI,CAAC,sBAAsB,MAAM,GAAG;AAClC;AAAA,EACF;AAEA,QAAM,WAAW,WAAW,GAAG,QAAQ,IAAI,UAAU,KAAK,QAAQ,UAAU;AAC5E,QAAM,IAAI;AAAA,IACR,yCAAyC,QAAQ,YAAY,KAAK;AAAA,EAGpE;AACF;AAEA,SAAS,uBAAuB,OAAmC;AACjE,MAAI,SAAS;AAEb,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,UAAM,OAAO,MAAM,KAAK;AAExB,QAAI,SAAS,KAAK;AAChB,aAAO;AAAA,IACT;AAEA,cAAU;AAEV,QAAI,SAAS,QAAQ,QAAQ,IAAI,MAAM,QAAQ;AAC7C,eAAS;AACT,gBAAU,MAAM,KAAK;AAAA,IACvB;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,OAAwB;AACrD,WAAS,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS,GAAG;AACpD,QAAI,MAAM,KAAK,MAAM,MAAM;AACzB;AAAA,IACF;AAEA,QAAI,QAAQ;AACZ,WAAO,MAAM,QAAQ,KAAK,MAAM,MAAM;AACpC,eAAS;AAAA,IACX;AAEA,QAAI,QAAQ,MAAM,GAAG;AACnB,aAAO;AAAA,IACT;AAEA,aAAS,QAAQ;AAAA,EACnB;AAEA,SAAO;AACT;;;AD/IO,SAAS,YAAY,SAAiB,UAAgC;AAC3E,gCAA8B,SAAS,QAAQ;AAC/C,QAAM,EAAE,MAAM,aAAa,SAAS,KAAK,IAAI,OAAO,OAAO;AAE3D,QAAM,WAAW,gBAAgB,IAAI;AAErC,QAAM,MAAM;AAAA,IACV,GAAG;AAAA,IACH;AAAA,IACA,QAAQ,WAAW,EAAE,WAAW,SAAS,IAAI;AAAA,EAC/C;AAEA,QAAM,QAAQ,kBAAkB,MAAM,GAAG;AAEzC,SAAO;AAAA,IACL;AAAA,IACA,KAAK;AAAA,MACH;AAAA,MACA;AAAA,IACF;AAAA,EACF;AACF;;;AEvCA,SAAS,YAAAC,iBAAgB;AACzB,SAAS,WAAAC,UAAS,MAAM,UAAU,WAAAC,gBAAe;AACjD,OAAOC,aAAY;;;ACFnB,SAAS,gBAAgB;AACzB,SAAS,kBAAkB;AAC3B,SAAS,SAAS,SAAS,eAAe;AAC1C,SAAS,qBAAqB;AAC9B,SAAS,KAAAC,UAAS;AAClB,SAAS,uBAAuB;AAGhC,IAAM,kCAAkC,oBAAI,IAAI,CAAC,SAAS,OAAO,QAAQ,MAAM,CAAC;AAGhF,eAAe,qBAAqB,WAAmB,gBAA0G;AAC/J,QAAM,eAAe,QAAQ,QAAQ,cAAc,GAAG,SAAS;AAC/D,MAAI;AAEJ,MAAI;AACF,UAAM,MAAM,SAAS,cAAc,OAAO;AAAA,EAC5C,SAAS,OAAO;AACd,UAAM,OAAQ,MAAgC;AAC9C,QAAI,SAAS,UAAU;AACrB,YAAM,IAAI,MAAM,gCAAgC,SAAS,8BAA8B,cAAc,GAAG;AAAA,IAC1G;AACA,UAAM;AAAA,EACR;AAEA,MAAI;AACJ,MAAI;AACF,aAAS,KAAK,MAAM,GAAG;AAAA,EACzB,QAAQ;AACN,UAAM,IAAI,MAAM,gCAAgC,SAAS,qBAAqB;AAAA,EAChF;AAEA,MAAI,CAAC,UAAU,OAAO,WAAW,YAAY,MAAM,QAAQ,MAAM,GAAG;AAClE,UAAM,IAAI,MAAM,gCAAgC,SAAS,wCAAwC;AAAA,EACnG;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,WAAW,QAAQ,EAAE,OAAO,GAAG,EAAE,OAAO,KAAK;AAAA,EACrD;AACF;AAEA,eAAe,oBAAoB,WAAmB,gBAA0G;AAC9J,QAAM,eAAe,QAAQ,QAAQ,cAAc,GAAG,SAAS;AAE/D,MAAI;AACJ,MAAI;AACF,mBAAe,MAAM,SAAS,cAAc,OAAO;AAAA,EACrD,SAAS,OAAO;AACd,UAAM,OAAQ,MAAgC;AAC9C,QAAI,SAAS,UAAU;AACrB,YAAM,IAAI,MAAM,gCAAgC,SAAS,8BAA8B,cAAc,GAAG;AAAA,IAC1G;AACA,UAAM;AAAA,EACR;AAEA,MAAI;AACJ,MAAI;AACF,eAAW,MAAM,OAAO,cAAc,YAAY,EAAE;AAAA,EACtD,SAAS,OAAO;AACd,UAAM,UAAU,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;AACrE,UAAM,IAAI,MAAM,gCAAgC,SAAS,wCAAwC,OAAO,GAAG;AAAA,EAC7G;AAEA,QAAM,MAAM;AACZ,QAAM,YAAY,IAAI,WAAW,IAAI;AAErC,MAAI,EAAE,qBAAqBA,GAAE,UAAU;AACrC,UAAM,IAAI,MAAM,gGAAgG;AAAA,EAClH;AAEA,QAAM,aAAa,gBAAgB,WAAW;AAAA,IAC5C,QAAQ;AAAA,IACR,cAAc;AAAA,EAChB,CAAC;AAED,MAAI,CAAC,cAAc,OAAO,eAAe,YAAY,MAAM,QAAQ,UAAU,GAAG;AAC9E,UAAM,IAAI,MAAM,gCAAgC,SAAS,8CAA8C;AAAA,EACzG;AAEA,SAAO;AAAA,IACL,QAAQ;AAAA,IACR;AAAA,IACA,MAAM,WAAW,QAAQ,EAAE,OAAO,YAAY,EAAE,OAAO,KAAK;AAAA,EAC9D;AACF;AAEA,eAAsB,yBAAyB,OAAoB,gBAA8C;AAC/G,QAAM,YAAY,MAAM,UAAU;AAClC,MAAI,CAAC,UAAW,QAAO;AAEvB,QAAM,MAAM,QAAQ,SAAS,EAAE,YAAY;AAC3C,MAAI,CAAC,gCAAgC,IAAI,GAAG,GAAG;AAC7C,UAAM,IAAI,MAAM,gCAAgC,SAAS,gCAAgC,GAAG,kCAAkC;AAAA,EAChI;AAEA,QAAM,WAAY,QAAQ,UACtB,MAAM,qBAAqB,WAAW,cAAc,IACpD,MAAM,oBAAoB,WAAW,cAAc;AAEvD,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU;AAAA,MACR,GAAG,MAAM;AAAA,MACT,QAAQ,SAAS;AAAA,MACjB,YAAY;AAAA,MACZ,eAAe;AAAA,QACb,MAAM,QAAQ,UAAU,oBAAoB;AAAA,QAC5C,KAAK;AAAA,QACL,eAAe,SAAS;AAAA,QACxB,MAAM,SAAS;AAAA,MACjB;AAAA,IACF;AAAA,EACF;AACF;;;ADzGA,IAAM,qBAAqB;AAa3B,eAAsB,eAAe,UAAkB,UAA6B,CAAC,GAAyB;AAC5G,QAAM,UAAU,MAAMC,UAAS,UAAU,OAAO;AAChD,QAAM,SAAS,YAAY,SAAS,QAAQ;AAG5C,QAAM,OAAO,QAAQ,gBAAgBC,SAAQ,QAAQ;AACrD,QAAM,WAAW,MAAM,oBAAoB,UAAU,IAAI;AACzD,QAAM,eAAe,cAAc,OAAO,OAAO,QAAQ;AACzD,QAAM,WAAW,MAAM,yBAAyB,cAAc,QAAQ;AACtE,QAAM,QAAS,SAAS,UAAU,WAAW,UAAa,CAAC,SAAS,UAAU,gBAC1E;AAAA,IACA,GAAG;AAAA,IACH,UAAU;AAAA,MACR,GAAG,SAAS;AAAA,MACZ,eAAe,EAAE,MAAM,SAAkB;AAAA,IAC3C;AAAA,EACF,IACE;AAEJ,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,eAAe,oBAAoB,UAAkB,cAAgD;AACnG,QAAM,cAAc,sBAAsB,UAAU,YAAY;AAChE,MAAI,SAAyB,CAAC;AAE9B,aAAW,OAAO,aAAa;AAC7B,UAAM,eAAe,KAAK,KAAK,kBAAkB;AACjD,QAAI;AACF,YAAM,kBAAkB,MAAMD,UAAS,cAAc,OAAO;AAC5D,YAAM,WAAW,yBAAyB,cAAc,eAAe,GAAG,cAAc,QAAQ;AAChG,eAAS,cAAc,QAAQ,QAAQ;AAAA,IACzC,SAAS,OAAO;AACd,UAAK,MAAgC,SAAS,UAAU;AACtD,cAAM;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAEA,SAAO;AACT;AAEA,SAAS,sBAAsB,UAAkB,cAAiC;AAChF,QAAM,OAAiB,CAAC;AACxB,MAAI,UAAUE,SAAQD,SAAQ,QAAQ,CAAC;AACvC,QAAM,WAAW,eAAeC,SAAQ,YAAY,IAAI;AAExD,SAAO,MAAM;AACX,SAAK,QAAQ,OAAO;AACpB,QAAK,YAAY,YAAY,YAAa,YAAYD,SAAQ,OAAO,GAAG;AACtE;AAAA,IACF;AACA,cAAUA,SAAQ,OAAO;AAAA,EAC3B;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,SAAiC;AACtD,QAAM,EAAE,MAAM,aAAa,SAAS,KAAK,IAAIE,QAAO,OAAO;AAC3D,QAAM,WAAW,gBAAgB,IAAI;AAErC,SAAO,qBAAqB,MAAM;AAAA,IAChC,GAAG;AAAA,IACH,UAAU;AAAA,MACR,qBAAqB,SAAS;AAAA,IAChC;AAAA,EACF,CAAC;AACH;AAEA,SAAS,cAAc,MAAsB,OAAuC;AAClF,SAAO;AAAA,IACL,UAAU,MAAM,YAAY,KAAK;AAAA,IACjC,OAAO,MAAM,SAAS,KAAK;AAAA,IAC3B,iBAAiB,MAAM,mBAAmB,KAAK;AAAA,IAC/C,WAAW,iBAAiB,KAAK,WAAW,MAAM,SAAS;AAAA,IAC3D,UAAU,iBAAiB,KAAK,UAAU,MAAM,QAAQ;AAAA,IACxD,UAAU,iBAAiB,KAAK,UAAU,MAAM,QAAQ;AAAA,IACxD,aAAa,iBAAiB,KAAK,aAAa,MAAM,WAAW;AAAA,IACjE,OAAO,WAAW,KAAK,OAAO,MAAM,KAAK;AAAA,IACzC,KAAK,SAAS,KAAK,KAAK,MAAM,GAAG;AAAA,IACjC,OAAO,MAAM,SAAS,KAAK;AAAA,IAC3B,kBAAkB,qBAAqB,KAAK,kBAAkB,MAAM,gBAAgB;AAAA,IACpF,KAAK,SAAS,KAAK,KAAK,MAAM,GAAG;AAAA,IACjC,SAAS,aAAa,KAAK,SAAS,MAAM,OAAO;AAAA,IACjD,UAAU,MAAM,YAAY,KAAK;AAAA,IACjC,cAAc,iBAAiB,KAAK,cAAc,MAAM,YAAY;AAAA,IACpE,OAAO,iBAAiB,KAAK,OAAO,MAAM,KAAK;AAAA,IAC/C,UAAU;AAAA,MACR,GAAI,KAAK,YAAY,CAAC;AAAA,MACtB,GAAI,MAAM,YAAY,CAAC;AAAA,IACzB;AAAA,IACA,UAAU;AAAA,MACR,GAAI,KAAK,YAAY,CAAC;AAAA,MACtB,GAAI,MAAM,YAAY,CAAC;AAAA,IACzB;AAAA,EACF;AACF;AAEA,SAAS,cAAc,OAA6B,UAAgD;AAClG,QAAM,cAAc,iBAAiB,SAAS,aAAa,MAAM,WAAW;AAC5E,QAAM,QAAQ,WAAW,SAAS,OAAO,MAAM,KAAK;AACpD,QAAM,MAAM,SAAS,SAAS,KAAK,MAAM,GAAG;AAC5C,QAAM,kBAAkB,qBAAqB,SAAS,kBAAkB,MAAM,gBAAgB;AAC9F,QAAM,YAAY,iBAAiB,SAAS,WAAW,MAAM,SAAS;AACtE,QAAM,WAAW,iBAAiB,SAAS,UAAU,MAAM,QAAQ;AACnE,QAAM,WAAW,iBAAiB,SAAS,UAAU,MAAM,QAAQ;AACnE,QAAM,MAAM,SAAS,SAAS,KAAK,MAAM,GAAG;AAC5C,QAAM,UAAU,aAAa,SAAS,SAAS,MAAM,OAAO;AAC5D,QAAM,eAAe,iBAAiB,SAAS,cAAc,MAAM,YAAY;AAC/E,QAAM,QAAQ,iBAAiB,SAAS,OAAO,MAAM,KAAK;AAC1D,QAAM,qBAAqB,SAAS,YAAY,OAAO,KAAK,SAAS,QAAQ,EAAE,SAAS;AACxF,QAAM,mBAAmB,CAAC,CAAC,SAAS,UAAU;AAC9C,QAAM,oBAAoB,SAAS,aAAa,UAC3C,SAAS,UAAU,UACnB,SAAS,oBAAoB,UAC7B,SAAS,UAAU,UACnB,SAAS,aAAa;AAC3B,QAAM,oBAAoB,gBAAgB,UACrC,UAAU,UACV,QAAQ,UACR,oBAAoB,UACpB,cAAc,UACd,aAAa,UACb,aAAa,UACb,QAAQ,UACR,YAAY,UACZ,iBAAiB,UACjB,UAAU;AAGf,MAAI,CAAC,sBAAsB,CAAC,oBAAoB,CAAC,qBAAqB,CAAC,mBAAmB;AACxF,WAAO;AAAA,EACT;AAEA,QAAM,iBAAiB;AAAA,IACrB,GAAI,SAAS,YAAY,CAAC;AAAA,IAC1B,GAAI,MAAM,YAAY,CAAC;AAAA,EACzB;AACA,QAAM,WAAW,OAAO,KAAK,cAAc,EAAE,SAAS,IAAI,iBAAiB;AAE3E,QAAM,qBAAqB,MAAM,UAAU,uBAAuB,SAAS,UAAU;AAErF,QAAM,WAAW,MAAM,WACnB,EAAE,GAAG,MAAM,UAAU,qBAAqB,mBAAmB,IAC7D,qBACE,EAAE,qBAAqB,mBAAmB,IAC1C;AAEN,SAAO;AAAA,IACL,GAAG;AAAA,IACH,UAAU,MAAM,YAAY,SAAS;AAAA,IACrC,OAAO,MAAM,SAAS,SAAS;AAAA,IAC/B,iBAAiB,MAAM,mBAAmB,SAAS;AAAA,IACnD;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,OAAO,MAAM,SAAS,SAAS;AAAA,IAC/B,kBAAkB;AAAA,IAClB;AAAA,IACA;AAAA,IACA,UAAU,MAAM,YAAY,SAAS;AAAA,IACrC;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;AAEA,SAAS,yBACP,UACA,cACA,UACgB;AAChB,MAAI,CAAC,SAAS,SAAU,QAAO;AAE/B,QAAM,YAAYF,SAAQ,QAAQ;AAClC,QAAM,cAAcA,SAAQ,YAAY;AACxC,QAAM,WAAW,SAAS,SAAS,IAAI,CAAC,gBAAgB;AACtD,UAAM,eAAe,SAAS,WAAWC,SAAQ,aAAa,WAAW,CAAC,EAAE,QAAQ,OAAO,GAAG;AAC9F,WAAO,aAAa,WAAW,GAAG,IAAI,eAAe,KAAK,YAAY;AAAA,EACxE,CAAC;AAED,SAAO;AAAA,IACL,GAAG;AAAA,IACH;AAAA,EACF;AACF;AAEA,SAAS,iBAAmC,MAAqB,OAAqC;AACpG,MAAI,SAAS,OAAW,QAAO;AAC/B,MAAI,UAAU,OAAW,QAAO;AAChC,SAAO,EAAE,GAAG,MAAM,GAAG,MAAM;AAC7B;AAEA,SAAS,SAAS,MAA6B,OAAqD;AAClG,SAAO,iBAAiB,MAAM,KAAK;AACrC;AAEA,SAAS,aAAa,MAAiC,OAA6D;AAClH,QAAM,SAAS;AAAA,IACb,GAAI,QAAQ,CAAC;AAAA,IACb,GAAI,SAAS,CAAC;AAAA,IACd,SAAS,iBAAiB,MAAM,SAAS,OAAO,OAAO;AAAA,EACzD;AAEA,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEA,SAAS,WAAW,MAA+B,OAAyD;AAC1G,QAAM,SAA+C;AAAA,IACnD,GAAI,QAAQ,CAAC;AAAA,IACb,GAAI,SAAS,CAAC;AAAA,IACd,QAAQ;AAAA,MACN,GAAI,MAAM,UAAU,CAAC;AAAA,MACrB,GAAI,OAAO,UAAU,CAAC;AAAA,IACxB;AAAA,IACA,WAAW;AAAA,MACT,GAAI,MAAM,aAAa,CAAC;AAAA,MACxB,GAAI,OAAO,aAAa,CAAC;AAAA,IAC3B;AAAA,IACA,QAAQ;AAAA,MACN,GAAI,MAAM,UAAU,CAAC;AAAA,MACrB,GAAI,OAAO,UAAU,CAAC;AAAA,IACxB;AAAA,IACA,QAAQ;AAAA,MACN,GAAI,MAAM,UAAU,CAAC;AAAA,MACrB,GAAI,OAAO,UAAU,CAAC;AAAA,IACxB;AAAA,EACF;AAEA,MAAI,OAAO,UAAU,OAAO,KAAK,OAAO,MAAM,EAAE,WAAW,EAAG,QAAO,OAAO;AAC5E,MAAI,OAAO,aAAa,OAAO,KAAK,OAAO,SAAS,EAAE,WAAW,EAAG,QAAO,OAAO;AAClF,MAAI,OAAO,UAAU,OAAO,KAAK,OAAO,MAAM,EAAE,WAAW,EAAG,QAAO,OAAO;AAC5E,MAAI,OAAO,UAAU,OAAO,KAAK,OAAO,MAAM,EAAE,WAAW,EAAG,QAAO,OAAO;AAE5E,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEA,SAAS,iBACP,MACA,OAC+B;AAC/B,QAAM,SAAqD;AAAA,IACzD,GAAI,QAAQ,CAAC;AAAA,IACb,GAAI,SAAS,CAAC;AAAA,IACd,iBAAiB,iBAAiB,MAAM,iBAAiB,OAAO,eAAe;AAAA,IAC/E,WAAW,iBAAiB,MAAM,WAAW,OAAO,SAAS;AAAA,IAC7D,MAAM,iBAAiB,MAAM,MAAM,OAAO,IAAI;AAAA,EAChD;AAEA,4BAA0B,MAAM;AAChC,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEA,SAAS,SAAS,MAA6B,OAAqD;AAClG,QAAM,SAA6C;AAAA,IACjD,GAAI,QAAQ,CAAC;AAAA,IACb,GAAI,SAAS,CAAC;AAAA,IACd,QAAQ,iBAAiB,MAAM,QAAQ,OAAO,MAAM;AAAA,IACpD,oBAAoB,iBAAiB,OAAO,kBAAkB,GAAG,QAAQ,kBAAkB,CAAC;AAAA,IAC5F,kBAAkB,iBAAiB,MAAM,kBAAkB,OAAO,gBAAgB;AAAA,IAClF,WAAW,iBAAiB,MAAM,WAAW,OAAO,SAAS;AAAA,IAC7D,QAAQ,iBAAiB,MAAM,QAAQ,OAAO,MAAM;AAAA,IACpD,QAAQ,iBAAiB,MAAM,QAAQ,OAAO,MAAM;AAAA,IACpD,YAAY,iBAAiB,MAAM,YAAY,OAAO,UAAU;AAAA,IAChE,eAAe,iBAAiB,MAAM,eAAe,OAAO,aAAa;AAAA,EAC3E;AAEA,4BAA0B,MAAM;AAChC,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEA,SAAS,qBACP,MACA,OACoC;AACpC,QAAM,SAA0D;AAAA,IAC9D,GAAI,QAAQ,CAAC;AAAA,IACb,GAAI,SAAS,CAAC;AAAA,IACd,WAAW,iBAAiB,MAAM,WAAW,OAAO,SAAS;AAAA,IAC7D,QAAQ,iBAAiB,MAAM,QAAQ,OAAO,MAAM;AAAA,IACpD,YAAY,iBAAiB,MAAM,YAAY,OAAO,UAAU;AAAA,IAChE,eAAe,iBAAiB,MAAM,eAAe,OAAO,aAAa;AAAA,EAC3E;AAEA,4BAA0B,MAAM;AAChC,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEA,SAAS,iBACP,MACA,OACgC;AAChC,QAAM,SAAsD,EAAE,GAAI,QAAQ,CAAC,EAAG;AAE9E,aAAW,CAAC,MAAM,aAAa,KAAK,OAAO,QAAQ,SAAS,CAAC,CAAC,GAAG;AAC/D,WAAO,IAAI,IAAI,oBAAoB,OAAO,IAAI,GAAG,aAAa;AAAA,EAChE;AAEA,SAAO,OAAO,KAAK,MAAM,EAAE,SAAS,IAAI,SAAS;AACnD;AAEA,SAAS,oBACP,MACA,OACqD;AACrD,QAAM,SAA8D;AAAA,IAClE,GAAI,QAAQ,CAAC;AAAA,IACb,GAAG;AAAA,EACL;AAEA,QAAM,YAAY,iBAAiB,MAAM,WAAW,MAAM,SAAS;AACnE,QAAM,WAAW,iBAAiB,MAAM,UAAU,MAAM,QAAQ;AAChE,QAAM,WAAW,iBAAiB,MAAM,UAAU,MAAM,QAAQ;AAChE,QAAM,cAAc,iBAAiB,MAAM,aAAa,MAAM,WAAW;AACzE,QAAM,QAAQ,WAAW,MAAM,OAAO,MAAM,KAAK;AACjD,QAAM,MAAM,SAAS,MAAM,KAAK,MAAM,GAAG;AACzC,QAAM,kBAAkB,qBAAqB,MAAM,kBAAkB,MAAM,gBAAgB;AAE3F,MAAI,cAAc,OAAW,QAAO,YAAY;AAChD,MAAI,aAAa,OAAW,QAAO,WAAW;AAC9C,MAAI,aAAa,OAAW,QAAO,WAAW;AAC9C,MAAI,gBAAgB,OAAW,QAAO,cAAc;AACpD,MAAI,UAAU,OAAW,QAAO,QAAQ;AACxC,MAAI,QAAQ,OAAW,QAAO,MAAM;AACpC,MAAI,oBAAoB,OAAW,QAAO,mBAAmB;AAE7D,SAAO;AACT;AAEA,SAAS,0BAA6D,OAAgB;AACpF,aAAW,OAAO,OAAO,KAAK,KAAK,GAAG;AACpC,UAAM,QAAQ,MAAM,GAAG;AACvB,QAAI,UAAU,QAAW;AACvB,aAAO,MAAM,GAAG;AAChB;AAAA,IACF;AAEA,QACE,UAAU,QAEV,OAAO,UAAU,YACd,CAAC,MAAM,QAAQ,KAAK,KACpB,OAAO,KAAK,KAAK,EAAE,WAAW,GACjC;AACA,aAAO,MAAM,GAAG;AAAA,IAClB;AAAA,EACF;AACF;","names":["indent","readFile","dirname","resolve","matter","z","readFile","dirname","resolve","matter"]}
@@ -4,7 +4,7 @@ import {
4
4
  renderSections,
5
5
  resolveAssetForProvider,
6
6
  withPromptInputSupport
7
- } from "./chunk-6ICAKKV3.js";
7
+ } from "./chunk-46Z64RVO.js";
8
8
 
9
9
  // src/providers/openai.ts
10
10
  var openaiAdapter = withPromptInputSupport({
@@ -107,4 +107,4 @@ var openaiAdapter = withPromptInputSupport({
107
107
  export {
108
108
  openaiAdapter
109
109
  };
110
- //# sourceMappingURL=chunk-CGBEKODU.js.map
110
+ //# sourceMappingURL=chunk-IGLKVT74.js.map
@@ -1,28 +1,25 @@
1
1
  import {
2
2
  openaiAdapter
3
- } from "./chunk-CGBEKODU.js";
3
+ } from "./chunk-IGLKVT74.js";
4
4
  import {
5
5
  applyRawProviderBody,
6
6
  resolveAssetForProvider,
7
7
  withPromptInputSupport
8
- } from "./chunk-6ICAKKV3.js";
8
+ } from "./chunk-46Z64RVO.js";
9
9
 
10
10
  // src/providers/llmasaservice.ts
11
11
  var LLMASASERVICE_BASE_URL = "https://gateway.llmasaservice.io";
12
- var LLMASASERVICE_SDK_PLACEHOLDER_API_KEY = "not-used-by-llm-gateway";
13
12
  var LLMASASERVICE_DEFAULT_MODEL = "group:standard";
14
13
  var LLMASASERVICE_RESPONSE_HEADER_NAMES = [
15
14
  "x-request-id",
16
15
  "x-llm-model-id",
17
16
  "x-llm-model-group"
18
17
  ];
19
- function createLLMAsAServiceOpenAIConfig(options = {}) {
18
+ function createLLMAsAServiceOpenAIConfig(options) {
20
19
  return {
21
20
  baseURL: options.baseURL ?? LLMASASERVICE_BASE_URL,
22
- apiKey: LLMASASERVICE_SDK_PLACEHOLDER_API_KEY,
23
- defaultHeaders: {
24
- "x-project-id": options.projectId ?? ""
25
- }
21
+ apiKey: options.apiKey,
22
+ ...options.projectId ? { defaultHeaders: { "x-project-id": options.projectId } } : {}
26
23
  };
27
24
  }
28
25
  function isGPT5ModelSelector(model) {
@@ -39,9 +36,6 @@ function rawCustomerId(asset) {
39
36
  const customer = isRecord(asset.raw?.llmasaservice?.customer) ? asset.raw.llmasaservice.customer : void 0;
40
37
  return customer?.customer_id;
41
38
  }
42
- function isGatewayRenderValidation(runtime) {
43
- return runtime?.runtime !== void 0;
44
- }
45
39
  var llmasaserviceAdapter = withPromptInputSupport({
46
40
  name: "llmasaservice",
47
41
  validate(asset, runtime) {
@@ -58,12 +52,12 @@ var llmasaserviceAdapter = withPromptInputSupport({
58
52
  );
59
53
  const errors = [...validation.errors];
60
54
  const gatewayOptions = resolvedAsset.provider_options?.llmasaservice;
61
- const missingProjectId = !gatewayOptions?.project_id;
55
+ const missingApiKey = !runtime?.llmasaservice?.apiKey;
62
56
  const missingCustomerId = !gatewayOptions?.customer?.customer_id && typeof rawCustomerId(resolvedAsset) !== "string";
63
- const validateRenderMetadata = isGatewayRenderValidation(runtime);
64
- if (missingProjectId && validateRenderMetadata) {
57
+ const validateRenderMetadata = runtime !== void 0;
58
+ if (missingApiKey && validateRenderMetadata) {
65
59
  errors.push(
66
- "LLMAsAService adapter requires provider_options.llmasaservice.project_id for x-project-id routing."
60
+ "LLMAsAService adapter requires llmasaservice.apiKey for Authorization Bearer authentication."
67
61
  );
68
62
  }
69
63
  if (missingCustomerId && validateRenderMetadata) {
@@ -71,9 +65,9 @@ var llmasaserviceAdapter = withPromptInputSupport({
71
65
  "LLMAsAService adapter requires customer.customer_id in provider_options.llmasaservice.customer or raw.llmasaservice.customer."
72
66
  );
73
67
  }
74
- if ((missingProjectId || missingCustomerId) && !validateRenderMetadata) {
68
+ if ((missingApiKey || missingCustomerId) && !validateRenderMetadata) {
75
69
  warnings.push(
76
- "LLMAsAService project_id and customer.customer_id must be supplied before rendering, usually through runtime provider_options."
70
+ "LLMAsAService apiKey and customer.customer_id must be supplied before rendering."
77
71
  );
78
72
  }
79
73
  return {
@@ -106,14 +100,21 @@ var llmasaserviceAdapter = withPromptInputSupport({
106
100
  if (options?.conversationTitle !== void 0) body.conversationTitle = options.conversationTitle;
107
101
  if (options?.projectId !== void 0) body.projectId = options.projectId;
108
102
  body = applyRawProviderBody(body, resolvedAsset, "llmasaservice");
109
- const projectId = options?.project_id ?? "";
103
+ const apiKey = runtime.llmasaservice?.apiKey;
104
+ if (!apiKey) {
105
+ throw new Error(
106
+ "LLMAsAService adapter requires llmasaservice.apiKey for Authorization Bearer authentication."
107
+ );
108
+ }
109
+ const projectId = options?.project_id;
110
110
  return {
111
111
  body,
112
112
  provider: "llmasaservice",
113
113
  model,
114
114
  baseURL: options?.base_url ?? LLMASASERVICE_BASE_URL,
115
115
  headers: {
116
- "x-project-id": projectId
116
+ Authorization: `Bearer ${apiKey}`,
117
+ ...projectId ? { "x-project-id": projectId } : {}
117
118
  }
118
119
  };
119
120
  }
@@ -121,10 +122,9 @@ var llmasaserviceAdapter = withPromptInputSupport({
121
122
 
122
123
  export {
123
124
  LLMASASERVICE_BASE_URL,
124
- LLMASASERVICE_SDK_PLACEHOLDER_API_KEY,
125
125
  LLMASASERVICE_DEFAULT_MODEL,
126
126
  LLMASASERVICE_RESPONSE_HEADER_NAMES,
127
127
  createLLMAsAServiceOpenAIConfig,
128
128
  llmasaserviceAdapter
129
129
  };
130
- //# sourceMappingURL=chunk-YLJGWVZ6.js.map
130
+ //# sourceMappingURL=chunk-PSQWMBKX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/llmasaservice.ts"],"sourcesContent":["import { openaiAdapter } from './openai.js';\nimport type { ResolvedPromptAsset } from '../schema/index.js';\nimport type {\n ProviderAdapter,\n ProviderRequest,\n RuntimeRenderOptions,\n ValidationResult,\n} from './types.js';\nimport { applyRawProviderBody } from './raw.js';\nimport { resolveAssetForProvider } from './resolve-asset.js';\nimport { withPromptInputSupport } from './prompt-input.js';\n\nexport const LLMASASERVICE_BASE_URL = 'https://gateway.llmasaservice.io';\nexport const LLMASASERVICE_DEFAULT_MODEL = 'group:standard';\nexport const LLMASASERVICE_RESPONSE_HEADER_NAMES = [\n 'x-request-id',\n 'x-llm-model-id',\n 'x-llm-model-group',\n] as const;\n\nexport interface LLMAsAServiceOpenAIConfig {\n baseURL: string;\n apiKey: string;\n defaultHeaders?: {\n 'x-project-id': string;\n };\n}\n\nexport interface LLMAsAServiceOpenAIConfigOptions {\n apiKey: string;\n baseURL?: string;\n /** @deprecated Project ids are no longer required by the gateway. */\n projectId?: string;\n}\n\nexport function createLLMAsAServiceOpenAIConfig(\n options: LLMAsAServiceOpenAIConfigOptions,\n): LLMAsAServiceOpenAIConfig {\n return {\n baseURL: options.baseURL ?? LLMASASERVICE_BASE_URL,\n apiKey: options.apiKey,\n ...(options.projectId\n ? { defaultHeaders: { 'x-project-id': options.projectId } }\n : {}),\n };\n}\n\nfunction isGPT5ModelSelector(model: string | undefined): boolean {\n if (!model) return false;\n return model\n .split(/[|,]/)\n .map((candidate) => candidate.trim())\n .some((candidate) => candidate.startsWith('gpt-5') || candidate.startsWith('openai:gpt-5'));\n}\n\nfunction defaultModel(): string {\n return LLMASASERVICE_DEFAULT_MODEL;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction rawCustomerId(asset: ResolvedPromptAsset): unknown {\n const customer = isRecord(asset.raw?.llmasaservice?.customer)\n ? asset.raw.llmasaservice.customer\n : undefined;\n return customer?.customer_id;\n}\n\n/**\n * LLMAsAService gateway adapter.\n * Uses the OpenAI Chat Completions body shape, plus gateway routing and\n * attribution fields supported by gateway.llmasaservice.io.\n */\nexport const llmasaserviceAdapter: ProviderAdapter = withPromptInputSupport({\n name: 'llmasaservice',\n\n validate(asset: ResolvedPromptAsset, runtime?: RuntimeRenderOptions): ValidationResult {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const validation = openaiAdapter.validate(\n {\n ...resolvedAsset,\n model: resolvedAsset.model ?? defaultModel(),\n },\n runtime,\n );\n const warnings = validation.warnings.filter(\n (warning) => warning !== 'OpenAI adapter requires a model to be specified.',\n );\n\n const errors = [...validation.errors];\n const gatewayOptions = resolvedAsset.provider_options?.llmasaservice;\n const missingApiKey = !runtime?.llmasaservice?.apiKey;\n const missingCustomerId =\n !gatewayOptions?.customer?.customer_id && typeof rawCustomerId(resolvedAsset) !== 'string';\n const validateRenderMetadata = runtime !== undefined;\n\n if (missingApiKey && validateRenderMetadata) {\n errors.push(\n 'LLMAsAService adapter requires llmasaservice.apiKey for Authorization Bearer authentication.',\n );\n }\n\n if (missingCustomerId && validateRenderMetadata) {\n errors.push(\n 'LLMAsAService adapter requires customer.customer_id in provider_options.llmasaservice.customer or raw.llmasaservice.customer.',\n );\n }\n\n if ((missingApiKey || missingCustomerId) && !validateRenderMetadata) {\n warnings.push(\n 'LLMAsAService apiKey and customer.customer_id must be supplied before rendering.',\n );\n }\n\n return {\n valid: errors.length === 0,\n errors,\n warnings,\n };\n },\n\n render(asset: ResolvedPromptAsset, runtime: RuntimeRenderOptions): ProviderRequest {\n const resolvedAsset = resolveAssetForProvider(asset, runtime);\n const options = resolvedAsset.provider_options?.llmasaservice;\n const model = resolvedAsset.model ?? defaultModel();\n const result = openaiAdapter.render(\n { ...resolvedAsset, model, raw: undefined },\n {\n variables: runtime.variables,\n history: runtime.history,\n onHistoryCompaction: runtime.onHistoryCompaction,\n toolRegistry: runtime.toolRegistry,\n strict: runtime.strict,\n },\n );\n let body = { ...result.body };\n\n if (isGPT5ModelSelector(model) && body.max_tokens !== undefined && body.max_completion_tokens === undefined) {\n body.max_completion_tokens = body.max_tokens;\n delete body.max_tokens;\n }\n\n if (options?.customer !== undefined) body.customer = options.customer;\n if (options?.conversationId !== undefined) body.conversationId = options.conversationId;\n if (options?.conversationTitle !== undefined) body.conversationTitle = options.conversationTitle;\n if (options?.projectId !== undefined) body.projectId = options.projectId;\n\n body = applyRawProviderBody(body, resolvedAsset, 'llmasaservice');\n\n const apiKey = runtime.llmasaservice?.apiKey;\n if (!apiKey) {\n throw new Error(\n 'LLMAsAService adapter requires llmasaservice.apiKey for Authorization Bearer authentication.',\n );\n }\n const projectId = options?.project_id;\n\n return {\n body,\n provider: 'llmasaservice',\n model,\n baseURL: options?.base_url ?? LLMASASERVICE_BASE_URL,\n headers: {\n Authorization: `Bearer ${apiKey}`,\n ...(projectId ? { 'x-project-id': projectId } : {}),\n },\n };\n },\n});\n"],"mappings":"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","names":[]}
@@ -4,7 +4,7 @@ import {
4
4
  renderSections,
5
5
  resolveAssetForProvider,
6
6
  withPromptInputSupport
7
- } from "./chunk-6ICAKKV3.js";
7
+ } from "./chunk-46Z64RVO.js";
8
8
 
9
9
  // src/providers/gemini.ts
10
10
  var geminiAdapter = withPromptInputSupport({
@@ -120,4 +120,4 @@ var geminiAdapter = withPromptInputSupport({
120
120
  export {
121
121
  geminiAdapter
122
122
  };
123
- //# sourceMappingURL=chunk-A2VPKL4X.js.map
123
+ //# sourceMappingURL=chunk-QVJTND5A.js.map
@@ -4,7 +4,7 @@ import {
4
4
  renderSections,
5
5
  resolveAssetForProvider,
6
6
  withPromptInputSupport
7
- } from "./chunk-6ICAKKV3.js";
7
+ } from "./chunk-46Z64RVO.js";
8
8
 
9
9
  // src/providers/openai-responses.ts
10
10
  var openaiResponsesAdapter = withPromptInputSupport({
@@ -112,4 +112,4 @@ var openaiResponsesAdapter = withPromptInputSupport({
112
112
  export {
113
113
  openaiResponsesAdapter
114
114
  };
115
- //# sourceMappingURL=chunk-XSSET4QN.js.map
115
+ //# sourceMappingURL=chunk-UULXO5I6.js.map
@@ -4,7 +4,7 @@ import {
4
4
  renderSections,
5
5
  resolveAssetForProvider,
6
6
  withPromptInputSupport
7
- } from "./chunk-6ICAKKV3.js";
7
+ } from "./chunk-46Z64RVO.js";
8
8
 
9
9
  // src/providers/anthropic.ts
10
10
  var anthropicAdapter = withPromptInputSupport({
@@ -144,4 +144,4 @@ var anthropicAdapter = withPromptInputSupport({
144
144
  export {
145
145
  anthropicAdapter
146
146
  };
147
- //# sourceMappingURL=chunk-DA2NSBIN.js.map
147
+ //# sourceMappingURL=chunk-VUQEB5ML.js.map
package/dist/cli/index.js CHANGED
@@ -90,6 +90,7 @@ var LLMAsAServiceCustomerSchema = z.object({
90
90
  });
91
91
  var LLMAsAServiceProviderOptionsSchema = z.object({
92
92
  base_url: z.string().url().optional(),
93
+ // Deprecated compatibility fields; the gateway no longer requires project routing.
93
94
  project_id: z.string().optional(),
94
95
  customer: LLMAsAServiceCustomerSchema.optional(),
95
96
  conversationId: z.string().optional(),