@yuaone/core 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 (235) hide show
  1. package/LICENSE +663 -0
  2. package/README.md +15 -0
  3. package/dist/__tests__/context-manager.test.d.ts +6 -0
  4. package/dist/__tests__/context-manager.test.d.ts.map +1 -0
  5. package/dist/__tests__/context-manager.test.js +220 -0
  6. package/dist/__tests__/context-manager.test.js.map +1 -0
  7. package/dist/__tests__/governor.test.d.ts +6 -0
  8. package/dist/__tests__/governor.test.d.ts.map +1 -0
  9. package/dist/__tests__/governor.test.js +210 -0
  10. package/dist/__tests__/governor.test.js.map +1 -0
  11. package/dist/__tests__/model-router.test.d.ts +6 -0
  12. package/dist/__tests__/model-router.test.d.ts.map +1 -0
  13. package/dist/__tests__/model-router.test.js +329 -0
  14. package/dist/__tests__/model-router.test.js.map +1 -0
  15. package/dist/agent-logger.d.ts +384 -0
  16. package/dist/agent-logger.d.ts.map +1 -0
  17. package/dist/agent-logger.js +820 -0
  18. package/dist/agent-logger.js.map +1 -0
  19. package/dist/agent-loop.d.ts +163 -0
  20. package/dist/agent-loop.d.ts.map +1 -0
  21. package/dist/agent-loop.js +609 -0
  22. package/dist/agent-loop.js.map +1 -0
  23. package/dist/agent-modes.d.ts +85 -0
  24. package/dist/agent-modes.d.ts.map +1 -0
  25. package/dist/agent-modes.js +418 -0
  26. package/dist/agent-modes.js.map +1 -0
  27. package/dist/approval.d.ts +137 -0
  28. package/dist/approval.d.ts.map +1 -0
  29. package/dist/approval.js +299 -0
  30. package/dist/approval.js.map +1 -0
  31. package/dist/async-completion-queue.d.ts +56 -0
  32. package/dist/async-completion-queue.d.ts.map +1 -0
  33. package/dist/async-completion-queue.js +77 -0
  34. package/dist/async-completion-queue.js.map +1 -0
  35. package/dist/auto-fix.d.ts +174 -0
  36. package/dist/auto-fix.d.ts.map +1 -0
  37. package/dist/auto-fix.js +319 -0
  38. package/dist/auto-fix.js.map +1 -0
  39. package/dist/codebase-context.d.ts +396 -0
  40. package/dist/codebase-context.d.ts.map +1 -0
  41. package/dist/codebase-context.js +1260 -0
  42. package/dist/codebase-context.js.map +1 -0
  43. package/dist/conflict-resolver.d.ts +191 -0
  44. package/dist/conflict-resolver.d.ts.map +1 -0
  45. package/dist/conflict-resolver.js +524 -0
  46. package/dist/conflict-resolver.js.map +1 -0
  47. package/dist/constants.d.ts +52 -0
  48. package/dist/constants.d.ts.map +1 -0
  49. package/dist/constants.js +141 -0
  50. package/dist/constants.js.map +1 -0
  51. package/dist/context-budget.d.ts +435 -0
  52. package/dist/context-budget.d.ts.map +1 -0
  53. package/dist/context-budget.js +903 -0
  54. package/dist/context-budget.js.map +1 -0
  55. package/dist/context-compressor.d.ts +143 -0
  56. package/dist/context-compressor.d.ts.map +1 -0
  57. package/dist/context-compressor.js +511 -0
  58. package/dist/context-compressor.js.map +1 -0
  59. package/dist/context-manager.d.ts +112 -0
  60. package/dist/context-manager.d.ts.map +1 -0
  61. package/dist/context-manager.js +247 -0
  62. package/dist/context-manager.js.map +1 -0
  63. package/dist/continuous-reflection.d.ts +267 -0
  64. package/dist/continuous-reflection.d.ts.map +1 -0
  65. package/dist/continuous-reflection.js +338 -0
  66. package/dist/continuous-reflection.js.map +1 -0
  67. package/dist/cross-file-refactor.d.ts +352 -0
  68. package/dist/cross-file-refactor.d.ts.map +1 -0
  69. package/dist/cross-file-refactor.js +1544 -0
  70. package/dist/cross-file-refactor.js.map +1 -0
  71. package/dist/dag-orchestrator.d.ts +138 -0
  72. package/dist/dag-orchestrator.d.ts.map +1 -0
  73. package/dist/dag-orchestrator.js +379 -0
  74. package/dist/dag-orchestrator.js.map +1 -0
  75. package/dist/debate-orchestrator.d.ts +301 -0
  76. package/dist/debate-orchestrator.d.ts.map +1 -0
  77. package/dist/debate-orchestrator.js +719 -0
  78. package/dist/debate-orchestrator.js.map +1 -0
  79. package/dist/dependency-analyzer.d.ts +113 -0
  80. package/dist/dependency-analyzer.d.ts.map +1 -0
  81. package/dist/dependency-analyzer.js +444 -0
  82. package/dist/dependency-analyzer.js.map +1 -0
  83. package/dist/design-loop.d.ts +59 -0
  84. package/dist/design-loop.d.ts.map +1 -0
  85. package/dist/design-loop.js +344 -0
  86. package/dist/design-loop.js.map +1 -0
  87. package/dist/doc-intelligence.d.ts +383 -0
  88. package/dist/doc-intelligence.d.ts.map +1 -0
  89. package/dist/doc-intelligence.js +1307 -0
  90. package/dist/doc-intelligence.js.map +1 -0
  91. package/dist/dynamic-role-generator.d.ts +76 -0
  92. package/dist/dynamic-role-generator.d.ts.map +1 -0
  93. package/dist/dynamic-role-generator.js +194 -0
  94. package/dist/dynamic-role-generator.js.map +1 -0
  95. package/dist/errors.d.ts +69 -0
  96. package/dist/errors.d.ts.map +1 -0
  97. package/dist/errors.js +102 -0
  98. package/dist/errors.js.map +1 -0
  99. package/dist/event-bus.d.ts +159 -0
  100. package/dist/event-bus.d.ts.map +1 -0
  101. package/dist/event-bus.js +305 -0
  102. package/dist/event-bus.js.map +1 -0
  103. package/dist/execution-engine.d.ts +425 -0
  104. package/dist/execution-engine.d.ts.map +1 -0
  105. package/dist/execution-engine.js +1555 -0
  106. package/dist/execution-engine.js.map +1 -0
  107. package/dist/git-intelligence.d.ts +306 -0
  108. package/dist/git-intelligence.d.ts.map +1 -0
  109. package/dist/git-intelligence.js +1099 -0
  110. package/dist/git-intelligence.js.map +1 -0
  111. package/dist/governor.d.ts +77 -0
  112. package/dist/governor.d.ts.map +1 -0
  113. package/dist/governor.js +161 -0
  114. package/dist/governor.js.map +1 -0
  115. package/dist/hierarchical-planner.d.ts +313 -0
  116. package/dist/hierarchical-planner.d.ts.map +1 -0
  117. package/dist/hierarchical-planner.js +981 -0
  118. package/dist/hierarchical-planner.js.map +1 -0
  119. package/dist/index.d.ts +121 -0
  120. package/dist/index.d.ts.map +1 -0
  121. package/dist/index.js +123 -0
  122. package/dist/index.js.map +1 -0
  123. package/dist/intent-inference.d.ts +103 -0
  124. package/dist/intent-inference.d.ts.map +1 -0
  125. package/dist/intent-inference.js +605 -0
  126. package/dist/intent-inference.js.map +1 -0
  127. package/dist/interrupt-manager.d.ts +143 -0
  128. package/dist/interrupt-manager.d.ts.map +1 -0
  129. package/dist/interrupt-manager.js +196 -0
  130. package/dist/interrupt-manager.js.map +1 -0
  131. package/dist/kernel.d.ts +564 -0
  132. package/dist/kernel.d.ts.map +1 -0
  133. package/dist/kernel.js +1419 -0
  134. package/dist/kernel.js.map +1 -0
  135. package/dist/language-support.d.ts +232 -0
  136. package/dist/language-support.d.ts.map +1 -0
  137. package/dist/language-support.js +1134 -0
  138. package/dist/language-support.js.map +1 -0
  139. package/dist/llm-client.d.ts +82 -0
  140. package/dist/llm-client.d.ts.map +1 -0
  141. package/dist/llm-client.js +475 -0
  142. package/dist/llm-client.js.map +1 -0
  143. package/dist/mcp-client.d.ts +232 -0
  144. package/dist/mcp-client.d.ts.map +1 -0
  145. package/dist/mcp-client.js +718 -0
  146. package/dist/mcp-client.js.map +1 -0
  147. package/dist/memory-manager.d.ts +200 -0
  148. package/dist/memory-manager.d.ts.map +1 -0
  149. package/dist/memory-manager.js +568 -0
  150. package/dist/memory-manager.js.map +1 -0
  151. package/dist/memory.d.ts +87 -0
  152. package/dist/memory.d.ts.map +1 -0
  153. package/dist/memory.js +341 -0
  154. package/dist/memory.js.map +1 -0
  155. package/dist/model-router.d.ts +245 -0
  156. package/dist/model-router.d.ts.map +1 -0
  157. package/dist/model-router.js +632 -0
  158. package/dist/model-router.js.map +1 -0
  159. package/dist/parallel-executor.d.ts +125 -0
  160. package/dist/parallel-executor.d.ts.map +1 -0
  161. package/dist/parallel-executor.js +201 -0
  162. package/dist/parallel-executor.js.map +1 -0
  163. package/dist/perf-optimizer.d.ts +212 -0
  164. package/dist/perf-optimizer.d.ts.map +1 -0
  165. package/dist/perf-optimizer.js +721 -0
  166. package/dist/perf-optimizer.js.map +1 -0
  167. package/dist/persona.d.ts +305 -0
  168. package/dist/persona.d.ts.map +1 -0
  169. package/dist/persona.js +887 -0
  170. package/dist/persona.js.map +1 -0
  171. package/dist/planner.d.ts +70 -0
  172. package/dist/planner.d.ts.map +1 -0
  173. package/dist/planner.js +264 -0
  174. package/dist/planner.js.map +1 -0
  175. package/dist/qa-pipeline.d.ts +365 -0
  176. package/dist/qa-pipeline.d.ts.map +1 -0
  177. package/dist/qa-pipeline.js +1352 -0
  178. package/dist/qa-pipeline.js.map +1 -0
  179. package/dist/reasoning-adapter.d.ts +116 -0
  180. package/dist/reasoning-adapter.d.ts.map +1 -0
  181. package/dist/reasoning-adapter.js +187 -0
  182. package/dist/reasoning-adapter.js.map +1 -0
  183. package/dist/role-registry.d.ts +55 -0
  184. package/dist/role-registry.d.ts.map +1 -0
  185. package/dist/role-registry.js +192 -0
  186. package/dist/role-registry.js.map +1 -0
  187. package/dist/sandbox-tiers.d.ts +327 -0
  188. package/dist/sandbox-tiers.d.ts.map +1 -0
  189. package/dist/sandbox-tiers.js +928 -0
  190. package/dist/sandbox-tiers.js.map +1 -0
  191. package/dist/security-scanner.d.ts +222 -0
  192. package/dist/security-scanner.d.ts.map +1 -0
  193. package/dist/security-scanner.js +1129 -0
  194. package/dist/security-scanner.js.map +1 -0
  195. package/dist/security.d.ts +93 -0
  196. package/dist/security.d.ts.map +1 -0
  197. package/dist/security.js +393 -0
  198. package/dist/security.js.map +1 -0
  199. package/dist/self-reflection.d.ts +397 -0
  200. package/dist/self-reflection.d.ts.map +1 -0
  201. package/dist/self-reflection.js +908 -0
  202. package/dist/self-reflection.js.map +1 -0
  203. package/dist/session-persistence.d.ts +191 -0
  204. package/dist/session-persistence.d.ts.map +1 -0
  205. package/dist/session-persistence.js +395 -0
  206. package/dist/session-persistence.js.map +1 -0
  207. package/dist/speculative-executor.d.ts +210 -0
  208. package/dist/speculative-executor.d.ts.map +1 -0
  209. package/dist/speculative-executor.js +618 -0
  210. package/dist/speculative-executor.js.map +1 -0
  211. package/dist/state-machine.d.ts +289 -0
  212. package/dist/state-machine.d.ts.map +1 -0
  213. package/dist/state-machine.js +695 -0
  214. package/dist/state-machine.js.map +1 -0
  215. package/dist/sub-agent.d.ts +177 -0
  216. package/dist/sub-agent.d.ts.map +1 -0
  217. package/dist/sub-agent.js +303 -0
  218. package/dist/sub-agent.js.map +1 -0
  219. package/dist/system-prompt.d.ts +26 -0
  220. package/dist/system-prompt.d.ts.map +1 -0
  221. package/dist/system-prompt.js +84 -0
  222. package/dist/system-prompt.js.map +1 -0
  223. package/dist/test-intelligence.d.ts +439 -0
  224. package/dist/test-intelligence.d.ts.map +1 -0
  225. package/dist/test-intelligence.js +1165 -0
  226. package/dist/test-intelligence.js.map +1 -0
  227. package/dist/types.d.ts +632 -0
  228. package/dist/types.d.ts.map +1 -0
  229. package/dist/types.js +6 -0
  230. package/dist/types.js.map +1 -0
  231. package/dist/vector-index.d.ts +314 -0
  232. package/dist/vector-index.d.ts.map +1 -0
  233. package/dist/vector-index.js +618 -0
  234. package/dist/vector-index.js.map +1 -0
  235. package/package.json +41 -0
@@ -0,0 +1,618 @@
1
+ /**
2
+ * @module vector-index
3
+ * @description Vector DB Code Indexer — pgvector 기반 시맨틱 코드 검색.
4
+ *
5
+ * 코드 임베딩을 PostgreSQL pgvector에 저장하고, 자연어 / 코드 유사도로 검색.
6
+ * DB 연결은 외부에서 주입 (SQLExecutor), 임베딩 생성도 외부에서 주입 (EmbeddingProvider).
7
+ *
8
+ * 주요 기능:
9
+ * - 코드 심볼 인덱싱 (함수, 클래스, 인터페이스, 타입, enum 등)
10
+ * - 시맨틱 검색 (자연어 → 코드)
11
+ * - 코드 유사도 검색 (중복/유사 코드 탐지)
12
+ * - 파일 단위 재인덱싱
13
+ * - 프로젝트 통계
14
+ */
15
+ // ─── Constants ─────────────────────────────────────────────────────
16
+ const TABLE_NAME = "code_embeddings";
17
+ const DEFAULT_BATCH_SIZE = 50;
18
+ const DEFAULT_DIMENSION = 1536;
19
+ const DEFAULT_SEARCH_LIMIT = 10;
20
+ const DEFAULT_SIMILARITY_THRESHOLD = 0.7;
21
+ // ─── VectorIndex ───────────────────────────────────────────────────
22
+ /**
23
+ * VectorIndex — pgvector 기반 코드 시맨틱 인덱서.
24
+ *
25
+ * 코드 심볼을 벡터로 변환하여 PostgreSQL에 저장하고,
26
+ * 자연어 질의 또는 코드 유사도로 검색하는 기능을 제공한다.
27
+ *
28
+ * @example
29
+ * ```ts
30
+ * const index = new VectorIndex({
31
+ * projectId: "my-project",
32
+ * embeddingProvider: openaiEmbedder,
33
+ * sqlExecutor: pgPool,
34
+ * });
35
+ * await index.initialize();
36
+ * await index.indexBatch(symbols);
37
+ * const results = await index.search("user authentication logic");
38
+ * ```
39
+ */
40
+ export class VectorIndex {
41
+ config;
42
+ constructor(config) {
43
+ this.config = {
44
+ projectId: config.projectId,
45
+ embeddingProvider: config.embeddingProvider,
46
+ sqlExecutor: config.sqlExecutor,
47
+ batchSize: config.batchSize ?? DEFAULT_BATCH_SIZE,
48
+ dimension: config.dimension ?? DEFAULT_DIMENSION,
49
+ };
50
+ }
51
+ // ─── Schema ────────────────────────────────────────────────────
52
+ /**
53
+ * CREATE TABLE + INDEX SQL을 생성한다 (idempotent).
54
+ * pgvector extension, 테이블, 인덱스를 모두 포함.
55
+ *
56
+ * @returns 실행할 SQL 문자열
57
+ */
58
+ getCreateTableSQL() {
59
+ const dim = this.config.dimension;
60
+ return `
61
+ -- Enable pgvector extension
62
+ CREATE EXTENSION IF NOT EXISTS vector;
63
+
64
+ -- Code embeddings table
65
+ CREATE TABLE IF NOT EXISTS ${TABLE_NAME} (
66
+ id SERIAL PRIMARY KEY,
67
+ project_id TEXT NOT NULL,
68
+ file_path TEXT NOT NULL,
69
+ symbol_name TEXT NOT NULL,
70
+ symbol_type TEXT NOT NULL,
71
+ code_snippet TEXT NOT NULL,
72
+ embedding vector(${dim}) NOT NULL,
73
+ metadata JSONB DEFAULT '{}',
74
+ updated_at TIMESTAMPTZ DEFAULT NOW()
75
+ );
76
+
77
+ -- Unique constraint for upsert
78
+ DO $$
79
+ BEGIN
80
+ IF NOT EXISTS (
81
+ SELECT 1 FROM pg_constraint
82
+ WHERE conname = 'uq_code_embedding_symbol'
83
+ ) THEN
84
+ ALTER TABLE ${TABLE_NAME}
85
+ ADD CONSTRAINT uq_code_embedding_symbol
86
+ UNIQUE (project_id, file_path, symbol_name, symbol_type);
87
+ END IF;
88
+ END $$;
89
+
90
+ -- Indexes
91
+ CREATE INDEX IF NOT EXISTS idx_code_embedding_project
92
+ ON ${TABLE_NAME} (project_id);
93
+ CREATE INDEX IF NOT EXISTS idx_code_embedding_file
94
+ ON ${TABLE_NAME} (project_id, file_path);
95
+ CREATE INDEX IF NOT EXISTS idx_code_embedding_type
96
+ ON ${TABLE_NAME} (project_id, symbol_type);
97
+
98
+ -- IVFFlat vector index (cosine distance)
99
+ -- Note: requires at least 100 rows for lists=100 to be effective.
100
+ -- For small datasets, pgvector falls back to sequential scan automatically.
101
+ CREATE INDEX IF NOT EXISTS idx_code_embedding_vector
102
+ ON ${TABLE_NAME} USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
103
+ `.trim();
104
+ }
105
+ /**
106
+ * 테이블을 초기화한다 (startup 시 호출).
107
+ * CREATE TABLE + INDEX를 실행한다 (idempotent).
108
+ */
109
+ async initialize() {
110
+ const sql = this.getCreateTableSQL();
111
+ // Split by semicolons and execute each statement
112
+ // (some drivers don't support multi-statement execution)
113
+ const statements = this.splitStatements(sql);
114
+ for (const stmt of statements) {
115
+ const trimmed = stmt.trim();
116
+ if (trimmed.length > 0) {
117
+ await this.config.sqlExecutor.query(trimmed);
118
+ }
119
+ }
120
+ }
121
+ // ─── Indexing ──────────────────────────────────────────────────
122
+ /**
123
+ * 단일 심볼을 인덱싱한다 (upsert).
124
+ * 이미 임베딩이 포함된 CodeEmbedding을 받는다.
125
+ *
126
+ * @param symbol - 임베딩이 포함된 코드 심볼
127
+ */
128
+ async indexSymbol(symbol) {
129
+ const { sql, params } = this.buildUpsertSQL(symbol);
130
+ await this.config.sqlExecutor.query(sql, params);
131
+ }
132
+ /**
133
+ * 여러 심볼을 배치로 인덱싱한다.
134
+ * 임베딩이 없는 심볼을 받아 자동으로 임베딩을 생성한다.
135
+ *
136
+ * @param symbols - 임베딩 없는 코드 심볼 배열
137
+ * @returns 인덱싱된 심볼 수
138
+ */
139
+ async indexBatch(symbols) {
140
+ if (symbols.length === 0)
141
+ return 0;
142
+ let indexed = 0;
143
+ const batchSize = this.config.batchSize;
144
+ for (let i = 0; i < symbols.length; i += batchSize) {
145
+ const batch = symbols.slice(i, i + batchSize);
146
+ // Build text representations for embedding
147
+ const texts = batch.map((s) => this.buildSnippetForEmbedding({
148
+ name: s.symbolName,
149
+ type: s.symbolType,
150
+ code: s.codeSnippet,
151
+ file: s.filePath,
152
+ }));
153
+ // Generate embeddings
154
+ const embeddings = await this.generateEmbeddings(texts);
155
+ // Upsert each symbol
156
+ for (let j = 0; j < batch.length; j++) {
157
+ const symbol = batch[j];
158
+ const fullSymbol = {
159
+ ...symbol,
160
+ embedding: embeddings[j],
161
+ };
162
+ const { sql, params } = this.buildUpsertSQL(fullSymbol);
163
+ await this.config.sqlExecutor.query(sql, params);
164
+ indexed++;
165
+ }
166
+ }
167
+ return indexed;
168
+ }
169
+ /**
170
+ * 파일 하나를 재인덱싱한다.
171
+ * 기존 임베딩을 삭제하고 새로운 심볼로 교체한다.
172
+ *
173
+ * @param filePath - 파일 경로 (프로젝트 루트 기준)
174
+ * @param symbols - 새로운 심볼 배열 (임베딩 없음)
175
+ * @returns 인덱싱된 심볼 수
176
+ */
177
+ async reindexFile(filePath, symbols) {
178
+ // Delete existing embeddings for this file
179
+ await this.removeFile(filePath);
180
+ // Index new symbols
181
+ if (symbols.length === 0)
182
+ return 0;
183
+ return this.indexBatch(symbols);
184
+ }
185
+ /**
186
+ * 파일의 모든 임베딩을 삭제한다.
187
+ *
188
+ * @param filePath - 파일 경로
189
+ * @returns 삭제된 행 수
190
+ */
191
+ async removeFile(filePath) {
192
+ const sql = `DELETE FROM ${TABLE_NAME} WHERE project_id = $1 AND file_path = $2`;
193
+ const result = await this.config.sqlExecutor.query(sql, [
194
+ this.config.projectId,
195
+ filePath,
196
+ ]);
197
+ // PostgreSQL returns rowCount, but our interface uses rows.
198
+ // Convention: the executor can return affected count via rows length or a special field.
199
+ return result.rowCount ?? 0;
200
+ }
201
+ /**
202
+ * 프로젝트의 모든 임베딩을 삭제한다.
203
+ *
204
+ * @returns 삭제된 행 수
205
+ */
206
+ async clearProject() {
207
+ const sql = `DELETE FROM ${TABLE_NAME} WHERE project_id = $1`;
208
+ const result = await this.config.sqlExecutor.query(sql, [
209
+ this.config.projectId,
210
+ ]);
211
+ return result.rowCount ?? 0;
212
+ }
213
+ // ─── Search ────────────────────────────────────────────────────
214
+ /**
215
+ * 자연어 쿼리로 시맨틱 검색한다.
216
+ *
217
+ * @param query - 자연어 검색 쿼리 (e.g., "user authentication logic")
218
+ * @param limit - 최대 결과 수 (default: 10)
219
+ * @returns 유사도 순으로 정렬된 검색 결과
220
+ */
221
+ async search(query, limit = DEFAULT_SEARCH_LIMIT) {
222
+ const [embedding] = await this.generateEmbeddings([query]);
223
+ const { sql, params } = this.buildSearchSQL(embedding, limit);
224
+ const result = await this.config.sqlExecutor.query(sql, params);
225
+ return this.mapSearchResults(result.rows);
226
+ }
227
+ /**
228
+ * 코드 스니펫 유사도로 검색한다.
229
+ *
230
+ * @param codeSnippet - 비교할 코드 스니펫
231
+ * @param limit - 최대 결과 수 (default: 10)
232
+ * @param threshold - 최소 유사도 임계값 (default: 0.7)
233
+ * @returns 유사도 순으로 정렬된 검색 결과 (threshold 이상만)
234
+ */
235
+ async searchBySimilarity(codeSnippet, limit = DEFAULT_SEARCH_LIMIT, threshold = DEFAULT_SIMILARITY_THRESHOLD) {
236
+ const [embedding] = await this.generateEmbeddings([codeSnippet]);
237
+ const { sql, params } = this.buildSearchSQL(embedding, limit, {
238
+ threshold,
239
+ });
240
+ const result = await this.config.sqlExecutor.query(sql, params);
241
+ return this.mapSearchResults(result.rows);
242
+ }
243
+ /**
244
+ * 심볼 타입으로 필터링하여 검색한다.
245
+ *
246
+ * @param query - 자연어 검색 쿼리
247
+ * @param symbolType - 필터링할 심볼 타입 (e.g., "function", "class")
248
+ * @param limit - 최대 결과 수 (default: 10)
249
+ * @returns 유사도 순으로 정렬된 검색 결과
250
+ */
251
+ async searchByType(query, symbolType, limit = DEFAULT_SEARCH_LIMIT) {
252
+ const [embedding] = await this.generateEmbeddings([query]);
253
+ const { sql, params } = this.buildSearchSQL(embedding, limit, {
254
+ symbolType,
255
+ });
256
+ const result = await this.config.sqlExecutor.query(sql, params);
257
+ return this.mapSearchResults(result.rows);
258
+ }
259
+ /**
260
+ * 중복/유사 코드를 탐지한다.
261
+ *
262
+ * @param codeSnippet - 비교할 코드 스니펫
263
+ * @param threshold - 최소 유사도 임계값 (default: 0.85, 높은 값으로 중복 탐지)
264
+ * @returns 유사도 순으로 정렬된 검색 결과
265
+ */
266
+ async findSimilarCode(codeSnippet, threshold = 0.85) {
267
+ const [embedding] = await this.generateEmbeddings([codeSnippet]);
268
+ const { sql, params } = this.buildSearchSQL(embedding, 20, { threshold });
269
+ const result = await this.config.sqlExecutor.query(sql, params);
270
+ return this.mapSearchResults(result.rows);
271
+ }
272
+ // ─── Queries ───────────────────────────────────────────────────
273
+ /**
274
+ * 파일의 모든 심볼을 조회한다.
275
+ *
276
+ * @param filePath - 파일 경로
277
+ * @returns 해당 파일의 CodeEmbedding 배열
278
+ */
279
+ async getFileSymbols(filePath) {
280
+ const sql = `
281
+ SELECT id, project_id, file_path, symbol_name, symbol_type,
282
+ code_snippet, embedding::text, metadata, updated_at
283
+ FROM ${TABLE_NAME}
284
+ WHERE project_id = $1 AND file_path = $2
285
+ ORDER BY (metadata->>'line')::int ASC NULLS LAST
286
+ `;
287
+ const result = await this.config.sqlExecutor.query(sql, [
288
+ this.config.projectId,
289
+ filePath,
290
+ ]);
291
+ return result.rows.map((row) => this.mapRowToEmbedding(row));
292
+ }
293
+ /**
294
+ * 인덱스 통계를 조회한다.
295
+ *
296
+ * @returns 인덱스 통계 (총 임베딩 수, 파일 수, 마지막 인덱싱 시각, 테이블 크기)
297
+ */
298
+ async getStats() {
299
+ const sql = `
300
+ SELECT
301
+ COUNT(*) AS total_embeddings,
302
+ COUNT(DISTINCT file_path) AS total_files,
303
+ MAX(updated_at) AS last_indexed_at,
304
+ pg_total_relation_size('${TABLE_NAME}') AS index_size_bytes
305
+ FROM ${TABLE_NAME}
306
+ WHERE project_id = $1
307
+ `;
308
+ const result = await this.config.sqlExecutor.query(sql, [
309
+ this.config.projectId,
310
+ ]);
311
+ if (result.rows.length === 0) {
312
+ return {
313
+ totalEmbeddings: 0,
314
+ totalFiles: 0,
315
+ lastIndexedAt: null,
316
+ indexSizeBytes: 0,
317
+ };
318
+ }
319
+ const row = result.rows[0];
320
+ return {
321
+ totalEmbeddings: Number(row.total_embeddings) || 0,
322
+ totalFiles: Number(row.total_files) || 0,
323
+ lastIndexedAt: row.last_indexed_at
324
+ ? new Date(row.last_indexed_at)
325
+ : null,
326
+ indexSizeBytes: Number(row.index_size_bytes) || 0,
327
+ };
328
+ }
329
+ /**
330
+ * 파일이 인덱싱되어 있는지 확인한다.
331
+ *
332
+ * @param filePath - 파일 경로
333
+ * @returns 인덱싱 여부
334
+ */
335
+ async isFileIndexed(filePath) {
336
+ const sql = `
337
+ SELECT EXISTS(
338
+ SELECT 1 FROM ${TABLE_NAME}
339
+ WHERE project_id = $1 AND file_path = $2
340
+ LIMIT 1
341
+ ) AS indexed
342
+ `;
343
+ const result = await this.config.sqlExecutor.query(sql, [
344
+ this.config.projectId,
345
+ filePath,
346
+ ]);
347
+ return result.rows[0]?.indexed === true;
348
+ }
349
+ // ─── Helpers ───────────────────────────────────────────────────
350
+ /**
351
+ * 코드 심볼을 임베딩용 텍스트로 변환한다.
352
+ * 파일 경로, 심볼 타입, 이름, 코드를 포함한 리치 텍스트를 생성하여
353
+ * 임베딩 품질을 높인다.
354
+ *
355
+ * @param symbol - 심볼 정보
356
+ * @returns 임베딩용 텍스트
357
+ *
358
+ * @example
359
+ * ```
360
+ * File: src/auth/login.ts
361
+ * Type: function
362
+ * Name: validateUser
363
+ * Code:
364
+ * async function validateUser(email: string): Promise<User | null> { ... }
365
+ * ```
366
+ */
367
+ buildSnippetForEmbedding(symbol) {
368
+ // Extract signature from code if it's a function/method
369
+ const signature = this.extractSignature(symbol.code, symbol.type);
370
+ const parts = [
371
+ `File: ${symbol.file}`,
372
+ `Type: ${symbol.type}`,
373
+ `Name: ${symbol.name}`,
374
+ ];
375
+ if (signature && signature !== symbol.code.trim()) {
376
+ parts.push(`Signature: ${signature}`);
377
+ }
378
+ parts.push(`Code:`, symbol.code);
379
+ return parts.join("\n");
380
+ }
381
+ // ─── Private Methods ──────────────────────────────────────────
382
+ /**
383
+ * 텍스트 배열의 임베딩을 생성한다.
384
+ * 프로바이더의 batch API를 사용한다.
385
+ */
386
+ async generateEmbeddings(texts) {
387
+ if (texts.length === 0)
388
+ return [];
389
+ return this.config.embeddingProvider.embed(texts);
390
+ }
391
+ /**
392
+ * 임베딩 벡터를 PostgreSQL vector 리터럴 형식으로 변환한다.
393
+ *
394
+ * @param embedding - 숫자 배열
395
+ * @returns "[0.1,0.2,...]" 형식의 문자열
396
+ */
397
+ formatVector(embedding) {
398
+ return `[${embedding.join(",")}]`;
399
+ }
400
+ /**
401
+ * Upsert SQL을 생성한다.
402
+ * (project_id, file_path, symbol_name, symbol_type) 기준으로 UPSERT.
403
+ */
404
+ buildUpsertSQL(embedding) {
405
+ const sql = `
406
+ INSERT INTO ${TABLE_NAME}
407
+ (project_id, file_path, symbol_name, symbol_type, code_snippet, embedding, metadata, updated_at)
408
+ VALUES ($1, $2, $3, $4, $5, $6::vector, $7::jsonb, NOW())
409
+ ON CONFLICT ON CONSTRAINT uq_code_embedding_symbol
410
+ DO UPDATE SET
411
+ code_snippet = EXCLUDED.code_snippet,
412
+ embedding = EXCLUDED.embedding,
413
+ metadata = EXCLUDED.metadata,
414
+ updated_at = NOW()
415
+ `;
416
+ const params = [
417
+ embedding.projectId,
418
+ embedding.filePath,
419
+ embedding.symbolName,
420
+ embedding.symbolType,
421
+ embedding.codeSnippet,
422
+ this.formatVector(embedding.embedding),
423
+ JSON.stringify(embedding.metadata),
424
+ ];
425
+ return { sql: sql.trim(), params };
426
+ }
427
+ /**
428
+ * 벡터 검색 SQL을 생성한다.
429
+ * 코사인 거리(<=>)를 사용하여 유사도 순으로 정렬한다.
430
+ *
431
+ * @param embedding - 쿼리 임베딩 벡터
432
+ * @param limit - 최대 결과 수
433
+ * @param filters - 선택적 필터 (symbolType, threshold)
434
+ */
435
+ buildSearchSQL(embedding, limit, filters) {
436
+ const conditions = [`project_id = $2`];
437
+ const params = [this.formatVector(embedding), this.config.projectId];
438
+ let paramIndex = 3;
439
+ // Symbol type filter
440
+ if (filters?.symbolType) {
441
+ conditions.push(`symbol_type = $${paramIndex}`);
442
+ params.push(filters.symbolType);
443
+ paramIndex++;
444
+ }
445
+ // Similarity threshold filter (cosine distance: 0 = identical, 2 = opposite)
446
+ // similarity = 1 - distance, so distance < 1 - threshold
447
+ let havingClause = "";
448
+ if (filters?.threshold != null) {
449
+ havingClause = `HAVING 1 - (embedding <=> $1::vector) >= $${paramIndex}`;
450
+ params.push(filters.threshold);
451
+ paramIndex++;
452
+ }
453
+ const whereClause = conditions.join(" AND ");
454
+ // Use a subquery to apply HAVING-like filtering via WHERE on an outer query
455
+ let sql;
456
+ if (havingClause) {
457
+ sql = `
458
+ SELECT symbol_name, file_path, symbol_type, code_snippet, metadata, similarity
459
+ FROM (
460
+ SELECT symbol_name, file_path, symbol_type, code_snippet, metadata,
461
+ 1 - (embedding <=> $1::vector) AS similarity
462
+ FROM ${TABLE_NAME}
463
+ WHERE ${whereClause}
464
+ ) sub
465
+ WHERE similarity >= $${paramIndex - 1}
466
+ ORDER BY similarity DESC
467
+ LIMIT $${paramIndex}
468
+ `;
469
+ params.push(limit);
470
+ }
471
+ else {
472
+ sql = `
473
+ SELECT symbol_name, file_path, symbol_type, code_snippet, metadata,
474
+ 1 - (embedding <=> $1::vector) AS similarity
475
+ FROM ${TABLE_NAME}
476
+ WHERE ${whereClause}
477
+ ORDER BY embedding <=> $1::vector
478
+ LIMIT $${paramIndex}
479
+ `;
480
+ params.push(limit);
481
+ }
482
+ return { sql: sql.trim(), params };
483
+ }
484
+ /**
485
+ * DB 행 배열을 VectorSearchResult 배열로 변환한다.
486
+ */
487
+ mapSearchResults(rows) {
488
+ return rows.map((row) => ({
489
+ symbolName: row.symbol_name,
490
+ filePath: row.file_path,
491
+ symbolType: row.symbol_type,
492
+ codeSnippet: row.code_snippet,
493
+ similarity: Number(row.similarity) || 0,
494
+ metadata: this.parseJsonb(row.metadata),
495
+ }));
496
+ }
497
+ /**
498
+ * DB 행을 CodeEmbedding으로 변환한다.
499
+ */
500
+ mapRowToEmbedding(row) {
501
+ return {
502
+ id: Number(row.id),
503
+ projectId: row.project_id,
504
+ filePath: row.file_path,
505
+ symbolName: row.symbol_name,
506
+ symbolType: row.symbol_type,
507
+ codeSnippet: row.code_snippet,
508
+ embedding: this.parseVector(row.embedding),
509
+ metadata: this.parseEmbeddingMetadata(row.metadata),
510
+ updatedAt: new Date(row.updated_at),
511
+ };
512
+ }
513
+ /**
514
+ * PostgreSQL vector 리터럴 "[0.1,0.2,...]"을 숫자 배열로 파싱한다.
515
+ */
516
+ parseVector(vectorStr) {
517
+ if (!vectorStr)
518
+ return [];
519
+ // pgvector returns "[0.1,0.2,...]" format
520
+ const cleaned = vectorStr.replace(/^\[/, "").replace(/\]$/, "");
521
+ if (cleaned.length === 0)
522
+ return [];
523
+ return cleaned.split(",").map(Number);
524
+ }
525
+ /**
526
+ * JSONB 값을 Record<string, unknown>으로 파싱한다.
527
+ */
528
+ parseJsonb(value) {
529
+ if (value === null || value === undefined)
530
+ return {};
531
+ if (typeof value === "object")
532
+ return value;
533
+ if (typeof value === "string") {
534
+ try {
535
+ return JSON.parse(value);
536
+ }
537
+ catch {
538
+ return {};
539
+ }
540
+ }
541
+ return {};
542
+ }
543
+ /**
544
+ * JSONB 메타데이터를 CodeEmbedding.metadata 형식으로 파싱한다.
545
+ */
546
+ parseEmbeddingMetadata(value) {
547
+ const raw = this.parseJsonb(value);
548
+ return {
549
+ line: Number(raw.line) || 0,
550
+ endLine: Number(raw.endLine) || 0,
551
+ params: raw.params,
552
+ returnType: raw.returnType,
553
+ exported: Boolean(raw.exported),
554
+ complexity: raw.complexity != null ? Number(raw.complexity) : undefined,
555
+ };
556
+ }
557
+ /**
558
+ * 코드에서 함수/메서드 시그니처를 추출한다.
559
+ * 임베딩에 시그니처를 포함하면 검색 품질이 향상된다.
560
+ */
561
+ extractSignature(code, type) {
562
+ if (type !== "function" && type !== "method")
563
+ return null;
564
+ const lines = code.split("\n");
565
+ const firstLine = lines[0]?.trim();
566
+ if (!firstLine)
567
+ return null;
568
+ // Match function/method declarations
569
+ // e.g., "async function validateUser(email: string): Promise<User>"
570
+ // e.g., "async validateUser(email: string): Promise<User> {"
571
+ const match = firstLine.match(/^(?:export\s+)?(?:async\s+)?(?:function\s+)?\w+\s*\([^)]*\)(?:\s*:\s*[^{]+)?/);
572
+ return match ? match[0].trim() : firstLine;
573
+ }
574
+ /**
575
+ * SQL 문자열을 개별 statement로 분리한다.
576
+ * DO $$ ... $$ 블록을 올바르게 처리한다.
577
+ */
578
+ splitStatements(sql) {
579
+ const statements = [];
580
+ let current = "";
581
+ let inDollarBlock = false;
582
+ const lines = sql.split("\n");
583
+ for (const line of lines) {
584
+ const trimmed = line.trim();
585
+ // Track DO $$ blocks
586
+ if (trimmed.startsWith("DO $$") || trimmed === "DO $$") {
587
+ inDollarBlock = true;
588
+ current += line + "\n";
589
+ continue;
590
+ }
591
+ if (inDollarBlock) {
592
+ current += line + "\n";
593
+ // End of DO $$ block
594
+ if (trimmed === "$$;" || trimmed.endsWith("$$;")) {
595
+ inDollarBlock = false;
596
+ statements.push(current.trim());
597
+ current = "";
598
+ }
599
+ continue;
600
+ }
601
+ // Regular statement — split on semicolons at end of line
602
+ current += line + "\n";
603
+ if (trimmed.endsWith(";") && !inDollarBlock) {
604
+ statements.push(current.trim());
605
+ current = "";
606
+ }
607
+ }
608
+ // Handle any remaining content
609
+ if (current.trim().length > 0) {
610
+ statements.push(current.trim());
611
+ }
612
+ return statements.filter((s) => {
613
+ const cleaned = s.replace(/--.*$/gm, "").trim();
614
+ return cleaned.length > 0 && cleaned !== ";";
615
+ });
616
+ }
617
+ }
618
+ //# sourceMappingURL=vector-index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vector-index.js","sourceRoot":"","sources":["../src/vector-index.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,41 @@
1
+ {
2
+ "name": "@yuaone/core",
3
+ "version": "0.1.0",
4
+ "description": "YUAN Agent Core Runtime",
5
+ "license": "AGPL-3.0",
6
+ "type": "module",
7
+ "main": "dist/index.js",
8
+ "types": "dist/index.d.ts",
9
+ "files": ["dist/", "README.md", "LICENSE"],
10
+ "publishConfig": {
11
+ "access": "public"
12
+ },
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "https://github.com/yuaone/yuan.git",
16
+ "directory": "packages/yuan-core"
17
+ },
18
+ "homepage": "https://github.com/yuaone/yuan#readme",
19
+ "bugs": {
20
+ "url": "https://github.com/yuaone/yuan/issues"
21
+ },
22
+ "keywords": ["coding-agent", "ai", "autonomous", "agent-loop", "llm"],
23
+ "engines": {
24
+ "node": ">=18"
25
+ },
26
+ "scripts": {
27
+ "build": "tsc",
28
+ "dev": "tsc --watch",
29
+ "clean": "rm -rf dist",
30
+ "lint": "tsc --noEmit",
31
+ "test": "node --test dist/__tests__/*.test.js"
32
+ },
33
+ "dependencies": {
34
+ "chokidar": "^5.0.0",
35
+ "openai": "^6.27.0",
36
+ "ts-morph": "^27.0.2"
37
+ },
38
+ "devDependencies": {
39
+ "typescript": "^5.7.0"
40
+ }
41
+ }