modular-studio 1.0.4 → 1.0.6

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 (129) hide show
  1. package/README.md +122 -41
  2. package/dist/assets/Badge-DrUmDAXz.js +1 -0
  3. package/dist/assets/Input-ndEGQSgx.js +1 -0
  4. package/dist/assets/KnowledgeTab-CxlC76Rf.js +4 -0
  5. package/dist/assets/MemoryTab-CUScYWs9.js +16 -0
  6. package/dist/assets/QualificationTab-BqnWSQHm.js +1 -0
  7. package/dist/assets/ReviewTab-DKYl6cR9.js +103 -0
  8. package/dist/assets/Section-CgmwAj_2.js +1 -0
  9. package/dist/assets/TestTab-iJ2vCf9l.js +33 -0
  10. package/dist/assets/ToolsTab-C10Ulm8b.js +1 -0
  11. package/dist/assets/conversationStore-CkfEU2eV.js +1 -0
  12. package/dist/assets/icons-MKpPNvV8.js +1 -0
  13. package/dist/assets/index-B_ip7Amg.css +1 -0
  14. package/dist/assets/index-gBy3427k.js +143 -0
  15. package/dist/assets/{jszip.min-BK6ZQWkj.js → jszip.min-wf-D3Ix_.js} +1 -1
  16. package/dist/assets/markdown-DWF7F0i0.js +29 -0
  17. package/dist/assets/services-CTWXQK6j.js +356 -0
  18. package/dist/assets/stores-CeKWz7ou.js +1 -0
  19. package/dist/assets/vendor-D1h_O76p.js +9 -0
  20. package/dist/index.html +20 -16
  21. package/dist-server/bin/modular-mcp.js +0 -1
  22. package/dist-server/bin/modular-studio.js +0 -1
  23. package/dist-server/server/config.js +0 -1
  24. package/dist-server/server/data/mcp-tokens.json +3 -3
  25. package/dist-server/server/index.d.ts.map +1 -1
  26. package/dist-server/server/index.js +6 -1
  27. package/dist-server/server/mcp/manager.d.ts.map +1 -1
  28. package/dist-server/server/mcp/manager.js +16 -3
  29. package/dist-server/server/mcp/modular-server.js +0 -1
  30. package/dist-server/server/mcp/transport.js +0 -1
  31. package/dist-server/server/routes/agent-sdk.js +0 -1
  32. package/dist-server/server/routes/agents.d.ts +9 -5
  33. package/dist-server/server/routes/agents.d.ts.map +1 -1
  34. package/dist-server/server/routes/agents.js +108 -8
  35. package/dist-server/server/routes/auth-codex.js +0 -1
  36. package/dist-server/server/routes/cache.d.ts +3 -0
  37. package/dist-server/server/routes/cache.d.ts.map +1 -0
  38. package/dist-server/server/routes/cache.js +55 -0
  39. package/dist-server/server/routes/capabilities.js +0 -1
  40. package/dist-server/server/routes/claude-config.js +0 -1
  41. package/dist-server/server/routes/connectors.d.ts.map +1 -1
  42. package/dist-server/server/routes/connectors.js +224 -1
  43. package/dist-server/server/routes/conversations.js +0 -1
  44. package/dist-server/server/routes/embeddings.js +0 -1
  45. package/dist-server/server/routes/health.js +0 -1
  46. package/dist-server/server/routes/knowledge.js +0 -1
  47. package/dist-server/server/routes/lessons.d.ts +3 -0
  48. package/dist-server/server/routes/lessons.d.ts.map +1 -0
  49. package/dist-server/server/routes/lessons.js +46 -0
  50. package/dist-server/server/routes/llm.js +0 -1
  51. package/dist-server/server/routes/mcp-oauth.js +0 -1
  52. package/dist-server/server/routes/mcp.js +0 -1
  53. package/dist-server/server/routes/memory.d.ts +3 -0
  54. package/dist-server/server/routes/memory.d.ts.map +1 -0
  55. package/dist-server/server/routes/memory.js +314 -0
  56. package/dist-server/server/routes/pipeline.js +0 -1
  57. package/dist-server/server/routes/providers.js +0 -1
  58. package/dist-server/server/routes/qualification.d.ts.map +1 -1
  59. package/dist-server/server/routes/qualification.js +341 -75
  60. package/dist-server/server/routes/repo-index.d.ts.map +1 -1
  61. package/dist-server/server/routes/repo-index.js +7 -1
  62. package/dist-server/server/routes/runtime.js +0 -1
  63. package/dist-server/server/routes/skills-search.d.ts.map +1 -1
  64. package/dist-server/server/routes/skills-search.js +198 -8
  65. package/dist-server/server/routes/worktrees.js +0 -1
  66. package/dist-server/server/services/__tests__/embeddingService.test.js +0 -1
  67. package/dist-server/server/services/adapters/hindsightAdapter.d.ts +28 -0
  68. package/dist-server/server/services/adapters/hindsightAdapter.d.ts.map +1 -0
  69. package/dist-server/server/services/adapters/hindsightAdapter.js +63 -0
  70. package/dist-server/server/services/adapters/postgresAdapter.d.ts +29 -0
  71. package/dist-server/server/services/adapters/postgresAdapter.d.ts.map +1 -0
  72. package/dist-server/server/services/adapters/postgresAdapter.js +224 -0
  73. package/dist-server/server/services/adapters/sqliteAdapter.d.ts +28 -0
  74. package/dist-server/server/services/adapters/sqliteAdapter.d.ts.map +1 -0
  75. package/dist-server/server/services/adapters/sqliteAdapter.js +219 -0
  76. package/dist-server/server/services/adapters/storageAdapter.d.ts +22 -0
  77. package/dist-server/server/services/adapters/storageAdapter.d.ts.map +1 -0
  78. package/dist-server/server/services/adapters/storageAdapter.js +1 -0
  79. package/dist-server/server/services/agentRunner.js +0 -1
  80. package/dist-server/server/services/agentStore.d.ts +19 -3
  81. package/dist-server/server/services/agentStore.d.ts.map +1 -1
  82. package/dist-server/server/services/agentStore.js +117 -23
  83. package/dist-server/server/services/contentStore.js +0 -1
  84. package/dist-server/server/services/correctionDetector.d.ts +22 -0
  85. package/dist-server/server/services/correctionDetector.d.ts.map +1 -0
  86. package/dist-server/server/services/correctionDetector.js +91 -0
  87. package/dist-server/server/services/embeddingService.d.ts +2 -0
  88. package/dist-server/server/services/embeddingService.d.ts.map +1 -1
  89. package/dist-server/server/services/embeddingService.js +30 -19
  90. package/dist-server/server/services/factExtractor.js +0 -1
  91. package/dist-server/server/services/githubIndexer.js +0 -1
  92. package/dist-server/server/services/hindsightClient.d.ts +15 -0
  93. package/dist-server/server/services/hindsightClient.d.ts.map +1 -0
  94. package/dist-server/server/services/hindsightClient.js +47 -0
  95. package/dist-server/server/services/lessonExtractor.d.ts +19 -0
  96. package/dist-server/server/services/lessonExtractor.d.ts.map +1 -0
  97. package/dist-server/server/services/lessonExtractor.js +87 -0
  98. package/dist-server/server/services/mcpOAuth.js +0 -1
  99. package/dist-server/server/services/memoryScorer.js +0 -1
  100. package/dist-server/server/services/repoIndexer.js +0 -1
  101. package/dist-server/server/services/responseCache.d.ts +24 -0
  102. package/dist-server/server/services/responseCache.d.ts.map +1 -0
  103. package/dist-server/server/services/responseCache.js +163 -0
  104. package/dist-server/server/services/sqliteStore.d.ts +8 -0
  105. package/dist-server/server/services/sqliteStore.d.ts.map +1 -1
  106. package/dist-server/server/services/sqliteStore.js +53 -14
  107. package/dist-server/server/services/teamRunner.js +0 -1
  108. package/dist-server/server/services/worktreeManager.js +0 -1
  109. package/dist-server/server/types.d.ts +5 -0
  110. package/dist-server/server/types.d.ts.map +1 -1
  111. package/dist-server/server/types.js +0 -1
  112. package/dist-server/server/utils/pathSecurity.js +0 -1
  113. package/dist-server/src/services/budgetAllocator.js +0 -1
  114. package/dist-server/src/services/contradictionDetector.js +0 -1
  115. package/dist-server/src/services/treeIndexer.js +0 -1
  116. package/dist-server/src/store/knowledgeBase.d.ts +11 -0
  117. package/dist-server/src/store/knowledgeBase.d.ts.map +1 -1
  118. package/dist-server/src/store/knowledgeBase.js +13 -1
  119. package/dist-server/src/store/lessonStore.d.ts +26 -0
  120. package/dist-server/src/store/lessonStore.d.ts.map +1 -0
  121. package/dist-server/src/store/lessonStore.js +64 -0
  122. package/dist-server/src/store/memoryStore.d.ts +118 -0
  123. package/dist-server/src/store/memoryStore.d.ts.map +1 -0
  124. package/dist-server/src/store/memoryStore.js +272 -0
  125. package/dist-server/tsconfig.server.tsbuildinfo +1 -1
  126. package/package.json +9 -1
  127. package/dist/assets/graphPopulator-B3rQxb5A.js +0 -1
  128. package/dist/assets/index-BA_J-aHx.js +0 -686
  129. package/dist/assets/index-C7vpqKVZ.css +0 -1
@@ -21,25 +21,37 @@ class EmbeddingServiceImpl {
21
21
  this.initPromise = this._doInitialize();
22
22
  return this.initPromise;
23
23
  }
24
+ static MAX_RETRIES = 3;
25
+ static RETRY_DELAYS_MS = [2000, 5000, 10000];
24
26
  async _doInitialize() {
25
- try {
26
- console.log('[Embedding] Loading model Xenova/all-MiniLM-L6-v2...');
27
- const startTime = Date.now();
28
- // Dynamic import to avoid top-level side effects and enable mocking in tests
29
- // Note: sharp (image processing) is stubbed by postinstall script — we only need text embeddings
30
- const { pipeline, env } = await import('@huggingface/transformers');
31
- env.allowLocalModels = false;
32
- env.useBrowserCache = false;
33
- this.model = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
34
- const loadTime = Date.now() - startTime;
35
- console.log(`[Embedding] Model loaded in ${loadTime}ms`);
36
- this.ready = true;
37
- }
38
- catch (error) {
39
- console.error('[Embedding] Failed to load model:', error);
40
- this.ready = false;
41
- this.initPromise = null; // Allow retry
42
- throw error;
27
+ const { pipeline, env } = await import('@huggingface/transformers');
28
+ env.allowLocalModels = true; // Use cached model if available
29
+ env.useBrowserCache = false;
30
+ for (let attempt = 0; attempt <= EmbeddingServiceImpl.MAX_RETRIES; attempt++) {
31
+ try {
32
+ const label = attempt === 0 ? '' : ` (retry ${attempt}/${EmbeddingServiceImpl.MAX_RETRIES})`;
33
+ console.log(`[Embedding] Loading model Xenova/all-MiniLM-L6-v2...${label}`);
34
+ const startTime = Date.now();
35
+ this.model = await pipeline('feature-extraction', 'Xenova/all-MiniLM-L6-v2');
36
+ const loadTime = Date.now() - startTime;
37
+ console.log(`[Embedding] Model loaded in ${loadTime}ms`);
38
+ this.ready = true;
39
+ return;
40
+ }
41
+ catch (error) {
42
+ const isNetworkError = error instanceof TypeError &&
43
+ (error.message.includes('fetch failed') || error.message.includes('ECONNRESET'));
44
+ if (isNetworkError && attempt < EmbeddingServiceImpl.MAX_RETRIES) {
45
+ const delay = EmbeddingServiceImpl.RETRY_DELAYS_MS[attempt];
46
+ console.warn(`[Embedding] Network error, retrying in ${delay}ms...`, error?.cause?.code ?? error);
47
+ await new Promise(resolve => setTimeout(resolve, delay));
48
+ continue;
49
+ }
50
+ console.error('[Embedding] Failed to load model after all attempts:', error);
51
+ this.ready = false;
52
+ this.initPromise = null; // Allow retry on next call
53
+ throw error;
54
+ }
43
55
  }
44
56
  }
45
57
  isReady() {
@@ -210,4 +222,3 @@ export function _resetForTesting() {
210
222
  }
211
223
  export { embeddingService };
212
224
  export default embeddingService;
213
- //# sourceMappingURL=embeddingService.js.map
@@ -123,4 +123,3 @@ ${agentOutput}`;
123
123
  access_count: 0,
124
124
  }));
125
125
  }
126
- //# sourceMappingURL=factExtractor.js.map
@@ -186,4 +186,3 @@ export async function indexMultipleRepos(repos) {
186
186
  }
187
187
  return results;
188
188
  }
189
- //# sourceMappingURL=githubIndexer.js.map
@@ -0,0 +1,15 @@
1
+ export interface HindsightMemoryItem {
2
+ id: string;
3
+ content: string;
4
+ type: string | null;
5
+ }
6
+ export declare class ModularHindsightClient {
7
+ private readonly client;
8
+ private readonly baseUrl;
9
+ constructor(baseUrl?: string);
10
+ retain(agentId: string, content: string, metadata?: Record<string, string>): Promise<void>;
11
+ recall(agentId: string, query: string, k?: number): Promise<HindsightMemoryItem[]>;
12
+ reflect(agentId: string, query: string): Promise<string>;
13
+ healthCheck(): Promise<boolean>;
14
+ }
15
+ //# sourceMappingURL=hindsightClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hindsightClient.d.ts","sourceRoot":"","sources":["../../../server/services/hindsightClient.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACrB;AAMD,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA8C;IACrE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,SAA0B;IAKvC,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IAI1F,MAAM,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,SAAI,GAAG,OAAO,CAAC,mBAAmB,EAAE,CAAC;IAS7E,OAAO,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IASxD,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;CAQtC"}
@@ -0,0 +1,47 @@
1
+ // Hindsight client is optional — install @vectorize-io/hindsight-client to enable
2
+ let HindsightClient;
3
+ try {
4
+ HindsightClient = require('@vectorize-io/hindsight-client').HindsightClient;
5
+ }
6
+ catch { /* not installed */ }
7
+ function toMemoryItem(r) {
8
+ return { id: r.id ?? `hs-${Date.now()}`, content: r.content, type: r.type ?? null };
9
+ }
10
+ export class ModularHindsightClient {
11
+ client;
12
+ baseUrl;
13
+ constructor(baseUrl = 'http://localhost:8888') {
14
+ this.baseUrl = baseUrl;
15
+ this.client = HindsightClient ? new HindsightClient(baseUrl) : null;
16
+ }
17
+ async retain(agentId, content, metadata) {
18
+ await this.client.retain(agentId, content, metadata ? { metadata } : undefined);
19
+ }
20
+ async recall(agentId, query, k = 5) {
21
+ try {
22
+ const result = await this.client.recall(agentId, query, { budget: 'mid' });
23
+ return result.results.slice(0, k).map(toMemoryItem);
24
+ }
25
+ catch {
26
+ return [];
27
+ }
28
+ }
29
+ async reflect(agentId, query) {
30
+ try {
31
+ const result = await this.client.reflect(agentId, query, { budget: 'low' });
32
+ return result.text;
33
+ }
34
+ catch {
35
+ return '';
36
+ }
37
+ }
38
+ async healthCheck() {
39
+ try {
40
+ const res = await fetch(`${this.baseUrl}/health`, { signal: AbortSignal.timeout(2000) });
41
+ return res.ok;
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
47
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Lesson Extractor — uses an LLM to derive an actionable rule from a correction signal.
3
+ *
4
+ * Accepts provider params directly so it can be called from both server and browser contexts.
5
+ */
6
+ import type { CorrectionSignal } from './correctionDetector.js';
7
+ export type LessonCategory = 'style' | 'format' | 'factual' | 'behavioral' | 'domain';
8
+ export interface ExtractedLesson {
9
+ rule: string;
10
+ category: LessonCategory;
11
+ confidence: number;
12
+ }
13
+ export interface LlmProviderConfig {
14
+ type: string;
15
+ baseUrl: string;
16
+ apiKey: string;
17
+ }
18
+ export declare function extractLesson(correction: CorrectionSignal, provider: LlmProviderConfig, model: string): Promise<ExtractedLesson | null>;
19
+ //# sourceMappingURL=lessonExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lessonExtractor.d.ts","sourceRoot":"","sources":["../../../server/services/lessonExtractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,MAAM,MAAM,cAAc,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,GAAG,YAAY,GAAG,QAAQ,CAAC;AAEtF,MAAM,WAAW,eAAe;IAC9B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AA0FD,wBAAsB,aAAa,CACjC,UAAU,EAAE,gBAAgB,EAC5B,QAAQ,EAAE,iBAAiB,EAC3B,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAOjC"}
@@ -0,0 +1,87 @@
1
+ const VALID_CATEGORIES = ['style', 'format', 'factual', 'behavioral', 'domain'];
2
+ const EXTRACTION_PROMPT = (correction) => `Given this user correction, extract a behavioral rule in the format: "When X, do Y instead of Z".
3
+
4
+ User correction: ${correction.userMessage}
5
+
6
+ Previous assistant response (first 300 chars): ${correction.previousAssistant.slice(0, 300)}
7
+
8
+ Return a JSON object with:
9
+ - rule: the behavioral rule string (max 120 chars, "When X, do Y instead of Z")
10
+ - category: one of "style" | "format" | "factual" | "behavioral" | "domain"
11
+ - confidence: number 0-1
12
+
13
+ Return only valid JSON, no other text.`;
14
+ function parseLesson(text) {
15
+ const jsonMatch = text.match(/\{[\s\S]*\}/);
16
+ if (!jsonMatch)
17
+ return null;
18
+ try {
19
+ const raw = JSON.parse(jsonMatch[0]);
20
+ if (typeof raw !== 'object' || raw === null)
21
+ return null;
22
+ const obj = raw;
23
+ const rule = typeof obj.rule === 'string' ? obj.rule.trim() : '';
24
+ const cat = typeof obj.category === 'string' ? obj.category : '';
25
+ const confidence = typeof obj.confidence === 'number' ? obj.confidence : 0.5;
26
+ if (!rule || !VALID_CATEGORIES.includes(cat))
27
+ return null;
28
+ return { rule, category: cat, confidence };
29
+ }
30
+ catch {
31
+ return null;
32
+ }
33
+ }
34
+ async function callAnthropicLlm(cfg, model, prompt) {
35
+ const res = await fetch(`${cfg.baseUrl}/messages`, {
36
+ method: 'POST',
37
+ headers: {
38
+ 'x-api-key': cfg.apiKey,
39
+ 'anthropic-version': '2023-06-01',
40
+ 'content-type': 'application/json',
41
+ },
42
+ body: JSON.stringify({ model, max_tokens: 512, messages: [{ role: 'user', content: prompt }] }),
43
+ });
44
+ if (!res.ok)
45
+ throw new Error(`LLM call failed (${res.status})`);
46
+ const data = await res.json();
47
+ if (typeof data !== 'object' || data === null || !('content' in data))
48
+ return '';
49
+ const content = data.content;
50
+ if (!Array.isArray(content))
51
+ return '';
52
+ const textBlock = content.find((c) => typeof c === 'object' && c !== null && c.type === 'text');
53
+ return textBlock?.text ?? '';
54
+ }
55
+ async function callOpenAiLlm(cfg, model, prompt) {
56
+ const res = await fetch(`${cfg.baseUrl}/chat/completions`, {
57
+ method: 'POST',
58
+ headers: { Authorization: `Bearer ${cfg.apiKey}`, 'Content-Type': 'application/json' },
59
+ body: JSON.stringify({ model, messages: [{ role: 'user', content: prompt }] }),
60
+ });
61
+ if (!res.ok)
62
+ throw new Error(`LLM call failed (${res.status})`);
63
+ const data = await res.json();
64
+ if (typeof data !== 'object' || data === null || !('choices' in data))
65
+ return '';
66
+ const choices = data.choices;
67
+ if (!Array.isArray(choices) || choices.length === 0)
68
+ return '';
69
+ const msg = choices[0].message;
70
+ if (typeof msg !== 'object' || msg === null)
71
+ return '';
72
+ return String(msg.content ?? '');
73
+ }
74
+ async function callLlm(cfg, model, prompt) {
75
+ if (cfg.type === 'anthropic')
76
+ return callAnthropicLlm(cfg, model, prompt);
77
+ return callOpenAiLlm(cfg, model, prompt);
78
+ }
79
+ export async function extractLesson(correction, provider, model) {
80
+ try {
81
+ const text = await callLlm(provider, model, EXTRACTION_PROMPT(correction));
82
+ return parseLesson(text);
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
@@ -261,4 +261,3 @@ export async function listConnectedServers() {
261
261
  return true;
262
262
  });
263
263
  }
264
- //# sourceMappingURL=mcpOAuth.js.map
@@ -144,4 +144,3 @@ export function consolidateMemory(facts, now) {
144
144
  }
145
145
  return result;
146
146
  }
147
- //# sourceMappingURL=memoryScorer.js.map
@@ -509,4 +509,3 @@ export function generateKnowledgeBase(scan) {
509
509
  }
510
510
  return docs;
511
511
  }
512
- //# sourceMappingURL=repoIndexer.js.map
@@ -0,0 +1,24 @@
1
+ export interface CachedResponse {
2
+ id: string;
3
+ queryHash: string;
4
+ queryEmbedding: number[] | null;
5
+ query: string;
6
+ response: string;
7
+ model: string;
8
+ agentId: string;
9
+ systemPromptHash: string;
10
+ createdAt: number;
11
+ hitCount: number;
12
+ ttl: number;
13
+ }
14
+ export declare function checkCache(query: string, agentId: string, model: string, systemPromptHash: string, _ttlSeconds?: number): Promise<CachedResponse | null>;
15
+ export declare function storeResponse(query: string, response: string, agentId: string, model: string, systemPromptHash: string, ttlSeconds?: number): Promise<void>;
16
+ export declare function evictExpired(): Promise<void>;
17
+ export declare function evictLRU(maxEntries?: number): Promise<void>;
18
+ export declare function getCacheStats(): Promise<{
19
+ totalEntries: number;
20
+ hitRate: number;
21
+ estimatedSavings: number;
22
+ }>;
23
+ export declare function purgeCache(agentId?: string): Promise<void>;
24
+ //# sourceMappingURL=responseCache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"responseCache.d.ts","sourceRoot":"","sources":["../../../server/services/responseCache.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;CACb;AAwDD,wBAAsB,UAAU,CAC9B,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,WAAW,SAAO,GAC1F,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,CAgEhC;AAED,wBAAsB,aAAa,CACjC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAC/D,gBAAgB,EAAE,MAAM,EAAE,UAAU,SAAO,GAC1C,OAAO,CAAC,IAAI,CAAC,CAoBf;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAKlD;AAED,wBAAsB,QAAQ,CAAC,UAAU,SAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAa/D;AAED,wBAAsB,aAAa,IAAI,OAAO,CAAC;IAAE,YAAY,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,gBAAgB,EAAE,MAAM,CAAA;CAAE,CAAC,CAUlH;AAED,wBAAsB,UAAU,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAQhE"}
@@ -0,0 +1,163 @@
1
+ import { createHash } from 'node:crypto';
2
+ import { getDb, saveDb } from './sqliteStore.js';
3
+ import embeddingService from './embeddingService.js';
4
+ function toStr(v) { return typeof v === 'string' ? v : ''; }
5
+ function toNum(v) { return typeof v === 'number' ? v : 0; }
6
+ function normalizeQuery(q) {
7
+ return q.trim().toLowerCase().replace(/\s+/g, ' ');
8
+ }
9
+ function sha256(text) {
10
+ return createHash('sha256').update(text, 'utf8').digest('hex');
11
+ }
12
+ function levenshtein(a, b) {
13
+ const prev = Array.from({ length: b.length + 1 }, (_, j) => j);
14
+ const curr = new Array(b.length + 1).fill(0);
15
+ for (let i = 1; i <= a.length; i++) {
16
+ curr[0] = i;
17
+ for (let j = 1; j <= b.length; j++) {
18
+ curr[j] = a[i - 1] === b[j - 1] ? prev[j - 1] : 1 + Math.min(prev[j], curr[j - 1], prev[j - 1]);
19
+ }
20
+ prev.splice(0, b.length + 1, ...curr);
21
+ }
22
+ return prev[b.length];
23
+ }
24
+ function blobToVec(v) {
25
+ if (!(v instanceof Uint8Array))
26
+ return null;
27
+ return Array.from(new Float32Array(v.buffer, v.byteOffset, v.byteLength / 4));
28
+ }
29
+ function rowToCache(row) {
30
+ return {
31
+ id: toStr(row[0]),
32
+ queryHash: toStr(row[1]),
33
+ queryEmbedding: blobToVec(row[2]),
34
+ query: toStr(row[3]),
35
+ response: toStr(row[4]),
36
+ model: toStr(row[5]),
37
+ agentId: toStr(row[6]),
38
+ systemPromptHash: toStr(row[7]),
39
+ createdAt: toNum(row[8]),
40
+ hitCount: toNum(row[9]),
41
+ ttl: toNum(row[10]),
42
+ };
43
+ }
44
+ async function markHit(id) {
45
+ const d = await getDb();
46
+ const now = Math.floor(Date.now() / 1000);
47
+ d.run(`UPDATE response_cache SET hit_count = hit_count + 1, last_hit_at = ? WHERE id = ?`, [now, id]);
48
+ saveDb();
49
+ }
50
+ export async function checkCache(query, agentId, model, systemPromptHash, _ttlSeconds = 3600) {
51
+ const d = await getDb();
52
+ const now = Math.floor(Date.now() / 1000);
53
+ const norm = normalizeQuery(query);
54
+ const qHash = sha256(norm + agentId + model + systemPromptHash);
55
+ // Tier 1: exact hash match
56
+ const exact = d.exec(`SELECT id,query_hash,query_embedding,query,response,model,agent_id,system_prompt_hash,created_at,hit_count,ttl
57
+ FROM response_cache WHERE query_hash=? AND agent_id=? AND model=? AND system_prompt_hash=?
58
+ AND (ttl=0 OR created_at+ttl>?) LIMIT 1`, [qHash, agentId, model, systemPromptHash, now]);
59
+ if (exact.length > 0 && exact[0].values.length > 0) {
60
+ const hit = rowToCache(exact[0].values[0]);
61
+ await markHit(hit.id);
62
+ return hit;
63
+ }
64
+ // Tier 2: Levenshtein distance < 10% of query length
65
+ const threshold = Math.max(3, Math.floor(norm.length * 0.1));
66
+ const recent = d.exec(`SELECT id,query_hash,query_embedding,query,response,model,agent_id,system_prompt_hash,created_at,hit_count,ttl
67
+ FROM response_cache WHERE agent_id=? AND model=? AND system_prompt_hash=? AND (ttl=0 OR created_at+ttl>?)
68
+ ORDER BY created_at DESC LIMIT 200`, [agentId, model, systemPromptHash, now]);
69
+ if (recent.length > 0) {
70
+ for (const row of recent[0].values) {
71
+ if (levenshtein(norm, normalizeQuery(toStr(row[3]))) <= threshold) {
72
+ const hit = rowToCache(row);
73
+ await markHit(hit.id);
74
+ return hit;
75
+ }
76
+ }
77
+ }
78
+ // Tier 3: cosine similarity > 0.92 using embeddings
79
+ try {
80
+ const [queryVec] = await embeddingService.embedBatch([norm]);
81
+ const withEmb = d.exec(`SELECT id,query_hash,query_embedding,query,response,model,agent_id,system_prompt_hash,created_at,hit_count,ttl
82
+ FROM response_cache WHERE agent_id=? AND model=? AND system_prompt_hash=?
83
+ AND query_embedding IS NOT NULL AND (ttl=0 OR created_at+ttl>?) ORDER BY created_at DESC LIMIT 500`, [agentId, model, systemPromptHash, now]);
84
+ if (withEmb.length > 0) {
85
+ let bestScore = 0;
86
+ let bestRow = null;
87
+ for (const row of withEmb[0].values) {
88
+ const vec = blobToVec(row[2]);
89
+ if (!vec)
90
+ continue;
91
+ const score = embeddingService.similarity(queryVec, vec);
92
+ if (score > bestScore) {
93
+ bestScore = score;
94
+ bestRow = row;
95
+ }
96
+ }
97
+ if (bestScore > 0.92 && bestRow) {
98
+ const hit = rowToCache(bestRow);
99
+ await markHit(hit.id);
100
+ return hit;
101
+ }
102
+ }
103
+ }
104
+ catch { /* embedding service unavailable — skip tier 3 */ }
105
+ return null;
106
+ }
107
+ export async function storeResponse(query, response, agentId, model, systemPromptHash, ttlSeconds = 3600) {
108
+ const d = await getDb();
109
+ const norm = normalizeQuery(query);
110
+ const qHash = sha256(norm + agentId + model + systemPromptHash);
111
+ const id = `rc-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
112
+ const now = Math.floor(Date.now() / 1000);
113
+ let embeddingBlob = null;
114
+ try {
115
+ const [vec] = await embeddingService.embedBatch([norm]);
116
+ embeddingBlob = Buffer.from(new Float32Array(vec).buffer);
117
+ }
118
+ catch { /* skip embedding if unavailable */ }
119
+ d.run(`INSERT OR REPLACE INTO response_cache
120
+ (id,query_hash,query_embedding,query,response,model,agent_id,system_prompt_hash,created_at,hit_count,last_hit_at,ttl)
121
+ VALUES (?,?,?,?,?,?,?,?,?,0,?,?)`, [id, qHash, embeddingBlob, norm, response, model, agentId, systemPromptHash, now, now, ttlSeconds]);
122
+ saveDb();
123
+ }
124
+ export async function evictExpired() {
125
+ const d = await getDb();
126
+ const now = Math.floor(Date.now() / 1000);
127
+ d.run(`DELETE FROM response_cache WHERE ttl > 0 AND created_at + ttl <= ?`, [now]);
128
+ saveDb();
129
+ }
130
+ export async function evictLRU(maxEntries = 1000) {
131
+ const d = await getDb();
132
+ const agents = d.exec(`SELECT DISTINCT agent_id FROM response_cache`);
133
+ if (agents.length === 0)
134
+ return;
135
+ for (const row of agents[0].values) {
136
+ const aid = toStr(row[0]);
137
+ d.run(`DELETE FROM response_cache WHERE agent_id=? AND id NOT IN
138
+ (SELECT id FROM response_cache WHERE agent_id=? ORDER BY last_hit_at DESC LIMIT ?)`, [aid, aid, maxEntries]);
139
+ }
140
+ saveDb();
141
+ }
142
+ export async function getCacheStats() {
143
+ const d = await getDb();
144
+ const r = d.exec(`SELECT COUNT(*), COALESCE(SUM(hit_count),0), COALESCE(SUM(CAST(LENGTH(response) AS REAL)/4*hit_count),0) FROM response_cache`);
145
+ if (r.length === 0 || r[0].values.length === 0)
146
+ return { totalEntries: 0, hitRate: 0, estimatedSavings: 0 };
147
+ const row = r[0].values[0];
148
+ const totalEntries = toNum(row[0]);
149
+ const totalHits = toNum(row[1]);
150
+ const estimatedSavings = toNum(row[2]) * 0.000015;
151
+ const hitRate = totalHits + totalEntries > 0 ? totalHits / (totalHits + totalEntries) : 0;
152
+ return { totalEntries, hitRate, estimatedSavings };
153
+ }
154
+ export async function purgeCache(agentId) {
155
+ const d = await getDb();
156
+ if (agentId) {
157
+ d.run(`DELETE FROM response_cache WHERE agent_id = ?`, [agentId]);
158
+ }
159
+ else {
160
+ d.run(`DELETE FROM response_cache`);
161
+ }
162
+ saveDb();
163
+ }
@@ -19,4 +19,12 @@ export declare function listConversations(limit?: number): Promise<Array<{
19
19
  updatedAt: number;
20
20
  }>>;
21
21
  export declare function deleteConversation(id: string): Promise<void>;
22
+ export interface QualRunEntry {
23
+ runId: string;
24
+ timestamp: number;
25
+ globalScore: number;
26
+ passThreshold: number;
27
+ }
28
+ export declare function saveQualificationRun(agentId: string, run: QualRunEntry): Promise<void>;
29
+ export declare function getQualificationHistory(agentId: string, limit?: number): Promise<QualRunEntry[]>;
22
30
  //# sourceMappingURL=sqliteStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sqliteStore.d.ts","sourceRoot":"","sources":["../../../server/services/sqliteStore.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAU7C,wBAAsB,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,CA2B/C;AAED,wBAAgB,MAAM,IAAI,IAAI,CAM7B;AAGD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAMnF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO1H;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAI7D;AAGD,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAKrH;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,GAAG,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CAMrI;AAED,wBAAsB,iBAAiB,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAW/J;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIlE"}
1
+ {"version":3,"file":"sqliteStore.d.ts","sourceRoot":"","sources":["../../../server/services/sqliteStore.ts"],"names":[],"mappings":"AAAA,OAAkB,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AAU7C,wBAAsB,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,CAkD/C;AAED,wBAAgB,MAAM,IAAI,IAAI,CAM7B;AAGD,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAMnF;AAED,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAO1H;AAED,wBAAsB,qBAAqB,IAAI,OAAO,CAAC,MAAM,CAAC,CAI7D;AAGD,wBAAsB,gBAAgB,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAKrH;AAED,wBAAsB,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,GAAG,EAAE,CAAA;CAAE,GAAG,IAAI,CAAC,CAMrI;AAED,wBAAsB,iBAAiB,CAAC,KAAK,SAAK,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAW/J;AAED,wBAAsB,kBAAkB,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAIlE;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,wBAAsB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAO5F;AAED,wBAAsB,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAalG"}
@@ -19,21 +19,44 @@ export async function getDb() {
19
19
  db = new SQL.Database();
20
20
  }
21
21
  // Create tables
22
- db.run(`CREATE TABLE IF NOT EXISTS embeddings (
23
- content_hash TEXT PRIMARY KEY,
24
- model TEXT NOT NULL,
25
- vector BLOB NOT NULL,
26
- text_preview TEXT,
27
- created_at INTEGER DEFAULT (strftime('%s','now'))
22
+ db.run(`CREATE TABLE IF NOT EXISTS embeddings (
23
+ content_hash TEXT PRIMARY KEY,
24
+ model TEXT NOT NULL,
25
+ vector BLOB NOT NULL,
26
+ text_preview TEXT,
27
+ created_at INTEGER DEFAULT (strftime('%s','now'))
28
28
  )`);
29
- db.run(`CREATE TABLE IF NOT EXISTS conversations (
30
- id TEXT PRIMARY KEY,
31
- agent_id TEXT,
32
- agent_name TEXT,
33
- messages TEXT NOT NULL,
34
- created_at INTEGER DEFAULT (strftime('%s','now')),
35
- updated_at INTEGER DEFAULT (strftime('%s','now'))
29
+ db.run(`CREATE TABLE IF NOT EXISTS conversations (
30
+ id TEXT PRIMARY KEY,
31
+ agent_id TEXT,
32
+ agent_name TEXT,
33
+ messages TEXT NOT NULL,
34
+ created_at INTEGER DEFAULT (strftime('%s','now')),
35
+ updated_at INTEGER DEFAULT (strftime('%s','now'))
36
36
  )`);
37
+ db.run(`CREATE TABLE IF NOT EXISTS qualification_runs (
38
+ run_id TEXT PRIMARY KEY,
39
+ agent_id TEXT NOT NULL,
40
+ timestamp INTEGER NOT NULL,
41
+ global_score REAL NOT NULL,
42
+ pass_threshold INTEGER NOT NULL
43
+ )`);
44
+ db.run(`CREATE TABLE IF NOT EXISTS response_cache (
45
+ id TEXT PRIMARY KEY,
46
+ query_hash TEXT NOT NULL,
47
+ query_embedding BLOB,
48
+ query TEXT NOT NULL,
49
+ response TEXT NOT NULL,
50
+ model TEXT NOT NULL,
51
+ agent_id TEXT NOT NULL,
52
+ system_prompt_hash TEXT NOT NULL,
53
+ created_at INTEGER DEFAULT (strftime('%s','now')),
54
+ hit_count INTEGER DEFAULT 0,
55
+ last_hit_at INTEGER DEFAULT (strftime('%s','now')),
56
+ ttl INTEGER DEFAULT 3600
57
+ )`);
58
+ db.run(`CREATE INDEX IF NOT EXISTS idx_rc_query_hash ON response_cache (query_hash)`);
59
+ db.run(`CREATE INDEX IF NOT EXISTS idx_rc_agent_id ON response_cache (agent_id)`);
37
60
  return db;
38
61
  }
39
62
  export function saveDb() {
@@ -98,4 +121,20 @@ export async function deleteConversation(id) {
98
121
  d.run(`DELETE FROM conversations WHERE id = ?`, [id]);
99
122
  saveDb();
100
123
  }
101
- //# sourceMappingURL=sqliteStore.js.map
124
+ export async function saveQualificationRun(agentId, run) {
125
+ const d = await getDb();
126
+ d.run(`INSERT OR REPLACE INTO qualification_runs (run_id, agent_id, timestamp, global_score, pass_threshold) VALUES (?, ?, ?, ?, ?)`, [run.runId, agentId, run.timestamp, run.globalScore, run.passThreshold]);
127
+ saveDb();
128
+ }
129
+ export async function getQualificationHistory(agentId, limit = 50) {
130
+ const d = await getDb();
131
+ const result = d.exec(`SELECT run_id, timestamp, global_score, pass_threshold FROM qualification_runs WHERE agent_id = ? ORDER BY timestamp DESC LIMIT ?`, [agentId, limit]);
132
+ if (result.length === 0)
133
+ return [];
134
+ return result[0].values.map((row) => ({
135
+ runId: row[0],
136
+ timestamp: row[1],
137
+ globalScore: row[2],
138
+ passThreshold: row[3],
139
+ }));
140
+ }
@@ -73,4 +73,3 @@ export async function runTeam(config, onProgress) {
73
73
  };
74
74
  }
75
75
  }
76
- //# sourceMappingURL=teamRunner.js.map
@@ -116,4 +116,3 @@ export function listTeamWorktrees(teamId) {
116
116
  .filter((name) => name.includes(`--${teamSlug}--`))
117
117
  .map((name) => join(TREE_ROOT, name));
118
118
  }
119
- //# sourceMappingURL=worktreeManager.js.map
@@ -18,9 +18,14 @@ export interface McpServerConfig {
18
18
  url?: string;
19
19
  headers?: Record<string, string>;
20
20
  }
21
+ export interface MemoryConfig {
22
+ backend: string;
23
+ connectionString?: string;
24
+ }
21
25
  export interface AppConfig {
22
26
  providers: ProviderConfig[];
23
27
  mcpServers: McpServerConfig[];
28
+ memory?: MemoryConfig;
24
29
  }
25
30
  export interface ApiResponse<T = unknown> {
26
31
  status: 'ok' | 'error';
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../server/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,UAAU,EAAE,eAAe,EAAE,CAAC;CAC/B;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../server/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,QAAQ,GAAG,WAAW,GAAG,YAAY,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAClE,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,kBAAkB,CAAC;CACjC;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,OAAO,GAAG,KAAK,GAAG,MAAM,GAAG,iBAAiB,CAAC;IACpD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC5B,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,MAAM,WAAW,SAAS;IACxB,SAAS,EAAE,cAAc,EAAE,CAAC;IAC5B,UAAU,EAAE,eAAe,EAAE,CAAC;IAC9B,MAAM,CAAC,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,WAAW,CAAC,CAAC,GAAG,OAAO;IACtC,MAAM,EAAE,IAAI,GAAG,OAAO,CAAC;IACvB,IAAI,CAAC,EAAE,CAAC,CAAC;IACT,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB"}
@@ -1,2 +1 @@
1
1
  export {};
2
- //# sourceMappingURL=types.js.map
@@ -75,4 +75,3 @@ export function validateFilePaths(filePaths, allowedDirs) {
75
75
  }
76
76
  }
77
77
  }
78
- //# sourceMappingURL=pathSecurity.js.map
@@ -117,4 +117,3 @@ export function allocateBudgets(sources, totalBudget) {
117
117
  }
118
118
  return allocations;
119
119
  }
120
- //# sourceMappingURL=budgetAllocator.js.map
@@ -108,4 +108,3 @@ export function resolveContradictions(sources) {
108
108
  contradictionsFound
109
109
  };
110
110
  }
111
- //# sourceMappingURL=contradictionDetector.js.map
@@ -286,4 +286,3 @@ export function indexFlat(source, text, sourceType = 'flat') {
286
286
  created: Date.now(),
287
287
  };
288
288
  }
289
- //# sourceMappingURL=treeIndexer.js.map