archicore 0.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 (118) hide show
  1. package/README.md +530 -0
  2. package/dist/analyzers/dead-code.d.ts +95 -0
  3. package/dist/analyzers/dead-code.js +327 -0
  4. package/dist/analyzers/duplication.d.ts +90 -0
  5. package/dist/analyzers/duplication.js +344 -0
  6. package/dist/analyzers/security.d.ts +79 -0
  7. package/dist/analyzers/security.js +484 -0
  8. package/dist/architecture/index.d.ts +35 -0
  9. package/dist/architecture/index.js +249 -0
  10. package/dist/cli/commands/analyzers.d.ts +6 -0
  11. package/dist/cli/commands/analyzers.js +431 -0
  12. package/dist/cli/commands/export.d.ts +6 -0
  13. package/dist/cli/commands/export.js +78 -0
  14. package/dist/cli/commands/index.d.ts +8 -0
  15. package/dist/cli/commands/index.js +8 -0
  16. package/dist/cli/commands/init.d.ts +26 -0
  17. package/dist/cli/commands/init.js +140 -0
  18. package/dist/cli/commands/interactive.d.ts +7 -0
  19. package/dist/cli/commands/interactive.js +522 -0
  20. package/dist/cli/commands/projects.d.ts +6 -0
  21. package/dist/cli/commands/projects.js +249 -0
  22. package/dist/cli/index.d.ts +7 -0
  23. package/dist/cli/index.js +7 -0
  24. package/dist/cli/ui/box.d.ts +17 -0
  25. package/dist/cli/ui/box.js +62 -0
  26. package/dist/cli/ui/colors.d.ts +49 -0
  27. package/dist/cli/ui/colors.js +86 -0
  28. package/dist/cli/ui/index.d.ts +9 -0
  29. package/dist/cli/ui/index.js +9 -0
  30. package/dist/cli/ui/prompt.d.ts +34 -0
  31. package/dist/cli/ui/prompt.js +122 -0
  32. package/dist/cli/ui/spinner.d.ts +29 -0
  33. package/dist/cli/ui/spinner.js +80 -0
  34. package/dist/cli/ui/table.d.ts +33 -0
  35. package/dist/cli/ui/table.js +84 -0
  36. package/dist/cli/utils/config.d.ts +23 -0
  37. package/dist/cli/utils/config.js +73 -0
  38. package/dist/cli/utils/index.d.ts +6 -0
  39. package/dist/cli/utils/index.js +6 -0
  40. package/dist/cli/utils/session.d.ts +27 -0
  41. package/dist/cli/utils/session.js +117 -0
  42. package/dist/cli.d.ts +8 -0
  43. package/dist/cli.js +295 -0
  44. package/dist/code-index/ast-parser.d.ts +16 -0
  45. package/dist/code-index/ast-parser.js +330 -0
  46. package/dist/code-index/dependency-graph.d.ts +16 -0
  47. package/dist/code-index/dependency-graph.js +161 -0
  48. package/dist/code-index/index.d.ts +44 -0
  49. package/dist/code-index/index.js +124 -0
  50. package/dist/code-index/symbol-extractor.d.ts +13 -0
  51. package/dist/code-index/symbol-extractor.js +150 -0
  52. package/dist/export/index.d.ts +92 -0
  53. package/dist/export/index.js +676 -0
  54. package/dist/github/github-service.d.ts +146 -0
  55. package/dist/github/github-service.js +609 -0
  56. package/dist/impact-engine/index.d.ts +25 -0
  57. package/dist/impact-engine/index.js +284 -0
  58. package/dist/index.d.ts +60 -0
  59. package/dist/index.js +149 -0
  60. package/dist/metrics/index.d.ts +136 -0
  61. package/dist/metrics/index.js +525 -0
  62. package/dist/orchestrator/deepseek-optimizer.d.ts +67 -0
  63. package/dist/orchestrator/deepseek-optimizer.js +320 -0
  64. package/dist/orchestrator/index.d.ts +34 -0
  65. package/dist/orchestrator/index.js +305 -0
  66. package/dist/pr-guardian/index.d.ts +143 -0
  67. package/dist/pr-guardian/index.js +553 -0
  68. package/dist/refactoring/index.d.ts +108 -0
  69. package/dist/refactoring/index.js +580 -0
  70. package/dist/rules-engine/index.d.ts +129 -0
  71. package/dist/rules-engine/index.js +482 -0
  72. package/dist/semantic-memory/embedding-service.d.ts +24 -0
  73. package/dist/semantic-memory/embedding-service.js +120 -0
  74. package/dist/semantic-memory/index.d.ts +45 -0
  75. package/dist/semantic-memory/index.js +206 -0
  76. package/dist/semantic-memory/vector-store.d.ts +27 -0
  77. package/dist/semantic-memory/vector-store.js +166 -0
  78. package/dist/server/index.d.ts +28 -0
  79. package/dist/server/index.js +141 -0
  80. package/dist/server/middleware/api-auth.d.ts +43 -0
  81. package/dist/server/middleware/api-auth.js +256 -0
  82. package/dist/server/routes/admin.d.ts +5 -0
  83. package/dist/server/routes/admin.js +123 -0
  84. package/dist/server/routes/api.d.ts +7 -0
  85. package/dist/server/routes/api.js +362 -0
  86. package/dist/server/routes/auth.d.ts +16 -0
  87. package/dist/server/routes/auth.js +191 -0
  88. package/dist/server/routes/developer.d.ts +8 -0
  89. package/dist/server/routes/developer.js +439 -0
  90. package/dist/server/routes/github.d.ts +7 -0
  91. package/dist/server/routes/github.js +495 -0
  92. package/dist/server/routes/upload.d.ts +7 -0
  93. package/dist/server/routes/upload.js +196 -0
  94. package/dist/server/services/api-key-service.d.ts +81 -0
  95. package/dist/server/services/api-key-service.js +281 -0
  96. package/dist/server/services/auth-service.d.ts +40 -0
  97. package/dist/server/services/auth-service.js +315 -0
  98. package/dist/server/services/project-service.d.ts +123 -0
  99. package/dist/server/services/project-service.js +533 -0
  100. package/dist/server/services/token-service.d.ts +107 -0
  101. package/dist/server/services/token-service.js +416 -0
  102. package/dist/server/services/upload-service.d.ts +93 -0
  103. package/dist/server/services/upload-service.js +464 -0
  104. package/dist/types/api.d.ts +188 -0
  105. package/dist/types/api.js +86 -0
  106. package/dist/types/github.d.ts +335 -0
  107. package/dist/types/github.js +5 -0
  108. package/dist/types/index.d.ts +265 -0
  109. package/dist/types/index.js +32 -0
  110. package/dist/types/user.d.ts +69 -0
  111. package/dist/types/user.js +42 -0
  112. package/dist/utils/file-utils.d.ts +20 -0
  113. package/dist/utils/file-utils.js +163 -0
  114. package/dist/utils/logger.d.ts +17 -0
  115. package/dist/utils/logger.js +41 -0
  116. package/dist/watcher/index.d.ts +125 -0
  117. package/dist/watcher/index.js +397 -0
  118. package/package.json +71 -0
@@ -0,0 +1,120 @@
1
+ import OpenAI from 'openai';
2
+ import { Logger } from '../utils/logger.js';
3
+ export class EmbeddingService {
4
+ openai;
5
+ config;
6
+ initialized = false;
7
+ _isAvailable = false;
8
+ constructor(config) {
9
+ this.config = config;
10
+ }
11
+ ensureInitialized() {
12
+ if (this.initialized)
13
+ return;
14
+ this.initialized = true;
15
+ if (this.config.provider === 'none') {
16
+ Logger.warn('Embedding service disabled');
17
+ return;
18
+ }
19
+ try {
20
+ if (this.config.provider === 'deepseek') {
21
+ const apiKey = process.env.DEEPSEEK_API_KEY;
22
+ if (!apiKey) {
23
+ Logger.warn('DEEPSEEK_API_KEY not set - semantic search disabled');
24
+ return;
25
+ }
26
+ this.openai = new OpenAI({
27
+ apiKey,
28
+ baseURL: 'https://api.deepseek.com'
29
+ });
30
+ this._isAvailable = true;
31
+ }
32
+ else {
33
+ const apiKey = process.env.OPENAI_API_KEY;
34
+ if (!apiKey) {
35
+ Logger.warn('OPENAI_API_KEY not set - semantic search disabled');
36
+ return;
37
+ }
38
+ this.openai = new OpenAI({ apiKey });
39
+ this._isAvailable = true;
40
+ }
41
+ }
42
+ catch (error) {
43
+ Logger.warn('Embedding init failed: ' + error);
44
+ }
45
+ }
46
+ isAvailable() {
47
+ this.ensureInitialized();
48
+ return this._isAvailable;
49
+ }
50
+ async generateEmbedding(text) {
51
+ this.ensureInitialized();
52
+ if (!this._isAvailable)
53
+ return new Array(1536).fill(0);
54
+ try {
55
+ if (this.openai) {
56
+ return await this.generateOpenAIEmbedding(text);
57
+ }
58
+ return new Array(1536).fill(0);
59
+ }
60
+ catch (error) {
61
+ Logger.error('Failed to generate embedding', error);
62
+ return new Array(1536).fill(0);
63
+ }
64
+ }
65
+ async generateBatchEmbeddings(texts) {
66
+ this.ensureInitialized();
67
+ if (!this._isAvailable) {
68
+ Logger.warn('Embedding service not available, skipping');
69
+ return texts.map(() => new Array(1536).fill(0));
70
+ }
71
+ Logger.progress('Generating embeddings for ' + texts.length + ' texts...');
72
+ const embeddings = [];
73
+ const batchSize = 100;
74
+ for (let i = 0; i < texts.length; i += batchSize) {
75
+ const batch = texts.slice(i, i + batchSize);
76
+ const batchEmbeddings = await Promise.all(batch.map(text => this.generateEmbedding(text)));
77
+ embeddings.push(...batchEmbeddings);
78
+ Logger.debug('Processed ' + Math.min(i + batchSize, texts.length) + '/' + texts.length);
79
+ }
80
+ Logger.success('Generated ' + embeddings.length + ' embeddings');
81
+ return embeddings;
82
+ }
83
+ async generateOpenAIEmbedding(text) {
84
+ if (!this.openai)
85
+ throw new Error('OpenAI client not initialized');
86
+ const response = await this.openai.embeddings.create({
87
+ model: this.config.model || 'text-embedding-3-small',
88
+ input: text.substring(0, 8000)
89
+ });
90
+ return response.data[0].embedding;
91
+ }
92
+ prepareCodeForEmbedding(code, context) {
93
+ let text = '';
94
+ if (context) {
95
+ text += 'Context: ' + context + '\n\n';
96
+ }
97
+ const cleaned = code
98
+ .replace(/\/\*[\s\S]*?\*\//g, '')
99
+ .replace(/\/\/.*/g, '')
100
+ .replace(/\s+/g, ' ')
101
+ .trim();
102
+ text += cleaned;
103
+ return text.substring(0, 8000);
104
+ }
105
+ async generateCodeEmbedding(code, metadata) {
106
+ let context = '';
107
+ if (metadata.filePath) {
108
+ context += 'File: ' + metadata.filePath + '\n';
109
+ }
110
+ if (metadata.symbolName) {
111
+ context += 'Symbol: ' + (metadata.symbolType || 'unknown') + ' ' + metadata.symbolName + '\n';
112
+ }
113
+ if (metadata.purpose) {
114
+ context += 'Purpose: ' + metadata.purpose + '\n';
115
+ }
116
+ const text = this.prepareCodeForEmbedding(code, context);
117
+ return await this.generateEmbedding(text);
118
+ }
119
+ }
120
+ //# sourceMappingURL=embedding-service.js.map
@@ -0,0 +1,45 @@
1
+ /**
2
+ * Semantic Memory Module
3
+ *
4
+ * Семантическая память системы - векторная БД для понимания кода:
5
+ * - Генерация embeddings из кода
6
+ * - Хранение в векторной БД (Qdrant)
7
+ * - Семантический поиск по коду
8
+ * - Долговременная память о назначении компонентов
9
+ */
10
+ import { EmbeddingService, EmbeddingConfig } from './embedding-service.js';
11
+ import { VectorStore, VectorStoreConfig } from './vector-store.js';
12
+ import { SemanticSearchResult, Symbol, ASTNode } from '../types/index.js';
13
+ export declare class SemanticMemory {
14
+ private embeddingService;
15
+ private vectorStore;
16
+ constructor(embeddingConfig: EmbeddingConfig, vectorStoreConfig: VectorStoreConfig);
17
+ initialize(): Promise<void>;
18
+ indexSymbols(symbols: Map<string, Symbol>, asts: Map<string, ASTNode>): Promise<void>;
19
+ indexModules(asts: Map<string, ASTNode>): Promise<void>;
20
+ searchByQuery(query: string, limit?: number): Promise<SemanticSearchResult[]>;
21
+ searchSimilarCode(code: string, metadata?: {
22
+ filePath?: string;
23
+ symbolType?: string;
24
+ }, limit?: number): Promise<SemanticSearchResult[]>;
25
+ findRelatedComponents(componentName: string, limit?: number): Promise<SemanticSearchResult[]>;
26
+ findByPurpose(purpose: string, limit?: number): Promise<SemanticSearchResult[]>;
27
+ updateSymbol(symbol: Symbol, code: string): Promise<void>;
28
+ deleteFile(filePath: string): Promise<void>;
29
+ getStatistics(): Promise<{
30
+ name: string;
31
+ vectorsCount: number;
32
+ pointsCount: number | null | undefined;
33
+ status: "green" | "yellow" | "grey" | "red";
34
+ } | null>;
35
+ private createChunkFromSymbol;
36
+ private createChunkFromModule;
37
+ private extractFunctionChunks;
38
+ private createFunctionChunk;
39
+ private extractSymbolCode;
40
+ private extractModuleDescription;
41
+ private mapSymbolKindToChunkType;
42
+ private extractDomain;
43
+ }
44
+ export { EmbeddingService, VectorStore };
45
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1,206 @@
1
+ /**
2
+ * Semantic Memory Module
3
+ *
4
+ * Семантическая память системы - векторная БД для понимания кода:
5
+ * - Генерация embeddings из кода
6
+ * - Хранение в векторной БД (Qdrant)
7
+ * - Семантический поиск по коду
8
+ * - Долговременная память о назначении компонентов
9
+ */
10
+ import { EmbeddingService } from './embedding-service.js';
11
+ import { VectorStore } from './vector-store.js';
12
+ import { Logger } from '../utils/logger.js';
13
+ export class SemanticMemory {
14
+ embeddingService;
15
+ vectorStore;
16
+ constructor(embeddingConfig, vectorStoreConfig) {
17
+ this.embeddingService = new EmbeddingService(embeddingConfig);
18
+ this.vectorStore = new VectorStore(vectorStoreConfig);
19
+ }
20
+ async initialize() {
21
+ Logger.info('Initializing Semantic Memory...');
22
+ await this.vectorStore.initialize();
23
+ Logger.success('Semantic Memory initialized');
24
+ }
25
+ async indexSymbols(symbols, asts) {
26
+ Logger.progress('Indexing symbols into semantic memory...');
27
+ const chunks = [];
28
+ for (const symbol of symbols.values()) {
29
+ const ast = asts.get(symbol.filePath);
30
+ if (!ast)
31
+ continue;
32
+ const code = this.extractSymbolCode(symbol, ast);
33
+ const chunk = await this.createChunkFromSymbol(symbol, code);
34
+ chunks.push(chunk);
35
+ }
36
+ await this.vectorStore.upsertChunks(chunks);
37
+ Logger.success(`Indexed ${chunks.length} symbols`);
38
+ }
39
+ async indexModules(asts) {
40
+ Logger.progress('Indexing modules into semantic memory...');
41
+ const chunks = [];
42
+ for (const [filePath, ast] of asts) {
43
+ const moduleChunk = await this.createChunkFromModule(filePath, ast);
44
+ chunks.push(moduleChunk);
45
+ const functionChunks = await this.extractFunctionChunks(filePath, ast);
46
+ chunks.push(...functionChunks);
47
+ }
48
+ await this.vectorStore.upsertChunks(chunks);
49
+ Logger.success(`Indexed ${chunks.length} module chunks`);
50
+ }
51
+ async searchByQuery(query, limit = 10) {
52
+ const queryEmbedding = await this.embeddingService.generateEmbedding(query);
53
+ return await this.vectorStore.search(queryEmbedding, limit);
54
+ }
55
+ async searchSimilarCode(code, metadata, limit = 10) {
56
+ const embedding = await this.embeddingService.generateCodeEmbedding(code, metadata || {});
57
+ return await this.vectorStore.search(embedding, limit);
58
+ }
59
+ async findRelatedComponents(componentName, limit = 5) {
60
+ const query = `Find components related to ${componentName}`;
61
+ return await this.searchByQuery(query, limit);
62
+ }
63
+ async findByPurpose(purpose, limit = 5) {
64
+ const query = `Code that handles ${purpose}`;
65
+ return await this.searchByQuery(query, limit);
66
+ }
67
+ async updateSymbol(symbol, code) {
68
+ const chunk = await this.createChunkFromSymbol(symbol, code);
69
+ await this.vectorStore.upsertChunk(chunk);
70
+ Logger.success(`Updated symbol: ${symbol.name}`);
71
+ }
72
+ async deleteFile(filePath) {
73
+ await this.vectorStore.deleteByFilter({
74
+ 'metadata.filePath': filePath
75
+ });
76
+ Logger.success(`Deleted chunks for file: ${filePath}`);
77
+ }
78
+ async getStatistics() {
79
+ return await this.vectorStore.getCollectionInfo();
80
+ }
81
+ async createChunkFromSymbol(symbol, code) {
82
+ const embedding = await this.embeddingService.generateCodeEmbedding(code, {
83
+ filePath: symbol.filePath,
84
+ symbolName: symbol.name,
85
+ symbolType: symbol.kind
86
+ });
87
+ const metadata = {
88
+ filePath: symbol.filePath,
89
+ startLine: symbol.location.startLine,
90
+ endLine: symbol.location.endLine,
91
+ type: this.mapSymbolKindToChunkType(symbol.kind),
92
+ symbols: [symbol.name],
93
+ tags: [symbol.kind, this.extractDomain(symbol.filePath)]
94
+ };
95
+ return {
96
+ id: symbol.id,
97
+ content: code,
98
+ embedding,
99
+ metadata
100
+ };
101
+ }
102
+ async createChunkFromModule(filePath, ast) {
103
+ const moduleDescription = this.extractModuleDescription(ast);
104
+ const embedding = await this.embeddingService.generateCodeEmbedding(moduleDescription, { filePath });
105
+ const metadata = {
106
+ filePath,
107
+ startLine: 0,
108
+ endLine: ast.endLine,
109
+ type: 'module',
110
+ symbols: [],
111
+ tags: [this.extractDomain(filePath)]
112
+ };
113
+ return {
114
+ id: `module:${filePath}`,
115
+ content: moduleDescription,
116
+ embedding,
117
+ metadata
118
+ };
119
+ }
120
+ async extractFunctionChunks(filePath, ast) {
121
+ const chunks = [];
122
+ const extractFunctions = async (node) => {
123
+ if (node.type === 'function_declaration' ||
124
+ node.type === 'method_definition') {
125
+ chunks.push(await this.createFunctionChunk(filePath, node));
126
+ }
127
+ for (const child of node.children) {
128
+ await extractFunctions(child);
129
+ }
130
+ };
131
+ await extractFunctions(ast);
132
+ return chunks;
133
+ }
134
+ async createFunctionChunk(filePath, node) {
135
+ const code = node.metadata.text;
136
+ const embedding = await this.embeddingService.generateCodeEmbedding(code, {
137
+ filePath,
138
+ symbolName: node.name,
139
+ symbolType: 'function'
140
+ });
141
+ const metadata = {
142
+ filePath,
143
+ startLine: node.startLine,
144
+ endLine: node.endLine,
145
+ type: 'function',
146
+ symbols: [node.name],
147
+ tags: ['function', this.extractDomain(filePath)]
148
+ };
149
+ return {
150
+ id: `${filePath}:${node.name}:${node.startLine}`,
151
+ content: code,
152
+ embedding,
153
+ metadata
154
+ };
155
+ }
156
+ extractSymbolCode(symbol, ast) {
157
+ const findNode = (node) => {
158
+ if (node.startLine === symbol.location.startLine &&
159
+ node.name === symbol.name) {
160
+ return node;
161
+ }
162
+ for (const child of node.children) {
163
+ const found = findNode(child);
164
+ if (found)
165
+ return found;
166
+ }
167
+ return null;
168
+ };
169
+ const node = findNode(ast);
170
+ return node?.metadata.text || '';
171
+ }
172
+ extractModuleDescription(ast) {
173
+ const comments = [];
174
+ const exports = [];
175
+ const extract = (node) => {
176
+ if (node.type === 'comment') {
177
+ comments.push(node.metadata.text);
178
+ }
179
+ if (node.type === 'export_statement') {
180
+ exports.push(node.name);
181
+ }
182
+ for (const child of node.children) {
183
+ extract(child);
184
+ }
185
+ };
186
+ extract(ast);
187
+ let description = comments.join('\n');
188
+ if (exports.length > 0) {
189
+ description += `\nExports: ${exports.join(', ')}`;
190
+ }
191
+ return description || 'Module without description';
192
+ }
193
+ mapSymbolKindToChunkType(kind) {
194
+ if (kind === 'function')
195
+ return 'function';
196
+ if (kind === 'class')
197
+ return 'class';
198
+ return 'module';
199
+ }
200
+ extractDomain(filePath) {
201
+ const parts = filePath.split('/');
202
+ return parts[parts.length - 2] || 'unknown';
203
+ }
204
+ }
205
+ export { EmbeddingService, VectorStore };
206
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1,27 @@
1
+ import { SemanticChunk, SemanticSearchResult } from '../types/index.js';
2
+ export interface VectorStoreConfig {
3
+ url: string;
4
+ apiKey?: string;
5
+ collectionName: string;
6
+ }
7
+ export declare class VectorStore {
8
+ private client;
9
+ private collectionName;
10
+ private _isAvailable;
11
+ constructor(config: VectorStoreConfig);
12
+ isAvailable(): boolean;
13
+ initialize(vectorSize?: number): Promise<void>;
14
+ upsertChunk(chunk: SemanticChunk): Promise<void>;
15
+ upsertChunks(chunks: SemanticChunk[]): Promise<void>;
16
+ search(query: number[], limit?: number, filter?: Record<string, unknown>): Promise<SemanticSearchResult[]>;
17
+ deleteChunk(id: string): Promise<void>;
18
+ deleteByFilter(filter: Record<string, unknown>): Promise<void>;
19
+ getCollectionInfo(): Promise<{
20
+ name: string;
21
+ vectorsCount: number;
22
+ pointsCount: number | null | undefined;
23
+ status: "green" | "yellow" | "grey" | "red";
24
+ } | null>;
25
+ private extractContext;
26
+ }
27
+ //# sourceMappingURL=vector-store.d.ts.map
@@ -0,0 +1,166 @@
1
+ import { QdrantClient } from '@qdrant/js-client-rest';
2
+ import { Logger } from '../utils/logger.js';
3
+ export class VectorStore {
4
+ client;
5
+ collectionName;
6
+ _isAvailable = false;
7
+ constructor(config) {
8
+ this.client = new QdrantClient({
9
+ url: config.url,
10
+ apiKey: config.apiKey
11
+ });
12
+ this.collectionName = config.collectionName;
13
+ }
14
+ isAvailable() {
15
+ return this._isAvailable;
16
+ }
17
+ async initialize(vectorSize = 1536) {
18
+ try {
19
+ const collections = await this.client.getCollections();
20
+ const exists = collections.collections.some(c => c.name === this.collectionName);
21
+ if (!exists) {
22
+ await this.client.createCollection(this.collectionName, {
23
+ vectors: {
24
+ size: vectorSize,
25
+ distance: 'Cosine'
26
+ }
27
+ });
28
+ Logger.success(`Created collection: ${this.collectionName}`);
29
+ }
30
+ else {
31
+ Logger.info(`Collection already exists: ${this.collectionName}`);
32
+ }
33
+ this._isAvailable = true;
34
+ }
35
+ catch (error) {
36
+ Logger.warn("Vector store not available - Qdrant not running");
37
+ this._isAvailable = false;
38
+ }
39
+ }
40
+ async upsertChunk(chunk) {
41
+ if (!this._isAvailable)
42
+ return;
43
+ try {
44
+ await this.client.upsert(this.collectionName, {
45
+ points: [
46
+ {
47
+ id: chunk.id,
48
+ vector: chunk.embedding,
49
+ payload: {
50
+ content: chunk.content,
51
+ metadata: chunk.metadata
52
+ }
53
+ }
54
+ ]
55
+ });
56
+ }
57
+ catch (error) {
58
+ Logger.error(`Failed to upsert chunk ${chunk.id}`, error);
59
+ }
60
+ }
61
+ async upsertChunks(chunks) {
62
+ if (!this._isAvailable) {
63
+ Logger.warn('Vector store not available, skipping upsert');
64
+ return;
65
+ }
66
+ Logger.progress(`Upserting ${chunks.length} chunks...`);
67
+ const batchSize = 100;
68
+ for (let i = 0; i < chunks.length; i += batchSize) {
69
+ const batch = chunks.slice(i, i + batchSize);
70
+ await this.client.upsert(this.collectionName, {
71
+ points: batch.map(chunk => ({
72
+ id: chunk.id,
73
+ vector: chunk.embedding,
74
+ payload: {
75
+ content: chunk.content,
76
+ metadata: chunk.metadata
77
+ }
78
+ }))
79
+ });
80
+ Logger.debug(`Upserted ${Math.min(i + batchSize, chunks.length)}/${chunks.length}`);
81
+ }
82
+ Logger.success(`Upserted ${chunks.length} chunks successfully`);
83
+ }
84
+ async search(query, limit = 10, filter) {
85
+ if (!this._isAvailable)
86
+ return [];
87
+ try {
88
+ const response = await this.client.search(this.collectionName, {
89
+ vector: query,
90
+ limit,
91
+ filter,
92
+ with_payload: true
93
+ });
94
+ return response.map(point => ({
95
+ chunk: {
96
+ id: String(point.id),
97
+ content: point.payload?.content || '',
98
+ embedding: [],
99
+ metadata: point.payload?.metadata || {
100
+ filePath: '',
101
+ startLine: 0,
102
+ endLine: 0,
103
+ type: 'module',
104
+ symbols: [],
105
+ tags: []
106
+ }
107
+ },
108
+ score: point.score,
109
+ context: this.extractContext(point.payload?.content)
110
+ }));
111
+ }
112
+ catch (error) {
113
+ Logger.error('Search failed', error);
114
+ return [];
115
+ }
116
+ }
117
+ async deleteChunk(id) {
118
+ if (!this._isAvailable)
119
+ return;
120
+ try {
121
+ await this.client.delete(this.collectionName, {
122
+ points: [id]
123
+ });
124
+ }
125
+ catch (error) {
126
+ Logger.error(`Failed to delete chunk ${id}`, error);
127
+ }
128
+ }
129
+ async deleteByFilter(filter) {
130
+ if (!this._isAvailable)
131
+ return;
132
+ try {
133
+ await this.client.delete(this.collectionName, {
134
+ filter
135
+ });
136
+ Logger.success('Deleted chunks by filter');
137
+ }
138
+ catch (error) {
139
+ Logger.error('Failed to delete by filter', error);
140
+ }
141
+ }
142
+ async getCollectionInfo() {
143
+ if (!this._isAvailable)
144
+ return null;
145
+ try {
146
+ const info = await this.client.getCollection(this.collectionName);
147
+ return {
148
+ name: this.collectionName,
149
+ vectorsCount: info.indexed_vectors_count ?? 0,
150
+ pointsCount: info.points_count,
151
+ status: info.status
152
+ };
153
+ }
154
+ catch (error) {
155
+ Logger.error('Failed to get collection info', error);
156
+ return null;
157
+ }
158
+ }
159
+ extractContext(content, contextLength = 200) {
160
+ if (content.length <= contextLength) {
161
+ return content;
162
+ }
163
+ return content.substring(0, contextLength) + '...';
164
+ }
165
+ }
166
+ //# sourceMappingURL=vector-store.js.map
@@ -0,0 +1,28 @@
1
+ /**
2
+ * ArchiCore Web Server
3
+ *
4
+ * HTTP API для Architecture Digital Twin:
5
+ * - Индексация проектов
6
+ * - Визуализация архитектуры
7
+ * - Анализ влияния изменений
8
+ * - Симуляция изменений
9
+ */
10
+ import 'dotenv/config';
11
+ import express from 'express';
12
+ export interface ServerConfig {
13
+ port: number;
14
+ host?: string;
15
+ }
16
+ export declare class ArchiCoreServer {
17
+ private app;
18
+ private server;
19
+ private config;
20
+ constructor(config: ServerConfig);
21
+ private setupMiddleware;
22
+ private setupRoutes;
23
+ private setupErrorHandling;
24
+ start(): Promise<void>;
25
+ stop(): Promise<void>;
26
+ getApp(): express.Application;
27
+ }
28
+ //# sourceMappingURL=index.d.ts.map