@riotprompt/riotprompt 0.0.12 → 0.0.14

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 (61) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +136 -33
  3. package/dist/builder.js +3 -0
  4. package/dist/builder.js.map +1 -1
  5. package/dist/chat.d.ts +2 -0
  6. package/dist/chat.js +2 -0
  7. package/dist/chat.js.map +1 -1
  8. package/dist/cli.cjs +1617 -0
  9. package/dist/cli.d.ts +8 -0
  10. package/dist/config.d.ts +7 -0
  11. package/dist/conversation-logger.js +6 -1
  12. package/dist/conversation-logger.js.map +1 -1
  13. package/dist/execution/anthropic.d.ts +5 -0
  14. package/dist/execution/anthropic.js +70 -0
  15. package/dist/execution/anthropic.js.map +1 -0
  16. package/dist/execution/gemini.d.ts +5 -0
  17. package/dist/execution/gemini.js +122 -0
  18. package/dist/execution/gemini.js.map +1 -0
  19. package/dist/execution/index.d.ts +10 -0
  20. package/dist/execution/index.js +53 -0
  21. package/dist/execution/index.js.map +1 -0
  22. package/dist/execution/openai.d.ts +5 -0
  23. package/dist/execution/openai.js +45 -0
  24. package/dist/execution/openai.js.map +1 -0
  25. package/dist/execution/provider.d.ts +18 -0
  26. package/dist/formatter.js +42 -14
  27. package/dist/formatter.js.map +1 -1
  28. package/dist/loader.js +3 -0
  29. package/dist/loader.js.map +1 -1
  30. package/dist/model-config.d.ts +1 -0
  31. package/dist/model-config.js +19 -18
  32. package/dist/model-config.js.map +1 -1
  33. package/dist/override.js +3 -0
  34. package/dist/override.js.map +1 -1
  35. package/dist/prompt.d.ts +19 -1
  36. package/dist/prompt.js +11 -2
  37. package/dist/prompt.js.map +1 -1
  38. package/dist/recipes.d.ts +108 -0
  39. package/dist/recipes.js +198 -30
  40. package/dist/recipes.js.map +1 -1
  41. package/dist/riotprompt.cjs +930 -123
  42. package/dist/riotprompt.cjs.map +1 -1
  43. package/dist/riotprompt.d.ts +3 -0
  44. package/dist/riotprompt.js +6 -0
  45. package/dist/riotprompt.js.map +1 -1
  46. package/dist/serializer.d.ts +5 -0
  47. package/dist/serializer.js +220 -0
  48. package/dist/serializer.js.map +1 -0
  49. package/dist/writer.d.ts +2 -0
  50. package/dist/writer.js +91 -0
  51. package/dist/writer.js.map +1 -0
  52. package/guide/architecture.md +51 -0
  53. package/guide/configuration.md +51 -0
  54. package/guide/development.md +62 -0
  55. package/guide/index.md +55 -0
  56. package/guide/usage.md +99 -0
  57. package/package.json +15 -3
  58. package/vite.config.cli.ts +49 -0
  59. package/BUG-ANALYSIS.md +0 -523
  60. package/CODE-REVIEW-SUMMARY.md +0 -330
  61. package/FIXES-APPLIED.md +0 -437
@@ -0,0 +1,18 @@
1
+ import { Request } from '../chat';
2
+ export interface ProviderResponse {
3
+ content: string;
4
+ model: string;
5
+ usage?: {
6
+ inputTokens: number;
7
+ outputTokens: number;
8
+ };
9
+ }
10
+ export interface ExecutionOptions {
11
+ apiKey?: string;
12
+ model?: string;
13
+ temperature?: number;
14
+ maxTokens?: number;
15
+ }
16
+ export interface Provider {
17
+ execute(request: Request, options?: ExecutionOptions): Promise<ProviderResponse>;
18
+ }
package/dist/formatter.js CHANGED
@@ -99,24 +99,52 @@ const create = (formatterOptions)=>{
99
99
  const formatPrompt = (model, prompt)=>{
100
100
  logger.silly('Formatting prompt');
101
101
  const chatRequest = createRequest(model);
102
- if (prompt.persona) {
103
- [
104
- prompt.persona
105
- ].forEach((persona)=>{
106
- chatRequest.addMessage(formatPersona(model, persona));
102
+ // --- System/Role Message Construction ---
103
+ // Collect sections that belong in the system/developer prompt (Persona, Tone, Constraints, etc.)
104
+ const systemSections = [];
105
+ if (prompt.persona) systemSections.push(prompt.persona);
106
+ if (prompt.tone) systemSections.push(prompt.tone);
107
+ if (prompt.constraints) systemSections.push(prompt.constraints);
108
+ if (prompt.safeguards) systemSections.push(prompt.safeguards);
109
+ if (prompt.responseFormat) systemSections.push(prompt.responseFormat);
110
+ if (systemSections.length > 0) {
111
+ // Combine all system sections into one system message content
112
+ const systemContent = systemSections.map((section)=>formatSection(section)).join('\n\n');
113
+ chatRequest.addMessage({
114
+ role: getPersonaRole(model),
115
+ content: systemContent
116
+ });
117
+ }
118
+ // --- User/Task Message Construction ---
119
+ // Logical flow: Context -> Examples -> Instructions -> Content -> Reasoning -> Recap
120
+ // This structure guides the model through the context and examples before presenting the core task
121
+ const userSections = [
122
+ prompt.contexts,
123
+ prompt.examples,
124
+ prompt.instructions,
125
+ prompt.contents,
126
+ prompt.reasoning,
127
+ prompt.recap
128
+ ];
129
+ let formattedUserContent = "";
130
+ for (const section of userSections){
131
+ if (section) {
132
+ formattedUserContent += formatSection(section) + '\n\n';
133
+ }
134
+ }
135
+ // Ensure we always have a user message, or if we have content to send
136
+ if (formattedUserContent.trim().length > 0 || systemSections.length === 0) {
137
+ chatRequest.addMessage({
138
+ role: "user",
139
+ content: formattedUserContent.trim() || " "
107
140
  });
108
141
  }
109
- let formattedAreas = formatSection(prompt.instructions) + '\n\n';
110
- if (prompt.contents) {
111
- formattedAreas += formatSection(prompt.contents) + '\n\n';
142
+ if (prompt.schema) {
143
+ chatRequest.responseFormat = prompt.schema;
112
144
  }
113
- if (prompt.contexts) {
114
- formattedAreas += formatSection(prompt.contexts) + '\n\n';
145
+ if (prompt.validator) {
146
+ chatRequest.validator = prompt.validator;
115
147
  }
116
- chatRequest.addMessage({
117
- role: "user",
118
- content: formattedAreas
119
- });
120
148
  return chatRequest;
121
149
  };
122
150
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"formatter.js","sources":["../src/formatter.ts"],"sourcesContent":["import { Instruction } from \"riotprompt\";\nimport { z } from \"zod\";\nimport * as Chat from \"./chat\";\nimport { getPersonaRole, Message, Model } from \"./chat\";\nimport { DEFAULT_FORMAT_OPTIONS } from \"./constants\";\nimport { Section } from \"./items/section\";\nimport { Weighted } from \"./items/weighted\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { Prompt } from \"./prompt\";\nimport { clean, stringifyJSON } from \"./util/general\";\n\nexport const SectionSeparatorSchema = z.enum([\"tag\", \"markdown\"]);\nexport const SectionTitlePropertySchema = z.enum([\"title\", \"name\"]);\n\nexport type SectionSeparator = z.infer<typeof SectionSeparatorSchema>;\nexport type SectionTitleProperty = z.infer<typeof SectionTitlePropertySchema>;\n\n\nexport const FormatOptionsSchema = z.object({\n sectionSeparator: SectionSeparatorSchema,\n sectionIndentation: z.boolean(),\n sectionTitleProperty: SectionTitlePropertySchema,\n sectionTitlePrefix: z.string().optional(),\n sectionTitleSeparator: z.string().optional(),\n sectionDepth: z.number().default(0),\n});\n\nexport type FormatOptions = z.infer<typeof FormatOptionsSchema>;\n\n\nexport const OptionSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n formatOptions: FormatOptionsSchema.partial().optional().default(DEFAULT_FORMAT_OPTIONS),\n});\n\nexport type Options = z.infer<typeof OptionSchema>;\n\nexport type OptionsParam = Partial<Options>;\n\nexport interface Instance {\n formatPersona: (model: Model, persona: Section<Instruction>) => Message;\n format: <T extends Weighted>(weightedText: T | Section<T>, sectionDepth?: number) => string;\n formatArray: <T extends Weighted>(items: (T | Section<T>)[], sectionDepth?: number) => string;\n formatPrompt: (model: Model, prompt: Prompt) => Chat.Request;\n}\n\n// Type guard to check if an object is a Section\nfunction isSection<T extends Weighted>(obj: T | Section<T>): obj is Section<T> {\n return obj && typeof obj === 'object' && 'items' in obj && Array.isArray((obj as Section<T>).items);\n}\n\n// Type guard to check if an object is a Section\nfunction isWeighted<T extends Weighted>(obj: T | Section<T>): obj is T {\n return obj && typeof obj === 'object' && 'text' in obj;\n}\n\n\nexport const create = (formatterOptions?: OptionsParam): Instance => {\n const options: Required<Options> = OptionSchema.parse(formatterOptions || {}) as Required<Options>;\n\n const logger = wrapLogger(options.logger, 'Formatter');\n\n let formatOptions: FormatOptions = DEFAULT_FORMAT_OPTIONS;\n if (options?.formatOptions) {\n formatOptions = {\n ...formatOptions,\n ...clean(options.formatOptions),\n };\n }\n\n const formatPersona = (model: Model, persona: Section<Instruction>): Message => {\n logger.silly(`Formatting persona`);\n if (persona) {\n const formattedPersona = formatSection(persona);\n\n return {\n role: getPersonaRole(model),\n content: `${formattedPersona}`,\n }\n } else {\n throw new Error(\"Persona is required\");\n }\n }\n\n const format = <T extends Weighted>(\n item: T | Section<T>,\n sectionDepth?: number,\n ): string => {\n logger.silly(`Formatting ${isSection(item) ? \"section\" : \"item\"} Item: %s`, stringifyJSON(item));\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n logger.silly(`\\t\\tCurrent section depth: ${currentSectionDepth}`);\n\n let result: string = \"\";\n if (isSection(item)) {\n result = formatSection(item, currentSectionDepth + 1);\n } else if (isWeighted(item)) {\n result = item.text;\n } else {\n //If the item is neither a section nor a weighted item, it is empty.\n result = '';\n }\n return result;\n }\n\n const formatSection = <T extends Weighted>(section: Section<T>, sectionDepth?: number): string => {\n logger.silly(`Formatting section`);\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n logger.silly(`\\t\\tCurrent section depth: ${currentSectionDepth}`);\n\n if (section) {\n const formattedItems = section.items.map(item => format(item, currentSectionDepth)).join(\"\\n\\n\");\n\n if (formatOptions.sectionSeparator === \"tag\") {\n return `<${section.title ?? \"section\"}>\\n${formattedItems}\\n</${section.title ?? \"section\"}>`;\n } else {\n // Use the current section depth for heading level\n const headingLevel = currentSectionDepth;\n const hashes = '#'.repeat(headingLevel);\n logger.silly(`\\t\\tHeading level: ${headingLevel}`);\n logger.silly(`\\t\\tSection title: ${section.title}`);\n return `${hashes} ${formatOptions.sectionTitlePrefix ? `${formatOptions.sectionTitlePrefix} ${formatOptions.sectionTitleSeparator} ` : \"\"}${section.title}\\n\\n${formattedItems}`;\n }\n } else {\n return '';\n }\n }\n\n // Helper function to format arrays of items or sections\n const formatArray = <T extends Weighted>(\n items: (T | Section<T>)[],\n sectionDepth?: number\n ): string => {\n logger.silly(`Formatting array`);\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n return items.map(item => format(item, currentSectionDepth)).join(\"\\n\\n\");\n }\n\n const formatPrompt = (model: Model, prompt: Prompt): Chat.Request => {\n logger.silly('Formatting prompt');\n const chatRequest: Chat.Request = Chat.createRequest(model);\n\n if (prompt.persona) {\n [prompt.persona].forEach((persona: Section<Instruction>) => {\n chatRequest.addMessage(formatPersona(model, persona));\n });\n }\n\n let formattedAreas: string = formatSection(prompt.instructions) + '\\n\\n';\n\n if (prompt.contents) {\n formattedAreas += formatSection(prompt.contents) + '\\n\\n';\n }\n\n if (prompt.contexts) {\n formattedAreas += formatSection(prompt.contexts) + '\\n\\n';\n }\n\n chatRequest.addMessage({\n role: \"user\",\n content: formattedAreas,\n });\n\n return chatRequest;\n }\n\n return {\n formatPersona,\n format,\n formatPrompt,\n formatArray,\n }\n}\n"],"names":["SectionSeparatorSchema","z","enum","SectionTitlePropertySchema","FormatOptionsSchema","object","sectionSeparator","sectionIndentation","boolean","sectionTitleProperty","sectionTitlePrefix","string","optional","sectionTitleSeparator","sectionDepth","number","default","OptionSchema","logger","any","DEFAULT_LOGGER","formatOptions","partial","DEFAULT_FORMAT_OPTIONS","isSection","obj","Array","isArray","items","isWeighted","create","formatterOptions","options","parse","wrapLogger","clean","formatPersona","model","persona","silly","formattedPersona","formatSection","role","getPersonaRole","content","Error","format","item","stringifyJSON","currentSectionDepth","result","text","section","formattedItems","map","join","title","headingLevel","hashes","repeat","formatArray","formatPrompt","prompt","chatRequest","Chat","forEach","addMessage","formattedAreas","instructions","contents","contexts"],"mappings":"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"}
1
+ {"version":3,"file":"formatter.js","sources":["../src/formatter.ts"],"sourcesContent":["import { Instruction } from \"riotprompt\";\nimport { z } from \"zod\";\nimport * as Chat from \"./chat\";\nimport { getPersonaRole, Message, Model } from \"./chat\";\nimport { DEFAULT_FORMAT_OPTIONS } from \"./constants\";\nimport { Section } from \"./items/section\";\nimport { Weighted } from \"./items/weighted\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { Prompt } from \"./prompt\";\nimport { clean, stringifyJSON } from \"./util/general\";\n\nexport const SectionSeparatorSchema = z.enum([\"tag\", \"markdown\"]);\nexport const SectionTitlePropertySchema = z.enum([\"title\", \"name\"]);\n\nexport type SectionSeparator = z.infer<typeof SectionSeparatorSchema>;\nexport type SectionTitleProperty = z.infer<typeof SectionTitlePropertySchema>;\n\n\nexport const FormatOptionsSchema = z.object({\n sectionSeparator: SectionSeparatorSchema,\n sectionIndentation: z.boolean(),\n sectionTitleProperty: SectionTitlePropertySchema,\n sectionTitlePrefix: z.string().optional(),\n sectionTitleSeparator: z.string().optional(),\n sectionDepth: z.number().default(0),\n});\n\nexport type FormatOptions = z.infer<typeof FormatOptionsSchema>;\n\n\nexport const OptionSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n formatOptions: FormatOptionsSchema.partial().optional().default(DEFAULT_FORMAT_OPTIONS),\n});\n\nexport type Options = z.infer<typeof OptionSchema>;\n\nexport type OptionsParam = Partial<Options>;\n\nexport interface Instance {\n formatPersona: (model: Model, persona: Section<Instruction>) => Message;\n format: <T extends Weighted>(weightedText: T | Section<T>, sectionDepth?: number) => string;\n formatArray: <T extends Weighted>(items: (T | Section<T>)[], sectionDepth?: number) => string;\n formatPrompt: (model: Model, prompt: Prompt) => Chat.Request;\n}\n\n// Type guard to check if an object is a Section\nfunction isSection<T extends Weighted>(obj: T | Section<T>): obj is Section<T> {\n return obj && typeof obj === 'object' && 'items' in obj && Array.isArray((obj as Section<T>).items);\n}\n\n// Type guard to check if an object is a Section\nfunction isWeighted<T extends Weighted>(obj: T | Section<T>): obj is T {\n return obj && typeof obj === 'object' && 'text' in obj;\n}\n\n\nexport const create = (formatterOptions?: OptionsParam): Instance => {\n const options: Required<Options> = OptionSchema.parse(formatterOptions || {}) as Required<Options>;\n\n const logger = wrapLogger(options.logger, 'Formatter');\n\n let formatOptions: FormatOptions = DEFAULT_FORMAT_OPTIONS;\n if (options?.formatOptions) {\n formatOptions = {\n ...formatOptions,\n ...clean(options.formatOptions),\n };\n }\n\n const formatPersona = (model: Model, persona: Section<Instruction>): Message => {\n logger.silly(`Formatting persona`);\n if (persona) {\n const formattedPersona = formatSection(persona);\n\n return {\n role: getPersonaRole(model),\n content: `${formattedPersona}`,\n }\n } else {\n throw new Error(\"Persona is required\");\n }\n }\n\n const format = <T extends Weighted>(\n item: T | Section<T>,\n sectionDepth?: number,\n ): string => {\n logger.silly(`Formatting ${isSection(item) ? \"section\" : \"item\"} Item: %s`, stringifyJSON(item));\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n logger.silly(`\\t\\tCurrent section depth: ${currentSectionDepth}`);\n\n let result: string = \"\";\n if (isSection(item)) {\n result = formatSection(item, currentSectionDepth + 1);\n } else if (isWeighted(item)) {\n result = item.text;\n } else {\n //If the item is neither a section nor a weighted item, it is empty.\n result = '';\n }\n return result;\n }\n\n const formatSection = <T extends Weighted>(section: Section<T>, sectionDepth?: number): string => {\n logger.silly(`Formatting section`);\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n logger.silly(`\\t\\tCurrent section depth: ${currentSectionDepth}`);\n\n if (section) {\n const formattedItems = section.items.map(item => format(item, currentSectionDepth)).join(\"\\n\\n\");\n\n if (formatOptions.sectionSeparator === \"tag\") {\n return `<${section.title ?? \"section\"}>\\n${formattedItems}\\n</${section.title ?? \"section\"}>`;\n } else {\n // Use the current section depth for heading level\n const headingLevel = currentSectionDepth;\n const hashes = '#'.repeat(headingLevel);\n logger.silly(`\\t\\tHeading level: ${headingLevel}`);\n logger.silly(`\\t\\tSection title: ${section.title}`);\n return `${hashes} ${formatOptions.sectionTitlePrefix ? `${formatOptions.sectionTitlePrefix} ${formatOptions.sectionTitleSeparator} ` : \"\"}${section.title}\\n\\n${formattedItems}`;\n }\n } else {\n return '';\n }\n }\n\n // Helper function to format arrays of items or sections\n const formatArray = <T extends Weighted>(\n items: (T | Section<T>)[],\n sectionDepth?: number\n ): string => {\n logger.silly(`Formatting array`);\n const currentSectionDepth = sectionDepth ?? formatOptions.sectionDepth;\n return items.map(item => format(item, currentSectionDepth)).join(\"\\n\\n\");\n }\n\n const formatPrompt = (model: Model, prompt: Prompt): Chat.Request => {\n logger.silly('Formatting prompt');\n const chatRequest: Chat.Request = Chat.createRequest(model);\n\n // --- System/Role Message Construction ---\n // Collect sections that belong in the system/developer prompt (Persona, Tone, Constraints, etc.)\n const systemSections: Section<Instruction>[] = [];\n if (prompt.persona) systemSections.push(prompt.persona);\n if (prompt.tone) systemSections.push(prompt.tone);\n if (prompt.constraints) systemSections.push(prompt.constraints);\n if (prompt.safeguards) systemSections.push(prompt.safeguards);\n if (prompt.responseFormat) systemSections.push(prompt.responseFormat);\n\n if (systemSections.length > 0) {\n // Combine all system sections into one system message content\n const systemContent = systemSections\n .map(section => formatSection(section))\n .join('\\n\\n');\n \n chatRequest.addMessage({\n role: getPersonaRole(model),\n content: systemContent\n });\n }\n\n // --- User/Task Message Construction ---\n // Logical flow: Context -> Examples -> Instructions -> Content -> Reasoning -> Recap\n // This structure guides the model through the context and examples before presenting the core task\n const userSections: (Section<any> | undefined)[] = [\n prompt.contexts,\n prompt.examples,\n prompt.instructions,\n prompt.contents,\n prompt.reasoning,\n prompt.recap\n ];\n\n let formattedUserContent = \"\";\n \n for (const section of userSections) {\n if (section) {\n formattedUserContent += formatSection(section) + '\\n\\n';\n }\n }\n\n // Ensure we always have a user message, or if we have content to send\n if (formattedUserContent.trim().length > 0 || systemSections.length === 0) {\n chatRequest.addMessage({\n role: \"user\",\n content: formattedUserContent.trim() || \" \", // Empty user message if needed (though usually not ideal)\n });\n }\n\n if (prompt.schema) {\n chatRequest.responseFormat = prompt.schema;\n }\n\n if (prompt.validator) {\n chatRequest.validator = prompt.validator;\n }\n\n return chatRequest;\n }\n\n return {\n formatPersona,\n format,\n formatPrompt,\n formatArray,\n }\n}\n"],"names":["SectionSeparatorSchema","z","enum","SectionTitlePropertySchema","FormatOptionsSchema","object","sectionSeparator","sectionIndentation","boolean","sectionTitleProperty","sectionTitlePrefix","string","optional","sectionTitleSeparator","sectionDepth","number","default","OptionSchema","logger","any","DEFAULT_LOGGER","formatOptions","partial","DEFAULT_FORMAT_OPTIONS","isSection","obj","Array","isArray","items","isWeighted","create","formatterOptions","options","parse","wrapLogger","clean","formatPersona","model","persona","silly","formattedPersona","formatSection","role","getPersonaRole","content","Error","format","item","stringifyJSON","currentSectionDepth","result","text","section","formattedItems","map","join","title","headingLevel","hashes","repeat","formatArray","formatPrompt","prompt","chatRequest","Chat","systemSections","push","tone","constraints","safeguards","responseFormat","length","systemContent","addMessage","userSections","contexts","examples","instructions","contents","reasoning","recap","formattedUserContent","trim","schema","validator"],"mappings":"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"}
package/dist/loader.js CHANGED
@@ -13,6 +13,9 @@ import './recipes.js';
13
13
  import './conversation.js';
14
14
  import 'tiktoken';
15
15
  import './tools.js';
16
+ import 'openai';
17
+ import '@anthropic-ai/sdk';
18
+ import '@google/generative-ai';
16
19
  import { create as create$1 } from './util/storage.js';
17
20
 
18
21
  const OptionsSchema = z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"loader.js","sources":["../src/loader.ts"],"sourcesContent":["import path from \"path\";\nimport { z } from \"zod\";\nimport { DEFAULT_IGNORE_PATTERNS } from \"./constants\";\nimport { ParametersSchema } from \"./items/parameters\";\nimport { SectionOptions, SectionOptionsSchema } from \"./items/section\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { Section, Weighted, createSection } from \"./riotprompt\";\nimport * as Storage from \"./util/storage\";\n\nconst OptionsSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n ignorePatterns: z.array(z.string()).optional().default(DEFAULT_IGNORE_PATTERNS),\n parameters: ParametersSchema.optional().default({}),\n});\n\nexport type Options = z.infer<typeof OptionsSchema>;\n\nexport type OptionsParam = Partial<Options>;\n\nexport interface Instance {\n load: <T extends Weighted>(contextDirectories?: string[], options?: SectionOptions) => Promise<Section<T>[]>;\n}\n\n/**\n * Extracts the first header from Markdown text\n * @param markdownText The Markdown text to parse\n * @returns The first header found in the Markdown or null if none is found\n */\nexport function extractFirstHeader(markdownText: string): string | null {\n // Regular expression to match Markdown headers (# Header, ## Header, etc.)\n const headerRegex = /^(#{1,6})\\s+(.+?)(?:\\n|$)/m;\n const match = markdownText.match(headerRegex);\n\n if (match && match[2]) {\n return match[2].trim();\n }\n\n return null;\n}\n\n/**\n * Removes the first header from Markdown text\n * @param markdownText The Markdown text to process\n * @returns The Markdown text without the first header\n */\nexport function removeFirstHeader(markdownText: string): string {\n // Regular expression to match Markdown headers (# Header, ## Header, etc.)\n const headerRegex = /^(#{1,6})\\s+(.+?)(?:\\n|$)/m;\n const match = markdownText.match(headerRegex);\n\n if (match) {\n return markdownText.replace(headerRegex, '').trim();\n }\n\n return markdownText;\n}\n\nexport const create = (loaderOptions?: OptionsParam): Instance => {\n const options: Required<Options> = OptionsSchema.parse(loaderOptions || {}) as Required<Options>;\n const parameters = options.parameters;\n\n const logger = wrapLogger(options.logger, 'Loader');\n const ignorePatterns = options.ignorePatterns;\n\n const loadOptions = (sectionOptions: Partial<SectionOptions> = {}): SectionOptions => {\n const currentOptions = SectionOptionsSchema.parse(sectionOptions);\n return {\n ...currentOptions,\n parameters: {\n ...parameters,\n ...currentOptions.parameters\n }\n }\n }\n\n /**\n * Loads context from the provided directories and returns instruction sections\n *\n * @param contextDirectories Directories containing context files\n * @returns Array of instruction sections loaded from context directories\n */\n const load = async<T extends Weighted>(\n contextDirectories: string[] = [],\n options: Partial<SectionOptions> = {}\n ): Promise<Section<T>[]> => {\n const sectionOptions = loadOptions(options);\n\n logger.debug(`Loading context from ${contextDirectories}`);\n const contextSections: Section<T>[] = [];\n\n if (!contextDirectories || contextDirectories.length === 0) {\n logger.debug(`No context directories provided, returning empty context`);\n return contextSections;\n }\n\n const storage = Storage.create({ log: logger.debug });\n\n // Add context sections from each directory\n for (const contextDir of contextDirectories) {\n try {\n const dirName = path.basename(contextDir);\n logger.debug(`Processing context directory ${dirName}`);\n let mainContextSection: Section<T>;\n\n // First check if there's a context.md file\n const contextFile = path.join(contextDir, 'context.md');\n\n if (await storage.exists(contextFile)) {\n logger.debug(`Found context.md file in ${contextDir}`);\n const mainContextContent = await storage.readFile(contextFile, 'utf8');\n // Extract the first header from the Markdown content\n const firstHeader = extractFirstHeader(mainContextContent);\n\n // Use the header from context.md as the section title, or fallback to directory name\n const sectionTitle = firstHeader || dirName;\n mainContextSection = createSection<T>({ ...sectionOptions, title: sectionTitle });\n\n // Add content without the header\n if (firstHeader) {\n mainContextSection.add(removeFirstHeader(mainContextContent), { ...sectionOptions });\n } else {\n mainContextSection.add(mainContextContent, { ...sectionOptions });\n }\n } else {\n // If no context.md exists, use directory name as title\n mainContextSection = createSection<T>({ ...sectionOptions, title: dirName });\n }\n\n // Get all other files in the directory\n const files = await storage.listFiles(contextDir);\n const ignorePatternsRegex = ignorePatterns.map(pattern => {\n try {\n return new RegExp(pattern, 'i');\n } catch (error) {\n logger.error(`Invalid ignore pattern: ${pattern}`, { error });\n // Return a pattern that matches nothing\n return /(?!)/; // Negative lookahead that always fails\n }\n });\n\n const filteredFiles = files.filter(file => {\n const fullPath = path.join(contextDir, file);\n // Test against both filename and full path for flexibility\n return !ignorePatternsRegex.some(regex => regex.test(file) || regex.test(fullPath));\n });\n\n for (const file of filteredFiles) {\n // Skip the context.md file as it's already processed\n if (file === 'context.md') continue;\n\n logger.debug(`Processing file ${file} in ${contextDir}`);\n const filePath = path.join(contextDir, file);\n if (await storage.isFile(filePath)) {\n const fileContent = await storage.readFile(filePath, 'utf8');\n let sectionName = file;\n let contentToAdd = fileContent;\n\n // Extract header if it exists\n if (file.endsWith('.md')) {\n const fileHeader = extractFirstHeader(fileContent);\n if (fileHeader) {\n sectionName = fileHeader;\n // Remove the header from the content\n contentToAdd = removeFirstHeader(fileContent);\n }\n }\n\n // Create a subsection with the extracted name\n const fileSection = createSection<T>({ ...sectionOptions, title: sectionName });\n fileSection.add(contentToAdd, { ...sectionOptions });\n\n // Add this file section to the main context section\n // Type is correct - Section.add() accepts Section<T>\n mainContextSection.add(fileSection, { ...sectionOptions });\n }\n }\n\n contextSections.push(mainContextSection);\n } catch (error) {\n logger.error(`Error processing context directory ${contextDir}: ${error}`);\n }\n }\n\n return contextSections;\n }\n\n\n return {\n load\n }\n}\n"],"names":["OptionsSchema","z","object","logger","any","optional","default","DEFAULT_LOGGER","ignorePatterns","array","string","DEFAULT_IGNORE_PATTERNS","parameters","ParametersSchema","extractFirstHeader","markdownText","headerRegex","match","trim","removeFirstHeader","replace","create","loaderOptions","options","parse","wrapLogger","loadOptions","sectionOptions","currentOptions","SectionOptionsSchema","load","contextDirectories","debug","contextSections","length","storage","Storage","log","contextDir","dirName","path","basename","mainContextSection","contextFile","join","exists","mainContextContent","readFile","firstHeader","sectionTitle","createSection","title","add","files","listFiles","ignorePatternsRegex","map","pattern","RegExp","error","filteredFiles","filter","file","fullPath","some","regex","test","filePath","isFile","fileContent","sectionName","contentToAdd","endsWith","fileHeader","fileSection","push"],"mappings":"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"}
1
+ {"version":3,"file":"loader.js","sources":["../src/loader.ts"],"sourcesContent":["import path from \"path\";\nimport { z } from \"zod\";\nimport { DEFAULT_IGNORE_PATTERNS } from \"./constants\";\nimport { ParametersSchema } from \"./items/parameters\";\nimport { SectionOptions, SectionOptionsSchema } from \"./items/section\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { Section, Weighted, createSection } from \"./riotprompt\";\nimport * as Storage from \"./util/storage\";\n\nconst OptionsSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n ignorePatterns: z.array(z.string()).optional().default(DEFAULT_IGNORE_PATTERNS),\n parameters: ParametersSchema.optional().default({}),\n});\n\nexport type Options = z.infer<typeof OptionsSchema>;\n\nexport type OptionsParam = Partial<Options>;\n\nexport interface Instance {\n load: <T extends Weighted>(contextDirectories?: string[], options?: SectionOptions) => Promise<Section<T>[]>;\n}\n\n/**\n * Extracts the first header from Markdown text\n * @param markdownText The Markdown text to parse\n * @returns The first header found in the Markdown or null if none is found\n */\nexport function extractFirstHeader(markdownText: string): string | null {\n // Regular expression to match Markdown headers (# Header, ## Header, etc.)\n const headerRegex = /^(#{1,6})\\s+(.+?)(?:\\n|$)/m;\n const match = markdownText.match(headerRegex);\n\n if (match && match[2]) {\n return match[2].trim();\n }\n\n return null;\n}\n\n/**\n * Removes the first header from Markdown text\n * @param markdownText The Markdown text to process\n * @returns The Markdown text without the first header\n */\nexport function removeFirstHeader(markdownText: string): string {\n // Regular expression to match Markdown headers (# Header, ## Header, etc.)\n const headerRegex = /^(#{1,6})\\s+(.+?)(?:\\n|$)/m;\n const match = markdownText.match(headerRegex);\n\n if (match) {\n return markdownText.replace(headerRegex, '').trim();\n }\n\n return markdownText;\n}\n\nexport const create = (loaderOptions?: OptionsParam): Instance => {\n const options: Required<Options> = OptionsSchema.parse(loaderOptions || {}) as Required<Options>;\n const parameters = options.parameters;\n\n const logger = wrapLogger(options.logger, 'Loader');\n const ignorePatterns = options.ignorePatterns;\n\n const loadOptions = (sectionOptions: Partial<SectionOptions> = {}): SectionOptions => {\n const currentOptions = SectionOptionsSchema.parse(sectionOptions);\n return {\n ...currentOptions,\n parameters: {\n ...parameters,\n ...currentOptions.parameters\n }\n }\n }\n\n /**\n * Loads context from the provided directories and returns instruction sections\n *\n * @param contextDirectories Directories containing context files\n * @returns Array of instruction sections loaded from context directories\n */\n const load = async<T extends Weighted>(\n contextDirectories: string[] = [],\n options: Partial<SectionOptions> = {}\n ): Promise<Section<T>[]> => {\n const sectionOptions = loadOptions(options);\n\n logger.debug(`Loading context from ${contextDirectories}`);\n const contextSections: Section<T>[] = [];\n\n if (!contextDirectories || contextDirectories.length === 0) {\n logger.debug(`No context directories provided, returning empty context`);\n return contextSections;\n }\n\n const storage = Storage.create({ log: logger.debug });\n\n // Add context sections from each directory\n for (const contextDir of contextDirectories) {\n try {\n const dirName = path.basename(contextDir);\n logger.debug(`Processing context directory ${dirName}`);\n let mainContextSection: Section<T>;\n\n // First check if there's a context.md file\n const contextFile = path.join(contextDir, 'context.md');\n\n if (await storage.exists(contextFile)) {\n logger.debug(`Found context.md file in ${contextDir}`);\n const mainContextContent = await storage.readFile(contextFile, 'utf8');\n // Extract the first header from the Markdown content\n const firstHeader = extractFirstHeader(mainContextContent);\n\n // Use the header from context.md as the section title, or fallback to directory name\n const sectionTitle = firstHeader || dirName;\n mainContextSection = createSection<T>({ ...sectionOptions, title: sectionTitle });\n\n // Add content without the header\n if (firstHeader) {\n mainContextSection.add(removeFirstHeader(mainContextContent), { ...sectionOptions });\n } else {\n mainContextSection.add(mainContextContent, { ...sectionOptions });\n }\n } else {\n // If no context.md exists, use directory name as title\n mainContextSection = createSection<T>({ ...sectionOptions, title: dirName });\n }\n\n // Get all other files in the directory\n const files = await storage.listFiles(contextDir);\n const ignorePatternsRegex = ignorePatterns.map(pattern => {\n try {\n return new RegExp(pattern, 'i');\n } catch (error) {\n logger.error(`Invalid ignore pattern: ${pattern}`, { error });\n // Return a pattern that matches nothing\n return /(?!)/; // Negative lookahead that always fails\n }\n });\n\n const filteredFiles = files.filter(file => {\n const fullPath = path.join(contextDir, file);\n // Test against both filename and full path for flexibility\n return !ignorePatternsRegex.some(regex => regex.test(file) || regex.test(fullPath));\n });\n\n for (const file of filteredFiles) {\n // Skip the context.md file as it's already processed\n if (file === 'context.md') continue;\n\n logger.debug(`Processing file ${file} in ${contextDir}`);\n const filePath = path.join(contextDir, file);\n if (await storage.isFile(filePath)) {\n const fileContent = await storage.readFile(filePath, 'utf8');\n let sectionName = file;\n let contentToAdd = fileContent;\n\n // Extract header if it exists\n if (file.endsWith('.md')) {\n const fileHeader = extractFirstHeader(fileContent);\n if (fileHeader) {\n sectionName = fileHeader;\n // Remove the header from the content\n contentToAdd = removeFirstHeader(fileContent);\n }\n }\n\n // Create a subsection with the extracted name\n const fileSection = createSection<T>({ ...sectionOptions, title: sectionName });\n fileSection.add(contentToAdd, { ...sectionOptions });\n\n // Add this file section to the main context section\n // Type is correct - Section.add() accepts Section<T>\n mainContextSection.add(fileSection, { ...sectionOptions });\n }\n }\n\n contextSections.push(mainContextSection);\n } catch (error) {\n logger.error(`Error processing context directory ${contextDir}: ${error}`);\n }\n }\n\n return contextSections;\n }\n\n\n return {\n load\n }\n}\n"],"names":["OptionsSchema","z","object","logger","any","optional","default","DEFAULT_LOGGER","ignorePatterns","array","string","DEFAULT_IGNORE_PATTERNS","parameters","ParametersSchema","extractFirstHeader","markdownText","headerRegex","match","trim","removeFirstHeader","replace","create","loaderOptions","options","parse","wrapLogger","loadOptions","sectionOptions","currentOptions","SectionOptionsSchema","load","contextDirectories","debug","contextSections","length","storage","Storage","log","contextDir","dirName","path","basename","mainContextSection","contextFile","join","exists","mainContextContent","readFile","firstHeader","sectionTitle","createSection","title","add","files","listFiles","ignorePatternsRegex","map","pattern","RegExp","error","filteredFiles","filter","file","fullPath","some","regex","test","filePath","isFile","fileContent","sectionName","contentToAdd","endsWith","fileHeader","fileSection","push"],"mappings":"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"}
@@ -40,6 +40,7 @@ export declare class ModelRegistry {
40
40
  /**
41
41
  * Register a model configuration
42
42
  * Configs are checked in registration order (first match wins)
43
+ * New configs are added to the beginning of the list (high priority)
43
44
  */
44
45
  register(config: ModelConfig): void;
45
46
  /**
@@ -19,23 +19,14 @@ function _define_property(obj, key, value) {
19
19
  /**
20
20
  * Register default model configurations
21
21
  */ registerDefaults() {
22
- // GPT-4 family (uses 'system' role)
22
+ // Default fallback (Registered first so it ends up last with unshift)
23
23
  this.register({
24
- pattern: /^gpt-4/i,
24
+ pattern: /.*/,
25
25
  personaRole: 'system',
26
26
  encoding: 'gpt-4o',
27
27
  supportsToolCalls: true,
28
- family: 'gpt-4',
29
- description: 'GPT-4 family models'
30
- });
31
- // O-series models (uses 'developer' role)
32
- this.register({
33
- pattern: /^o\d+/i,
34
- personaRole: 'developer',
35
- encoding: 'gpt-4o',
36
- supportsToolCalls: true,
37
- family: 'o-series',
38
- description: 'O-series reasoning models'
28
+ family: 'unknown',
29
+ description: 'Default fallback configuration'
39
30
  });
40
31
  // Claude family (uses 'system' role)
41
32
  this.register({
@@ -46,27 +37,37 @@ function _define_property(obj, key, value) {
46
37
  family: 'claude',
47
38
  description: 'Claude family models'
48
39
  });
49
- // Default fallback
40
+ // O-series models (uses 'developer' role)
50
41
  this.register({
51
- pattern: /.*/,
42
+ pattern: /^o\d+/i,
43
+ personaRole: 'developer',
44
+ encoding: 'gpt-4o',
45
+ supportsToolCalls: true,
46
+ family: 'o-series',
47
+ description: 'O-series reasoning models'
48
+ });
49
+ // GPT-4 family (uses 'system' role)
50
+ this.register({
51
+ pattern: /^gpt-4/i,
52
52
  personaRole: 'system',
53
53
  encoding: 'gpt-4o',
54
54
  supportsToolCalls: true,
55
- family: 'unknown',
56
- description: 'Default fallback configuration'
55
+ family: 'gpt-4',
56
+ description: 'GPT-4 family models'
57
57
  });
58
58
  this.logger.debug('Registered default model configurations');
59
59
  }
60
60
  /**
61
61
  * Register a model configuration
62
62
  * Configs are checked in registration order (first match wins)
63
+ * New configs are added to the beginning of the list (high priority)
63
64
  */ register(config) {
64
65
  var _config_pattern;
65
66
  // Validate config
66
67
  if (!config.pattern && !config.exactMatch) {
67
68
  throw new Error('Model config must have either pattern or exactMatch');
68
69
  }
69
- this.configs.push(config);
70
+ this.configs.unshift(config);
70
71
  this.cache.clear(); // Clear cache when new config is added
71
72
  this.logger.debug('Registered model config', {
72
73
  family: config.family,
@@ -1 +1 @@
1
- {"version":3,"file":"model-config.js","sources":["../src/model-config.ts"],"sourcesContent":["/**\n * Model Configuration System\n *\n * Provides a flexible, user-configurable system for model detection and configuration\n * that doesn't hardcode model names.\n */\n\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Model role mapping for persona/system messages\n */\nexport type PersonaRole = 'system' | 'developer';\n\n/**\n * Tokenizer encoding to use for token counting\n */\nexport type TokenizerEncoding = 'gpt-4o' | 'cl100k_base' | 'o200k_base';\n\n/**\n * Configuration for a model or model family\n */\nexport interface ModelConfig {\n // Model identification\n pattern?: RegExp; // Pattern to match model name\n exactMatch?: string; // Exact model name match\n\n // Model characteristics\n personaRole: PersonaRole; // Role to use for persona/system messages\n encoding: TokenizerEncoding; // Tokenizer encoding\n\n // Capabilities\n supportsToolCalls?: boolean;\n maxTokens?: number;\n\n // Metadata\n family?: string; // Model family (e.g., 'gpt-4', 'o-series', 'claude')\n description?: string;\n}\n\n/**\n * Model registry for managing model configurations\n */\nexport class ModelRegistry {\n private configs: ModelConfig[];\n private cache: Map<string, ModelConfig>;\n private logger: any;\n\n constructor(logger?: any) {\n this.configs = [];\n this.cache = new Map();\n this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'ModelRegistry');\n\n // Register default configurations\n this.registerDefaults();\n }\n\n /**\n * Register default model configurations\n */\n private registerDefaults(): void {\n // GPT-4 family (uses 'system' role)\n this.register({\n pattern: /^gpt-4/i,\n personaRole: 'system',\n encoding: 'gpt-4o',\n supportsToolCalls: true,\n family: 'gpt-4',\n description: 'GPT-4 family models'\n });\n\n // O-series models (uses 'developer' role)\n this.register({\n pattern: /^o\\d+/i, // Matches o1, o2, o3, o4, etc.\n personaRole: 'developer',\n encoding: 'gpt-4o',\n supportsToolCalls: true,\n family: 'o-series',\n description: 'O-series reasoning models'\n });\n\n // Claude family (uses 'system' role)\n this.register({\n pattern: /^claude/i,\n personaRole: 'system',\n encoding: 'cl100k_base',\n supportsToolCalls: true,\n family: 'claude',\n description: 'Claude family models'\n });\n\n // Default fallback\n this.register({\n pattern: /.*/, // Matches anything\n personaRole: 'system',\n encoding: 'gpt-4o',\n supportsToolCalls: true,\n family: 'unknown',\n description: 'Default fallback configuration'\n });\n\n this.logger.debug('Registered default model configurations');\n }\n\n /**\n * Register a model configuration\n * Configs are checked in registration order (first match wins)\n */\n register(config: ModelConfig): void {\n // Validate config\n if (!config.pattern && !config.exactMatch) {\n throw new Error('Model config must have either pattern or exactMatch');\n }\n\n this.configs.push(config);\n this.cache.clear(); // Clear cache when new config is added\n\n this.logger.debug('Registered model config', {\n family: config.family,\n pattern: config.pattern?.source,\n exactMatch: config.exactMatch\n });\n }\n\n /**\n * Get configuration for a model\n */\n getConfig(model: string): ModelConfig {\n // Check cache first\n if (this.cache.has(model)) {\n return this.cache.get(model)!;\n }\n\n // Find matching config (first match wins)\n for (const config of this.configs) {\n if (config.exactMatch && config.exactMatch === model) {\n this.cache.set(model, config);\n return config;\n }\n\n if (config.pattern && config.pattern.test(model)) {\n this.cache.set(model, config);\n return config;\n }\n }\n\n // Should never happen due to default fallback, but just in case\n throw new Error(`No configuration found for model: ${model}`);\n }\n\n /**\n * Get persona role for a model\n */\n getPersonaRole(model: string): PersonaRole {\n return this.getConfig(model).personaRole;\n }\n\n /**\n * Get tokenizer encoding for a model\n */\n getEncoding(model: string): TokenizerEncoding {\n return this.getConfig(model).encoding;\n }\n\n /**\n * Check if model supports tool calls\n */\n supportsToolCalls(model: string): boolean {\n return this.getConfig(model).supportsToolCalls ?? true;\n }\n\n /**\n * Get model family\n */\n getFamily(model: string): string | undefined {\n return this.getConfig(model).family;\n }\n\n /**\n * Clear all registered configs and reset to defaults\n */\n reset(): void {\n this.configs = [];\n this.cache.clear();\n this.registerDefaults();\n this.logger.debug('Reset model configurations to defaults');\n }\n\n /**\n * Clear cache (useful if configs are modified)\n */\n clearCache(): void {\n this.cache.clear();\n this.logger.debug('Cleared model configuration cache');\n }\n\n /**\n * Get all registered configurations\n */\n getAllConfigs(): ModelConfig[] {\n return [...this.configs];\n }\n}\n\n// Global registry instance\nlet globalRegistry: ModelRegistry | null = null;\n\n/**\n * Get the global model registry\n */\nexport function getModelRegistry(logger?: any): ModelRegistry {\n if (!globalRegistry) {\n globalRegistry = new ModelRegistry(logger);\n }\n return globalRegistry;\n}\n\n/**\n * Reset the global registry (useful for testing)\n */\nexport function resetModelRegistry(): void {\n globalRegistry = null;\n}\n\n/**\n * Helper functions using global registry\n */\nexport function getPersonaRole(model: string): PersonaRole {\n return getModelRegistry().getPersonaRole(model);\n}\n\nexport function getEncoding(model: string): TokenizerEncoding {\n return getModelRegistry().getEncoding(model);\n}\n\nexport function supportsToolCalls(model: string): boolean {\n return getModelRegistry().supportsToolCalls(model);\n}\n\nexport function getModelFamily(model: string): string | undefined {\n return getModelRegistry().getFamily(model);\n}\n\n/**\n * Configure a custom model\n *\n * @example\n * ```typescript\n * // Add support for a new model family\n * configureModel({\n * pattern: /^gemini/i,\n * personaRole: 'system',\n * encoding: 'cl100k_base',\n * family: 'gemini'\n * });\n *\n * // Add specific model override\n * configureModel({\n * exactMatch: 'custom-model-v1',\n * personaRole: 'developer',\n * encoding: 'gpt-4o'\n * });\n * ```\n */\nexport function configureModel(config: ModelConfig): void {\n getModelRegistry().register(config);\n}\n\nexport default ModelRegistry;\n\n"],"names":["ModelRegistry","registerDefaults","register","pattern","personaRole","encoding","supportsToolCalls","family","description","logger","debug","config","exactMatch","Error","configs","push","cache","clear","source","getConfig","model","has","get","set","test","getPersonaRole","getEncoding","getFamily","reset","clearCache","getAllConfigs","Map","wrapLogger","DEFAULT_LOGGER","globalRegistry","getModelRegistry","resetModelRegistry","getModelFamily","configureModel"],"mappings":"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"}
1
+ {"version":3,"file":"model-config.js","sources":["../src/model-config.ts"],"sourcesContent":["/**\n * Model Configuration System\n *\n * Provides a flexible, user-configurable system for model detection and configuration\n * that doesn't hardcode model names.\n */\n\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Model role mapping for persona/system messages\n */\nexport type PersonaRole = 'system' | 'developer';\n\n/**\n * Tokenizer encoding to use for token counting\n */\nexport type TokenizerEncoding = 'gpt-4o' | 'cl100k_base' | 'o200k_base';\n\n/**\n * Configuration for a model or model family\n */\nexport interface ModelConfig {\n // Model identification\n pattern?: RegExp; // Pattern to match model name\n exactMatch?: string; // Exact model name match\n\n // Model characteristics\n personaRole: PersonaRole; // Role to use for persona/system messages\n encoding: TokenizerEncoding; // Tokenizer encoding\n\n // Capabilities\n supportsToolCalls?: boolean;\n maxTokens?: number;\n\n // Metadata\n family?: string; // Model family (e.g., 'gpt-4', 'o-series', 'claude')\n description?: string;\n}\n\n/**\n * Model registry for managing model configurations\n */\nexport class ModelRegistry {\n private configs: ModelConfig[];\n private cache: Map<string, ModelConfig>;\n private logger: any;\n\n constructor(logger?: any) {\n this.configs = [];\n this.cache = new Map();\n this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'ModelRegistry');\n\n // Register default configurations\n this.registerDefaults();\n }\n\n /**\n * Register default model configurations\n */\n private registerDefaults(): void {\n // Default fallback (Registered first so it ends up last with unshift)\n this.register({\n pattern: /.*/, // Matches anything\n personaRole: 'system',\n encoding: 'gpt-4o',\n supportsToolCalls: true,\n family: 'unknown',\n description: 'Default fallback configuration'\n });\n\n // Claude family (uses 'system' role)\n this.register({\n pattern: /^claude/i,\n personaRole: 'system',\n encoding: 'cl100k_base',\n supportsToolCalls: true,\n family: 'claude',\n description: 'Claude family models'\n });\n\n // O-series models (uses 'developer' role)\n this.register({\n pattern: /^o\\d+/i, // Matches o1, o2, o3, o4, etc.\n personaRole: 'developer',\n encoding: 'gpt-4o',\n supportsToolCalls: true,\n family: 'o-series',\n description: 'O-series reasoning models'\n });\n\n // GPT-4 family (uses 'system' role)\n this.register({\n pattern: /^gpt-4/i,\n personaRole: 'system',\n encoding: 'gpt-4o',\n supportsToolCalls: true,\n family: 'gpt-4',\n description: 'GPT-4 family models'\n });\n\n this.logger.debug('Registered default model configurations');\n }\n\n /**\n * Register a model configuration\n * Configs are checked in registration order (first match wins)\n * New configs are added to the beginning of the list (high priority)\n */\n register(config: ModelConfig): void {\n // Validate config\n if (!config.pattern && !config.exactMatch) {\n throw new Error('Model config must have either pattern or exactMatch');\n }\n\n this.configs.unshift(config);\n this.cache.clear(); // Clear cache when new config is added\n\n this.logger.debug('Registered model config', {\n family: config.family,\n pattern: config.pattern?.source,\n exactMatch: config.exactMatch\n });\n }\n\n /**\n * Get configuration for a model\n */\n getConfig(model: string): ModelConfig {\n // Check cache first\n if (this.cache.has(model)) {\n return this.cache.get(model)!;\n }\n\n // Find matching config (first match wins)\n for (const config of this.configs) {\n if (config.exactMatch && config.exactMatch === model) {\n this.cache.set(model, config);\n return config;\n }\n\n if (config.pattern && config.pattern.test(model)) {\n this.cache.set(model, config);\n return config;\n }\n }\n\n // Should never happen due to default fallback, but just in case\n throw new Error(`No configuration found for model: ${model}`);\n }\n\n /**\n * Get persona role for a model\n */\n getPersonaRole(model: string): PersonaRole {\n return this.getConfig(model).personaRole;\n }\n\n /**\n * Get tokenizer encoding for a model\n */\n getEncoding(model: string): TokenizerEncoding {\n return this.getConfig(model).encoding;\n }\n\n /**\n * Check if model supports tool calls\n */\n supportsToolCalls(model: string): boolean {\n return this.getConfig(model).supportsToolCalls ?? true;\n }\n\n /**\n * Get model family\n */\n getFamily(model: string): string | undefined {\n return this.getConfig(model).family;\n }\n\n /**\n * Clear all registered configs and reset to defaults\n */\n reset(): void {\n this.configs = [];\n this.cache.clear();\n this.registerDefaults();\n this.logger.debug('Reset model configurations to defaults');\n }\n\n /**\n * Clear cache (useful if configs are modified)\n */\n clearCache(): void {\n this.cache.clear();\n this.logger.debug('Cleared model configuration cache');\n }\n\n /**\n * Get all registered configurations\n */\n getAllConfigs(): ModelConfig[] {\n return [...this.configs];\n }\n}\n\n// Global registry instance\nlet globalRegistry: ModelRegistry | null = null;\n\n/**\n * Get the global model registry\n */\nexport function getModelRegistry(logger?: any): ModelRegistry {\n if (!globalRegistry) {\n globalRegistry = new ModelRegistry(logger);\n }\n return globalRegistry;\n}\n\n/**\n * Reset the global registry (useful for testing)\n */\nexport function resetModelRegistry(): void {\n globalRegistry = null;\n}\n\n/**\n * Helper functions using global registry\n */\nexport function getPersonaRole(model: string): PersonaRole {\n return getModelRegistry().getPersonaRole(model);\n}\n\nexport function getEncoding(model: string): TokenizerEncoding {\n return getModelRegistry().getEncoding(model);\n}\n\nexport function supportsToolCalls(model: string): boolean {\n return getModelRegistry().supportsToolCalls(model);\n}\n\nexport function getModelFamily(model: string): string | undefined {\n return getModelRegistry().getFamily(model);\n}\n\n/**\n * Configure a custom model\n *\n * @example\n * ```typescript\n * // Add support for a new model family\n * configureModel({\n * pattern: /^gemini/i,\n * personaRole: 'system',\n * encoding: 'cl100k_base',\n * family: 'gemini'\n * });\n *\n * // Add specific model override\n * configureModel({\n * exactMatch: 'custom-model-v1',\n * personaRole: 'developer',\n * encoding: 'gpt-4o'\n * });\n * ```\n */\nexport function configureModel(config: ModelConfig): void {\n getModelRegistry().register(config);\n}\n\nexport default ModelRegistry;\n\n"],"names":["ModelRegistry","registerDefaults","register","pattern","personaRole","encoding","supportsToolCalls","family","description","logger","debug","config","exactMatch","Error","configs","unshift","cache","clear","source","getConfig","model","has","get","set","test","getPersonaRole","getEncoding","getFamily","reset","clearCache","getAllConfigs","Map","wrapLogger","DEFAULT_LOGGER","globalRegistry","getModelRegistry","resetModelRegistry","getModelFamily","configureModel"],"mappings":"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"}
package/dist/override.js CHANGED
@@ -12,6 +12,9 @@ import './recipes.js';
12
12
  import './conversation.js';
13
13
  import 'tiktoken';
14
14
  import './tools.js';
15
+ import 'openai';
16
+ import '@anthropic-ai/sdk';
17
+ import '@google/generative-ai';
15
18
  import { create as create$2 } from './util/storage.js';
16
19
 
17
20
  const OptionsSchema = z.object({
@@ -1 +1 @@
1
- {"version":3,"file":"override.js","sources":["../src/override.ts"],"sourcesContent":["import path from 'path';\nimport { z } from 'zod';\nimport { ParametersSchema } from './items/parameters';\nimport { SectionOptions, SectionOptionsSchema } from './items/section';\nimport { DEFAULT_LOGGER, wrapLogger } from './logger';\nimport { Formatter, Parser, Section, Weighted } from './riotprompt';\nimport * as Storage from './util/storage';\n\nconst OptionsSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n configDirs: z.array(z.string()).default(['./overrides']),\n overrides: z.boolean().default(false),\n parameters: ParametersSchema.optional().default({}),\n});\n\nexport type Options = z.infer<typeof OptionsSchema>;\n\nexport type OptionsParam = Partial<Options>;\n\nexport interface Instance {\n customize: <T extends Weighted>(overrideFile: string, section: Section<T>, sectionOptions?: SectionOptions) => Promise<Section<T>>;\n override: <T extends Weighted>(overrideFile: string, section: Section<T>, sectionOptions?: SectionOptions) =>\n Promise<{ override?: Section<T>, prepends: Section<T>[], appends: Section<T>[] }>;\n}\n\nexport const create = (overrideOptions: OptionsParam = {}): Instance => {\n const options: Required<Options> = OptionsSchema.parse(overrideOptions) as Required<Options>;\n\n const parameters = options.parameters;\n\n const logger = wrapLogger(options?.logger, 'Override');\n const storage = Storage.create({ log: logger.debug });\n\n const loadOptions = (sectionOptions: Partial<SectionOptions> = {}): SectionOptions => {\n const currentOptions = SectionOptionsSchema.parse(sectionOptions);\n return {\n ...currentOptions,\n parameters: {\n ...parameters,\n ...currentOptions.parameters\n }\n }\n }\n\n const override = async <T extends Weighted>(\n overrideFile: string,\n section: Section<T>,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<{ override?: Section<T>, prepends: Section<T>[], appends: Section<T>[] }> => {\n const currentSectionOptions = loadOptions(sectionOptions);\n\n const response: { override?: Section<T>, prepends: Section<T>[], appends: Section<T>[] } = {\n prepends: [],\n appends: []\n };\n\n // Process directories in order (closest to furthest)\n for (let i = 0; i < options.configDirs.length; i++) {\n const configDir = options.configDirs[i];\n const baseFile = path.join(configDir, overrideFile);\n const preFile = baseFile.replace('.md', '-pre.md');\n const postFile = baseFile.replace('.md', '-post.md');\n\n // Check for prepend files (-pre.md)\n if (await storage.exists(preFile)) {\n logger.silly('Found pre file %s (layer %d)', preFile, i + 1);\n const parser = Parser.create({ logger });\n const prependSection = await parser.parseFile<T>(preFile, currentSectionOptions);\n response.prepends.push(prependSection);\n }\n\n // Check for append files (-post.md)\n if (await storage.exists(postFile)) {\n logger.silly('Found post file %s (layer %d)', postFile, i + 1);\n const parser = Parser.create({ logger });\n const appendSection = await parser.parseFile<T>(postFile, currentSectionOptions);\n response.appends.push(appendSection);\n }\n\n // Check for complete override files - use the first (closest) one found\n if (!response.override && await storage.exists(baseFile)) {\n logger.silly('Found base file %s (layer %d)', baseFile, i + 1);\n if (options.overrides) {\n logger.warn('WARNING: Core directives are being overwritten by custom configuration at layer %d', i + 1);\n const parser = Parser.create({ logger });\n response.override = await parser.parseFile<T>(baseFile, currentSectionOptions);\n } else {\n logger.error('ERROR: Core directives are being overwritten by custom configuration');\n throw new Error('Core directives are being overwritten by custom configuration, but overrides are not enabled. Please enable --overrides to use this feature.');\n }\n }\n }\n\n return response;\n }\n\n const customize = async <T extends Weighted>(\n overrideFile: string,\n section: Section<T>,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Section<T>> => {\n const currentSectionOptions = loadOptions(sectionOptions);\n\n const { override: overrideContent, prepends, appends }: { override?: Section<T>, prepends: Section<T>[], appends: Section<T>[] } = await override(overrideFile, section, currentSectionOptions);\n let finalSection: Section<T> = section;\n\n if (overrideContent) {\n if (options.overrides) {\n logger.warn('Override found, replacing content from file %s', overrideContent);\n finalSection = overrideContent;\n } else {\n logger.error('ERROR: Core directives are being overwritten by custom configuration');\n throw new Error('Core directives are being overwritten by custom configuration, but overrides are not enabled. Please enable --overrides to use this feature.');\n }\n }\n\n // Apply prepends in order (closest layer first)\n for (const prepend of prepends) {\n logger.silly('Prepend found, adding to content from file %s', prepend);\n finalSection = finalSection.prepend(prepend);\n }\n\n // Apply appends in reverse order (furthest layers first, then closest)\n // Create a copy to avoid mutating the original array\n const reversedAppends = [...appends].reverse();\n for (const append of reversedAppends) {\n logger.silly('Append found, adding to content from file %s', append);\n finalSection = finalSection.append(append);\n }\n\n const formatter = Formatter.create({ logger });\n logger.silly('Final section %s:\\n\\n%s\\n\\n', logger.name, formatter.format(finalSection));\n\n return finalSection;\n }\n\n return {\n override,\n customize,\n }\n}\n"],"names":["OptionsSchema","z","object","logger","any","optional","default","DEFAULT_LOGGER","configDirs","array","string","overrides","boolean","parameters","ParametersSchema","create","overrideOptions","options","parse","wrapLogger","storage","Storage","log","debug","loadOptions","sectionOptions","currentOptions","SectionOptionsSchema","override","overrideFile","section","currentSectionOptions","response","prepends","appends","i","length","configDir","baseFile","path","join","preFile","replace","postFile","exists","silly","parser","Parser","prependSection","parseFile","push","appendSection","warn","error","Error","customize","overrideContent","finalSection","prepend","reversedAppends","reverse","append","formatter","Formatter","name","format"],"mappings":"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"}
1
+ {"version":3,"file":"override.js","sources":["../src/override.ts"],"sourcesContent":["import path from 'path';\nimport { z } from 'zod';\nimport { ParametersSchema } from './items/parameters';\nimport { SectionOptions, SectionOptionsSchema } from './items/section';\nimport { DEFAULT_LOGGER, wrapLogger } from './logger';\nimport { Formatter, Parser, Section, Weighted } from './riotprompt';\nimport * as Storage from './util/storage';\n\nconst OptionsSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n configDirs: z.array(z.string()).default(['./overrides']),\n overrides: z.boolean().default(false),\n parameters: ParametersSchema.optional().default({}),\n});\n\nexport type Options = z.infer<typeof OptionsSchema>;\n\nexport type OptionsParam = Partial<Options>;\n\nexport interface Instance {\n customize: <T extends Weighted>(overrideFile: string, section: Section<T>, sectionOptions?: SectionOptions) => Promise<Section<T>>;\n override: <T extends Weighted>(overrideFile: string, section: Section<T>, sectionOptions?: SectionOptions) =>\n Promise<{ override?: Section<T>, prepends: Section<T>[], appends: Section<T>[] }>;\n}\n\nexport const create = (overrideOptions: OptionsParam = {}): Instance => {\n const options: Required<Options> = OptionsSchema.parse(overrideOptions) as Required<Options>;\n\n const parameters = options.parameters;\n\n const logger = wrapLogger(options?.logger, 'Override');\n const storage = Storage.create({ log: logger.debug });\n\n const loadOptions = (sectionOptions: Partial<SectionOptions> = {}): SectionOptions => {\n const currentOptions = SectionOptionsSchema.parse(sectionOptions);\n return {\n ...currentOptions,\n parameters: {\n ...parameters,\n ...currentOptions.parameters\n }\n }\n }\n\n const override = async <T extends Weighted>(\n overrideFile: string,\n section: Section<T>,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<{ override?: Section<T>, prepends: Section<T>[], appends: Section<T>[] }> => {\n const currentSectionOptions = loadOptions(sectionOptions);\n\n const response: { override?: Section<T>, prepends: Section<T>[], appends: Section<T>[] } = {\n prepends: [],\n appends: []\n };\n\n // Process directories in order (closest to furthest)\n for (let i = 0; i < options.configDirs.length; i++) {\n const configDir = options.configDirs[i];\n const baseFile = path.join(configDir, overrideFile);\n const preFile = baseFile.replace('.md', '-pre.md');\n const postFile = baseFile.replace('.md', '-post.md');\n\n // Check for prepend files (-pre.md)\n if (await storage.exists(preFile)) {\n logger.silly('Found pre file %s (layer %d)', preFile, i + 1);\n const parser = Parser.create({ logger });\n const prependSection = await parser.parseFile<T>(preFile, currentSectionOptions);\n response.prepends.push(prependSection);\n }\n\n // Check for append files (-post.md)\n if (await storage.exists(postFile)) {\n logger.silly('Found post file %s (layer %d)', postFile, i + 1);\n const parser = Parser.create({ logger });\n const appendSection = await parser.parseFile<T>(postFile, currentSectionOptions);\n response.appends.push(appendSection);\n }\n\n // Check for complete override files - use the first (closest) one found\n if (!response.override && await storage.exists(baseFile)) {\n logger.silly('Found base file %s (layer %d)', baseFile, i + 1);\n if (options.overrides) {\n logger.warn('WARNING: Core directives are being overwritten by custom configuration at layer %d', i + 1);\n const parser = Parser.create({ logger });\n response.override = await parser.parseFile<T>(baseFile, currentSectionOptions);\n } else {\n logger.error('ERROR: Core directives are being overwritten by custom configuration');\n throw new Error('Core directives are being overwritten by custom configuration, but overrides are not enabled. Please enable --overrides to use this feature.');\n }\n }\n }\n\n return response;\n }\n\n const customize = async <T extends Weighted>(\n overrideFile: string,\n section: Section<T>,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Section<T>> => {\n const currentSectionOptions = loadOptions(sectionOptions);\n\n const { override: overrideContent, prepends, appends }: { override?: Section<T>, prepends: Section<T>[], appends: Section<T>[] } = await override(overrideFile, section, currentSectionOptions);\n let finalSection: Section<T> = section;\n\n if (overrideContent) {\n if (options.overrides) {\n logger.warn('Override found, replacing content from file %s', overrideContent);\n finalSection = overrideContent;\n } else {\n logger.error('ERROR: Core directives are being overwritten by custom configuration');\n throw new Error('Core directives are being overwritten by custom configuration, but overrides are not enabled. Please enable --overrides to use this feature.');\n }\n }\n\n // Apply prepends in order (closest layer first)\n for (const prepend of prepends) {\n logger.silly('Prepend found, adding to content from file %s', prepend);\n finalSection = finalSection.prepend(prepend);\n }\n\n // Apply appends in reverse order (furthest layers first, then closest)\n // Create a copy to avoid mutating the original array\n const reversedAppends = [...appends].reverse();\n for (const append of reversedAppends) {\n logger.silly('Append found, adding to content from file %s', append);\n finalSection = finalSection.append(append);\n }\n\n const formatter = Formatter.create({ logger });\n logger.silly('Final section %s:\\n\\n%s\\n\\n', logger.name, formatter.format(finalSection));\n\n return finalSection;\n }\n\n return {\n override,\n customize,\n }\n}\n"],"names":["OptionsSchema","z","object","logger","any","optional","default","DEFAULT_LOGGER","configDirs","array","string","overrides","boolean","parameters","ParametersSchema","create","overrideOptions","options","parse","wrapLogger","storage","Storage","log","debug","loadOptions","sectionOptions","currentOptions","SectionOptionsSchema","override","overrideFile","section","currentSectionOptions","response","prepends","appends","i","length","configDir","baseFile","path","join","preFile","replace","postFile","exists","silly","parser","Parser","prependSection","parseFile","push","appendSection","warn","error","Error","customize","overrideContent","finalSection","prepend","reversedAppends","reverse","append","formatter","Formatter","name","format"],"mappings":"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"}
package/dist/prompt.d.ts CHANGED
@@ -7,10 +7,28 @@ export interface Prompt {
7
7
  instructions: Section<Instruction>;
8
8
  contents?: Section<Content>;
9
9
  contexts?: Section<Context>;
10
+ constraints?: Section<Instruction>;
11
+ tone?: Section<Instruction>;
12
+ examples?: Section<Content>;
13
+ reasoning?: Section<Instruction>;
14
+ responseFormat?: Section<Instruction>;
15
+ recap?: Section<Instruction>;
16
+ safeguards?: Section<Instruction>;
17
+ schema?: any;
18
+ validator?: any;
10
19
  }
11
- export declare const create: ({ persona, instructions, contents, contexts, }: {
20
+ export declare const create: ({ persona, instructions, contents, contexts, constraints, tone, examples, reasoning, responseFormat, recap, safeguards, schema, validator, }: {
12
21
  persona?: Section<Instruction>;
13
22
  instructions: Section<Instruction>;
14
23
  contents?: Section<Content>;
15
24
  contexts?: Section<Context>;
25
+ constraints?: Section<Instruction>;
26
+ tone?: Section<Instruction>;
27
+ examples?: Section<Content>;
28
+ reasoning?: Section<Instruction>;
29
+ responseFormat?: Section<Instruction>;
30
+ recap?: Section<Instruction>;
31
+ safeguards?: Section<Instruction>;
32
+ schema?: any;
33
+ validator?: any;
16
34
  }) => Prompt;
package/dist/prompt.js CHANGED
@@ -1,9 +1,18 @@
1
- const create = ({ persona, instructions, contents, contexts })=>{
1
+ const create = ({ persona, instructions, contents, contexts, constraints, tone, examples, reasoning, responseFormat, recap, safeguards, schema, validator })=>{
2
2
  return {
3
3
  persona,
4
4
  instructions,
5
5
  contents,
6
- contexts
6
+ contexts,
7
+ constraints,
8
+ tone,
9
+ examples,
10
+ reasoning,
11
+ responseFormat,
12
+ recap,
13
+ safeguards,
14
+ schema,
15
+ validator
7
16
  };
8
17
  };
9
18
 
@@ -1 +1 @@
1
- {"version":3,"file":"prompt.js","sources":["../src/prompt.ts"],"sourcesContent":["import { Content } from \"./items/content\";\nimport { Context } from \"./items/context\";\nimport { Instruction } from \"./items/instruction\";\nimport { Section } from \"./items/section\";\n\nexport interface Prompt {\n persona?: Section<Instruction>;\n instructions: Section<Instruction>;\n contents?: Section<Content>;\n contexts?: Section<Context>;\n}\n\nexport const create = ({\n persona,\n instructions,\n contents,\n contexts,\n}: {\n persona?: Section<Instruction>,\n instructions: Section<Instruction>,\n contents?: Section<Content>,\n contexts?: Section<Context>\n}): Prompt => {\n\n return {\n persona,\n instructions,\n contents,\n contexts,\n }\n}"],"names":["create","persona","instructions","contents","contexts"],"mappings":"AAYO,MAAMA,MAAAA,GAAS,CAAC,EACnBC,OAAO,EACPC,YAAY,EACZC,QAAQ,EACRC,QAAQ,EAMX,GAAA;IAEG,OAAO;AACHH,QAAAA,OAAAA;AACAC,QAAAA,YAAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA;AACJ,KAAA;AACJ;;;;"}
1
+ {"version":3,"file":"prompt.js","sources":["../src/prompt.ts"],"sourcesContent":["import { Content } from \"./items/content\";\nimport { Context } from \"./items/context\";\nimport { Instruction } from \"./items/instruction\";\nimport { Section } from \"./items/section\";\n\nexport interface Prompt {\n persona?: Section<Instruction>;\n instructions: Section<Instruction>;\n contents?: Section<Content>;\n contexts?: Section<Context>;\n \n // Extended sections for advanced prompting\n constraints?: Section<Instruction>;\n tone?: Section<Instruction>;\n examples?: Section<Content>;\n reasoning?: Section<Instruction>;\n responseFormat?: Section<Instruction>;\n recap?: Section<Instruction>;\n safeguards?: Section<Instruction>;\n schema?: any; // JSON Schema for the provider\n validator?: any; // Zod schema for validation\n}\n\nexport const create = ({\n persona,\n instructions,\n contents,\n contexts,\n constraints,\n tone,\n examples,\n reasoning,\n responseFormat,\n recap,\n safeguards,\n schema,\n validator,\n}: {\n persona?: Section<Instruction>,\n instructions: Section<Instruction>,\n contents?: Section<Content>,\n contexts?: Section<Context>,\n constraints?: Section<Instruction>,\n tone?: Section<Instruction>,\n examples?: Section<Content>,\n reasoning?: Section<Instruction>,\n responseFormat?: Section<Instruction>,\n recap?: Section<Instruction>,\n safeguards?: Section<Instruction>,\n schema?: any,\n validator?: any,\n}): Prompt => {\n\n return {\n persona,\n instructions,\n contents,\n contexts,\n constraints,\n tone,\n examples,\n reasoning,\n responseFormat,\n recap,\n safeguards,\n schema,\n validator,\n }\n}"],"names":["create","persona","instructions","contents","contexts","constraints","tone","examples","reasoning","responseFormat","recap","safeguards","schema","validator"],"mappings":"AAuBO,MAAMA,MAAAA,GAAS,CAAC,EACnBC,OAAO,EACPC,YAAY,EACZC,QAAQ,EACRC,QAAQ,EACRC,WAAW,EACXC,IAAI,EACJC,QAAQ,EACRC,SAAS,EACTC,cAAc,EACdC,KAAK,EACLC,UAAU,EACVC,MAAM,EACNC,SAAS,EAeZ,GAAA;IAEG,OAAO;AACHZ,QAAAA,OAAAA;AACAC,QAAAA,YAAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,WAAAA;AACAC,QAAAA,IAAAA;AACAC,QAAAA,QAAAA;AACAC,QAAAA,SAAAA;AACAC,QAAAA,cAAAA;AACAC,QAAAA,KAAAA;AACAC,QAAAA,UAAAA;AACAC,QAAAA,MAAAA;AACAC,QAAAA;AACJ,KAAA;AACJ;;;;"}