@riotprompt/riotprompt 0.0.7 → 0.0.9

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 (52) hide show
  1. package/.kodrdriv-test-cache.json +6 -0
  2. package/README.md +2 -2
  3. package/dist/builder.d.ts +3 -15
  4. package/dist/builder.js +3 -0
  5. package/dist/builder.js.map +1 -1
  6. package/dist/context-manager.d.ts +135 -0
  7. package/dist/context-manager.js +220 -0
  8. package/dist/context-manager.js.map +1 -0
  9. package/dist/conversation-logger.d.ts +283 -0
  10. package/dist/conversation-logger.js +454 -0
  11. package/dist/conversation-logger.js.map +1 -0
  12. package/dist/conversation.d.ts +271 -0
  13. package/dist/conversation.js +622 -0
  14. package/dist/conversation.js.map +1 -0
  15. package/dist/formatter.d.ts +27 -57
  16. package/dist/formatter.js +2 -2
  17. package/dist/formatter.js.map +1 -1
  18. package/dist/items/parameters.d.ts +1 -1
  19. package/dist/items/section.d.ts +2 -12
  20. package/dist/items/weighted.d.ts +3 -15
  21. package/dist/iteration-strategy.d.ts +231 -0
  22. package/dist/iteration-strategy.js +486 -0
  23. package/dist/iteration-strategy.js.map +1 -0
  24. package/dist/loader.d.ts +3 -11
  25. package/dist/loader.js +3 -0
  26. package/dist/loader.js.map +1 -1
  27. package/dist/message-builder.d.ts +156 -0
  28. package/dist/message-builder.js +254 -0
  29. package/dist/message-builder.js.map +1 -0
  30. package/dist/override.d.ts +3 -13
  31. package/dist/override.js +3 -0
  32. package/dist/override.js.map +1 -1
  33. package/dist/parser.d.ts +2 -8
  34. package/dist/recipes.d.ts +70 -268
  35. package/dist/recipes.js +189 -4
  36. package/dist/recipes.js.map +1 -1
  37. package/dist/reflection.d.ts +250 -0
  38. package/dist/reflection.js +416 -0
  39. package/dist/reflection.js.map +1 -0
  40. package/dist/riotprompt.cjs +3551 -220
  41. package/dist/riotprompt.cjs.map +1 -1
  42. package/dist/riotprompt.d.ts +18 -2
  43. package/dist/riotprompt.js +9 -1
  44. package/dist/riotprompt.js.map +1 -1
  45. package/dist/token-budget.d.ts +177 -0
  46. package/dist/token-budget.js +404 -0
  47. package/dist/token-budget.js.map +1 -0
  48. package/dist/tools.d.ts +239 -0
  49. package/dist/tools.js +324 -0
  50. package/dist/tools.js.map +1 -0
  51. package/package.json +35 -36
  52. package/.cursor/rules/focus-on-prompt.mdc +0 -5
@@ -0,0 +1,6 @@
1
+ {
2
+ "/Users/tobrien/gitw/StJustReckoning/riotprompt": {
3
+ "lastTestRun": 1766867005877,
4
+ "lastCommitHash": "774a024abfaae1be26df53c89871e588ae0b4963"
5
+ }
6
+ }
package/README.md CHANGED
@@ -75,11 +75,11 @@ RiotPrompt is designed to be completely generic and unopinionated. Unlike other
75
75
 
76
76
  ## 🤝 Contributing
77
77
 
78
- Contributions are welcome! Please see our [Contributing Guide](CONTRIBUTING.md) for details. Test.
78
+ Contributions are welcome! Please see our [Contributing Guide](CONTRIBUTING.md) for details.
79
79
 
80
80
  ## 📄 License
81
81
 
82
- MIT License - see [LICENSE](LICENSE) for details.
82
+ Apache-2.0 License - see [LICENSE](LICENSE) for details.
83
83
 
84
84
  ---
85
85
 
package/dist/builder.d.ts CHANGED
@@ -4,22 +4,10 @@ import { Prompt } from './riotprompt';
4
4
  declare const OptionSchema: z.ZodObject<{
5
5
  logger: z.ZodDefault<z.ZodOptional<z.ZodAny>>;
6
6
  basePath: z.ZodString;
7
- overridePaths: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString, "many">>>;
7
+ overridePaths: z.ZodDefault<z.ZodOptional<z.ZodArray<z.ZodString>>>;
8
8
  overrides: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
9
- parameters: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodUnion<[z.ZodString, z.ZodNumber, z.ZodBoolean]>, "many">]>>>>;
10
- }, "strip", z.ZodTypeAny, {
11
- parameters: Record<string, string | number | boolean | (string | number | boolean)[]>;
12
- overrides: boolean;
13
- basePath: string;
14
- overridePaths: string[];
15
- logger?: any;
16
- }, {
17
- basePath: string;
18
- parameters?: Record<string, string | number | boolean | (string | number | boolean)[]> | undefined;
19
- logger?: any;
20
- overrides?: boolean | undefined;
21
- overridePaths?: string[] | undefined;
22
- }>;
9
+ parameters: z.ZodDefault<z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean, z.ZodArray<z.ZodUnion<readonly [z.ZodString, z.ZodNumber, z.ZodBoolean]>>]>>>>;
10
+ }, z.core.$strip>;
23
11
  export type Options = z.infer<typeof OptionSchema>;
24
12
  export type OptionsParam = Required<Pick<Options, 'basePath'>> & Partial<Omit<Options, 'basePath'>>;
25
13
  export interface Instance {
package/dist/builder.js CHANGED
@@ -10,6 +10,9 @@ import { create as create$1 } from './parser.js';
10
10
  import { create as create$3 } from './loader.js';
11
11
  import { create as create$2 } from './override.js';
12
12
  import './recipes.js';
13
+ import './conversation.js';
14
+ import 'tiktoken';
15
+ import './tools.js';
13
16
 
14
17
  const OptionSchema = z.object({
15
18
  logger: z.any().optional().default(DEFAULT_LOGGER),
@@ -1 +1 @@
1
- {"version":3,"file":"builder.js","sources":["../src/builder.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 { Content, Context, createPrompt, createSection, Instruction, Loader, Override, Parser, Prompt, Section, Weighted } from \"./riotprompt\";\n\nconst OptionSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n basePath: z.string(),\n overridePaths: z.array(z.string()).optional().default([\"./\"]),\n overrides: z.boolean().optional().default(false),\n parameters: ParametersSchema.optional().default({}),\n});\n\nexport type Options = z.infer<typeof OptionSchema>;\n\nexport type OptionsParam = Required<Pick<Options, 'basePath'>> & Partial<Omit<Options, 'basePath'>>;\n\nexport interface Instance {\n addPersonaPath(contentPath: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n addContextPath(contentPath: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n addInstructionPath(contentPath: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n addContentPath(contentPath: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n addContent(content: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n addContext(context: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n loadContext(contextDirectories: string[], sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n loadContent(contentDirectories: string[], sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n build(): Promise<Prompt>;\n}\n\nexport const create = (builderOptions: OptionsParam): Instance => {\n const options: Required<Options> = OptionSchema.parse(builderOptions) as Required<Options>;\n\n const logger = wrapLogger(options.logger, 'Builder');\n const parser = Parser.create({ logger });\n const override = Override.create({\n logger, configDirs: options.overridePaths || [\"./\"],\n overrides: options.overrides || false\n });\n const loader = Loader.create({ logger });\n\n const personaSection: Section<Instruction> = createSection({ title: \"Persona\" });\n const contextSection: Section<Context> = createSection({ title: \"Context\" });\n const instructionSection: Section<Instruction> = createSection({ title: \"Instruction\" });\n const contentSection: Section<Content> = createSection({ title: \"Content\" });\n const parameters = options.parameters;\n\n\n const instance: Partial<Instance> = {}\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 loadDirectories = async <T extends Weighted>(\n directories: string[],\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Section<T>[]> => {\n const currentOptions = loadOptions(sectionOptions);\n logger.debug(\"Loading directories\", directories);\n const sections: Section<T>[] = await loader.load<T>(directories, currentOptions);\n return sections;\n }\n\n const loadContext = async (\n contextDirectories: string[],\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n const currentOptions = loadOptions(sectionOptions);\n logger.debug('Loading context', contextDirectories);\n const context: Section<Context>[] = await loadDirectories<Context>(contextDirectories, currentOptions);\n contextSection.add(context);\n return instance as Instance;\n }\n instance.loadContext = loadContext;\n\n const loadContent = async (\n contentDirectories: string[],\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n const currentOptions = loadOptions(sectionOptions);\n const content: Section<Content>[] = await loadDirectories<Content>(contentDirectories, currentOptions);\n contentSection.add(content);\n return instance as Instance;\n }\n instance.loadContent = loadContent;\n\n const loadPath = async <T extends Weighted>(\n contentPath: string,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Section<T>> => {\n const currentOptions = loadOptions(sectionOptions);\n const defaultPath = path.join(options.basePath as string, contentPath);\n const section: Section<T> = await parser.parseFile<T>(defaultPath, currentOptions);\n const overrideSection = await override.customize<T>(contentPath, section, currentOptions);\n return overrideSection;\n }\n\n const addPersonaPath = async (\n contentPath: string,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n const currentOptions = loadOptions(sectionOptions);\n const persona: Section<Instruction> = await loadPath<Instruction>(contentPath, currentOptions);\n personaSection.add(persona);\n return instance as Instance;\n }\n instance.addPersonaPath = addPersonaPath;\n\n const addContextPath = async (\n contentPath: string,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n logger.debug(\"Adding context path\", contentPath);\n const currentOptions = loadOptions(sectionOptions);\n const context: Section<Context> = await loadPath<Context>(contentPath, currentOptions);\n contextSection.add(context);\n return instance as Instance;\n }\n instance.addContextPath = addContextPath;\n\n const addInstructionPath = async (\n contentPath: string,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n logger.debug(\"Adding instruction path\", contentPath);\n const currentOptions = loadOptions(sectionOptions);\n const instruction: Section<Instruction> = await loadPath<Instruction>(contentPath, currentOptions);\n instructionSection.add(instruction);\n return instance as Instance;\n }\n instance.addInstructionPath = addInstructionPath;\n\n const addContentPath = async (\n contentPath: string,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n logger.debug(\"Adding content path\", contentPath);\n const currentOptions = loadOptions(sectionOptions);\n const content: Section<Content> = await loadPath<Content>(contentPath, currentOptions);\n contentSection.add(content);\n return instance as Instance;\n }\n instance.addContentPath = addContentPath;\n\n const addContent = async (\n content: string | Buffer,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n logger.debug(\"Adding content\", typeof content);\n const currentOptions = loadOptions(sectionOptions);\n const parsedContentSection: Section<Content> = await parser.parse<Content>(content, currentOptions);\n contentSection.add(parsedContentSection);\n return instance as Instance;\n }\n instance.addContent = addContent;\n\n const addContext = async (\n context: string | Buffer,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n logger.debug(\"Adding context\", typeof context);\n const currentOptions = loadOptions(sectionOptions);\n const parsedContextSection: Section<Context> = await parser.parse<Context>(context, currentOptions);\n contextSection.add(parsedContextSection);\n return instance as Instance;\n }\n instance.addContext = addContext;\n\n const build = async () => {\n logger.debug(\"Building prompt\", {});\n const prompt = createPrompt({ persona: personaSection, contexts: contextSection, instructions: instructionSection, contents: contentSection });\n return prompt;\n }\n instance.build = build;\n\n return instance as Instance;\n}\n"],"names":["OptionSchema","z","object","logger","any","optional","default","DEFAULT_LOGGER","basePath","string","overridePaths","array","overrides","boolean","parameters","ParametersSchema","create","builderOptions","options","parse","wrapLogger","parser","Parser","override","Override","configDirs","loader","Loader","personaSection","createSection","title","contextSection","instructionSection","contentSection","instance","loadOptions","sectionOptions","currentOptions","SectionOptionsSchema","loadDirectories","directories","debug","sections","load","loadContext","contextDirectories","context","add","loadContent","contentDirectories","content","loadPath","contentPath","defaultPath","path","join","section","parseFile","overrideSection","customize","addPersonaPath","persona","addContextPath","addInstructionPath","instruction","addContentPath","addContent","parsedContentSection","addContext","parsedContextSection","build","prompt","createPrompt","contexts","instructions","contents"],"mappings":"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"}
1
+ {"version":3,"file":"builder.js","sources":["../src/builder.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 { Content, Context, createPrompt, createSection, Instruction, Loader, Override, Parser, Prompt, Section, Weighted } from \"./riotprompt\";\n\nconst OptionSchema = z.object({\n logger: z.any().optional().default(DEFAULT_LOGGER),\n basePath: z.string(),\n overridePaths: z.array(z.string()).optional().default([\"./\"]),\n overrides: z.boolean().optional().default(false),\n parameters: ParametersSchema.optional().default({}),\n});\n\nexport type Options = z.infer<typeof OptionSchema>;\n\nexport type OptionsParam = Required<Pick<Options, 'basePath'>> & Partial<Omit<Options, 'basePath'>>;\n\nexport interface Instance {\n addPersonaPath(contentPath: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n addContextPath(contentPath: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n addInstructionPath(contentPath: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n addContentPath(contentPath: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n addContent(content: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n addContext(context: string, sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n loadContext(contextDirectories: string[], sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n loadContent(contentDirectories: string[], sectionOptions?: Partial<SectionOptions>): Promise<Instance>;\n build(): Promise<Prompt>;\n}\n\nexport const create = (builderOptions: OptionsParam): Instance => {\n const options: Required<Options> = OptionSchema.parse(builderOptions) as Required<Options>;\n\n const logger = wrapLogger(options.logger, 'Builder');\n const parser = Parser.create({ logger });\n const override = Override.create({\n logger, configDirs: options.overridePaths || [\"./\"],\n overrides: options.overrides || false\n });\n const loader = Loader.create({ logger });\n\n const personaSection: Section<Instruction> = createSection({ title: \"Persona\" });\n const contextSection: Section<Context> = createSection({ title: \"Context\" });\n const instructionSection: Section<Instruction> = createSection({ title: \"Instruction\" });\n const contentSection: Section<Content> = createSection({ title: \"Content\" });\n const parameters = options.parameters;\n\n\n const instance: Partial<Instance> = {}\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 loadDirectories = async <T extends Weighted>(\n directories: string[],\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Section<T>[]> => {\n const currentOptions = loadOptions(sectionOptions);\n logger.debug(\"Loading directories\", directories);\n const sections: Section<T>[] = await loader.load<T>(directories, currentOptions);\n return sections;\n }\n\n const loadContext = async (\n contextDirectories: string[],\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n const currentOptions = loadOptions(sectionOptions);\n logger.debug('Loading context', contextDirectories);\n const context: Section<Context>[] = await loadDirectories<Context>(contextDirectories, currentOptions);\n contextSection.add(context);\n return instance as Instance;\n }\n instance.loadContext = loadContext;\n\n const loadContent = async (\n contentDirectories: string[],\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n const currentOptions = loadOptions(sectionOptions);\n const content: Section<Content>[] = await loadDirectories<Content>(contentDirectories, currentOptions);\n contentSection.add(content);\n return instance as Instance;\n }\n instance.loadContent = loadContent;\n\n const loadPath = async <T extends Weighted>(\n contentPath: string,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Section<T>> => {\n const currentOptions = loadOptions(sectionOptions);\n const defaultPath = path.join(options.basePath as string, contentPath);\n const section: Section<T> = await parser.parseFile<T>(defaultPath, currentOptions);\n const overrideSection = await override.customize<T>(contentPath, section, currentOptions);\n return overrideSection;\n }\n\n const addPersonaPath = async (\n contentPath: string,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n const currentOptions = loadOptions(sectionOptions);\n const persona: Section<Instruction> = await loadPath<Instruction>(contentPath, currentOptions);\n personaSection.add(persona);\n return instance as Instance;\n }\n instance.addPersonaPath = addPersonaPath;\n\n const addContextPath = async (\n contentPath: string,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n logger.debug(\"Adding context path\", contentPath);\n const currentOptions = loadOptions(sectionOptions);\n const context: Section<Context> = await loadPath<Context>(contentPath, currentOptions);\n contextSection.add(context);\n return instance as Instance;\n }\n instance.addContextPath = addContextPath;\n\n const addInstructionPath = async (\n contentPath: string,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n logger.debug(\"Adding instruction path\", contentPath);\n const currentOptions = loadOptions(sectionOptions);\n const instruction: Section<Instruction> = await loadPath<Instruction>(contentPath, currentOptions);\n instructionSection.add(instruction);\n return instance as Instance;\n }\n instance.addInstructionPath = addInstructionPath;\n\n const addContentPath = async (\n contentPath: string,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n logger.debug(\"Adding content path\", contentPath);\n const currentOptions = loadOptions(sectionOptions);\n const content: Section<Content> = await loadPath<Content>(contentPath, currentOptions);\n contentSection.add(content);\n return instance as Instance;\n }\n instance.addContentPath = addContentPath;\n\n const addContent = async (\n content: string | Buffer,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n logger.debug(\"Adding content\", typeof content);\n const currentOptions = loadOptions(sectionOptions);\n const parsedContentSection: Section<Content> = await parser.parse<Content>(content, currentOptions);\n contentSection.add(parsedContentSection);\n return instance as Instance;\n }\n instance.addContent = addContent;\n\n const addContext = async (\n context: string | Buffer,\n sectionOptions: Partial<SectionOptions> = {}\n ): Promise<Instance> => {\n logger.debug(\"Adding context\", typeof context);\n const currentOptions = loadOptions(sectionOptions);\n const parsedContextSection: Section<Context> = await parser.parse<Context>(context, currentOptions);\n contextSection.add(parsedContextSection);\n return instance as Instance;\n }\n instance.addContext = addContext;\n\n const build = async () => {\n logger.debug(\"Building prompt\", {});\n const prompt = createPrompt({ persona: personaSection, contexts: contextSection, instructions: instructionSection, contents: contentSection });\n return prompt;\n }\n instance.build = build;\n\n return instance as Instance;\n}\n"],"names":["OptionSchema","z","object","logger","any","optional","default","DEFAULT_LOGGER","basePath","string","overridePaths","array","overrides","boolean","parameters","ParametersSchema","create","builderOptions","options","parse","wrapLogger","parser","Parser","override","Override","configDirs","loader","Loader","personaSection","createSection","title","contextSection","instructionSection","contentSection","instance","loadOptions","sectionOptions","currentOptions","SectionOptionsSchema","loadDirectories","directories","debug","sections","load","loadContext","contextDirectories","context","add","loadContent","contentDirectories","content","loadPath","contentPath","defaultPath","path","join","section","parseFile","overrideSection","customize","addPersonaPath","persona","addContextPath","addInstructionPath","instruction","addContentPath","addContent","parsedContentSection","addContext","parsedContextSection","build","prompt","createPrompt","contexts","instructions","contents"],"mappings":"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"}
@@ -0,0 +1,135 @@
1
+ /**
2
+ * Dynamic content item with enhanced tracking and lifecycle
3
+ */
4
+ export interface DynamicContentItem {
5
+ content: string;
6
+ title?: string;
7
+ weight?: number;
8
+ id?: string;
9
+ category?: string;
10
+ source?: string;
11
+ priority?: 'high' | 'medium' | 'low';
12
+ timestamp?: Date;
13
+ }
14
+ /**
15
+ * Tracked context item with metadata
16
+ */
17
+ export interface TrackedContextItem extends DynamicContentItem {
18
+ id: string;
19
+ hash: string;
20
+ position: number;
21
+ injectedAt: Date;
22
+ }
23
+ /**
24
+ * Context statistics
25
+ */
26
+ export interface ContextStats {
27
+ totalItems: number;
28
+ byCategory: Map<string, number>;
29
+ byPriority: Map<string, number>;
30
+ bySource: Map<string, number>;
31
+ oldestTimestamp?: Date;
32
+ newestTimestamp?: Date;
33
+ }
34
+ /**
35
+ * ContextManager tracks and manages dynamically injected context.
36
+ *
37
+ * Features:
38
+ * - Track all injected context with metadata
39
+ * - Deduplication by ID, hash, or content
40
+ * - Category-based organization
41
+ * - Query context state
42
+ * - Context statistics
43
+ *
44
+ * @example
45
+ * ```typescript
46
+ * const manager = new ContextManager();
47
+ *
48
+ * // Track injected context
49
+ * manager.track({
50
+ * id: 'file:main.ts',
51
+ * content: fileContent,
52
+ * title: 'Main File',
53
+ * category: 'source-code'
54
+ * }, 5);
55
+ *
56
+ * // Check for duplicates
57
+ * if (manager.hasContext('file:main.ts')) {
58
+ * console.log('Already provided');
59
+ * }
60
+ *
61
+ * // Query by category
62
+ * const sourceFiles = manager.getByCategory('source-code');
63
+ * ```
64
+ */
65
+ export declare class ContextManager {
66
+ private items;
67
+ private hashes;
68
+ private logger;
69
+ constructor(logger?: any);
70
+ /**
71
+ * Track a context item
72
+ */
73
+ track(item: DynamicContentItem, position: number): void;
74
+ /**
75
+ * Check if context with given ID exists
76
+ */
77
+ hasContext(id: string): boolean;
78
+ /**
79
+ * Check if content with given hash exists
80
+ */
81
+ hasContentHash(content: string): boolean;
82
+ /**
83
+ * Check if similar content exists (fuzzy match)
84
+ */
85
+ hasSimilarContent(content: string): boolean;
86
+ /**
87
+ * Get context item by ID
88
+ */
89
+ get(id: string): TrackedContextItem | undefined;
90
+ /**
91
+ * Get all tracked context items
92
+ */
93
+ getAll(): TrackedContextItem[];
94
+ /**
95
+ * Get context items by category
96
+ */
97
+ getByCategory(category: string): TrackedContextItem[];
98
+ /**
99
+ * Get context items by priority
100
+ */
101
+ getByPriority(priority: 'high' | 'medium' | 'low'): TrackedContextItem[];
102
+ /**
103
+ * Get context items by source
104
+ */
105
+ getBySource(source: string): TrackedContextItem[];
106
+ /**
107
+ * Get all categories
108
+ */
109
+ getCategories(): string[];
110
+ /**
111
+ * Get context statistics
112
+ */
113
+ getStats(): ContextStats;
114
+ /**
115
+ * Remove context item by ID
116
+ */
117
+ remove(id: string): boolean;
118
+ /**
119
+ * Clear all tracked context
120
+ */
121
+ clear(): void;
122
+ /**
123
+ * Generate unique ID for context item
124
+ */
125
+ private generateId;
126
+ /**
127
+ * Hash content for deduplication
128
+ */
129
+ private hashContent;
130
+ /**
131
+ * Normalize content for comparison
132
+ */
133
+ private normalizeContent;
134
+ }
135
+ export default ContextManager;
@@ -0,0 +1,220 @@
1
+ import crypto from 'crypto';
2
+ import { wrapLogger, DEFAULT_LOGGER } from './logger.js';
3
+
4
+ function _define_property(obj, key, value) {
5
+ if (key in obj) {
6
+ Object.defineProperty(obj, key, {
7
+ value: value,
8
+ enumerable: true,
9
+ configurable: true,
10
+ writable: true
11
+ });
12
+ } else {
13
+ obj[key] = value;
14
+ }
15
+ return obj;
16
+ }
17
+ /**
18
+ * ContextManager tracks and manages dynamically injected context.
19
+ *
20
+ * Features:
21
+ * - Track all injected context with metadata
22
+ * - Deduplication by ID, hash, or content
23
+ * - Category-based organization
24
+ * - Query context state
25
+ * - Context statistics
26
+ *
27
+ * @example
28
+ * ```typescript
29
+ * const manager = new ContextManager();
30
+ *
31
+ * // Track injected context
32
+ * manager.track({
33
+ * id: 'file:main.ts',
34
+ * content: fileContent,
35
+ * title: 'Main File',
36
+ * category: 'source-code'
37
+ * }, 5);
38
+ *
39
+ * // Check for duplicates
40
+ * if (manager.hasContext('file:main.ts')) {
41
+ * console.log('Already provided');
42
+ * }
43
+ *
44
+ * // Query by category
45
+ * const sourceFiles = manager.getByCategory('source-code');
46
+ * ```
47
+ */ class ContextManager {
48
+ /**
49
+ * Track a context item
50
+ */ track(item, position) {
51
+ const id = item.id || this.generateId();
52
+ const hash = this.hashContent(item.content);
53
+ const trackedItem = {
54
+ ...item,
55
+ id,
56
+ hash,
57
+ position,
58
+ injectedAt: new Date(),
59
+ timestamp: item.timestamp || new Date(),
60
+ priority: item.priority || 'medium'
61
+ };
62
+ this.items.set(id, trackedItem);
63
+ this.hashes.add(hash);
64
+ this.logger.debug('Tracked context item', {
65
+ id,
66
+ category: item.category,
67
+ position
68
+ });
69
+ }
70
+ /**
71
+ * Check if context with given ID exists
72
+ */ hasContext(id) {
73
+ return this.items.has(id);
74
+ }
75
+ /**
76
+ * Check if content with given hash exists
77
+ */ hasContentHash(content) {
78
+ const hash = this.hashContent(content);
79
+ return this.hashes.has(hash);
80
+ }
81
+ /**
82
+ * Check if similar content exists (fuzzy match)
83
+ */ hasSimilarContent(content) {
84
+ const normalized = this.normalizeContent(content);
85
+ for (const item of this.items.values()){
86
+ const itemNormalized = this.normalizeContent(item.content || '');
87
+ // Exact match
88
+ if (normalized === itemNormalized) {
89
+ return true;
90
+ }
91
+ // Substring match (one contains the other)
92
+ if (normalized.includes(itemNormalized) || itemNormalized.includes(normalized)) {
93
+ return true;
94
+ }
95
+ }
96
+ return false;
97
+ }
98
+ /**
99
+ * Get context item by ID
100
+ */ get(id) {
101
+ return this.items.get(id);
102
+ }
103
+ /**
104
+ * Get all tracked context items
105
+ */ getAll() {
106
+ return Array.from(this.items.values());
107
+ }
108
+ /**
109
+ * Get context items by category
110
+ */ getByCategory(category) {
111
+ return this.getAll().filter((item)=>item.category === category);
112
+ }
113
+ /**
114
+ * Get context items by priority
115
+ */ getByPriority(priority) {
116
+ return this.getAll().filter((item)=>item.priority === priority);
117
+ }
118
+ /**
119
+ * Get context items by source
120
+ */ getBySource(source) {
121
+ return this.getAll().filter((item)=>item.source === source);
122
+ }
123
+ /**
124
+ * Get all categories
125
+ */ getCategories() {
126
+ const categories = new Set();
127
+ this.items.forEach((item)=>{
128
+ if (item.category) {
129
+ categories.add(item.category);
130
+ }
131
+ });
132
+ return Array.from(categories).sort();
133
+ }
134
+ /**
135
+ * Get context statistics
136
+ */ getStats() {
137
+ const byCategory = new Map();
138
+ const byPriority = new Map();
139
+ const bySource = new Map();
140
+ let oldestTimestamp;
141
+ let newestTimestamp;
142
+ this.items.forEach((item)=>{
143
+ // Category stats
144
+ if (item.category) {
145
+ byCategory.set(item.category, (byCategory.get(item.category) || 0) + 1);
146
+ }
147
+ // Priority stats
148
+ const priority = item.priority || 'medium';
149
+ byPriority.set(priority, (byPriority.get(priority) || 0) + 1);
150
+ // Source stats
151
+ if (item.source) {
152
+ bySource.set(item.source, (bySource.get(item.source) || 0) + 1);
153
+ }
154
+ // Timestamp stats
155
+ if (item.timestamp) {
156
+ if (!oldestTimestamp || item.timestamp < oldestTimestamp) {
157
+ oldestTimestamp = item.timestamp;
158
+ }
159
+ if (!newestTimestamp || item.timestamp > newestTimestamp) {
160
+ newestTimestamp = item.timestamp;
161
+ }
162
+ }
163
+ });
164
+ return {
165
+ totalItems: this.items.size,
166
+ byCategory,
167
+ byPriority,
168
+ bySource,
169
+ oldestTimestamp,
170
+ newestTimestamp
171
+ };
172
+ }
173
+ /**
174
+ * Remove context item by ID
175
+ */ remove(id) {
176
+ const item = this.items.get(id);
177
+ if (item) {
178
+ this.items.delete(id);
179
+ this.hashes.delete(item.hash);
180
+ this.logger.debug('Removed context item', {
181
+ id
182
+ });
183
+ return true;
184
+ }
185
+ return false;
186
+ }
187
+ /**
188
+ * Clear all tracked context
189
+ */ clear() {
190
+ this.items.clear();
191
+ this.hashes.clear();
192
+ this.logger.debug('Cleared all context');
193
+ }
194
+ /**
195
+ * Generate unique ID for context item
196
+ */ generateId() {
197
+ return `ctx-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
198
+ }
199
+ /**
200
+ * Hash content for deduplication
201
+ */ hashContent(content) {
202
+ return crypto.createHash('sha256').update(content).digest('hex').substring(0, 16);
203
+ }
204
+ /**
205
+ * Normalize content for comparison
206
+ */ normalizeContent(content) {
207
+ return content.replace(/\s+/g, ' ').trim().toLowerCase();
208
+ }
209
+ constructor(logger){
210
+ _define_property(this, "items", void 0);
211
+ _define_property(this, "hashes", void 0);
212
+ _define_property(this, "logger", void 0);
213
+ this.items = new Map();
214
+ this.hashes = new Set();
215
+ this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'ContextManager');
216
+ }
217
+ }
218
+
219
+ export { ContextManager, ContextManager as default };
220
+ //# sourceMappingURL=context-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.js","sources":["../src/context-manager.ts"],"sourcesContent":["import crypto from 'crypto';\nimport { DEFAULT_LOGGER, wrapLogger } from \"./logger\";\n\n// ===== TYPE DEFINITIONS =====\n\n/**\n * Dynamic content item with enhanced tracking and lifecycle\n */\nexport interface DynamicContentItem {\n content: string;\n title?: string;\n weight?: number;\n\n // Unique identifier for deduplication\n id?: string;\n\n // Category for grouping\n category?: string;\n\n // Source of context\n source?: string;\n\n // Priority level\n priority?: 'high' | 'medium' | 'low';\n\n // Timestamp\n timestamp?: Date;\n}\n\n/**\n * Tracked context item with metadata\n */\nexport interface TrackedContextItem extends DynamicContentItem {\n id: string;\n hash: string;\n position: number;\n injectedAt: Date;\n}\n\n/**\n * Context statistics\n */\nexport interface ContextStats {\n totalItems: number;\n byCategory: Map<string, number>;\n byPriority: Map<string, number>;\n bySource: Map<string, number>;\n oldestTimestamp?: Date;\n newestTimestamp?: Date;\n}\n\n/**\n * ContextManager tracks and manages dynamically injected context.\n *\n * Features:\n * - Track all injected context with metadata\n * - Deduplication by ID, hash, or content\n * - Category-based organization\n * - Query context state\n * - Context statistics\n *\n * @example\n * ```typescript\n * const manager = new ContextManager();\n *\n * // Track injected context\n * manager.track({\n * id: 'file:main.ts',\n * content: fileContent,\n * title: 'Main File',\n * category: 'source-code'\n * }, 5);\n *\n * // Check for duplicates\n * if (manager.hasContext('file:main.ts')) {\n * console.log('Already provided');\n * }\n *\n * // Query by category\n * const sourceFiles = manager.getByCategory('source-code');\n * ```\n */\nexport class ContextManager {\n private items: Map<string, TrackedContextItem>;\n private hashes: Set<string>;\n private logger: any;\n\n constructor(logger?: any) {\n this.items = new Map();\n this.hashes = new Set();\n this.logger = wrapLogger(logger || DEFAULT_LOGGER, 'ContextManager');\n }\n\n /**\n * Track a context item\n */\n track(item: DynamicContentItem, position: number): void {\n const id = item.id || this.generateId();\n const hash = this.hashContent(item.content);\n\n const trackedItem: TrackedContextItem = {\n ...item,\n id,\n hash,\n position,\n injectedAt: new Date(),\n timestamp: item.timestamp || new Date(),\n priority: item.priority || 'medium',\n };\n\n this.items.set(id, trackedItem);\n this.hashes.add(hash);\n\n this.logger.debug('Tracked context item', { id, category: item.category, position });\n }\n\n /**\n * Check if context with given ID exists\n */\n hasContext(id: string): boolean {\n return this.items.has(id);\n }\n\n /**\n * Check if content with given hash exists\n */\n hasContentHash(content: string): boolean {\n const hash = this.hashContent(content);\n return this.hashes.has(hash);\n }\n\n /**\n * Check if similar content exists (fuzzy match)\n */\n hasSimilarContent(content: string): boolean {\n const normalized = this.normalizeContent(content);\n\n for (const item of this.items.values()) {\n const itemNormalized = this.normalizeContent(item.content || '');\n\n // Exact match\n if (normalized === itemNormalized) {\n return true;\n }\n\n // Substring match (one contains the other)\n if (normalized.includes(itemNormalized) || itemNormalized.includes(normalized)) {\n return true;\n }\n }\n\n return false;\n }\n\n /**\n * Get context item by ID\n */\n get(id: string): TrackedContextItem | undefined {\n return this.items.get(id);\n }\n\n /**\n * Get all tracked context items\n */\n getAll(): TrackedContextItem[] {\n return Array.from(this.items.values());\n }\n\n /**\n * Get context items by category\n */\n getByCategory(category: string): TrackedContextItem[] {\n return this.getAll().filter(item => item.category === category);\n }\n\n /**\n * Get context items by priority\n */\n getByPriority(priority: 'high' | 'medium' | 'low'): TrackedContextItem[] {\n return this.getAll().filter(item => item.priority === priority);\n }\n\n /**\n * Get context items by source\n */\n getBySource(source: string): TrackedContextItem[] {\n return this.getAll().filter(item => item.source === source);\n }\n\n /**\n * Get all categories\n */\n getCategories(): string[] {\n const categories = new Set<string>();\n this.items.forEach(item => {\n if (item.category) {\n categories.add(item.category);\n }\n });\n return Array.from(categories).sort();\n }\n\n /**\n * Get context statistics\n */\n getStats(): ContextStats {\n const byCategory = new Map<string, number>();\n const byPriority = new Map<string, number>();\n const bySource = new Map<string, number>();\n let oldestTimestamp: Date | undefined;\n let newestTimestamp: Date | undefined;\n\n this.items.forEach(item => {\n // Category stats\n if (item.category) {\n byCategory.set(item.category, (byCategory.get(item.category) || 0) + 1);\n }\n\n // Priority stats\n const priority = item.priority || 'medium';\n byPriority.set(priority, (byPriority.get(priority) || 0) + 1);\n\n // Source stats\n if (item.source) {\n bySource.set(item.source, (bySource.get(item.source) || 0) + 1);\n }\n\n // Timestamp stats\n if (item.timestamp) {\n if (!oldestTimestamp || item.timestamp < oldestTimestamp) {\n oldestTimestamp = item.timestamp;\n }\n if (!newestTimestamp || item.timestamp > newestTimestamp) {\n newestTimestamp = item.timestamp;\n }\n }\n });\n\n return {\n totalItems: this.items.size,\n byCategory,\n byPriority,\n bySource,\n oldestTimestamp,\n newestTimestamp,\n };\n }\n\n /**\n * Remove context item by ID\n */\n remove(id: string): boolean {\n const item = this.items.get(id);\n if (item) {\n this.items.delete(id);\n this.hashes.delete(item.hash);\n this.logger.debug('Removed context item', { id });\n return true;\n }\n return false;\n }\n\n /**\n * Clear all tracked context\n */\n clear(): void {\n this.items.clear();\n this.hashes.clear();\n this.logger.debug('Cleared all context');\n }\n\n /**\n * Generate unique ID for context item\n */\n private generateId(): string {\n return `ctx-${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n }\n\n /**\n * Hash content for deduplication\n */\n private hashContent(content: string): string {\n return crypto\n .createHash('sha256')\n .update(content)\n .digest('hex')\n .substring(0, 16);\n }\n\n /**\n * Normalize content for comparison\n */\n private normalizeContent(content: string): string {\n return content.replace(/\\s+/g, ' ').trim().toLowerCase();\n }\n}\n\nexport default ContextManager;\n\n"],"names":["ContextManager","track","item","position","id","generateId","hash","hashContent","content","trackedItem","injectedAt","Date","timestamp","priority","items","set","hashes","add","logger","debug","category","hasContext","has","hasContentHash","hasSimilarContent","normalized","normalizeContent","values","itemNormalized","includes","get","getAll","Array","from","getByCategory","filter","getByPriority","getBySource","source","getCategories","categories","Set","forEach","sort","getStats","byCategory","Map","byPriority","bySource","oldestTimestamp","newestTimestamp","totalItems","size","remove","delete","clear","now","Math","random","toString","substring","crypto","createHash","update","digest","replace","trim","toLowerCase","wrapLogger","DEFAULT_LOGGER"],"mappings":"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"}