openvibe 0.58.3 → 0.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/CHANGELOG.md +50 -3019
  2. package/README.md +267 -98
  3. package/dist/core/agent-modes.d.ts +16 -0
  4. package/dist/core/agent-modes.d.ts.map +1 -0
  5. package/dist/core/agent-modes.js +88 -0
  6. package/dist/core/agent-modes.js.map +1 -0
  7. package/dist/core/agent-session.d.ts +26 -0
  8. package/dist/core/agent-session.d.ts.map +1 -1
  9. package/dist/core/agent-session.js +84 -1
  10. package/dist/core/agent-session.js.map +1 -1
  11. package/dist/core/compaction/compaction.d.ts.map +1 -1
  12. package/dist/core/compaction/compaction.js +1 -1
  13. package/dist/core/compaction/compaction.js.map +1 -1
  14. package/dist/core/context-architecture.d.ts +12 -0
  15. package/dist/core/context-architecture.d.ts.map +1 -0
  16. package/dist/core/context-architecture.js +14 -0
  17. package/dist/core/context-architecture.js.map +1 -0
  18. package/dist/core/context-manager.d.ts +162 -0
  19. package/dist/core/context-manager.d.ts.map +1 -0
  20. package/dist/core/context-manager.js +311 -0
  21. package/dist/core/context-manager.js.map +1 -0
  22. package/dist/core/context-provider-interface.d.ts +134 -0
  23. package/dist/core/context-provider-interface.d.ts.map +1 -0
  24. package/dist/core/context-provider-interface.js +6 -0
  25. package/dist/core/context-provider-interface.js.map +1 -0
  26. package/dist/core/context-provider-registry.d.ts +78 -0
  27. package/dist/core/context-provider-registry.d.ts.map +1 -0
  28. package/dist/core/context-provider-registry.js +164 -0
  29. package/dist/core/context-provider-registry.js.map +1 -0
  30. package/dist/core/index.d.ts +2 -0
  31. package/dist/core/index.d.ts.map +1 -1
  32. package/dist/core/index.js +9 -0
  33. package/dist/core/index.js.map +1 -1
  34. package/dist/core/large-context-provider.d.ts +87 -0
  35. package/dist/core/large-context-provider.d.ts.map +1 -0
  36. package/dist/core/large-context-provider.js +391 -0
  37. package/dist/core/large-context-provider.js.map +1 -0
  38. package/dist/core/skills.d.ts.map +1 -1
  39. package/dist/core/skills.js +52 -5
  40. package/dist/core/skills.js.map +1 -1
  41. package/dist/core/slash-commands.d.ts.map +1 -1
  42. package/dist/core/slash-commands.js +1 -0
  43. package/dist/core/slash-commands.js.map +1 -1
  44. package/dist/core/system-prompt.d.ts +6 -4
  45. package/dist/core/system-prompt.d.ts.map +1 -1
  46. package/dist/core/system-prompt.js +129 -63
  47. package/dist/core/system-prompt.js.map +1 -1
  48. package/dist/index.d.ts +1 -0
  49. package/dist/index.d.ts.map +1 -1
  50. package/dist/index.js +2 -0
  51. package/dist/index.js.map +1 -1
  52. package/dist/modes/interactive/components/skills-selector.d.ts +13 -0
  53. package/dist/modes/interactive/components/skills-selector.d.ts.map +1 -0
  54. package/dist/modes/interactive/components/skills-selector.js +49 -0
  55. package/dist/modes/interactive/components/skills-selector.js.map +1 -0
  56. package/dist/modes/interactive/interactive-mode.d.ts +2 -2
  57. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  58. package/dist/modes/interactive/interactive-mode.js +44 -37
  59. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  60. package/docs/system-prompt-template.md +176 -0
  61. package/examples/skills/README.md +93 -0
  62. package/examples/skills/api-design/SKILL.md +80 -0
  63. package/examples/skills/code-review/SKILL.md +68 -0
  64. package/examples/skills/git-workflow/SKILL.md +108 -0
  65. package/examples/skills/testing/SKILL.md +94 -0
  66. package/package.json +2 -2
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Context Manager - Independent Architecture for Large Context Support
3
+ * Provides 1M context window support through a third-party architecture
4
+ * Works transparently with all models without modifying prompts
5
+ */
6
+ import { existsSync, readFileSync, writeFileSync } from "fs";
7
+ import { join } from "path";
8
+ import { getAgentDir } from "../config.js";
9
+ /**
10
+ * Default configuration
11
+ */
12
+ const DEFAULT_CONFIG = {
13
+ enabled: true,
14
+ defaultContextWindow: 1000000, // 1M tokens
15
+ defaultMaxTokens: 65536,
16
+ providers: [],
17
+ };
18
+ /**
19
+ * Known large context models with their configurations
20
+ */
21
+ export const LARGE_CONTEXT_MODELS = {
22
+ // OpenAI
23
+ "gpt-4-turbo": { contextWindow: 128000, maxTokens: 4096 },
24
+ "gpt-4-turbo-preview": { contextWindow: 128000, maxTokens: 4096 },
25
+ "gpt-4o": { contextWindow: 128000, maxTokens: 16384 },
26
+ "gpt-4o-mini": { contextWindow: 128000, maxTokens: 16384 },
27
+ // Anthropic
28
+ "claude-3-opus": { contextWindow: 200000, maxTokens: 4096 },
29
+ "claude-3-sonnet": { contextWindow: 200000, maxTokens: 4096 },
30
+ "claude-3-haiku": { contextWindow: 200000, maxTokens: 4096 },
31
+ "claude-3-5-sonnet": { contextWindow: 200000, maxTokens: 8192 },
32
+ "claude-3-5-haiku": { contextWindow: 200000, maxTokens: 8192 },
33
+ "claude-sonnet-4": { contextWindow: 200000, maxTokens: 16384 },
34
+ // Google
35
+ "gemini-1.5-pro": { contextWindow: 1000000, maxTokens: 8192 },
36
+ "gemini-1.5-flash": { contextWindow: 1000000, maxTokens: 8192 },
37
+ "gemini-2.0-flash": { contextWindow: 1000000, maxTokens: 8192 },
38
+ // DeepSeek
39
+ "deepseek-chat": { contextWindow: 64000, maxTokens: 4096 },
40
+ "deepseek-coder": { contextWindow: 64000, maxTokens: 4096 },
41
+ "deepseek-reasoner": { contextWindow: 64000, maxTokens: 8192 },
42
+ // Mistral
43
+ "mistral-large": { contextWindow: 128000, maxTokens: 8192 },
44
+ "mistral-medium": { contextWindow: 32000, maxTokens: 8192 },
45
+ // Meta Llama
46
+ "llama-3.1-405b": { contextWindow: 128000, maxTokens: 16384 },
47
+ "llama-3.1-70b": { contextWindow: 128000, maxTokens: 16384 },
48
+ "llama-3.1-8b": { contextWindow: 128000, maxTokens: 16384 },
49
+ // Qwen
50
+ "qwen-2.5-72b": { contextWindow: 131072, maxTokens: 8192 },
51
+ "qwen-2.5-32b": { contextWindow: 131072, maxTokens: 8192 },
52
+ "qwen-max": { contextWindow: 1000000, maxTokens: 65536 },
53
+ // Moonshot (Kimi)
54
+ "moonshot-v1-8k": { contextWindow: 8192, maxTokens: 4096 },
55
+ "moonshot-v1-32k": { contextWindow: 32768, maxTokens: 4096 },
56
+ "moonshot-v1-128k": { contextWindow: 131072, maxTokens: 4096 },
57
+ // Yi
58
+ "yi-lightning": { contextWindow: 16384, maxTokens: 4096 },
59
+ "yi-large": { contextWindow: 32768, maxTokens: 4096 },
60
+ "yi-large-turbo": { contextWindow: 16384, maxTokens: 4096 },
61
+ // GLM
62
+ "glm-4": { contextWindow: 128000, maxTokens: 4096 },
63
+ "glm-4-plus": { contextWindow: 128000, maxTokens: 4096 },
64
+ // Default large context for unknown models
65
+ "default-large": { contextWindow: 1000000, maxTokens: 65536 },
66
+ };
67
+ /**
68
+ * Context Manager
69
+ * Manages context window configuration for all models
70
+ */
71
+ export class ContextManager {
72
+ config;
73
+ configPath;
74
+ static instance = null;
75
+ constructor() {
76
+ this.configPath = join(getAgentDir(), "context-config.json");
77
+ this.config = this.loadConfig();
78
+ }
79
+ /**
80
+ * Get the singleton instance
81
+ */
82
+ static getInstance() {
83
+ if (!ContextManager.instance) {
84
+ ContextManager.instance = new ContextManager();
85
+ }
86
+ return ContextManager.instance;
87
+ }
88
+ /**
89
+ * Load configuration from file
90
+ */
91
+ loadConfig() {
92
+ try {
93
+ if (existsSync(this.configPath)) {
94
+ const content = readFileSync(this.configPath, "utf-8");
95
+ const loaded = JSON.parse(content);
96
+ return { ...DEFAULT_CONFIG, ...loaded };
97
+ }
98
+ }
99
+ catch (error) {
100
+ console.error("Failed to load context config:", error);
101
+ }
102
+ return { ...DEFAULT_CONFIG };
103
+ }
104
+ /**
105
+ * Save configuration to file
106
+ */
107
+ saveConfig() {
108
+ try {
109
+ const agentDir = getAgentDir();
110
+ if (!existsSync(agentDir)) {
111
+ const { mkdirSync } = require("fs");
112
+ mkdirSync(agentDir, { recursive: true });
113
+ }
114
+ writeFileSync(this.configPath, JSON.stringify(this.config, null, 2));
115
+ }
116
+ catch (error) {
117
+ console.error("Failed to save context config:", error);
118
+ }
119
+ }
120
+ /**
121
+ * Get current configuration
122
+ */
123
+ getConfig() {
124
+ return { ...this.config };
125
+ }
126
+ /**
127
+ * Update configuration
128
+ */
129
+ updateConfig(updates) {
130
+ this.config = { ...this.config, ...updates };
131
+ this.saveConfig();
132
+ }
133
+ /**
134
+ * Get context configuration for a model
135
+ */
136
+ getContextForModel(modelId) {
137
+ // Check model overrides first
138
+ if (this.config.modelOverrides?.[modelId]) {
139
+ return this.config.modelOverrides[modelId];
140
+ }
141
+ // Check known models
142
+ const normalizedId = modelId.toLowerCase();
143
+ for (const [pattern, config] of Object.entries(LARGE_CONTEXT_MODELS)) {
144
+ if (normalizedId.includes(pattern.toLowerCase()) || pattern.toLowerCase().includes(normalizedId)) {
145
+ return config;
146
+ }
147
+ }
148
+ // Check provider defaults
149
+ for (const provider of this.config.providers) {
150
+ if (provider.models?.[modelId]) {
151
+ return provider.models[modelId];
152
+ }
153
+ }
154
+ // Return default large context
155
+ return {
156
+ contextWindow: this.config.defaultContextWindow,
157
+ maxTokens: this.config.defaultMaxTokens,
158
+ };
159
+ }
160
+ /**
161
+ * Set context configuration for a specific model
162
+ */
163
+ setContextForModel(modelId, config) {
164
+ if (!this.config.modelOverrides) {
165
+ this.config.modelOverrides = {};
166
+ }
167
+ this.config.modelOverrides[modelId] = config;
168
+ this.saveConfig();
169
+ }
170
+ /**
171
+ * Register a provider with context configuration
172
+ */
173
+ registerProvider(providerConfig) {
174
+ const existingIndex = this.config.providers.findIndex((p) => p.provider === providerConfig.provider);
175
+ if (existingIndex >= 0) {
176
+ this.config.providers[existingIndex] = providerConfig;
177
+ }
178
+ else {
179
+ this.config.providers.push(providerConfig);
180
+ }
181
+ this.saveConfig();
182
+ }
183
+ /**
184
+ * Enhance a model with context configuration
185
+ * This is the main entry point for the third-party architecture
186
+ */
187
+ enhanceModel(model) {
188
+ if (!this.config.enabled) {
189
+ return model;
190
+ }
191
+ const contextConfig = this.getContextForModel(model.id);
192
+ return {
193
+ ...model,
194
+ contextWindow: contextConfig.contextWindow,
195
+ maxTokens: contextConfig.maxTokens,
196
+ };
197
+ }
198
+ /**
199
+ * Calculate optimal chunk size based on context window
200
+ */
201
+ calculateChunkSize(contextWindow) {
202
+ // Aim for 10% of context window as chunk size
203
+ // But cap at 32K tokens for efficiency
204
+ const targetChunkSize = Math.floor(contextWindow * 0.1);
205
+ return Math.min(targetChunkSize, 32768);
206
+ }
207
+ /**
208
+ * Get context stats
209
+ */
210
+ getStats(tokensUsed, modelId) {
211
+ const config = this.getContextForModel(modelId);
212
+ const utilization = (tokensUsed / config.contextWindow) * 100;
213
+ return {
214
+ tokensUsed,
215
+ contextWindow: config.contextWindow,
216
+ utilization: Math.min(utilization, 100),
217
+ };
218
+ }
219
+ /**
220
+ * Check if model supports large context
221
+ */
222
+ isLargeContextModel(modelId) {
223
+ const config = this.getContextForModel(modelId);
224
+ return config.contextWindow >= 100000;
225
+ }
226
+ /**
227
+ * Get recommended settings for a model
228
+ */
229
+ getRecommendedSettings(modelId) {
230
+ const config = this.getContextForModel(modelId);
231
+ const chunkSize = this.calculateChunkSize(config.contextWindow);
232
+ return {
233
+ contextWindow: config.contextWindow,
234
+ maxTokens: config.maxTokens,
235
+ chunkSize,
236
+ enableChunking: config.enableChunking ?? config.contextWindow >= 200000,
237
+ };
238
+ }
239
+ }
240
+ /**
241
+ * Context middleware for request interception
242
+ */
243
+ export class ContextMiddleware {
244
+ manager;
245
+ constructor() {
246
+ this.manager = ContextManager.getInstance();
247
+ }
248
+ /**
249
+ * Process context before sending to API
250
+ */
251
+ processContext(messages, modelId) {
252
+ const config = this.manager.getContextForModel(modelId);
253
+ // Estimate token count (rough estimation: 1 token ≈ 4 characters)
254
+ const messageStr = JSON.stringify(messages);
255
+ const estimatedTokens = Math.ceil(messageStr.length / 4);
256
+ // Check if truncation is needed
257
+ const truncated = estimatedTokens > config.contextWindow;
258
+ return {
259
+ messages,
260
+ truncated,
261
+ originalTokens: estimatedTokens,
262
+ contextWindow: config.contextWindow,
263
+ };
264
+ }
265
+ }
266
+ /**
267
+ * Initialize the context manager with default configuration
268
+ */
269
+ export function initializeContextManager() {
270
+ const manager = ContextManager.getInstance();
271
+ // Register default providers with large context support
272
+ manager.registerProvider({
273
+ provider: "google",
274
+ defaultContext: {
275
+ contextWindow: 1000000,
276
+ maxTokens: 8192,
277
+ },
278
+ });
279
+ manager.registerProvider({
280
+ provider: "anthropic",
281
+ defaultContext: {
282
+ contextWindow: 200000,
283
+ maxTokens: 16384,
284
+ },
285
+ });
286
+ manager.registerProvider({
287
+ provider: "openai",
288
+ defaultContext: {
289
+ contextWindow: 128000,
290
+ maxTokens: 16384,
291
+ },
292
+ });
293
+ manager.registerProvider({
294
+ provider: "deepseek",
295
+ defaultContext: {
296
+ contextWindow: 64000,
297
+ maxTokens: 8192,
298
+ },
299
+ });
300
+ manager.registerProvider({
301
+ provider: "qwen",
302
+ defaultContext: {
303
+ contextWindow: 131072,
304
+ maxTokens: 8192,
305
+ },
306
+ });
307
+ return manager;
308
+ }
309
+ // Export singleton getter
310
+ export const getContextManager = () => ContextManager.getInstance();
311
+ //# sourceMappingURL=context-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-manager.js","sourceRoot":"","sources":["../../src/core/context-manager.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context Manager - Independent Architecture for Large Context Support\n * Provides 1M context window support through a third-party architecture\n * Works transparently with all models without modifying prompts\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\nimport { existsSync, readFileSync, writeFileSync } from \"fs\";\nimport { join } from \"path\";\nimport { getAgentDir } from \"../config.js\";\n\n/**\n * Context configuration for models\n */\nexport interface ContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\t/** Whether to enable chunking for large contexts */\n\tenableChunking?: boolean;\n\t/** Chunk size for processing (default: auto-calculated) */\n\tchunkSize?: number;\n\t/** Overlap between chunks (default: 2000 tokens) */\n\tchunkOverlap?: number;\n\t/** Enable context caching */\n\tenableCaching?: boolean;\n\t/** Cache TTL in seconds */\n\tcacheTTL?: number;\n}\n\n/**\n * Provider-level context configuration\n */\nexport interface ProviderContextConfig {\n\t/** Provider name */\n\tprovider: string;\n\t/** Base URL override */\n\tbaseUrl?: string;\n\t/** Default context for all models under this provider */\n\tdefaultContext?: Partial<ContextConfig>;\n\t/** Per-model context overrides */\n\tmodels?: Record<string, ContextConfig>;\n}\n\n/**\n * Global context configuration\n */\nexport interface GlobalContextConfig {\n\t/** Enable large context support globally */\n\tenabled: boolean;\n\t/** Default context window (used when model doesn't specify) */\n\tdefaultContextWindow: number;\n\t/** Default max output tokens */\n\tdefaultMaxTokens: number;\n\t/** Provider configurations */\n\tproviders: ProviderContextConfig[];\n\t/** Model-specific overrides */\n\tmodelOverrides?: Record<string, ContextConfig>;\n}\n\n/**\n * Context stats for monitoring\n */\nexport interface ContextStats {\n\t/** Total context tokens used */\n\ttokensUsed: number;\n\t/** Context window size */\n\tcontextWindow: number;\n\t/** Utilization percentage */\n\tutilization: number;\n\t/** Number of chunks processed */\n\tchunksProcessed?: number;\n\t/** Cache hit rate */\n\tcacheHitRate?: number;\n}\n\n/**\n * Default configuration\n */\nconst DEFAULT_CONFIG: GlobalContextConfig = {\n\tenabled: true,\n\tdefaultContextWindow: 1000000, // 1M tokens\n\tdefaultMaxTokens: 65536,\n\tproviders: [],\n};\n\n/**\n * Known large context models with their configurations\n */\nexport const LARGE_CONTEXT_MODELS: Record<string, ContextConfig> = {\n\t// OpenAI\n\t\"gpt-4-turbo\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"gpt-4-turbo-preview\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"gpt-4o\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"gpt-4o-mini\": { contextWindow: 128000, maxTokens: 16384 },\n\n\t// Anthropic\n\t\"claude-3-opus\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-sonnet\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-haiku\": { contextWindow: 200000, maxTokens: 4096 },\n\t\"claude-3-5-sonnet\": { contextWindow: 200000, maxTokens: 8192 },\n\t\"claude-3-5-haiku\": { contextWindow: 200000, maxTokens: 8192 },\n\t\"claude-sonnet-4\": { contextWindow: 200000, maxTokens: 16384 },\n\n\t// Google\n\t\"gemini-1.5-pro\": { contextWindow: 1000000, maxTokens: 8192 },\n\t\"gemini-1.5-flash\": { contextWindow: 1000000, maxTokens: 8192 },\n\t\"gemini-2.0-flash\": { contextWindow: 1000000, maxTokens: 8192 },\n\n\t// DeepSeek\n\t\"deepseek-chat\": { contextWindow: 64000, maxTokens: 4096 },\n\t\"deepseek-coder\": { contextWindow: 64000, maxTokens: 4096 },\n\t\"deepseek-reasoner\": { contextWindow: 64000, maxTokens: 8192 },\n\n\t// Mistral\n\t\"mistral-large\": { contextWindow: 128000, maxTokens: 8192 },\n\t\"mistral-medium\": { contextWindow: 32000, maxTokens: 8192 },\n\n\t// Meta Llama\n\t\"llama-3.1-405b\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"llama-3.1-70b\": { contextWindow: 128000, maxTokens: 16384 },\n\t\"llama-3.1-8b\": { contextWindow: 128000, maxTokens: 16384 },\n\n\t// Qwen\n\t\"qwen-2.5-72b\": { contextWindow: 131072, maxTokens: 8192 },\n\t\"qwen-2.5-32b\": { contextWindow: 131072, maxTokens: 8192 },\n\t\"qwen-max\": { contextWindow: 1000000, maxTokens: 65536 },\n\n\t// Moonshot (Kimi)\n\t\"moonshot-v1-8k\": { contextWindow: 8192, maxTokens: 4096 },\n\t\"moonshot-v1-32k\": { contextWindow: 32768, maxTokens: 4096 },\n\t\"moonshot-v1-128k\": { contextWindow: 131072, maxTokens: 4096 },\n\n\t// Yi\n\t\"yi-lightning\": { contextWindow: 16384, maxTokens: 4096 },\n\t\"yi-large\": { contextWindow: 32768, maxTokens: 4096 },\n\t\"yi-large-turbo\": { contextWindow: 16384, maxTokens: 4096 },\n\n\t// GLM\n\t\"glm-4\": { contextWindow: 128000, maxTokens: 4096 },\n\t\"glm-4-plus\": { contextWindow: 128000, maxTokens: 4096 },\n\n\t// Default large context for unknown models\n\t\"default-large\": { contextWindow: 1000000, maxTokens: 65536 },\n};\n\n/**\n * Context Manager\n * Manages context window configuration for all models\n */\nexport class ContextManager {\n\tprivate config: GlobalContextConfig;\n\tprivate configPath: string;\n\tprivate static instance: ContextManager | null = null;\n\n\tprivate constructor() {\n\t\tthis.configPath = join(getAgentDir(), \"context-config.json\");\n\t\tthis.config = this.loadConfig();\n\t}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tstatic getInstance(): ContextManager {\n\t\tif (!ContextManager.instance) {\n\t\t\tContextManager.instance = new ContextManager();\n\t\t}\n\t\treturn ContextManager.instance;\n\t}\n\n\t/**\n\t * Load configuration from file\n\t */\n\tprivate loadConfig(): GlobalContextConfig {\n\t\ttry {\n\t\t\tif (existsSync(this.configPath)) {\n\t\t\t\tconst content = readFileSync(this.configPath, \"utf-8\");\n\t\t\t\tconst loaded = JSON.parse(content) as Partial<GlobalContextConfig>;\n\t\t\t\treturn { ...DEFAULT_CONFIG, ...loaded };\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to load context config:\", error);\n\t\t}\n\t\treturn { ...DEFAULT_CONFIG };\n\t}\n\n\t/**\n\t * Save configuration to file\n\t */\n\tsaveConfig(): void {\n\t\ttry {\n\t\t\tconst agentDir = getAgentDir();\n\t\t\tif (!existsSync(agentDir)) {\n\t\t\t\tconst { mkdirSync } = require(\"fs\");\n\t\t\t\tmkdirSync(agentDir, { recursive: true });\n\t\t\t}\n\t\t\twriteFileSync(this.configPath, JSON.stringify(this.config, null, 2));\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Failed to save context config:\", error);\n\t\t}\n\t}\n\n\t/**\n\t * Get current configuration\n\t */\n\tgetConfig(): GlobalContextConfig {\n\t\treturn { ...this.config };\n\t}\n\n\t/**\n\t * Update configuration\n\t */\n\tupdateConfig(updates: Partial<GlobalContextConfig>): void {\n\t\tthis.config = { ...this.config, ...updates };\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Get context configuration for a model\n\t */\n\tgetContextForModel(modelId: string): ContextConfig {\n\t\t// Check model overrides first\n\t\tif (this.config.modelOverrides?.[modelId]) {\n\t\t\treturn this.config.modelOverrides[modelId];\n\t\t}\n\n\t\t// Check known models\n\t\tconst normalizedId = modelId.toLowerCase();\n\t\tfor (const [pattern, config] of Object.entries(LARGE_CONTEXT_MODELS)) {\n\t\t\tif (normalizedId.includes(pattern.toLowerCase()) || pattern.toLowerCase().includes(normalizedId)) {\n\t\t\t\treturn config;\n\t\t\t}\n\t\t}\n\n\t\t// Check provider defaults\n\t\tfor (const provider of this.config.providers) {\n\t\t\tif (provider.models?.[modelId]) {\n\t\t\t\treturn provider.models[modelId];\n\t\t\t}\n\t\t}\n\n\t\t// Return default large context\n\t\treturn {\n\t\t\tcontextWindow: this.config.defaultContextWindow,\n\t\t\tmaxTokens: this.config.defaultMaxTokens,\n\t\t};\n\t}\n\n\t/**\n\t * Set context configuration for a specific model\n\t */\n\tsetContextForModel(modelId: string, config: ContextConfig): void {\n\t\tif (!this.config.modelOverrides) {\n\t\t\tthis.config.modelOverrides = {};\n\t\t}\n\t\tthis.config.modelOverrides[modelId] = config;\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Register a provider with context configuration\n\t */\n\tregisterProvider(providerConfig: ProviderContextConfig): void {\n\t\tconst existingIndex = this.config.providers.findIndex((p) => p.provider === providerConfig.provider);\n\t\tif (existingIndex >= 0) {\n\t\t\tthis.config.providers[existingIndex] = providerConfig;\n\t\t} else {\n\t\t\tthis.config.providers.push(providerConfig);\n\t\t}\n\t\tthis.saveConfig();\n\t}\n\n\t/**\n\t * Enhance a model with context configuration\n\t * This is the main entry point for the third-party architecture\n\t */\n\tenhanceModel<API extends Api>(model: Model<API>): Model<API> {\n\t\tif (!this.config.enabled) {\n\t\t\treturn model;\n\t\t}\n\n\t\tconst contextConfig = this.getContextForModel(model.id);\n\n\t\treturn {\n\t\t\t...model,\n\t\t\tcontextWindow: contextConfig.contextWindow,\n\t\t\tmaxTokens: contextConfig.maxTokens,\n\t\t};\n\t}\n\n\t/**\n\t * Calculate optimal chunk size based on context window\n\t */\n\tcalculateChunkSize(contextWindow: number): number {\n\t\t// Aim for 10% of context window as chunk size\n\t\t// But cap at 32K tokens for efficiency\n\t\tconst targetChunkSize = Math.floor(contextWindow * 0.1);\n\t\treturn Math.min(targetChunkSize, 32768);\n\t}\n\n\t/**\n\t * Get context stats\n\t */\n\tgetStats(tokensUsed: number, modelId: string): ContextStats {\n\t\tconst config = this.getContextForModel(modelId);\n\t\tconst utilization = (tokensUsed / config.contextWindow) * 100;\n\n\t\treturn {\n\t\t\ttokensUsed,\n\t\t\tcontextWindow: config.contextWindow,\n\t\t\tutilization: Math.min(utilization, 100),\n\t\t};\n\t}\n\n\t/**\n\t * Check if model supports large context\n\t */\n\tisLargeContextModel(modelId: string): boolean {\n\t\tconst config = this.getContextForModel(modelId);\n\t\treturn config.contextWindow >= 100000;\n\t}\n\n\t/**\n\t * Get recommended settings for a model\n\t */\n\tgetRecommendedSettings(modelId: string): {\n\t\tcontextWindow: number;\n\t\tmaxTokens: number;\n\t\tchunkSize: number;\n\t\tenableChunking: boolean;\n\t} {\n\t\tconst config = this.getContextForModel(modelId);\n\t\tconst chunkSize = this.calculateChunkSize(config.contextWindow);\n\n\t\treturn {\n\t\t\tcontextWindow: config.contextWindow,\n\t\t\tmaxTokens: config.maxTokens,\n\t\t\tchunkSize,\n\t\t\tenableChunking: config.enableChunking ?? config.contextWindow >= 200000,\n\t\t};\n\t}\n}\n\n/**\n * Context middleware for request interception\n */\nexport class ContextMiddleware {\n\tprivate manager: ContextManager;\n\n\tconstructor() {\n\t\tthis.manager = ContextManager.getInstance();\n\t}\n\n\t/**\n\t * Process context before sending to API\n\t */\n\tprocessContext(messages: unknown[], modelId: string): {\n\t\tmessages: unknown[];\n\t\ttruncated: boolean;\n\t\toriginalTokens: number;\n\t\tcontextWindow: number;\n\t} {\n\t\tconst config = this.manager.getContextForModel(modelId);\n\n\t\t// Estimate token count (rough estimation: 1 token ≈ 4 characters)\n\t\tconst messageStr = JSON.stringify(messages);\n\t\tconst estimatedTokens = Math.ceil(messageStr.length / 4);\n\n\t\t// Check if truncation is needed\n\t\tconst truncated = estimatedTokens > config.contextWindow;\n\n\t\treturn {\n\t\t\tmessages,\n\t\t\ttruncated,\n\t\t\toriginalTokens: estimatedTokens,\n\t\t\tcontextWindow: config.contextWindow,\n\t\t};\n\t}\n}\n\n/**\n * Initialize the context manager with default configuration\n */\nexport function initializeContextManager(): ContextManager {\n\tconst manager = ContextManager.getInstance();\n\n\t// Register default providers with large context support\n\tmanager.registerProvider({\n\t\tprovider: \"google\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"anthropic\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 200000,\n\t\t\tmaxTokens: 16384,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"openai\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 128000,\n\t\t\tmaxTokens: 16384,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"deepseek\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 64000,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\tmanager.registerProvider({\n\t\tprovider: \"qwen\",\n\t\tdefaultContext: {\n\t\t\tcontextWindow: 131072,\n\t\t\tmaxTokens: 8192,\n\t\t},\n\t});\n\n\treturn manager;\n}\n\n// Export singleton getter\nexport const getContextManager = () => ContextManager.getInstance();\n"]}
@@ -0,0 +1,134 @@
1
+ /**
2
+ * Context Provider Interface
3
+ * Defines the contract for context providers in the third-party architecture
4
+ */
5
+ import type { Api, Model } from "@mariozechner/pi-ai";
6
+ /**
7
+ * Context provider interface
8
+ * Third-party implementations should implement this interface
9
+ */
10
+ export interface IContextProvider {
11
+ /** Provider name */
12
+ readonly name: string;
13
+ /** Provider version */
14
+ readonly version: string;
15
+ /**
16
+ * Check if this provider supports a given model
17
+ */
18
+ supportsModel(modelId: string): boolean;
19
+ /**
20
+ * Get context window for a model
21
+ */
22
+ getContextWindow(modelId: string): number;
23
+ /**
24
+ * Get max output tokens for a model
25
+ */
26
+ getMaxTokens(modelId: string): number;
27
+ /**
28
+ * Get full context configuration for a model
29
+ */
30
+ getContextConfig(modelId: string): IModelContextConfig;
31
+ /**
32
+ * Process messages before sending to API
33
+ * Returns processed messages and metadata
34
+ */
35
+ processMessages?(messages: unknown[], modelId: string): IProcessedContext;
36
+ /**
37
+ * Handle context overflow
38
+ * Called when context exceeds the window
39
+ */
40
+ handleOverflow?(messages: unknown[], modelId: string, tokenCount: number): IOverflowResult;
41
+ }
42
+ /**
43
+ * Model context configuration
44
+ */
45
+ export interface IModelContextConfig {
46
+ /** Context window size in tokens */
47
+ contextWindow: number;
48
+ /** Maximum output tokens */
49
+ maxTokens: number;
50
+ /** Supports streaming */
51
+ supportsStreaming: boolean;
52
+ /** Supports vision/image input */
53
+ supportsVision: boolean;
54
+ /** Supports function calling */
55
+ supportsFunctions: boolean;
56
+ /** Custom model-specific settings */
57
+ customSettings?: Record<string, unknown>;
58
+ }
59
+ /**
60
+ * Processed context result
61
+ */
62
+ export interface IProcessedContext {
63
+ /** Processed messages */
64
+ messages: unknown[];
65
+ /** Token count */
66
+ tokenCount: number;
67
+ /** Whether context was modified */
68
+ modified: boolean;
69
+ /** Processing metadata */
70
+ metadata?: {
71
+ chunksUsed?: number;
72
+ cacheHits?: number;
73
+ truncated?: boolean;
74
+ };
75
+ }
76
+ /**
77
+ * Overflow handling result
78
+ */
79
+ export interface IOverflowResult {
80
+ /** Action to take */
81
+ action: "truncate" | "summarize" | "chunk" | "reject";
82
+ /** Processed messages (if action is truncate/summarize/chunk) */
83
+ messages?: unknown[];
84
+ /** Error message (if action is reject) */
85
+ error?: string;
86
+ /** Additional metadata */
87
+ metadata?: Record<string, unknown>;
88
+ }
89
+ /**
90
+ * Context provider registry
91
+ * Manages multiple context providers
92
+ */
93
+ export interface IContextProviderRegistry {
94
+ /**
95
+ * Register a context provider
96
+ */
97
+ register(provider: IContextProvider): void;
98
+ /**
99
+ * Unregister a context provider
100
+ */
101
+ unregister(name: string): void;
102
+ /**
103
+ * Get a provider by name
104
+ */
105
+ get(name: string): IContextProvider | undefined;
106
+ /**
107
+ * Get all registered providers
108
+ */
109
+ getAll(): IContextProvider[];
110
+ /**
111
+ * Find the best provider for a model
112
+ */
113
+ findProvider(modelId: string): IContextProvider | undefined;
114
+ /**
115
+ * Get context configuration from any provider
116
+ */
117
+ getContextConfig(modelId: string): IModelContextConfig;
118
+ }
119
+ /**
120
+ * Context enhancement result
121
+ */
122
+ export interface IContextEnhancement<API extends Api> {
123
+ /** Enhanced model */
124
+ model: Model<API>;
125
+ /** Provider that enhanced the model */
126
+ provider: IContextProvider;
127
+ /** Enhancement metadata */
128
+ metadata: {
129
+ originalContextWindow: number;
130
+ enhancedContextWindow: number;
131
+ enhanced: boolean;
132
+ };
133
+ }
134
+ //# sourceMappingURL=context-provider-interface.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-provider-interface.d.ts","sourceRoot":"","sources":["../../src/core/context-provider-interface.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Context Provider Interface\n * Defines the contract for context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\n\n/**\n * Context provider interface\n * Third-party implementations should implement this interface\n */\nexport interface IContextProvider {\n\t/** Provider name */\n\treadonly name: string;\n\n\t/** Provider version */\n\treadonly version: string;\n\n\t/**\n\t * Check if this provider supports a given model\n\t */\n\tsupportsModel(modelId: string): boolean;\n\n\t/**\n\t * Get context window for a model\n\t */\n\tgetContextWindow(modelId: string): number;\n\n\t/**\n\t * Get max output tokens for a model\n\t */\n\tgetMaxTokens(modelId: string): number;\n\n\t/**\n\t * Get full context configuration for a model\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n\n\t/**\n\t * Process messages before sending to API\n\t * Returns processed messages and metadata\n\t */\n\tprocessMessages?(messages: unknown[], modelId: string): IProcessedContext;\n\n\t/**\n\t * Handle context overflow\n\t * Called when context exceeds the window\n\t */\n\thandleOverflow?(messages: unknown[], modelId: string, tokenCount: number): IOverflowResult;\n}\n\n/**\n * Model context configuration\n */\nexport interface IModelContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\n\t/** Supports streaming */\n\tsupportsStreaming: boolean;\n\n\t/** Supports vision/image input */\n\tsupportsVision: boolean;\n\n\t/** Supports function calling */\n\tsupportsFunctions: boolean;\n\n\t/** Custom model-specific settings */\n\tcustomSettings?: Record<string, unknown>;\n}\n\n/**\n * Processed context result\n */\nexport interface IProcessedContext {\n\t/** Processed messages */\n\tmessages: unknown[];\n\n\t/** Token count */\n\ttokenCount: number;\n\n\t/** Whether context was modified */\n\tmodified: boolean;\n\n\t/** Processing metadata */\n\tmetadata?: {\n\t\tchunksUsed?: number;\n\t\tcacheHits?: number;\n\t\ttruncated?: boolean;\n\t};\n}\n\n/**\n * Overflow handling result\n */\nexport interface IOverflowResult {\n\t/** Action to take */\n\taction: \"truncate\" | \"summarize\" | \"chunk\" | \"reject\";\n\n\t/** Processed messages (if action is truncate/summarize/chunk) */\n\tmessages?: unknown[];\n\n\t/** Error message (if action is reject) */\n\terror?: string;\n\n\t/** Additional metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Context provider registry\n * Manages multiple context providers\n */\nexport interface IContextProviderRegistry {\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void;\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void;\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined;\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[];\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined;\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n}\n\n/**\n * Context enhancement result\n */\nexport interface IContextEnhancement<API extends Api> {\n\t/** Enhanced model */\n\tmodel: Model<API>;\n\n\t/** Provider that enhanced the model */\n\tprovider: IContextProvider;\n\n\t/** Enhancement metadata */\n\tmetadata: {\n\t\toriginalContextWindow: number;\n\t\tenhancedContextWindow: number;\n\t\tenhanced: boolean;\n\t};\n}\n"]}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Context Provider Interface
3
+ * Defines the contract for context providers in the third-party architecture
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=context-provider-interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-provider-interface.js","sourceRoot":"","sources":["../../src/core/context-provider-interface.ts"],"names":[],"mappings":"AAAA;;;GAGG","sourcesContent":["/**\n * Context Provider Interface\n * Defines the contract for context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\n\n/**\n * Context provider interface\n * Third-party implementations should implement this interface\n */\nexport interface IContextProvider {\n\t/** Provider name */\n\treadonly name: string;\n\n\t/** Provider version */\n\treadonly version: string;\n\n\t/**\n\t * Check if this provider supports a given model\n\t */\n\tsupportsModel(modelId: string): boolean;\n\n\t/**\n\t * Get context window for a model\n\t */\n\tgetContextWindow(modelId: string): number;\n\n\t/**\n\t * Get max output tokens for a model\n\t */\n\tgetMaxTokens(modelId: string): number;\n\n\t/**\n\t * Get full context configuration for a model\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n\n\t/**\n\t * Process messages before sending to API\n\t * Returns processed messages and metadata\n\t */\n\tprocessMessages?(messages: unknown[], modelId: string): IProcessedContext;\n\n\t/**\n\t * Handle context overflow\n\t * Called when context exceeds the window\n\t */\n\thandleOverflow?(messages: unknown[], modelId: string, tokenCount: number): IOverflowResult;\n}\n\n/**\n * Model context configuration\n */\nexport interface IModelContextConfig {\n\t/** Context window size in tokens */\n\tcontextWindow: number;\n\n\t/** Maximum output tokens */\n\tmaxTokens: number;\n\n\t/** Supports streaming */\n\tsupportsStreaming: boolean;\n\n\t/** Supports vision/image input */\n\tsupportsVision: boolean;\n\n\t/** Supports function calling */\n\tsupportsFunctions: boolean;\n\n\t/** Custom model-specific settings */\n\tcustomSettings?: Record<string, unknown>;\n}\n\n/**\n * Processed context result\n */\nexport interface IProcessedContext {\n\t/** Processed messages */\n\tmessages: unknown[];\n\n\t/** Token count */\n\ttokenCount: number;\n\n\t/** Whether context was modified */\n\tmodified: boolean;\n\n\t/** Processing metadata */\n\tmetadata?: {\n\t\tchunksUsed?: number;\n\t\tcacheHits?: number;\n\t\ttruncated?: boolean;\n\t};\n}\n\n/**\n * Overflow handling result\n */\nexport interface IOverflowResult {\n\t/** Action to take */\n\taction: \"truncate\" | \"summarize\" | \"chunk\" | \"reject\";\n\n\t/** Processed messages (if action is truncate/summarize/chunk) */\n\tmessages?: unknown[];\n\n\t/** Error message (if action is reject) */\n\terror?: string;\n\n\t/** Additional metadata */\n\tmetadata?: Record<string, unknown>;\n}\n\n/**\n * Context provider registry\n * Manages multiple context providers\n */\nexport interface IContextProviderRegistry {\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void;\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void;\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined;\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[];\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined;\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig;\n}\n\n/**\n * Context enhancement result\n */\nexport interface IContextEnhancement<API extends Api> {\n\t/** Enhanced model */\n\tmodel: Model<API>;\n\n\t/** Provider that enhanced the model */\n\tprovider: IContextProvider;\n\n\t/** Enhancement metadata */\n\tmetadata: {\n\t\toriginalContextWindow: number;\n\t\tenhancedContextWindow: number;\n\t\tenhanced: boolean;\n\t};\n}\n"]}
@@ -0,0 +1,78 @@
1
+ /**
2
+ * Context Provider Registry
3
+ * Central registry for managing context providers in the third-party architecture
4
+ */
5
+ import type { Api, Model } from "@mariozechner/pi-ai";
6
+ import type { IContextProvider, IContextProviderRegistry, IContextEnhancement, IModelContextConfig } from "./context-provider-interface.js";
7
+ /**
8
+ * Context Provider Registry Implementation
9
+ * Manages multiple context providers and routes requests to the appropriate one
10
+ */
11
+ export declare class ContextProviderRegistry implements IContextProviderRegistry {
12
+ private providers;
13
+ private defaultProvider;
14
+ private static instance;
15
+ private constructor();
16
+ /**
17
+ * Get the singleton instance
18
+ */
19
+ static getInstance(): ContextProviderRegistry;
20
+ /**
21
+ * Register a context provider
22
+ */
23
+ register(provider: IContextProvider): void;
24
+ /**
25
+ * Unregister a context provider
26
+ */
27
+ unregister(name: string): void;
28
+ /**
29
+ * Get a provider by name
30
+ */
31
+ get(name: string): IContextProvider | undefined;
32
+ /**
33
+ * Get all registered providers
34
+ */
35
+ getAll(): IContextProvider[];
36
+ /**
37
+ * Find the best provider for a model
38
+ */
39
+ findProvider(modelId: string): IContextProvider | undefined;
40
+ /**
41
+ * Get context configuration from any provider
42
+ */
43
+ getContextConfig(modelId: string): IModelContextConfig;
44
+ /**
45
+ * Enhance a model with context configuration
46
+ * This is the main entry point for the third-party architecture
47
+ */
48
+ enhanceModel<API extends Api>(model: Model<API>): IContextEnhancement<API>;
49
+ /**
50
+ * Check if a model has large context support
51
+ */
52
+ hasLargeContext(modelId: string): boolean;
53
+ /**
54
+ * Check if a model has 1M context
55
+ */
56
+ hasMillionContext(modelId: string): boolean;
57
+ /**
58
+ * Get all models with 1M context
59
+ */
60
+ getMillionContextModels(): string[];
61
+ }
62
+ /**
63
+ * Singleton getter
64
+ */
65
+ export declare const getContextProviderRegistry: () => ContextProviderRegistry;
66
+ /**
67
+ * Convenience function to enhance a model with context configuration
68
+ */
69
+ export declare function enhanceModelContext<API extends Api>(model: Model<API>): Model<API>;
70
+ /**
71
+ * Convenience function to get context configuration for a model
72
+ */
73
+ export declare function getModelContextConfig(modelId: string): IModelContextConfig;
74
+ /**
75
+ * Initialize the context provider registry
76
+ */
77
+ export declare function initializeContextProviders(): ContextProviderRegistry;
78
+ //# sourceMappingURL=context-provider-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-provider-registry.d.ts","sourceRoot":"","sources":["../../src/core/context-provider-registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AACtD,OAAO,KAAK,EACX,gBAAgB,EAChB,wBAAwB,EACxB,mBAAmB,EACnB,mBAAmB,EACnB,MAAM,iCAAiC,CAAC;AAGzC;;;GAGG;AACH,qBAAa,uBAAwB,YAAW,wBAAwB;IACvE,OAAO,CAAC,SAAS,CAA4C;IAC7D,OAAO,CAAC,eAAe,CAAmB;IAC1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwC;IAE/D,OAAO,eAIN;IAED;;OAEG;IACH,MAAM,CAAC,WAAW,IAAI,uBAAuB,CAK5C;IAED;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,GAAG,IAAI,CAEzC;IAED;;OAEG;IACH,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAM7B;IAED;;OAEG;IACH,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAE9C;IAED;;OAEG;IACH,MAAM,IAAI,gBAAgB,EAAE,CAE3B;IAED;;OAEG;IACH,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAW1D;IAED;;OAEG;IACH,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAcrD;IAED;;;OAGG;IACH,YAAY,CAAC,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAsBzE;IAED;;OAEG;IACH,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAGxC;IAED;;OAEG;IACH,iBAAiB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG1C;IAED;;OAEG;IACH,uBAAuB,IAAI,MAAM,EAAE,CAWlC;CACD;AAED;;GAEG;AACH,eAAO,MAAM,0BAA0B,+BAA8C,CAAC;AAEtF;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,SAAS,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAIlF;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,mBAAmB,CAG1E;AAED;;GAEG;AACH,wBAAgB,0BAA0B,IAAI,uBAAuB,CAEpE","sourcesContent":["/**\n * Context Provider Registry\n * Central registry for managing context providers in the third-party architecture\n */\n\nimport type { Api, Model } from \"@mariozechner/pi-ai\";\nimport type {\n\tIContextProvider,\n\tIContextProviderRegistry,\n\tIContextEnhancement,\n\tIModelContextConfig,\n} from \"./context-provider-interface.js\";\nimport { getLargeContextProvider, LargeContextProvider } from \"./large-context-provider.js\";\n\n/**\n * Context Provider Registry Implementation\n * Manages multiple context providers and routes requests to the appropriate one\n */\nexport class ContextProviderRegistry implements IContextProviderRegistry {\n\tprivate providers: Map<string, IContextProvider> = new Map();\n\tprivate defaultProvider: IContextProvider;\n\tprivate static instance: ContextProviderRegistry | null = null;\n\n\tprivate constructor() {\n\t\t// Register the large context provider as default\n\t\tthis.defaultProvider = getLargeContextProvider();\n\t\tthis.register(this.defaultProvider);\n\t}\n\n\t/**\n\t * Get the singleton instance\n\t */\n\tstatic getInstance(): ContextProviderRegistry {\n\t\tif (!ContextProviderRegistry.instance) {\n\t\t\tContextProviderRegistry.instance = new ContextProviderRegistry();\n\t\t}\n\t\treturn ContextProviderRegistry.instance;\n\t}\n\n\t/**\n\t * Register a context provider\n\t */\n\tregister(provider: IContextProvider): void {\n\t\tthis.providers.set(provider.name, provider);\n\t}\n\n\t/**\n\t * Unregister a context provider\n\t */\n\tunregister(name: string): void {\n\t\tif (name === this.defaultProvider.name) {\n\t\t\tconsole.warn(`Cannot unregister default provider: ${name}`);\n\t\t\treturn;\n\t\t}\n\t\tthis.providers.delete(name);\n\t}\n\n\t/**\n\t * Get a provider by name\n\t */\n\tget(name: string): IContextProvider | undefined {\n\t\treturn this.providers.get(name);\n\t}\n\n\t/**\n\t * Get all registered providers\n\t */\n\tgetAll(): IContextProvider[] {\n\t\treturn Array.from(this.providers.values());\n\t}\n\n\t/**\n\t * Find the best provider for a model\n\t */\n\tfindProvider(modelId: string): IContextProvider | undefined {\n\t\t// Check all providers for explicit support\n\t\tconst providers = Array.from(this.providers.values());\n\t\tfor (const provider of providers) {\n\t\t\tif (provider.supportsModel(modelId)) {\n\t\t\t\treturn provider;\n\t\t\t}\n\t\t}\n\n\t\t// Fall back to default provider\n\t\treturn this.defaultProvider;\n\t}\n\n\t/**\n\t * Get context configuration from any provider\n\t */\n\tgetContextConfig(modelId: string): IModelContextConfig {\n\t\tconst provider = this.findProvider(modelId);\n\t\tif (provider) {\n\t\t\treturn provider.getContextConfig(modelId);\n\t\t}\n\n\t\t// Default 1M context configuration\n\t\treturn {\n\t\t\tcontextWindow: 1000000,\n\t\t\tmaxTokens: 65536,\n\t\t\tsupportsStreaming: true,\n\t\t\tsupportsVision: true,\n\t\t\tsupportsFunctions: true,\n\t\t};\n\t}\n\n\t/**\n\t * Enhance a model with context configuration\n\t * This is the main entry point for the third-party architecture\n\t */\n\tenhanceModel<API extends Api>(model: Model<API>): IContextEnhancement<API> {\n\t\tconst provider = this.findProvider(model.id);\n\t\tconst config = this.getContextConfig(model.id);\n\n\t\tconst originalContextWindow = model.contextWindow ?? 0;\n\t\tconst enhancedContextWindow = config.contextWindow;\n\n\t\tconst enhancedModel: Model<API> = {\n\t\t\t...model,\n\t\t\tcontextWindow: enhancedContextWindow,\n\t\t\tmaxTokens: config.maxTokens,\n\t\t};\n\n\t\treturn {\n\t\t\tmodel: enhancedModel,\n\t\t\tprovider: provider ?? this.defaultProvider,\n\t\t\tmetadata: {\n\t\t\t\toriginalContextWindow,\n\t\t\t\tenhancedContextWindow,\n\t\t\t\tenhanced: originalContextWindow !== enhancedContextWindow,\n\t\t\t},\n\t\t};\n\t}\n\n\t/**\n\t * Check if a model has large context support\n\t */\n\thasLargeContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 100000;\n\t}\n\n\t/**\n\t * Check if a model has 1M context\n\t */\n\thasMillionContext(modelId: string): boolean {\n\t\tconst config = this.getContextConfig(modelId);\n\t\treturn config.contextWindow >= 1000000;\n\t}\n\n\t/**\n\t * Get all models with 1M context\n\t */\n\tgetMillionContextModels(): string[] {\n\t\tconst models: string[] = [];\n\t\tconst providers = Array.from(this.providers.values());\n\n\t\tfor (const provider of providers) {\n\t\t\tif (provider instanceof LargeContextProvider) {\n\t\t\t\tmodels.push(...provider.getKnownModels().filter((id) => provider.isMillionContextModel(id)));\n\t\t\t}\n\t\t}\n\n\t\treturn Array.from(new Set(models));\n\t}\n}\n\n/**\n * Singleton getter\n */\nexport const getContextProviderRegistry = () => ContextProviderRegistry.getInstance();\n\n/**\n * Convenience function to enhance a model with context configuration\n */\nexport function enhanceModelContext<API extends Api>(model: Model<API>): Model<API> {\n\tconst registry = ContextProviderRegistry.getInstance();\n\tconst enhancement = registry.enhanceModel(model);\n\treturn enhancement.model;\n}\n\n/**\n * Convenience function to get context configuration for a model\n */\nexport function getModelContextConfig(modelId: string): IModelContextConfig {\n\tconst registry = ContextProviderRegistry.getInstance();\n\treturn registry.getContextConfig(modelId);\n}\n\n/**\n * Initialize the context provider registry\n */\nexport function initializeContextProviders(): ContextProviderRegistry {\n\treturn ContextProviderRegistry.getInstance();\n}\n"]}