@riotprompt/riotprompt 0.0.9 → 0.0.10

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 (49) hide show
  1. package/BUG-ANALYSIS.md +523 -0
  2. package/CODE-REVIEW-SUMMARY.md +330 -0
  3. package/FIXES-APPLIED.md +437 -0
  4. package/dist/chat.d.ts +1 -1
  5. package/dist/chat.js +2 -5
  6. package/dist/chat.js.map +1 -1
  7. package/dist/constants.js +1 -2
  8. package/dist/constants.js.map +1 -1
  9. package/dist/context-manager.d.ts +3 -2
  10. package/dist/context-manager.js +29 -6
  11. package/dist/context-manager.js.map +1 -1
  12. package/dist/conversation-logger.d.ts +3 -1
  13. package/dist/conversation-logger.js +41 -4
  14. package/dist/conversation-logger.js.map +1 -1
  15. package/dist/conversation.d.ts +8 -2
  16. package/dist/conversation.js +36 -9
  17. package/dist/conversation.js.map +1 -1
  18. package/dist/items/section.js +3 -3
  19. package/dist/items/section.js.map +1 -1
  20. package/dist/iteration-strategy.d.ts +2 -0
  21. package/dist/iteration-strategy.js +40 -6
  22. package/dist/iteration-strategy.js.map +1 -1
  23. package/dist/loader.js +18 -3
  24. package/dist/loader.js.map +1 -1
  25. package/dist/message-builder.js +4 -2
  26. package/dist/message-builder.js.map +1 -1
  27. package/dist/model-config.d.ts +115 -0
  28. package/dist/model-config.js +205 -0
  29. package/dist/model-config.js.map +1 -0
  30. package/dist/override.js +5 -1
  31. package/dist/override.js.map +1 -1
  32. package/dist/parser.js +3 -3
  33. package/dist/parser.js.map +1 -1
  34. package/dist/recipes.d.ts +1 -1
  35. package/dist/recipes.js +4 -4
  36. package/dist/recipes.js.map +1 -1
  37. package/dist/reflection.js +5 -2
  38. package/dist/reflection.js.map +1 -1
  39. package/dist/riotprompt.cjs +439 -94
  40. package/dist/riotprompt.cjs.map +1 -1
  41. package/dist/riotprompt.d.ts +2 -0
  42. package/dist/riotprompt.js +1 -0
  43. package/dist/riotprompt.js.map +1 -1
  44. package/dist/token-budget.d.ts +2 -2
  45. package/dist/token-budget.js +23 -26
  46. package/dist/token-budget.js.map +1 -1
  47. package/dist/util/general.js +1 -1
  48. package/dist/util/general.js.map +1 -1
  49. package/package.json +1 -1
@@ -0,0 +1,205 @@
1
+ import { wrapLogger, DEFAULT_LOGGER } from './logger.js';
2
+
3
+ function _define_property(obj, key, value) {
4
+ if (key in obj) {
5
+ Object.defineProperty(obj, key, {
6
+ value: value,
7
+ enumerable: true,
8
+ configurable: true,
9
+ writable: true
10
+ });
11
+ } else {
12
+ obj[key] = value;
13
+ }
14
+ return obj;
15
+ }
16
+ /**
17
+ * Model registry for managing model configurations
18
+ */ class ModelRegistry {
19
+ /**
20
+ * Register default model configurations
21
+ */ registerDefaults() {
22
+ // GPT-4 family (uses 'system' role)
23
+ this.register({
24
+ pattern: /^gpt-4/i,
25
+ personaRole: 'system',
26
+ encoding: 'gpt-4o',
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'
39
+ });
40
+ // Claude family (uses 'system' role)
41
+ this.register({
42
+ pattern: /^claude/i,
43
+ personaRole: 'system',
44
+ encoding: 'cl100k_base',
45
+ supportsToolCalls: true,
46
+ family: 'claude',
47
+ description: 'Claude family models'
48
+ });
49
+ // Default fallback
50
+ this.register({
51
+ pattern: /.*/,
52
+ personaRole: 'system',
53
+ encoding: 'gpt-4o',
54
+ supportsToolCalls: true,
55
+ family: 'unknown',
56
+ description: 'Default fallback configuration'
57
+ });
58
+ this.logger.debug('Registered default model configurations');
59
+ }
60
+ /**
61
+ * Register a model configuration
62
+ * Configs are checked in registration order (first match wins)
63
+ */ register(config) {
64
+ var _config_pattern;
65
+ // Validate config
66
+ if (!config.pattern && !config.exactMatch) {
67
+ throw new Error('Model config must have either pattern or exactMatch');
68
+ }
69
+ this.configs.push(config);
70
+ this.cache.clear(); // Clear cache when new config is added
71
+ this.logger.debug('Registered model config', {
72
+ family: config.family,
73
+ pattern: (_config_pattern = config.pattern) === null || _config_pattern === void 0 ? void 0 : _config_pattern.source,
74
+ exactMatch: config.exactMatch
75
+ });
76
+ }
77
+ /**
78
+ * Get configuration for a model
79
+ */ getConfig(model) {
80
+ // Check cache first
81
+ if (this.cache.has(model)) {
82
+ return this.cache.get(model);
83
+ }
84
+ // Find matching config (first match wins)
85
+ for (const config of this.configs){
86
+ if (config.exactMatch && config.exactMatch === model) {
87
+ this.cache.set(model, config);
88
+ return config;
89
+ }
90
+ if (config.pattern && config.pattern.test(model)) {
91
+ this.cache.set(model, config);
92
+ return config;
93
+ }
94
+ }
95
+ // Should never happen due to default fallback, but just in case
96
+ throw new Error(`No configuration found for model: ${model}`);
97
+ }
98
+ /**
99
+ * Get persona role for a model
100
+ */ getPersonaRole(model) {
101
+ return this.getConfig(model).personaRole;
102
+ }
103
+ /**
104
+ * Get tokenizer encoding for a model
105
+ */ getEncoding(model) {
106
+ return this.getConfig(model).encoding;
107
+ }
108
+ /**
109
+ * Check if model supports tool calls
110
+ */ supportsToolCalls(model) {
111
+ var _this_getConfig_supportsToolCalls;
112
+ return (_this_getConfig_supportsToolCalls = this.getConfig(model).supportsToolCalls) !== null && _this_getConfig_supportsToolCalls !== void 0 ? _this_getConfig_supportsToolCalls : true;
113
+ }
114
+ /**
115
+ * Get model family
116
+ */ getFamily(model) {
117
+ return this.getConfig(model).family;
118
+ }
119
+ /**
120
+ * Clear all registered configs and reset to defaults
121
+ */ reset() {
122
+ this.configs = [];
123
+ this.cache.clear();
124
+ this.registerDefaults();
125
+ this.logger.debug('Reset model configurations to defaults');
126
+ }
127
+ /**
128
+ * Clear cache (useful if configs are modified)
129
+ */ clearCache() {
130
+ this.cache.clear();
131
+ this.logger.debug('Cleared model configuration cache');
132
+ }
133
+ /**
134
+ * Get all registered configurations
135
+ */ getAllConfigs() {
136
+ return [
137
+ ...this.configs
138
+ ];
139
+ }
140
+ constructor(logger){
141
+ _define_property(this, "configs", void 0);
142
+ _define_property(this, "cache", void 0);
143
+ _define_property(this, "logger", void 0);
144
+ this.configs = [];
145
+ this.cache = new Map();
146
+ this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'ModelRegistry');
147
+ // Register default configurations
148
+ this.registerDefaults();
149
+ }
150
+ }
151
+ // Global registry instance
152
+ let globalRegistry = null;
153
+ /**
154
+ * Get the global model registry
155
+ */ function getModelRegistry(logger) {
156
+ if (!globalRegistry) {
157
+ globalRegistry = new ModelRegistry(logger);
158
+ }
159
+ return globalRegistry;
160
+ }
161
+ /**
162
+ * Reset the global registry (useful for testing)
163
+ */ function resetModelRegistry() {
164
+ globalRegistry = null;
165
+ }
166
+ /**
167
+ * Helper functions using global registry
168
+ */ function getPersonaRole(model) {
169
+ return getModelRegistry().getPersonaRole(model);
170
+ }
171
+ function getEncoding(model) {
172
+ return getModelRegistry().getEncoding(model);
173
+ }
174
+ function supportsToolCalls(model) {
175
+ return getModelRegistry().supportsToolCalls(model);
176
+ }
177
+ function getModelFamily(model) {
178
+ return getModelRegistry().getFamily(model);
179
+ }
180
+ /**
181
+ * Configure a custom model
182
+ *
183
+ * @example
184
+ * ```typescript
185
+ * // Add support for a new model family
186
+ * configureModel({
187
+ * pattern: /^gemini/i,
188
+ * personaRole: 'system',
189
+ * encoding: 'cl100k_base',
190
+ * family: 'gemini'
191
+ * });
192
+ *
193
+ * // Add specific model override
194
+ * configureModel({
195
+ * exactMatch: 'custom-model-v1',
196
+ * personaRole: 'developer',
197
+ * encoding: 'gpt-4o'
198
+ * });
199
+ * ```
200
+ */ function configureModel(config) {
201
+ getModelRegistry().register(config);
202
+ }
203
+
204
+ export { ModelRegistry, configureModel, ModelRegistry as default, getEncoding, getModelFamily, getModelRegistry, getPersonaRole, resetModelRegistry, supportsToolCalls };
205
+ //# sourceMappingURL=model-config.js.map
@@ -0,0 +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":";;;;;;;;;;;;;;;AA0CA;;AAEC,IACM,MAAMA,aAAAA,CAAAA;AAcT;;AAEC,QACD,gBAAQC,GAAyB;;QAE7B,IAAI,CAACC,QAAQ,CAAC;YACVC,OAAAA,EAAS,SAAA;YACTC,WAAAA,EAAa,QAAA;YACbC,QAAAA,EAAU,QAAA;YACVC,iBAAAA,EAAmB,IAAA;YACnBC,MAAAA,EAAQ,OAAA;YACRC,WAAAA,EAAa;AACjB,SAAA,CAAA;;QAGA,IAAI,CAACN,QAAQ,CAAC;YACVC,OAAAA,EAAS,QAAA;YACTC,WAAAA,EAAa,WAAA;YACbC,QAAAA,EAAU,QAAA;YACVC,iBAAAA,EAAmB,IAAA;YACnBC,MAAAA,EAAQ,UAAA;YACRC,WAAAA,EAAa;AACjB,SAAA,CAAA;;QAGA,IAAI,CAACN,QAAQ,CAAC;YACVC,OAAAA,EAAS,UAAA;YACTC,WAAAA,EAAa,QAAA;YACbC,QAAAA,EAAU,aAAA;YACVC,iBAAAA,EAAmB,IAAA;YACnBC,MAAAA,EAAQ,QAAA;YACRC,WAAAA,EAAa;AACjB,SAAA,CAAA;;QAGA,IAAI,CAACN,QAAQ,CAAC;YACVC,OAAAA,EAAS,IAAA;YACTC,WAAAA,EAAa,QAAA;YACbC,QAAAA,EAAU,QAAA;YACVC,iBAAAA,EAAmB,IAAA;YACnBC,MAAAA,EAAQ,SAAA;YACRC,WAAAA,EAAa;AACjB,SAAA,CAAA;AAEA,QAAA,IAAI,CAACC,MAAM,CAACC,KAAK,CAAC,yCAAA,CAAA;AACtB,IAAA;AAEA;;;QAIAR,QAAAA,CAASS,MAAmB,EAAQ;AAWnBA,QAAAA,IAAAA,eAAAA;;AATb,QAAA,IAAI,CAACA,MAAAA,CAAOR,OAAO,IAAI,CAACQ,MAAAA,CAAOC,UAAU,EAAE;AACvC,YAAA,MAAM,IAAIC,KAAAA,CAAM,qDAAA,CAAA;AACpB,QAAA;AAEA,QAAA,IAAI,CAACC,OAAO,CAACC,IAAI,CAACJ,MAAAA,CAAAA;AAClB,QAAA,IAAI,CAACK,KAAK,CAACC,KAAK;AAEhB,QAAA,IAAI,CAACR,MAAM,CAACC,KAAK,CAAC,yBAAA,EAA2B;AACzCH,YAAAA,MAAAA,EAAQI,OAAOJ,MAAM;AACrBJ,YAAAA,OAAO,GAAEQ,eAAAA,GAAAA,MAAAA,CAAOR,OAAO,MAAA,IAAA,IAAdQ,eAAAA,KAAAA,MAAAA,GAAAA,MAAAA,GAAAA,gBAAgBO,MAAM;AAC/BN,YAAAA,UAAAA,EAAYD,OAAOC;AACvB,SAAA,CAAA;AACJ,IAAA;AAEA;;QAGAO,SAAAA,CAAUC,KAAa,EAAe;;AAElC,QAAA,IAAI,IAAI,CAACJ,KAAK,CAACK,GAAG,CAACD,KAAAA,CAAAA,EAAQ;AACvB,YAAA,OAAO,IAAI,CAACJ,KAAK,CAACM,GAAG,CAACF,KAAAA,CAAAA;AAC1B,QAAA;;AAGA,QAAA,KAAK,MAAMT,MAAAA,IAAU,IAAI,CAACG,OAAO,CAAE;AAC/B,YAAA,IAAIH,OAAOC,UAAU,IAAID,MAAAA,CAAOC,UAAU,KAAKQ,KAAAA,EAAO;AAClD,gBAAA,IAAI,CAACJ,KAAK,CAACO,GAAG,CAACH,KAAAA,EAAOT,MAAAA,CAAAA;gBACtB,OAAOA,MAAAA;AACX,YAAA;YAEA,IAAIA,MAAAA,CAAOR,OAAO,IAAIQ,MAAAA,CAAOR,OAAO,CAACqB,IAAI,CAACJ,KAAAA,CAAAA,EAAQ;AAC9C,gBAAA,IAAI,CAACJ,KAAK,CAACO,GAAG,CAACH,KAAAA,EAAOT,MAAAA,CAAAA;gBACtB,OAAOA,MAAAA;AACX,YAAA;AACJ,QAAA;;AAGA,QAAA,MAAM,IAAIE,KAAAA,CAAM,CAAC,kCAAkC,EAAEO,KAAAA,CAAAA,CAAO,CAAA;AAChE,IAAA;AAEA;;QAGAK,cAAAA,CAAeL,KAAa,EAAe;AACvC,QAAA,OAAO,IAAI,CAACD,SAAS,CAACC,OAAOhB,WAAW;AAC5C,IAAA;AAEA;;QAGAsB,WAAAA,CAAYN,KAAa,EAAqB;AAC1C,QAAA,OAAO,IAAI,CAACD,SAAS,CAACC,OAAOf,QAAQ;AACzC,IAAA;AAEA;;QAGAC,iBAAAA,CAAkBc,KAAa,EAAW;AAC/B,QAAA,IAAA,iCAAA;QAAP,OAAA,CAAO,iCAAA,GAAA,IAAI,CAACD,SAAS,CAACC,KAAAA,CAAAA,CAAOd,iBAAiB,MAAA,IAAA,IAAvC,iCAAA,KAAA,MAAA,GAAA,iCAAA,GAA2C,IAAA;AACtD,IAAA;AAEA;;QAGAqB,SAAAA,CAAUP,KAAa,EAAsB;AACzC,QAAA,OAAO,IAAI,CAACD,SAAS,CAACC,OAAOb,MAAM;AACvC,IAAA;AAEA;;AAEC,QACDqB,KAAAA,GAAc;QACV,IAAI,CAACd,OAAO,GAAG,EAAE;QACjB,IAAI,CAACE,KAAK,CAACC,KAAK,EAAA;AAChB,QAAA,IAAI,CAAChB,gBAAgB,EAAA;AACrB,QAAA,IAAI,CAACQ,MAAM,CAACC,KAAK,CAAC,wCAAA,CAAA;AACtB,IAAA;AAEA;;AAEC,QACDmB,UAAAA,GAAmB;QACf,IAAI,CAACb,KAAK,CAACC,KAAK,EAAA;AAChB,QAAA,IAAI,CAACR,MAAM,CAACC,KAAK,CAAC,mCAAA,CAAA;AACtB,IAAA;AAEA;;AAEC,QACDoB,aAAAA,GAA+B;QAC3B,OAAO;AAAI,YAAA,GAAA,IAAI,CAAChB;AAAQ,SAAA;AAC5B,IAAA;AAzJA,IAAA,WAAA,CAAYL,MAAY,CAAE;AAJ1B,QAAA,gBAAA,CAAA,IAAA,EAAQK,WAAR,MAAA,CAAA;AACA,QAAA,gBAAA,CAAA,IAAA,EAAQE,SAAR,MAAA,CAAA;AACA,QAAA,gBAAA,CAAA,IAAA,EAAQP,UAAR,MAAA,CAAA;QAGI,IAAI,CAACK,OAAO,GAAG,EAAE;QACjB,IAAI,CAACE,KAAK,GAAG,IAAIe,GAAAA,EAAAA;AACjB,QAAA,IAAI,CAACtB,MAAM,GAAGuB,UAAAA,CAAWvB,UAAUwB,cAAAA,EAAgB,eAAA,CAAA;;AAGnD,QAAA,IAAI,CAAChC,gBAAgB,EAAA;AACzB,IAAA;AAmJJ;AAEA;AACA,IAAIiC,cAAAA,GAAuC,IAAA;AAE3C;;IAGO,SAASC,gBAAAA,CAAiB1B,MAAY,EAAA;AACzC,IAAA,IAAI,CAACyB,cAAAA,EAAgB;AACjBA,QAAAA,cAAAA,GAAiB,IAAIlC,aAAAA,CAAcS,MAAAA,CAAAA;AACvC,IAAA;IACA,OAAOyB,cAAAA;AACX;AAEA;;AAEC,IACM,SAASE,kBAAAA,GAAAA;IACZF,cAAAA,GAAiB,IAAA;AACrB;AAEA;;IAGO,SAAST,cAAAA,CAAeL,KAAa,EAAA;IACxC,OAAOe,gBAAAA,EAAAA,CAAmBV,cAAc,CAACL,KAAAA,CAAAA;AAC7C;AAEO,SAASM,YAAYN,KAAa,EAAA;IACrC,OAAOe,gBAAAA,EAAAA,CAAmBT,WAAW,CAACN,KAAAA,CAAAA;AAC1C;AAEO,SAASd,kBAAkBc,KAAa,EAAA;IAC3C,OAAOe,gBAAAA,EAAAA,CAAmB7B,iBAAiB,CAACc,KAAAA,CAAAA;AAChD;AAEO,SAASiB,eAAejB,KAAa,EAAA;IACxC,OAAOe,gBAAAA,EAAAA,CAAmBR,SAAS,CAACP,KAAAA,CAAAA;AACxC;AAEA;;;;;;;;;;;;;;;;;;;;IAqBO,SAASkB,cAAAA,CAAe3B,MAAmB,EAAA;AAC9CwB,IAAAA,gBAAAA,EAAAA,CAAmBjC,QAAQ,CAACS,MAAAA,CAAAA;AAChC;;;;"}
package/dist/override.js CHANGED
@@ -105,7 +105,11 @@ const create = (overrideOptions = {})=>{
105
105
  finalSection = finalSection.prepend(prepend);
106
106
  }
107
107
  // Apply appends in reverse order (furthest layers first, then closest)
108
- for (const append of appends.reverse()){
108
+ // Create a copy to avoid mutating the original array
109
+ const reversedAppends = [
110
+ ...appends
111
+ ].reverse();
112
+ for (const append of reversedAppends){
109
113
  logger.silly('Append found, adding to content from file %s', append);
110
114
  finalSection = finalSection.append(append);
111
115
  }
@@ -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 for (const append of appends.reverse()) {\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}"],"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","append","reverse","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/parser.js CHANGED
@@ -39,13 +39,13 @@ const create = (parserOptions)=>{
39
39
  });
40
40
  } catch (error) {
41
41
  // Log the error or handle it appropriately
42
- logger.error(`Error reading or parsing file with marked at ${filePath}:`, error);
43
- throw new Error(`Failed to parse instructions from ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
42
+ logger.error(`Error reading or parsing file at ${filePath}:`, error);
43
+ throw new Error(`Failed to parse content from ${filePath}: ${error instanceof Error ? error.message : String(error)}`);
44
44
  }
45
45
  };
46
46
  /**
47
47
  * Reads Markdown content and parses it into a single Section.
48
- *
48
+ *
49
49
  * - If the content starts with a heading, that becomes the title of the returned Section
50
50
  * - If no heading at the start, creates a Section with no title
51
51
  * - Headers within the content create nested sections based on their depth
@@ -1 +1 @@
1
- {"version":3,"file":"parser.js","sources":["../src/parser.ts"],"sourcesContent":["import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { z } from 'zod';\nimport { ParametersSchema } from './items/parameters';\nimport { Section, SectionOptions, SectionOptionsSchema } from './items/section';\nimport { Weighted } from './items/weighted';\nimport { DEFAULT_LOGGER, wrapLogger } from './logger';\nimport { parseMarkdown } from './parse/markdown';\nimport { parseText } from './parse/text';\nimport { isMarkdown } from './util/markdown';\nimport { isText } from './util/text';\n\nconst OptionsSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\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 parse: <T extends Weighted>(input: string | Buffer, options?: SectionOptions) => Promise<Section<T>>;\n parseFile: <T extends Weighted>(filePath: string, options?: SectionOptions) => Promise<Section<T>>;\n}\n\nexport const create = (parserOptions?: OptionsParam): Instance => {\n const options: Required<Options> = OptionsSchema.parse(parserOptions || {}) as Required<Options>;\n const parameters = options.parameters;\n\n const logger = wrapLogger(options.logger, 'Parser');\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 parseFile = async <T extends Weighted>(\n filePath: string,\n options: Partial<SectionOptions> = {}\n ): Promise<Section<T>> => {\n const currentOptions = loadOptions(options);\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n // Only use the filename as title if no title was explicitly provided\n const fileName = path.basename(filePath, path.extname(filePath));\n return await parse(content, {\n ...currentOptions,\n title: currentOptions?.title || fileName\n });\n } catch (error) {\n // Log the error or handle it appropriately\n logger.error(`Error reading or parsing file with marked at ${filePath}:`, error);\n throw new Error(`Failed to parse instructions from ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Reads Markdown content and parses it into a single Section.\n * \n * - If the content starts with a heading, that becomes the title of the returned Section\n * - If no heading at the start, creates a Section with no title\n * - Headers within the content create nested sections based on their depth\n * - All content is organized in a hierarchical structure based on heading levels\n *\n * @param content The content to parse\n * @returns A Section containing all content in a hierarchical structure\n */\n const parse = async <T extends Weighted>(\n content: string | Buffer,\n options: Partial<SectionOptions> = {}\n ): Promise<Section<T>> => {\n const currentOptions = loadOptions(options);\n\n let mainSection: Section<T>;\n if (isMarkdown(content)) {\n mainSection = await parseMarkdown<T>(content, currentOptions);\n } else if (isText(content)) {\n mainSection = parseText<T>(content, currentOptions);\n } else {\n throw new Error(`Unsupported content supplied to parse, riotprompt currently only supports markdown and text`);\n }\n return mainSection;\n }\n\n return {\n parse,\n parseFile\n }\n}"],"names":["OptionsSchema","z","object","logger","any","optional","default","DEFAULT_LOGGER","parameters","ParametersSchema","create","parserOptions","options","parse","wrapLogger","loadOptions","sectionOptions","currentOptions","SectionOptionsSchema","parseFile","filePath","content","fs","readFile","fileName","path","basename","extname","title","error","Error","message","String","mainSection","isMarkdown","parseMarkdown","isText","parseText"],"mappings":";;;;;;;;;;;AAYA,MAAMA,aAAAA,GAAgBC,CAAAA,CAAEC,MAAM,CAAC;AAC3BC,IAAAA,MAAAA,EAAQF,EAAEG,GAAG,EAAA,CAAGC,QAAQ,EAAA,CAAGC,OAAO,CAACC,cAAAA,CAAAA;AACnCC,IAAAA,UAAAA,EAAYC,gBAAAA,CAAiBJ,QAAQ,EAAA,CAAGC,OAAO,CAAC,EAAC;AACrD,CAAA,CAAA;AAWO,MAAMI,SAAS,CAACC,aAAAA,GAAAA;AACnB,IAAA,MAAMC,OAAAA,GAA6BZ,aAAAA,CAAca,KAAK,CAACF,iBAAiB,EAAC,CAAA;IACzE,MAAMH,UAAAA,GAAaI,QAAQJ,UAAU;AAErC,IAAA,MAAML,MAAAA,GAASW,UAAAA,CAAWF,OAAAA,CAAQT,MAAM,EAAE,QAAA,CAAA;AAE1C,IAAA,MAAMY,WAAAA,GAAc,CAACC,cAAAA,GAA0C,EAAE,GAAA;QAC7D,MAAMC,cAAAA,GAAiBC,oBAAAA,CAAqBL,KAAK,CAACG,cAAAA,CAAAA;QAClD,OAAO;AACH,YAAA,GAAGC,cAAc;YACjBT,UAAAA,EAAY;AACR,gBAAA,GAAGA,UAAU;AACb,gBAAA,GAAGS,eAAeT;AACtB;AACJ,SAAA;AACJ,IAAA,CAAA;AAEA,IAAA,MAAMW,SAAAA,GAAY,OACdC,QAAAA,EACAR,OAAAA,GAAmC,EAAE,GAAA;AAErC,QAAA,MAAMK,iBAAiBF,WAAAA,CAAYH,OAAAA,CAAAA;QACnC,IAAI;AACA,YAAA,MAAMS,OAAAA,GAAU,MAAMC,EAAAA,CAAGC,QAAQ,CAACH,QAAAA,EAAU,OAAA,CAAA;;AAE5C,YAAA,MAAMI,WAAWC,IAAAA,CAAKC,QAAQ,CAACN,QAAAA,EAAUK,IAAAA,CAAKE,OAAO,CAACP,QAAAA,CAAAA,CAAAA;YACtD,OAAO,MAAMP,MAAMQ,OAAAA,EAAS;AACxB,gBAAA,GAAGJ,cAAc;AACjBW,gBAAAA,KAAAA,EAAOX,CAAAA,cAAAA,KAAAA,IAAAA,IAAAA,cAAAA,KAAAA,KAAAA,CAAAA,GAAAA,KAAAA,CAAAA,GAAAA,cAAAA,CAAgBW,KAAK,KAAIJ;AACpC,aAAA,CAAA;AACJ,QAAA,CAAA,CAAE,OAAOK,KAAAA,EAAO;;YAEZ1B,MAAAA,CAAO0B,KAAK,CAAC,CAAC,6CAA6C,EAAET,QAAAA,CAAS,CAAC,CAAC,EAAES,KAAAA,CAAAA;AAC1E,YAAA,MAAM,IAAIC,KAAAA,CAAM,CAAC,kCAAkC,EAAEV,QAAAA,CAAS,EAAE,EAAES,KAAAA,YAAiBC,KAAAA,GAAQD,KAAAA,CAAME,OAAO,GAAGC,OAAOH,KAAAA,CAAAA,CAAAA,CAAQ,CAAA;AAC9H,QAAA;AACJ,IAAA,CAAA;AAEA;;;;;;;;;;AAUC,QACD,MAAMhB,KAAAA,GAAQ,OACVQ,OAAAA,EACAT,OAAAA,GAAmC,EAAE,GAAA;AAErC,QAAA,MAAMK,iBAAiBF,WAAAA,CAAYH,OAAAA,CAAAA;QAEnC,IAAIqB,WAAAA;AACJ,QAAA,IAAIC,WAAWb,OAAAA,CAAAA,EAAU;YACrBY,WAAAA,GAAc,MAAME,cAAiBd,OAAAA,EAASJ,cAAAA,CAAAA;QAClD,CAAA,MAAO,IAAImB,OAAOf,OAAAA,CAAAA,EAAU;AACxBY,YAAAA,WAAAA,GAAcI,UAAahB,OAAAA,EAASJ,cAAAA,CAAAA;QACxC,CAAA,MAAO;AACH,YAAA,MAAM,IAAIa,KAAAA,CAAM,CAAC,2FAA2F,CAAC,CAAA;AACjH,QAAA;QACA,OAAOG,WAAAA;AACX,IAAA,CAAA;IAEA,OAAO;AACHpB,QAAAA,KAAAA;AACAM,QAAAA;AACJ,KAAA;AACJ;;;;"}
1
+ {"version":3,"file":"parser.js","sources":["../src/parser.ts"],"sourcesContent":["import * as fs from 'fs/promises';\nimport * as path from 'path';\nimport { z } from 'zod';\nimport { ParametersSchema } from './items/parameters';\nimport { Section, SectionOptions, SectionOptionsSchema } from './items/section';\nimport { Weighted } from './items/weighted';\nimport { DEFAULT_LOGGER, wrapLogger } from './logger';\nimport { parseMarkdown } from './parse/markdown';\nimport { parseText } from './parse/text';\nimport { isMarkdown } from './util/markdown';\nimport { isText } from './util/text';\n\nconst OptionsSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\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 parse: <T extends Weighted>(input: string | Buffer, options?: SectionOptions) => Promise<Section<T>>;\n parseFile: <T extends Weighted>(filePath: string, options?: SectionOptions) => Promise<Section<T>>;\n}\n\nexport const create = (parserOptions?: OptionsParam): Instance => {\n const options: Required<Options> = OptionsSchema.parse(parserOptions || {}) as Required<Options>;\n const parameters = options.parameters;\n\n const logger = wrapLogger(options.logger, 'Parser');\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 parseFile = async <T extends Weighted>(\n filePath: string,\n options: Partial<SectionOptions> = {}\n ): Promise<Section<T>> => {\n const currentOptions = loadOptions(options);\n try {\n const content = await fs.readFile(filePath, 'utf-8');\n // Only use the filename as title if no title was explicitly provided\n const fileName = path.basename(filePath, path.extname(filePath));\n return await parse(content, {\n ...currentOptions,\n title: currentOptions?.title || fileName\n });\n } catch (error) {\n // Log the error or handle it appropriately\n logger.error(`Error reading or parsing file at ${filePath}:`, error);\n throw new Error(`Failed to parse content from ${filePath}: ${error instanceof Error ? error.message : String(error)}`);\n }\n }\n\n /**\n * Reads Markdown content and parses it into a single Section.\n *\n * - If the content starts with a heading, that becomes the title of the returned Section\n * - If no heading at the start, creates a Section with no title\n * - Headers within the content create nested sections based on their depth\n * - All content is organized in a hierarchical structure based on heading levels\n *\n * @param content The content to parse\n * @returns A Section containing all content in a hierarchical structure\n */\n const parse = async <T extends Weighted>(\n content: string | Buffer,\n options: Partial<SectionOptions> = {}\n ): Promise<Section<T>> => {\n const currentOptions = loadOptions(options);\n\n let mainSection: Section<T>;\n if (isMarkdown(content)) {\n mainSection = await parseMarkdown<T>(content, currentOptions);\n } else if (isText(content)) {\n mainSection = parseText<T>(content, currentOptions);\n } else {\n throw new Error(`Unsupported content supplied to parse, riotprompt currently only supports markdown and text`);\n }\n return mainSection;\n }\n\n return {\n parse,\n parseFile\n }\n}\n"],"names":["OptionsSchema","z","object","logger","any","optional","default","DEFAULT_LOGGER","parameters","ParametersSchema","create","parserOptions","options","parse","wrapLogger","loadOptions","sectionOptions","currentOptions","SectionOptionsSchema","parseFile","filePath","content","fs","readFile","fileName","path","basename","extname","title","error","Error","message","String","mainSection","isMarkdown","parseMarkdown","isText","parseText"],"mappings":"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"}
package/dist/recipes.d.ts CHANGED
@@ -164,6 +164,6 @@ export declare const recipe: (basePath: string) => {
164
164
  cook: () => Promise<Prompt>;
165
165
  buildConversation: (model: Model, tokenBudget?: TokenBudgetConfig) => Promise<ConversationBuilder>;
166
166
  getToolRegistry: () => ToolRegistry | undefined;
167
- executeWith: (llm: LLMClient, strategy: IterationStrategy, tokenBudget?: TokenBudgetConfig) => Promise<StrategyResult>;
167
+ executeWith: (llm: LLMClient, strategy: IterationStrategy, model?: Model, tokenBudget?: TokenBudgetConfig) => Promise<StrategyResult>;
168
168
  };
169
169
  export type { RecipeConfig, ContentItem };
package/dist/recipes.js CHANGED
@@ -290,7 +290,7 @@ const cook = async (config)=>{
290
290
  if (finalConfig.tools) {
291
291
  const tools = Array.isArray(finalConfig.tools) ? finalConfig.tools : finalConfig.tools.getAll();
292
292
  // Filter by categories if specified
293
- const filteredTools = finalConfig.toolCategories ? tools.filter((tool)=>finalConfig.toolCategories.includes(tool.category || '')) : tools;
293
+ const filteredTools = finalConfig.toolCategories ? tools.filter((tool)=>tool.category && finalConfig.toolCategories.includes(tool.category)) : tools;
294
294
  if (filteredTools.length > 0 && finalConfig.toolGuidance) {
295
295
  const guidance = generateToolGuidance(filteredTools, finalConfig.toolGuidance);
296
296
  const toolSection = await parser$1.parse(guidance, {
@@ -454,12 +454,12 @@ const recipe = (basePath)=>{
454
454
  }
455
455
  return undefined;
456
456
  },
457
- executeWith: async (llm, strategy, tokenBudget)=>{
457
+ executeWith: async (llm, strategy, model = 'gpt-4o', tokenBudget)=>{
458
458
  const prompt = await cook(config);
459
459
  const conversation = ConversationBuilder.create({
460
- model: 'gpt-4o'
460
+ model
461
461
  }, config.logger);
462
- conversation.fromPrompt(prompt, 'gpt-4o');
462
+ conversation.fromPrompt(prompt, model);
463
463
  if (tokenBudget) {
464
464
  conversation.withTokenBudget(tokenBudget);
465
465
  }
@@ -1 +1 @@
1
- {"version":3,"file":"recipes.js","sources":["../src/recipes.ts"],"sourcesContent":["import path from \"path\";\nimport { z } from \"zod\";\nimport { Model } from \"./chat\";\nimport { ConversationBuilder } from \"./conversation\";\nimport { ParametersSchema } from \"./items/parameters\";\nimport { SectionOptions } from \"./items/section\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { Content, Context, createPrompt, createSection, Instruction, Loader, Override, Parser, Prompt, Section, Weighted } from \"./riotprompt\";\nimport { type TokenBudgetConfig } from \"./token-budget\";\nimport { Tool, ToolRegistry } from \"./tools\";\nimport { StrategyExecutor, type IterationStrategy, type LLMClient, type StrategyResult } from \"./iteration-strategy\";\n\n// ===== CONFIGURATION SCHEMAS =====\n\nconst ContentItemSchema = z.union([\n z.string(), // Simple string content\n z.object({\n content: z.string(),\n title: z.string().optional(),\n weight: z.number().optional(),\n }),\n z.object({\n path: z.string(),\n title: z.string().optional(),\n weight: z.number().optional(),\n }),\n z.object({\n directories: z.array(z.string()),\n title: z.string().optional(),\n weight: z.number().optional(),\n })\n]);\n\nconst RecipeConfigSchema = z.object({\n // Core settings\n basePath: z.string(),\n logger: z.any().optional().default(DEFAULT_LOGGER),\n overridePaths: z.array(z.string()).optional().default([\"./\"]),\n overrides: z.boolean().optional().default(false),\n parameters: ParametersSchema.optional().default({}),\n\n // Content sections\n persona: ContentItemSchema.optional(),\n instructions: z.array(ContentItemSchema).optional().default([]),\n content: z.array(ContentItemSchema).optional().default([]),\n context: z.array(ContentItemSchema).optional().default([]),\n\n // Templates and inheritance\n extends: z.string().optional(), // Extend another recipe\n template: z.string().optional(), // Generic template name\n\n // Tool integration\n tools: z.any().optional(), // Tool[] | ToolRegistry\n toolGuidance: z.union([\n z.enum(['auto', 'minimal', 'detailed']),\n z.object({\n strategy: z.enum(['adaptive', 'prescriptive', 'minimal']),\n includeExamples: z.boolean().optional(),\n explainWhenToUse: z.boolean().optional(),\n includeCategories: z.boolean().optional(),\n customInstructions: z.string().optional(),\n })\n ]).optional(),\n toolCategories: z.array(z.string()).optional(),\n});\n\ntype RecipeConfig = z.infer<typeof RecipeConfigSchema>;\ntype ContentItem = z.infer<typeof ContentItemSchema>;\n\n// ===== CONFIGURABLE TEMPLATE SYSTEM =====\n\nexport interface ToolGuidanceConfig {\n strategy: 'adaptive' | 'prescriptive' | 'minimal';\n includeExamples?: boolean;\n explainWhenToUse?: boolean;\n includeCategories?: boolean;\n customInstructions?: string;\n}\n\nexport interface TemplateConfig {\n persona?: ContentItem;\n instructions?: ContentItem[];\n content?: ContentItem[];\n context?: ContentItem[];\n tools?: Tool[] | ToolRegistry;\n toolGuidance?: Partial<ToolGuidanceConfig> | 'auto' | 'minimal' | 'detailed';\n}\n\n// User-customizable template registry\nlet TEMPLATES: Record<string, TemplateConfig> = {};\n\n/**\n * Register custom templates with the recipes system\n *\n * @example\n * ```typescript\n * // Register your own templates\n * registerTemplates({\n * myWorkflow: {\n * persona: { path: \"personas/my-persona.md\" },\n * instructions: [{ path: \"instructions/my-instructions.md\" }]\n * },\n * anotherTemplate: {\n * persona: { content: \"You are a helpful assistant\" },\n * instructions: [{ content: \"Follow these steps...\" }]\n * }\n * });\n * ```\n */\nexport const registerTemplates = (templates: Record<string, TemplateConfig>): void => {\n TEMPLATES = { ...TEMPLATES, ...templates };\n};\n\n/**\n * Get currently registered templates\n */\nexport const getTemplates = (): Record<string, TemplateConfig> => ({ ...TEMPLATES });\n\n/**\n * Clear all registered templates\n */\nexport const clearTemplates = (): void => {\n TEMPLATES = {};\n};\n\n// ===== TOOL GUIDANCE GENERATION =====\n\n/**\n * Generate tool guidance instructions based on strategy\n */\nexport const generateToolGuidance = (\n tools: Tool[],\n guidance: ToolGuidanceConfig | 'auto' | 'minimal' | 'detailed'\n): string => {\n if (tools.length === 0) {\n return '';\n }\n\n // Normalize guidance config\n let config: ToolGuidanceConfig;\n if (typeof guidance === 'string') {\n switch (guidance) {\n case 'auto':\n case 'detailed':\n config = { strategy: 'adaptive', includeExamples: true, explainWhenToUse: true };\n break;\n case 'minimal':\n config = { strategy: 'minimal', includeExamples: false, explainWhenToUse: false };\n break;\n default:\n config = { strategy: 'adaptive' };\n }\n } else {\n config = guidance;\n }\n\n let output = '## Available Tools\\n\\n';\n\n if (config.customInstructions) {\n output += config.customInstructions + '\\n\\n';\n }\n\n // Group by category if enabled\n if (config.includeCategories) {\n const categorized = new Map<string, Tool[]>();\n tools.forEach(tool => {\n const category = tool.category || 'General';\n if (!categorized.has(category)) {\n categorized.set(category, []);\n }\n categorized.get(category)!.push(tool);\n });\n\n categorized.forEach((categoryTools, category) => {\n output += `### ${category}\\n\\n`;\n categoryTools.forEach(tool => {\n output += formatToolGuidance(tool, config);\n });\n });\n } else {\n tools.forEach(tool => {\n output += formatToolGuidance(tool, config);\n });\n }\n\n return output;\n};\n\nconst formatToolGuidance = (tool: Tool, config: ToolGuidanceConfig): string => {\n let output = `**${tool.name}**`;\n\n if (tool.cost) {\n output += ` _(${tool.cost})_`;\n }\n\n output += `\\n${tool.description}\\n\\n`;\n\n if (config.strategy !== 'minimal') {\n // Parameters\n const required = tool.parameters.required || [];\n const paramList = Object.entries(tool.parameters.properties)\n .map(([name, param]) => {\n const isRequired = required.includes(name);\n return `- \\`${name}\\`${isRequired ? ' (required)' : ''}: ${param.description}`;\n })\n .join('\\n');\n\n if (paramList) {\n output += 'Parameters:\\n' + paramList + '\\n\\n';\n }\n\n // When to use (adaptive and prescriptive)\n if (config.explainWhenToUse && (config.strategy === 'adaptive' || config.strategy === 'prescriptive')) {\n output += `**When to use:** ${tool.description}\\n\\n`;\n }\n\n // Examples\n if (config.includeExamples && tool.examples && tool.examples.length > 0) {\n output += '**Examples:**\\n';\n tool.examples.forEach(example => {\n output += `- ${example.scenario}: \\`${tool.name}(${JSON.stringify(example.params)})\\`\\n`;\n });\n output += '\\n';\n }\n }\n\n output += '---\\n\\n';\n\n return output;\n};\n\n// ===== CORE RECIPE ENGINE =====\n\nexport const cook = async (config: Partial<RecipeConfig> & { basePath: string }): Promise<Prompt> => {\n // Parse and validate configuration with defaults\n const validatedConfig = RecipeConfigSchema.parse({\n overridePaths: [\"./\"],\n overrides: false,\n parameters: {},\n instructions: [],\n content: [],\n context: [],\n ...config\n });\n\n // Handle template inheritance\n let finalConfig = { ...validatedConfig };\n if (validatedConfig.template) {\n const template = TEMPLATES[validatedConfig.template];\n if (template) {\n finalConfig = {\n ...validatedConfig,\n persona: validatedConfig.persona || template.persona,\n instructions: [\n ...(template.instructions || []),\n ...(validatedConfig.instructions || [])\n ],\n content: [\n ...(template.content || []),\n ...(validatedConfig.content || [])\n ],\n context: [\n ...(template.context || []),\n ...(validatedConfig.context || [])\n ],\n };\n }\n }\n\n // Setup internal services\n const logger = wrapLogger(finalConfig.logger, 'Recipe');\n const parser = Parser.create({ logger });\n const override = Override.create({\n logger,\n configDirs: finalConfig.overridePaths || [\"./\"],\n overrides: finalConfig.overrides || false\n });\n const loader = Loader.create({ logger });\n\n // Create sections\n const personaSection: Section<Instruction> = createSection({ title: \"Persona\" });\n const instructionSection: Section<Instruction> = createSection({ title: \"Instruction\" });\n const contentSection: Section<Content> = createSection({ title: \"Content\" });\n const contextSection: Section<Context> = createSection({ title: \"Context\" });\n\n // Process persona\n if (finalConfig.persona) {\n await processContentItem(finalConfig.persona, personaSection, 'persona', {\n basePath: finalConfig.basePath,\n parser,\n override,\n loader,\n parameters: finalConfig.parameters,\n logger\n });\n }\n\n // Process instructions\n for (const item of finalConfig.instructions || []) {\n await processContentItem(item, instructionSection, 'instruction', {\n basePath: finalConfig.basePath,\n parser,\n override,\n loader,\n parameters: finalConfig.parameters,\n logger\n });\n }\n\n // Generate tool guidance if tools are provided\n if (finalConfig.tools) {\n const tools: Tool[] = Array.isArray(finalConfig.tools)\n ? finalConfig.tools\n : finalConfig.tools.getAll();\n\n // Filter by categories if specified\n const filteredTools: Tool[] = finalConfig.toolCategories\n ? tools.filter((tool: Tool) => finalConfig.toolCategories!.includes(tool.category || ''))\n : tools;\n\n if (filteredTools.length > 0 && finalConfig.toolGuidance) {\n const guidance = generateToolGuidance(filteredTools, finalConfig.toolGuidance);\n const toolSection = await parser.parse(guidance, { parameters: finalConfig.parameters });\n instructionSection.add(toolSection);\n }\n }\n\n // Process content\n for (const item of finalConfig.content || []) {\n await processContentItem(item, contentSection, 'content', {\n basePath: finalConfig.basePath,\n parser,\n override,\n loader,\n parameters: finalConfig.parameters,\n logger\n });\n }\n\n // Process context\n for (const item of finalConfig.context || []) {\n await processContentItem(item, contextSection, 'context', {\n basePath: finalConfig.basePath,\n parser,\n override,\n loader,\n parameters: finalConfig.parameters,\n logger\n });\n }\n\n // Build and return prompt\n return createPrompt({\n persona: personaSection,\n instructions: instructionSection,\n contents: contentSection,\n contexts: contextSection\n });\n};\n\n// ===== CONTENT PROCESSING =====\n\ninterface ProcessingContext {\n basePath: string;\n parser: any;\n override: any;\n loader: any;\n parameters: any;\n logger: any;\n}\n\nconst processContentItem = async <T extends Weighted>(\n item: ContentItem,\n section: Section<T>,\n type: 'persona' | 'instruction' | 'content' | 'context',\n ctx: ProcessingContext\n): Promise<void> => {\n const sectionOptions: SectionOptions = {\n parameters: ctx.parameters,\n };\n\n if (typeof item === 'string') {\n // Simple string content\n const parsedSection = await ctx.parser.parse(item, sectionOptions);\n section.add(parsedSection);\n } else if ('content' in item) {\n // Inline content with options\n const parsedSection = await ctx.parser.parse(item.content, {\n ...sectionOptions,\n title: item.title,\n weight: item.weight,\n });\n section.add(parsedSection);\n } else if ('path' in item) {\n // File path\n const fullPath = path.join(ctx.basePath, item.path);\n const parsedSection = await ctx.parser.parseFile(fullPath, {\n ...sectionOptions,\n title: item.title,\n weight: item.weight,\n });\n const overrideSection = await ctx.override.customize(item.path, parsedSection, sectionOptions);\n section.add(overrideSection);\n } else if ('directories' in item) {\n // Directory loading\n const sections = await ctx.loader.load(item.directories, {\n ...sectionOptions,\n title: item.title,\n weight: item.weight,\n });\n section.add(sections);\n }\n};\n\n// ===== FLUENT RECIPE BUILDER =====\n\nexport const recipe = (basePath: string) => {\n const config: Partial<RecipeConfig> & { basePath: string } = { basePath };\n\n const builder = {\n template: (name: string) => {\n config.template = name;\n return builder;\n },\n with: (partialConfig: Partial<RecipeConfig>) => {\n Object.assign(config, partialConfig);\n return builder;\n },\n persona: (persona: ContentItem) => {\n config.persona = persona;\n return builder;\n },\n instructions: (...instructions: ContentItem[]) => {\n config.instructions = [...(config.instructions || []), ...instructions];\n return builder;\n },\n content: (...content: ContentItem[]) => {\n config.content = [...(config.content || []), ...content];\n return builder;\n },\n context: (...context: ContentItem[]) => {\n config.context = [...(config.context || []), ...context];\n return builder;\n },\n parameters: (parameters: any) => {\n config.parameters = { ...config.parameters, ...parameters };\n return builder;\n },\n overrides: (enabled: boolean) => {\n config.overrides = enabled;\n return builder;\n },\n overridePaths: (paths: string[]) => {\n config.overridePaths = paths;\n return builder;\n },\n tools: (tools: Tool[] | ToolRegistry) => {\n config.tools = tools;\n return builder;\n },\n toolRegistry: (registry: ToolRegistry) => {\n config.tools = registry;\n return builder;\n },\n toolGuidance: (guidance: ToolGuidanceConfig | 'auto' | 'minimal' | 'detailed') => {\n config.toolGuidance = guidance as any;\n return builder;\n },\n toolCategories: (categories: string[]) => {\n config.toolCategories = categories;\n return builder;\n },\n cook: () => cook(config),\n buildConversation: async (model: Model, tokenBudget?: TokenBudgetConfig) => {\n const prompt = await cook(config);\n const conversation = ConversationBuilder.create({ model }, config.logger);\n conversation.fromPrompt(prompt, model);\n\n // Apply token budget if provided\n if (tokenBudget) {\n conversation.withTokenBudget(tokenBudget);\n }\n\n return conversation;\n },\n getToolRegistry: (): ToolRegistry | undefined => {\n if (config.tools instanceof ToolRegistry) {\n return config.tools;\n } else if (Array.isArray(config.tools)) {\n const registry = ToolRegistry.create({}, config.logger);\n registry.registerAll(config.tools);\n return registry;\n }\n return undefined;\n },\n executeWith: async (\n llm: LLMClient,\n strategy: IterationStrategy,\n tokenBudget?: TokenBudgetConfig\n ): Promise<StrategyResult> => {\n const prompt = await cook(config);\n const conversation = ConversationBuilder.create({ model: 'gpt-4o' as Model }, config.logger);\n conversation.fromPrompt(prompt, 'gpt-4o' as Model);\n\n if (tokenBudget) {\n conversation.withTokenBudget(tokenBudget);\n }\n\n const registry = builder.getToolRegistry();\n if (!registry) {\n throw new Error('Tools must be configured to use executeWith');\n }\n\n const executor = new StrategyExecutor(llm, config.logger);\n return executor.execute(conversation, registry, strategy);\n },\n };\n\n return builder;\n};\n\n// Export types for external use\nexport type { RecipeConfig, ContentItem };\n"],"names":["ContentItemSchema","z","union","string","object","content","title","optional","weight","number","path","directories","array","RecipeConfigSchema","basePath","logger","any","default","DEFAULT_LOGGER","overridePaths","overrides","boolean","parameters","ParametersSchema","persona","instructions","context","extends","template","tools","toolGuidance","enum","strategy","includeExamples","explainWhenToUse","includeCategories","customInstructions","toolCategories","TEMPLATES","registerTemplates","templates","getTemplates","clearTemplates","generateToolGuidance","guidance","length","config","output","categorized","Map","forEach","tool","category","has","set","get","push","categoryTools","formatToolGuidance","name","cost","description","required","paramList","Object","entries","properties","map","param","isRequired","includes","join","examples","example","scenario","JSON","stringify","params","cook","validatedConfig","parse","finalConfig","wrapLogger","parser","Parser","override","Override","configDirs","loader","Loader","personaSection","createSection","instructionSection","contentSection","contextSection","processContentItem","item","Array","isArray","getAll","filteredTools","filter","toolSection","add","createPrompt","contents","contexts","section","type","ctx","sectionOptions","parsedSection","fullPath","parseFile","overrideSection","customize","sections","load","recipe","builder","with","partialConfig","assign","enabled","paths","toolRegistry","registry","categories","buildConversation","model","tokenBudget","prompt","conversation","ConversationBuilder","create","fromPrompt","withTokenBudget","getToolRegistry","ToolRegistry","registerAll","undefined","executeWith","llm","Error","executor","StrategyExecutor","execute"],"mappings":"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"}
1
+ {"version":3,"file":"recipes.js","sources":["../src/recipes.ts"],"sourcesContent":["import path from \"path\";\nimport { z } from \"zod\";\nimport { Model } from \"./chat\";\nimport { ConversationBuilder } from \"./conversation\";\nimport { ParametersSchema } from \"./items/parameters\";\nimport { SectionOptions } from \"./items/section\";\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\nimport { Content, Context, createPrompt, createSection, Instruction, Loader, Override, Parser, Prompt, Section, Weighted } from \"./riotprompt\";\nimport { type TokenBudgetConfig } from \"./token-budget\";\nimport { Tool, ToolRegistry } from \"./tools\";\nimport { StrategyExecutor, type IterationStrategy, type LLMClient, type StrategyResult } from \"./iteration-strategy\";\n\n// ===== CONFIGURATION SCHEMAS =====\n\nconst ContentItemSchema = z.union([\n z.string(), // Simple string content\n z.object({\n content: z.string(),\n title: z.string().optional(),\n weight: z.number().optional(),\n }),\n z.object({\n path: z.string(),\n title: z.string().optional(),\n weight: z.number().optional(),\n }),\n z.object({\n directories: z.array(z.string()),\n title: z.string().optional(),\n weight: z.number().optional(),\n })\n]);\n\nconst RecipeConfigSchema = z.object({\n // Core settings\n basePath: z.string(),\n logger: z.any().optional().default(DEFAULT_LOGGER),\n overridePaths: z.array(z.string()).optional().default([\"./\"]),\n overrides: z.boolean().optional().default(false),\n parameters: ParametersSchema.optional().default({}),\n\n // Content sections\n persona: ContentItemSchema.optional(),\n instructions: z.array(ContentItemSchema).optional().default([]),\n content: z.array(ContentItemSchema).optional().default([]),\n context: z.array(ContentItemSchema).optional().default([]),\n\n // Templates and inheritance\n extends: z.string().optional(), // Extend another recipe\n template: z.string().optional(), // Generic template name\n\n // Tool integration\n tools: z.any().optional(), // Tool[] | ToolRegistry\n toolGuidance: z.union([\n z.enum(['auto', 'minimal', 'detailed']),\n z.object({\n strategy: z.enum(['adaptive', 'prescriptive', 'minimal']),\n includeExamples: z.boolean().optional(),\n explainWhenToUse: z.boolean().optional(),\n includeCategories: z.boolean().optional(),\n customInstructions: z.string().optional(),\n })\n ]).optional(),\n toolCategories: z.array(z.string()).optional(),\n});\n\ntype RecipeConfig = z.infer<typeof RecipeConfigSchema>;\ntype ContentItem = z.infer<typeof ContentItemSchema>;\n\n// ===== CONFIGURABLE TEMPLATE SYSTEM =====\n\nexport interface ToolGuidanceConfig {\n strategy: 'adaptive' | 'prescriptive' | 'minimal';\n includeExamples?: boolean;\n explainWhenToUse?: boolean;\n includeCategories?: boolean;\n customInstructions?: string;\n}\n\nexport interface TemplateConfig {\n persona?: ContentItem;\n instructions?: ContentItem[];\n content?: ContentItem[];\n context?: ContentItem[];\n tools?: Tool[] | ToolRegistry;\n toolGuidance?: Partial<ToolGuidanceConfig> | 'auto' | 'minimal' | 'detailed';\n}\n\n// User-customizable template registry\nlet TEMPLATES: Record<string, TemplateConfig> = {};\n\n/**\n * Register custom templates with the recipes system\n *\n * @example\n * ```typescript\n * // Register your own templates\n * registerTemplates({\n * myWorkflow: {\n * persona: { path: \"personas/my-persona.md\" },\n * instructions: [{ path: \"instructions/my-instructions.md\" }]\n * },\n * anotherTemplate: {\n * persona: { content: \"You are a helpful assistant\" },\n * instructions: [{ content: \"Follow these steps...\" }]\n * }\n * });\n * ```\n */\nexport const registerTemplates = (templates: Record<string, TemplateConfig>): void => {\n TEMPLATES = { ...TEMPLATES, ...templates };\n};\n\n/**\n * Get currently registered templates\n */\nexport const getTemplates = (): Record<string, TemplateConfig> => ({ ...TEMPLATES });\n\n/**\n * Clear all registered templates\n */\nexport const clearTemplates = (): void => {\n TEMPLATES = {};\n};\n\n// ===== TOOL GUIDANCE GENERATION =====\n\n/**\n * Generate tool guidance instructions based on strategy\n */\nexport const generateToolGuidance = (\n tools: Tool[],\n guidance: ToolGuidanceConfig | 'auto' | 'minimal' | 'detailed'\n): string => {\n if (tools.length === 0) {\n return '';\n }\n\n // Normalize guidance config\n let config: ToolGuidanceConfig;\n if (typeof guidance === 'string') {\n switch (guidance) {\n case 'auto':\n case 'detailed':\n config = { strategy: 'adaptive', includeExamples: true, explainWhenToUse: true };\n break;\n case 'minimal':\n config = { strategy: 'minimal', includeExamples: false, explainWhenToUse: false };\n break;\n default:\n config = { strategy: 'adaptive' };\n }\n } else {\n config = guidance;\n }\n\n let output = '## Available Tools\\n\\n';\n\n if (config.customInstructions) {\n output += config.customInstructions + '\\n\\n';\n }\n\n // Group by category if enabled\n if (config.includeCategories) {\n const categorized = new Map<string, Tool[]>();\n tools.forEach(tool => {\n const category = tool.category || 'General';\n if (!categorized.has(category)) {\n categorized.set(category, []);\n }\n categorized.get(category)!.push(tool);\n });\n\n categorized.forEach((categoryTools, category) => {\n output += `### ${category}\\n\\n`;\n categoryTools.forEach(tool => {\n output += formatToolGuidance(tool, config);\n });\n });\n } else {\n tools.forEach(tool => {\n output += formatToolGuidance(tool, config);\n });\n }\n\n return output;\n};\n\nconst formatToolGuidance = (tool: Tool, config: ToolGuidanceConfig): string => {\n let output = `**${tool.name}**`;\n\n if (tool.cost) {\n output += ` _(${tool.cost})_`;\n }\n\n output += `\\n${tool.description}\\n\\n`;\n\n if (config.strategy !== 'minimal') {\n // Parameters\n const required = tool.parameters.required || [];\n const paramList = Object.entries(tool.parameters.properties)\n .map(([name, param]) => {\n const isRequired = required.includes(name);\n return `- \\`${name}\\`${isRequired ? ' (required)' : ''}: ${param.description}`;\n })\n .join('\\n');\n\n if (paramList) {\n output += 'Parameters:\\n' + paramList + '\\n\\n';\n }\n\n // When to use (adaptive and prescriptive)\n if (config.explainWhenToUse && (config.strategy === 'adaptive' || config.strategy === 'prescriptive')) {\n output += `**When to use:** ${tool.description}\\n\\n`;\n }\n\n // Examples\n if (config.includeExamples && tool.examples && tool.examples.length > 0) {\n output += '**Examples:**\\n';\n tool.examples.forEach(example => {\n output += `- ${example.scenario}: \\`${tool.name}(${JSON.stringify(example.params)})\\`\\n`;\n });\n output += '\\n';\n }\n }\n\n output += '---\\n\\n';\n\n return output;\n};\n\n// ===== CORE RECIPE ENGINE =====\n\nexport const cook = async (config: Partial<RecipeConfig> & { basePath: string }): Promise<Prompt> => {\n // Parse and validate configuration with defaults\n const validatedConfig = RecipeConfigSchema.parse({\n overridePaths: [\"./\"],\n overrides: false,\n parameters: {},\n instructions: [],\n content: [],\n context: [],\n ...config\n });\n\n // Handle template inheritance\n let finalConfig = { ...validatedConfig };\n if (validatedConfig.template) {\n const template = TEMPLATES[validatedConfig.template];\n if (template) {\n finalConfig = {\n ...validatedConfig,\n persona: validatedConfig.persona || template.persona,\n instructions: [\n ...(template.instructions || []),\n ...(validatedConfig.instructions || [])\n ],\n content: [\n ...(template.content || []),\n ...(validatedConfig.content || [])\n ],\n context: [\n ...(template.context || []),\n ...(validatedConfig.context || [])\n ],\n };\n }\n }\n\n // Setup internal services\n const logger = wrapLogger(finalConfig.logger, 'Recipe');\n const parser = Parser.create({ logger });\n const override = Override.create({\n logger,\n configDirs: finalConfig.overridePaths || [\"./\"],\n overrides: finalConfig.overrides || false\n });\n const loader = Loader.create({ logger });\n\n // Create sections\n const personaSection: Section<Instruction> = createSection({ title: \"Persona\" });\n const instructionSection: Section<Instruction> = createSection({ title: \"Instruction\" });\n const contentSection: Section<Content> = createSection({ title: \"Content\" });\n const contextSection: Section<Context> = createSection({ title: \"Context\" });\n\n // Process persona\n if (finalConfig.persona) {\n await processContentItem(finalConfig.persona, personaSection, 'persona', {\n basePath: finalConfig.basePath,\n parser,\n override,\n loader,\n parameters: finalConfig.parameters,\n logger\n });\n }\n\n // Process instructions\n for (const item of finalConfig.instructions || []) {\n await processContentItem(item, instructionSection, 'instruction', {\n basePath: finalConfig.basePath,\n parser,\n override,\n loader,\n parameters: finalConfig.parameters,\n logger\n });\n }\n\n // Generate tool guidance if tools are provided\n if (finalConfig.tools) {\n const tools: Tool[] = Array.isArray(finalConfig.tools)\n ? finalConfig.tools\n : finalConfig.tools.getAll();\n\n // Filter by categories if specified\n const filteredTools: Tool[] = finalConfig.toolCategories\n ? tools.filter((tool: Tool) => tool.category && finalConfig.toolCategories!.includes(tool.category))\n : tools;\n\n if (filteredTools.length > 0 && finalConfig.toolGuidance) {\n const guidance = generateToolGuidance(filteredTools, finalConfig.toolGuidance);\n const toolSection = await parser.parse(guidance, { parameters: finalConfig.parameters });\n instructionSection.add(toolSection);\n }\n }\n\n // Process content\n for (const item of finalConfig.content || []) {\n await processContentItem(item, contentSection, 'content', {\n basePath: finalConfig.basePath,\n parser,\n override,\n loader,\n parameters: finalConfig.parameters,\n logger\n });\n }\n\n // Process context\n for (const item of finalConfig.context || []) {\n await processContentItem(item, contextSection, 'context', {\n basePath: finalConfig.basePath,\n parser,\n override,\n loader,\n parameters: finalConfig.parameters,\n logger\n });\n }\n\n // Build and return prompt\n return createPrompt({\n persona: personaSection,\n instructions: instructionSection,\n contents: contentSection,\n contexts: contextSection\n });\n};\n\n// ===== CONTENT PROCESSING =====\n\ninterface ProcessingContext {\n basePath: string;\n parser: any;\n override: any;\n loader: any;\n parameters: any;\n logger: any;\n}\n\nconst processContentItem = async <T extends Weighted>(\n item: ContentItem,\n section: Section<T>,\n type: 'persona' | 'instruction' | 'content' | 'context',\n ctx: ProcessingContext\n): Promise<void> => {\n const sectionOptions: SectionOptions = {\n parameters: ctx.parameters,\n };\n\n if (typeof item === 'string') {\n // Simple string content\n const parsedSection = await ctx.parser.parse(item, sectionOptions);\n section.add(parsedSection);\n } else if ('content' in item) {\n // Inline content with options\n const parsedSection = await ctx.parser.parse(item.content, {\n ...sectionOptions,\n title: item.title,\n weight: item.weight,\n });\n section.add(parsedSection);\n } else if ('path' in item) {\n // File path\n const fullPath = path.join(ctx.basePath, item.path);\n const parsedSection = await ctx.parser.parseFile(fullPath, {\n ...sectionOptions,\n title: item.title,\n weight: item.weight,\n });\n const overrideSection = await ctx.override.customize(item.path, parsedSection, sectionOptions);\n section.add(overrideSection);\n } else if ('directories' in item) {\n // Directory loading\n const sections = await ctx.loader.load(item.directories, {\n ...sectionOptions,\n title: item.title,\n weight: item.weight,\n });\n section.add(sections);\n }\n};\n\n// ===== FLUENT RECIPE BUILDER =====\n\nexport const recipe = (basePath: string) => {\n const config: Partial<RecipeConfig> & { basePath: string } = { basePath };\n\n const builder = {\n template: (name: string) => {\n config.template = name;\n return builder;\n },\n with: (partialConfig: Partial<RecipeConfig>) => {\n Object.assign(config, partialConfig);\n return builder;\n },\n persona: (persona: ContentItem) => {\n config.persona = persona;\n return builder;\n },\n instructions: (...instructions: ContentItem[]) => {\n config.instructions = [...(config.instructions || []), ...instructions];\n return builder;\n },\n content: (...content: ContentItem[]) => {\n config.content = [...(config.content || []), ...content];\n return builder;\n },\n context: (...context: ContentItem[]) => {\n config.context = [...(config.context || []), ...context];\n return builder;\n },\n parameters: (parameters: any) => {\n config.parameters = { ...config.parameters, ...parameters };\n return builder;\n },\n overrides: (enabled: boolean) => {\n config.overrides = enabled;\n return builder;\n },\n overridePaths: (paths: string[]) => {\n config.overridePaths = paths;\n return builder;\n },\n tools: (tools: Tool[] | ToolRegistry) => {\n config.tools = tools;\n return builder;\n },\n toolRegistry: (registry: ToolRegistry) => {\n config.tools = registry;\n return builder;\n },\n toolGuidance: (guidance: ToolGuidanceConfig | 'auto' | 'minimal' | 'detailed') => {\n config.toolGuidance = guidance as any;\n return builder;\n },\n toolCategories: (categories: string[]) => {\n config.toolCategories = categories;\n return builder;\n },\n cook: () => cook(config),\n buildConversation: async (model: Model, tokenBudget?: TokenBudgetConfig) => {\n const prompt = await cook(config);\n const conversation = ConversationBuilder.create({ model }, config.logger);\n conversation.fromPrompt(prompt, model);\n\n // Apply token budget if provided\n if (tokenBudget) {\n conversation.withTokenBudget(tokenBudget);\n }\n\n return conversation;\n },\n getToolRegistry: (): ToolRegistry | undefined => {\n if (config.tools instanceof ToolRegistry) {\n return config.tools;\n } else if (Array.isArray(config.tools)) {\n const registry = ToolRegistry.create({}, config.logger);\n registry.registerAll(config.tools);\n return registry;\n }\n return undefined;\n },\n executeWith: async (\n llm: LLMClient,\n strategy: IterationStrategy,\n model: Model = 'gpt-4o',\n tokenBudget?: TokenBudgetConfig\n ): Promise<StrategyResult> => {\n const prompt = await cook(config);\n const conversation = ConversationBuilder.create({ model }, config.logger);\n conversation.fromPrompt(prompt, model);\n\n if (tokenBudget) {\n conversation.withTokenBudget(tokenBudget);\n }\n\n const registry = builder.getToolRegistry();\n if (!registry) {\n throw new Error('Tools must be configured to use executeWith');\n }\n\n const executor = new StrategyExecutor(llm, config.logger);\n return executor.execute(conversation, registry, strategy);\n },\n };\n\n return builder;\n};\n\n// Export types for external use\nexport type { RecipeConfig, ContentItem };\n"],"names":["ContentItemSchema","z","union","string","object","content","title","optional","weight","number","path","directories","array","RecipeConfigSchema","basePath","logger","any","default","DEFAULT_LOGGER","overridePaths","overrides","boolean","parameters","ParametersSchema","persona","instructions","context","extends","template","tools","toolGuidance","enum","strategy","includeExamples","explainWhenToUse","includeCategories","customInstructions","toolCategories","TEMPLATES","registerTemplates","templates","getTemplates","clearTemplates","generateToolGuidance","guidance","length","config","output","categorized","Map","forEach","tool","category","has","set","get","push","categoryTools","formatToolGuidance","name","cost","description","required","paramList","Object","entries","properties","map","param","isRequired","includes","join","examples","example","scenario","JSON","stringify","params","cook","validatedConfig","parse","finalConfig","wrapLogger","parser","Parser","override","Override","configDirs","loader","Loader","personaSection","createSection","instructionSection","contentSection","contextSection","processContentItem","item","Array","isArray","getAll","filteredTools","filter","toolSection","add","createPrompt","contents","contexts","section","type","ctx","sectionOptions","parsedSection","fullPath","parseFile","overrideSection","customize","sections","load","recipe","builder","with","partialConfig","assign","enabled","paths","toolRegistry","registry","categories","buildConversation","model","tokenBudget","prompt","conversation","ConversationBuilder","create","fromPrompt","withTokenBudget","getToolRegistry","ToolRegistry","registerAll","undefined","executeWith","llm","Error","executor","StrategyExecutor","execute"],"mappings":"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"}
@@ -64,10 +64,10 @@ function _define_property(obj, key, value) {
64
64
  // Calculate token usage if model provided
65
65
  let tokenUsage;
66
66
  if (model) {
67
+ let counter;
67
68
  try {
68
- const counter = new TokenCounter(model);
69
+ counter = new TokenCounter(model);
69
70
  const total = counter.countConversation(messages);
70
- counter.dispose();
71
71
  tokenUsage = {
72
72
  total,
73
73
  systemPrompt: 0,
@@ -79,6 +79,9 @@ function _define_property(obj, key, value) {
79
79
  this.logger.warn('Could not calculate token usage', {
80
80
  error
81
81
  });
82
+ } finally{
83
+ // Always dispose of the counter to prevent resource leaks
84
+ counter === null || counter === void 0 ? void 0 : counter.dispose();
82
85
  }
83
86
  }
84
87
  return {