lance-context 0.1.0 → 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.
- package/README.md +232 -23
- package/dist/__tests__/ast-chunker.test.d.ts +2 -0
- package/dist/__tests__/ast-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/ast-chunker.test.js +307 -0
- package/dist/__tests__/ast-chunker.test.js.map +1 -0
- package/dist/__tests__/config.test.d.ts +2 -0
- package/dist/__tests__/config.test.d.ts.map +1 -0
- package/dist/__tests__/config.test.js +242 -0
- package/dist/__tests__/config.test.js.map +1 -0
- package/dist/__tests__/dashboard/beads.test.d.ts +2 -0
- package/dist/__tests__/dashboard/beads.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/beads.test.js +151 -0
- package/dist/__tests__/dashboard/beads.test.js.map +1 -0
- package/dist/__tests__/dashboard/index.test.d.ts +2 -0
- package/dist/__tests__/dashboard/index.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/index.test.js +116 -0
- package/dist/__tests__/dashboard/index.test.js.map +1 -0
- package/dist/__tests__/dashboard/routes.test.d.ts +2 -0
- package/dist/__tests__/dashboard/routes.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/routes.test.js +125 -0
- package/dist/__tests__/dashboard/routes.test.js.map +1 -0
- package/dist/__tests__/dashboard/server.test.d.ts +2 -0
- package/dist/__tests__/dashboard/server.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/server.test.js +75 -0
- package/dist/__tests__/dashboard/server.test.js.map +1 -0
- package/dist/__tests__/dashboard/state.test.d.ts +2 -0
- package/dist/__tests__/dashboard/state.test.d.ts.map +1 -0
- package/dist/__tests__/dashboard/state.test.js +124 -0
- package/dist/__tests__/dashboard/state.test.js.map +1 -0
- package/dist/__tests__/embeddings/factory.test.d.ts +2 -0
- package/dist/__tests__/embeddings/factory.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/factory.test.js +100 -0
- package/dist/__tests__/embeddings/factory.test.js.map +1 -0
- package/dist/__tests__/embeddings/jina.test.d.ts +2 -0
- package/dist/__tests__/embeddings/jina.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/jina.test.js +156 -0
- package/dist/__tests__/embeddings/jina.test.js.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts +2 -0
- package/dist/__tests__/embeddings/ollama.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/ollama.test.js +172 -0
- package/dist/__tests__/embeddings/ollama.test.js.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts +2 -0
- package/dist/__tests__/embeddings/rate-limiter.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js +163 -0
- package/dist/__tests__/embeddings/rate-limiter.test.js.map +1 -0
- package/dist/__tests__/embeddings/retry.test.d.ts +2 -0
- package/dist/__tests__/embeddings/retry.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/retry.test.js +260 -0
- package/dist/__tests__/embeddings/retry.test.js.map +1 -0
- package/dist/__tests__/embeddings/types.test.d.ts +2 -0
- package/dist/__tests__/embeddings/types.test.d.ts.map +1 -0
- package/dist/__tests__/embeddings/types.test.js +31 -0
- package/dist/__tests__/embeddings/types.test.js.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts +10 -0
- package/dist/__tests__/mocks/embedding-backend.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js +39 -0
- package/dist/__tests__/mocks/embedding-backend.mock.js.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts +38 -0
- package/dist/__tests__/mocks/fetch.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/fetch.mock.js +74 -0
- package/dist/__tests__/mocks/fetch.mock.js.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts +38 -0
- package/dist/__tests__/mocks/lancedb.mock.d.ts.map +1 -0
- package/dist/__tests__/mocks/lancedb.mock.js +63 -0
- package/dist/__tests__/mocks/lancedb.mock.js.map +1 -0
- package/dist/__tests__/search/clustering.test.d.ts +2 -0
- package/dist/__tests__/search/clustering.test.d.ts.map +1 -0
- package/dist/__tests__/search/clustering.test.js +230 -0
- package/dist/__tests__/search/clustering.test.js.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts +2 -0
- package/dist/__tests__/search/hybrid-search.test.d.ts.map +1 -0
- package/dist/__tests__/search/hybrid-search.test.js +186 -0
- package/dist/__tests__/search/hybrid-search.test.js.map +1 -0
- package/dist/__tests__/search/indexer.test.d.ts +2 -0
- package/dist/__tests__/search/indexer.test.d.ts.map +1 -0
- package/dist/__tests__/search/indexer.test.js +878 -0
- package/dist/__tests__/search/indexer.test.js.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts +2 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.d.ts.map +1 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js +228 -0
- package/dist/__tests__/search/tree-sitter-chunker.test.js.map +1 -0
- package/dist/__tests__/setup.d.ts +2 -0
- package/dist/__tests__/setup.d.ts.map +1 -0
- package/dist/__tests__/setup.js +11 -0
- package/dist/__tests__/setup.js.map +1 -0
- package/dist/__tests__/utils/concurrency.test.d.ts +2 -0
- package/dist/__tests__/utils/concurrency.test.d.ts.map +1 -0
- package/dist/__tests__/utils/concurrency.test.js +83 -0
- package/dist/__tests__/utils/concurrency.test.js.map +1 -0
- package/dist/__tests__/utils/errors.test.d.ts +2 -0
- package/dist/__tests__/utils/errors.test.d.ts.map +1 -0
- package/dist/__tests__/utils/errors.test.js +136 -0
- package/dist/__tests__/utils/errors.test.js.map +1 -0
- package/dist/__tests__/utils/type-guards.test.d.ts +2 -0
- package/dist/__tests__/utils/type-guards.test.d.ts.map +1 -0
- package/dist/__tests__/utils/type-guards.test.js +80 -0
- package/dist/__tests__/utils/type-guards.test.js.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts +2 -0
- package/dist/__tests__/worktree/worktree-manager.test.d.ts.map +1 -0
- package/dist/__tests__/worktree/worktree-manager.test.js +403 -0
- package/dist/__tests__/worktree/worktree-manager.test.js.map +1 -0
- package/dist/config.d.ts +122 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +508 -0
- package/dist/config.js.map +1 -0
- package/dist/dashboard/beads.d.ts +35 -0
- package/dist/dashboard/beads.d.ts.map +1 -0
- package/dist/dashboard/beads.js +102 -0
- package/dist/dashboard/beads.js.map +1 -0
- package/dist/dashboard/events.d.ts +46 -0
- package/dist/dashboard/events.d.ts.map +1 -0
- package/dist/dashboard/events.js +141 -0
- package/dist/dashboard/events.js.map +1 -0
- package/dist/dashboard/index.d.ts +69 -0
- package/dist/dashboard/index.d.ts.map +1 -0
- package/dist/dashboard/index.js +93 -0
- package/dist/dashboard/index.js.map +1 -0
- package/dist/dashboard/routes.d.ts +6 -0
- package/dist/dashboard/routes.d.ts.map +1 -0
- package/dist/dashboard/routes.js +245 -0
- package/dist/dashboard/routes.js.map +1 -0
- package/dist/dashboard/server.d.ts +27 -0
- package/dist/dashboard/server.d.ts.map +1 -0
- package/dist/dashboard/server.js +72 -0
- package/dist/dashboard/server.js.map +1 -0
- package/dist/dashboard/state.d.ts +125 -0
- package/dist/dashboard/state.d.ts.map +1 -0
- package/dist/dashboard/state.js +264 -0
- package/dist/dashboard/state.js.map +1 -0
- package/dist/dashboard/ui.d.ts +6 -0
- package/dist/dashboard/ui.d.ts.map +1 -0
- package/dist/dashboard/ui.js +1421 -0
- package/dist/dashboard/ui.js.map +1 -0
- package/dist/embeddings/index.d.ts +20 -2
- package/dist/embeddings/index.d.ts.map +1 -1
- package/dist/embeddings/index.js +49 -6
- package/dist/embeddings/index.js.map +1 -1
- package/dist/embeddings/jina.d.ts +9 -0
- package/dist/embeddings/jina.d.ts.map +1 -1
- package/dist/embeddings/jina.js +42 -2
- package/dist/embeddings/jina.js.map +1 -1
- package/dist/embeddings/ollama.d.ts +2 -0
- package/dist/embeddings/ollama.d.ts.map +1 -1
- package/dist/embeddings/ollama.js +21 -5
- package/dist/embeddings/ollama.js.map +1 -1
- package/dist/embeddings/rate-limiter.d.ts +75 -0
- package/dist/embeddings/rate-limiter.d.ts.map +1 -0
- package/dist/embeddings/rate-limiter.js +145 -0
- package/dist/embeddings/rate-limiter.js.map +1 -0
- package/dist/embeddings/retry.d.ts +14 -0
- package/dist/embeddings/retry.d.ts.map +1 -0
- package/dist/embeddings/retry.js +89 -0
- package/dist/embeddings/retry.js.map +1 -0
- package/dist/embeddings/types.d.ts +56 -2
- package/dist/embeddings/types.d.ts.map +1 -1
- package/dist/embeddings/types.js +16 -0
- package/dist/embeddings/types.js.map +1 -1
- package/dist/index.js +1871 -44
- package/dist/index.js.map +1 -1
- package/dist/memory/index.d.ts +63 -0
- package/dist/memory/index.d.ts.map +1 -0
- package/dist/memory/index.js +168 -0
- package/dist/memory/index.js.map +1 -0
- package/dist/search/ast-chunker.d.ts +34 -0
- package/dist/search/ast-chunker.d.ts.map +1 -0
- package/dist/search/ast-chunker.js +261 -0
- package/dist/search/ast-chunker.js.map +1 -0
- package/dist/search/clustering.d.ts +77 -0
- package/dist/search/clustering.d.ts.map +1 -0
- package/dist/search/clustering.js +455 -0
- package/dist/search/clustering.js.map +1 -0
- package/dist/search/indexer.d.ts +239 -3
- package/dist/search/indexer.d.ts.map +1 -1
- package/dist/search/indexer.js +941 -45
- package/dist/search/indexer.js.map +1 -1
- package/dist/search/tree-sitter-chunker.d.ts +69 -0
- package/dist/search/tree-sitter-chunker.d.ts.map +1 -0
- package/dist/search/tree-sitter-chunker.js +436 -0
- package/dist/search/tree-sitter-chunker.js.map +1 -0
- package/dist/symbols/index.d.ts +14 -0
- package/dist/symbols/index.d.ts.map +1 -0
- package/dist/symbols/index.js +19 -0
- package/dist/symbols/index.js.map +1 -0
- package/dist/symbols/name-path.d.ts +113 -0
- package/dist/symbols/name-path.d.ts.map +1 -0
- package/dist/symbols/name-path.js +194 -0
- package/dist/symbols/name-path.js.map +1 -0
- package/dist/symbols/pattern-search.d.ts +14 -0
- package/dist/symbols/pattern-search.d.ts.map +1 -0
- package/dist/symbols/pattern-search.js +224 -0
- package/dist/symbols/pattern-search.js.map +1 -0
- package/dist/symbols/reference-finder.d.ts +38 -0
- package/dist/symbols/reference-finder.d.ts.map +1 -0
- package/dist/symbols/reference-finder.js +376 -0
- package/dist/symbols/reference-finder.js.map +1 -0
- package/dist/symbols/symbol-editor.d.ts +81 -0
- package/dist/symbols/symbol-editor.d.ts.map +1 -0
- package/dist/symbols/symbol-editor.js +257 -0
- package/dist/symbols/symbol-editor.js.map +1 -0
- package/dist/symbols/symbol-extractor.d.ts +49 -0
- package/dist/symbols/symbol-extractor.d.ts.map +1 -0
- package/dist/symbols/symbol-extractor.js +593 -0
- package/dist/symbols/symbol-extractor.js.map +1 -0
- package/dist/symbols/symbol-renamer.d.ts +81 -0
- package/dist/symbols/symbol-renamer.d.ts.map +1 -0
- package/dist/symbols/symbol-renamer.js +204 -0
- package/dist/symbols/symbol-renamer.js.map +1 -0
- package/dist/symbols/types.d.ts +234 -0
- package/dist/symbols/types.d.ts.map +1 -0
- package/dist/symbols/types.js +106 -0
- package/dist/symbols/types.js.map +1 -0
- package/dist/utils/concurrency.d.ts +32 -0
- package/dist/utils/concurrency.d.ts.map +1 -0
- package/dist/utils/concurrency.js +57 -0
- package/dist/utils/concurrency.js.map +1 -0
- package/dist/utils/errors.d.ts +36 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +91 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/type-guards.d.ts +17 -0
- package/dist/utils/type-guards.d.ts.map +1 -0
- package/dist/utils/type-guards.js +25 -0
- package/dist/utils/type-guards.js.map +1 -0
- package/dist/worktree/index.d.ts +6 -0
- package/dist/worktree/index.d.ts.map +1 -0
- package/dist/worktree/index.js +6 -0
- package/dist/worktree/index.js.map +1 -0
- package/dist/worktree/types.d.ts +101 -0
- package/dist/worktree/types.d.ts.map +1 -0
- package/dist/worktree/types.js +6 -0
- package/dist/worktree/types.js.map +1 -0
- package/dist/worktree/worktree-manager.d.ts +80 -0
- package/dist/worktree/worktree-manager.d.ts.map +1 -0
- package/dist/worktree/worktree-manager.js +407 -0
- package/dist/worktree/worktree-manager.js.map +1 -0
- package/package.json +39 -5
- 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":"AAAA,OAAO,KAAK,EAAE,MAAM,aAAa,CAAC;AAClC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;GAEG;AACH,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IACpC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE;IAChD,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,QAAQ,EAAE;CAC9C,CAAC,CAAC;AAEH,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,cAAc,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACnD,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;CACnD,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE;IAC9C,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAC7B,CAAC,CAAC;AAEH,MAAM,qBAAqB,GAAG,CAAC,CAAC,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;IAC/B,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE;IAChD,WAAW,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;IAC5B,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IACxC,eAAe,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;IAC/C,SAAS,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IAC3C,QAAQ,EAAE,oBAAoB,CAAC,QAAQ,EAAE;IACzC,MAAM,EAAE,kBAAkB,CAAC,QAAQ,EAAE;IACrC,SAAS,EAAE,qBAAqB,CAAC,QAAQ,EAAE;IAC3C,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CACpC,CAAC,CAAC;AAOH,MAAM,gBAAgB,GAAG;IACvB,SAAS;IACT,UAAU;IACV,SAAS;IACT,UAAU;IACV,SAAS;IACT,SAAS;IACT,SAAS;IACT,WAAW;IACX,SAAS;IACT,UAAU;IACV,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,UAAU;IACV,SAAS;IACT,YAAY;IACZ,SAAS;CACV,CAAC;AAEF,MAAM,wBAAwB,GAAG;IAC/B,oBAAoB;IACpB,YAAY;IACZ,YAAY;IACZ,aAAa;IACb,cAAc;IACd,mBAAmB;IACnB,YAAY;IACZ,aAAa;IACb,cAAc;IACd,aAAa;IACb,cAAc;CACf,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAA6B;IACxD,QAAQ,EAAE,GAAG;IACb,OAAO,EAAE,EAAE;CACZ,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAA2B;IACpD,cAAc,EAAE,GAAG;IACnB,aAAa,EAAE,GAAG;CACnB,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAA8B;IAC1D,OAAO,EAAE,IAAI;IACb,IAAI,EAAE,KAAK;IACX,WAAW,EAAE,IAAI;CAClB,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAAuB;IAChD,QAAQ,EAAE,gBAAgB;IAC1B,eAAe,EAAE,wBAAwB;IACzC,QAAQ,EAAE,gBAAgB;IAC1B,MAAM,EAAE,cAAc;IACtB,SAAS,EAAE,iBAAiB;CAC7B,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,qBAAqB,EAAE,2BAA2B,CAAC,CAAC;AAE9E;;GAEG;AAEH;;GAEG;AACH,SAAS,qBAAqB,CAAC,KAAuB,EAAE,SAAkB;IACxE,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;IACnD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,WAAW,GAAG,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;IAEpF,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,cAAc,CAAC,CAAC,CAAC;YACpB,MAAM,QAAQ,GAAI,KAAqC,CAAC,QAAQ,CAAC;YACjE,MAAM,UAAU,GAAG,oBAAoB,CAAC,SAAS,EAAE,MAAM,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC/E,OAAO,OAAO,SAAS,cAAc,QAAQ,SAAS,OAAO,QAAQ,IAAI,WAAW,GAAG,UAAU,EAAE,CAAC;QACtG,CAAC;QACD,KAAK,WAAW,CAAC,CAAC,CAAC;YACjB,MAAM,QAAQ,GAAG,KAAiC,CAAC;YACnD,MAAM,UAAU,GAAG,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,OAAiB,CAAC,CAAC;YAC3F,OAAO,OAAO,SAAS,WAAW,WAAW,qBAAqB,QAAQ,CAAC,OAAO,GAAG,UAAU,EAAE,CAAC;QACpG,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,MAAM,QAAQ,GAAG,KAA+B,CAAC;YACjD,MAAM,UAAU,GAAG,qBAAqB,CAAC,SAAS,EAAE,SAAS,EAAE,QAAQ,CAAC,OAAiB,CAAC,CAAC;YAC3F,OAAO,OAAO,SAAS,WAAW,WAAW,oBAAoB,QAAQ,CAAC,OAAO,GAAG,UAAU,EAAE,CAAC;QACnG,CAAC;QACD,KAAK,eAAe,CAAC,CAAC,CAAC;YACrB,gCAAgC;YAChC,MAAM,QAAQ,GAAG,KAAqC,CAAC;YACvD,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;gBACpB,MAAM,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBACxE,OAAO,OAAO,SAAS,mBAAmB,WAAW,oBAAoB,OAAO,EAAE,CAAC;YACrF,CAAC;YACD,OAAO,OAAO,SAAS,mBAAmB,WAAW,EAAE,CAAC;QAC1D,CAAC;QACD;YACE,OAAO,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;IAChD,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,cAAc,CAAC,GAAY,EAAE,YAAsB;IAC1D,IAAI,OAAO,GAAY,GAAG,CAAC;IAC3B,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE,CAAC;QACnC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpD,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,OAAO,GAAI,OAAmC,CAAC,OAAO,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,SAAiB,EAAE,QAAgB,EAAE,QAAiB;IAClF,4CAA4C;IAC5C,IAAI,QAAQ,KAAK,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC;YAChB,OAAO,yDAAyD,GAAG,EAAE,CAAC;QACxE,CAAC;IACH,CAAC;IAED,6CAA6C;IAC7C,IAAI,QAAQ,KAAK,SAAS,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC3D,MAAM,KAAK,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;QACrC,IAAI,KAAK,KAAK,MAAM,IAAI,KAAK,KAAK,OAAO,EAAE,CAAC;YAC1C,OAAO,yDAAyD,KAAK,EAAE,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,gDAAgD;IAChD,IAAI,QAAQ,KAAK,OAAO,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACzD,OAAO,mDAAmD,QAAQ,IAAI,CAAC;IACzE,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,SAAiB,EACjB,SAAgC,EAChC,MAAc;IAEd,MAAM,gBAAgB,GAA2B;QAC/C,mBAAmB,EACjB,SAAS,KAAK,SAAS;YACrB,CAAC,CAAC,kEAAkE;YACpE,CAAC,CAAC,kEAAkE;QACxE,kBAAkB,EAChB,SAAS,KAAK,SAAS;YACrB,CAAC,CAAC,kEAAkE;YACpE,CAAC,CAAC,kEAAkE;QACxE,uBAAuB,EAAE,sEAAsE;QAC/F,sBAAsB,EAAE,sEAAsE;QAC9F,gBAAgB,EAAE,4DAA4D;KAC/E,CAAC;IAEF,OAAO,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;AAC3C,CAAC;AAED;;GAEG;AACH,SAAS,uBAAuB,CAAC,QAAgB,EAAE,MAAoB,EAAE,SAAkB;IACzF,OAAO,CAAC,IAAI,CAAC,8CAA8C,QAAQ,EAAE,CAAC,CAAC;IACvE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,OAAO,CAAC,IAAI,CAAC,qBAAqB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC;IACxD,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;AAC7D,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,SAAkB;IAC5C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,SAAoC,CAAC;IACpD,MAAM,MAAM,GAA0C,EAAE,CAAC;IAEzD,0CAA0C;IAC1C,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACtE,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC;QACxC,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,eAAe,KAAK,SAAS,EAAE,CAAC;QACzC,MAAM,aAAa,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC5E,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,eAAe,GAAG,aAAa,CAAC,IAAI,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;QACtC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;QACrE,IAAI,kBAAkB,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,CAAC,YAAY,GAAG,kBAAkB,CAAC,IAAI,CAAC;QAChD,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,eAAe,GAAG,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAC1E,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC;YAC5B,MAAM,CAAC,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAClC,uDAAuD;QACvD,MAAM,cAAc,GAAG,oBAAoB,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QAC7D,IAAI,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,MAAM,CAAC,QAAQ,GAAG,cAAc,CAAC;QACnC,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAChC,qDAAqD;QACrD,MAAM,YAAY,GAAG,kBAAkB,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACvD,IAAI,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,MAAM,GAAG,YAAY,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QACnC,wDAAwD;QACxD,MAAM,eAAe,GAAG,qBAAqB,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChE,IAAI,MAAM,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5C,MAAM,CAAC,SAAS,GAAG,eAAe,CAAC;QACrC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,WAAoB;IAChD,IAAI,OAAO,WAAW,KAAK,QAAQ,IAAI,WAAW,KAAK,IAAI,EAAE,CAAC;QAC5D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAG,WAAsC,CAAC;IACxD,MAAM,MAAM,GAAkD,EAAE,CAAC;IAEjE,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAChF,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,QAAQ,GAAG,cAAc,CAAC,IAAI,CAAC;QACxC,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC5E,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC;QACtC,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,kBAAkB,CAAC,SAAkB;IAC5C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;QACxD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,MAAM,GAAG,SAAoC,CAAC;IACpD,MAAM,MAAM,GAAgD,EAAE,CAAC;IAE/D,IAAI,MAAM,CAAC,cAAc,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,cAAc,CAAC,CAAC;QACjF,IAAI,cAAc,CAAC,OAAO,EAAE,CAAC;YAC3B,MAAM,CAAC,cAAc,GAAG,cAAc,CAAC,IAAI,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,IAAI,MAAM,CAAC,aAAa,KAAK,SAAS,EAAE,CAAC;QACvC,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;QAC/E,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC;QAC5C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,qBAAqB,CAC5B,YAAqB;IAErB,IAAI,OAAO,YAAY,KAAK,QAAQ,IAAI,YAAY,KAAK,IAAI,EAAE,CAAC;QAC9D,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,SAAS,GAAG,YAAuC,CAAC;IAC1D,MAAM,MAAM,GAAmD,EAAE,CAAC;IAElE,IAAI,SAAS,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACpC,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QAC/D,IAAI,aAAa,CAAC,OAAO,EAAE,CAAC;YAC1B,MAAM,CAAC,OAAO,GAAG,aAAa,CAAC,IAAI,CAAC;QACtC,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QACjC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QAC7E,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;YACvB,MAAM,CAAC,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;QAChC,CAAC;IACH,CAAC;IAED,IAAI,SAAS,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;QACxC,MAAM,iBAAiB,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;QACvE,IAAI,iBAAiB,CAAC,OAAO,EAAE,CAAC;YAC9B,MAAM,CAAC,WAAW,GAAG,iBAAiB,CAAC,IAAI,CAAC;QAC9C,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,WAAmB;IAClD,KAAK,MAAM,QAAQ,IAAI,gBAAgB,EAAE,CAAC;QACxC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACpD,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACvD,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAEtC,oBAAoB;YACpB,MAAM,MAAM,GAAG,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;YACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpB,qCAAqC;gBACrC,uBAAuB,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;gBAElE,iFAAiF;gBACjF,MAAM,WAAW,GAAG,kBAAkB,CAAC,SAAS,CAAC,CAAC;gBAElD,OAAO;oBACL,QAAQ,EAAE,WAAW,CAAC,QAAQ,IAAI,gBAAgB;oBAClD,eAAe,EAAE,WAAW,CAAC,eAAe,IAAI,wBAAwB;oBACxE,SAAS,EAAE,WAAW,CAAC,SAAS;oBAChC,QAAQ,EAAE;wBACR,GAAG,gBAAgB;wBACnB,GAAG,WAAW,CAAC,QAAQ;qBACxB;oBACD,MAAM,EAAE;wBACN,GAAG,cAAc;wBACjB,GAAG,WAAW,CAAC,MAAM;qBACtB;oBACD,SAAS,EAAE;wBACT,GAAG,iBAAiB;wBACpB,GAAG,WAAW,CAAC,SAAS;qBACzB;oBACD,YAAY,EAAE,WAAW,CAAC,YAAY;iBACvC,CAAC;YACJ,CAAC;YAED,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC;YAE/B,OAAO;gBACL,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,gBAAgB;gBACjD,eAAe,EAAE,UAAU,CAAC,eAAe,IAAI,wBAAwB;gBACvE,SAAS,EAAE,UAAU,CAAC,SAAS;gBAC/B,QAAQ,EAAE;oBACR,GAAG,gBAAgB;oBACnB,GAAG,UAAU,CAAC,QAAQ;iBACvB;gBACD,MAAM,EAAE;oBACN,GAAG,cAAc;oBACjB,GAAG,UAAU,CAAC,MAAM;iBACrB;gBACD,SAAS,EAAE;oBACT,GAAG,iBAAiB;oBACpB,GAAG,UAAU,CAAC,SAAS;iBACxB;gBACD,YAAY,EAAE,UAAU,CAAC,YAAY;aACtC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,mCAAmC;YACnC,IAAI,KAAK,YAAY,WAAW,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,4CAA4C,QAAQ,EAAE,CAAC,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,OAAO,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;gBACrC,OAAO,CAAC,IAAI,CACV,uFAAuF,CACxF,CAAC;gBACF,SAAS;YACX,CAAC;YACD,8CAA8C;QAChD,CAAC;IACH,CAAC;IAED,OAAO,cAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB;IAChC,OAAO,CAAC,GAAG,gBAAgB,CAAC,CAAC;AAC/B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB;IACvC,OAAO,CAAC,GAAG,wBAAwB,CAAC,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,MAA0B;IAC1D,OAAO;QACL,GAAG,gBAAgB;QACnB,GAAG,MAAM,CAAC,QAAQ;KACnB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,OAAO;QACL,GAAG,cAAc;QACjB,GAAG,MAAM,CAAC,MAAM;KACjB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAAC,MAA0B;IAC3D,OAAO;QACL,GAAG,iBAAiB;QACpB,GAAG,MAAM,CAAC,SAAS;KACpB,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,MAA0B;IACxD,OAAO,MAAM,CAAC,YAAY,CAAC;AAC7B,CAAC;AASD;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,WAAmB;IACnD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC;IAC7E,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACxD,OAAO,IAAI,CAAC,KAAK,CAAC,OAAO,CAAwB,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,WAAmB,EACnB,OAA4B;IAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAC;IAExD,yCAAyC;IACzC,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAE9C,kCAAkC;IAClC,MAAM,QAAQ,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,EAAE,GAAG,QAAQ,EAAE,GAAG,OAAO,EAAE,CAAC;IAE3C,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AACnE,CAAC;AAWD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,WAAmB,EACnB,QAA2B;IAE3B,uBAAuB;IACvB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,qBAAqB,CAAC,CAAC;IACjE,IAAI,cAAc,GAAuB,EAAE,CAAC;IAE5C,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;QACvD,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IACvC,CAAC;IAAC,MAAM,CAAC;QACP,kCAAkC;IACpC,CAAC;IAED,0BAA0B;IAC1B,cAAc,CAAC,SAAS,GAAG;QACzB,GAAG,cAAc,CAAC,SAAS;QAC3B,OAAO,EAAE,QAAQ,CAAC,OAAO;KAC1B,CAAC;IAEF,cAAc;IACd,MAAM,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAExE,sCAAsC;IACtC,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,WAAW,CAAC,WAAW,EAAE,EAAE,UAAU,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IAClE,CAAC;AACH,CAAC;AAED;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAK5D,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,WAAW,CAAC,CAAC;IAC7C,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,WAAW,CAAC,CAAC;IAE/C,OAAO;QACL,OAAO,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,IAAI,MAAM;QAC5C,SAAS,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;QAC7D,SAAS,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,wBAAwB;KAC9D,CAAC;AACJ,CAAC"}
|
|
@@ -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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"}
|