lance-context 0.1.0 → 1.0.1

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 (237) hide show
  1. package/README.md +232 -23
  2. package/dist/__tests__/ast-chunker.test.d.ts +2 -0
  3. package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
  4. package/dist/__tests__/ast-chunker.test.js +307 -0
  5. package/dist/__tests__/ast-chunker.test.js.map +1 -0
  6. package/dist/__tests__/config.test.d.ts +2 -0
  7. package/dist/__tests__/config.test.d.ts.map +1 -0
  8. package/dist/__tests__/config.test.js +242 -0
  9. package/dist/__tests__/config.test.js.map +1 -0
  10. package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
  11. package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
  12. package/dist/__tests__/dashboard/beads.test.js +151 -0
  13. package/dist/__tests__/dashboard/beads.test.js.map +1 -0
  14. package/dist/__tests__/dashboard/index.test.d.ts +2 -0
  15. package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
  16. package/dist/__tests__/dashboard/index.test.js +116 -0
  17. package/dist/__tests__/dashboard/index.test.js.map +1 -0
  18. package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
  19. package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
  20. package/dist/__tests__/dashboard/routes.test.js +125 -0
  21. package/dist/__tests__/dashboard/routes.test.js.map +1 -0
  22. package/dist/__tests__/dashboard/server.test.d.ts +2 -0
  23. package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
  24. package/dist/__tests__/dashboard/server.test.js +75 -0
  25. package/dist/__tests__/dashboard/server.test.js.map +1 -0
  26. package/dist/__tests__/dashboard/state.test.d.ts +2 -0
  27. package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
  28. package/dist/__tests__/dashboard/state.test.js +124 -0
  29. package/dist/__tests__/dashboard/state.test.js.map +1 -0
  30. package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
  31. package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
  32. package/dist/__tests__/embeddings/factory.test.js +100 -0
  33. package/dist/__tests__/embeddings/factory.test.js.map +1 -0
  34. package/dist/__tests__/embeddings/jina.test.d.ts +2 -0
  35. package/dist/__tests__/embeddings/jina.test.d.ts.map +1 -0
  36. package/dist/__tests__/embeddings/jina.test.js +156 -0
  37. package/dist/__tests__/embeddings/jina.test.js.map +1 -0
  38. package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
  39. package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
  40. package/dist/__tests__/embeddings/ollama.test.js +172 -0
  41. package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
  42. package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
  43. package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
  44. package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
  45. package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
  46. package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
  47. package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
  48. package/dist/__tests__/embeddings/retry.test.js +260 -0
  49. package/dist/__tests__/embeddings/retry.test.js.map +1 -0
  50. package/dist/__tests__/embeddings/types.test.d.ts +2 -0
  51. package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
  52. package/dist/__tests__/embeddings/types.test.js +31 -0
  53. package/dist/__tests__/embeddings/types.test.js.map +1 -0
  54. package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
  55. package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
  56. package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
  57. package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
  58. package/dist/__tests__/mocks/fetch.mock.d.ts +38 -0
  59. package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
  60. package/dist/__tests__/mocks/fetch.mock.js +74 -0
  61. package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
  62. package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
  63. package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
  64. package/dist/__tests__/mocks/lancedb.mock.js +63 -0
  65. package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
  66. package/dist/__tests__/search/clustering.test.d.ts +2 -0
  67. package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
  68. package/dist/__tests__/search/clustering.test.js +230 -0
  69. package/dist/__tests__/search/clustering.test.js.map +1 -0
  70. package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
  71. package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
  72. package/dist/__tests__/search/hybrid-search.test.js +186 -0
  73. package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
  74. package/dist/__tests__/search/indexer.test.d.ts +2 -0
  75. package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
  76. package/dist/__tests__/search/indexer.test.js +878 -0
  77. package/dist/__tests__/search/indexer.test.js.map +1 -0
  78. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
  79. package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
  80. package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
  81. package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
  82. package/dist/__tests__/setup.d.ts +2 -0
  83. package/dist/__tests__/setup.d.ts.map +1 -0
  84. package/dist/__tests__/setup.js +11 -0
  85. package/dist/__tests__/setup.js.map +1 -0
  86. package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
  87. package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
  88. package/dist/__tests__/utils/concurrency.test.js +83 -0
  89. package/dist/__tests__/utils/concurrency.test.js.map +1 -0
  90. package/dist/__tests__/utils/errors.test.d.ts +2 -0
  91. package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
  92. package/dist/__tests__/utils/errors.test.js +136 -0
  93. package/dist/__tests__/utils/errors.test.js.map +1 -0
  94. package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
  95. package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
  96. package/dist/__tests__/utils/type-guards.test.js +80 -0
  97. package/dist/__tests__/utils/type-guards.test.js.map +1 -0
  98. package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
  99. package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
  100. package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
  101. package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
  102. package/dist/config.d.ts +122 -0
  103. package/dist/config.d.ts.map +1 -0
  104. package/dist/config.js +508 -0
  105. package/dist/config.js.map +1 -0
  106. package/dist/dashboard/beads.d.ts +35 -0
  107. package/dist/dashboard/beads.d.ts.map +1 -0
  108. package/dist/dashboard/beads.js +102 -0
  109. package/dist/dashboard/beads.js.map +1 -0
  110. package/dist/dashboard/events.d.ts +46 -0
  111. package/dist/dashboard/events.d.ts.map +1 -0
  112. package/dist/dashboard/events.js +141 -0
  113. package/dist/dashboard/events.js.map +1 -0
  114. package/dist/dashboard/index.d.ts +67 -0
  115. package/dist/dashboard/index.d.ts.map +1 -0
  116. package/dist/dashboard/index.js +90 -0
  117. package/dist/dashboard/index.js.map +1 -0
  118. package/dist/dashboard/routes.d.ts +6 -0
  119. package/dist/dashboard/routes.d.ts.map +1 -0
  120. package/dist/dashboard/routes.js +244 -0
  121. package/dist/dashboard/routes.js.map +1 -0
  122. package/dist/dashboard/server.d.ts +27 -0
  123. package/dist/dashboard/server.d.ts.map +1 -0
  124. package/dist/dashboard/server.js +72 -0
  125. package/dist/dashboard/server.js.map +1 -0
  126. package/dist/dashboard/state.d.ts +116 -0
  127. package/dist/dashboard/state.d.ts.map +1 -0
  128. package/dist/dashboard/state.js +251 -0
  129. package/dist/dashboard/state.js.map +1 -0
  130. package/dist/dashboard/ui.d.ts +6 -0
  131. package/dist/dashboard/ui.d.ts.map +1 -0
  132. package/dist/dashboard/ui.js +1407 -0
  133. package/dist/dashboard/ui.js.map +1 -0
  134. package/dist/embeddings/index.d.ts +20 -2
  135. package/dist/embeddings/index.d.ts.map +1 -1
  136. package/dist/embeddings/index.js +49 -6
  137. package/dist/embeddings/index.js.map +1 -1
  138. package/dist/embeddings/jina.d.ts +9 -0
  139. package/dist/embeddings/jina.d.ts.map +1 -1
  140. package/dist/embeddings/jina.js +42 -2
  141. package/dist/embeddings/jina.js.map +1 -1
  142. package/dist/embeddings/ollama.d.ts +2 -0
  143. package/dist/embeddings/ollama.d.ts.map +1 -1
  144. package/dist/embeddings/ollama.js +21 -5
  145. package/dist/embeddings/ollama.js.map +1 -1
  146. package/dist/embeddings/rate-limiter.d.ts +75 -0
  147. package/dist/embeddings/rate-limiter.d.ts.map +1 -0
  148. package/dist/embeddings/rate-limiter.js +145 -0
  149. package/dist/embeddings/rate-limiter.js.map +1 -0
  150. package/dist/embeddings/retry.d.ts +14 -0
  151. package/dist/embeddings/retry.d.ts.map +1 -0
  152. package/dist/embeddings/retry.js +89 -0
  153. package/dist/embeddings/retry.js.map +1 -0
  154. package/dist/embeddings/types.d.ts +56 -2
  155. package/dist/embeddings/types.d.ts.map +1 -1
  156. package/dist/embeddings/types.js +16 -0
  157. package/dist/embeddings/types.js.map +1 -1
  158. package/dist/index.js +1870 -44
  159. package/dist/index.js.map +1 -1
  160. package/dist/memory/index.d.ts +63 -0
  161. package/dist/memory/index.d.ts.map +1 -0
  162. package/dist/memory/index.js +168 -0
  163. package/dist/memory/index.js.map +1 -0
  164. package/dist/search/ast-chunker.d.ts +34 -0
  165. package/dist/search/ast-chunker.d.ts.map +1 -0
  166. package/dist/search/ast-chunker.js +261 -0
  167. package/dist/search/ast-chunker.js.map +1 -0
  168. package/dist/search/clustering.d.ts +77 -0
  169. package/dist/search/clustering.d.ts.map +1 -0
  170. package/dist/search/clustering.js +455 -0
  171. package/dist/search/clustering.js.map +1 -0
  172. package/dist/search/indexer.d.ts +239 -3
  173. package/dist/search/indexer.d.ts.map +1 -1
  174. package/dist/search/indexer.js +941 -45
  175. package/dist/search/indexer.js.map +1 -1
  176. package/dist/search/tree-sitter-chunker.d.ts +69 -0
  177. package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
  178. package/dist/search/tree-sitter-chunker.js +436 -0
  179. package/dist/search/tree-sitter-chunker.js.map +1 -0
  180. package/dist/symbols/index.d.ts +14 -0
  181. package/dist/symbols/index.d.ts.map +1 -0
  182. package/dist/symbols/index.js +19 -0
  183. package/dist/symbols/index.js.map +1 -0
  184. package/dist/symbols/name-path.d.ts +113 -0
  185. package/dist/symbols/name-path.d.ts.map +1 -0
  186. package/dist/symbols/name-path.js +194 -0
  187. package/dist/symbols/name-path.js.map +1 -0
  188. package/dist/symbols/pattern-search.d.ts +14 -0
  189. package/dist/symbols/pattern-search.d.ts.map +1 -0
  190. package/dist/symbols/pattern-search.js +224 -0
  191. package/dist/symbols/pattern-search.js.map +1 -0
  192. package/dist/symbols/reference-finder.d.ts +38 -0
  193. package/dist/symbols/reference-finder.d.ts.map +1 -0
  194. package/dist/symbols/reference-finder.js +376 -0
  195. package/dist/symbols/reference-finder.js.map +1 -0
  196. package/dist/symbols/symbol-editor.d.ts +81 -0
  197. package/dist/symbols/symbol-editor.d.ts.map +1 -0
  198. package/dist/symbols/symbol-editor.js +257 -0
  199. package/dist/symbols/symbol-editor.js.map +1 -0
  200. package/dist/symbols/symbol-extractor.d.ts +49 -0
  201. package/dist/symbols/symbol-extractor.d.ts.map +1 -0
  202. package/dist/symbols/symbol-extractor.js +593 -0
  203. package/dist/symbols/symbol-extractor.js.map +1 -0
  204. package/dist/symbols/symbol-renamer.d.ts +81 -0
  205. package/dist/symbols/symbol-renamer.d.ts.map +1 -0
  206. package/dist/symbols/symbol-renamer.js +204 -0
  207. package/dist/symbols/symbol-renamer.js.map +1 -0
  208. package/dist/symbols/types.d.ts +234 -0
  209. package/dist/symbols/types.d.ts.map +1 -0
  210. package/dist/symbols/types.js +106 -0
  211. package/dist/symbols/types.js.map +1 -0
  212. package/dist/utils/concurrency.d.ts +32 -0
  213. package/dist/utils/concurrency.d.ts.map +1 -0
  214. package/dist/utils/concurrency.js +57 -0
  215. package/dist/utils/concurrency.js.map +1 -0
  216. package/dist/utils/errors.d.ts +36 -0
  217. package/dist/utils/errors.d.ts.map +1 -0
  218. package/dist/utils/errors.js +91 -0
  219. package/dist/utils/errors.js.map +1 -0
  220. package/dist/utils/type-guards.d.ts +17 -0
  221. package/dist/utils/type-guards.d.ts.map +1 -0
  222. package/dist/utils/type-guards.js +25 -0
  223. package/dist/utils/type-guards.js.map +1 -0
  224. package/dist/worktree/index.d.ts +6 -0
  225. package/dist/worktree/index.d.ts.map +1 -0
  226. package/dist/worktree/index.js +6 -0
  227. package/dist/worktree/index.js.map +1 -0
  228. package/dist/worktree/types.d.ts +101 -0
  229. package/dist/worktree/types.d.ts.map +1 -0
  230. package/dist/worktree/types.js +6 -0
  231. package/dist/worktree/types.js.map +1 -0
  232. package/dist/worktree/worktree-manager.d.ts +80 -0
  233. package/dist/worktree/worktree-manager.d.ts.map +1 -0
  234. package/dist/worktree/worktree-manager.js +407 -0
  235. package/dist/worktree/worktree-manager.js.map +1 -0
  236. package/package.json +39 -5
  237. package/scripts/postinstall.js +48 -0
package/dist/config.js ADDED
@@ -0,0 +1,508 @@
1
+ import * as fs from 'fs/promises';
2
+ import * as path from 'path';
3
+ import { z } from 'zod';
4
+ /**
5
+ * Zod schema for configuration validation
6
+ */
7
+ const ChunkingConfigSchema = z.object({
8
+ maxLines: z.number().min(10).max(500).optional(),
9
+ overlap: z.number().min(0).max(50).optional(),
10
+ });
11
+ const SearchConfigSchema = z.object({
12
+ semanticWeight: z.number().min(0).max(1).optional(),
13
+ keywordWeight: z.number().min(0).max(1).optional(),
14
+ });
15
+ const EmbeddingConfigSchema = z.object({
16
+ backend: z.enum(['jina', 'ollama']).optional(),
17
+ model: z.string().optional(),
18
+ });
19
+ const DashboardConfigSchema = z.object({
20
+ enabled: z.boolean().optional(),
21
+ port: z.number().min(1024).max(65535).optional(),
22
+ openBrowser: z.boolean().optional(),
23
+ });
24
+ const ConfigSchema = z.object({
25
+ patterns: z.array(z.string()).optional(),
26
+ excludePatterns: z.array(z.string()).optional(),
27
+ embedding: EmbeddingConfigSchema.optional(),
28
+ chunking: ChunkingConfigSchema.optional(),
29
+ search: SearchConfigSchema.optional(),
30
+ dashboard: DashboardConfigSchema.optional(),
31
+ instructions: z.string().optional(),
32
+ });
33
+ const DEFAULT_PATTERNS = [
34
+ '**/*.ts',
35
+ '**/*.tsx',
36
+ '**/*.js',
37
+ '**/*.jsx',
38
+ '**/*.py',
39
+ '**/*.go',
40
+ '**/*.rs',
41
+ '**/*.java',
42
+ '**/*.rb',
43
+ '**/*.php',
44
+ '**/*.c',
45
+ '**/*.cpp',
46
+ '**/*.h',
47
+ '**/*.hpp',
48
+ '**/*.cs',
49
+ '**/*.swift',
50
+ '**/*.kt',
51
+ ];
52
+ const DEFAULT_EXCLUDE_PATTERNS = [
53
+ '**/node_modules/**',
54
+ '**/dist/**',
55
+ '**/.git/**',
56
+ '**/build/**',
57
+ '**/target/**',
58
+ '**/__pycache__/**',
59
+ '**/venv/**',
60
+ '**/.venv/**',
61
+ '**/vendor/**',
62
+ '**/*.min.js',
63
+ '**/*.min.css',
64
+ ];
65
+ /**
66
+ * Default chunking configuration
67
+ */
68
+ export const DEFAULT_CHUNKING = {
69
+ maxLines: 100,
70
+ overlap: 20,
71
+ };
72
+ /**
73
+ * Default search configuration
74
+ */
75
+ export const DEFAULT_SEARCH = {
76
+ semanticWeight: 0.7,
77
+ keywordWeight: 0.3,
78
+ };
79
+ /**
80
+ * Default dashboard configuration
81
+ */
82
+ export const DEFAULT_DASHBOARD = {
83
+ enabled: true,
84
+ port: 24300,
85
+ openBrowser: true,
86
+ };
87
+ export const DEFAULT_CONFIG = {
88
+ patterns: DEFAULT_PATTERNS,
89
+ excludePatterns: DEFAULT_EXCLUDE_PATTERNS,
90
+ chunking: DEFAULT_CHUNKING,
91
+ search: DEFAULT_SEARCH,
92
+ dashboard: DEFAULT_DASHBOARD,
93
+ };
94
+ const CONFIG_FILENAMES = ['.lance-context.json', 'lance-context.config.json'];
95
+ /**
96
+ * Load and validate configuration from project directory
97
+ */
98
+ /**
99
+ * Format a Zod validation error into a user-friendly message
100
+ */
101
+ function formatValidationError(error, rawConfig) {
102
+ const pathArray = error.path.map((p) => String(p));
103
+ const fieldPath = pathArray.join('.');
104
+ const rawValue = getValueAtPath(rawConfig, pathArray);
105
+ const rawValueStr = rawValue === undefined ? 'undefined' : JSON.stringify(rawValue);
106
+ switch (error.code) {
107
+ case 'invalid_type': {
108
+ const expected = error.expected;
109
+ const suggestion = getSuggestionForType(fieldPath, String(expected), rawValue);
110
+ return ` - ${fieldPath}: Expected ${expected}, got ${typeof rawValue} ${rawValueStr}${suggestion}`;
111
+ }
112
+ case 'too_small': {
113
+ const issueMin = error;
114
+ const suggestion = getSuggestionForRange(fieldPath, 'minimum', issueMin.minimum);
115
+ return ` - ${fieldPath}: Value ${rawValueStr} is below minimum ${issueMin.minimum}${suggestion}`;
116
+ }
117
+ case 'too_big': {
118
+ const issueMax = error;
119
+ const suggestion = getSuggestionForRange(fieldPath, 'maximum', issueMax.maximum);
120
+ return ` - ${fieldPath}: Value ${rawValueStr} exceeds maximum ${issueMax.maximum}${suggestion}`;
121
+ }
122
+ case 'invalid_value': {
123
+ // Handle enum validation errors
124
+ const issueVal = error;
125
+ if (issueVal.values) {
126
+ const options = issueVal.values.map((o) => `'${String(o)}'`).join(', ');
127
+ return ` - ${fieldPath}: Invalid value ${rawValueStr}. Valid options: ${options}`;
128
+ }
129
+ return ` - ${fieldPath}: Invalid value ${rawValueStr}`;
130
+ }
131
+ default:
132
+ return ` - ${fieldPath}: ${error.message}`;
133
+ }
134
+ }
135
+ /**
136
+ * Get the value at a path in an object
137
+ */
138
+ function getValueAtPath(obj, pathSegments) {
139
+ let current = obj;
140
+ for (const segment of pathSegments) {
141
+ if (current === null || typeof current !== 'object') {
142
+ return undefined;
143
+ }
144
+ current = current[segment];
145
+ }
146
+ return current;
147
+ }
148
+ /**
149
+ * Get suggestions for common type mistakes
150
+ */
151
+ function getSuggestionForType(fieldPath, expected, rawValue) {
152
+ // Check for string that looks like a number
153
+ if (expected === 'number' && typeof rawValue === 'string') {
154
+ const num = Number(rawValue);
155
+ if (!isNaN(num)) {
156
+ return `\n Suggestion: Remove quotes to use numeric value: ${num}`;
157
+ }
158
+ }
159
+ // Check for string that looks like a boolean
160
+ if (expected === 'boolean' && typeof rawValue === 'string') {
161
+ const lower = rawValue.toLowerCase();
162
+ if (lower === 'true' || lower === 'false') {
163
+ return `\n Suggestion: Remove quotes to use boolean value: ${lower}`;
164
+ }
165
+ }
166
+ // Check for array expected but got single value
167
+ if (expected === 'array' && typeof rawValue === 'string') {
168
+ return `\n Suggestion: Wrap the value in an array: ["${rawValue}"]`;
169
+ }
170
+ return '';
171
+ }
172
+ /**
173
+ * Get suggestions for range violations
174
+ */
175
+ function getSuggestionForRange(fieldPath, boundType, _bound) {
176
+ const fieldSuggestions = {
177
+ 'chunking.maxLines': boundType === 'minimum'
178
+ ? '\n Suggestion: Use a value between 10 and 500 lines per chunk'
179
+ : '\n Suggestion: Use a value between 10 and 500 lines per chunk',
180
+ 'chunking.overlap': boundType === 'minimum'
181
+ ? '\n Suggestion: Use a value between 0 and 50 lines for overlap'
182
+ : '\n Suggestion: Use a value between 0 and 50 lines for overlap',
183
+ 'search.semanticWeight': '\n Suggestion: Use a value between 0.0 and 1.0 for search weights',
184
+ 'search.keywordWeight': '\n Suggestion: Use a value between 0.0 and 1.0 for search weights',
185
+ 'dashboard.port': '\n Suggestion: Use a port number between 1024 and 65535',
186
+ };
187
+ return fieldSuggestions[fieldPath] || '';
188
+ }
189
+ /**
190
+ * Print formatted validation warnings to console
191
+ */
192
+ function printValidationWarnings(filename, errors, rawConfig) {
193
+ console.warn(`[lance-context] Warning: Invalid config in ${filename}`);
194
+ for (const error of errors) {
195
+ console.warn(formatValidationError(error, rawConfig));
196
+ }
197
+ console.warn(' Using default values for invalid fields.');
198
+ }
199
+ /**
200
+ * Extract valid configuration values from a raw config object.
201
+ * This allows us to use valid fields while falling back to defaults for invalid ones.
202
+ */
203
+ function extractValidConfig(rawConfig) {
204
+ if (typeof rawConfig !== 'object' || rawConfig === null) {
205
+ return {};
206
+ }
207
+ const config = rawConfig;
208
+ const result = {};
209
+ // Try to parse each section independently
210
+ if (config.patterns !== undefined) {
211
+ const patternsResult = z.array(z.string()).safeParse(config.patterns);
212
+ if (patternsResult.success) {
213
+ result.patterns = patternsResult.data;
214
+ }
215
+ }
216
+ if (config.excludePatterns !== undefined) {
217
+ const excludeResult = z.array(z.string()).safeParse(config.excludePatterns);
218
+ if (excludeResult.success) {
219
+ result.excludePatterns = excludeResult.data;
220
+ }
221
+ }
222
+ if (config.instructions !== undefined) {
223
+ const instructionsResult = z.string().safeParse(config.instructions);
224
+ if (instructionsResult.success) {
225
+ result.instructions = instructionsResult.data;
226
+ }
227
+ }
228
+ if (config.embedding !== undefined) {
229
+ const embeddingResult = EmbeddingConfigSchema.safeParse(config.embedding);
230
+ if (embeddingResult.success) {
231
+ result.embedding = embeddingResult.data;
232
+ }
233
+ }
234
+ if (config.chunking !== undefined) {
235
+ // Try to extract valid individual fields from chunking
236
+ const chunkingResult = extractValidChunking(config.chunking);
237
+ if (Object.keys(chunkingResult).length > 0) {
238
+ result.chunking = chunkingResult;
239
+ }
240
+ }
241
+ if (config.search !== undefined) {
242
+ // Try to extract valid individual fields from search
243
+ const searchResult = extractValidSearch(config.search);
244
+ if (Object.keys(searchResult).length > 0) {
245
+ result.search = searchResult;
246
+ }
247
+ }
248
+ if (config.dashboard !== undefined) {
249
+ // Try to extract valid individual fields from dashboard
250
+ const dashboardResult = extractValidDashboard(config.dashboard);
251
+ if (Object.keys(dashboardResult).length > 0) {
252
+ result.dashboard = dashboardResult;
253
+ }
254
+ }
255
+ return result;
256
+ }
257
+ /**
258
+ * Extract valid chunking config fields
259
+ */
260
+ function extractValidChunking(rawChunking) {
261
+ if (typeof rawChunking !== 'object' || rawChunking === null) {
262
+ return {};
263
+ }
264
+ const chunking = rawChunking;
265
+ const result = {};
266
+ if (chunking.maxLines !== undefined) {
267
+ const maxLinesResult = z.number().min(10).max(500).safeParse(chunking.maxLines);
268
+ if (maxLinesResult.success) {
269
+ result.maxLines = maxLinesResult.data;
270
+ }
271
+ }
272
+ if (chunking.overlap !== undefined) {
273
+ const overlapResult = z.number().min(0).max(50).safeParse(chunking.overlap);
274
+ if (overlapResult.success) {
275
+ result.overlap = overlapResult.data;
276
+ }
277
+ }
278
+ return result;
279
+ }
280
+ /**
281
+ * Extract valid search config fields
282
+ */
283
+ function extractValidSearch(rawSearch) {
284
+ if (typeof rawSearch !== 'object' || rawSearch === null) {
285
+ return {};
286
+ }
287
+ const search = rawSearch;
288
+ const result = {};
289
+ if (search.semanticWeight !== undefined) {
290
+ const semanticResult = z.number().min(0).max(1).safeParse(search.semanticWeight);
291
+ if (semanticResult.success) {
292
+ result.semanticWeight = semanticResult.data;
293
+ }
294
+ }
295
+ if (search.keywordWeight !== undefined) {
296
+ const keywordResult = z.number().min(0).max(1).safeParse(search.keywordWeight);
297
+ if (keywordResult.success) {
298
+ result.keywordWeight = keywordResult.data;
299
+ }
300
+ }
301
+ return result;
302
+ }
303
+ /**
304
+ * Extract valid dashboard config fields
305
+ */
306
+ function extractValidDashboard(rawDashboard) {
307
+ if (typeof rawDashboard !== 'object' || rawDashboard === null) {
308
+ return {};
309
+ }
310
+ const dashboard = rawDashboard;
311
+ const result = {};
312
+ if (dashboard.enabled !== undefined) {
313
+ const enabledResult = z.boolean().safeParse(dashboard.enabled);
314
+ if (enabledResult.success) {
315
+ result.enabled = enabledResult.data;
316
+ }
317
+ }
318
+ if (dashboard.port !== undefined) {
319
+ const portResult = z.number().min(1024).max(65535).safeParse(dashboard.port);
320
+ if (portResult.success) {
321
+ result.port = portResult.data;
322
+ }
323
+ }
324
+ if (dashboard.openBrowser !== undefined) {
325
+ const openBrowserResult = z.boolean().safeParse(dashboard.openBrowser);
326
+ if (openBrowserResult.success) {
327
+ result.openBrowser = openBrowserResult.data;
328
+ }
329
+ }
330
+ return result;
331
+ }
332
+ export async function loadConfig(projectPath) {
333
+ for (const filename of CONFIG_FILENAMES) {
334
+ const configPath = path.join(projectPath, filename);
335
+ try {
336
+ const content = await fs.readFile(configPath, 'utf-8');
337
+ const rawConfig = JSON.parse(content);
338
+ // Validate with Zod
339
+ const result = ConfigSchema.safeParse(rawConfig);
340
+ if (!result.success) {
341
+ // Print detailed validation warnings
342
+ printValidationWarnings(filename, result.error.issues, rawConfig);
343
+ // Try to salvage valid parts of the config by validating each section separately
344
+ const validConfig = extractValidConfig(rawConfig);
345
+ return {
346
+ patterns: validConfig.patterns || DEFAULT_PATTERNS,
347
+ excludePatterns: validConfig.excludePatterns || DEFAULT_EXCLUDE_PATTERNS,
348
+ embedding: validConfig.embedding,
349
+ chunking: {
350
+ ...DEFAULT_CHUNKING,
351
+ ...validConfig.chunking,
352
+ },
353
+ search: {
354
+ ...DEFAULT_SEARCH,
355
+ ...validConfig.search,
356
+ },
357
+ dashboard: {
358
+ ...DEFAULT_DASHBOARD,
359
+ ...validConfig.dashboard,
360
+ },
361
+ instructions: validConfig.instructions,
362
+ };
363
+ }
364
+ const userConfig = result.data;
365
+ return {
366
+ patterns: userConfig.patterns || DEFAULT_PATTERNS,
367
+ excludePatterns: userConfig.excludePatterns || DEFAULT_EXCLUDE_PATTERNS,
368
+ embedding: userConfig.embedding,
369
+ chunking: {
370
+ ...DEFAULT_CHUNKING,
371
+ ...userConfig.chunking,
372
+ },
373
+ search: {
374
+ ...DEFAULT_SEARCH,
375
+ ...userConfig.search,
376
+ },
377
+ dashboard: {
378
+ ...DEFAULT_DASHBOARD,
379
+ ...userConfig.dashboard,
380
+ },
381
+ instructions: userConfig.instructions,
382
+ };
383
+ }
384
+ catch (error) {
385
+ // Check if it's a JSON parse error
386
+ if (error instanceof SyntaxError) {
387
+ console.warn(`[lance-context] Warning: Invalid JSON in ${filename}`);
388
+ console.warn(` - ${error.message}`);
389
+ console.warn(' Suggestion: Check for trailing commas, missing quotes, or other JSON syntax errors.');
390
+ continue;
391
+ }
392
+ // Config file doesn't exist, continue to next
393
+ }
394
+ }
395
+ return DEFAULT_CONFIG;
396
+ }
397
+ /**
398
+ * Get default file patterns
399
+ */
400
+ export function getDefaultPatterns() {
401
+ return [...DEFAULT_PATTERNS];
402
+ }
403
+ /**
404
+ * Get default exclude patterns
405
+ */
406
+ export function getDefaultExcludePatterns() {
407
+ return [...DEFAULT_EXCLUDE_PATTERNS];
408
+ }
409
+ /**
410
+ * Get chunking config with defaults
411
+ */
412
+ export function getChunkingConfig(config) {
413
+ return {
414
+ ...DEFAULT_CHUNKING,
415
+ ...config.chunking,
416
+ };
417
+ }
418
+ /**
419
+ * Get search config with defaults
420
+ */
421
+ export function getSearchConfig(config) {
422
+ return {
423
+ ...DEFAULT_SEARCH,
424
+ ...config.search,
425
+ };
426
+ }
427
+ /**
428
+ * Get dashboard config with defaults
429
+ */
430
+ export function getDashboardConfig(config) {
431
+ return {
432
+ ...DEFAULT_DASHBOARD,
433
+ ...config.dashboard,
434
+ };
435
+ }
436
+ /**
437
+ * Get project instructions from config
438
+ */
439
+ export function getInstructions(config) {
440
+ return config.instructions;
441
+ }
442
+ /**
443
+ * Load secrets from .lance-context/secrets.json
444
+ */
445
+ export async function loadSecrets(projectPath) {
446
+ const secretsPath = path.join(projectPath, '.lance-context', 'secrets.json');
447
+ try {
448
+ const content = await fs.readFile(secretsPath, 'utf-8');
449
+ return JSON.parse(content);
450
+ }
451
+ catch {
452
+ return {};
453
+ }
454
+ }
455
+ /**
456
+ * Save secrets to .lance-context/secrets.json
457
+ */
458
+ export async function saveSecrets(projectPath, secrets) {
459
+ const lanceDir = path.join(projectPath, '.lance-context');
460
+ const secretsPath = path.join(lanceDir, 'secrets.json');
461
+ // Ensure .lance-context directory exists
462
+ await fs.mkdir(lanceDir, { recursive: true });
463
+ // Load existing secrets and merge
464
+ const existing = await loadSecrets(projectPath);
465
+ const merged = { ...existing, ...secrets };
466
+ await fs.writeFile(secretsPath, JSON.stringify(merged, null, 2));
467
+ }
468
+ /**
469
+ * Save embedding settings from dashboard
470
+ * - Stores backend preference in .lance-context.json
471
+ * - Stores API key in .lance-context/secrets.json (gitignored)
472
+ */
473
+ export async function saveEmbeddingSettings(projectPath, settings) {
474
+ // Load existing config
475
+ const configPath = path.join(projectPath, '.lance-context.json');
476
+ let existingConfig = {};
477
+ try {
478
+ const content = await fs.readFile(configPath, 'utf-8');
479
+ existingConfig = JSON.parse(content);
480
+ }
481
+ catch {
482
+ // File doesn't exist, start fresh
483
+ }
484
+ // Update embedding config
485
+ existingConfig.embedding = {
486
+ ...existingConfig.embedding,
487
+ backend: settings.backend,
488
+ };
489
+ // Save config
490
+ await fs.writeFile(configPath, JSON.stringify(existingConfig, null, 2));
491
+ // Save API key to secrets if provided
492
+ if (settings.apiKey) {
493
+ await saveSecrets(projectPath, { jinaApiKey: settings.apiKey });
494
+ }
495
+ }
496
+ /**
497
+ * Get current embedding settings including secrets
498
+ */
499
+ export async function getEmbeddingSettings(projectPath) {
500
+ const config = await loadConfig(projectPath);
501
+ const secrets = await loadSecrets(projectPath);
502
+ return {
503
+ backend: config.embedding?.backend || 'auto',
504
+ hasApiKey: !!(secrets.jinaApiKey || process.env.JINA_API_KEY),
505
+ ollamaUrl: process.env.OLLAMA_URL || 'http://localhost:11434',
506
+ };
507
+ }
508
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Beads issue from bd list --json
3
+ */
4
+ export interface BeadsIssue {
5
+ id: string;
6
+ title: string;
7
+ status: string;
8
+ priority?: number;
9
+ issue_type?: string;
10
+ description?: string;
11
+ created_at?: string;
12
+ updated_at?: string;
13
+ labels?: string[];
14
+ }
15
+ /**
16
+ * Beads status information
17
+ */
18
+ export interface BeadsStatus {
19
+ available: boolean;
20
+ issueCount: number;
21
+ openCount: number;
22
+ readyCount: number;
23
+ issues: BeadsIssue[];
24
+ syncBranch?: string;
25
+ daemonRunning?: boolean;
26
+ }
27
+ /**
28
+ * Check if beads is available in the project
29
+ */
30
+ export declare function isBeadsAvailable(projectPath: string): Promise<boolean>;
31
+ /**
32
+ * Get beads status and issues
33
+ */
34
+ export declare function getBeadsStatus(projectPath: string): Promise<BeadsStatus>;
35
+ //# sourceMappingURL=beads.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beads.d.ts","sourceRoot":"","sources":["../../src/dashboard/beads.ts"],"names":[],"mappings":"AAOA;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,OAAO,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,UAAU,EAAE,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;GAEG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAQ5E;AAED;;GAEG;AACH,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAoF9E"}
@@ -0,0 +1,102 @@
1
+ import { exec } from 'child_process';
2
+ import { promisify } from 'util';
3
+ import { access, constants } from 'fs/promises';
4
+ import { join } from 'path';
5
+ const execAsync = promisify(exec);
6
+ /**
7
+ * Check if beads is available in the project
8
+ */
9
+ export async function isBeadsAvailable(projectPath) {
10
+ try {
11
+ const beadsDir = join(projectPath, '.beads');
12
+ await access(beadsDir, constants.F_OK);
13
+ return true;
14
+ }
15
+ catch {
16
+ return false;
17
+ }
18
+ }
19
+ /**
20
+ * Get beads status and issues
21
+ */
22
+ export async function getBeadsStatus(projectPath) {
23
+ const available = await isBeadsAvailable(projectPath);
24
+ if (!available) {
25
+ return {
26
+ available: false,
27
+ issueCount: 0,
28
+ openCount: 0,
29
+ readyCount: 0,
30
+ issues: [],
31
+ };
32
+ }
33
+ try {
34
+ // Get ready issues (open, not blocked)
35
+ const { stdout: readyOutput } = await execAsync('bd ready --json 2>/dev/null || echo "[]"', {
36
+ cwd: projectPath,
37
+ timeout: 5000,
38
+ });
39
+ let readyIssues = [];
40
+ try {
41
+ const parsed = JSON.parse(readyOutput.trim() || '[]');
42
+ readyIssues = Array.isArray(parsed) ? parsed : [];
43
+ }
44
+ catch {
45
+ readyIssues = [];
46
+ }
47
+ // Get all open issues
48
+ const { stdout: listOutput } = await execAsync('bd list --json 2>/dev/null || echo "[]"', {
49
+ cwd: projectPath,
50
+ timeout: 5000,
51
+ });
52
+ let allIssues = [];
53
+ try {
54
+ const parsed = JSON.parse(listOutput.trim() || '[]');
55
+ allIssues = Array.isArray(parsed) ? parsed : [];
56
+ }
57
+ catch {
58
+ allIssues = [];
59
+ }
60
+ // Get info for sync branch and daemon status
61
+ let syncBranch;
62
+ let daemonRunning = false;
63
+ try {
64
+ const { stdout: infoOutput } = await execAsync('bd info --json 2>/dev/null || echo "{}"', {
65
+ cwd: projectPath,
66
+ timeout: 5000,
67
+ });
68
+ const info = JSON.parse(infoOutput.trim() || '{}');
69
+ syncBranch = info.syncBranch || info.sync_branch;
70
+ daemonRunning = info.daemonConnected || info.daemon_connected || false;
71
+ }
72
+ catch {
73
+ // Ignore info errors
74
+ }
75
+ // Get total count including closed
76
+ const { stdout: countOutput } = await execAsync('bd count 2>/dev/null || echo "0"', {
77
+ cwd: projectPath,
78
+ timeout: 5000,
79
+ });
80
+ const totalCount = parseInt(countOutput.trim(), 10) || allIssues.length;
81
+ return {
82
+ available: true,
83
+ issueCount: totalCount,
84
+ openCount: allIssues.length,
85
+ readyCount: readyIssues.length,
86
+ issues: readyIssues.slice(0, 10), // Limit to 10 for display
87
+ syncBranch,
88
+ daemonRunning,
89
+ };
90
+ }
91
+ catch {
92
+ // If bd commands fail, beads might not be properly configured
93
+ return {
94
+ available: true,
95
+ issueCount: 0,
96
+ openCount: 0,
97
+ readyCount: 0,
98
+ issues: [],
99
+ };
100
+ }
101
+ }
102
+ //# sourceMappingURL=beads.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"beads.js","sourceRoot":"","sources":["../../src/dashboard/beads.ts"],"names":[],"mappings":"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"}