@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.
- package/LICENSE +663 -0
- package/README.md +15 -0
- package/dist/__tests__/context-manager.test.d.ts +6 -0
- package/dist/__tests__/context-manager.test.d.ts.map +1 -0
- package/dist/__tests__/context-manager.test.js +220 -0
- package/dist/__tests__/context-manager.test.js.map +1 -0
- package/dist/__tests__/governor.test.d.ts +6 -0
- package/dist/__tests__/governor.test.d.ts.map +1 -0
- package/dist/__tests__/governor.test.js +210 -0
- package/dist/__tests__/governor.test.js.map +1 -0
- package/dist/__tests__/model-router.test.d.ts +6 -0
- package/dist/__tests__/model-router.test.d.ts.map +1 -0
- package/dist/__tests__/model-router.test.js +329 -0
- package/dist/__tests__/model-router.test.js.map +1 -0
- package/dist/agent-logger.d.ts +384 -0
- package/dist/agent-logger.d.ts.map +1 -0
- package/dist/agent-logger.js +820 -0
- package/dist/agent-logger.js.map +1 -0
- package/dist/agent-loop.d.ts +163 -0
- package/dist/agent-loop.d.ts.map +1 -0
- package/dist/agent-loop.js +609 -0
- package/dist/agent-loop.js.map +1 -0
- package/dist/agent-modes.d.ts +85 -0
- package/dist/agent-modes.d.ts.map +1 -0
- package/dist/agent-modes.js +418 -0
- package/dist/agent-modes.js.map +1 -0
- package/dist/approval.d.ts +137 -0
- package/dist/approval.d.ts.map +1 -0
- package/dist/approval.js +299 -0
- package/dist/approval.js.map +1 -0
- package/dist/async-completion-queue.d.ts +56 -0
- package/dist/async-completion-queue.d.ts.map +1 -0
- package/dist/async-completion-queue.js +77 -0
- package/dist/async-completion-queue.js.map +1 -0
- package/dist/auto-fix.d.ts +174 -0
- package/dist/auto-fix.d.ts.map +1 -0
- package/dist/auto-fix.js +319 -0
- package/dist/auto-fix.js.map +1 -0
- package/dist/codebase-context.d.ts +396 -0
- package/dist/codebase-context.d.ts.map +1 -0
- package/dist/codebase-context.js +1260 -0
- package/dist/codebase-context.js.map +1 -0
- package/dist/conflict-resolver.d.ts +191 -0
- package/dist/conflict-resolver.d.ts.map +1 -0
- package/dist/conflict-resolver.js +524 -0
- package/dist/conflict-resolver.js.map +1 -0
- package/dist/constants.d.ts +52 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +141 -0
- package/dist/constants.js.map +1 -0
- package/dist/context-budget.d.ts +435 -0
- package/dist/context-budget.d.ts.map +1 -0
- package/dist/context-budget.js +903 -0
- package/dist/context-budget.js.map +1 -0
- package/dist/context-compressor.d.ts +143 -0
- package/dist/context-compressor.d.ts.map +1 -0
- package/dist/context-compressor.js +511 -0
- package/dist/context-compressor.js.map +1 -0
- package/dist/context-manager.d.ts +112 -0
- package/dist/context-manager.d.ts.map +1 -0
- package/dist/context-manager.js +247 -0
- package/dist/context-manager.js.map +1 -0
- package/dist/continuous-reflection.d.ts +267 -0
- package/dist/continuous-reflection.d.ts.map +1 -0
- package/dist/continuous-reflection.js +338 -0
- package/dist/continuous-reflection.js.map +1 -0
- package/dist/cross-file-refactor.d.ts +352 -0
- package/dist/cross-file-refactor.d.ts.map +1 -0
- package/dist/cross-file-refactor.js +1544 -0
- package/dist/cross-file-refactor.js.map +1 -0
- package/dist/dag-orchestrator.d.ts +138 -0
- package/dist/dag-orchestrator.d.ts.map +1 -0
- package/dist/dag-orchestrator.js +379 -0
- package/dist/dag-orchestrator.js.map +1 -0
- package/dist/debate-orchestrator.d.ts +301 -0
- package/dist/debate-orchestrator.d.ts.map +1 -0
- package/dist/debate-orchestrator.js +719 -0
- package/dist/debate-orchestrator.js.map +1 -0
- package/dist/dependency-analyzer.d.ts +113 -0
- package/dist/dependency-analyzer.d.ts.map +1 -0
- package/dist/dependency-analyzer.js +444 -0
- package/dist/dependency-analyzer.js.map +1 -0
- package/dist/design-loop.d.ts +59 -0
- package/dist/design-loop.d.ts.map +1 -0
- package/dist/design-loop.js +344 -0
- package/dist/design-loop.js.map +1 -0
- package/dist/doc-intelligence.d.ts +383 -0
- package/dist/doc-intelligence.d.ts.map +1 -0
- package/dist/doc-intelligence.js +1307 -0
- package/dist/doc-intelligence.js.map +1 -0
- package/dist/dynamic-role-generator.d.ts +76 -0
- package/dist/dynamic-role-generator.d.ts.map +1 -0
- package/dist/dynamic-role-generator.js +194 -0
- package/dist/dynamic-role-generator.js.map +1 -0
- package/dist/errors.d.ts +69 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +102 -0
- package/dist/errors.js.map +1 -0
- package/dist/event-bus.d.ts +159 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +305 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/execution-engine.d.ts +425 -0
- package/dist/execution-engine.d.ts.map +1 -0
- package/dist/execution-engine.js +1555 -0
- package/dist/execution-engine.js.map +1 -0
- package/dist/git-intelligence.d.ts +306 -0
- package/dist/git-intelligence.d.ts.map +1 -0
- package/dist/git-intelligence.js +1099 -0
- package/dist/git-intelligence.js.map +1 -0
- package/dist/governor.d.ts +77 -0
- package/dist/governor.d.ts.map +1 -0
- package/dist/governor.js +161 -0
- package/dist/governor.js.map +1 -0
- package/dist/hierarchical-planner.d.ts +313 -0
- package/dist/hierarchical-planner.d.ts.map +1 -0
- package/dist/hierarchical-planner.js +981 -0
- package/dist/hierarchical-planner.js.map +1 -0
- package/dist/index.d.ts +121 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +123 -0
- package/dist/index.js.map +1 -0
- package/dist/intent-inference.d.ts +103 -0
- package/dist/intent-inference.d.ts.map +1 -0
- package/dist/intent-inference.js +605 -0
- package/dist/intent-inference.js.map +1 -0
- package/dist/interrupt-manager.d.ts +143 -0
- package/dist/interrupt-manager.d.ts.map +1 -0
- package/dist/interrupt-manager.js +196 -0
- package/dist/interrupt-manager.js.map +1 -0
- package/dist/kernel.d.ts +564 -0
- package/dist/kernel.d.ts.map +1 -0
- package/dist/kernel.js +1419 -0
- package/dist/kernel.js.map +1 -0
- package/dist/language-support.d.ts +232 -0
- package/dist/language-support.d.ts.map +1 -0
- package/dist/language-support.js +1134 -0
- package/dist/language-support.js.map +1 -0
- package/dist/llm-client.d.ts +82 -0
- package/dist/llm-client.d.ts.map +1 -0
- package/dist/llm-client.js +475 -0
- package/dist/llm-client.js.map +1 -0
- package/dist/mcp-client.d.ts +232 -0
- package/dist/mcp-client.d.ts.map +1 -0
- package/dist/mcp-client.js +718 -0
- package/dist/mcp-client.js.map +1 -0
- package/dist/memory-manager.d.ts +200 -0
- package/dist/memory-manager.d.ts.map +1 -0
- package/dist/memory-manager.js +568 -0
- package/dist/memory-manager.js.map +1 -0
- package/dist/memory.d.ts +87 -0
- package/dist/memory.d.ts.map +1 -0
- package/dist/memory.js +341 -0
- package/dist/memory.js.map +1 -0
- package/dist/model-router.d.ts +245 -0
- package/dist/model-router.d.ts.map +1 -0
- package/dist/model-router.js +632 -0
- package/dist/model-router.js.map +1 -0
- package/dist/parallel-executor.d.ts +125 -0
- package/dist/parallel-executor.d.ts.map +1 -0
- package/dist/parallel-executor.js +201 -0
- package/dist/parallel-executor.js.map +1 -0
- package/dist/perf-optimizer.d.ts +212 -0
- package/dist/perf-optimizer.d.ts.map +1 -0
- package/dist/perf-optimizer.js +721 -0
- package/dist/perf-optimizer.js.map +1 -0
- package/dist/persona.d.ts +305 -0
- package/dist/persona.d.ts.map +1 -0
- package/dist/persona.js +887 -0
- package/dist/persona.js.map +1 -0
- package/dist/planner.d.ts +70 -0
- package/dist/planner.d.ts.map +1 -0
- package/dist/planner.js +264 -0
- package/dist/planner.js.map +1 -0
- package/dist/qa-pipeline.d.ts +365 -0
- package/dist/qa-pipeline.d.ts.map +1 -0
- package/dist/qa-pipeline.js +1352 -0
- package/dist/qa-pipeline.js.map +1 -0
- package/dist/reasoning-adapter.d.ts +116 -0
- package/dist/reasoning-adapter.d.ts.map +1 -0
- package/dist/reasoning-adapter.js +187 -0
- package/dist/reasoning-adapter.js.map +1 -0
- package/dist/role-registry.d.ts +55 -0
- package/dist/role-registry.d.ts.map +1 -0
- package/dist/role-registry.js +192 -0
- package/dist/role-registry.js.map +1 -0
- package/dist/sandbox-tiers.d.ts +327 -0
- package/dist/sandbox-tiers.d.ts.map +1 -0
- package/dist/sandbox-tiers.js +928 -0
- package/dist/sandbox-tiers.js.map +1 -0
- package/dist/security-scanner.d.ts +222 -0
- package/dist/security-scanner.d.ts.map +1 -0
- package/dist/security-scanner.js +1129 -0
- package/dist/security-scanner.js.map +1 -0
- package/dist/security.d.ts +93 -0
- package/dist/security.d.ts.map +1 -0
- package/dist/security.js +393 -0
- package/dist/security.js.map +1 -0
- package/dist/self-reflection.d.ts +397 -0
- package/dist/self-reflection.d.ts.map +1 -0
- package/dist/self-reflection.js +908 -0
- package/dist/self-reflection.js.map +1 -0
- package/dist/session-persistence.d.ts +191 -0
- package/dist/session-persistence.d.ts.map +1 -0
- package/dist/session-persistence.js +395 -0
- package/dist/session-persistence.js.map +1 -0
- package/dist/speculative-executor.d.ts +210 -0
- package/dist/speculative-executor.d.ts.map +1 -0
- package/dist/speculative-executor.js +618 -0
- package/dist/speculative-executor.js.map +1 -0
- package/dist/state-machine.d.ts +289 -0
- package/dist/state-machine.d.ts.map +1 -0
- package/dist/state-machine.js +695 -0
- package/dist/state-machine.js.map +1 -0
- package/dist/sub-agent.d.ts +177 -0
- package/dist/sub-agent.d.ts.map +1 -0
- package/dist/sub-agent.js +303 -0
- package/dist/sub-agent.js.map +1 -0
- package/dist/system-prompt.d.ts +26 -0
- package/dist/system-prompt.d.ts.map +1 -0
- package/dist/system-prompt.js +84 -0
- package/dist/system-prompt.js.map +1 -0
- package/dist/test-intelligence.d.ts +439 -0
- package/dist/test-intelligence.d.ts.map +1 -0
- package/dist/test-intelligence.js +1165 -0
- package/dist/test-intelligence.js.map +1 -0
- package/dist/types.d.ts +632 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/vector-index.d.ts +314 -0
- package/dist/vector-index.d.ts.map +1 -0
- package/dist/vector-index.js +618 -0
- package/dist/vector-index.js.map +1 -0
- 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":"AAAA;;;;;;;;;;;;;GAaG;AAkHH,sEAAsE;AAEtE,MAAM,UAAU,GAAG,iBAAiB,CAAC;AACrC,MAAM,kBAAkB,GAAG,EAAE,CAAC;AAC9B,MAAM,iBAAiB,GAAG,IAAI,CAAC;AAC/B,MAAM,oBAAoB,GAAG,EAAE,CAAC;AAChC,MAAM,4BAA4B,GAAG,GAAG,CAAC;AAEzC,sEAAsE;AAEtE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,WAAW;IACd,MAAM,CAA8B;IAE5C,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG;YACZ,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,iBAAiB,EAAE,MAAM,CAAC,iBAAiB;YAC3C,WAAW,EAAE,MAAM,CAAC,WAAW;YAC/B,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,kBAAkB;YACjD,SAAS,EAAE,MAAM,CAAC,SAAS,IAAI,iBAAiB;SACjD,CAAC;IACJ,CAAC;IAED,kEAAkE;IAElE;;;;;OAKG;IACH,iBAAiB;QACf,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAClC,OAAO;;;;;6BAKkB,UAAU;;;;;;;qBAOlB,GAAG;;;;;;;;;;;;kBAYN,UAAU;;;;;;;;OAQrB,UAAU;;OAEV,UAAU;;OAEV,UAAU;;;;;;OAMV,UAAU;CAChB,CAAC,IAAI,EAAE,CAAC;IACP,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,UAAU;QACd,MAAM,GAAG,GAAG,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACrC,iDAAiD;QACjD,yDAAyD;QACzD,MAAM,UAAU,GAAG,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC7C,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC/C,CAAC;QACH,CAAC;IACH,CAAC;IAED,kEAAkE;IAElE;;;;;OAKG;IACH,KAAK,CAAC,WAAW,CAAC,MAAqB;QACrC,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;QACpD,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IACnD,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,UAAU,CACd,OAA2C;QAE3C,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAEnC,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC;QAExC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YACnD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;YAE9C,2CAA2C;YAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC5B,IAAI,CAAC,wBAAwB,CAAC;gBAC5B,IAAI,EAAE,CAAC,CAAC,UAAU;gBAClB,IAAI,EAAE,CAAC,CAAC,UAAU;gBAClB,IAAI,EAAE,CAAC,CAAC,WAAW;gBACnB,IAAI,EAAE,CAAC,CAAC,QAAQ;aACjB,CAAC,CACH,CAAC;YAEF,sBAAsB;YACtB,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAExD,qBAAqB;YACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACtC,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;gBACxB,MAAM,UAAU,GAAkB;oBAChC,GAAG,MAAM;oBACT,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;iBACzB,CAAC;gBACF,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;gBACxD,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACjD,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,WAAW,CACf,QAAgB,EAChB,OAA2C;QAE3C,2CAA2C;QAC3C,MAAM,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEhC,oBAAoB;QACpB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QACnC,OAAO,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,UAAU,CAAC,QAAgB;QAC/B,MAAM,GAAG,GAAG,eAAe,UAAU,2CAA2C,CAAC;QACjF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE;YACtD,IAAI,CAAC,MAAM,CAAC,SAAS;YACrB,QAAQ;SACT,CAAC,CAAC;QACH,4DAA4D;QAC5D,yFAAyF;QACzF,OAAQ,MAA2C,CAAC,QAAQ,IAAI,CAAC,CAAC;IACpE,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,YAAY;QAChB,MAAM,GAAG,GAAG,eAAe,UAAU,wBAAwB,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE;YACtD,IAAI,CAAC,MAAM,CAAC,SAAS;SACtB,CAAC,CAAC;QACH,OAAQ,MAA2C,CAAC,QAAQ,IAAI,CAAC,CAAC;IACpE,CAAC;IAED,kEAAkE;IAElE;;;;;;OAMG;IACH,KAAK,CAAC,MAAM,CACV,KAAa,EACb,QAAgB,oBAAoB;QAEpC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,kBAAkB,CACtB,WAAmB,EACnB,QAAgB,oBAAoB,EACpC,YAAoB,4BAA4B;QAEhD,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACjE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE;YAC5D,SAAS;SACV,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;;OAOG;IACH,KAAK,CAAC,YAAY,CAChB,KAAa,EACb,UAAkB,EAClB,QAAgB,oBAAoB;QAEpC,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QAC3D,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,KAAK,EAAE;YAC5D,UAAU;SACX,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED;;;;;;OAMG;IACH,KAAK,CAAC,eAAe,CACnB,WAAmB,EACnB,YAAoB,IAAI;QAExB,MAAM,CAAC,SAAS,CAAC,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;QACjE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,CAAC;QAC1E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAChE,OAAO,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;IAED,kEAAkE;IAElE;;;;;OAKG;IACH,KAAK,CAAC,cAAc,CAAC,QAAgB;QACnC,MAAM,GAAG,GAAG;;;aAGH,UAAU;;;KAGlB,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE;YACtD,IAAI,CAAC,MAAM,CAAC,SAAS;YACrB,QAAQ;SACT,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED;;;;OAIG;IACH,KAAK,CAAC,QAAQ;QACZ,MAAM,GAAG,GAAG;;;;;kCAKkB,UAAU;aAC/B,UAAU;;KAElB,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE;YACtD,IAAI,CAAC,MAAM,CAAC,SAAS;SACtB,CAAC,CAAC;QAEH,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO;gBACL,eAAe,EAAE,CAAC;gBAClB,UAAU,EAAE,CAAC;gBACb,aAAa,EAAE,IAAI;gBACnB,cAAc,EAAE,CAAC;aAClB,CAAC;QACJ,CAAC;QAED,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3B,OAAO;YACL,eAAe,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC;YAClD,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC;YACxC,aAAa,EAAE,GAAG,CAAC,eAAe;gBAChC,CAAC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,eAAyB,CAAC;gBACzC,CAAC,CAAC,IAAI;YACR,cAAc,EAAE,MAAM,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,CAAC;SAClD,CAAC;IACJ,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,aAAa,CAAC,QAAgB;QAClC,MAAM,GAAG,GAAG;;wBAEQ,UAAU;;;;KAI7B,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,GAAG,EAAE;YACtD,IAAI,CAAC,MAAM,CAAC,SAAS;YACrB,QAAQ;SACT,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC1C,CAAC;IAED,kEAAkE;IAElE;;;;;;;;;;;;;;;;OAgBG;IACH,wBAAwB,CAAC,MAKxB;QACC,wDAAwD;QACxD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAElE,MAAM,KAAK,GAAa;YACtB,SAAS,MAAM,CAAC,IAAI,EAAE;YACtB,SAAS,MAAM,CAAC,IAAI,EAAE;YACtB,SAAS,MAAM,CAAC,IAAI,EAAE;SACvB,CAAC;QAEF,IAAI,SAAS,IAAI,SAAS,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAClD,KAAK,CAAC,IAAI,CAAC,cAAc,SAAS,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC;QAEjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAED,iEAAiE;IAEjE;;;OAGG;IACK,KAAK,CAAC,kBAAkB,CAAC,KAAe;QAC9C,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QAClC,OAAO,IAAI,CAAC,MAAM,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IAED;;;;;OAKG;IACK,YAAY,CAAC,SAAmB;QACtC,OAAO,IAAI,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACpC,CAAC;IAED;;;OAGG;IACK,cAAc,CAAC,SAAwB;QAI7C,MAAM,GAAG,GAAG;oBACI,UAAU;;;;;;;;;KASzB,CAAC;QAEF,MAAM,MAAM,GAAG;YACb,SAAS,CAAC,SAAS;YACnB,SAAS,CAAC,QAAQ;YAClB,SAAS,CAAC,UAAU;YACpB,SAAS,CAAC,UAAU;YACpB,SAAS,CAAC,WAAW;YACrB,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC;YACtC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,QAAQ,CAAC;SACnC,CAAC;QAEF,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAED;;;;;;;OAOG;IACK,cAAc,CACpB,SAAmB,EACnB,KAAa,EACb,OAAiC;QAEjC,MAAM,UAAU,GAAa,CAAC,iBAAiB,CAAC,CAAC;QACjD,MAAM,MAAM,GAAc,CAAC,IAAI,CAAC,YAAY,CAAC,SAAS,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAChF,IAAI,UAAU,GAAG,CAAC,CAAC;QAEnB,qBAAqB;QACrB,IAAI,OAAO,EAAE,UAAU,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC,kBAAkB,UAAU,EAAE,CAAC,CAAC;YAChD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;YAChC,UAAU,EAAE,CAAC;QACf,CAAC;QAED,6EAA6E;QAC7E,yDAAyD;QACzD,IAAI,YAAY,GAAG,EAAE,CAAC;QACtB,IAAI,OAAO,EAAE,SAAS,IAAI,IAAI,EAAE,CAAC;YAC/B,YAAY,GAAG,6CAA6C,UAAU,EAAE,CAAC;YACzE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;YAC/B,UAAU,EAAE,CAAC;QACf,CAAC;QAED,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE7C,4EAA4E;QAC5E,IAAI,GAAW,CAAC;QAChB,IAAI,YAAY,EAAE,CAAC;YACjB,GAAG,GAAG;;;;;iBAKK,UAAU;kBACT,WAAW;;+BAEE,UAAU,GAAG,CAAC;;iBAE5B,UAAU;OACpB,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,GAAG,GAAG;;;eAGG,UAAU;gBACT,WAAW;;iBAEV,UAAU;OACpB,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACrB,CAAC;QAED,OAAO,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,CAAC;IACrC,CAAC;IAED;;OAEG;IACK,gBAAgB,CACtB,IAA+B;QAE/B,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;YACxB,UAAU,EAAE,GAAG,CAAC,WAAqB;YACrC,QAAQ,EAAE,GAAG,CAAC,SAAmB;YACjC,UAAU,EAAE,GAAG,CAAC,WAAqB;YACrC,WAAW,EAAE,GAAG,CAAC,YAAsB;YACvC,UAAU,EAAE,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC;YACvC,QAAQ,EAAE,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,QAAQ,CAAC;SACxC,CAAC,CAAC,CAAC;IACN,CAAC;IAED;;OAEG;IACK,iBAAiB,CAAC,GAA4B;QACpD,OAAO;YACL,EAAE,EAAE,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;YAClB,SAAS,EAAE,GAAG,CAAC,UAAoB;YACnC,QAAQ,EAAE,GAAG,CAAC,SAAmB;YACjC,UAAU,EAAE,GAAG,CAAC,WAAqB;YACrC,UAAU,EAAE,GAAG,CAAC,WAAyB;YACzC,WAAW,EAAE,GAAG,CAAC,YAAsB;YACvC,SAAS,EAAE,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAmB,CAAC;YACpD,QAAQ,EAAE,IAAI,CAAC,sBAAsB,CAAC,GAAG,CAAC,QAAQ,CAAC;YACnD,SAAS,EAAE,IAAI,IAAI,CAAC,GAAG,CAAC,UAAoB,CAAC;SAC9C,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,WAAW,CAAC,SAAiB;QACnC,IAAI,CAAC,SAAS;YAAE,OAAO,EAAE,CAAC;QAC1B,0CAA0C;QAC1C,MAAM,OAAO,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAChE,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,CAAC;QACpC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IACxC,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,KAAc;QAC/B,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QACrD,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAgC,CAAC;QACvE,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,KAAK,CAA4B,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED;;OAEG;IACK,sBAAsB,CAAC,KAAc;QAC3C,MAAM,GAAG,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACnC,OAAO;YACL,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;YAC3B,OAAO,EAAE,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC;YACjC,MAAM,EAAE,GAAG,CAAC,MAA4B;YACxC,UAAU,EAAE,GAAG,CAAC,UAAgC;YAChD,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;YAC/B,UAAU,EAAE,GAAG,CAAC,UAAU,IAAI,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,SAAS;SACxE,CAAC;IACJ,CAAC;IAED;;;OAGG;IACK,gBAAgB,CAAC,IAAY,EAAE,IAAY;QACjD,IAAI,IAAI,KAAK,UAAU,IAAI,IAAI,KAAK,QAAQ;YAAE,OAAO,IAAI,CAAC;QAE1D,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC/B,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC;QACnC,IAAI,CAAC,SAAS;YAAE,OAAO,IAAI,CAAC;QAE5B,qCAAqC;QACrC,oEAAoE;QACpE,6DAA6D;QAC7D,MAAM,KAAK,GAAG,SAAS,CAAC,KAAK,CAC3B,8EAA8E,CAC/E,CAAC;QACF,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;IAC7C,CAAC;IAED;;;OAGG;IACK,eAAe,CAAC,GAAW;QACjC,MAAM,UAAU,GAAa,EAAE,CAAC;QAChC,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,IAAI,aAAa,GAAG,KAAK,CAAC;QAE1B,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAC9B,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;YAE5B,qBAAqB;YACrB,IAAI,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,OAAO,KAAK,OAAO,EAAE,CAAC;gBACvD,aAAa,GAAG,IAAI,CAAC;gBACrB,OAAO,IAAI,IAAI,GAAG,IAAI,CAAC;gBACvB,SAAS;YACX,CAAC;YAED,IAAI,aAAa,EAAE,CAAC;gBAClB,OAAO,IAAI,IAAI,GAAG,IAAI,CAAC;gBACvB,qBAAqB;gBACrB,IAAI,OAAO,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oBACjD,aAAa,GAAG,KAAK,CAAC;oBACtB,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;oBAChC,OAAO,GAAG,EAAE,CAAC;gBACf,CAAC;gBACD,SAAS;YACX,CAAC;YAED,yDAAyD;YACzD,OAAO,IAAI,IAAI,GAAG,IAAI,CAAC;YACvB,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;gBAC5C,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;gBAChC,OAAO,GAAG,EAAE,CAAC;YACf,CAAC;QACH,CAAC;QAED,+BAA+B;QAC/B,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE;YAC7B,MAAM,OAAO,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;YAChD,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,KAAK,GAAG,CAAC;QAC/C,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
|
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
|
+
}
|