modular-studio 1.0.6 → 1.1.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 (198) hide show
  1. package/dist/assets/Badge-Bsy2H_p2.js +1 -0
  2. package/dist/assets/GraphPanel-D4X3faxA.js +47 -0
  3. package/dist/assets/{Input-ndEGQSgx.js → Input-Dyb88Erk.js} +1 -1
  4. package/dist/assets/KnowledgeTab-BccWz7Np.js +5 -0
  5. package/dist/assets/MemoryTab-Y_66cE01.js +16 -0
  6. package/dist/assets/QualificationTab-Dm9dEIpM.js +1 -0
  7. package/dist/assets/ReviewTab-BrfXSyyf.js +104 -0
  8. package/dist/assets/{Section-CgmwAj_2.js → Section-68XDCFTl.js} +1 -1
  9. package/dist/assets/TestTab-CLKRT63X.js +42 -0
  10. package/dist/assets/{ToolsTab-C10Ulm8b.js → ToolsTab-xumi9Uds.js} +1 -1
  11. package/dist/assets/icons-CS8RUPBi.js +1 -0
  12. package/dist/assets/index-B2bm0161.css +1 -0
  13. package/dist/assets/index-C626nWuA.js +422 -0
  14. package/dist/assets/services-BDk6yY4o.js +369 -0
  15. package/dist/index.html +4 -4
  16. package/dist-server/bin/modular-mcp.js +1 -0
  17. package/dist-server/server/index.d.ts.map +1 -1
  18. package/dist-server/server/index.js +30 -0
  19. package/dist-server/server/mcp/manager.d.ts +3 -0
  20. package/dist-server/server/mcp/manager.d.ts.map +1 -1
  21. package/dist-server/server/mcp/manager.js +64 -3
  22. package/dist-server/server/migrations/index.d.ts +11 -0
  23. package/dist-server/server/migrations/index.d.ts.map +1 -0
  24. package/dist-server/server/migrations/index.js +57 -0
  25. package/dist-server/server/routes/analytics.d.ts +3 -0
  26. package/dist-server/server/routes/analytics.d.ts.map +1 -0
  27. package/dist-server/server/routes/analytics.js +24 -0
  28. package/dist-server/server/routes/connectors/airtable.d.ts +7 -0
  29. package/dist-server/server/routes/connectors/airtable.d.ts.map +1 -0
  30. package/dist-server/server/routes/connectors/airtable.js +119 -0
  31. package/dist-server/server/routes/connectors/confluence.d.ts +7 -0
  32. package/dist-server/server/routes/connectors/confluence.d.ts.map +1 -0
  33. package/dist-server/server/routes/connectors/confluence.js +176 -0
  34. package/dist-server/server/routes/connectors/github.d.ts +7 -0
  35. package/dist-server/server/routes/connectors/github.d.ts.map +1 -0
  36. package/dist-server/server/routes/connectors/github.js +195 -0
  37. package/dist-server/server/routes/connectors/gmail.d.ts +7 -0
  38. package/dist-server/server/routes/connectors/gmail.d.ts.map +1 -0
  39. package/dist-server/server/routes/connectors/gmail.js +115 -0
  40. package/dist-server/server/routes/connectors/google-docs.d.ts +10 -0
  41. package/dist-server/server/routes/connectors/google-docs.d.ts.map +1 -0
  42. package/dist-server/server/routes/connectors/google-docs.js +165 -0
  43. package/dist-server/server/routes/connectors/google-drive.d.ts +7 -0
  44. package/dist-server/server/routes/connectors/google-drive.d.ts.map +1 -0
  45. package/dist-server/server/routes/connectors/google-drive.js +163 -0
  46. package/dist-server/server/routes/connectors/google-sheets.d.ts +7 -0
  47. package/dist-server/server/routes/connectors/google-sheets.d.ts.map +1 -0
  48. package/dist-server/server/routes/connectors/google-sheets.js +90 -0
  49. package/dist-server/server/routes/connectors/hubspot.d.ts +7 -0
  50. package/dist-server/server/routes/connectors/hubspot.d.ts.map +1 -0
  51. package/dist-server/server/routes/connectors/hubspot.js +134 -0
  52. package/dist-server/server/routes/connectors/index.d.ts +6 -0
  53. package/dist-server/server/routes/connectors/index.d.ts.map +1 -0
  54. package/dist-server/server/routes/connectors/index.js +38 -0
  55. package/dist-server/server/routes/connectors/jira.d.ts +7 -0
  56. package/dist-server/server/routes/connectors/jira.d.ts.map +1 -0
  57. package/dist-server/server/routes/connectors/jira.js +151 -0
  58. package/dist-server/server/routes/connectors/linear.d.ts +7 -0
  59. package/dist-server/server/routes/connectors/linear.d.ts.map +1 -0
  60. package/dist-server/server/routes/connectors/linear.js +154 -0
  61. package/dist-server/server/routes/connectors/notion.d.ts +10 -0
  62. package/dist-server/server/routes/connectors/notion.d.ts.map +1 -0
  63. package/dist-server/server/routes/connectors/notion.js +201 -0
  64. package/dist-server/server/routes/connectors/plane.d.ts +10 -0
  65. package/dist-server/server/routes/connectors/plane.d.ts.map +1 -0
  66. package/dist-server/server/routes/connectors/plane.js +189 -0
  67. package/dist-server/server/routes/connectors/shared.d.ts +25 -0
  68. package/dist-server/server/routes/connectors/shared.d.ts.map +1 -0
  69. package/dist-server/server/routes/connectors/shared.js +202 -0
  70. package/dist-server/server/routes/connectors/slack.d.ts +7 -0
  71. package/dist-server/server/routes/connectors/slack.d.ts.map +1 -0
  72. package/dist-server/server/routes/connectors/slack.js +153 -0
  73. package/dist-server/server/routes/cost.d.ts +3 -0
  74. package/dist-server/server/routes/cost.d.ts.map +1 -0
  75. package/dist-server/server/routes/cost.js +113 -0
  76. package/dist-server/server/routes/graph.d.ts +11 -0
  77. package/dist-server/server/routes/graph.d.ts.map +1 -0
  78. package/dist-server/server/routes/graph.js +213 -0
  79. package/dist-server/server/routes/lessons.d.ts.map +1 -1
  80. package/dist-server/server/routes/lessons.js +119 -5
  81. package/dist-server/server/routes/llm.d.ts.map +1 -1
  82. package/dist-server/server/routes/llm.js +85 -18
  83. package/dist-server/server/routes/metaprompt-v2.d.ts +3 -0
  84. package/dist-server/server/routes/metaprompt-v2.d.ts.map +1 -0
  85. package/dist-server/server/routes/metaprompt-v2.js +104 -0
  86. package/dist-server/server/routes/qualification.d.ts.map +1 -1
  87. package/dist-server/server/routes/qualification.js +61 -11
  88. package/dist-server/server/routes/skills-search.d.ts.map +1 -1
  89. package/dist-server/server/routes/skills-search.js +10 -0
  90. package/dist-server/server/routes/tool-analytics.d.ts +3 -0
  91. package/dist-server/server/routes/tool-analytics.d.ts.map +1 -0
  92. package/dist-server/server/routes/tool-analytics.js +47 -0
  93. package/dist-server/server/services/adapters/sqliteAdapter.d.ts +1 -0
  94. package/dist-server/server/services/adapters/sqliteAdapter.d.ts.map +1 -1
  95. package/dist-server/server/services/adapters/sqliteAdapter.js +78 -48
  96. package/dist-server/server/services/credentialStore.d.ts +10 -0
  97. package/dist-server/server/services/credentialStore.d.ts.map +1 -0
  98. package/dist-server/server/services/credentialStore.js +123 -0
  99. package/dist-server/server/services/hindsightClient.d.ts.map +1 -1
  100. package/dist-server/server/services/hindsightClient.js +1 -0
  101. package/dist-server/server/services/lessonExtractor.d.ts +2 -0
  102. package/dist-server/server/services/lessonExtractor.d.ts.map +1 -1
  103. package/dist-server/server/services/lessonExtractor.js +7 -2
  104. package/dist-server/server/services/repoIndexer.d.ts +7 -1
  105. package/dist-server/server/services/repoIndexer.d.ts.map +1 -1
  106. package/dist-server/server/services/repoIndexer.js +295 -94
  107. package/dist-server/server/services/sqliteStore.d.ts +64 -0
  108. package/dist-server/server/services/sqliteStore.d.ts.map +1 -1
  109. package/dist-server/server/services/sqliteStore.js +238 -0
  110. package/dist-server/src/config.d.ts +2 -0
  111. package/dist-server/src/config.d.ts.map +1 -0
  112. package/dist-server/src/config.js +3 -0
  113. package/dist-server/src/graph/db.d.ts +46 -0
  114. package/dist-server/src/graph/db.d.ts.map +1 -0
  115. package/dist-server/src/graph/db.js +241 -0
  116. package/dist-server/src/graph/extractors/code.d.ts +12 -0
  117. package/dist-server/src/graph/extractors/code.d.ts.map +1 -0
  118. package/dist-server/src/graph/extractors/code.js +239 -0
  119. package/dist-server/src/graph/extractors/cross-type.d.ts +16 -0
  120. package/dist-server/src/graph/extractors/cross-type.d.ts.map +1 -0
  121. package/dist-server/src/graph/extractors/cross-type.js +67 -0
  122. package/dist-server/src/graph/extractors/markdown.d.ts +29 -0
  123. package/dist-server/src/graph/extractors/markdown.d.ts.map +1 -0
  124. package/dist-server/src/graph/extractors/markdown.js +224 -0
  125. package/dist-server/src/graph/extractors/yaml.d.ts +15 -0
  126. package/dist-server/src/graph/extractors/yaml.d.ts.map +1 -0
  127. package/dist-server/src/graph/extractors/yaml.js +104 -0
  128. package/dist-server/src/graph/index.d.ts +62 -0
  129. package/dist-server/src/graph/index.d.ts.map +1 -0
  130. package/dist-server/src/graph/index.js +67 -0
  131. package/dist-server/src/graph/packer.d.ts +19 -0
  132. package/dist-server/src/graph/packer.d.ts.map +1 -0
  133. package/dist-server/src/graph/packer.js +134 -0
  134. package/dist-server/src/graph/resolver.d.ts +12 -0
  135. package/dist-server/src/graph/resolver.d.ts.map +1 -0
  136. package/dist-server/src/graph/resolver.js +81 -0
  137. package/dist-server/src/graph/scanner.d.ts +34 -0
  138. package/dist-server/src/graph/scanner.d.ts.map +1 -0
  139. package/dist-server/src/graph/scanner.js +252 -0
  140. package/dist-server/src/graph/traverser.d.ts +17 -0
  141. package/dist-server/src/graph/traverser.d.ts.map +1 -0
  142. package/dist-server/src/graph/traverser.js +185 -0
  143. package/dist-server/src/graph/types.d.ts +117 -0
  144. package/dist-server/src/graph/types.d.ts.map +1 -0
  145. package/dist-server/src/graph/types.js +63 -0
  146. package/dist-server/src/metaprompt/v2/assembler.d.ts +3 -0
  147. package/dist-server/src/metaprompt/v2/assembler.d.ts.map +1 -0
  148. package/dist-server/src/metaprompt/v2/assembler.js +261 -0
  149. package/dist-server/src/metaprompt/v2/context-strategist.d.ts +3 -0
  150. package/dist-server/src/metaprompt/v2/context-strategist.d.ts.map +1 -0
  151. package/dist-server/src/metaprompt/v2/context-strategist.js +173 -0
  152. package/dist-server/src/metaprompt/v2/evaluator.d.ts +3 -0
  153. package/dist-server/src/metaprompt/v2/evaluator.d.ts.map +1 -0
  154. package/dist-server/src/metaprompt/v2/evaluator.js +281 -0
  155. package/dist-server/src/metaprompt/v2/index.d.ts +41 -0
  156. package/dist-server/src/metaprompt/v2/index.d.ts.map +1 -0
  157. package/dist-server/src/metaprompt/v2/index.js +90 -0
  158. package/dist-server/src/metaprompt/v2/parser.d.ts +3 -0
  159. package/dist-server/src/metaprompt/v2/parser.d.ts.map +1 -0
  160. package/dist-server/src/metaprompt/v2/parser.js +138 -0
  161. package/dist-server/src/metaprompt/v2/pattern-selector.d.ts +3 -0
  162. package/dist-server/src/metaprompt/v2/pattern-selector.d.ts.map +1 -0
  163. package/dist-server/src/metaprompt/v2/pattern-selector.js +154 -0
  164. package/dist-server/src/metaprompt/v2/researcher.d.ts +3 -0
  165. package/dist-server/src/metaprompt/v2/researcher.d.ts.map +1 -0
  166. package/dist-server/src/metaprompt/v2/researcher.js +194 -0
  167. package/dist-server/src/metaprompt/v2/tool-discovery.d.ts +74 -0
  168. package/dist-server/src/metaprompt/v2/tool-discovery.d.ts.map +1 -0
  169. package/dist-server/src/metaprompt/v2/tool-discovery.js +290 -0
  170. package/dist-server/src/metaprompt/v2/types.d.ts +154 -0
  171. package/dist-server/src/metaprompt/v2/types.d.ts.map +1 -0
  172. package/dist-server/src/metaprompt/v2/types.js +2 -0
  173. package/dist-server/src/services/contradictionDetector.js +1 -1
  174. package/dist-server/src/services/llmService.d.ts +61 -0
  175. package/dist-server/src/services/llmService.d.ts.map +1 -0
  176. package/dist-server/src/services/llmService.js +222 -0
  177. package/dist-server/src/store/knowledgeBase.d.ts +5 -1
  178. package/dist-server/src/store/knowledgeBase.d.ts.map +1 -1
  179. package/dist-server/src/store/knowledgeBase.js +0 -1
  180. package/dist-server/src/store/mcp-registry.d.ts +29 -0
  181. package/dist-server/src/store/mcp-registry.d.ts.map +1 -0
  182. package/dist-server/src/store/mcp-registry.js +1303 -0
  183. package/dist-server/src/types/registry.types.d.ts +13 -0
  184. package/dist-server/src/types/registry.types.d.ts.map +1 -0
  185. package/dist-server/src/types/registry.types.js +2 -0
  186. package/dist-server/tsconfig.server.tsbuildinfo +1 -1
  187. package/package.json +118 -105
  188. package/scripts/cleanup-worktrees.ps1 +29 -0
  189. package/dist/assets/Badge-DrUmDAXz.js +0 -1
  190. package/dist/assets/KnowledgeTab-CxlC76Rf.js +0 -4
  191. package/dist/assets/MemoryTab-CUScYWs9.js +0 -16
  192. package/dist/assets/QualificationTab-BqnWSQHm.js +0 -1
  193. package/dist/assets/ReviewTab-DKYl6cR9.js +0 -103
  194. package/dist/assets/TestTab-iJ2vCf9l.js +0 -33
  195. package/dist/assets/icons-MKpPNvV8.js +0 -1
  196. package/dist/assets/index-B_ip7Amg.css +0 -1
  197. package/dist/assets/index-gBy3427k.js +0 -143
  198. package/dist/assets/services-CTWXQK6j.js +0 -356
@@ -0,0 +1,252 @@
1
+ /**
2
+ * File Scanner — Builds FileNodes with symbols and content hash
3
+ *
4
+ * Incremental: only re-processes files whose contentHash changed.
5
+ * Orchestrates relation extraction across all file types.
6
+ */
7
+ import { extractCodeRelations } from './extractors/code.js';
8
+ import { extractMarkdownRelations, extractMarkdownSymbols } from './extractors/markdown.js';
9
+ import { extractYamlRelations } from './extractors/yaml.js';
10
+ import { extractCrossTypeRelations } from './extractors/cross-type.js';
11
+ import { estimateTokens } from '../services/treeIndexer.js';
12
+ // ── Language Detection ────────────────────────────────────────────────────────
13
+ const LANGUAGE_MAP = {
14
+ ts: 'typescript', tsx: 'typescript', js: 'typescript', jsx: 'typescript',
15
+ py: 'python',
16
+ md: 'markdown', mdx: 'markdown',
17
+ yml: 'yaml', yaml: 'yaml',
18
+ json: 'json',
19
+ };
20
+ const IGNORE_PATTERNS = [
21
+ /node_modules\//,
22
+ /\.git\//,
23
+ /dist\//,
24
+ /build\//,
25
+ /\.next\//,
26
+ /\.cache\//,
27
+ /coverage\//,
28
+ /\.DS_Store/,
29
+ /package-lock\.json/,
30
+ /yarn\.lock/,
31
+ /pnpm-lock\.yaml/,
32
+ ];
33
+ export function detectLanguage(filePath) {
34
+ const ext = filePath.split('.').pop()?.toLowerCase() ?? '';
35
+ return LANGUAGE_MAP[ext] ?? 'unknown';
36
+ }
37
+ export function shouldIndex(filePath) {
38
+ if (IGNORE_PATTERNS.some(p => p.test(filePath)))
39
+ return false;
40
+ const lang = detectLanguage(filePath);
41
+ return lang !== 'unknown';
42
+ }
43
+ // ── Content Hash ──────────────────────────────────────────────────────────────
44
+ /**
45
+ * Simple hash for change detection. Uses DJB2 for speed.
46
+ */
47
+ export function hashContent(content) {
48
+ let hash = 5381;
49
+ for (let i = 0; i < content.length; i++) {
50
+ hash = ((hash << 5) + hash + content.charCodeAt(i)) & 0xffffffff;
51
+ }
52
+ return hash.toString(36);
53
+ }
54
+ // ── File ID ───────────────────────────────────────────────────────────────────
55
+ export function fileId(path) {
56
+ // Deterministic ID from path
57
+ return hashContent(path);
58
+ }
59
+ // ── Symbol Extraction ─────────────────────────────────────────────────────────
60
+ // Code symbol patterns (simplified from existing codeIndexer)
61
+ const TS_EXPORT_SYM = /^export\s+(?:default\s+)?(?:async\s+)?(?:declare\s+)?(?:(?:abstract\s+)?class|interface|type|enum|function|(?:const|let|var))\s+(\w+)/gm;
62
+ const PY_DEF_SYM = /^(?:class|(?:async\s+)?def)\s+(\w+)/gm;
63
+ function extractCodeSymbols(content, language) {
64
+ const symbols = [];
65
+ // const _lines = content.split('\n');
66
+ if (language === 'typescript') {
67
+ TS_EXPORT_SYM.lastIndex = 0;
68
+ let match;
69
+ while ((match = TS_EXPORT_SYM.exec(content)) !== null) {
70
+ const lineNum = content.substring(0, match.index).split('\n').length;
71
+ const name = match[1];
72
+ const line = match[0];
73
+ let kind = 'const';
74
+ if (/class\b/.test(line))
75
+ kind = 'class';
76
+ else if (/interface\b/.test(line))
77
+ kind = 'interface';
78
+ else if (/type\b/.test(line))
79
+ kind = 'type';
80
+ else if (/enum\b/.test(line))
81
+ kind = 'enum';
82
+ else if (/function\b/.test(line))
83
+ kind = 'function';
84
+ symbols.push({
85
+ name,
86
+ kind,
87
+ lineStart: lineNum,
88
+ lineEnd: lineNum, // Simplified — would need block end detection
89
+ isExported: true,
90
+ tokens: estimateTokens(line),
91
+ });
92
+ }
93
+ // Also find non-exported top-level declarations for internal reference
94
+ const NON_EXPORT = /^(?:(?:abstract\s+)?class|interface|type|enum|function|(?:const|let|var))\s+(\w+)/gm;
95
+ NON_EXPORT.lastIndex = 0;
96
+ while ((match = NON_EXPORT.exec(content)) !== null) {
97
+ const name = match[1];
98
+ if (symbols.some(s => s.name === name))
99
+ continue;
100
+ const lineNum = content.substring(0, match.index).split('\n').length;
101
+ symbols.push({
102
+ name,
103
+ kind: 'function',
104
+ lineStart: lineNum,
105
+ lineEnd: lineNum,
106
+ isExported: false,
107
+ tokens: estimateTokens(match[0]),
108
+ });
109
+ }
110
+ }
111
+ else if (language === 'python') {
112
+ PY_DEF_SYM.lastIndex = 0;
113
+ let match;
114
+ while ((match = PY_DEF_SYM.exec(content)) !== null) {
115
+ const lineNum = content.substring(0, match.index).split('\n').length;
116
+ const name = match[1];
117
+ const isClass = match[0].startsWith('class');
118
+ symbols.push({
119
+ name,
120
+ kind: isClass ? 'class' : 'function',
121
+ lineStart: lineNum,
122
+ lineEnd: lineNum,
123
+ isExported: !name.startsWith('_'),
124
+ tokens: estimateTokens(match[0]),
125
+ });
126
+ }
127
+ }
128
+ return symbols;
129
+ }
130
+ // ── Build FileNode ────────────────────────────────────────────────────────────
131
+ export function buildFileNode(path, content, lastModified = Date.now()) {
132
+ const language = detectLanguage(path);
133
+ const id = fileId(path);
134
+ let symbols;
135
+ if (language === 'markdown') {
136
+ symbols = extractMarkdownSymbols(content).map(s => ({
137
+ ...s,
138
+ tokens: estimateTokens(s.name),
139
+ }));
140
+ }
141
+ else {
142
+ symbols = extractCodeSymbols(content, language);
143
+ }
144
+ return {
145
+ id,
146
+ path,
147
+ language,
148
+ lastModified,
149
+ contentHash: hashContent(content),
150
+ tokens: estimateTokens(content),
151
+ symbols,
152
+ };
153
+ }
154
+ // ── Full Scan ─────────────────────────────────────────────────────────────────
155
+ /**
156
+ * Scan all files from a list of {path, content, mtime} entries.
157
+ * This is the main entry point — the caller reads the filesystem.
158
+ */
159
+ export function fullScan(files, db) {
160
+ const start = Date.now();
161
+ db.clear();
162
+ // Phase 1: Build all FileNodes
163
+ const nodes = [];
164
+ for (const f of files) {
165
+ if (!shouldIndex(f.path))
166
+ continue;
167
+ const node = buildFileNode(f.path, f.content, f.mtime ?? Date.now());
168
+ db.upsertNode(node);
169
+ nodes.push(node);
170
+ }
171
+ // Phase 2: Extract relations (needs all nodes indexed first)
172
+ let totalRelations = 0;
173
+ const allNodes = db.getAllNodes();
174
+ const contentMap = new Map(files.map(f => [fileId(f.path), f.content]));
175
+ for (const node of allNodes) {
176
+ const content = contentMap.get(node.id) ?? '';
177
+ let rels = [];
178
+ if (node.language === 'typescript' || node.language === 'python') {
179
+ rels = extractCodeRelations(node, allNodes, content);
180
+ }
181
+ else if (node.language === 'markdown') {
182
+ rels = extractMarkdownRelations(node, allNodes, content);
183
+ }
184
+ else if (node.language === 'yaml' || node.language === 'json') {
185
+ rels = extractYamlRelations(node, allNodes, content);
186
+ }
187
+ const crossRels = extractCrossTypeRelations(node, allNodes, content);
188
+ db.addRelations([...rels, ...crossRels]);
189
+ totalRelations += rels.length + crossRels.length;
190
+ }
191
+ const stats = db.getStats();
192
+ return {
193
+ totalFiles: stats.nodes,
194
+ totalSymbols: stats.symbols,
195
+ totalRelations: stats.relations,
196
+ filesUpdated: stats.nodes,
197
+ relationsAdded: totalRelations,
198
+ relationsRemoved: 0,
199
+ staleFilesTriggered: 0,
200
+ durationMs: Date.now() - start,
201
+ };
202
+ }
203
+ /**
204
+ * Incremental update: process only changed files.
205
+ */
206
+ export function updateFiles(changedFiles, db) {
207
+ const start = Date.now();
208
+ let filesUpdated = 0;
209
+ let relationsAdded = 0;
210
+ let relationsRemoved = 0;
211
+ let staleFilesTriggered = 0;
212
+ for (const f of changedFiles) {
213
+ if (!shouldIndex(f.path))
214
+ continue;
215
+ const id = fileId(f.path);
216
+ const existing = db.getNode(id);
217
+ const newHash = hashContent(f.content);
218
+ // Skip if unchanged
219
+ if (existing && existing.contentHash === newHash)
220
+ continue;
221
+ // Remove old relations from this file
222
+ if (existing) {
223
+ relationsRemoved += db.removeRelationsForSource(id);
224
+ }
225
+ // Rebuild node
226
+ const node = buildFileNode(f.path, f.content, f.mtime ?? Date.now());
227
+ db.upsertNode(node);
228
+ filesUpdated++;
229
+ // Re-extract relations
230
+ const allNodes = db.getAllNodes();
231
+ let rels = [];
232
+ if (node.language === 'typescript' || node.language === 'python') {
233
+ rels = extractCodeRelations(node, allNodes, f.content);
234
+ }
235
+ else if (node.language === 'markdown') {
236
+ rels = extractMarkdownRelations(node, allNodes, f.content);
237
+ }
238
+ else if (node.language === 'yaml' || node.language === 'json') {
239
+ rels = extractYamlRelations(node, allNodes, f.content);
240
+ }
241
+ const crossRels = extractCrossTypeRelations(node, allNodes, f.content);
242
+ db.addRelations([...rels, ...crossRels]);
243
+ relationsAdded += rels.length + crossRels.length;
244
+ }
245
+ return {
246
+ filesUpdated,
247
+ relationsAdded,
248
+ relationsRemoved,
249
+ staleFilesTriggered,
250
+ durationMs: Date.now() - start,
251
+ };
252
+ }
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Graph Traverser — BFS with priority queue
3
+ *
4
+ * From entry points, walk the graph collecting files with decaying relevance.
5
+ * Respects token budget and traversal config (follow imports, callers, etc.)
6
+ */
7
+ import type { ContextGraph, EntryPoint, TraversalConfig, TraversalResult } from './types.js';
8
+ import { type TaskType } from './types.js';
9
+ /**
10
+ * Traverse the graph from entry points.
11
+ */
12
+ export declare function traverseGraph(entryPoints: EntryPoint[], graph: ContextGraph, config?: Partial<TraversalConfig>): TraversalResult;
13
+ /**
14
+ * Convenience: auto-detect task type and traverse with preset.
15
+ */
16
+ export declare function traverseForTask(query: string, entryPoints: EntryPoint[], graph: ContextGraph, taskType?: TaskType): TraversalResult;
17
+ //# sourceMappingURL=traverser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"traverser.d.ts","sourceRoot":"","sources":["../../../src/graph/traverser.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,YAAY,EAAE,UAAU,EAAE,eAAe,EAAE,eAAe,EAE3D,MAAM,YAAY,CAAC;AACpB,OAAO,EAAqC,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AA0D9E;;GAEG;AACH,wBAAgB,aAAa,CAC3B,WAAW,EAAE,UAAU,EAAE,EACzB,KAAK,EAAE,YAAY,EACnB,MAAM,GAAE,OAAO,CAAC,eAAe,CAAM,GACpC,eAAe,CAyIjB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,MAAM,EACb,WAAW,EAAE,UAAU,EAAE,EACzB,KAAK,EAAE,YAAY,EACnB,QAAQ,CAAC,EAAE,QAAQ,GAClB,eAAe,CAIjB"}
@@ -0,0 +1,185 @@
1
+ /**
2
+ * Graph Traverser — BFS with priority queue
3
+ *
4
+ * From entry points, walk the graph collecting files with decaying relevance.
5
+ * Respects token budget and traversal config (follow imports, callers, etc.)
6
+ */
7
+ import { TRAVERSAL_PRESETS, detectTaskType } from './types.js';
8
+ const DECAY_FACTOR = 0.7;
9
+ const DEFAULT_CONFIG = {
10
+ maxDepth: 3,
11
+ maxFiles: 20,
12
+ tokenBudget: 100000,
13
+ minWeight: 0.3,
14
+ followImports: true,
15
+ followCallers: false,
16
+ followTests: false,
17
+ followDocs: true,
18
+ followLinks: true,
19
+ followReferences: true,
20
+ };
21
+ /**
22
+ * Check if a relation kind should be followed based on config.
23
+ */
24
+ function shouldFollowRelation(kind, config) {
25
+ switch (kind) {
26
+ case 'imports':
27
+ case 'extends':
28
+ case 'implements':
29
+ case 'uses_type':
30
+ return config.followImports;
31
+ case 'calls':
32
+ return config.followImports; // calls follow same setting as imports
33
+ case 'tested_by':
34
+ case 'tests':
35
+ return config.followTests;
36
+ case 'documents':
37
+ return config.followDocs;
38
+ case 'links_to':
39
+ case 'continues':
40
+ case 'supersedes':
41
+ case 'depends_on':
42
+ case 'defined_in':
43
+ return config.followLinks;
44
+ case 'references':
45
+ return config.followReferences;
46
+ case 'configured_by':
47
+ return config.followImports;
48
+ case 'related':
49
+ return config.followReferences;
50
+ default:
51
+ return false;
52
+ }
53
+ }
54
+ /**
55
+ * Traverse the graph from entry points.
56
+ */
57
+ export function traverseGraph(entryPoints, graph, config = {}) {
58
+ const cfg = { ...DEFAULT_CONFIG, ...config };
59
+ const visited = new Map(); // fileId → best item
60
+ const queue = [];
61
+ let nodesTraversed = 0;
62
+ let edgesFollowed = 0;
63
+ let nodesPruned = 0;
64
+ // Seed with entry points
65
+ for (const ep of entryPoints) {
66
+ const item = {
67
+ fileId: ep.fileId,
68
+ relevance: ep.confidence,
69
+ distance: 0,
70
+ reason: `Entry point: ${ep.reason}${ep.symbolName ? ` (${ep.symbolName})` : ''}`,
71
+ };
72
+ queue.push(item);
73
+ visited.set(ep.fileId, item);
74
+ }
75
+ // BFS with priority (process highest relevance first)
76
+ while (queue.length > 0) {
77
+ // Sort by relevance descending (priority queue)
78
+ queue.sort((a, b) => b.relevance - a.relevance);
79
+ const current = queue.shift();
80
+ if (current.distance >= cfg.maxDepth)
81
+ continue;
82
+ nodesTraversed++;
83
+ // Get outgoing relations
84
+ const outgoing = graph.outgoing.get(current.fileId) ?? [];
85
+ // Also check incoming for reverse traversal (callers)
86
+ const incoming = cfg.followCallers
87
+ ? (graph.incoming.get(current.fileId) ?? [])
88
+ : [];
89
+ const allEdges = [];
90
+ for (const rel of outgoing) {
91
+ if (shouldFollowRelation(rel.kind, cfg) && rel.weight >= cfg.minWeight) {
92
+ allEdges.push({
93
+ rel,
94
+ targetId: rel.targetFile,
95
+ reason: `${rel.kind} from ${graph.nodes.get(current.fileId)?.path ?? current.fileId}`,
96
+ });
97
+ }
98
+ }
99
+ for (const rel of incoming) {
100
+ // Reverse: incoming relation means this file is TARGET, we follow to SOURCE
101
+ const reverseKinds = ['calls', 'imports', 'extends', 'implements'];
102
+ if (reverseKinds.includes(rel.kind) && rel.weight >= cfg.minWeight) {
103
+ allEdges.push({
104
+ rel,
105
+ targetId: rel.sourceFile,
106
+ reason: `called/imported by ${graph.nodes.get(rel.sourceFile)?.path ?? rel.sourceFile}`,
107
+ });
108
+ }
109
+ }
110
+ for (const { rel, targetId, reason } of allEdges) {
111
+ edgesFollowed++;
112
+ const newRelevance = current.relevance * rel.weight * DECAY_FACTOR;
113
+ if (newRelevance < cfg.minWeight) {
114
+ nodesPruned++;
115
+ continue;
116
+ }
117
+ const existing = visited.get(targetId);
118
+ if (existing && existing.relevance >= newRelevance)
119
+ continue;
120
+ const item = {
121
+ fileId: targetId,
122
+ relevance: newRelevance,
123
+ distance: current.distance + 1,
124
+ reason,
125
+ };
126
+ visited.set(targetId, item);
127
+ queue.push(item);
128
+ }
129
+ }
130
+ // Build result: sort by relevance, cap at maxFiles, respect token budget
131
+ const allFiles = [];
132
+ let totalTokens = 0;
133
+ const sorted = Array.from(visited.values())
134
+ .sort((a, b) => b.relevance - a.relevance);
135
+ for (const item of sorted) {
136
+ if (allFiles.length >= cfg.maxFiles) {
137
+ nodesPruned++;
138
+ continue;
139
+ }
140
+ const node = graph.nodes.get(item.fileId);
141
+ if (!node)
142
+ continue;
143
+ if (totalTokens + node.tokens > cfg.tokenBudget) {
144
+ // Still include at reduced depth if possible
145
+ if (totalTokens + 100 <= cfg.tokenBudget) {
146
+ allFiles.push({
147
+ node,
148
+ relevance: item.relevance,
149
+ distance: item.distance,
150
+ reason: item.reason,
151
+ });
152
+ totalTokens += 100; // Approximate headline-only cost
153
+ }
154
+ else {
155
+ nodesPruned++;
156
+ }
157
+ continue;
158
+ }
159
+ allFiles.push({
160
+ node,
161
+ relevance: item.relevance,
162
+ distance: item.distance,
163
+ reason: item.reason,
164
+ });
165
+ totalTokens += node.tokens;
166
+ }
167
+ return {
168
+ files: allFiles,
169
+ totalTokens,
170
+ graphStats: {
171
+ nodesTraversed,
172
+ edgesFollowed,
173
+ nodesIncluded: allFiles.length,
174
+ nodesPruned,
175
+ },
176
+ };
177
+ }
178
+ /**
179
+ * Convenience: auto-detect task type and traverse with preset.
180
+ */
181
+ export function traverseForTask(query, entryPoints, graph, taskType) {
182
+ const task = taskType ?? detectTaskType(query);
183
+ const preset = TRAVERSAL_PRESETS[task];
184
+ return traverseGraph(entryPoints, graph, preset);
185
+ }
@@ -0,0 +1,117 @@
1
+ /**
2
+ * Context Graph — Type Definitions
3
+ *
4
+ * Universal dependency graph for code, markdown, YAML, and JSON files.
5
+ * Tracks cross-file relations for query-driven context assembly.
6
+ */
7
+ import type { TreeIndex } from '../services/treeIndexer.js';
8
+ export type FileLanguage = 'typescript' | 'python' | 'markdown' | 'yaml' | 'json' | 'unknown';
9
+ export type SymbolKind = 'function' | 'class' | 'interface' | 'type' | 'const' | 'enum' | 'heading' | 'anchor' | 'definition' | 'link_target' | 'tag' | 'key' | 'schema' | 'export';
10
+ export interface SymbolDef {
11
+ name: string;
12
+ kind: SymbolKind;
13
+ signature?: string;
14
+ lineStart: number;
15
+ lineEnd: number;
16
+ isExported: boolean;
17
+ treeNodeId?: string;
18
+ docstring?: string;
19
+ tokens?: number;
20
+ }
21
+ export interface FileNode {
22
+ id: string;
23
+ path: string;
24
+ language: FileLanguage;
25
+ lastModified: number;
26
+ contentHash: string;
27
+ tokens: number;
28
+ treeIndex?: TreeIndex;
29
+ symbols: SymbolDef[];
30
+ }
31
+ export type RelationKind = 'imports' | 'calls' | 'extends' | 'implements' | 'uses_type' | 'tested_by' | 'tests' | 'links_to' | 'references' | 'continues' | 'supersedes' | 'depends_on' | 'defined_in' | 'documents' | 'configured_by' | 'related';
32
+ export interface Relation {
33
+ id?: number;
34
+ sourceFile: string;
35
+ sourceSymbol?: string;
36
+ targetFile: string;
37
+ targetSymbol?: string;
38
+ kind: RelationKind;
39
+ weight: number;
40
+ metadata?: Record<string, string>;
41
+ }
42
+ export interface ContextGraph {
43
+ nodes: Map<string, FileNode>;
44
+ relations: Relation[];
45
+ outgoing: Map<string, Relation[]>;
46
+ incoming: Map<string, Relation[]>;
47
+ symbolIndex: Map<string, FileNode[]>;
48
+ rootPath: string;
49
+ lastFullScan: number;
50
+ version: number;
51
+ }
52
+ export interface TraversalConfig {
53
+ maxDepth: number;
54
+ maxFiles: number;
55
+ tokenBudget: number;
56
+ minWeight: number;
57
+ followImports: boolean;
58
+ followCallers: boolean;
59
+ followTests: boolean;
60
+ followDocs: boolean;
61
+ followLinks: boolean;
62
+ followReferences: boolean;
63
+ }
64
+ export interface TraversalResult {
65
+ files: TraversalFile[];
66
+ totalTokens: number;
67
+ graphStats: {
68
+ nodesTraversed: number;
69
+ edgesFollowed: number;
70
+ nodesIncluded: number;
71
+ nodesPruned: number;
72
+ };
73
+ }
74
+ export interface TraversalFile {
75
+ node: FileNode;
76
+ relevance: number;
77
+ distance: number;
78
+ reason: string;
79
+ includeSymbols?: string[];
80
+ }
81
+ export interface EntryPoint {
82
+ fileId: string;
83
+ symbolName?: string;
84
+ confidence: number;
85
+ reason: 'Direct mention' | 'Filename match' | 'Semantic match';
86
+ }
87
+ export interface PackedContext {
88
+ items: PackedItem[];
89
+ totalTokens: number;
90
+ budgetUtilization: number;
91
+ }
92
+ export interface PackedItem {
93
+ file: FileNode;
94
+ content: string;
95
+ depth: number;
96
+ tokens: number;
97
+ relevance: number;
98
+ }
99
+ export interface UpdateResult {
100
+ filesUpdated: number;
101
+ relationsAdded: number;
102
+ relationsRemoved: number;
103
+ staleFilesTriggered: number;
104
+ durationMs: number;
105
+ }
106
+ export interface ScanResult extends UpdateResult {
107
+ totalFiles: number;
108
+ totalSymbols: number;
109
+ totalRelations: number;
110
+ }
111
+ export type TaskType = 'fix' | 'review' | 'explain' | 'build' | 'document' | 'research';
112
+ export declare const TRAVERSAL_PRESETS: Record<TaskType, Partial<TraversalConfig>>;
113
+ /**
114
+ * Auto-detect task type from query keywords.
115
+ */
116
+ export declare function detectTaskType(query: string): TaskType;
117
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/graph/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * Context Graph — Type Definitions
3
+ *
4
+ * Universal dependency graph for code, markdown, YAML, and JSON files.
5
+ * Tracks cross-file relations for query-driven context assembly.
6
+ */
7
+ export const TRAVERSAL_PRESETS = {
8
+ fix: {
9
+ maxDepth: 3, maxFiles: 15,
10
+ followImports: true, followCallers: false, followTests: true,
11
+ followDocs: false, followLinks: false, followReferences: false,
12
+ minWeight: 0.4,
13
+ },
14
+ review: {
15
+ maxDepth: 2, maxFiles: 25,
16
+ followImports: true, followCallers: true, followTests: true,
17
+ followDocs: true, followLinks: true, followReferences: false,
18
+ minWeight: 0.3,
19
+ },
20
+ explain: {
21
+ maxDepth: 4, maxFiles: 20,
22
+ followImports: true, followCallers: false, followTests: false,
23
+ followDocs: true, followLinks: true, followReferences: true,
24
+ minWeight: 0.3,
25
+ },
26
+ build: {
27
+ maxDepth: 2, maxFiles: 15,
28
+ followImports: true, followCallers: false, followTests: false,
29
+ followDocs: true, followLinks: false, followReferences: false,
30
+ minWeight: 0.5,
31
+ },
32
+ document: {
33
+ maxDepth: 3, maxFiles: 20,
34
+ followImports: true, followCallers: true, followTests: true,
35
+ followDocs: true, followLinks: true, followReferences: true,
36
+ minWeight: 0.3,
37
+ },
38
+ research: {
39
+ maxDepth: 4, maxFiles: 30,
40
+ followImports: false, followCallers: false, followTests: false,
41
+ followDocs: true, followLinks: true, followReferences: true,
42
+ minWeight: 0.2,
43
+ },
44
+ };
45
+ /**
46
+ * Auto-detect task type from query keywords.
47
+ */
48
+ export function detectTaskType(query) {
49
+ const q = query.toLowerCase();
50
+ if (/fix|bug|error|crash|broken|issue/.test(q))
51
+ return 'fix';
52
+ if (/\bresearch\b|find|look.*up|what.*about/.test(q))
53
+ return 'research';
54
+ if (/\breview\b|pr\b|pull request|diff|changes/.test(q))
55
+ return 'review';
56
+ if (/explain|how does|what is|understand|walk.*through/.test(q))
57
+ return 'explain';
58
+ if (/add|build|create|implement|feature|new/.test(q))
59
+ return 'build';
60
+ if (/document|readme|write.*doc|api.*doc/.test(q))
61
+ return 'document';
62
+ return 'explain';
63
+ }
@@ -0,0 +1,3 @@
1
+ import type { LLMCallConfig, ParsedInput, ResearchResult, PatternSelection, ContextStrategy, AssembledAgent } from './types.js';
2
+ export declare function runAssembler(parsed: ParsedInput, research: ResearchResult, pattern: PatternSelection, context: ContextStrategy, llmConfig: LLMCallConfig): Promise<AssembledAgent>;
3
+ //# sourceMappingURL=assembler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"assembler.d.ts","sourceRoot":"","sources":["../../../../src/metaprompt/v2/assembler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,WAAW,EACX,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,cAAc,EAKf,MAAM,YAAY,CAAC;AAuGpB,wBAAsB,YAAY,CAChC,MAAM,EAAE,WAAW,EACnB,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,gBAAgB,EACzB,OAAO,EAAE,eAAe,EACxB,SAAS,EAAE,aAAa,GACvB,OAAO,CAAC,cAAc,CAAC,CA4DzB"}